From eb31d3a8076a7fc53a15d938958555a4cf4babb1 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Wed, 8 Oct 2025 10:48:30 -0400 Subject: [PATCH 01/44] Initial scaffold of Toolbar --- examples/vanilla/toolbar-demo/.wp-env.json | 18 ++ examples/vanilla/toolbar-demo/README.md | 182 +++++++++++++ .../toolbar-demo/example-app/index.html | 67 +++++ .../toolbar-demo/example-app/package.json | 17 ++ .../toolbar-demo/example-app/src/main.js | 117 ++++++++ .../toolbar-demo/example-app/src/style.css | 93 +++++++ .../toolbar-demo/example-app/vite.config.js | 7 + examples/vanilla/toolbar-demo/package.json | 32 +++ packages/toolbar/.gitignore | 5 + packages/toolbar/README.md | 213 +++++++++++++++ packages/toolbar/package.json | 40 +++ packages/toolbar/src/index.ts | 249 ++++++++++++++++++ packages/toolbar/src/toolbar.css | 235 +++++++++++++++++ packages/toolbar/tsconfig.json | 20 ++ pnpm-lock.yaml | 6 + 15 files changed, 1301 insertions(+) create mode 100644 examples/vanilla/toolbar-demo/.wp-env.json create mode 100644 examples/vanilla/toolbar-demo/README.md create mode 100644 examples/vanilla/toolbar-demo/example-app/index.html create mode 100644 examples/vanilla/toolbar-demo/example-app/package.json create mode 100644 examples/vanilla/toolbar-demo/example-app/src/main.js create mode 100644 examples/vanilla/toolbar-demo/example-app/src/style.css create mode 100644 examples/vanilla/toolbar-demo/example-app/vite.config.js create mode 100644 examples/vanilla/toolbar-demo/package.json create mode 100644 packages/toolbar/.gitignore create mode 100644 packages/toolbar/README.md create mode 100644 packages/toolbar/package.json create mode 100644 packages/toolbar/src/index.ts create mode 100644 packages/toolbar/src/toolbar.css create mode 100644 packages/toolbar/tsconfig.json diff --git a/examples/vanilla/toolbar-demo/.wp-env.json b/examples/vanilla/toolbar-demo/.wp-env.json new file mode 100644 index 00000000..a9b553a7 --- /dev/null +++ b/examples/vanilla/toolbar-demo/.wp-env.json @@ -0,0 +1,18 @@ +{ + "phpVersion": "8.0", + "plugins": [ + "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip" + ], + "config": { + "WP_DEBUG": true, + "WP_DEBUG_LOG": true, + "GRAPHQL_DEBUG": true + }, + "port": 8888, + "mappings": { + "db": "./wp-env/db" + }, + "lifecycleScripts": { + "afterStart": "wp-env run cli -- wp rewrite structure '/%postname%/' && wp-env run cli -- wp rewrite flush" + } +} diff --git a/examples/vanilla/toolbar-demo/README.md b/examples/vanilla/toolbar-demo/README.md new file mode 100644 index 00000000..90bee870 --- /dev/null +++ b/examples/vanilla/toolbar-demo/README.md @@ -0,0 +1,182 @@ +# Toolbar Demo - Vanilla JavaScript + Vite + +> A complete example of `@wpengine/hwp-toolbar` with vanilla JavaScript and Vite + +This example demonstrates how to integrate the Headless WordPress Toolbar into a vanilla JavaScript application using Vite as the build tool. + +## Features + +- ✅ Vanilla JavaScript (no framework) +- ✅ Vite for fast development +- ✅ TypeScript support (types available) +- ✅ WordPress toolbar integration +- ✅ State management example +- ✅ Custom node registration +- ✅ Dark/light mode support +- ✅ wp-env configuration + +## Prerequisites + +- Node.js >= 18 +- pnpm (for workspace setup) +- Docker (for wp-env) + +## Quick Start + +From the example directory: + +```bash +# Install dependencies and start +npm run example:build + +# Or, if already set up: +npm run example:start +``` + +The example will be available at: +- Frontend: http://localhost:3000 +- WordPress Admin: http://localhost:8888/wp-admin (admin / password) + +## Project Structure + +``` +toolbar-demo/ +├── example-app/ # Vite application +│ ├── src/ +│ │ ├── main.js # Toolbar implementation +│ │ └── style.css # Demo styles +│ ├── index.html # Entry point +│ ├── package.json +│ └── vite.config.js +├── wp-env/ # WordPress environment +│ └── db/ # Database +├── .wp-env.json # wp-env configuration +├── package.json +└── README.md +``` + +## What This Example Shows + +### 1. Basic Integration + +```javascript +import { Toolbar, VanillaRenderer } from '@wpengine/hwp-toolbar'; +import '@wpengine/hwp-toolbar/styles'; + +const toolbar = new Toolbar({ + onPreviewChange: (enabled) => { + console.log('Preview mode:', enabled); + } +}); + +const renderer = new VanillaRenderer(toolbar, 'toolbar'); +``` + +### 2. WordPress Context + +```javascript +toolbar.setState({ + user: { id: 1, name: 'Admin' }, + site: { + url: 'http://localhost:8888', + adminUrl: 'http://localhost:8888/wp-admin' + }, + post: { + id: 123, + title: 'Hello World', + type: 'post', + status: 'draft', + slug: 'hello-world' + } +}); +``` + +### 3. Custom Nodes + +```javascript +toolbar.register('home', 'Home', () => { + window.location.href = '/'; +}); +``` + +### 4. State Subscription + +```javascript +toolbar.subscribe((nodes, state) => { + console.log('Toolbar state updated:', state); +}); +``` + +## Available Scripts + +```bash +# Start development server + WordPress +npm run example:start + +# Stop WordPress +npm run example:stop + +# Rebuild everything from scratch +npm run example:prune + +# Just run Vite dev server (requires WordPress running) +npm run example:dev + +# WordPress-only commands +npm run wp:start +npm run wp:stop +npm run wp:destroy +``` + +## WordPress Setup + +The wp-env configuration includes: + +- WordPress with WPGraphQL plugin +- Admin credentials: `admin` / `password` +- GraphQL endpoint: http://localhost:8888/graphql +- Pretty permalinks enabled + +## Using with Vite + +Vite provides: +- Hot module replacement (HMR) +- Fast dev server +- ES modules support +- No build step needed for development + +The toolbar package is imported via workspace protocol: +```json +{ + "dependencies": { + "@wpengine/hwp-toolbar": "workspace:*" + } +} +``` + +## Styling + +The example imports the base toolbar styles: + +```javascript +import '@wpengine/hwp-toolbar/styles'; +``` + +Custom styles can override CSS variables: + +```css +:root { + --hwp-toolbar-bg: #1a1a1a; + --hwp-toolbar-primary: #00a0d2; +} +``` + +## Learn More + +- [@wpengine/hwp-toolbar documentation](../../../packages/toolbar/README.md) +- [Vite Documentation](https://vitejs.dev/) +- [WPGraphQL](https://www.wpgraphql.com/) + +## License + +BSD-0-Clause diff --git a/examples/vanilla/toolbar-demo/example-app/index.html b/examples/vanilla/toolbar-demo/example-app/index.html new file mode 100644 index 00000000..a7b8e0b0 --- /dev/null +++ b/examples/vanilla/toolbar-demo/example-app/index.html @@ -0,0 +1,67 @@ + + + + + + Headless WordPress Toolbar Demo + + +
+

Headless WordPress Toolbar Demo

+

A framework-agnostic toolbar for headless WordPress sites

+ +
+

User Context

+ + +
+ +
+

Post Context

+ + + +
+ +
+

Toolbar Management

+ + +
+ +
+

Current State:

+

+    
+ +
+

Try This:

+
    +
  1. Click "Login" to authenticate
  2. +
  3. Click "Add Post" to load content
  4. +
  5. See WordPress controls appear in the toolbar at the bottom
  6. +
  7. Click "Preview" to toggle preview mode
  8. +
  9. Click "Edit post" to open in WordPress (opens new tab)
  10. +
  11. Click "WP Admin" to open WordPress dashboard
  12. +
+
+ +
+

Features:

+
    +
  • ✅ Framework-agnostic (works with any JS framework)
  • +
  • ✅ No 401 errors on page load (performance optimized)
  • +
  • ✅ Full TypeScript support
  • +
  • ✅ Dark/light mode automatic
  • +
  • ✅ Fully themeable with CSS variables
  • +
  • ✅ Responsive design
  • +
+
+
+ + +
+ + + + diff --git a/examples/vanilla/toolbar-demo/example-app/package.json b/examples/vanilla/toolbar-demo/example-app/package.json new file mode 100644 index 00000000..cc5f9f92 --- /dev/null +++ b/examples/vanilla/toolbar-demo/example-app/package.json @@ -0,0 +1,17 @@ +{ + "name": "toolbar-demo-app", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@wpengine/hwp-toolbar": "file:../../../../packages/toolbar" + }, + "devDependencies": { + "vite": "^6.0.11" + } +} diff --git a/examples/vanilla/toolbar-demo/example-app/src/main.js b/examples/vanilla/toolbar-demo/example-app/src/main.js new file mode 100644 index 00000000..56635c4c --- /dev/null +++ b/examples/vanilla/toolbar-demo/example-app/src/main.js @@ -0,0 +1,117 @@ +import { Toolbar, VanillaRenderer } from '@wpengine/hwp-toolbar'; +import '@wpengine/hwp-toolbar/styles'; +import './style.css'; + +// Create toolbar instance +const toolbar = new Toolbar({ + onPreviewChange: (enabled) => { + console.log('Preview mode:', enabled); + alert(`Preview mode: ${enabled ? 'ON' : 'OFF'}\n\nIn production, this would trigger Next.js/framework preview mode`); + } +}); + +// Create renderer +const renderer = new VanillaRenderer(toolbar, 'toolbar'); + +// Subscribe to state changes for display +toolbar.subscribe((nodes, state) => { + document.getElementById('state').textContent = JSON.stringify(state, null, 2); +}); + +// Control functions +window.login = () => { + toolbar.setState({ + user: { + id: 1, + name: 'Admin', + email: 'admin@example.com' + }, + site: { + adminUrl: 'http://localhost:8888/wp-admin', + url: 'http://localhost:8888' + } + }); + console.log('User logged in'); +}; + +window.logout = () => { + toolbar.setState({ + user: null, + post: null, + site: null, + preview: false + }); + toolbar.clear(); + console.log('User logged out'); +}; + +window.addPost = () => { + toolbar.setState({ + post: { + id: 123, + title: 'Hello World', + type: 'post', + status: 'draft', + slug: 'hello-world' + } + }); + console.log('Post context added'); +}; + +window.addPage = () => { + toolbar.setState({ + post: { + id: 456, + title: 'About Us', + type: 'page', + status: 'publish', + slug: 'about' + } + }); + console.log('Page context added'); +}; + +window.clearPost = () => { + toolbar.setState({ post: null, preview: false }); + console.log('Post context cleared'); +}; + +let customNodeCount = 0; +window.addNode = () => { + customNodeCount++; + toolbar.register( + `custom-${customNodeCount}`, + `Custom ${customNodeCount}`, + () => { + console.log(`Custom node ${customNodeCount} clicked`); + alert(`Custom Action ${customNodeCount}`); + } + ); + console.log(`Added custom node ${customNodeCount}`); +}; + +window.clearAll = () => { + toolbar.clear(); + toolbar.setState({ + user: null, + post: null, + site: null, + preview: false + }); + console.log('Toolbar cleared'); +}; + +// Initialize with home button +toolbar.register('home', 'Home', () => { + console.log('Navigate to home'); + alert('Navigate to Homepage'); +}); + +// Console greeting +console.log('%cHeadless WordPress Toolbar', 'font-size: 18px; font-weight: bold; color: #0073aa;'); +console.log('For headless WordPress implementations'); +console.log(''); +console.log('Try this flow:'); +console.log('1. Click "Login" to authenticate'); +console.log('2. Click "Add Post" to load content'); +console.log('3. See WordPress controls appear in toolbar'); diff --git a/examples/vanilla/toolbar-demo/example-app/src/style.css b/examples/vanilla/toolbar-demo/example-app/src/style.css new file mode 100644 index 00000000..ee39810d --- /dev/null +++ b/examples/vanilla/toolbar-demo/example-app/src/style.css @@ -0,0 +1,93 @@ +/* Minimal Utilitarian Demo Styles */ + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: system-ui, -apple-system, sans-serif; + line-height: 1.5; + color: #333; + background: #fafafa; + padding-bottom: 60px; +} + +.container { + max-width: 900px; + margin: 0 auto; + padding: 20px; +} + +h1 { + font-size: 1.5rem; + margin-bottom: 0.25rem; + font-weight: 600; +} + +h2 { + font-size: 0.875rem; + margin: 1.5rem 0 0.5rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: #666; + font-weight: 500; +} + +p { + font-size: 0.9375rem; + color: #666; + margin-bottom: 1.5rem; +} + +.controls, +.state, +.info, +.features { + margin-bottom: 1.5rem; + padding: 1rem; + background: white; + border: 1px solid #e0e0e0; +} + +.controls button { + padding: 6px 12px; + margin: 4px 4px 4px 0; + border: 1px solid #ccc; + background: white; + color: #333; + cursor: pointer; + font-size: 13px; +} + +.controls button:hover { + background: #f5f5f5; +} + +.state pre { + background: #f5f5f5; + color: #333; + padding: 0.75rem; + font-size: 0.8125rem; + font-family: monospace; + overflow-x: auto; + border: 1px solid #e0e0e0; +} + +.info ol, +.features ul { + margin-left: 1.25rem; + font-size: 0.875rem; +} + +.info li, +.features li { + margin: 0.375rem 0; + color: #555; +} + +.features ul { + list-style: none; + margin-left: 0; +} diff --git a/examples/vanilla/toolbar-demo/example-app/vite.config.js b/examples/vanilla/toolbar-demo/example-app/vite.config.js new file mode 100644 index 00000000..704a512b --- /dev/null +++ b/examples/vanilla/toolbar-demo/example-app/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; + +export default defineConfig({ + server: { + port: 3000 + } +}); diff --git a/examples/vanilla/toolbar-demo/package.json b/examples/vanilla/toolbar-demo/package.json new file mode 100644 index 00000000..94957564 --- /dev/null +++ b/examples/vanilla/toolbar-demo/package.json @@ -0,0 +1,32 @@ +{ + "name": "toolbar-demo", + "version": "1.0.0", + "description": "Vanilla JavaScript example using Vite for the Headless WordPress Toolbar", + "scripts": { + "example:build": "npm run example:dev:install && npm run wp:start && npm run example:start", + "example:dev:install": "cd example-app && npm install && cd ..", + "example:start": "npm run wp:start && npm run example:dev", + "example:stop": "npm run wp:stop", + "example:prune": "wp-env destroy && npm run example:build && npm run example:start", + "example:dev": "npm --prefix ./example-app run dev", + "wp:start": "npm install && wp-env start", + "wp:stop": "wp-env stop", + "wp:destroy": "wp-env destroy", + "wp-env": "wp-env" + }, + "keywords": [ + "headless", + "wordpress", + "vanilla", + "vite", + "toolbar", + "headless-cms", + "wpgraphql", + "headless-wordpress" + ], + "author": "hwptoolkit", + "license": "BSD-0-Clause", + "dependencies": { + "@wordpress/env": "^10.31.0" + } +} diff --git a/packages/toolbar/.gitignore b/packages/toolbar/.gitignore new file mode 100644 index 00000000..2432ce54 --- /dev/null +++ b/packages/toolbar/.gitignore @@ -0,0 +1,5 @@ +dist +node_modules +*.log +.DS_Store +*.tsbuildinfo diff --git a/packages/toolbar/README.md b/packages/toolbar/README.md new file mode 100644 index 00000000..5f6c88a4 --- /dev/null +++ b/packages/toolbar/README.md @@ -0,0 +1,213 @@ +# @wpengine/hwp-toolbar + +> Framework-agnostic toolbar for headless WordPress applications + +A lightweight, performant toolbar for headless WordPress. Works with any JavaScript framework or vanilla JS. + +## Features + +- 🎯 **Framework Agnostic** - Works with React, Vue, Svelte, or vanilla JavaScript +- ⚡ **Zero Dependencies** - Lightweight and fast +- 🔒 **Type Safe** - Full TypeScript support +- 🎨 **Themeable** - CSS custom properties for styling +- 🌓 **Dark Mode** - Automatic support + +## Installation + +```bash +npm install @wpengine/hwp-toolbar +``` + +## Quick Start + +```javascript +import { Toolbar, VanillaRenderer } from '@wpengine/hwp-toolbar'; +import '@wpengine/hwp-toolbar/styles'; + +// Create toolbar +const toolbar = new Toolbar({ + onPreviewChange: (enabled) => { + console.log('Preview mode:', enabled); + } +}); + +// Set WordPress context +toolbar.setWordPressContext({ + user: { id: 1, name: 'Admin' }, + site: { url: 'https://example.com', adminUrl: 'https://example.com/wp-admin' }, + post: { id: 123, title: 'Hello World', type: 'post', status: 'draft', slug: 'hello-world' } +}); + +// Render +const renderer = new VanillaRenderer(toolbar, 'toolbar'); +``` + +## API + +### Toolbar + +**Constructor** +```javascript +new Toolbar(config?) +``` + +**Config:** +- `onPreviewChange?: (enabled: boolean) => void` - Preview toggle callback + +**Methods:** + +```javascript +// Register a node +toolbar.register(id, label, onClick?) +toolbar.register('help', 'Help', () => window.open('/help')) + +// Update state +toolbar.setState({ user, post, site, preview }) + +// Set WordPress context (helper) +toolbar.setWordPressContext({ user, post, site }) + +// Subscribe to changes +const unsubscribe = toolbar.subscribe((nodes, state) => { + console.log('State changed:', state); +}) + +// Cleanup +toolbar.destroy() +``` + +### VanillaRenderer + +```javascript +const renderer = new VanillaRenderer(toolbar, 'element-id'); +// or +const renderer = new VanillaRenderer(toolbar, document.getElementById('toolbar')); + +// Cleanup +renderer.destroy(); +``` + +## Default Nodes + +The toolbar includes three built-in nodes: + +- **Edit Post** - Opens WordPress editor (visible when post + user) +- **WP Admin** - Dashboard link (visible when user exists) +- **Preview** - Toggle preview mode (visible when post or user) + +## Styling + +Import the base styles: + +```javascript +import '@wpengine/hwp-toolbar/styles'; +``` + +### Customization + +Override CSS custom properties: + +```css +:root { + --hwp-toolbar-bg: #1a1a1a; + --hwp-toolbar-primary: #00a0d2; +} +``` + +Available variables: +- `--hwp-toolbar-bg` - Background color +- `--hwp-toolbar-border` - Border color +- `--hwp-toolbar-text` - Text color +- `--hwp-toolbar-primary` - Primary button color +- `--hwp-toolbar-primary-hover` - Primary button hover +- And more... + +## Framework Examples + +### React + +```tsx +import { useEffect, useRef } from 'react'; +import { Toolbar, VanillaRenderer } from '@wpengine/hwp-toolbar'; + +function WordPressToolbar({ user, post, site }) { + const ref = useRef(null); + + useEffect(() => { + if (!ref.current) return; + + const toolbar = new Toolbar(); + toolbar.setWordPressContext({ user, post, site }); + const renderer = new VanillaRenderer(toolbar, ref.current); + + return () => { + renderer.destroy(); + toolbar.destroy(); + }; + }, [user, post, site]); + + return
; +} +``` + +### Vue + +```vue + + + +``` + +### Vanilla JavaScript + +See `demo.html` for a complete example. + +## TypeScript + +```typescript +import type { + Toolbar, + ToolbarState, + WordPressUser, + WordPressPost, + WordPressSite +} from '@wpengine/hwp-toolbar'; +``` + +## Development + +```bash +# Build +npm run build + +# Watch mode +npm run dev + +# Clean +npm run clean + +# View demo +open demo.html +``` + +## License + +BSD-0-Clause diff --git a/packages/toolbar/package.json b/packages/toolbar/package.json new file mode 100644 index 00000000..1af43e38 --- /dev/null +++ b/packages/toolbar/package.json @@ -0,0 +1,40 @@ +{ + "name": "@wpengine/hwp-toolbar", + "version": "0.0.1", + "description": "Framework-agnostic toolbar for headless WordPress applications", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./styles": "./src/toolbar.css" + }, + "files": [ + "dist", + "src/toolbar.css" + ], + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "clean": "rm -rf dist" + }, + "keywords": [ + "wordpress", + "headless", + "toolbar", + "wpgraphql", + "headless-wordpress", + "cms" + ], + "author": "WP Engine", + "license": "BSD-0-Clause", + "devDependencies": { + "typescript": "^5.8.3" + }, + "engines": { + "node": ">=18" + } +} diff --git a/packages/toolbar/src/index.ts b/packages/toolbar/src/index.ts new file mode 100644 index 00000000..6de19ada --- /dev/null +++ b/packages/toolbar/src/index.ts @@ -0,0 +1,249 @@ +/** + * Headless WordPress Toolbar + * Framework-agnostic toolbar for headless WordPress applications + * @package @wpengine/hwp-toolbar + */ + +// ============================================================================ +// TYPES +// ============================================================================ + +export interface WordPressUser { + id: number; + name: string; + email?: string; + avatar?: string; +} + +export interface WordPressPost { + id: number; + title: string; + type: string; + status: string; + slug: string; +} + +export interface WordPressSite { + url: string; + adminUrl: string; +} + +export interface ToolbarState { + user: WordPressUser | null; + post: WordPressPost | null; + site: WordPressSite | null; + preview: boolean; + isHeadless: boolean; +} + +export interface ToolbarConfig { + onPreviewChange?: (enabled: boolean) => void; +} + +export type NodeCallback = () => void; +export type LabelFunction = () => string; + +export interface ToolbarNode { + id: string; + label: string | LabelFunction; + onClick: NodeCallback; +} + +// ============================================================================ +// TOOLBAR CLASS +// ============================================================================ + +export class Toolbar { + private nodes: Map = new Map(); + private state: ToolbarState = { + user: null, + post: null, + site: null, + preview: false, + isHeadless: true + }; + private listeners: Set<(nodes: ToolbarNode[], state: ToolbarState) => void> = new Set(); + private config: ToolbarConfig; + + constructor(config: ToolbarConfig = {}) { + this.config = config; + this.registerDefaultNodes(); + } + + private registerDefaultNodes(): void { + // Edit Post + this.register('edit-post', () => { + const p = this.state.post; + return p ? `Edit ${p.type}` : 'Edit'; + }, () => { + const { post, site } = this.state; + if (post && site) { + window.open(`${site.adminUrl}/post.php?post=${post.id}&action=edit`, '_blank'); + } + }); + + // WP Admin + this.register('wp-admin', 'WP Admin', () => { + if (this.state.site?.adminUrl) { + window.open(this.state.site.adminUrl, '_blank'); + } + }); + + // Preview Toggle + this.register('preview', () => { + return this.state.preview ? 'Exit Preview' : 'Preview'; + }, () => { + this.setState({ preview: !this.state.preview }); + if (this.config.onPreviewChange) { + this.config.onPreviewChange(this.state.preview); + } + }); + } + + register(id: string, label: string | LabelFunction, onClick?: NodeCallback): this { + if (typeof label === 'function' && !onClick) { + // register(id, onClick) + this.nodes.set(id, { id, label: id, onClick: label }); + } else { + // register(id, label, onClick) + this.nodes.set(id, { + id, + label, + onClick: onClick || (() => {}) + }); + } + this.notify(); + return this; + } + + unregister(id: string): this { + this.nodes.delete(id); + this.notify(); + return this; + } + + clear(): this { + this.nodes.clear(); + this.registerDefaultNodes(); + this.notify(); + return this; + } + + setState(updates: Partial): this { + this.state = { ...this.state, ...updates }; + this.notify(); + return this; + } + + setWordPressContext(context: { + user?: WordPressUser | null; + post?: WordPressPost | null; + site?: WordPressSite | null; + }): this { + return this.setState(context); + } + + getState(): ToolbarState { + return { ...this.state }; + } + + getVisibleNodes(): ToolbarNode[] { + return Array.from(this.nodes.values()).filter(node => { + if (node.id === 'edit-post') return this.state.post && this.state.user; + if (node.id === 'wp-admin') return this.state.user; + if (node.id === 'preview') return this.state.post || this.state.user; + return true; + }).map(node => ({ + ...node, + label: typeof node.label === 'function' ? node.label() : node.label + })); + } + + subscribe(callback: (nodes: ToolbarNode[], state: ToolbarState) => void): () => void { + this.listeners.add(callback); + callback(this.getVisibleNodes(), this.getState()); + return () => this.listeners.delete(callback); + } + + private notify(): void { + const nodes = this.getVisibleNodes(); + const state = this.getState(); + this.listeners.forEach(cb => { + try { + cb(nodes, state); + } catch (error) { + console.error('Toolbar error:', error); + } + }); + } + + destroy(): void { + this.nodes.clear(); + this.listeners.clear(); + } +} + +// ============================================================================ +// VANILLA RENDERER +// ============================================================================ + +export class VanillaRenderer { + private toolbar: Toolbar; + private element: HTMLElement | null; + private unsubscribe: (() => void) | null = null; + + constructor(toolbar: Toolbar, elementOrId: string | HTMLElement) { + this.toolbar = toolbar; + + if (typeof elementOrId === 'string') { + this.element = document.getElementById(elementOrId); + if (!this.element) throw new Error(`Element "${elementOrId}" not found`); + } else { + this.element = elementOrId; + } + + this.unsubscribe = this.toolbar.subscribe((nodes, state) => { + this.render(nodes, state); + }); + } + + private render(nodes: ToolbarNode[], state: ToolbarState): void { + if (!this.element) return; + this.element.innerHTML = ''; + this.element.className = 'hwp-toolbar'; + + // Render nodes + nodes.forEach(node => { + const btn = document.createElement('button'); + btn.className = 'hwp-toolbar-button'; + const labelText = typeof node.label === 'function' ? node.label() : node.label; + btn.textContent = labelText; + + if (node.id === 'preview' && state.preview) { + btn.classList.add('hwp-toolbar-button-active'); + } + + btn.onclick = () => node.onClick(); + this.element!.appendChild(btn); + }); + + // User button + if (state.user) { + const userBtn = document.createElement('button'); + userBtn.className = 'hwp-toolbar-button hwp-toolbar-user'; + userBtn.textContent = `User: ${state.user.name}`; + userBtn.onclick = () => { + if (confirm(`Logged in as: ${state.user!.name}\n\nLogout?`)) { + this.toolbar.setState({ user: null, post: null, site: null }); + this.toolbar.clear(); + } + }; + this.element!.appendChild(userBtn); + } + } + + destroy(): void { + if (this.unsubscribe) this.unsubscribe(); + if (this.element) this.element.innerHTML = ''; + } +} diff --git a/packages/toolbar/src/toolbar.css b/packages/toolbar/src/toolbar.css new file mode 100644 index 00000000..2be6a2be --- /dev/null +++ b/packages/toolbar/src/toolbar.css @@ -0,0 +1,235 @@ +/** + * Headless WordPress Toolbar Styles + * Minimal, themeable styles for the toolbar + * @package @wpengine/hwp-toolbar + */ + +:root { + /* Color Palette */ + --hwp-toolbar-bg: #ffffff; + --hwp-toolbar-border: #ddd; + --hwp-toolbar-text: #2c3338; + --hwp-toolbar-primary: #0073aa; + --hwp-toolbar-primary-hover: #005a87; + --hwp-toolbar-button-bg: #ffffff; + --hwp-toolbar-button-hover: #f0f0f0; + --hwp-toolbar-shadow: rgba(0, 0, 0, 0.1); + + /* Spacing */ + --hwp-toolbar-height: 48px; + --hwp-toolbar-padding: 0 20px; + --hwp-toolbar-gap: 8px; + --hwp-toolbar-button-padding: 8px 16px; + + /* Typography */ + --hwp-toolbar-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + --hwp-toolbar-font-size: 14px; + --hwp-toolbar-font-weight: 500; + + /* Z-index */ + --hwp-toolbar-z-index: 9999; + + /* Border Radius */ + --hwp-toolbar-radius: 4px; +} + +/* Dark Mode */ +@media (prefers-color-scheme: dark) { + :root { + --hwp-toolbar-bg: #1e1e1e; + --hwp-toolbar-border: #3a3a3a; + --hwp-toolbar-text: #e0e0e0; + --hwp-toolbar-primary: #2271b1; + --hwp-toolbar-primary-hover: #135e96; + --hwp-toolbar-button-bg: #2a2a2a; + --hwp-toolbar-button-hover: #383838; + --hwp-toolbar-shadow: rgba(0, 0, 0, 0.3); + } +} + +/* Toolbar Container */ +#hwp-toolbar, +.hwp-toolbar { + position: fixed; + bottom: 0; + left: 0; + right: 0; + min-height: var(--hwp-toolbar-height); + background: var(--hwp-toolbar-bg); + border-top: 1px solid var(--hwp-toolbar-border); + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--hwp-toolbar-padding); + box-shadow: 0 -2px 10px var(--hwp-toolbar-shadow); + gap: var(--hwp-toolbar-gap); + z-index: var(--hwp-toolbar-z-index); + font-family: var(--hwp-toolbar-font-family); + font-size: var(--hwp-toolbar-font-size); + color: var(--hwp-toolbar-text); + box-sizing: border-box; +} + +/* Toolbar Sections */ +.hwp-toolbar-section { + display: flex; + align-items: center; + gap: var(--hwp-toolbar-gap); + flex-wrap: wrap; +} + +.hwp-toolbar-left { + flex: 1; + justify-content: flex-start; +} + +.hwp-toolbar-center { + flex: 0; + justify-content: center; +} + +.hwp-toolbar-right { + flex: 1; + justify-content: flex-end; +} + +/* Toolbar Buttons */ +.hwp-toolbar-button { + padding: var(--hwp-toolbar-button-padding); + background: var(--hwp-toolbar-button-bg); + border: 1px solid var(--hwp-toolbar-primary); + color: var(--hwp-toolbar-primary); + cursor: pointer; + border-radius: var(--hwp-toolbar-radius); + font-size: var(--hwp-toolbar-font-size); + font-weight: var(--hwp-toolbar-font-weight); + font-family: inherit; + transition: all 0.2s ease; + display: inline-flex; + align-items: center; + gap: 6px; + white-space: nowrap; + line-height: 1.4; + box-sizing: border-box; +} + +.hwp-toolbar-button:hover { + background: var(--hwp-toolbar-primary); + color: var(--hwp-toolbar-bg); +} + +.hwp-toolbar-button:active { + transform: scale(0.98); +} + +.hwp-toolbar-button:focus-visible { + outline: 2px solid var(--hwp-toolbar-primary); + outline-offset: 2px; +} + +/* Active Button State */ +.hwp-toolbar-button-active, +.hwp-toolbar-button.hwp-toolbar-button-active { + background: var(--hwp-toolbar-primary); + color: var(--hwp-toolbar-bg); +} + +.hwp-toolbar-button-active:hover { + background: var(--hwp-toolbar-primary-hover); +} + +/* User Button */ +.hwp-toolbar-user { + margin-left: auto; + background: var(--hwp-toolbar-primary); + color: var(--hwp-toolbar-bg); + border-color: var(--hwp-toolbar-primary); +} + +.hwp-toolbar-user:hover { + background: var(--hwp-toolbar-primary-hover); + border-color: var(--hwp-toolbar-primary-hover); +} + +/* User Avatar */ +.hwp-toolbar-avatar { + width: 24px; + height: 24px; + border-radius: 50%; + object-fit: cover; + border: 1px solid currentColor; +} + +/* Badge */ +.hwp-toolbar-badge { + background: #d63638; + color: white; + padding: 2px 6px; + border-radius: 10px; + font-size: 11px; + font-weight: 600; + line-height: 1; + min-width: 18px; + text-align: center; +} + +/* Responsive */ +@media (max-width: 768px) { + :root { + --hwp-toolbar-padding: 0 12px; + --hwp-toolbar-gap: 6px; + --hwp-toolbar-button-padding: 6px 12px; + --hwp-toolbar-font-size: 13px; + } + + .hwp-toolbar-section { + gap: 6px; + } + + /* Hide text on smaller screens, keep icons */ + .hwp-toolbar-button span:not(.hwp-toolbar-badge) { + display: none; + } + + /* Show user name on mobile */ + .hwp-toolbar-user span { + display: inline; + } +} + +@media (max-width: 480px) { + :root { + --hwp-toolbar-height: 44px; + } +} + +/* Print */ +@media print { + #hwp-toolbar, + .hwp-toolbar { + display: none !important; + } +} + +/* Accessibility */ +@media (prefers-reduced-motion: reduce) { + .hwp-toolbar-button { + transition: none; + } + + .hwp-toolbar-button:active { + transform: none; + } +} + +/* High Contrast Mode */ +@media (prefers-contrast: high) { + :root { + --hwp-toolbar-border: #000; + --hwp-toolbar-primary: #0000ff; + } + + .hwp-toolbar-button { + border-width: 2px; + } +} diff --git a/packages/toolbar/tsconfig.json b/packages/toolbar/tsconfig.json new file mode 100644 index 00000000..5e886381 --- /dev/null +++ b/packages/toolbar/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ES2020", + "lib": ["ES2020", "DOM"], + "outDir": "./dist", + "rootDir": "./src", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "resolveJsonModule": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "**/*.test.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2088bf02..2b0a4cad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,12 @@ importers: specifier: ^8.13.0 version: 8.13.0 + packages/toolbar: + devDependencies: + typescript: + specifier: ^5.8.3 + version: 5.8.3 + plugins/hwp-previews: {} plugins/wpgraphql-debug-extensions: From 5dc66c014f4463524d49b4358a2e8707763a428b Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Wed, 8 Oct 2025 11:39:46 -0400 Subject: [PATCH 02/44] feat(toolbar): Add real WordPress integration to demo Integrate toolbar demo with real WordPress instance using wp-env: - Add CORS headers via mu-plugin for localhost:3000 - Fetch real WordPress user via REST API - Fetch posts using WPGraphQL - Update demo UI with real data workflow - Document WordPress integration in README Updates: - Use query parameter format for REST API (/?rest_route=) - Use query parameter format for GraphQL (/?graphql) - Add lifecycle script for permalink setup - Update demo instructions for real WordPress workflow --- examples/vanilla/toolbar-demo/.wp-env.json | 3 +- examples/vanilla/toolbar-demo/README.md | 65 +++++++--- .../toolbar-demo/example-app/index.html | 14 ++- .../toolbar-demo/example-app/src/main.js | 118 +++++++++++++++--- examples/vanilla/toolbar-demo/mu-plugin.php | 22 ++++ 5 files changed, 180 insertions(+), 42 deletions(-) create mode 100644 examples/vanilla/toolbar-demo/mu-plugin.php diff --git a/examples/vanilla/toolbar-demo/.wp-env.json b/examples/vanilla/toolbar-demo/.wp-env.json index a9b553a7..da814188 100644 --- a/examples/vanilla/toolbar-demo/.wp-env.json +++ b/examples/vanilla/toolbar-demo/.wp-env.json @@ -10,7 +10,8 @@ }, "port": 8888, "mappings": { - "db": "./wp-env/db" + "db": "./wp-env/db", + "wp-content/mu-plugins": "./mu-plugin.php" }, "lifecycleScripts": { "afterStart": "wp-env run cli -- wp rewrite structure '/%postname%/' && wp-env run cli -- wp rewrite flush" diff --git a/examples/vanilla/toolbar-demo/README.md b/examples/vanilla/toolbar-demo/README.md index 90bee870..48067597 100644 --- a/examples/vanilla/toolbar-demo/README.md +++ b/examples/vanilla/toolbar-demo/README.md @@ -26,7 +26,7 @@ This example demonstrates how to integrate the Headless WordPress Toolbar into a From the example directory: ```bash -# Install dependencies and start +# Install dependencies and start WordPress + Vite npm run example:build # Or, if already set up: @@ -34,8 +34,10 @@ npm run example:start ``` The example will be available at: -- Frontend: http://localhost:3000 -- WordPress Admin: http://localhost:8888/wp-admin (admin / password) +- **Frontend**: http://localhost:3000 +- **WordPress**: http://localhost:8888 +- **WordPress Admin**: http://localhost:8888/wp-admin (`admin` / `password`) +- **GraphQL**: http://localhost:8888/?graphql ## Project Structure @@ -72,26 +74,57 @@ const toolbar = new Toolbar({ const renderer = new VanillaRenderer(toolbar, 'toolbar'); ``` -### 2. WordPress Context +### 2. Real WordPress Integration + +The example fetches real data from WordPress: ```javascript +// Fetch WordPress user via REST API +const response = await fetch('http://localhost:8888/?rest_route=/wp/v2/users/1'); +const user = await response.json(); + toolbar.setState({ - user: { id: 1, name: 'Admin' }, + user: { + id: user.id, + name: user.name, + email: user.email + }, site: { url: 'http://localhost:8888', adminUrl: 'http://localhost:8888/wp-admin' - }, - post: { - id: 123, - title: 'Hello World', - type: 'post', - status: 'draft', - slug: 'hello-world' } }); ``` -### 3. Custom Nodes +### 3. GraphQL Posts + +Fetch posts using WPGraphQL: + +```javascript +const response = await fetch('http://localhost:8888/?graphql', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + query: ` + query GetPosts { + posts(first: 5) { + nodes { + databaseId + title + slug + status + } + } + } + ` + }) +}); + +const { data } = await response.json(); +// Use posts to populate toolbar +``` + +### 4. Custom Nodes ```javascript toolbar.register('home', 'Home', () => { @@ -99,7 +132,7 @@ toolbar.register('home', 'Home', () => { }); ``` -### 4. State Subscription +### 5. State Subscription ```javascript toolbar.subscribe((nodes, state) => { @@ -134,8 +167,10 @@ The wp-env configuration includes: - WordPress with WPGraphQL plugin - Admin credentials: `admin` / `password` -- GraphQL endpoint: http://localhost:8888/graphql +- GraphQL endpoint: `http://localhost:8888/?graphql` +- REST API endpoint: `http://localhost:8888/?rest_route=/wp/v2/...` - Pretty permalinks enabled +- CORS headers enabled for localhost:3000 ## Using with Vite diff --git a/examples/vanilla/toolbar-demo/example-app/index.html b/examples/vanilla/toolbar-demo/example-app/index.html index a7b8e0b0..781d165c 100644 --- a/examples/vanilla/toolbar-demo/example-app/index.html +++ b/examples/vanilla/toolbar-demo/example-app/index.html @@ -18,9 +18,11 @@

User Context

Post Context

- - + + + +
@@ -37,12 +39,12 @@

Current State:

Try This:

    -
  1. Click "Login" to authenticate
  2. -
  3. Click "Add Post" to load content
  4. -
  5. See WordPress controls appear in the toolbar at the bottom
  6. +
  7. Click "Login" to fetch real WP user
  8. +
  9. Click "Fetch Posts" to load real posts
  10. +
  11. Click a post to add it to toolbar
  12. +
  13. See WordPress controls appear in toolbar
  14. Click "Preview" to toggle preview mode
  15. Click "Edit post" to open in WordPress (opens new tab)
  16. -
  17. Click "WP Admin" to open WordPress dashboard
diff --git a/examples/vanilla/toolbar-demo/example-app/src/main.js b/examples/vanilla/toolbar-demo/example-app/src/main.js index 56635c4c..2cc9b772 100644 --- a/examples/vanilla/toolbar-demo/example-app/src/main.js +++ b/examples/vanilla/toolbar-demo/example-app/src/main.js @@ -2,6 +2,8 @@ import { Toolbar, VanillaRenderer } from '@wpengine/hwp-toolbar'; import '@wpengine/hwp-toolbar/styles'; import './style.css'; +const WP_URL = 'http://localhost:8888'; + // Create toolbar instance const toolbar = new Toolbar({ onPreviewChange: (enabled) => { @@ -18,20 +20,35 @@ toolbar.subscribe((nodes, state) => { document.getElementById('state').textContent = JSON.stringify(state, null, 2); }); -// Control functions -window.login = () => { - toolbar.setState({ - user: { - id: 1, - name: 'Admin', - email: 'admin@example.com' - }, - site: { - adminUrl: 'http://localhost:8888/wp-admin', - url: 'http://localhost:8888' +// Fetch real WordPress user +window.login = async () => { + try { + // For demo: just set mock authenticated user + // In production, you'd authenticate first via WordPress login + const response = await fetch(`${WP_URL}/?rest_route=/wp/v2/users/1`); + + if (response.ok) { + const user = await response.json(); + toolbar.setState({ + user: { + id: user.id, + name: user.name, + email: user.email || 'admin@example.com' + }, + site: { + adminUrl: `${WP_URL}/wp-admin`, + url: WP_URL + } + }); + console.log('User logged in:', user.name); + } else { + console.error('WordPress not available'); + alert('WordPress is not running at ' + WP_URL); } - }); - console.log('User logged in'); + } catch (error) { + console.error('Error connecting to WordPress:', error); + alert('Error: Make sure WordPress is running (npm run wp:start)'); + } }; window.logout = () => { @@ -45,6 +62,66 @@ window.logout = () => { console.log('User logged out'); }; +// Fetch real posts from WordPress GraphQL +window.fetchPosts = async () => { + try { + const response = await fetch(`${WP_URL}/?graphql`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: ` + query GetPosts { + posts(first: 5) { + nodes { + databaseId + title + slug + status + } + } + } + ` + }) + }); + + const { data } = await response.json(); + + if (data?.posts?.nodes?.length > 0) { + const posts = data.posts.nodes; + console.log('Fetched posts:', posts); + + // Display posts in UI + const postsDiv = document.getElementById('wordpress-posts'); + postsDiv.innerHTML = '

WordPress Posts:

'; + posts.forEach(post => { + const btn = document.createElement('button'); + btn.textContent = post.title; + btn.onclick = () => loadPost(post); + postsDiv.appendChild(btn); + }); + } + } catch (error) { + console.error('Error fetching posts:', error); + alert('Error fetching posts. Make sure WPGraphQL is installed.'); + } +}; + +function loadPost(post) { + toolbar.setState({ + post: { + id: post.databaseId, + title: post.title, + type: 'post', + status: post.status, + slug: post.slug + } + }); + console.log('Post loaded:', post.title); +} + +// Mock data functions (for when WordPress isn't running) window.addPost = () => { toolbar.setState({ post: { @@ -55,7 +132,7 @@ window.addPost = () => { slug: 'hello-world' } }); - console.log('Post context added'); + console.log('Mock post added'); }; window.addPage = () => { @@ -68,7 +145,7 @@ window.addPage = () => { slug: 'about' } }); - console.log('Page context added'); + console.log('Mock page added'); }; window.clearPost = () => { @@ -104,14 +181,15 @@ window.clearAll = () => { // Initialize with home button toolbar.register('home', 'Home', () => { console.log('Navigate to home'); - alert('Navigate to Homepage'); + window.location.href = '/'; }); // Console greeting console.log('%cHeadless WordPress Toolbar', 'font-size: 18px; font-weight: bold; color: #0073aa;'); -console.log('For headless WordPress implementations'); +console.log('WordPress at:', WP_URL); console.log(''); console.log('Try this flow:'); -console.log('1. Click "Login" to authenticate'); -console.log('2. Click "Add Post" to load content'); -console.log('3. See WordPress controls appear in toolbar'); +console.log('1. Click "Login" to fetch real WP user'); +console.log('2. Click "Fetch Posts" to load real posts'); +console.log('3. Click a post to add it to toolbar'); +console.log('4. See WordPress controls appear in toolbar'); diff --git a/examples/vanilla/toolbar-demo/mu-plugin.php b/examples/vanilla/toolbar-demo/mu-plugin.php new file mode 100644 index 00000000..3008ac37 --- /dev/null +++ b/examples/vanilla/toolbar-demo/mu-plugin.php @@ -0,0 +1,22 @@ + Date: Wed, 8 Oct 2025 11:51:12 -0400 Subject: [PATCH 03/44] Clean up toolbar demo --- .../toolbar-demo/example-app/index.html | 41 ++----- .../toolbar-demo/example-app/src/main.js | 112 ++++++------------ .../toolbar-demo/example-app/src/style.css | 73 ++++++------ packages/toolbar/src/toolbar.css | 67 +++-------- 4 files changed, 97 insertions(+), 196 deletions(-) diff --git a/examples/vanilla/toolbar-demo/example-app/index.html b/examples/vanilla/toolbar-demo/example-app/index.html index 781d165c..821745a6 100644 --- a/examples/vanilla/toolbar-demo/example-app/index.html +++ b/examples/vanilla/toolbar-demo/example-app/index.html @@ -11,54 +11,27 @@

Headless WordPress Toolbar Demo

A framework-agnostic toolbar for headless WordPress sites

-

User Context

+

Demo Controls

-
- -
-

Post Context

- - -
-
-

Toolbar Management

- - -
-
-

Current State:

+

Current State


     
-

Try This:

+

Try This

    -
  1. Click "Login" to fetch real WP user
  2. -
  3. Click "Fetch Posts" to load real posts
  4. -
  5. Click a post to add it to toolbar
  6. -
  7. See WordPress controls appear in toolbar
  8. -
  9. Click "Preview" to toggle preview mode
  10. -
  11. Click "Edit post" to open in WordPress (opens new tab)
  12. +
  13. Click "Login" to authenticate with WordPress
  14. +
  15. Click "Fetch Posts" to load posts from WordPress
  16. +
  17. Click a post to view toolbar controls
  18. +
  19. Use the toolbar at the bottom to preview or edit
- -
-

Features:

-
    -
  • ✅ Framework-agnostic (works with any JS framework)
  • -
  • ✅ No 401 errors on page load (performance optimized)
  • -
  • ✅ Full TypeScript support
  • -
  • ✅ Dark/light mode automatic
  • -
  • ✅ Fully themeable with CSS variables
  • -
  • ✅ Responsive design
  • -
-
diff --git a/examples/vanilla/toolbar-demo/example-app/src/main.js b/examples/vanilla/toolbar-demo/example-app/src/main.js index 2cc9b772..43fb0b09 100644 --- a/examples/vanilla/toolbar-demo/example-app/src/main.js +++ b/examples/vanilla/toolbar-demo/example-app/src/main.js @@ -4,7 +4,10 @@ import './style.css'; const WP_URL = 'http://localhost:8888'; -// Create toolbar instance +// ============================================================================ +// Initialize Toolbar +// ============================================================================ + const toolbar = new Toolbar({ onPreviewChange: (enabled) => { console.log('Preview mode:', enabled); @@ -12,24 +15,41 @@ const toolbar = new Toolbar({ } }); -// Create renderer +// Render toolbar to DOM const renderer = new VanillaRenderer(toolbar, 'toolbar'); -// Subscribe to state changes for display +// ============================================================================ +// Register Custom Nodes +// ============================================================================ + +// Simple home button +toolbar.register('home', 'Home', () => { + console.log('Navigate to home'); + window.location.href = '/'; +}); + +// ============================================================================ +// State Management +// ============================================================================ + +// Subscribe to state changes for debugging display toolbar.subscribe((nodes, state) => { document.getElementById('state').textContent = JSON.stringify(state, null, 2); }); -// Fetch real WordPress user +// ============================================================================ +// Demo Actions +// ============================================================================ + window.login = async () => { try { - // For demo: just set mock authenticated user - // In production, you'd authenticate first via WordPress login const response = await fetch(`${WP_URL}/?rest_route=/wp/v2/users/1`); if (response.ok) { const user = await response.json(); - toolbar.setState({ + + // Use setWordPressContext for WordPress-specific state + toolbar.setWordPressContext({ user: { id: user.id, name: user.name, @@ -40,6 +60,7 @@ window.login = async () => { url: WP_URL } }); + console.log('User logged in:', user.name); } else { console.error('WordPress not available'); @@ -52,13 +73,16 @@ window.login = async () => { }; window.logout = () => { - toolbar.setState({ + // Clear WordPress context + toolbar.setWordPressContext({ user: null, post: null, - site: null, - preview: false + site: null }); - toolbar.clear(); + + // Reset preview mode + toolbar.setState({ preview: false }); + console.log('User logged out'); }; @@ -109,7 +133,8 @@ window.fetchPosts = async () => { }; function loadPost(post) { - toolbar.setState({ + // Use setWordPressContext for WordPress post data + toolbar.setWordPressContext({ post: { id: post.databaseId, title: post.title, @@ -121,69 +146,6 @@ function loadPost(post) { console.log('Post loaded:', post.title); } -// Mock data functions (for when WordPress isn't running) -window.addPost = () => { - toolbar.setState({ - post: { - id: 123, - title: 'Hello World', - type: 'post', - status: 'draft', - slug: 'hello-world' - } - }); - console.log('Mock post added'); -}; - -window.addPage = () => { - toolbar.setState({ - post: { - id: 456, - title: 'About Us', - type: 'page', - status: 'publish', - slug: 'about' - } - }); - console.log('Mock page added'); -}; - -window.clearPost = () => { - toolbar.setState({ post: null, preview: false }); - console.log('Post context cleared'); -}; - -let customNodeCount = 0; -window.addNode = () => { - customNodeCount++; - toolbar.register( - `custom-${customNodeCount}`, - `Custom ${customNodeCount}`, - () => { - console.log(`Custom node ${customNodeCount} clicked`); - alert(`Custom Action ${customNodeCount}`); - } - ); - console.log(`Added custom node ${customNodeCount}`); -}; - -window.clearAll = () => { - toolbar.clear(); - toolbar.setState({ - user: null, - post: null, - site: null, - preview: false - }); - console.log('Toolbar cleared'); -}; - -// Initialize with home button -toolbar.register('home', 'Home', () => { - console.log('Navigate to home'); - window.location.href = '/'; -}); - // Console greeting console.log('%cHeadless WordPress Toolbar', 'font-size: 18px; font-weight: bold; color: #0073aa;'); console.log('WordPress at:', WP_URL); diff --git a/examples/vanilla/toolbar-demo/example-app/src/style.css b/examples/vanilla/toolbar-demo/example-app/src/style.css index ee39810d..e3027641 100644 --- a/examples/vanilla/toolbar-demo/example-app/src/style.css +++ b/examples/vanilla/toolbar-demo/example-app/src/style.css @@ -1,5 +1,3 @@ -/* Minimal Utilitarian Demo Styles */ - * { box-sizing: border-box; margin: 0; @@ -10,84 +8,81 @@ body { font-family: system-ui, -apple-system, sans-serif; line-height: 1.5; color: #333; - background: #fafafa; + background: #f9f9f9; padding-bottom: 60px; } .container { - max-width: 900px; + max-width: 800px; margin: 0 auto; - padding: 20px; + padding: 16px; } h1 { - font-size: 1.5rem; + font-size: 1.25rem; margin-bottom: 0.25rem; font-weight: 600; + color: #222; } h2 { - font-size: 0.875rem; - margin: 1.5rem 0 0.5rem; + font-size: 0.75rem; + margin: 1rem 0 0.5rem; text-transform: uppercase; letter-spacing: 0.5px; - color: #666; + color: #888; font-weight: 500; } p { - font-size: 0.9375rem; + font-size: 0.875rem; color: #666; - margin-bottom: 1.5rem; + margin-bottom: 1rem; } .controls, .state, -.info, -.features { - margin-bottom: 1.5rem; - padding: 1rem; +.info { + margin-bottom: 1rem; + padding: 0.75rem; background: white; - border: 1px solid #e0e0e0; + border: 1px solid #e8e8e8; + border-radius: 2px; } .controls button { - padding: 6px 12px; - margin: 4px 4px 4px 0; - border: 1px solid #ccc; + padding: 4px 10px; + margin: 3px 3px 3px 0; + border: 1px solid #d0d0d0; background: white; - color: #333; + color: #555; cursor: pointer; - font-size: 13px; + font-size: 12px; + border-radius: 2px; } .controls button:hover { - background: #f5f5f5; + background: #fafafa; + border-color: #999; } .state pre { - background: #f5f5f5; - color: #333; - padding: 0.75rem; - font-size: 0.8125rem; + background: #fafafa; + color: #444; + padding: 0.5rem; + font-size: 0.75rem; font-family: monospace; overflow-x: auto; - border: 1px solid #e0e0e0; + border: 1px solid #eee; + border-radius: 2px; } -.info ol, -.features ul { +.info ol { margin-left: 1.25rem; - font-size: 0.875rem; -} - -.info li, -.features li { - margin: 0.375rem 0; - color: #555; + font-size: 0.8125rem; } -.features ul { - list-style: none; - margin-left: 0; +.info li { + margin: 0.25rem 0; + color: #666; } diff --git a/packages/toolbar/src/toolbar.css b/packages/toolbar/src/toolbar.css index 2be6a2be..ff0d7407 100644 --- a/packages/toolbar/src/toolbar.css +++ b/packages/toolbar/src/toolbar.css @@ -1,53 +1,36 @@ -/** - * Headless WordPress Toolbar Styles - * Minimal, themeable styles for the toolbar - * @package @wpengine/hwp-toolbar - */ - :root { - /* Color Palette */ --hwp-toolbar-bg: #ffffff; - --hwp-toolbar-border: #ddd; - --hwp-toolbar-text: #2c3338; - --hwp-toolbar-primary: #0073aa; - --hwp-toolbar-primary-hover: #005a87; + --hwp-toolbar-border: #d0d0d0; + --hwp-toolbar-text: #1a1a1a; + --hwp-toolbar-primary: #0066cc; + --hwp-toolbar-primary-hover: #004999; --hwp-toolbar-button-bg: #ffffff; - --hwp-toolbar-button-hover: #f0f0f0; - --hwp-toolbar-shadow: rgba(0, 0, 0, 0.1); - - /* Spacing */ - --hwp-toolbar-height: 48px; - --hwp-toolbar-padding: 0 20px; - --hwp-toolbar-gap: 8px; - --hwp-toolbar-button-padding: 8px 16px; - - /* Typography */ + --hwp-toolbar-button-hover: #f5f5f5; + --hwp-toolbar-shadow: rgba(0, 0, 0, 0.08); + --hwp-toolbar-height: 46px; + --hwp-toolbar-padding: 0 16px; + --hwp-toolbar-gap: 6px; + --hwp-toolbar-button-padding: 6px 12px; --hwp-toolbar-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; - --hwp-toolbar-font-size: 14px; + --hwp-toolbar-font-size: 13px; --hwp-toolbar-font-weight: 500; - - /* Z-index */ --hwp-toolbar-z-index: 9999; - - /* Border Radius */ - --hwp-toolbar-radius: 4px; + --hwp-toolbar-radius: 3px; } -/* Dark Mode */ @media (prefers-color-scheme: dark) { :root { - --hwp-toolbar-bg: #1e1e1e; - --hwp-toolbar-border: #3a3a3a; - --hwp-toolbar-text: #e0e0e0; - --hwp-toolbar-primary: #2271b1; - --hwp-toolbar-primary-hover: #135e96; + --hwp-toolbar-bg: #1a1a1a; + --hwp-toolbar-border: #3d3d3d; + --hwp-toolbar-text: #e8e8e8; + --hwp-toolbar-primary: #4d9fff; + --hwp-toolbar-primary-hover: #6bb0ff; --hwp-toolbar-button-bg: #2a2a2a; - --hwp-toolbar-button-hover: #383838; + --hwp-toolbar-button-hover: #333333; --hwp-toolbar-shadow: rgba(0, 0, 0, 0.3); } } -/* Toolbar Container */ #hwp-toolbar, .hwp-toolbar { position: fixed; @@ -61,7 +44,7 @@ align-items: center; justify-content: space-between; padding: var(--hwp-toolbar-padding); - box-shadow: 0 -2px 10px var(--hwp-toolbar-shadow); + box-shadow: 0 -1px 4px var(--hwp-toolbar-shadow); gap: var(--hwp-toolbar-gap); z-index: var(--hwp-toolbar-z-index); font-family: var(--hwp-toolbar-font-family); @@ -70,7 +53,6 @@ box-sizing: border-box; } -/* Toolbar Sections */ .hwp-toolbar-section { display: flex; align-items: center; @@ -93,7 +75,6 @@ justify-content: flex-end; } -/* Toolbar Buttons */ .hwp-toolbar-button { padding: var(--hwp-toolbar-button-padding); background: var(--hwp-toolbar-button-bg); @@ -127,7 +108,6 @@ outline-offset: 2px; } -/* Active Button State */ .hwp-toolbar-button-active, .hwp-toolbar-button.hwp-toolbar-button-active { background: var(--hwp-toolbar-primary); @@ -138,7 +118,6 @@ background: var(--hwp-toolbar-primary-hover); } -/* User Button */ .hwp-toolbar-user { margin-left: auto; background: var(--hwp-toolbar-primary); @@ -151,7 +130,6 @@ border-color: var(--hwp-toolbar-primary-hover); } -/* User Avatar */ .hwp-toolbar-avatar { width: 24px; height: 24px; @@ -160,7 +138,6 @@ border: 1px solid currentColor; } -/* Badge */ .hwp-toolbar-badge { background: #d63638; color: white; @@ -173,7 +150,6 @@ text-align: center; } -/* Responsive */ @media (max-width: 768px) { :root { --hwp-toolbar-padding: 0 12px; @@ -186,12 +162,10 @@ gap: 6px; } - /* Hide text on smaller screens, keep icons */ .hwp-toolbar-button span:not(.hwp-toolbar-badge) { display: none; } - /* Show user name on mobile */ .hwp-toolbar-user span { display: inline; } @@ -203,7 +177,6 @@ } } -/* Print */ @media print { #hwp-toolbar, .hwp-toolbar { @@ -211,7 +184,6 @@ } } -/* Accessibility */ @media (prefers-reduced-motion: reduce) { .hwp-toolbar-button { transition: none; @@ -222,7 +194,6 @@ } } -/* High Contrast Mode */ @media (prefers-contrast: high) { :root { --hwp-toolbar-border: #000; From 9465c96587d0c697f7ed5e434a9add41f4c0cf60 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Wed, 8 Oct 2025 21:46:59 -0400 Subject: [PATCH 04/44] Modern state management following TanStack/Zustand patterns. Minimal base styles for full developer control --- .../toolbar-demo/example-app/index.html | 2 +- .../toolbar-demo/example-app/src/main.js | 2 - packages/toolbar/README.md | 96 +++++-- packages/toolbar/package.json | 14 + packages/toolbar/src/index.ts | 245 ++++++++++++++++-- packages/toolbar/src/react.ts | 88 +++++++ packages/toolbar/src/toolbar.css | 210 +++++---------- pnpm-lock.yaml | 24 ++ 8 files changed, 480 insertions(+), 201 deletions(-) create mode 100644 packages/toolbar/src/react.ts diff --git a/examples/vanilla/toolbar-demo/example-app/index.html b/examples/vanilla/toolbar-demo/example-app/index.html index 821745a6..ca843f1b 100644 --- a/examples/vanilla/toolbar-demo/example-app/index.html +++ b/examples/vanilla/toolbar-demo/example-app/index.html @@ -29,7 +29,7 @@

Try This

  • Click "Login" to authenticate with WordPress
  • Click "Fetch Posts" to load posts from WordPress
  • Click a post to view toolbar controls
  • -
  • Use the toolbar at the bottom to preview or edit
  • +
  • Check the state below to see how it updates
  • diff --git a/examples/vanilla/toolbar-demo/example-app/src/main.js b/examples/vanilla/toolbar-demo/example-app/src/main.js index 43fb0b09..4a2385fd 100644 --- a/examples/vanilla/toolbar-demo/example-app/src/main.js +++ b/examples/vanilla/toolbar-demo/example-app/src/main.js @@ -22,9 +22,7 @@ const renderer = new VanillaRenderer(toolbar, 'toolbar'); // Register Custom Nodes // ============================================================================ -// Simple home button toolbar.register('home', 'Home', () => { - console.log('Navigate to home'); window.location.href = '/'; }); diff --git a/packages/toolbar/README.md b/packages/toolbar/README.md index 5f6c88a4..a409e5d1 100644 --- a/packages/toolbar/README.md +++ b/packages/toolbar/README.md @@ -7,10 +7,10 @@ A lightweight, performant toolbar for headless WordPress. Works with any JavaScr ## Features - 🎯 **Framework Agnostic** - Works with React, Vue, Svelte, or vanilla JavaScript -- ⚡ **Zero Dependencies** - Lightweight and fast +- ⚡ **Zero Dependencies** - Core library has no dependencies - 🔒 **Type Safe** - Full TypeScript support -- 🎨 **Themeable** - CSS custom properties for styling -- 🌓 **Dark Mode** - Automatic support +- 🪝 **React Hooks** - First-class React support with hooks +- 🎨 **Headless UI** - Full control over rendering and styling ## Installation @@ -20,28 +20,55 @@ npm install @wpengine/hwp-toolbar ## Quick Start +### Vanilla JavaScript + ```javascript import { Toolbar, VanillaRenderer } from '@wpengine/hwp-toolbar'; import '@wpengine/hwp-toolbar/styles'; -// Create toolbar const toolbar = new Toolbar({ onPreviewChange: (enabled) => { console.log('Preview mode:', enabled); } }); -// Set WordPress context toolbar.setWordPressContext({ user: { id: 1, name: 'Admin' }, site: { url: 'https://example.com', adminUrl: 'https://example.com/wp-admin' }, post: { id: 123, title: 'Hello World', type: 'post', status: 'draft', slug: 'hello-world' } }); -// Render const renderer = new VanillaRenderer(toolbar, 'toolbar'); ``` +### React (Recommended) + +```tsx +import { Toolbar } from '@wpengine/hwp-toolbar'; +import { useToolbar } from '@wpengine/hwp-toolbar/react'; + +const toolbar = new Toolbar({ + onPreviewChange: (enabled) => { + console.log('Preview mode:', enabled); + } +}); + +function MyToolbar() { + const { state, nodes } = useToolbar(toolbar); + + return ( +
    + {nodes.map(node => ( + + ))} + {state.user && User: {state.user.name}} +
    + ); +} +``` + ## API ### Toolbar @@ -122,34 +149,57 @@ Available variables: - `--hwp-toolbar-primary-hover` - Primary button hover - And more... -## Framework Examples +## React Hooks API + +### `useToolbar(toolbar)` -### React +Returns both state and nodes in a single hook: ```tsx -import { useEffect, useRef } from 'react'; -import { Toolbar, VanillaRenderer } from '@wpengine/hwp-toolbar'; +import { useToolbar } from '@wpengine/hwp-toolbar/react'; + +function MyToolbar() { + const { state, nodes } = useToolbar(toolbar); + // Full control over rendering +} +``` + +### `useToolbarState(toolbar)` -function WordPressToolbar({ user, post, site }) { - const ref = useRef(null); +Subscribe to toolbar state only: - useEffect(() => { - if (!ref.current) return; +```tsx +import { useToolbarState } from '@wpengine/hwp-toolbar/react'; + +function UserDisplay() { + const state = useToolbarState(toolbar); + return
    {state.user?.name}
    ; +} +``` - const toolbar = new Toolbar(); - toolbar.setWordPressContext({ user, post, site }); - const renderer = new VanillaRenderer(toolbar, ref.current); +### `useToolbarNodes(toolbar)` - return () => { - renderer.destroy(); - toolbar.destroy(); - }; - }, [user, post, site]); +Subscribe to visible nodes only: - return
    ; +```tsx +import { useToolbarNodes } from '@wpengine/hwp-toolbar/react'; + +function ToolbarButtons() { + const nodes = useToolbarNodes(toolbar); + return ( + <> + {nodes.map(node => ( + + ))} + + ); } ``` +## Framework Examples + ### Vue ```vue diff --git a/packages/toolbar/package.json b/packages/toolbar/package.json index 1af43e38..fb32f812 100644 --- a/packages/toolbar/package.json +++ b/packages/toolbar/package.json @@ -10,6 +10,10 @@ "types": "./dist/index.d.ts", "default": "./dist/index.js" }, + "./react": { + "types": "./dist/react.d.ts", + "default": "./dist/react.js" + }, "./styles": "./src/toolbar.css" }, "files": [ @@ -31,7 +35,17 @@ ], "author": "WP Engine", "license": "BSD-0-Clause", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + }, "devDependencies": { + "@types/react": "^18.3.0", + "react": "^18.3.1", "typescript": "^5.8.3" }, "engines": { diff --git a/packages/toolbar/src/index.ts b/packages/toolbar/src/index.ts index 6de19ada..4b11ed46 100644 --- a/packages/toolbar/src/index.ts +++ b/packages/toolbar/src/index.ts @@ -36,17 +36,43 @@ export interface ToolbarState { isHeadless: boolean; } +export interface ToolbarBranding { + logo?: string; + title?: string; + url?: string; + position?: 'left' | 'center' | 'right'; +} + +export interface ToolbarTheme { + variables?: Record; + className?: string; +} + export interface ToolbarConfig { + branding?: ToolbarBranding; + theme?: ToolbarTheme; onPreviewChange?: (enabled: boolean) => void; } export type NodeCallback = () => void; export type LabelFunction = () => string; +export type NodeType = 'button' | 'link' | 'image' | 'dropdown' | 'divider' | 'custom'; +export type NodePosition = 'left' | 'center' | 'right'; +export type CustomRenderFunction = (state: ToolbarState) => HTMLElement; export interface ToolbarNode { id: string; - label: string | LabelFunction; - onClick: NodeCallback; + type?: NodeType; + label?: string | LabelFunction; + onClick?: NodeCallback; + href?: string; + target?: string; + src?: string; + alt?: string; + items?: ToolbarNode[]; + render?: CustomRenderFunction; + className?: string; + position?: NodePosition; } // ============================================================================ @@ -100,15 +126,23 @@ export class Toolbar { }); } - register(id: string, label: string | LabelFunction, onClick?: NodeCallback): this { - if (typeof label === 'function' && !onClick) { + register(id: string, labelOrNode: string | LabelFunction | Partial, onClick?: NodeCallback): this { + if (typeof labelOrNode === 'object') { + // register(id, nodeConfig) + this.nodes.set(id, { + id, + type: 'button', + ...labelOrNode + } as ToolbarNode); + } else if (typeof labelOrNode === 'function' && !onClick) { // register(id, onClick) - this.nodes.set(id, { id, label: id, onClick: label }); + this.nodes.set(id, { id, type: 'button', label: id, onClick: labelOrNode }); } else { // register(id, label, onClick) this.nodes.set(id, { id, - label, + type: 'button', + label: labelOrNode, onClick: onClick || (() => {}) }); } @@ -191,9 +225,11 @@ export class VanillaRenderer { private toolbar: Toolbar; private element: HTMLElement | null; private unsubscribe: (() => void) | null = null; + private config: ToolbarConfig; constructor(toolbar: Toolbar, elementOrId: string | HTMLElement) { this.toolbar = toolbar; + this.config = (toolbar as any).config || {}; if (typeof elementOrId === 'string') { this.element = document.getElementById(elementOrId); @@ -202,44 +238,197 @@ export class VanillaRenderer { this.element = elementOrId; } + this.applyTheme(); this.unsubscribe = this.toolbar.subscribe((nodes, state) => { this.render(nodes, state); }); } + private applyTheme(): void { + if (!this.element) return; + + if (this.config.theme?.className) { + this.element.classList.add(this.config.theme.className); + } + + if (this.config.theme?.variables) { + Object.entries(this.config.theme.variables).forEach(([key, value]) => { + this.element!.style.setProperty(key, value); + }); + } + } + private render(nodes: ToolbarNode[], state: ToolbarState): void { if (!this.element) return; this.element.innerHTML = ''; this.element.className = 'hwp-toolbar'; + if (this.config.theme?.className) { + this.element.classList.add(this.config.theme.className); + } - // Render nodes - nodes.forEach(node => { - const btn = document.createElement('button'); - btn.className = 'hwp-toolbar-button'; - const labelText = typeof node.label === 'function' ? node.label() : node.label; - btn.textContent = labelText; + const leftSection = document.createElement('div'); + leftSection.className = 'hwp-toolbar-section hwp-toolbar-left'; - if (node.id === 'preview' && state.preview) { - btn.classList.add('hwp-toolbar-button-active'); - } + const centerSection = document.createElement('div'); + centerSection.className = 'hwp-toolbar-section hwp-toolbar-center'; + + const rightSection = document.createElement('div'); + rightSection.className = 'hwp-toolbar-section hwp-toolbar-right'; + + // Render branding + if (this.config.branding) { + const brandingEl = this.createBrandingElement(this.config.branding); + const position = this.config.branding.position || 'left'; + if (position === 'left') leftSection.appendChild(brandingEl); + else if (position === 'center') centerSection.appendChild(brandingEl); + else rightSection.appendChild(brandingEl); + } + + // Render nodes by position + nodes.forEach(node => { + const element = this.createNodeElement(node, state); + if (!element) return; - btn.onclick = () => node.onClick(); - this.element!.appendChild(btn); + const position = node.position || 'left'; + if (position === 'left') leftSection.appendChild(element); + else if (position === 'center') centerSection.appendChild(element); + else rightSection.appendChild(element); }); - // User button + // User button (always right) if (state.user) { - const userBtn = document.createElement('button'); - userBtn.className = 'hwp-toolbar-button hwp-toolbar-user'; - userBtn.textContent = `User: ${state.user.name}`; - userBtn.onclick = () => { - if (confirm(`Logged in as: ${state.user!.name}\n\nLogout?`)) { - this.toolbar.setState({ user: null, post: null, site: null }); - this.toolbar.clear(); - } - }; - this.element!.appendChild(userBtn); + const userBtn = this.createUserButton(state); + rightSection.appendChild(userBtn); } + + this.element.appendChild(leftSection); + this.element.appendChild(centerSection); + this.element.appendChild(rightSection); + } + + private createBrandingElement(branding: ToolbarBranding): HTMLElement { + const container = document.createElement('div'); + container.className = 'hwp-toolbar-branding'; + + if (branding.logo) { + const img = document.createElement('img'); + img.src = branding.logo; + img.alt = branding.title || 'Logo'; + img.className = 'hwp-toolbar-logo'; + container.appendChild(img); + } + + if (branding.title) { + const title = document.createElement('span'); + title.textContent = branding.title; + title.className = 'hwp-toolbar-brand-title'; + container.appendChild(title); + } + + if (branding.url) { + const wrapper = document.createElement('a'); + wrapper.href = branding.url; + wrapper.className = 'hwp-toolbar-branding-link'; + wrapper.appendChild(container); + return wrapper; + } + + return container; + } + + private createNodeElement(node: ToolbarNode, state: ToolbarState): HTMLElement | null { + const type = node.type || 'button'; + + if (type === 'divider') { + const divider = document.createElement('div'); + divider.className = 'hwp-toolbar-divider'; + return divider; + } + + if (type === 'custom' && node.render) { + return node.render(state); + } + + if (type === 'image' && node.src) { + const img = document.createElement('img'); + img.src = node.src; + img.alt = node.alt || ''; + img.className = `hwp-toolbar-image ${node.className || ''}`.trim(); + if (node.onClick) img.onclick = () => node.onClick!(); + return img; + } + + if (type === 'link' && node.href) { + const link = document.createElement('a'); + link.href = node.href; + link.target = node.target || '_blank'; + link.className = `hwp-toolbar-link ${node.className || ''}`.trim(); + const labelText = typeof node.label === 'function' ? node.label() : node.label || ''; + link.textContent = labelText; + return link; + } + + if (type === 'dropdown' && node.items) { + return this.createDropdown(node, state); + } + + // Default: button + const btn = document.createElement('button'); + btn.className = `hwp-toolbar-button ${node.className || ''}`.trim(); + const labelText = typeof node.label === 'function' ? node.label() : node.label || ''; + btn.textContent = labelText; + + if (node.id === 'preview' && state.preview) { + btn.classList.add('hwp-toolbar-button-active'); + } + + if (node.onClick) btn.onclick = () => node.onClick!(); + return btn; + } + + private createDropdown(node: ToolbarNode, state: ToolbarState): HTMLElement { + const container = document.createElement('div'); + container.className = 'hwp-toolbar-dropdown'; + + const trigger = document.createElement('button'); + trigger.className = 'hwp-toolbar-dropdown-trigger hwp-toolbar-button'; + const labelText = typeof node.label === 'function' ? node.label() : node.label || ''; + trigger.textContent = labelText + ' ▾'; + + const menu = document.createElement('div'); + menu.className = 'hwp-toolbar-dropdown-menu'; + menu.style.display = 'none'; + + node.items!.forEach(item => { + const itemEl = document.createElement('button'); + itemEl.className = 'hwp-toolbar-dropdown-item'; + const itemLabel = typeof item.label === 'function' ? item.label() : item.label || ''; + itemEl.textContent = itemLabel; + if (item.onClick) itemEl.onclick = () => item.onClick!(); + menu.appendChild(itemEl); + }); + + trigger.onclick = () => { + const isOpen = menu.style.display === 'block'; + menu.style.display = isOpen ? 'none' : 'block'; + }; + + container.appendChild(trigger); + container.appendChild(menu); + return container; + } + + private createUserButton(state: ToolbarState): HTMLElement { + const userBtn = document.createElement('button'); + userBtn.className = 'hwp-toolbar-button hwp-toolbar-user'; + userBtn.textContent = `User: ${state.user!.name}`; + userBtn.onclick = () => { + if (confirm(`Logged in as: ${state.user!.name}\n\nLogout?`)) { + this.toolbar.setState({ user: null, post: null, site: null }); + this.toolbar.clear(); + } + }; + return userBtn; } destroy(): void { diff --git a/packages/toolbar/src/react.ts b/packages/toolbar/src/react.ts new file mode 100644 index 00000000..eadd3e7c --- /dev/null +++ b/packages/toolbar/src/react.ts @@ -0,0 +1,88 @@ +import { useState, useEffect, useMemo } from 'react'; +import type { Toolbar, ToolbarNode, ToolbarState } from './index'; + +/** + * React hook to subscribe to toolbar state changes + * Similar to Zustand's useStore pattern + * + * @example + * ```tsx + * function MyComponent() { + * const state = useToolbarState(toolbar); + * return
    User: {state.user?.name}
    ; + * } + * ``` + */ +export function useToolbarState(toolbar: Toolbar): ToolbarState { + const [state, setState] = useState(() => toolbar.getState()); + + useEffect(() => { + const unsubscribe = toolbar.subscribe((_, newState) => { + setState(newState); + }); + return unsubscribe; + }, [toolbar]); + + return state; +} + +/** + * React hook to subscribe to toolbar nodes + * Returns visible nodes based on current state + * + * @example + * ```tsx + * function ToolbarButtons() { + * const nodes = useToolbarNodes(toolbar); + * return ( + *
    + * {nodes.map(node => ( + * + * ))} + *
    + * ); + * } + * ``` + */ +export function useToolbarNodes(toolbar: Toolbar): ToolbarNode[] { + const [nodes, setNodes] = useState(() => toolbar.getVisibleNodes()); + + useEffect(() => { + const unsubscribe = toolbar.subscribe((newNodes) => { + setNodes(newNodes); + }); + return unsubscribe; + }, [toolbar]); + + return nodes; +} + +/** + * React hook that combines state and nodes + * Convenience hook for components that need both + * + * @example + * ```tsx + * function MyToolbar() { + * const { state, nodes } = useToolbar(toolbar); + * + * return ( + *
    + * {nodes.map(node =>
    + * ); + * } + * ``` + */ +export function useToolbar(toolbar: Toolbar): { + state: ToolbarState; + nodes: ToolbarNode[]; +} { + const state = useToolbarState(toolbar); + const nodes = useToolbarNodes(toolbar); + + return useMemo(() => ({ state, nodes }), [state, nodes]); +} diff --git a/packages/toolbar/src/toolbar.css b/packages/toolbar/src/toolbar.css index ff0d7407..9aa0ed23 100644 --- a/packages/toolbar/src/toolbar.css +++ b/packages/toolbar/src/toolbar.css @@ -1,34 +1,5 @@ -:root { - --hwp-toolbar-bg: #ffffff; - --hwp-toolbar-border: #d0d0d0; - --hwp-toolbar-text: #1a1a1a; - --hwp-toolbar-primary: #0066cc; - --hwp-toolbar-primary-hover: #004999; - --hwp-toolbar-button-bg: #ffffff; - --hwp-toolbar-button-hover: #f5f5f5; - --hwp-toolbar-shadow: rgba(0, 0, 0, 0.08); - --hwp-toolbar-height: 46px; - --hwp-toolbar-padding: 0 16px; - --hwp-toolbar-gap: 6px; - --hwp-toolbar-button-padding: 6px 12px; - --hwp-toolbar-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; - --hwp-toolbar-font-size: 13px; - --hwp-toolbar-font-weight: 500; - --hwp-toolbar-z-index: 9999; - --hwp-toolbar-radius: 3px; -} - -@media (prefers-color-scheme: dark) { - :root { - --hwp-toolbar-bg: #1a1a1a; - --hwp-toolbar-border: #3d3d3d; - --hwp-toolbar-text: #e8e8e8; - --hwp-toolbar-primary: #4d9fff; - --hwp-toolbar-primary-hover: #6bb0ff; - --hwp-toolbar-button-bg: #2a2a2a; - --hwp-toolbar-button-hover: #333333; - --hwp-toolbar-shadow: rgba(0, 0, 0, 0.3); - } +* { + box-sizing: border-box; } #hwp-toolbar, @@ -37,37 +8,30 @@ bottom: 0; left: 0; right: 0; - min-height: var(--hwp-toolbar-height); - background: var(--hwp-toolbar-bg); - border-top: 1px solid var(--hwp-toolbar-border); + background: #f5f5f5; + border-top: 1px solid #ccc; + padding: 8px 12px; display: flex; align-items: center; justify-content: space-between; - padding: var(--hwp-toolbar-padding); - box-shadow: 0 -1px 4px var(--hwp-toolbar-shadow); - gap: var(--hwp-toolbar-gap); - z-index: var(--hwp-toolbar-z-index); - font-family: var(--hwp-toolbar-font-family); - font-size: var(--hwp-toolbar-font-size); - color: var(--hwp-toolbar-text); - box-sizing: border-box; + gap: 8px; + z-index: 9999; + font-family: sans-serif; + font-size: 13px; } .hwp-toolbar-section { display: flex; align-items: center; - gap: var(--hwp-toolbar-gap); - flex-wrap: wrap; + gap: 8px; } .hwp-toolbar-left { flex: 1; - justify-content: flex-start; } .hwp-toolbar-center { flex: 0; - justify-content: center; } .hwp-toolbar-right { @@ -76,131 +40,83 @@ } .hwp-toolbar-button { - padding: var(--hwp-toolbar-button-padding); - background: var(--hwp-toolbar-button-bg); - border: 1px solid var(--hwp-toolbar-primary); - color: var(--hwp-toolbar-primary); + padding: 4px 8px; + background: white; + border: 1px solid #999; cursor: pointer; - border-radius: var(--hwp-toolbar-radius); - font-size: var(--hwp-toolbar-font-size); - font-weight: var(--hwp-toolbar-font-weight); + font-size: 13px; font-family: inherit; - transition: all 0.2s ease; - display: inline-flex; - align-items: center; - gap: 6px; - white-space: nowrap; - line-height: 1.4; - box-sizing: border-box; } -.hwp-toolbar-button:hover { - background: var(--hwp-toolbar-primary); - color: var(--hwp-toolbar-bg); +.hwp-toolbar-button-active { + background: #ddd; } -.hwp-toolbar-button:active { - transform: scale(0.98); +.hwp-toolbar-link { + padding: 4px 8px; + text-decoration: none; + color: #0066cc; } -.hwp-toolbar-button:focus-visible { - outline: 2px solid var(--hwp-toolbar-primary); - outline-offset: 2px; +.hwp-toolbar-divider { + width: 1px; + height: 20px; + background: #ccc; } -.hwp-toolbar-button-active, -.hwp-toolbar-button.hwp-toolbar-button-active { - background: var(--hwp-toolbar-primary); - color: var(--hwp-toolbar-bg); +.hwp-toolbar-dropdown { + position: relative; } -.hwp-toolbar-button-active:hover { - background: var(--hwp-toolbar-primary-hover); +.hwp-toolbar-dropdown-trigger { + padding: 4px 8px; + background: white; + border: 1px solid #999; + cursor: pointer; + font-size: 13px; + font-family: inherit; } -.hwp-toolbar-user { - margin-left: auto; - background: var(--hwp-toolbar-primary); - color: var(--hwp-toolbar-bg); - border-color: var(--hwp-toolbar-primary); +.hwp-toolbar-dropdown-menu { + position: absolute; + bottom: 100%; + left: 0; + background: white; + border: 1px solid #999; + margin-bottom: 4px; + min-width: 150px; +} + +.hwp-toolbar-dropdown-item { + display: block; + width: 100%; + padding: 6px 12px; + background: white; + border: none; + border-bottom: 1px solid #eee; + text-align: left; + cursor: pointer; + font-size: 13px; + font-family: inherit; } -.hwp-toolbar-user:hover { - background: var(--hwp-toolbar-primary-hover); - border-color: var(--hwp-toolbar-primary-hover); +.hwp-toolbar-dropdown-item:last-child { + border-bottom: none; } -.hwp-toolbar-avatar { - width: 24px; - height: 24px; - border-radius: 50%; - object-fit: cover; - border: 1px solid currentColor; -} - -.hwp-toolbar-badge { - background: #d63638; - color: white; - padding: 2px 6px; - border-radius: 10px; - font-size: 11px; - font-weight: 600; - line-height: 1; - min-width: 18px; - text-align: center; -} - -@media (max-width: 768px) { - :root { - --hwp-toolbar-padding: 0 12px; - --hwp-toolbar-gap: 6px; - --hwp-toolbar-button-padding: 6px 12px; - --hwp-toolbar-font-size: 13px; - } - - .hwp-toolbar-section { - gap: 6px; - } - - .hwp-toolbar-button span:not(.hwp-toolbar-badge) { - display: none; - } - - .hwp-toolbar-user span { - display: inline; - } +.hwp-toolbar-branding { + display: flex; + align-items: center; + gap: 8px; } -@media (max-width: 480px) { - :root { - --hwp-toolbar-height: 44px; - } +.hwp-toolbar-logo { + height: 24px; } @media print { #hwp-toolbar, .hwp-toolbar { - display: none !important; - } -} - -@media (prefers-reduced-motion: reduce) { - .hwp-toolbar-button { - transition: none; - } - - .hwp-toolbar-button:active { - transform: none; - } -} - -@media (prefers-contrast: high) { - :root { - --hwp-toolbar-border: #000; - --hwp-toolbar-primary: #0000ff; - } - - .hwp-toolbar-button { - border-width: 2px; + display: none; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b0a4cad..d009c903 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,6 +58,12 @@ importers: packages/toolbar: devDependencies: + '@types/react': + specifier: ^18.3.0 + version: 18.3.26 + react: + specifier: ^18.3.1 + version: 18.3.1 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -1862,12 +1868,18 @@ packages: '@types/pg@8.6.1': resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react@18.3.26': + resolution: {integrity: sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==} + '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -3001,6 +3013,9 @@ packages: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + cwd@0.10.0: resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} engines: {node: '>=0.8'} @@ -9273,10 +9288,17 @@ snapshots: pg-protocol: 1.10.3 pg-types: 2.2.0 + '@types/prop-types@15.7.15': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} + '@types/react@18.3.26': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.1.3 + '@types/responselike@1.0.3': dependencies: '@types/node': 24.0.12 @@ -10883,6 +10905,8 @@ snapshots: dependencies: cssom: 0.3.8 + csstype@3.1.3: {} + cwd@0.10.0: dependencies: find-pkg: 0.1.2 From 10bcabff2f7a222d758a9599c1167ab5247d2541 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 07:45:00 -0400 Subject: [PATCH 05/44] Add centralized templates and shared port calculation --- scripts/get-ports.js | 89 +++++++++++++++++++++++++++++++++ scripts/templates/.htaccess | 11 ++++ scripts/templates/mu-plugin.php | 28 +++++++++++ 3 files changed, 128 insertions(+) create mode 100755 scripts/get-ports.js create mode 100644 scripts/templates/.htaccess create mode 100644 scripts/templates/mu-plugin.php diff --git a/scripts/get-ports.js b/scripts/get-ports.js new file mode 100755 index 00000000..edf595be --- /dev/null +++ b/scripts/get-ports.js @@ -0,0 +1,89 @@ +#!/usr/bin/env node + +/** + * Calculate deterministic ports for examples based on their directory path. + * + * Usage: node scripts/get-ports.js [example-path] + * + * The example-path should be relative to the examples/ directory. + * Example: "vanilla/toolbar-demo" or "next/toolbar-demo" + * + * If no path is provided, it will auto-detect from current working directory. + */ + +const crypto = require('crypto'); +const path = require('path'); +const fs = require('fs'); + +/** + * Simple hash function that converts a string to a number in range [0, 999] + */ +function hashToPort(str) { + const hash = crypto.createHash('sha256').update(str).digest('hex'); + // Take first 8 hex chars and convert to decimal, then mod 900 + 100 to get range [100, 999] + // This ensures we skip the first 100 ports to avoid conflicts with common services + const num = parseInt(hash.substring(0, 8), 16); + return (num % 900) + 100; +} + +/** + * Get the example path from current working directory + */ +function getExamplePathFromCwd() { + const cwd = process.cwd(); + const examplesDir = path.join(__dirname, '..', 'examples'); + + if (!cwd.startsWith(examplesDir)) { + throw new Error(`Current directory is not inside examples/: ${cwd}`); + } + + const relativePath = path.relative(examplesDir, cwd); + // Get the first two segments (e.g., "vanilla/toolbar-demo") + const segments = relativePath.split(path.sep); + return segments.slice(0, 2).join('/'); +} + +/** + * Calculate ports for a given example path + */ +function getPorts(examplePath) { + const offset = hashToPort(examplePath); + + const frontendPort = 3000 + offset; + const wpPort = 8000 + offset; + const wpTestPort = wpPort + 1; + + return { + FRONTEND_PORT: frontendPort, + WP_PORT: wpPort, + WP_TEST_PORT: wpTestPort, + EXAMPLE_PATH: examplePath, + PORT_OFFSET: offset + }; +} + +// Main execution +const examplePath = process.argv[2] || getExamplePathFromCwd(); +const ports = getPorts(examplePath); + +// Output as shell-sourceable format if --shell flag +if (process.argv.includes('--shell')) { + console.log(`export FRONTEND_PORT=${ports.FRONTEND_PORT}`); + console.log(`export WP_PORT=${ports.WP_PORT}`); + console.log(`export WP_TEST_PORT=${ports.WP_TEST_PORT}`); +} +// Output as JSON if --json flag +else if (process.argv.includes('--json')) { + console.log(JSON.stringify(ports, null, 2)); +} +// Default: human-readable format +else { + console.log(`\nPorts for "${examplePath}":`); + console.log(` Frontend: ${ports.FRONTEND_PORT}`); + console.log(` WordPress: ${ports.WP_PORT}`); + console.log(` WP Test: ${ports.WP_TEST_PORT}`); + console.log(` (offset: ${ports.PORT_OFFSET})\n`); +} + +// Also export for require() +module.exports = { getPorts, hashToPort }; diff --git a/scripts/templates/.htaccess b/scripts/templates/.htaccess new file mode 100644 index 00000000..fffb6517 --- /dev/null +++ b/scripts/templates/.htaccess @@ -0,0 +1,11 @@ +# BEGIN WordPress + +RewriteEngine On +RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] +RewriteBase / +RewriteRule ^index\.php$ - [L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule . /index.php [L] + +# END WordPress diff --git a/scripts/templates/mu-plugin.php b/scripts/templates/mu-plugin.php new file mode 100644 index 00000000..9f540a5e --- /dev/null +++ b/scripts/templates/mu-plugin.php @@ -0,0 +1,28 @@ + Date: Thu, 9 Oct 2025 07:51:36 -0400 Subject: [PATCH 06/44] feat(toolbar): configure vanilla example to use template-based generation Switch vanilla example from hardcoded configs to auto-generated approach. Files like mu-plugin.php, .htaccess, and .wp-env.json are now generated from centralized templates by the setup-env.js script. - Add setup-env.js script that generates configs from templates - Remove mu-plugin.php, .htaccess, .wp-env.json from version control - Update .gitignore to exclude auto-generated example files --- .gitignore | 7 ++ examples/vanilla/toolbar-demo/scripts/dev.sh | 18 +++++ .../vanilla/toolbar-demo/scripts/setup-env.js | 71 +++++++++++++++++++ .../vanilla/toolbar-demo/scripts/wp-start.sh | 41 +++++++++++ 4 files changed, 137 insertions(+) create mode 100644 examples/vanilla/toolbar-demo/scripts/dev.sh create mode 100755 examples/vanilla/toolbar-demo/scripts/setup-env.js create mode 100644 examples/vanilla/toolbar-demo/scripts/wp-start.sh diff --git a/.gitignore b/.gitignore index 4e5358e3..e6f878d2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ node_modules # Build outputs dist +build +.next +out # Testing coverage @@ -13,6 +16,7 @@ test-results/ # WordPress .wp-env .wp-env.override.json +wp-env/ uploads/ debug.log __MACOSX @@ -29,4 +33,7 @@ __MACOSX ## Examples examples/**/package-lock.json examples/**/__MACOSX +examples/**/mu-plugin.php +examples/**/.htaccess +examples/**/.wp-env.json `` \ No newline at end of file diff --git a/examples/vanilla/toolbar-demo/scripts/dev.sh b/examples/vanilla/toolbar-demo/scripts/dev.sh new file mode 100644 index 00000000..794351c4 --- /dev/null +++ b/examples/vanilla/toolbar-demo/scripts/dev.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# Calculate ports for this example +EXAMPLE_PATH="vanilla/toolbar-demo" +PORTS=$(node ../../../scripts/get-ports.js "$EXAMPLE_PATH" --json) + +# Extract ports from JSON +export FRONTEND_PORT=$(echo "$PORTS" | grep -o '"FRONTEND_PORT": [0-9]*' | grep -o '[0-9]*') +export WP_PORT=$(echo "$PORTS" | grep -o '"WP_PORT": [0-9]*' | grep -o '[0-9]*') +export WP_TEST_PORT=$(echo "$PORTS" | grep -o '"WP_TEST_PORT": [0-9]*' | grep -o '[0-9]*') + +echo "Starting vanilla toolbar demo..." +echo " Frontend: http://localhost:$FRONTEND_PORT" +echo " WordPress: http://localhost:$WP_PORT" +echo "" + +# Start Vite dev server with calculated port +cd example-app && vite --port "$FRONTEND_PORT" diff --git a/examples/vanilla/toolbar-demo/scripts/setup-env.js b/examples/vanilla/toolbar-demo/scripts/setup-env.js new file mode 100755 index 00000000..53f6f136 --- /dev/null +++ b/examples/vanilla/toolbar-demo/scripts/setup-env.js @@ -0,0 +1,71 @@ +#!/usr/bin/env node + +/** + * Generate .env file with calculated ports for this example + */ + +const { getPorts } = require('../../../../scripts/get-ports.js'); +const fs = require('fs'); +const path = require('path'); + +const examplePath = 'vanilla/toolbar-demo'; +const ports = getPorts(examplePath); + +// Create .env file for Vite +const envContent = `# Auto-generated by setup-env.js - DO NOT EDIT MANUALLY +VITE_FRONTEND_PORT=${ports.FRONTEND_PORT} +VITE_WP_URL=http://localhost:${ports.WP_PORT} +VITE_WP_PORT=${ports.WP_PORT} +VITE_WP_TEST_PORT=${ports.WP_TEST_PORT} +`; + +const envPath = path.join(__dirname, '../example-app/.env'); +fs.writeFileSync(envPath, envContent); + +console.log(`✓ Generated .env for ${examplePath}`); +console.log(` Frontend: ${ports.FRONTEND_PORT}`); +console.log(` WordPress: ${ports.WP_PORT}`); +console.log(` WP Test: ${ports.WP_TEST_PORT}`); + +// Update .wp-env.json +const wpEnvConfig = { + phpVersion: '8.0', + plugins: [ + 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip' + ], + config: { + WP_DEBUG: true, + WP_DEBUG_LOG: true, + GRAPHQL_DEBUG: true + }, + port: ports.WP_PORT, + testsPort: ports.WP_TEST_PORT, + mappings: { + db: './wp-env/db', + 'wp-content/mu-plugins': './mu-plugin.php', + '.htaccess': './.htaccess' + }, + lifecycleScripts: { + afterStart: 'wp-env run cli -- wp rewrite structure \'/%postname%/\' --hard && wp-env run cli -- wp theme activate twentytwentyfour' + } +}; + +const wpEnvPath = path.join(__dirname, '../.wp-env.json'); +fs.writeFileSync(wpEnvPath, JSON.stringify(wpEnvConfig, null, 2) + '\n'); + +console.log(`✓ Updated .wp-env.json`); + +// Generate mu-plugin.php from template +const muPluginTemplatePath = path.join(__dirname, '../../../../scripts/templates/mu-plugin.php'); +const muPluginTemplate = fs.readFileSync(muPluginTemplatePath, 'utf8'); +const muPluginContent = muPluginTemplate.replace(/{{FRONTEND_PORT}}/g, ports.FRONTEND_PORT); + +const muPluginPath = path.join(__dirname, '../mu-plugin.php'); +fs.writeFileSync(muPluginPath, muPluginContent); +console.log(`✓ Generated mu-plugin.php`); + +// Copy .htaccess from template +const htaccessTemplatePath = path.join(__dirname, '../../../../scripts/templates/.htaccess'); +const htaccessPath = path.join(__dirname, '../.htaccess'); +fs.copyFileSync(htaccessTemplatePath, htaccessPath); +console.log(`✓ Generated .htaccess`); diff --git a/examples/vanilla/toolbar-demo/scripts/wp-start.sh b/examples/vanilla/toolbar-demo/scripts/wp-start.sh new file mode 100644 index 00000000..deac8d7a --- /dev/null +++ b/examples/vanilla/toolbar-demo/scripts/wp-start.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# Calculate ports for this example +EXAMPLE_PATH="vanilla/toolbar-demo" +PORTS=$(node ../../../scripts/get-ports.js "$EXAMPLE_PATH" --json) + +# Extract ports from JSON +export WP_PORT=$(echo "$PORTS" | grep -o '"WP_PORT": [0-9]*' | grep -o '[0-9]*') +export WP_TEST_PORT=$(echo "$PORTS" | grep -o '"WP_TEST_PORT": [0-9]*' | grep -o '[0-9]*') + +echo "Starting WordPress for vanilla toolbar demo..." +echo " WordPress: http://localhost:$WP_PORT" +echo " WP Test: http://localhost:$WP_TEST_PORT" +echo "" + +# Update .wp-env.json with calculated ports +cat > .wp-env.json < Date: Thu, 9 Oct 2025 07:56:22 -0400 Subject: [PATCH 07/44] feat(toolbar): add Next.js toolbar demo example Add comprehensive Next.js App Router example demonstrating the toolbar with real WordPress integration. - Complete Next.js example with App Router - Hash-based port calculation for deterministic ports - Template-based configuration (mu-plugin, .htaccess, .wp-env.json) - One-command startup with concurrently - Real WordPress data integration (no mocks) - WPGraphQL for post fetching - Responsive toolbar with real user data --- examples/next/toolbar-demo/README.md | 137 ++++++++++++++++++ .../example-app/.env.local.example | 20 +++ .../example-app/app/components/Toolbar.tsx | 81 +++++++++++ .../toolbar-demo/example-app/app/globals.css | 110 ++++++++++++++ .../toolbar-demo/example-app/app/layout.tsx | 23 +++ .../toolbar-demo/example-app/app/page.tsx | 116 +++++++++++++++ examples/next/toolbar-demo/example-app/dev.sh | 5 + .../toolbar-demo/example-app/lib/toolbar.ts | 16 ++ .../toolbar-demo/example-app/lib/wordpress.ts | 42 ++++++ .../toolbar-demo/example-app/next-env.d.ts | 6 + .../toolbar-demo/example-app/next.config.ts | 5 + .../toolbar-demo/example-app/package.json | 23 +++ .../toolbar-demo/example-app/tsconfig.json | 40 +++++ examples/next/toolbar-demo/package.json | 29 ++++ .../next/toolbar-demo/scripts/setup-env.js | 71 +++++++++ 15 files changed, 724 insertions(+) create mode 100644 examples/next/toolbar-demo/README.md create mode 100644 examples/next/toolbar-demo/example-app/.env.local.example create mode 100644 examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx create mode 100644 examples/next/toolbar-demo/example-app/app/globals.css create mode 100644 examples/next/toolbar-demo/example-app/app/layout.tsx create mode 100644 examples/next/toolbar-demo/example-app/app/page.tsx create mode 100755 examples/next/toolbar-demo/example-app/dev.sh create mode 100644 examples/next/toolbar-demo/example-app/lib/toolbar.ts create mode 100644 examples/next/toolbar-demo/example-app/lib/wordpress.ts create mode 100644 examples/next/toolbar-demo/example-app/next-env.d.ts create mode 100644 examples/next/toolbar-demo/example-app/next.config.ts create mode 100644 examples/next/toolbar-demo/example-app/package.json create mode 100644 examples/next/toolbar-demo/example-app/tsconfig.json create mode 100644 examples/next/toolbar-demo/package.json create mode 100755 examples/next/toolbar-demo/scripts/setup-env.js diff --git a/examples/next/toolbar-demo/README.md b/examples/next/toolbar-demo/README.md new file mode 100644 index 00000000..0230b252 --- /dev/null +++ b/examples/next/toolbar-demo/README.md @@ -0,0 +1,137 @@ +# Toolbar Demo - React Hooks + +React hooks example with Next.js App Router demonstrating the Headless WordPress Toolbar. + +## Features + +- React hooks (`useToolbar`, `useToolbarState`, `useToolbarNodes`) +- Next.js App Router (App Directory) +- TypeScript +- Framework-agnostic state management +- WordPress context integration + +## Quick Start + +```bash +# Install dependencies (from monorepo root) +pnpm install + +# Start WordPress (from this directory) +npx wp-env start + +# Start Next.js dev server (from example-app directory) +cd example-app +pnpm dev +``` + +Open: +- Next.js App: [http://localhost:3001](http://localhost:3001) +- WordPress Admin: [http://localhost:8001/wp-admin](http://localhost:8001/wp-admin) + - Username: `admin` + - Password: `password` + +## Key Files + +- `lib/toolbar.ts` - Singleton toolbar instance +- `lib/wordpress.ts` - WordPress REST API integration +- `app/components/Toolbar.tsx` - Toolbar component using React hooks +- `app/page.tsx` - Demo page with WordPress integration + +## Usage Pattern + +```tsx +import { toolbar } from '@/lib/toolbar'; +import { useToolbar } from '@wpengine/hwp-toolbar/react'; + +function MyComponent() { + const { state, nodes } = useToolbar(toolbar); + + return ( +
    + {nodes.map(node => ( + + ))} +
    + ); +} +``` + +## State Management + +The toolbar follows modern state management patterns (TanStack/Zustand): + +1. **Framework-agnostic core** - `Toolbar` class manages state +2. **React integration** - Hooks subscribe to state changes +3. **Full UI control** - You render the toolbar however you want + +## WordPress Integration + +The demo integrates with a local WordPress instance via REST API. + +### Demo Authentication + +By default, the demo uses **mock authentication** to simplify the setup: + +```ts +// Demo user (no actual WordPress login required) +const user = await getCurrentUser(); // Returns mock user + +// Public posts endpoint (no authentication needed) +const posts = await getPosts(); // Fetches from /wp/v2/posts +``` + +This lets you test the toolbar immediately without WordPress login complexity. + +### Production Authentication + +For production use, implement proper authentication using **WordPress Application Passwords**: + +1. **Generate Application Password**: + - Go to WordPress Admin → Users → Profile + - Scroll to "Application Passwords" + - Create a new password + +2. **Configure Environment**: + ```bash + cp .env.local.example .env.local + # Add your credentials to .env.local + ``` + +3. **Update `lib/wordpress.ts`**: + ```ts + const auth = btoa(`${process.env.WP_USERNAME}:${process.env.WP_APP_PASSWORD}`); + + export async function fetchFromWordPress(endpoint: string) { + const response = await fetch(`${WP_API_URL}/wp-json${endpoint}`, { + headers: { + 'Authorization': `Basic ${auth}` + } + }); + // ... + } + ``` + +### Features Demonstrated + +- **WordPress Connection**: Fetch data from WordPress REST API +- **Post Management**: Load and display WordPress posts +- **Dynamic Toolbar**: Nodes appear/disappear based on WordPress context +- **Error Handling**: Clear error messages for connection issues + +### Troubleshooting + +**CORS Errors** +- Make sure wp-env is running: `npx wp-env start` +- Check WordPress is accessible at http://localhost:8001 +- MU plugin should enable CORS headers automatically + +**Connection Failed** +- Verify wp-env is running: `npx wp-env start` +- Check the port matches `.wp-env.json` (default: 8001) +- Try accessing http://localhost:8001 in your browser + +**No Posts Available** +- Create sample posts in WordPress Admin +- Or run: `npx wp-env run cli wp post generate --count=5` diff --git a/examples/next/toolbar-demo/example-app/.env.local.example b/examples/next/toolbar-demo/example-app/.env.local.example new file mode 100644 index 00000000..3cbbdc1c --- /dev/null +++ b/examples/next/toolbar-demo/example-app/.env.local.example @@ -0,0 +1,20 @@ +# WordPress Configuration +# Copy this file to .env.local and update with your values + +# WordPress Site URL +NEXT_PUBLIC_WP_URL=http://localhost:8891 + +# Production Authentication (optional) +# For real authentication, generate Application Passwords in WordPress: +# 1. Go to WordPress Admin → Users → Profile +# 2. Scroll to "Application Passwords" +# 3. Create a new application password +# 4. Add credentials here: +# WP_USERNAME=admin +# WP_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx + +# Note: This demo uses mock authentication by default. +# To enable real authentication: +# 1. Uncomment the credentials above +# 2. Update lib/wordpress.ts to use Application Password authentication +# 3. Add Authorization header: `Basic ${btoa(username:password)}` diff --git a/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx b/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx new file mode 100644 index 00000000..debacbdb --- /dev/null +++ b/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx @@ -0,0 +1,81 @@ +'use client'; + +import { useToolbar } from '@wpengine/hwp-toolbar/react'; +import { toolbar } from '@/lib/toolbar'; +import '@wpengine/hwp-toolbar/styles'; +import { useState, useEffect } from 'react'; + +export function Toolbar() { + const { state, nodes } = useToolbar(toolbar); + const [position, setPosition] = useState<'top' | 'bottom'>('bottom'); + + useEffect(() => { + const unsubscribe = toolbar.subscribe(() => { + const config = (toolbar as any).config; + setPosition(config?.position || 'bottom'); + }); + return unsubscribe; + }, []); + + return ( +
    +
    + {nodes + .filter((node) => node.position !== 'right') + .map((node) => { + const label = typeof node.label === 'function' ? node.label() : node.label; + + if (node.type === 'divider') { + return
    ; + } + + if (node.type === 'link' && node.href) { + return ( + + {label} + + ); + } + + return ( + + ); + })} +
    + +
    + +
    + {state.user && ( + + )} +
    +
    + ); +} diff --git a/examples/next/toolbar-demo/example-app/app/globals.css b/examples/next/toolbar-demo/example-app/app/globals.css new file mode 100644 index 00000000..16d506e7 --- /dev/null +++ b/examples/next/toolbar-demo/example-app/app/globals.css @@ -0,0 +1,110 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: system-ui, -apple-system, sans-serif; + line-height: 1.5; + color: #333; + background: #f9f9f9; + padding-bottom: 60px; +} + +.container { + max-width: 800px; + margin: 0 auto; + padding: 16px; +} + +h1 { + font-size: 1.25rem; + margin-bottom: 0.25rem; + font-weight: 600; + color: #222; +} + +h2 { + font-size: 0.75rem; + margin: 1rem 0 0.5rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: #888; + font-weight: 500; +} + +h3 { + font-size: 0.875rem; + margin: 0.5rem 0; + font-weight: 500; +} + +p { + font-size: 0.875rem; + color: #666; + margin-bottom: 1rem; +} + +.controls, +.state, +.info { + margin-bottom: 1rem; + padding: 0.75rem; + background: white; + border: 1px solid #e8e8e8; + border-radius: 2px; +} + +.controls button { + padding: 4px 10px; + margin: 3px 3px 3px 0; + border: 1px solid #d0d0d0; + background: white; + color: #555; + cursor: pointer; + font-size: 12px; + border-radius: 2px; +} + +.controls button:hover { + background: #fafafa; + border-color: #999; +} + +#wordpress-posts button { + padding: 4px 10px; + margin: 3px 3px 3px 0; + border: 1px solid #d0d0d0; + background: white; + color: #555; + cursor: pointer; + font-size: 12px; + border-radius: 2px; +} + +#wordpress-posts button:hover { + background: #fafafa; + border-color: #999; +} + +.state pre { + background: #fafafa; + color: #444; + padding: 0.5rem; + font-size: 0.75rem; + font-family: monospace; + overflow-x: auto; + border: 1px solid #eee; + border-radius: 2px; +} + +.info ol { + margin-left: 1.25rem; + font-size: 0.8125rem; +} + +.info li { + margin: 0.25rem 0; + color: #666; +} diff --git a/examples/next/toolbar-demo/example-app/app/layout.tsx b/examples/next/toolbar-demo/example-app/app/layout.tsx new file mode 100644 index 00000000..4bf87af0 --- /dev/null +++ b/examples/next/toolbar-demo/example-app/app/layout.tsx @@ -0,0 +1,23 @@ +import type { Metadata } from 'next'; +import { Toolbar } from './components/Toolbar'; +import './globals.css'; + +export const metadata: Metadata = { + title: 'Toolbar Demo - React Hooks', + description: 'Headless WordPress Toolbar with React hooks', +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + + ); +} diff --git a/examples/next/toolbar-demo/example-app/app/page.tsx b/examples/next/toolbar-demo/example-app/app/page.tsx new file mode 100644 index 00000000..7f56df21 --- /dev/null +++ b/examples/next/toolbar-demo/example-app/app/page.tsx @@ -0,0 +1,116 @@ +'use client'; + +import { toolbar } from '@/lib/toolbar'; +import { useToolbarState } from '@wpengine/hwp-toolbar/react'; +import { getCurrentUser, getPosts } from '@/lib/wordpress'; +import { useState } from 'react'; + +export default function Home() { + const state = useToolbarState(toolbar); + const [posts, setPosts] = useState([]); + + const handleConnect = async () => { + try { + // Test WordPress connection by fetching posts + await getPosts(); + + // Connection successful - set mock user for demo + const user = await getCurrentUser(); + toolbar.setWordPressContext({ + user: { + id: user.id, + name: user.name, + email: user.email + }, + site: { + url: process.env.NEXT_PUBLIC_WP_URL, + adminUrl: `${process.env.NEXT_PUBLIC_WP_URL}/wp-admin`, + }, + }); + + console.log('User logged in:', user.name); + } catch (error) { + console.error('Error connecting to WordPress:', error); + alert('Error: Make sure wp-env is running (npx wp-env start)'); + } + }; + + const handleLogout = () => { + toolbar.setWordPressContext({ + user: null, + post: null, + site: null, + }); + toolbar.setState({ preview: false }); + setPosts([]); + console.log('User logged out'); + }; + + const handleFetchPosts = async () => { + try { + const wpPosts = await getPosts(); + console.log('Fetched posts:', wpPosts); + + if (wpPosts.length > 0) { + setPosts(wpPosts); + } + } catch (error) { + console.error('Error fetching posts:', error); + alert('Error fetching posts. Make sure wp-env is running.'); + } + }; + + const loadPost = (post: any) => { + toolbar.setWordPressContext({ + post: { + id: post.id, + title: post.title.rendered, + type: post.type, + status: post.status, + slug: post.slug, + }, + }); + console.log('Post loaded:', post.title.rendered); + }; + + return ( +
    +

    Headless WordPress Toolbar Demo

    +

    A framework-agnostic toolbar for headless WordPress sites

    + +
    +

    Demo Controls

    + + + +
    + {posts.length > 0 && ( + <> +

    WordPress Posts:

    + {posts.map((post) => ( + + ))} + + )} +
    +
    + +
    +

    Current State

    +
    {JSON.stringify(state, null, 2)}
    +
    + +
    +

    Try This

    +
      +
    1. Click "Login" to authenticate with WordPress
    2. +
    3. Click "Fetch Posts" to load posts from WordPress
    4. +
    5. Click a post to view toolbar controls
    6. +
    7. Check the state below to see how it updates
    8. +
    +
    +
    + ); +} diff --git a/examples/next/toolbar-demo/example-app/dev.sh b/examples/next/toolbar-demo/example-app/dev.sh new file mode 100755 index 00000000..18eb7ec6 --- /dev/null +++ b/examples/next/toolbar-demo/example-app/dev.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -a +source .env +set +a +next dev --port "$PORT" diff --git a/examples/next/toolbar-demo/example-app/lib/toolbar.ts b/examples/next/toolbar-demo/example-app/lib/toolbar.ts new file mode 100644 index 00000000..c5dbce46 --- /dev/null +++ b/examples/next/toolbar-demo/example-app/lib/toolbar.ts @@ -0,0 +1,16 @@ +import { Toolbar } from '@wpengine/hwp-toolbar'; + +// Singleton toolbar instance +// This ensures the same toolbar state is shared across the app +export const toolbar = new Toolbar({ + onPreviewChange: (enabled) => { + console.log('Preview mode:', enabled); + // In a real app, you'd integrate with Next.js draft mode here + // router.push(`/api/preview?enabled=${enabled}`); + }, +}); + +// Register custom nodes +toolbar.register('home', 'Home', () => { + window.location.href = '/'; +}); diff --git a/examples/next/toolbar-demo/example-app/lib/wordpress.ts b/examples/next/toolbar-demo/example-app/lib/wordpress.ts new file mode 100644 index 00000000..af35bfff --- /dev/null +++ b/examples/next/toolbar-demo/example-app/lib/wordpress.ts @@ -0,0 +1,42 @@ +export const WP_API_URL = process.env.NEXT_PUBLIC_WP_URL; + +export async function fetchFromWordPress(endpoint: string, options?: RequestInit) { + try { + const response = await fetch(`${WP_API_URL}/wp-json${endpoint}`, { + ...options, + // Note: credentials: 'include' doesn't work across different localhost ports + // For production, use Application Passwords or OAuth + }); + + if (!response.ok) { + if (response.status === 0 || !response.status) { + throw new Error('CORS error: Unable to connect to WordPress. Make sure WordPress is running and CORS is configured.'); + } + throw new Error(`WordPress API error: ${response.status} ${response.statusText}`); + } + + return response.json(); + } catch (error) { + if (error instanceof TypeError && error.message.includes('fetch')) { + throw new Error(`Cannot connect to WordPress at ${WP_API_URL}. Is wp-env running?`); + } + throw error; + } +} + +export async function getCurrentUser() { + // Fetch real user from WordPress REST API + // Using user ID 1 (default admin user in wp-env) + // In production, use /wp/v2/users/me with Application Passwords or OAuth + return fetchFromWordPress('/wp/v2/users/1'); +} + +export async function getPosts() { + // Public endpoint - works without authentication + return fetchFromWordPress('/wp/v2/posts?per_page=10'); +} + +export async function getPost(id: number) { + // Public endpoint - works without authentication + return fetchFromWordPress(`/wp/v2/posts/${id}`); +} diff --git a/examples/next/toolbar-demo/example-app/next-env.d.ts b/examples/next/toolbar-demo/example-app/next-env.d.ts new file mode 100644 index 00000000..830fb594 --- /dev/null +++ b/examples/next/toolbar-demo/example-app/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/examples/next/toolbar-demo/example-app/next.config.ts b/examples/next/toolbar-demo/example-app/next.config.ts new file mode 100644 index 00000000..b22af960 --- /dev/null +++ b/examples/next/toolbar-demo/example-app/next.config.ts @@ -0,0 +1,5 @@ +import type { NextConfig } from 'next'; + +const nextConfig: NextConfig = {}; + +export default nextConfig; diff --git a/examples/next/toolbar-demo/example-app/package.json b/examples/next/toolbar-demo/example-app/package.json new file mode 100644 index 00000000..d435beb0 --- /dev/null +++ b/examples/next/toolbar-demo/example-app/package.json @@ -0,0 +1,23 @@ +{ + "name": "toolbar-demo-app", + "version": "0.1.0", + "private": true, + "scripts": { + "predev": "node ../scripts/setup-env.js", + "dev": "bash dev.sh", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "@wpengine/hwp-toolbar": "workspace:*", + "next": "^15.4.7", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "typescript": "^5" + } +} diff --git a/examples/next/toolbar-demo/example-app/tsconfig.json b/examples/next/toolbar-demo/example-app/tsconfig.json new file mode 100644 index 00000000..d81d4ee1 --- /dev/null +++ b/examples/next/toolbar-demo/example-app/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": [ + "./*" + ] + }, + "target": "ES2017" + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/examples/next/toolbar-demo/package.json b/examples/next/toolbar-demo/package.json new file mode 100644 index 00000000..59b3c358 --- /dev/null +++ b/examples/next/toolbar-demo/package.json @@ -0,0 +1,29 @@ +{ + "name": "hwptoolkit-example-nextjs-toolbar-demo", + "version": "1.0.0", + "description": "React hooks toolbar demo with Next.js App Router", + "private": true, + "scripts": { + "example:dev": "npm --prefix ./example-app run dev", + "example:build": "npm --prefix ./example-app run build", + "example:start": "node scripts/setup-env.js && concurrently \"npm run wp:start\" \"npm run example:dev\"", + "example:stop": "npm run wp:stop", + "wp:start": "npm install && wp-env start", + "wp:stop": "wp-env stop", + "wp:destroy": "wp-env destroy" + }, + "keywords": [ + "headless", + "wordpress", + "nextjs", + "toolbar", + "react-hooks", + "wpgraphql" + ], + "author": "WP Engine", + "license": "BSD-3-Clause", + "dependencies": { + "@wordpress/env": "^10.31.0", + "concurrently": "^8.2.2" + } +} diff --git a/examples/next/toolbar-demo/scripts/setup-env.js b/examples/next/toolbar-demo/scripts/setup-env.js new file mode 100755 index 00000000..99bb6b46 --- /dev/null +++ b/examples/next/toolbar-demo/scripts/setup-env.js @@ -0,0 +1,71 @@ +#!/usr/bin/env node + +/** + * Generate .env file with calculated ports for this example + */ + +const { getPorts } = require('../../../../scripts/get-ports.js'); +const fs = require('fs'); +const path = require('path'); + +const examplePath = 'next/toolbar-demo'; +const ports = getPorts(examplePath); + +// Create .env file for Next.js +const envContent = `# Auto-generated by setup-env.js - DO NOT EDIT MANUALLY +PORT=${ports.FRONTEND_PORT} +NEXT_PUBLIC_WP_URL=http://localhost:${ports.WP_PORT} +WP_PORT=${ports.WP_PORT} +WP_TEST_PORT=${ports.WP_TEST_PORT} +`; + +const envPath = path.join(__dirname, '../example-app/.env'); +fs.writeFileSync(envPath, envContent); + +console.log(`✓ Generated .env for ${examplePath}`); +console.log(` Frontend: ${ports.FRONTEND_PORT}`); +console.log(` WordPress: ${ports.WP_PORT}`); +console.log(` WP Test: ${ports.WP_TEST_PORT}`); + +// Update .wp-env.json +const wpEnvConfig = { + phpVersion: '8.0', + plugins: [ + 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip' + ], + config: { + WP_DEBUG: true, + WP_DEBUG_LOG: true, + GRAPHQL_DEBUG: true + }, + port: ports.WP_PORT, + testsPort: ports.WP_TEST_PORT, + mappings: { + db: './wp-env/db', + 'wp-content/mu-plugins': './mu-plugin.php', + '.htaccess': './.htaccess' + }, + lifecycleScripts: { + afterStart: 'wp-env run cli -- wp rewrite structure \'/%postname%/\' --hard && wp-env run cli -- wp theme activate twentytwentyfour' + } +}; + +const wpEnvPath = path.join(__dirname, '../.wp-env.json'); +fs.writeFileSync(wpEnvPath, JSON.stringify(wpEnvConfig, null, 2) + '\n'); + +console.log(`✓ Updated .wp-env.json`); + +// Generate mu-plugin.php from template +const muPluginTemplatePath = path.join(__dirname, '../../../../scripts/templates/mu-plugin.php'); +const muPluginTemplate = fs.readFileSync(muPluginTemplatePath, 'utf8'); +const muPluginContent = muPluginTemplate.replace(/{{FRONTEND_PORT}}/g, ports.FRONTEND_PORT); + +const muPluginPath = path.join(__dirname, '../mu-plugin.php'); +fs.writeFileSync(muPluginPath, muPluginContent); +console.log(`✓ Generated mu-plugin.php`); + +// Copy .htaccess from template +const htaccessTemplatePath = path.join(__dirname, '../../../../scripts/templates/.htaccess'); +const htaccessPath = path.join(__dirname, '../.htaccess'); +fs.copyFileSync(htaccessTemplatePath, htaccessPath); +console.log(`✓ Generated .htaccess`); From cd31d75ecee13238f3ebf7c3ab66250665b467b8 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 08:03:59 -0400 Subject: [PATCH 08/44] feat(toolbar): Add configurable positioning and theming Enhance toolbar with configurable options and example improvements: Toolbar Package: - Add position config (top/bottom) with CSS positioning - Add theme config with custom CSS variables and className - Add getConfig/setConfig methods for runtime updates - Improve CSS with position-aware dropdown menus Vanilla Example: - Use hash-based port calculation from setup-env.js - Load ports from generated .env file in Vite config - Update scripts to use template-based configuration - Add pnpm workspace configuration - Remove hardcoded mu-plugin.php (now generated) --- examples/vanilla/toolbar-demo/.wp-env.json | 8 +- examples/vanilla/toolbar-demo/README.md | 18 +- .../toolbar-demo/example-app/package.json | 1 + .../toolbar-demo/example-app/src/main.js | 2 +- .../toolbar-demo/example-app/vite.config.js | 14 +- examples/vanilla/toolbar-demo/mu-plugin.php | 22 - examples/vanilla/toolbar-demo/package.json | 5 +- packages/toolbar/src/index.ts | 19 +- packages/toolbar/src/toolbar.css | 54 +- pnpm-lock.yaml | 5329 ++++++++++++++++- pnpm-workspace.yaml | 2 + 11 files changed, 5192 insertions(+), 282 deletions(-) delete mode 100644 examples/vanilla/toolbar-demo/mu-plugin.php diff --git a/examples/vanilla/toolbar-demo/.wp-env.json b/examples/vanilla/toolbar-demo/.wp-env.json index da814188..cfc9242d 100644 --- a/examples/vanilla/toolbar-demo/.wp-env.json +++ b/examples/vanilla/toolbar-demo/.wp-env.json @@ -8,12 +8,14 @@ "WP_DEBUG_LOG": true, "GRAPHQL_DEBUG": true }, - "port": 8888, + "port": 8644, + "testsPort": 8645, "mappings": { "db": "./wp-env/db", - "wp-content/mu-plugins": "./mu-plugin.php" + "wp-content/mu-plugins": "./mu-plugin.php", + ".htaccess": "./.htaccess" }, "lifecycleScripts": { - "afterStart": "wp-env run cli -- wp rewrite structure '/%postname%/' && wp-env run cli -- wp rewrite flush" + "afterStart": "wp-env run cli -- wp rewrite structure '/%postname%/' --hard && wp-env run cli -- wp theme activate twentytwentyfour" } } diff --git a/examples/vanilla/toolbar-demo/README.md b/examples/vanilla/toolbar-demo/README.md index 48067597..6cddd01d 100644 --- a/examples/vanilla/toolbar-demo/README.md +++ b/examples/vanilla/toolbar-demo/README.md @@ -35,9 +35,9 @@ npm run example:start The example will be available at: - **Frontend**: http://localhost:3000 -- **WordPress**: http://localhost:8888 -- **WordPress Admin**: http://localhost:8888/wp-admin (`admin` / `password`) -- **GraphQL**: http://localhost:8888/?graphql +- **WordPress**: http://localhost:8000 +- **WordPress Admin**: http://localhost:8000/wp-admin (`admin` / `password`) +- **GraphQL**: http://localhost:8000/?graphql ## Project Structure @@ -80,7 +80,7 @@ The example fetches real data from WordPress: ```javascript // Fetch WordPress user via REST API -const response = await fetch('http://localhost:8888/?rest_route=/wp/v2/users/1'); +const response = await fetch('http://localhost:8000/?rest_route=/wp/v2/users/1'); const user = await response.json(); toolbar.setState({ @@ -90,8 +90,8 @@ toolbar.setState({ email: user.email }, site: { - url: 'http://localhost:8888', - adminUrl: 'http://localhost:8888/wp-admin' + url: 'http://localhost:8000', + adminUrl: 'http://localhost:8000/wp-admin' } }); ``` @@ -101,7 +101,7 @@ toolbar.setState({ Fetch posts using WPGraphQL: ```javascript -const response = await fetch('http://localhost:8888/?graphql', { +const response = await fetch('http://localhost:8000/?graphql', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ @@ -167,8 +167,8 @@ The wp-env configuration includes: - WordPress with WPGraphQL plugin - Admin credentials: `admin` / `password` -- GraphQL endpoint: `http://localhost:8888/?graphql` -- REST API endpoint: `http://localhost:8888/?rest_route=/wp/v2/...` +- GraphQL endpoint: `http://localhost:8000/?graphql` +- REST API endpoint: `http://localhost:8000/?rest_route=/wp/v2/...` - Pretty permalinks enabled - CORS headers enabled for localhost:3000 diff --git a/examples/vanilla/toolbar-demo/example-app/package.json b/examples/vanilla/toolbar-demo/example-app/package.json index cc5f9f92..dabfa650 100644 --- a/examples/vanilla/toolbar-demo/example-app/package.json +++ b/examples/vanilla/toolbar-demo/example-app/package.json @@ -4,6 +4,7 @@ "private": true, "type": "module", "scripts": { + "predev": "node ../scripts/setup-env.js", "dev": "vite", "build": "vite build", "preview": "vite preview" diff --git a/examples/vanilla/toolbar-demo/example-app/src/main.js b/examples/vanilla/toolbar-demo/example-app/src/main.js index 4a2385fd..33a1d103 100644 --- a/examples/vanilla/toolbar-demo/example-app/src/main.js +++ b/examples/vanilla/toolbar-demo/example-app/src/main.js @@ -2,7 +2,7 @@ import { Toolbar, VanillaRenderer } from '@wpengine/hwp-toolbar'; import '@wpengine/hwp-toolbar/styles'; import './style.css'; -const WP_URL = 'http://localhost:8888'; +const WP_URL = import.meta.env.VITE_WP_URL; // ============================================================================ // Initialize Toolbar diff --git a/examples/vanilla/toolbar-demo/example-app/vite.config.js b/examples/vanilla/toolbar-demo/example-app/vite.config.js index 704a512b..b8816b41 100644 --- a/examples/vanilla/toolbar-demo/example-app/vite.config.js +++ b/examples/vanilla/toolbar-demo/example-app/vite.config.js @@ -1,7 +1,11 @@ -import { defineConfig } from 'vite'; +import { defineConfig, loadEnv } from 'vite'; -export default defineConfig({ - server: { - port: 3000 - } +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd(), ''); + + return { + server: { + port: parseInt(env.VITE_FRONTEND_PORT) + } + }; }); diff --git a/examples/vanilla/toolbar-demo/mu-plugin.php b/examples/vanilla/toolbar-demo/mu-plugin.php deleted file mode 100644 index 3008ac37..00000000 --- a/examples/vanilla/toolbar-demo/mu-plugin.php +++ /dev/null @@ -1,22 +0,0 @@ - void; @@ -92,10 +93,23 @@ export class Toolbar { private config: ToolbarConfig; constructor(config: ToolbarConfig = {}) { - this.config = config; + this.config = { + position: 'bottom', + ...config + }; this.registerDefaultNodes(); } + getConfig(): ToolbarConfig { + return { ...this.config }; + } + + setConfig(updates: Partial): this { + this.config = { ...this.config, ...updates }; + this.notify(); + return this; + } + private registerDefaultNodes(): void { // Edit Post this.register('edit-post', () => { @@ -261,7 +275,8 @@ export class VanillaRenderer { private render(nodes: ToolbarNode[], state: ToolbarState): void { if (!this.element) return; this.element.innerHTML = ''; - this.element.className = 'hwp-toolbar'; + const position = this.config.position || 'bottom'; + this.element.className = `hwp-toolbar hwp-toolbar-${position}`; if (this.config.theme?.className) { this.element.classList.add(this.config.theme.className); } diff --git a/packages/toolbar/src/toolbar.css b/packages/toolbar/src/toolbar.css index 9aa0ed23..54d305b6 100644 --- a/packages/toolbar/src/toolbar.css +++ b/packages/toolbar/src/toolbar.css @@ -5,19 +5,22 @@ #hwp-toolbar, .hwp-toolbar { position: fixed; - bottom: 0; left: 0; right: 0; - background: #f5f5f5; - border-top: 1px solid #ccc; padding: 8px 12px; display: flex; align-items: center; justify-content: space-between; gap: 8px; z-index: 9999; - font-family: sans-serif; - font-size: 13px; +} + +.hwp-toolbar-bottom { + bottom: 0; +} + +.hwp-toolbar-top { + top: 0; } .hwp-toolbar-section { @@ -41,27 +44,15 @@ .hwp-toolbar-button { padding: 4px 8px; - background: white; - border: 1px solid #999; - cursor: pointer; - font-size: 13px; - font-family: inherit; -} - -.hwp-toolbar-button-active { - background: #ddd; } .hwp-toolbar-link { padding: 4px 8px; - text-decoration: none; - color: #0066cc; } .hwp-toolbar-divider { width: 1px; height: 20px; - background: #ccc; } .hwp-toolbar-dropdown { @@ -70,38 +61,29 @@ .hwp-toolbar-dropdown-trigger { padding: 4px 8px; - background: white; - border: 1px solid #999; - cursor: pointer; - font-size: 13px; - font-family: inherit; } .hwp-toolbar-dropdown-menu { position: absolute; - bottom: 100%; left: 0; - background: white; - border: 1px solid #999; - margin-bottom: 4px; min-width: 150px; } +.hwp-toolbar-bottom .hwp-toolbar-dropdown-menu { + bottom: 100%; + margin-bottom: 4px; +} + +.hwp-toolbar-top .hwp-toolbar-dropdown-menu { + top: 100%; + margin-top: 4px; +} + .hwp-toolbar-dropdown-item { display: block; width: 100%; padding: 6px 12px; - background: white; - border: none; - border-bottom: 1px solid #eee; text-align: left; - cursor: pointer; - font-size: 13px; - font-family: inherit; -} - -.hwp-toolbar-dropdown-item:last-child { - border-bottom: none; } .hwp-toolbar-branding { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d009c903..2b4df750 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,7 @@ importers: version: 0.5.1 '@changesets/cli': specifier: ^2.29.7 - version: 2.29.7(@types/node@24.5.2) + version: 2.29.7(@types/node@22.15.17) '@playwright/test': specifier: ^1.55.0 version: 1.55.0 @@ -29,17 +29,480 @@ importers: version: 1.31.0(@playwright/test@1.55.0) '@wordpress/env': specifier: ^10.31.0 - version: 10.31.0(@types/node@24.5.2) + version: 10.31.0(@types/node@22.15.17) '@wordpress/jest-console': specifier: ^8.31.0 - version: 8.31.0(jest@29.7.0(@types/node@24.5.2)) + version: 8.31.0(jest@29.7.0(@types/node@22.15.17)) '@wordpress/scripts': specifier: 30.24.0 - version: 30.24.0(@playwright/test@1.55.0)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.31.0(@types/node@24.5.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3) + version: 30.24.0(@playwright/test@1.55.0)(@types/eslint@9.6.1)(@types/node@22.15.17)(@types/webpack@4.41.40)(@wordpress/env@10.31.0(@types/node@22.15.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3) rimraf: specifier: ^5.0.5 version: 5.0.10 + examples/next/apollo-authentication/example-app: + dependencies: + '@apollo/client': + specifier: 3.13.1 + version: 3.13.1(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.10.0)(ws@8.18.3))(graphql@16.10.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + graphql: + specifier: 16.10.0 + version: 16.10.0 + lucide-react: + specifier: ^0.477.0 + version: 0.477.0(react@19.2.0) + next: + specifier: ^15.2.4 + version: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + tailwind-merge: + specifier: ^3.0.2 + version: 3.3.1 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@4.1.14) + devDependencies: + '@babel/helpers': + specifier: ^7.27.0 + version: 7.28.4 + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@graphql-codegen/cli': + specifier: ^5.0.5 + version: 5.0.7(@parcel/watcher@2.5.1)(@types/node@24.5.2)(enquirer@2.4.1)(graphql@16.10.0)(typescript@5.8.3) + '@graphql-codegen/fragment-matcher': + specifier: ^5.1.0 + version: 5.1.0(graphql@16.10.0) + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + dotenv: + specifier: 16.4.7 + version: 16.4.7 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.0 + version: 15.2.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + + examples/next/apollo-client-data-fetch/example-app: + dependencies: + '@apollo/client': + specifier: ^3.13.1 + version: 3.14.0(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + crypto-hash: + specifier: ^3.1.0 + version: 3.1.0 + debounce: + specifier: ^2.2.0 + version: 2.2.0 + graphql: + specifier: ^16.10.0 + version: 16.11.0 + next: + specifier: ^15.5.2 + version: 15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.0 + version: 15.2.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + + examples/next/apollo-client-filesystem-routing/example-app: + dependencies: + '@apollo/client': + specifier: ^3.13.4 + version: 3.14.0(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + graphql: + specifier: ^16.10.0 + version: 16.11.0 + next: + specifier: ^15.4.5 + version: 15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.3 + version: 15.2.3(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + + examples/next/client-app-router-fetch-data/example-app: + dependencies: + next: + specifier: ^15.4.7 + version: 15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + prettier: + specifier: ^3.5.3 + version: 3.6.2 + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.1 + version: 15.2.1(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + + examples/next/client-multisite-app-router-fetch-data/example-app: + dependencies: + next: + specifier: ^15.5.2 + version: 15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + prettier: + specifier: ^3.5.3 + version: 3.6.2 + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.4 + version: 15.2.4(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + + examples/next/custom-sitemap-apollo/example-app: + dependencies: + '@apollo/client': + specifier: ^3.13.5 + version: 3.14.0(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: + specifier: ^15.5.2 + version: 15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.4 + version: 15.2.4(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + + examples/next/custom-sitemap-vanilla-wpgraphql/example-app: + dependencies: + '@apollo/client': + specifier: ^3.13.5 + version: 3.14.0(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: + specifier: 15.4.7 + version: 15.4.7(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.4 + version: 15.2.4(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + + examples/next/hybrid-sitemap-apollo/example-app: + dependencies: + '@apollo/client': + specifier: ^3.13.5 + version: 3.14.0(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fast-xml-parser: + specifier: ^5.1.0 + version: 5.3.0 + graphql: + specifier: ^16.10.0 + version: 16.11.0 + next: + specifier: ^15.5.2 + version: 15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.4 + version: 15.2.4(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + + examples/next/proxied-graphql-debug/example-app: + dependencies: + '@apollo/client': + specifier: ^3.13.8 + version: 3.14.0(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + chalk: + specifier: ^5.4.1 + version: 5.4.1 + graphql: + specifier: ^16.11.0 + version: 16.11.0 + http-proxy-middleware: + specifier: 3.0.5 + version: 3.0.5 + next: + specifier: 15.4.7 + version: 15.4.7(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + next-http-proxy-middleware: + specifier: ^1.2.7 + version: 1.2.7 + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + '@types/node': + specifier: 22.15.17 + version: 22.15.17 + '@types/react': + specifier: 19.1.3 + version: 19.1.3 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.3.2 + version: 15.3.2(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + typescript: + specifier: 5.8.3 + version: 5.8.3 + + examples/next/proxied-sitemap-apollo/example-app: + dependencies: + '@apollo/client': + specifier: ^3.13.5 + version: 3.14.0(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fast-xml-parser: + specifier: ^5.1.0 + version: 5.3.0 + graphql: + specifier: ^16.10.0 + version: 16.11.0 + next: + specifier: ^15.5.2 + version: 15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.14 + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.4 + version: 15.2.4(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + tailwindcss: + specifier: ^4 + version: 4.1.14 + + examples/next/template-hierarchy/example-app: + dependencies: + next: + specifier: ^15.3.4 + version: 15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + urql: + specifier: ^4.2.2 + version: 4.2.2(@urql/core@5.2.0(graphql@16.11.0))(react@19.2.0) + + examples/next/toolbar-demo/example-app: + dependencies: + '@wpengine/hwp-toolbar': + specifier: workspace:* + version: link:../../../../packages/toolbar + next: + specifier: ^15.4.7 + version: 15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + '@types/node': + specifier: ^20 + version: 20.19.19 + '@types/react': + specifier: ^19 + version: 19.1.3 + '@types/react-dom': + specifier: ^19 + version: 19.2.1(@types/react@19.1.3) + typescript: + specifier: ^5 + version: 5.8.3 + + examples/next/wp-theme-rendered-blocks/example-app: + dependencies: + '@wordpress/base-styles': + specifier: ^5.21.0 + version: 5.23.0 + next: + specifier: 15.4.7 + version: 15.4.7(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1) + prettier: + specifier: ^3.5.3 + version: 3.6.2 + react: + specifier: ^19.0.0 + version: 19.2.0 + react-dom: + specifier: ^19.0.0 + version: 19.2.0(react@19.2.0) + devDependencies: + eslint: + specifier: ^9 + version: 9.37.0(jiti@2.6.1) + eslint-config-next: + specifier: 15.2.3 + version: 15.2.3(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + + examples/vanilla/toolbar-demo/example-app: + dependencies: + '@wpengine/hwp-toolbar': + specifier: file:../../../../packages/toolbar + version: file:packages/toolbar(react@19.2.0) + devDependencies: + vite: + specifier: ^6.0.11 + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.0) + packages/cli: dependencies: chalk: @@ -86,7 +549,7 @@ importers: version: 8.26.0(jest@29.7.0(@types/node@24.5.2)) '@wordpress/scripts': specifier: ^30.24.0 - version: 30.24.0(@playwright/test@1.53.2)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.26.0(@types/node@24.5.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3) + version: 30.24.0(@playwright/test@1.53.2)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.26.0(@types/node@24.5.2))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3) plugins/wpgraphql-logging: devDependencies: @@ -104,7 +567,7 @@ importers: version: 8.26.0(jest@29.7.0(@types/node@24.5.2)) '@wordpress/scripts': specifier: ^30.24.0 - version: 30.24.0(@playwright/test@1.53.2)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.26.0(@types/node@24.5.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3) + version: 30.24.0(@playwright/test@1.53.2)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.26.0(@types/node@24.5.2))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3) plugins/wpgraphql-webhooks: devDependencies: @@ -122,14 +585,68 @@ importers: version: 8.26.0(jest@29.7.0(@types/node@24.5.2)) '@wordpress/scripts': specifier: ^30.24.0 - version: 30.24.0(@playwright/test@1.53.2)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.26.0(@types/node@24.5.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3) + version: 30.24.0(@playwright/test@1.53.2)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.26.0(@types/node@24.5.2))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3) packages: + '@0no-co/graphql.web@1.2.0': + resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@apollo/client@3.13.1': + resolution: {integrity: sha512-HaAt62h3jNUXpJ1v5HNgUiCzPP1c5zc2Q/FeTb2cTk/v09YlhoqKKHQFJI7St50VCJ5q8JVIc03I5bRcBrQxsg==} + peerDependencies: + graphql: ^15.0.0 || ^16.0.0 + graphql-ws: ^5.5.5 || ^6.0.3 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc + subscriptions-transport-ws: ^0.9.0 || ^0.11.0 + peerDependenciesMeta: + graphql-ws: + optional: true + react: + optional: true + react-dom: + optional: true + subscriptions-transport-ws: + optional: true + + '@apollo/client@3.14.0': + resolution: {integrity: sha512-0YQKKRIxiMlIou+SekQqdCo0ZTHxOcES+K8vKB53cIDpwABNR0P0yRzPgsbgcj3zRJniD93S/ontsnZsCLZrxQ==} + peerDependencies: + graphql: ^15.0.0 || ^16.0.0 + graphql-ws: ^5.5.5 || ^6.0.3 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc + subscriptions-transport-ws: ^0.9.0 || ^0.11.0 + peerDependenciesMeta: + graphql-ws: + optional: true + react: + optional: true + react-dom: + optional: true + subscriptions-transport-ws: + optional: true + + '@ardatan/relay-compiler@12.0.3': + resolution: {integrity: sha512-mBDFOGvAoVlWaWqs3hm1AciGHSQE1rqFc/liZTyYz/Oek9yZdT5H26pH2zAFuEiTiBVPPyMuqf5VjOFPI2DGsQ==} + hasBin: true + peerDependencies: + graphql: '*' + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -142,6 +659,10 @@ packages: resolution: {integrity: sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==} engines: {node: '>=6.9.0'} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.25.7': resolution: {integrity: sha512-B+BO9x86VYsQHimucBAL1fxTJKF4wyKY6ZVzee9QgzdZOUfs3BaR6AQrgoGrRI+7IFS1wUz/VyQ+SoBcSpdPbw==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -909,10 +1430,187 @@ packages: '@dual-bundle/import-meta-resolve@4.2.1': resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@envelop/core@5.3.2': + resolution: {integrity: sha512-06Mu7fmyKzk09P2i2kHpGfItqLLgCq7uO5/nX4fc/iHMplWPNuAx4iYR+WXUQoFHDnP6EUbceQNQ5iyeMz9f3g==} + engines: {node: '>=18.0.0'} + + '@envelop/instrumentation@1.0.0': + resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} + engines: {node: '>=18.0.0'} + + '@envelop/types@5.2.1': + resolution: {integrity: sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==} + engines: {node: '>=18.0.0'} + '@es-joy/jsdoccomment@0.41.0': resolution: {integrity: sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==} engines: {node: '>=16'} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -923,14 +1621,45 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.0': + resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.37.0': + resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@fastify/busboy@3.2.0': + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + '@formatjs/ecma402-abstract@2.3.4': resolution: {integrity: sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==} @@ -946,65 +1675,451 @@ packages: '@formatjs/intl-localematcher@0.6.1': resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} - '@hapi/address@5.1.1': - resolution: {integrity: sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==} - engines: {node: '>=14.0.0'} + '@graphql-codegen/add@5.0.3': + resolution: {integrity: sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@hapi/formula@3.0.2': - resolution: {integrity: sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==} + '@graphql-codegen/cli@5.0.7': + resolution: {integrity: sha512-h/sxYvSaWtxZxo8GtaA8SvcHTyViaaPd7dweF/hmRDpaQU1o3iU3EZxlcJ+oLTunU0tSMFsnrIXm/mhXxI11Cw==} + engines: {node: '>=16'} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.1.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + '@parcel/watcher': + optional: true - '@hapi/hoek@11.0.7': - resolution: {integrity: sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==} + '@graphql-codegen/client-preset@4.8.3': + resolution: {integrity: sha512-QpEsPSO9fnRxA6Z66AmBuGcwHjZ6dYSxYo5ycMlYgSPzAbyG8gn/kWljofjJfWqSY+T/lRn+r8IXTH14ml24vQ==} + engines: {node: '>=16'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql-sock: ^1.0.0 + peerDependenciesMeta: + graphql-sock: + optional: true - '@hapi/pinpoint@2.0.1': - resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} + '@graphql-codegen/core@4.0.2': + resolution: {integrity: sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@hapi/tlds@1.1.3': - resolution: {integrity: sha512-QIvUMB5VZ8HMLZF9A2oWr3AFM430QC8oGd0L35y2jHpuW6bIIca6x/xL7zUf4J7L9WJ3qjz+iJII8ncaeMbpSg==} - engines: {node: '>=14.0.0'} + '@graphql-codegen/fragment-matcher@5.1.0': + resolution: {integrity: sha512-84x8lhvsmz4KIrmwq0WTf8Fz0BQjYDxZgdj5jzIhoI0ehX6v6Fm1Gfd+mTZcVC4gSB4NgJAPK/rBFq+BYjJj/A==} + engines: {node: '>=16'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@hapi/topo@6.0.2': - resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} + '@graphql-codegen/gql-tag-operations@4.0.17': + resolution: {integrity: sha512-2pnvPdIG6W9OuxkrEZ6hvZd142+O3B13lvhrZ48yyEBh2ujtmKokw0eTwDHtlXUqjVS0I3q7+HB2y12G/m69CA==} + engines: {node: '>=16'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@graphql-codegen/plugin-helpers@5.1.1': + resolution: {integrity: sha512-28GHODK2HY1NhdyRcPP3sCz0Kqxyfiz7boIZ8qIxFYmpLYnlDgiYok5fhFLVSZihyOpCs4Fa37gVHf/Q4I2FEg==} + engines: {node: '>=16'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + '@graphql-codegen/schema-ast@4.1.0': + resolution: {integrity: sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@graphql-codegen/typed-document-node@5.1.2': + resolution: {integrity: sha512-jaxfViDqFRbNQmfKwUY8hDyjnLTw2Z7DhGutxoOiiAI0gE/LfPe0LYaVFKVmVOOD7M3bWxoWfu4slrkbWbUbEw==} + engines: {node: '>=16'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@inquirer/checkbox@4.1.9': - resolution: {integrity: sha512-DBJBkzI5Wx4jFaYm221LHvAhpKYkhVS0k9plqHwaHhofGNxvYB7J3Bz8w+bFJ05zaMb0sZNHo4KdmENQFlNTuQ==} - engines: {node: '>=18'} + '@graphql-codegen/typescript-operations@4.6.1': + resolution: {integrity: sha512-k92laxhih7s0WZ8j5WMIbgKwhe64C0As6x+PdcvgZFMudDJ7rPJ/hFqJ9DCRxNjXoHmSjnr6VUuQZq4lT1RzCA==} + engines: {node: '>=16'} peerDependencies: - '@types/node': '>=18' + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql-sock: ^1.0.0 peerDependenciesMeta: - '@types/node': + graphql-sock: optional: true - '@inquirer/confirm@5.1.13': - resolution: {integrity: sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==} - engines: {node: '>=18'} + '@graphql-codegen/typescript@4.1.6': + resolution: {integrity: sha512-vpw3sfwf9A7S+kIUjyFxuvrywGxd4lmwmyYnnDVjVE4kSQ6Td3DpqaPTy8aNQ6O96vFoi/bxbZS2BW49PwSUUA==} + engines: {node: '>=16'} peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@inquirer/core@10.1.14': - resolution: {integrity: sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==} - engines: {node: '>=18'} + '@graphql-codegen/visitor-plugin-common@5.8.0': + resolution: {integrity: sha512-lC1E1Kmuzi3WZUlYlqB4fP6+CvbKH9J+haU1iWmgsBx5/sO2ROeXJG4Dmt8gP03bI2BwjiwV5WxCEMlyeuzLnA==} + engines: {node: '>=16'} peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + '@graphql-hive/signal@1.0.0': + resolution: {integrity: sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag==} + engines: {node: '>=18.0.0'} + + '@graphql-tools/apollo-engine-loader@8.0.22': + resolution: {integrity: sha512-ssD2wNxeOTRcUEkuGcp0KfZAGstL9YLTe/y3erTDZtOs2wL1TJESw8NVAp+3oUHPeHKBZQB4Z6RFEbPgMdT2wA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/batch-execute@9.0.19': + resolution: {integrity: sha512-VGamgY4PLzSx48IHPoblRw0oTaBa7S26RpZXt0Y4NN90ytoE0LutlpB2484RbkfcTjv9wa64QD474+YP1kEgGA==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/code-file-loader@8.1.22': + resolution: {integrity: sha512-FSka29kqFkfFmw36CwoQ+4iyhchxfEzPbXOi37lCEjWLHudGaPkXc3RyB9LdmBxx3g3GHEu43a5n5W8gfcrMdA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/delegate@10.2.23': + resolution: {integrity: sha512-xrPtl7f1LxS+B6o+W7ueuQh67CwRkfl+UKJncaslnqYdkxKmNBB4wnzVcW8ZsRdwbsla/v43PtwAvSlzxCzq2w==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/documents@1.0.1': + resolution: {integrity: sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-common@0.0.4': + resolution: {integrity: sha512-SEH/OWR+sHbknqZyROCFHcRrbZeUAyjCsgpVWCRjqjqRbiJiXq6TxNIIOmpXgkrXWW/2Ev4Wms6YSGJXjdCs6Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-common@0.0.6': + resolution: {integrity: sha512-JAH/R1zf77CSkpYATIJw+eOJwsbWocdDjY+avY7G+P5HCXxwQjAjWVkJI1QJBQYjPQDVxwf1fmTZlIN3VOadow==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-graphql-ws@2.0.7': + resolution: {integrity: sha512-J27za7sKF6RjhmvSOwOQFeNhNHyP4f4niqPnerJmq73OtLx9Y2PGOhkXOEB0PjhvPJceuttkD2O1yMgEkTGs3Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-http@1.3.3': + resolution: {integrity: sha512-LIy+l08/Ivl8f8sMiHW2ebyck59JzyzO/yF9SFS4NH6MJZUezA1xThUXCDIKhHiD56h/gPojbkpcFvM2CbNE7A==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor-legacy-ws@1.1.19': + resolution: {integrity: sha512-bEbv/SlEdhWQD0WZLUX1kOenEdVZk1yYtilrAWjRUgfHRZoEkY9s+oiqOxnth3z68wC2MWYx7ykkS5hhDamixg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/executor@1.4.9': + resolution: {integrity: sha512-SAUlDT70JAvXeqV87gGzvDzUGofn39nvaVcVhNf12Dt+GfWHtNNO/RCn/Ea4VJaSLGzraUd41ObnN3i80EBU7w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/git-loader@8.0.26': + resolution: {integrity: sha512-0g+9eng8DaT4ZmZvUmPgjLTgesUa6M8xrDjNBltRldZkB055rOeUgJiKmL6u8PjzI5VxkkVsn0wtAHXhDI2UXQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/github-loader@8.0.22': + resolution: {integrity: sha512-uQ4JNcNPsyMkTIgzeSbsoT9hogLjYrZooLUYd173l5eUGUi49EAcsGdiBCKaKfEjanv410FE8hjaHr7fjSRkJw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/graphql-file-loader@8.1.2': + resolution: {integrity: sha512-VB6ttpwkqCu0KsA1/Wmev4qsu05Qfw49kgVSKkPjuyDQfVaqtr9ewEQRkX5CqnqHGEeLl6sOlNGEMM5fCVMWGQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/graphql-tag-pluck@8.3.21': + resolution: {integrity: sha512-TJhELNvR1tmghXMi6HVKp/Swxbx1rcSp/zdkuJZT0DCM3vOY11FXY6NW3aoxumcuYDNN3jqXcCPKstYGFPi5GQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/import@7.1.2': + resolution: {integrity: sha512-+tlNQbLEqAA4LdWoLwM1tckx95lo8WIKd8vhj99b9rLwN/KfLwHWzdS3jnUFK7+99vmHmN1oE5v5zmqJz0MTKw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/json-file-loader@8.0.20': + resolution: {integrity: sha512-5v6W+ZLBBML5SgntuBDLsYoqUvwfNboAwL6BwPHi3z/hH1f8BS9/0+MCW9OGY712g7E4pc3y9KqS67mWF753eA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/load@8.1.2': + resolution: {integrity: sha512-WhDPv25/jRND+0uripofMX0IEwo6mrv+tJg6HifRmDu8USCD7nZhufT0PP7lIcuutqjIQFyogqT70BQsy6wOgw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/merge@9.1.1': + resolution: {integrity: sha512-BJ5/7Y7GOhTuvzzO5tSBFL4NGr7PVqTJY3KeIDlVTT8YLcTXtBR+hlrC3uyEym7Ragn+zyWdHeJ9ev+nRX1X2w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/optimize@2.0.0': + resolution: {integrity: sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/prisma-loader@8.0.17': + resolution: {integrity: sha512-fnuTLeQhqRbA156pAyzJYN0KxCjKYRU5bz1q/SKOwElSnAU4k7/G1kyVsWLh7fneY78LoMNH5n+KlFV8iQlnyg==} + engines: {node: '>=16.0.0'} + deprecated: 'This package was intended to be used with an older versions of Prisma.\nThe newer versions of Prisma has a different approach to GraphQL integration.\nTherefore, this package is no longer needed and has been deprecated and removed.\nLearn more: https://www.prisma.io/graphql' + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/relay-operation-optimizer@7.0.21': + resolution: {integrity: sha512-vMdU0+XfeBh9RCwPqRsr3A05hPA3MsahFn/7OAwXzMySA5EVnSH5R4poWNs3h1a0yT0tDPLhxORhK7qJdSWj2A==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/schema@10.0.25': + resolution: {integrity: sha512-/PqE8US8kdQ7lB9M5+jlW8AyVjRGCKU7TSktuW3WNKSKmDO0MK1wakvb5gGdyT49MjAIb4a3LWxIpwo5VygZuw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/url-loader@8.0.33': + resolution: {integrity: sha512-Fu626qcNHcqAj8uYd7QRarcJn5XZ863kmxsg1sm0fyjyfBJnsvC7ddFt6Hayz5kxVKfsnjxiDfPMXanvsQVBKw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/utils@10.9.1': + resolution: {integrity: sha512-B1wwkXk9UvU7LCBkPs8513WxOQ2H8Fo5p8HR1+Id9WmYE5+bd51vqN+MbrqvWczHCH2gwkREgHJN88tE0n1FCw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/wrap@10.1.4': + resolution: {integrity: sha512-7pyNKqXProRjlSdqOtrbnFRMQAVamCmEREilOXtZujxY6kYit3tvWWSjUrcIOheltTffoRh7EQSjpy2JDCzasg==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@hapi/address@5.1.1': + resolution: {integrity: sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==} + engines: {node: '>=14.0.0'} + + '@hapi/formula@3.0.2': + resolution: {integrity: sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==} + + '@hapi/hoek@11.0.7': + resolution: {integrity: sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==} + + '@hapi/pinpoint@2.0.1': + resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} + + '@hapi/tlds@1.1.3': + resolution: {integrity: sha512-QIvUMB5VZ8HMLZF9A2oWr3AFM430QC8oGd0L35y2jHpuW6bIIca6x/xL7zUf4J7L9WJ3qjz+iJII8ncaeMbpSg==} + engines: {node: '>=14.0.0'} + + '@hapi/topo@6.0.2': + resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@inquirer/checkbox@4.1.9': + resolution: {integrity: sha512-DBJBkzI5Wx4jFaYm221LHvAhpKYkhVS0k9plqHwaHhofGNxvYB7J3Bz8w+bFJ05zaMb0sZNHo4KdmENQFlNTuQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.13': + resolution: {integrity: sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.1.14': + resolution: {integrity: sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true '@inquirer/editor@4.2.14': resolution: {integrity: sha512-yd2qtLl4QIIax9DTMZ1ZN2pFrrj+yL3kgIWxm34SS6uwCr0sIhsNyudUjAo5q3TqI03xx4SEBkUJqZuAInp9uA==} @@ -1113,6 +2228,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -1190,6 +2309,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1261,6 +2383,126 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@next/env@15.4.7': + resolution: {integrity: sha512-PrBIpO8oljZGTOe9HH0miix1w5MUiGJ/q83Jge03mHEE0E3pyqzAy2+l5G6aJDbXoobmxPJTVhbCuwlLtjSHwg==} + + '@next/env@15.5.4': + resolution: {integrity: sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==} + + '@next/eslint-plugin-next@15.2.0': + resolution: {integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==} + + '@next/eslint-plugin-next@15.2.1': + resolution: {integrity: sha512-6ppeToFd02z38SllzWxayLxjjNfzvc7Wm07gQOKSLjyASvKcXjNStZrLXMHuaWkhjqxe+cnhb2uzfWXm1VEj/Q==} + + '@next/eslint-plugin-next@15.2.3': + resolution: {integrity: sha512-eNSOIMJtjs+dp4Ms1tB1PPPJUQHP3uZK+OQ7iFY9qXpGO6ojT6imCL+KcUOqE/GXGidWbBZJzYdgAdPHqeCEPA==} + + '@next/eslint-plugin-next@15.2.4': + resolution: {integrity: sha512-O8ScvKtnxkp8kL9TpJTTKnMqlkZnS+QxwoQnJwPGBxjBbzd6OVVPEJ5/pMNrktSyXQD/chEfzfFzYLM6JANOOQ==} + + '@next/eslint-plugin-next@15.3.2': + resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} + + '@next/swc-darwin-arm64@15.4.7': + resolution: {integrity: sha512-2Dkb+VUTp9kHHkSqtws4fDl2Oxms29HcZBwFIda1X7Ztudzy7M6XF9HDS2dq85TmdN47VpuhjE+i6wgnIboVzQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-arm64@15.5.4': + resolution: {integrity: sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.4.7': + resolution: {integrity: sha512-qaMnEozKdWezlmh1OGDVFueFv2z9lWTcLvt7e39QA3YOvZHNpN2rLs/IQLwZaUiw2jSvxW07LxMCWtOqsWFNQg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-darwin-x64@15.5.4': + resolution: {integrity: sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.4.7': + resolution: {integrity: sha512-ny7lODPE7a15Qms8LZiN9wjNWIeI+iAZOFDOnv2pcHStncUr7cr9lD5XF81mdhrBXLUP9yT9RzlmSWKIazWoDw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-gnu@15.5.4': + resolution: {integrity: sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.4.7': + resolution: {integrity: sha512-4SaCjlFR/2hGJqZLLWycccy1t+wBrE/vyJWnYaZJhUVHccpGLG5q0C+Xkw4iRzUIkE+/dr90MJRUym3s1+vO8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.5.4': + resolution: {integrity: sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.4.7': + resolution: {integrity: sha512-2uNXjxvONyRidg00VwvlTYDwC9EgCGNzPAPYbttIATZRxmOZ3hllk/YYESzHZb65eyZfBR5g9xgCZjRAl9YYGg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.5.4': + resolution: {integrity: sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.4.7': + resolution: {integrity: sha512-ceNbPjsFgLscYNGKSu4I6LYaadq2B8tcK116nVuInpHHdAWLWSwVK6CHNvCi0wVS9+TTArIFKJGsEyVD1H+4Kg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.5.4': + resolution: {integrity: sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.4.7': + resolution: {integrity: sha512-pZyxmY1iHlZJ04LUL7Css8bNvsYAMYOY9JRwFA3HZgpaNKsJSowD09Vg2R9734GxAcLJc2KDQHSCR91uD6/AAw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-arm64-msvc@15.5.4': + resolution: {integrity: sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.4.7': + resolution: {integrity: sha512-HjuwPJ7BeRzgl3KrjKqD2iDng0eQIpIReyhpF5r4yeAHFwWRuAhfW92rWv/r3qeQHEwHsLRzFDvMqRjyM5DI6A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.5.4': + resolution: {integrity: sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -1276,6 +2518,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + '@opentelemetry/api-logs@0.57.2': resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} engines: {node: '>=14'} @@ -1611,9 +2857,125 @@ packages: engines: {node: '>=18'} hasBin: true - '@rtsao/scc@1.1.0': + '@repeaterjs/repeater@3.0.6': + resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} + + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@rushstack/eslint-patch@1.13.0': + resolution: {integrity: sha512-2ih5qGw5SZJ+2fLZxP6Lr6Na2NTIgPRL/7Kmyuw0uIyBQnuhQ8fi8fzUTd38eIQmqp+GYLC00cI6WgtqHxBwmw==} + '@sentry/core@9.36.0': resolution: {integrity: sha512-LU6EmsXPxi8QFkrx0fCqhXicsJA6uUWCD0VrxePZzs+Xs0SgVNDxOgRELVrZa4LPomQJBR5wmm3Duozp9JkHcQ==} engines: {node: '>=18'} @@ -1745,10 +3107,107 @@ packages: resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} engines: {node: '>=14'} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} + '@tailwindcss/node@4.1.14': + resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==} + + '@tailwindcss/oxide-android-arm64@4.1.14': + resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.14': + resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.14': + resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.14': + resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.14': + resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.14': + resolution: {integrity: sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==} + + '@theguild/federation-composition@0.20.1': + resolution: {integrity: sha512-lwYYKCeHmstOtbMtzxC0BQKWsUPYbEVRVdJ3EqR4jSpcF4gvNf3MOJv6yuvq6QsKqgYZURKRBszmg7VEDoi5Aw==} + engines: {node: '>=18'} + peerDependencies: + graphql: ^16.0.0 + '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -1760,6 +3219,9 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1814,6 +3276,9 @@ packages: '@types/http-proxy@1.17.16': resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} + '@types/http-proxy@1.17.3': + resolution: {integrity: sha512-wIPqXANye5BbORbuh74exbwNzj+UWCwWyeEFJzUQ7Fq3W2NSAy+7x7nX1fgbEypr2/TdKqpeuxLnXWgzN533/Q==} + '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -1823,6 +3288,9 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} @@ -1850,8 +3318,11 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@24.0.12': - resolution: {integrity: sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g==} + '@types/node@20.19.19': + resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} + + '@types/node@22.15.17': + resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==} '@types/node@24.5.2': resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} @@ -1877,9 +3348,17 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react-dom@19.2.1': + resolution: {integrity: sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==} + peerDependencies: + '@types/react': ^19.2.0 + '@types/react@18.3.26': resolution: {integrity: sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==} + '@types/react@19.1.3': + resolution: {integrity: sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ==} + '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -2028,6 +3507,104 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + '@urql/core@5.2.0': + resolution: {integrity: sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -2098,10 +3675,30 @@ packages: webpack-dev-server: optional: true + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.11': + resolution: {integrity: sha512-eR8SYtf9Nem1Tnl0IWrY33qJ5wCtIWlt3Fs3c6V4aAaTFLtkEQErXu3SSZg/XCHrj9hXSJ8/8t+CdMk5Qec/ZA==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.8.0': + resolution: {integrity: sha512-+z00GpWxKV/q8eMETwbdi80TcOoVEVZ4xSRkxYOZpn3kbV3nej5iViNzXVke/j3v4y1YpO5zMS/CVDIASvJnZQ==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.2': + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + '@wordpress/babel-preset-default@8.31.0': resolution: {integrity: sha512-9ZOMKyhR5dBwFgXtxyGkwKp/tC6dcKm6zu8v5fXOepdF/in4Z+Bh438dTKCb6QHDcZrrv313S5bnxgWdWypC4A==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/base-styles@5.23.0': + resolution: {integrity: sha512-1mtX3jA9el2ZDkAJp7YEN1bX+DzfX0h496uxpRk+evmQJLZxBMPeu5datJFtwkWbVitOsR88WCDvUoNoKJMSuw==} + engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/base-styles@6.7.0': resolution: {integrity: sha512-Ob2+lGMFJnPZE5OQLEsdvs2Rp1RxemqHufJFg00c5mWCXokKPaDBIa/EcS/O3nsQGA3qYHciUSM1uIYLOUdbzA==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} @@ -2217,6 +3814,31 @@ packages: resolution: {integrity: sha512-Npw1Apa6r+K+jtX40ABWAXv7J1bVnOi6h9VPiMY8l/iZoRHBXao8HTgQnIoCm+GzymaQs6NQoH4X8UAClggeXA==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wpengine/hwp-toolbar@file:packages/toolbar': + resolution: {directory: packages/toolbar, type: directory} + engines: {node: '>=18'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react: + optional: true + + '@wry/caches@1.0.1': + resolution: {integrity: sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==} + engines: {node: '>=8'} + + '@wry/context@0.7.4': + resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} + engines: {node: '>=8'} + + '@wry/equality@0.5.7': + resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} + engines: {node: '>=8'} + + '@wry/trie@0.5.0': + resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} + engines: {node: '>=8'} + '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -2271,6 +3893,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + ajv-errors@1.0.1: resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} peerDependencies: @@ -2411,6 +4037,9 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -2432,6 +4061,10 @@ packages: atomically@2.0.3: resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} + auto-bind@4.0.0: + resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} + engines: {node: '>=8'} + autoprefixer@10.4.21: resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} @@ -2573,6 +4206,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -2689,6 +4325,9 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case-all@1.0.15: + resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==} + change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} @@ -2715,6 +4354,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + chrome-launcher@1.2.0: resolution: {integrity: sha512-JbuGuBNss258bvGil7FT4HKdC3SC2K7UAEUqiPy3ACS3Yxo3hAW6bvFpCu2HsIJLgTqxgEX6BkujvzZfLpUD0Q==} engines: {node: '>=12.13.0'} @@ -2741,6 +4384,13 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -2749,6 +4399,10 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} @@ -2757,6 +4411,9 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2776,6 +4433,10 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -2836,6 +4497,10 @@ packages: common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -2928,10 +4593,21 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-inspect@1.0.1: + resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} + engines: {node: '>=16.0.0'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypto-hash@3.1.0: + resolution: {integrity: sha512-HR8JlZ+Dn54Lc5gGWZJxJitWbOCUzWb9/AlyONGecBnYZ+n/ONvt0gQnEzDNpJMYeRrYO7KogQ4qwyTPKnWKEw==} + engines: {node: '>=18'} + csp_evaluator@1.1.5: resolution: {integrity: sha512-EL/iN9etCTzw/fBnp0/uj0f5BOOGvZut2mzsiiBZ/FdT6gFQCKRO/tmcKOxn5drWZ2Ndm/xBb1SI4zwWbGtmIw==} @@ -3023,6 +4699,10 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -3046,9 +4726,16 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + dataloader@2.2.3: + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} + debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debounce@2.2.0: + resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==} + engines: {node: '>=18'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -3164,6 +4851,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dependency-graph@0.11.0: + resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} + engines: {node: '>= 0.6.0'} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -3177,6 +4868,10 @@ packages: engines: {node: '>=0.10'} hasBin: true + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -3246,6 +4941,10 @@ packages: resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} engines: {node: '>=18'} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -3254,6 +4953,10 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -3364,6 +5067,11 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3388,28 +5096,86 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@8.10.2: - resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} - hasBin: true + eslint-config-next@15.2.0: + resolution: {integrity: sha512-LkG0KKpinAoNPk2HXSx0fImFb/hQ6RnhSxTkpJFTkQ0SmnzsbRsjjN95WC/mDY34nKOenpptYEVvfkCR/h+VjA==} peerDependencies: - eslint: '>=7.0.0' - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} + eslint-config-next@15.2.1: + resolution: {integrity: sha512-mhsprz7l0no8X+PdDnVHF4dZKu9YBJp2Rf6ztWbXBLJ4h6gxmW//owbbGJMBVUU+PibGJDAqZhW4pt8SC8HSow==} peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' peerDependenciesMeta: - '@typescript-eslint/parser': + typescript: optional: true - eslint: + + eslint-config-next@15.2.3: + resolution: {integrity: sha512-VDQwbajhNMFmrhLWVyUXCqsGPN+zz5G8Ys/QwFubfsxTIrkqdx3N3x3QPW+pERz8bzGPP0IgEm8cNbZcd8PFRQ==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-next@15.2.4: + resolution: {integrity: sha512-v4gYjd4eYIme8qzaJItpR5MMBXJ0/YV07u7eb50kEnlEmX7yhOjdUdzz70v4fiINYRjLf8X8TbogF0k7wlz6sA==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-next@15.3.2: + resolution: {integrity: sha512-FerU4DYccO4FgeYFFglz0SnaKRe1ejXQrDb8kWUkTAg036YWi+jUsgg4sIGNCDhAsDITsZaL4MzBWKB6f4G1Dg==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-prettier@8.10.2: + resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: optional: true eslint-import-resolver-node: optional: true @@ -3482,6 +5248,12 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} @@ -3496,6 +5268,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -3504,12 +5280,30 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + eslint@9.37.0: + resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3598,6 +5392,10 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -3611,6 +5409,10 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-xml-parser@5.3.0: + resolution: {integrity: sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==} + hasBin: true + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -3625,9 +5427,28 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -3639,6 +5460,10 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + filename-reserved-regex@2.0.0: resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} engines: {node: '>=4'} @@ -3690,6 +5515,10 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flat-cache@6.1.14: resolution: {integrity: sha512-ExZSCSV9e7v/Zt7RzCbX57lY2dnPdxzU/h3UE6WJ6NtEMfwBd8jmi1n4otDEUfz+T/R+zxrFDpICFdjhD3H/zw==} @@ -3733,6 +5562,10 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} @@ -3822,6 +5655,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-tsconfig@4.12.0: + resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} + get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} @@ -3871,6 +5707,10 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -3900,6 +5740,54 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql-config@5.1.5: + resolution: {integrity: sha512-mG2LL1HccpU8qg5ajLROgdsBzx/o2M6kgI3uAmoaXiSH9PCUbtIyLomLqUtCFaAeG2YCFsl0M5cfQ9rKmDoMVA==} + engines: {node: '>= 16.0.0'} + peerDependencies: + cosmiconfig-toml-loader: ^1.0.0 + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + cosmiconfig-toml-loader: + optional: true + + graphql-request@6.1.0: + resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} + peerDependencies: + graphql: 14 - 16 + + graphql-tag@2.12.6: + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + graphql-ws@6.0.6: + resolution: {integrity: sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw==} + engines: {node: '>=20'} + peerDependencies: + '@fastify/websocket': ^10 || ^11 + crossws: ~0.3 + graphql: ^15.10.1 || ^16 + uWebSockets.js: ^20 + ws: ^8 + peerDependenciesMeta: + '@fastify/websocket': + optional: true + crossws: + optional: true + uWebSockets.js: + optional: true + ws: + optional: true + + graphql@16.10.0: + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -3945,6 +5833,9 @@ packages: header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} @@ -4014,6 +5905,10 @@ packages: '@types/express': optional: true + http-proxy-middleware@3.0.5: + resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} @@ -4082,6 +5977,10 @@ packages: image-ssim@0.2.0: resolution: {integrity: sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==} + immutable@3.7.6: + resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} + engines: {node: '>=0.8.0'} + immutable@5.1.3: resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} @@ -4089,6 +5988,10 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-from@4.0.0: + resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} + engines: {node: '>=12.2'} + import-in-the-middle@1.14.2: resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} @@ -4126,6 +6029,10 @@ packages: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} engines: {node: '>=8.0.0'} + inquirer@8.2.7: + resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} + engines: {node: '>=12.0.0'} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -4137,6 +6044,9 @@ packages: intl-messageformat@10.7.16: resolution: {integrity: sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} @@ -4153,6 +6063,10 @@ packages: resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} engines: {node: '>=8'} + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -4183,6 +6097,9 @@ packages: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -4246,6 +6163,9 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + is-lower-case@2.0.2: + resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -4293,6 +6213,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -4321,10 +6245,17 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-upper-case@2.0.2: + resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -4366,6 +6297,11 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -4543,10 +6479,21 @@ packages: node-notifier: optional: true + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + joi@18.0.1: resolution: {integrity: sha512-IiQpRyypSnLisQf3PwuN2eIHAsAIGZIrLZkd4zdvIar2bDyhM91ubRjy8a3eYablXsh9BeI/c7dmPYHca5qtoA==} engines: {node: '>= 20'} + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} @@ -4606,6 +6553,10 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-to-pretty-yaml@1.2.2: + resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==} + engines: {node: '>= 0.2.0'} + json2php@0.0.7: resolution: {integrity: sha512-dnSoUiLAoVaMXxFsVi4CrPVYMKOuDBXTghXSmMINX44RZ8WM9cXlY7UqrQnlAcODCVO7FV3+8t/5nDKAjimLfg==} @@ -4706,6 +6657,70 @@ packages: engines: {node: '>=18.20'} hasBin: true + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -4716,6 +6731,15 @@ packages: linkify-it@3.0.3: resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + listr2@4.0.5: + resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} + engines: {node: '>=12'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -4748,6 +6772,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -4768,6 +6795,10 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + loglevel@1.9.2: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} @@ -4779,6 +6810,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lower-case-first@2.0.2: + resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -4800,6 +6834,14 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + lucide-react@0.477.0: + resolution: {integrity: sha512-yCf7aYxerFZAbd8jHJxjwe1j7jEMPptjnaOqdYeirFnEy85cNR3/L+o0I875CYFYya+eEVzZSbNuRk8BZPDpVw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -4807,6 +6849,10 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -4889,6 +6935,15 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + meros@1.3.2: + resolution: {integrity: sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==} + engines: {node: '>=13'} + peerDependencies: + '@types/node': '>=13' + peerDependenciesMeta: + '@types/node': + optional: true + metaviewport-parser@0.3.0: resolution: {integrity: sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==} @@ -4976,6 +7031,10 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} @@ -5020,6 +7079,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5038,12 +7102,63 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} + next-http-proxy-middleware@1.2.7: + resolution: {integrity: sha512-SasEovBqKMZzvY1elvWa33BxDWT5cc8G4KASS3ygADNV7v1O12y0rjA8F9eOD9aCNXYxJfnRHzauOE0rPSqISg==} + engines: {node: '>=10.0.0'} + + next@15.4.7: + resolution: {integrity: sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + next@15.5.4: + resolution: {integrity: sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -5053,6 +7168,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -5070,6 +7189,10 @@ packages: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -5105,6 +7228,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + nwsapi@2.2.22: resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} @@ -5173,6 +7299,9 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true + optimism@0.18.1: + resolution: {integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -5181,6 +7310,10 @@ packages: resolution: {integrity: sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==} engines: {node: '>=8'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + os-homedir@1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} @@ -5232,6 +7365,10 @@ packages: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + p-retry@6.2.1: resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} engines: {node: '>=16.17'} @@ -5264,6 +7401,10 @@ packages: parse-cache-control@1.0.1: resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -5304,6 +7445,14 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + + path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -5336,6 +7485,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -5602,6 +7755,10 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -5635,6 +7792,11 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5646,6 +7808,9 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -5717,10 +7882,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} peerDependencies: - react: ^18.3.1 + react: ^19.2.0 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -5736,6 +7901,10 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -5800,6 +7969,29 @@ packages: resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true + rehackt@0.1.0: + resolution: {integrity: sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==} + peerDependencies: + '@types/react': '*' + react: '*' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + relay-runtime@12.0.0: + resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} + + remedial@1.0.8: + resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + remove-trailing-spaces@1.0.9: + resolution: {integrity: sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5841,6 +8033,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -5869,6 +8064,9 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -5882,6 +8080,11 @@ packages: resolution: {integrity: sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==} engines: {node: '>=10.0.0'} + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rtlcss@4.3.0: resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==} engines: {node: '>=12.0.0'} @@ -5960,8 +8163,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} @@ -5971,6 +8174,9 @@ packages: resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} + scuid@1.1.0: + resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} + select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -6021,6 +8227,9 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} @@ -6035,6 +8244,10 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -6073,6 +8286,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + signedsource@1.0.0: + resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} + simple-git@3.28.0: resolution: {integrity: sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==} @@ -6091,6 +8307,10 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} @@ -6170,12 +8390,18 @@ packages: resolution: {integrity: sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==} engines: {node: '>=8.0'} + sponge-case@1.0.1: + resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -6198,6 +8424,9 @@ packages: streamx@2.22.1: resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + string-env-interpolation@1.0.1: + resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -6271,12 +8500,28 @@ packages: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + stubborn-fs@1.2.5: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} style-search@0.1.0: resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + stylehacks@6.1.1: resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} engines: {node: ^14 || ^16 || >=18.0} @@ -6345,9 +8590,20 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + swap-case@2.0.2: + resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + sync-fetch@0.6.0-2: + resolution: {integrity: sha512-c7AfkZ9udatCuAy9RSfiGPpeOKKUAUK5e1cXadLOGUjasdxqYqAK0jTNkM/FSEyJ3a5Ra27j/tw/PS0qLmaF/A==} + engines: {node: '>=18'} + synckit@0.11.11: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6356,6 +8612,17 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@4.1.14: + resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==} + tapable@2.2.3: resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} engines: {node: '>=6'} @@ -6366,6 +8633,10 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + engines: {node: '>=18'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -6420,6 +8691,17 @@ packages: thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + timeout-signal@2.0.0: + resolution: {integrity: sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==} + engines: {node: '>=16'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + title-case@3.0.3: + resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -6480,12 +8762,22 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-invariant@0.10.3: + resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} + engines: {node: '>=8'} + + ts-log@2.2.7: + resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -6562,6 +8854,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} @@ -6572,12 +8868,16 @@ packages: unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.12.0: resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} - unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -6602,10 +8902,17 @@ packages: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} + unixify@1.0.0: + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} + engines: {node: '>=0.10.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true @@ -6634,6 +8941,15 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + + urql@4.2.2: + resolution: {integrity: sha512-3GgqNa6iF7bC4hY/ImJKN4REQILcSU9VKcKL8gfELZM8mM5BnLH1BsCc8kBdnVGD1LIFOs4W3O2idNHhON1r0w==} + peerDependencies: + '@urql/core': ^5.0.0 + react: '>= 16.8.0' + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6660,6 +8976,46 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vite@6.3.6: + resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} @@ -6682,6 +9038,10 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} @@ -6770,6 +9130,10 @@ packages: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} @@ -6808,6 +9172,9 @@ packages: wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + wonka@6.3.5: + resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -6893,6 +9260,13 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -6929,6 +9303,12 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} + zen-observable-ts@1.2.5: + resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} + + zen-observable@0.8.15: + resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -6937,11 +9317,79 @@ packages: snapshots: + '@0no-co/graphql.web@1.2.0(graphql@16.11.0)': + optionalDependencies: + graphql: 16.11.0 + + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + '@apollo/client@3.13.1(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.10.0)(ws@8.18.3))(graphql@16.10.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@wry/caches': 1.0.1 + '@wry/equality': 0.5.7 + '@wry/trie': 0.5.0 + graphql: 16.10.0 + graphql-tag: 2.12.6(graphql@16.10.0) + hoist-non-react-statics: 3.3.2 + optimism: 0.18.1 + prop-types: 15.8.1 + rehackt: 0.1.0(@types/react@19.1.3)(react@19.2.0) + symbol-observable: 4.0.0 + ts-invariant: 0.10.3 + tslib: 2.8.1 + zen-observable-ts: 1.2.5 + optionalDependencies: + graphql-ws: 6.0.6(graphql@16.10.0)(ws@8.18.3) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + transitivePeerDependencies: + - '@types/react' + + '@apollo/client@3.14.0(@types/react@19.1.3)(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) + '@wry/caches': 1.0.1 + '@wry/equality': 0.5.7 + '@wry/trie': 0.5.0 + graphql: 16.11.0 + graphql-tag: 2.12.6(graphql@16.11.0) + hoist-non-react-statics: 3.3.2 + optimism: 0.18.1 + prop-types: 15.8.1 + rehackt: 0.1.0(@types/react@19.1.3)(react@19.2.0) + symbol-observable: 4.0.0 + ts-invariant: 0.10.3 + tslib: 2.8.1 + zen-observable-ts: 1.2.5 + optionalDependencies: + graphql-ws: 6.0.6(graphql@16.11.0)(ws@8.18.3) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + transitivePeerDependencies: + - '@types/react' + + '@ardatan/relay-compiler@12.0.3(graphql@16.10.0)': + dependencies: + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/runtime': 7.27.0 + chalk: 4.1.2 + fb-watchman: 2.0.2 + graphql: 16.10.0 + immutable: 3.7.6 + invariant: 2.2.4 + nullthrows: 1.1.1 + relay-runtime: 12.0.0 + signedsource: 1.0.0 + transitivePeerDependencies: + - encoding + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -6970,6 +9418,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/eslint-parser@7.25.7(@babel/core@7.25.7)(eslint@8.57.1)': dependencies: '@babel/core': 7.25.7 @@ -7054,6 +9522,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.27.1': dependencies: '@babel/types': 7.28.4 @@ -7182,6 +9659,11 @@ snapshots: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 @@ -7940,7 +10422,7 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/cli@2.29.7(@types/node@24.5.2)': + '@changesets/cli@2.29.7(@types/node@22.15.17)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -7956,7 +10438,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@24.5.2) + '@inquirer/external-editor': 1.0.2(@types/node@22.15.17) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -8086,19 +10568,151 @@ snapshots: '@dual-bundle/import-meta-resolve@4.2.1': {} + '@emnapi/core@1.5.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@envelop/core@5.3.2': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@envelop/types': 5.2.1 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@envelop/instrumentation@1.0.0': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@envelop/types@5.2.1': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + '@es-joy/jsdoccomment@0.41.0': dependencies: comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.0.0 + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.6.1))': + dependencies: + eslint: 9.37.0(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} + '@eslint/config-array@0.21.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.0': + dependencies: + '@eslint/core': 0.16.0 + + '@eslint/core@0.16.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -8113,8 +10727,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.57.1': {} + '@eslint/js@9.37.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.4.0': + dependencies: + '@eslint/core': 0.16.0 + levn: 0.4.1 + + '@fastify/busboy@3.2.0': {} + '@formatjs/ecma402-abstract@2.3.4': dependencies: '@formatjs/fast-memoize': 2.2.7 @@ -8141,35 +10780,608 @@ snapshots: dependencies: tslib: 2.8.1 - '@hapi/address@5.1.1': - dependencies: - '@hapi/hoek': 11.0.7 - - '@hapi/formula@3.0.2': {} - - '@hapi/hoek@11.0.7': {} - - '@hapi/pinpoint@2.0.1': {} - - '@hapi/tlds@1.1.3': {} - - '@hapi/topo@6.0.2': - dependencies: - '@hapi/hoek': 11.0.7 - - '@humanwhocodes/config-array@0.13.0': + '@graphql-codegen/add@5.0.3(graphql@16.10.0)': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.6.3 - '@inquirer/checkbox@4.1.9(@types/node@24.5.2)': + '@graphql-codegen/cli@5.0.7(@parcel/watcher@2.5.1)(@types/node@24.5.2)(enquirer@2.4.1)(graphql@16.10.0)(typescript@5.8.3)': + dependencies: + '@babel/generator': 7.28.3 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + '@graphql-codegen/client-preset': 4.8.3(graphql@16.10.0) + '@graphql-codegen/core': 4.0.2(graphql@16.10.0) + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + '@graphql-tools/apollo-engine-loader': 8.0.22(graphql@16.10.0) + '@graphql-tools/code-file-loader': 8.1.22(graphql@16.10.0) + '@graphql-tools/git-loader': 8.0.26(graphql@16.10.0) + '@graphql-tools/github-loader': 8.0.22(@types/node@24.5.2)(graphql@16.10.0) + '@graphql-tools/graphql-file-loader': 8.1.2(graphql@16.10.0) + '@graphql-tools/json-file-loader': 8.0.20(graphql@16.10.0) + '@graphql-tools/load': 8.1.2(graphql@16.10.0) + '@graphql-tools/prisma-loader': 8.0.17(@types/node@24.5.2)(graphql@16.10.0) + '@graphql-tools/url-loader': 8.0.33(@types/node@24.5.2)(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@whatwg-node/fetch': 0.10.11 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.8.3) + debounce: 1.2.1 + detect-indent: 6.1.0 + graphql: 16.10.0 + graphql-config: 5.1.5(@types/node@24.5.2)(graphql@16.10.0)(typescript@5.8.3) + inquirer: 8.2.7(@types/node@24.5.2) + is-glob: 4.0.3 + jiti: 1.21.7 + json-to-pretty-yaml: 1.2.2 + listr2: 4.0.5(enquirer@2.4.1) + log-symbols: 4.1.0 + micromatch: 4.0.8 + shell-quote: 1.8.3 + string-env-interpolation: 1.0.1 + ts-log: 2.2.7 + tslib: 2.8.1 + yaml: 2.8.0 + yargs: 17.7.2 + optionalDependencies: + '@parcel/watcher': 2.5.1 + transitivePeerDependencies: + - '@fastify/websocket' + - '@types/node' + - bufferutil + - cosmiconfig-toml-loader + - crossws + - encoding + - enquirer + - graphql-sock + - supports-color + - typescript + - uWebSockets.js + - utf-8-validate + + '@graphql-codegen/client-preset@4.8.3(graphql@16.10.0)': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + '@graphql-codegen/add': 5.0.3(graphql@16.10.0) + '@graphql-codegen/gql-tag-operations': 4.0.17(graphql@16.10.0) + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + '@graphql-codegen/typed-document-node': 5.1.2(graphql@16.10.0) + '@graphql-codegen/typescript': 4.1.6(graphql@16.10.0) + '@graphql-codegen/typescript-operations': 4.6.1(graphql@16.10.0) + '@graphql-codegen/visitor-plugin-common': 5.8.0(graphql@16.10.0) + '@graphql-tools/documents': 1.0.1(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + '@graphql-codegen/core@4.0.2(graphql@16.10.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + '@graphql-tools/schema': 10.0.25(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.6.3 + + '@graphql-codegen/fragment-matcher@5.1.0(graphql@16.10.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.6.3 + + '@graphql-codegen/gql-tag-operations@4.0.17(graphql@16.10.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + '@graphql-codegen/visitor-plugin-common': 5.8.0(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + auto-bind: 4.0.0 + graphql: 16.10.0 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + '@graphql-codegen/plugin-helpers@5.1.1(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + change-case-all: 1.0.15 + common-tags: 1.8.2 + graphql: 16.10.0 + import-from: 4.0.0 + lodash: 4.17.21 + tslib: 2.6.3 + + '@graphql-codegen/schema-ast@4.1.0(graphql@16.10.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.6.3 + + '@graphql-codegen/typed-document-node@5.1.2(graphql@16.10.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + '@graphql-codegen/visitor-plugin-common': 5.8.0(graphql@16.10.0) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + graphql: 16.10.0 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + '@graphql-codegen/typescript-operations@4.6.1(graphql@16.10.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + '@graphql-codegen/typescript': 4.1.6(graphql@16.10.0) + '@graphql-codegen/visitor-plugin-common': 5.8.0(graphql@16.10.0) + auto-bind: 4.0.0 + graphql: 16.10.0 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + '@graphql-codegen/typescript@4.1.6(graphql@16.10.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + '@graphql-codegen/schema-ast': 4.1.0(graphql@16.10.0) + '@graphql-codegen/visitor-plugin-common': 5.8.0(graphql@16.10.0) + auto-bind: 4.0.0 + graphql: 16.10.0 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + '@graphql-codegen/visitor-plugin-common@5.8.0(graphql@16.10.0)': + dependencies: + '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) + '@graphql-tools/optimize': 2.0.0(graphql@16.10.0) + '@graphql-tools/relay-operation-optimizer': 7.0.21(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + dependency-graph: 0.11.0 + graphql: 16.10.0 + graphql-tag: 2.12.6(graphql@16.10.0) + parse-filepath: 1.0.2 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + '@graphql-hive/signal@1.0.0': {} + + '@graphql-tools/apollo-engine-loader@8.0.22(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@whatwg-node/fetch': 0.10.11 + graphql: 16.10.0 + sync-fetch: 0.6.0-2 + tslib: 2.8.1 + + '@graphql-tools/batch-execute@9.0.19(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@whatwg-node/promise-helpers': 1.3.2 + dataloader: 2.2.3 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/code-file-loader@8.1.22(graphql@16.10.0)': + dependencies: + '@graphql-tools/graphql-tag-pluck': 8.3.21(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + globby: 11.1.0 + graphql: 16.10.0 + tslib: 2.8.1 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/delegate@10.2.23(graphql@16.10.0)': + dependencies: + '@graphql-tools/batch-execute': 9.0.19(graphql@16.10.0) + '@graphql-tools/executor': 1.4.9(graphql@16.10.0) + '@graphql-tools/schema': 10.0.25(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + dataloader: 2.2.3 + dset: 3.1.4 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/documents@1.0.1(graphql@16.10.0)': + dependencies: + graphql: 16.10.0 + lodash.sortby: 4.7.0 + tslib: 2.8.1 + + '@graphql-tools/executor-common@0.0.4(graphql@16.10.0)': + dependencies: + '@envelop/core': 5.3.2 + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + + '@graphql-tools/executor-common@0.0.6(graphql@16.10.0)': + dependencies: + '@envelop/core': 5.3.2 + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + + '@graphql-tools/executor-graphql-ws@2.0.7(graphql@16.10.0)': + dependencies: + '@graphql-tools/executor-common': 0.0.6(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@whatwg-node/disposablestack': 0.0.6 + graphql: 16.10.0 + graphql-ws: 6.0.6(graphql@16.10.0)(ws@8.18.3) + isomorphic-ws: 5.0.0(ws@8.18.3) + tslib: 2.8.1 + ws: 8.18.3 + transitivePeerDependencies: + - '@fastify/websocket' + - bufferutil + - crossws + - uWebSockets.js + - utf-8-validate + + '@graphql-tools/executor-http@1.3.3(@types/node@24.5.2)(graphql@16.10.0)': + dependencies: + '@graphql-hive/signal': 1.0.0 + '@graphql-tools/executor-common': 0.0.4(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.11 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.10.0 + meros: 1.3.2(@types/node@24.5.2) + tslib: 2.8.1 + transitivePeerDependencies: + - '@types/node' + + '@graphql-tools/executor-legacy-ws@1.1.19(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@types/ws': 8.18.1 + graphql: 16.10.0 + isomorphic-ws: 5.0.0(ws@8.18.3) + tslib: 2.8.1 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@graphql-tools/executor@1.4.9(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/git-loader@8.0.26(graphql@16.10.0)': + dependencies: + '@graphql-tools/graphql-tag-pluck': 8.3.21(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + is-glob: 4.0.3 + micromatch: 4.0.8 + tslib: 2.8.1 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/github-loader@8.0.22(@types/node@24.5.2)(graphql@16.10.0)': + dependencies: + '@graphql-tools/executor-http': 1.3.3(@types/node@24.5.2)(graphql@16.10.0) + '@graphql-tools/graphql-tag-pluck': 8.3.21(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@whatwg-node/fetch': 0.10.11 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.10.0 + sync-fetch: 0.6.0-2 + tslib: 2.8.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + + '@graphql-tools/graphql-file-loader@8.1.2(graphql@16.10.0)': + dependencies: + '@graphql-tools/import': 7.1.2(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + globby: 11.1.0 + graphql: 16.10.0 + tslib: 2.8.1 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/graphql-tag-pluck@8.3.21(graphql@16.10.0)': + dependencies: + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/import@7.1.2(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@theguild/federation-composition': 0.20.1(graphql@16.10.0) + graphql: 16.10.0 + resolve-from: 5.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@graphql-tools/json-file-loader@8.0.20(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + globby: 11.1.0 + graphql: 16.10.0 + tslib: 2.8.1 + unixify: 1.0.0 + + '@graphql-tools/load@8.1.2(graphql@16.10.0)': + dependencies: + '@graphql-tools/schema': 10.0.25(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + p-limit: 3.1.0 + tslib: 2.8.1 + + '@graphql-tools/merge@9.1.1(graphql@16.10.0)': + dependencies: + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/optimize@2.0.0(graphql@16.10.0)': + dependencies: + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/prisma-loader@8.0.17(@types/node@24.5.2)(graphql@16.10.0)': + dependencies: + '@graphql-tools/url-loader': 8.0.33(@types/node@24.5.2)(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@types/js-yaml': 4.0.9 + '@whatwg-node/fetch': 0.10.11 + chalk: 4.1.2 + debug: 4.4.3 + dotenv: 16.4.7 + graphql: 16.10.0 + graphql-request: 6.1.0(graphql@16.10.0) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + jose: 5.10.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + scuid: 1.1.0 + tslib: 2.8.1 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - '@fastify/websocket' + - '@types/node' + - bufferutil + - crossws + - encoding + - supports-color + - uWebSockets.js + - utf-8-validate + + '@graphql-tools/relay-operation-optimizer@7.0.21(graphql@16.10.0)': + dependencies: + '@ardatan/relay-compiler': 12.0.3(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@graphql-tools/schema@10.0.25(graphql@16.10.0)': + dependencies: + '@graphql-tools/merge': 9.1.1(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/url-loader@8.0.33(@types/node@24.5.2)(graphql@16.10.0)': + dependencies: + '@graphql-tools/executor-graphql-ws': 2.0.7(graphql@16.10.0) + '@graphql-tools/executor-http': 1.3.3(@types/node@24.5.2)(graphql@16.10.0) + '@graphql-tools/executor-legacy-ws': 1.1.19(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@graphql-tools/wrap': 10.1.4(graphql@16.10.0) + '@types/ws': 8.18.1 + '@whatwg-node/fetch': 0.10.11 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.10.0 + isomorphic-ws: 5.0.0(ws@8.18.3) + sync-fetch: 0.6.0-2 + tslib: 2.8.1 + ws: 8.18.3 + transitivePeerDependencies: + - '@fastify/websocket' + - '@types/node' + - bufferutil + - crossws + - uWebSockets.js + - utf-8-validate + + '@graphql-tools/utils@10.9.1(graphql@16.10.0)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@whatwg-node/promise-helpers': 1.3.2 + cross-inspect: 1.0.1 + dset: 3.1.4 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-tools/wrap@10.1.4(graphql@16.10.0)': + dependencies: + '@graphql-tools/delegate': 10.2.23(graphql@16.10.0) + '@graphql-tools/schema': 10.0.25(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.10.0 + tslib: 2.8.1 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.10.0)': + dependencies: + graphql: 16.10.0 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.11.0)': + dependencies: + graphql: 16.11.0 + + '@hapi/address@5.1.1': + dependencies: + '@hapi/hoek': 11.0.7 + + '@hapi/formula@3.0.2': {} + + '@hapi/hoek@11.0.7': {} + + '@hapi/pinpoint@2.0.1': {} + + '@hapi/tlds@1.1.3': {} + + '@hapi/topo@6.0.2': + dependencies: + '@hapi/hoek': 11.0.7 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.3 + optional: true + + '@img/sharp-darwin-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.3 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.3': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.3': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + optional: true + + '@img/sharp-linux-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.3 + optional: true + + '@img/sharp-linux-arm@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.3 + optional: true + + '@img/sharp-linux-ppc64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.3 + optional: true + + '@img/sharp-linux-s390x@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.3 + optional: true + + '@img/sharp-linux-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + optional: true + + '@img/sharp-wasm32@0.34.4': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + + '@img/sharp-win32-arm64@0.34.4': + optional: true + + '@img/sharp-win32-ia32@0.34.4': + optional: true + + '@img/sharp-win32-x64@0.34.4': + optional: true + + '@inquirer/checkbox@4.1.9(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.17) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.17 + + '@inquirer/checkbox@4.1.9(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) '@inquirer/figures': 1.0.12 @@ -8179,6 +11391,13 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/confirm@5.1.13(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/type': 3.0.7(@types/node@22.15.17) + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/confirm@5.1.13(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) @@ -8186,6 +11405,19 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/core@10.1.14(@types/node@22.15.17)': + dependencies: + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.17) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/core@10.1.14(@types/node@24.5.2)': dependencies: '@inquirer/figures': 1.0.12 @@ -8199,6 +11431,14 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/editor@4.2.14(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/type': 3.0.7(@types/node@22.15.17) + external-editor: 3.1.0 + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/editor@4.2.14(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) @@ -8207,13 +11447,28 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/expand@4.0.16(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/type': 3.0.7(@types/node@22.15.17) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/expand@4.0.16(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) '@inquirer/type': 3.0.7(@types/node@24.5.2) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.5.2 + + '@inquirer/external-editor@1.0.2(@types/node@22.15.17)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 22.15.17 '@inquirer/external-editor@1.0.2(@types/node@24.5.2)': dependencies: @@ -8224,6 +11479,13 @@ snapshots: '@inquirer/figures@1.0.12': {} + '@inquirer/input@4.2.0(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/type': 3.0.7(@types/node@22.15.17) + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/input@4.2.0(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) @@ -8231,6 +11493,13 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/number@3.0.16(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/type': 3.0.7(@types/node@22.15.17) + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/number@3.0.16(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) @@ -8238,6 +11507,14 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/password@4.0.16(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/type': 3.0.7(@types/node@22.15.17) + ansi-escapes: 4.3.2 + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/password@4.0.16(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) @@ -8246,6 +11523,21 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/prompts@7.6.0(@types/node@22.15.17)': + dependencies: + '@inquirer/checkbox': 4.1.9(@types/node@22.15.17) + '@inquirer/confirm': 5.1.13(@types/node@22.15.17) + '@inquirer/editor': 4.2.14(@types/node@22.15.17) + '@inquirer/expand': 4.0.16(@types/node@22.15.17) + '@inquirer/input': 4.2.0(@types/node@22.15.17) + '@inquirer/number': 3.0.16(@types/node@22.15.17) + '@inquirer/password': 4.0.16(@types/node@22.15.17) + '@inquirer/rawlist': 4.1.4(@types/node@22.15.17) + '@inquirer/search': 3.0.16(@types/node@22.15.17) + '@inquirer/select': 4.2.4(@types/node@22.15.17) + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/prompts@7.6.0(@types/node@24.5.2)': dependencies: '@inquirer/checkbox': 4.1.9(@types/node@24.5.2) @@ -8261,6 +11553,14 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/rawlist@4.1.4(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/type': 3.0.7(@types/node@22.15.17) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/rawlist@4.1.4(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) @@ -8269,6 +11569,15 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/search@3.0.16(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.17) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/search@3.0.16(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) @@ -8278,6 +11587,16 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/select@4.2.4(@types/node@22.15.17)': + dependencies: + '@inquirer/core': 10.1.14(@types/node@22.15.17) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.17) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/select@4.2.4(@types/node@24.5.2)': dependencies: '@inquirer/core': 10.1.14(@types/node@24.5.2) @@ -8288,6 +11607,10 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 + '@inquirer/type@3.0.7(@types/node@22.15.17)': + optionalDependencies: + '@types/node': 22.15.17 + '@inquirer/type@3.0.7(@types/node@24.5.2)': optionalDependencies: '@types/node': 24.5.2 @@ -8301,6 +11624,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -8314,7 +11641,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -8327,14 +11654,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@24.5.2) + jest-config: 29.7.0(@types/node@22.15.17) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -8359,7 +11686,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -8377,7 +11704,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.5.2 + '@types/node': 22.15.17 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -8399,7 +11726,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 24.5.2 + '@types/node': 22.15.17 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -8469,7 +11796,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -8478,6 +11805,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.11': @@ -8559,6 +11891,85 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@next/env@15.4.7': {} + + '@next/env@15.5.4': {} + + '@next/eslint-plugin-next@15.2.0': + dependencies: + fast-glob: 3.3.1 + + '@next/eslint-plugin-next@15.2.1': + dependencies: + fast-glob: 3.3.1 + + '@next/eslint-plugin-next@15.2.3': + dependencies: + fast-glob: 3.3.1 + + '@next/eslint-plugin-next@15.2.4': + dependencies: + fast-glob: 3.3.1 + + '@next/eslint-plugin-next@15.3.2': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.4.7': + optional: true + + '@next/swc-darwin-arm64@15.5.4': + optional: true + + '@next/swc-darwin-x64@15.4.7': + optional: true + + '@next/swc-darwin-x64@15.5.4': + optional: true + + '@next/swc-linux-arm64-gnu@15.4.7': + optional: true + + '@next/swc-linux-arm64-gnu@15.5.4': + optional: true + + '@next/swc-linux-arm64-musl@15.4.7': + optional: true + + '@next/swc-linux-arm64-musl@15.5.4': + optional: true + + '@next/swc-linux-x64-gnu@15.4.7': + optional: true + + '@next/swc-linux-x64-gnu@15.5.4': + optional: true + + '@next/swc-linux-x64-musl@15.4.7': + optional: true + + '@next/swc-linux-x64-musl@15.5.4': + optional: true + + '@next/swc-win32-arm64-msvc@15.4.7': + optional: true + + '@next/swc-win32-arm64-msvc@15.5.4': + optional: true + + '@next/swc-win32-x64-msvc@15.4.7': + optional: true + + '@next/swc-win32-x64-msvc@15.5.4': + optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -8575,6 +11986,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@nolyfill/is-core-module@1.0.39': {} + '@opentelemetry/api-logs@0.57.2': dependencies: '@opentelemetry/api': 1.9.0 @@ -8948,8 +12361,78 @@ snapshots: - bare-buffer - supports-color + '@repeaterjs/repeater@3.0.6': {} + + '@rollup/rollup-android-arm-eabi@4.52.4': + optional: true + + '@rollup/rollup-android-arm64@4.52.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.4': + optional: true + + '@rollup/rollup-darwin-x64@4.52.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.4': + optional: true + '@rtsao/scc@1.1.0': {} + '@rushstack/eslint-patch@1.13.0': {} + '@sentry/core@9.36.0': {} '@sentry/node-core@9.36.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0)': @@ -9134,16 +12617,107 @@ snapshots: - supports-color - typescript + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 + '@tailwindcss/node@4.1.14': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + magic-string: 0.30.19 + source-map-js: 1.2.1 + tailwindcss: 4.1.14 + + '@tailwindcss/oxide-android-arm64@4.1.14': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.14': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.14': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide@4.1.14': + dependencies: + detect-libc: 2.1.2 + tar: 7.5.1 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-x64': 4.1.14 + '@tailwindcss/oxide-freebsd-x64': 4.1.14 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-x64-musl': 4.1.14 + '@tailwindcss/oxide-wasm32-wasi': 4.1.14 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 + + '@tailwindcss/postcss@4.1.14': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.14 + '@tailwindcss/oxide': 4.1.14 + postcss: 8.5.6 + tailwindcss: 4.1.14 + + '@theguild/federation-composition@0.20.1(graphql@16.10.0)': + dependencies: + constant-case: 3.0.4 + debug: 4.4.1 + graphql: 16.10.0 + json5: 2.2.3 + lodash.sortby: 4.7.0 + transitivePeerDependencies: + - supports-color + '@tootallnate/once@2.0.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} '@trysound/sax@0.2.0': {} + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.4 @@ -9168,27 +12742,27 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 24.0.12 + '@types/node': 22.15.17 '@types/responselike': 1.0.3 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.6 - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/connect@3.4.38': dependencies: - '@types/node': 24.0.12 + '@types/node': 22.15.17 '@types/eslint-scope@3.7.7': dependencies: @@ -9204,7 +12778,7 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -9218,7 +12792,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/http-cache-semantics@4.0.4': {} @@ -9226,7 +12800,11 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 + + '@types/http-proxy@1.17.3': + dependencies: + '@types/node': 22.15.17 '@types/istanbul-lib-coverage@2.0.6': {} @@ -9238,9 +12816,11 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 + '@types/js-yaml@4.0.9': {} + '@types/jsdom@20.0.1': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -9250,7 +12830,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 24.0.12 + '@types/node': 22.15.17 '@types/mime@1.3.5': {} @@ -9258,21 +12838,26 @@ snapshots: '@types/mysql@2.15.26': dependencies: - '@types/node': 24.0.12 + '@types/node': 22.15.17 '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/node@12.20.55': {} - '@types/node@24.0.12': + '@types/node@20.19.19': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.15.17': dependencies: - undici-types: 7.8.0 + undici-types: 6.21.0 '@types/node@24.5.2': dependencies: undici-types: 7.12.0 + optional: true '@types/normalize-package-data@2.4.4': {} @@ -9284,7 +12869,7 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 24.0.12 + '@types/node': 22.15.17 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -9294,14 +12879,22 @@ snapshots: '@types/range-parser@1.2.7': {} + '@types/react-dom@19.2.1(@types/react@19.1.3)': + dependencies: + '@types/react': 19.1.3 + '@types/react@18.3.26': dependencies: '@types/prop-types': 15.7.15 csstype: 3.1.3 + '@types/react@19.1.3': + dependencies: + csstype: 3.1.3 + '@types/responselike@1.0.3': dependencies: - '@types/node': 24.0.12 + '@types/node': 22.15.17 '@types/retry@0.12.2': {} @@ -9310,7 +12903,7 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/serve-index@1.9.4': dependencies: @@ -9319,14 +12912,14 @@ snapshots: '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/send': 0.17.5 '@types/shimmer@1.2.0': {} '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/source-list-map@0.1.6': optional: true @@ -9338,7 +12931,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 24.0.12 + '@types/node': 22.15.17 '@types/tough-cookie@4.0.5': {} @@ -9349,14 +12942,14 @@ snapshots: '@types/webpack-sources@3.2.3': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/source-list-map': 0.1.6 source-map: 0.7.6 optional: true '@types/webpack@4.41.40': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/tapable': 1.0.12 '@types/uglify-js': 3.17.5 '@types/webpack-sources': 3.2.3 @@ -9366,7 +12959,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 '@types/yargs-parser@21.0.3': {} @@ -9376,7 +12969,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.0.12 + '@types/node': 22.15.17 optional: true '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': @@ -9399,6 +12992,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.3 + eslint: 9.37.0(jiti@2.6.1) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 @@ -9412,6 +13025,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.3 + eslint: 9.37.0(jiti@2.6.1) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -9434,6 +13060,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + debug: 4.4.3 + eslint: 9.37.0(jiti@2.6.1) + ts-api-utils: 1.4.3(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@5.62.0': {} '@typescript-eslint/types@6.21.0': {} @@ -9476,21 +13114,35 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) eslint: 8.57.1 - eslint-scope: 5.1.1 + eslint-scope: 5.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + eslint: 8.57.1 semver: 7.7.2 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - eslint: 8.57.1 + eslint: 9.37.0(jiti@2.6.1) semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -9508,6 +13160,72 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + '@urql/core@5.2.0(graphql@16.11.0)': + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@16.11.0) + wonka: 6.3.5 + transitivePeerDependencies: + - graphql + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -9587,20 +13305,41 @@ snapshots: '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack@5.101.3)': dependencies: webpack: 5.101.3(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@5.1.4)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3) '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack@5.101.3)': dependencies: webpack: 5.101.3(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@5.1.4)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3) '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack-dev-server@5.2.2)(webpack@5.101.3)': dependencies: webpack: 5.101.3(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@5.1.4)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3) optionalDependencies: webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.3) + '@whatwg-node/disposablestack@0.0.6': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/fetch@0.10.11': + dependencies: + '@whatwg-node/node-fetch': 0.8.0 + urlpattern-polyfill: 10.1.0 + + '@whatwg-node/node-fetch@0.8.0': + dependencies: + '@fastify/busboy': 3.2.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/promise-helpers@1.3.2': + dependencies: + tslib: 2.8.1 + '@wordpress/babel-preset-default@8.31.0': dependencies: '@babel/core': 7.25.7 @@ -9617,6 +13356,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@wordpress/base-styles@5.23.0': {} + '@wordpress/base-styles@6.7.0': {} '@wordpress/browserslist-config@6.31.0': {} @@ -9689,9 +13430,9 @@ snapshots: - '@types/node' - supports-color - '@wordpress/env@10.31.0(@types/node@24.5.2)': + '@wordpress/env@10.31.0(@types/node@22.15.17)': dependencies: - '@inquirer/prompts': 7.6.0(@types/node@24.5.2) + '@inquirer/prompts': 7.6.0(@types/node@22.15.17) chalk: 4.1.2 copy-dir: 1.3.0 docker-compose: 0.24.8 @@ -9724,6 +13465,37 @@ snapshots: transitivePeerDependencies: - supports-color + '@wordpress/eslint-plugin@22.17.0(@babel/core@7.25.7)(@types/eslint@9.6.1)(eslint@8.57.1)(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3)(wp-prettier@3.0.3)': + dependencies: + '@babel/core': 7.25.7 + '@babel/eslint-parser': 7.25.7(@babel/core@7.25.7)(eslint@8.57.1) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@wordpress/babel-preset-default': 8.31.0 + '@wordpress/prettier-config': 4.31.0(wp-prettier@3.0.3) + cosmiconfig: 7.1.0 + eslint: 8.57.1 + eslint-config-prettier: 8.10.2(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3) + eslint-plugin-jsdoc: 46.10.1(eslint@8.57.1) + eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) + eslint-plugin-playwright: 0.15.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3))(eslint@8.57.1) + eslint-plugin-prettier: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(wp-prettier@3.0.3) + eslint-plugin-react: 7.37.5(eslint@8.57.1) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) + globals: 13.24.0 + requireindex: 1.2.0 + optionalDependencies: + prettier: wp-prettier@3.0.3 + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/eslint' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + '@wordpress/eslint-plugin@22.17.0(@babel/core@7.25.7)(@types/eslint@9.6.1)(eslint@8.57.1)(jest@29.7.0(@types/node@24.5.2))(typescript@5.8.3)(wp-prettier@3.0.3)': dependencies: '@babel/core': 7.25.7 @@ -9739,7 +13511,7 @@ snapshots: eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.5.2))(typescript@5.8.3) eslint-plugin-jsdoc: 46.10.1(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-playwright: 0.15.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.5.2))(typescript@5.8.3))(eslint@8.57.1) + eslint-plugin-playwright: 0.15.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3))(eslint@8.57.1) eslint-plugin-prettier: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(wp-prettier@3.0.3) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -9761,12 +13533,27 @@ snapshots: jest: 29.7.0(@types/node@24.5.2) jest-matcher-utils: 29.7.0 + '@wordpress/jest-console@8.31.0(jest@29.7.0(@types/node@22.15.17))': + dependencies: + '@babel/runtime': 7.27.0 + jest: 29.7.0(@types/node@22.15.17) + jest-matcher-utils: 29.7.0 + '@wordpress/jest-console@8.31.0(jest@29.7.0(@types/node@24.5.2))': dependencies: '@babel/runtime': 7.27.0 jest: 29.7.0(@types/node@24.5.2) jest-matcher-utils: 29.7.0 + '@wordpress/jest-preset-default@12.31.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@22.15.17))': + dependencies: + '@babel/core': 7.25.7 + '@wordpress/jest-console': 8.31.0(jest@29.7.0(@types/node@22.15.17)) + babel-jest: 29.7.0(@babel/core@7.25.7) + jest: 29.7.0(@types/node@22.15.17) + transitivePeerDependencies: + - supports-color + '@wordpress/jest-preset-default@12.31.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.5.2))': dependencies: '@babel/core': 7.25.7 @@ -9790,7 +13577,7 @@ snapshots: dependencies: prettier: wp-prettier@3.0.3 - '@wordpress/scripts@30.24.0(@playwright/test@1.53.2)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.26.0(@types/node@24.5.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3)': + '@wordpress/scripts@30.24.0(@playwright/test@1.53.2)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.26.0(@types/node@24.5.2))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.25.7 '@playwright/test': 1.53.2 @@ -9837,8 +13624,8 @@ snapshots: postcss-loader: 6.2.1(postcss@8.5.6)(webpack@5.101.3) prettier: wp-prettier@3.0.3 puppeteer-core: 23.11.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) react-refresh: 0.14.2 read-pkg-up: 7.0.1 resolve-bin: 0.4.3 @@ -9852,7 +13639,7 @@ snapshots: url-loader: 4.1.1(webpack@5.101.3) webpack: 5.101.3(webpack-cli@5.1.4) webpack-bundle-analyzer: 4.10.2 - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@5.1.4)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3) webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.3) optionalDependencies: '@wordpress/env': 10.26.0(@types/node@24.5.2) @@ -9886,7 +13673,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@wordpress/scripts@30.24.0(@playwright/test@1.55.0)(@types/eslint@9.6.1)(@types/node@24.5.2)(@types/webpack@4.41.40)(@wordpress/env@10.31.0(@types/node@24.5.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3)': + '@wordpress/scripts@30.24.0(@playwright/test@1.55.0)(@types/eslint@9.6.1)(@types/node@22.15.17)(@types/webpack@4.41.40)(@wordpress/env@10.31.0(@types/node@22.15.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.8.3)))(type-fest@4.41.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.25.7 '@playwright/test': 1.55.0 @@ -9896,8 +13683,8 @@ snapshots: '@wordpress/browserslist-config': 6.31.0 '@wordpress/dependency-extraction-webpack-plugin': 6.31.0(webpack@5.101.3) '@wordpress/e2e-test-utils-playwright': 1.31.0(@playwright/test@1.55.0) - '@wordpress/eslint-plugin': 22.17.0(@babel/core@7.25.7)(@types/eslint@9.6.1)(eslint@8.57.1)(jest@29.7.0(@types/node@24.5.2))(typescript@5.8.3)(wp-prettier@3.0.3) - '@wordpress/jest-preset-default': 12.31.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.5.2)) + '@wordpress/eslint-plugin': 22.17.0(@babel/core@7.25.7)(@types/eslint@9.6.1)(eslint@8.57.1)(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3)(wp-prettier@3.0.3) + '@wordpress/jest-preset-default': 12.31.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@22.15.17)) '@wordpress/npm-package-json-lint-config': 5.31.0(npm-package-json-lint@6.4.0(typescript@5.8.3)) '@wordpress/postcss-plugins-preset': 5.31.0(postcss@8.5.6) '@wordpress/prettier-config': 4.31.0(wp-prettier@3.0.3) @@ -9918,7 +13705,7 @@ snapshots: expect-puppeteer: 4.4.0 fast-glob: 3.3.3 filenamify: 4.3.0 - jest: 29.7.0(@types/node@24.5.2) + jest: 29.7.0(@types/node@22.15.17) jest-dev-server: 10.1.4 jest-environment-jsdom: 29.7.0 jest-environment-node: 29.7.0 @@ -9933,8 +13720,8 @@ snapshots: postcss-loader: 6.2.1(postcss@8.5.6)(webpack@5.101.3) prettier: wp-prettier@3.0.3 puppeteer-core: 23.11.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) react-refresh: 0.14.2 read-pkg-up: 7.0.1 resolve-bin: 0.4.3 @@ -9948,10 +13735,10 @@ snapshots: url-loader: 4.1.1(webpack@5.101.3) webpack: 5.101.3(webpack-cli@5.1.4) webpack-bundle-analyzer: 4.10.2 - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@5.1.4)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3) webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.3) optionalDependencies: - '@wordpress/env': 10.31.0(@types/node@24.5.2) + '@wordpress/env': 10.31.0(@types/node@22.15.17) transitivePeerDependencies: - '@rspack/core' - '@swc/core' @@ -9994,6 +13781,26 @@ snapshots: '@wordpress/warning@3.31.0': {} + '@wpengine/hwp-toolbar@file:packages/toolbar(react@19.2.0)': + optionalDependencies: + react: 19.2.0 + + '@wry/caches@1.0.1': + dependencies: + tslib: 2.8.1 + + '@wry/context@0.7.4': + dependencies: + tslib: 2.8.1 + + '@wry/equality@0.5.7': + dependencies: + tslib: 2.8.1 + + '@wry/trie@0.5.0': + dependencies: + tslib: 2.8.1 + '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -10038,6 +13845,11 @@ snapshots: agent-base@7.1.4: {} + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + ajv-errors@1.0.1(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -10187,6 +13999,8 @@ snapshots: arrify@1.0.1: {} + asap@2.0.6: {} + ast-types-flow@0.0.8: {} ast-types@0.13.4: @@ -10204,6 +14018,8 @@ snapshots: stubborn-fs: 1.2.5 when-exit: 2.1.4 + auto-bind@4.0.0: {} + autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.26.2 @@ -10222,7 +14038,7 @@ snapshots: axios@1.12.2: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.15.11(debug@4.4.3) form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -10378,6 +14194,12 @@ snapshots: binary-extensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -10531,6 +14353,19 @@ snapshots: chalk@5.4.1: {} + change-case-all@1.0.15: + dependencies: + change-case: 4.1.2 + is-lower-case: 2.0.2 + is-upper-case: 2.0.2 + lower-case: 2.0.2 + lower-case-first: 2.0.2 + sponge-case: 1.0.1 + swap-case: 2.0.2 + title-case: 3.0.3 + upper-case: 2.0.2 + upper-case-first: 2.0.2 + change-case@4.1.2: dependencies: camel-case: 4.1.2 @@ -10577,9 +14412,11 @@ snapshots: dependencies: readdirp: 4.1.2 + chownr@3.0.0: {} + chrome-launcher@1.2.0: dependencies: - '@types/node': 24.0.12 + '@types/node': 22.15.17 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.1 @@ -10604,16 +14441,29 @@ snapshots: cjs-module-lexer@1.4.3: {} + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + clean-stack@2.2.0: {} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 cli-spinners@2.9.2: {} + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + cli-width@3.0.0: {} cli-width@4.1.0: {} + client-only@0.0.1: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -10640,6 +14490,8 @@ snapshots: clone@1.0.4: {} + clsx@2.1.1: {} + co@4.6.0: {} collect-v8-coverage@1.0.2: {} @@ -10680,6 +14532,8 @@ snapshots: common-path-prefix@3.0.0: {} + common-tags@1.8.2: {} + compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -10780,6 +14634,21 @@ snapshots: optionalDependencies: typescript: 5.8.3 + create-jest@29.7.0(@types/node@22.15.17): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.15.17) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-jest@29.7.0(@types/node@24.5.2): dependencies: '@jest/types': 29.6.3 @@ -10795,12 +14664,24 @@ snapshots: - supports-color - ts-node + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-inspect@1.0.1: + dependencies: + tslib: 2.8.1 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + crypto-hash@3.1.0: {} + csp_evaluator@1.1.5: {} css-declaration-sorter@7.3.0(postcss@8.5.6): @@ -10914,6 +14795,8 @@ snapshots: damerau-levenshtein@1.0.8: {} + data-uri-to-buffer@4.0.1: {} + data-uri-to-buffer@6.0.2: {} data-urls@3.0.2: @@ -10942,8 +14825,12 @@ snapshots: dataloader@1.4.0: {} + dataloader@2.2.3: {} + debounce@1.2.1: {} + debounce@2.2.0: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -11022,6 +14909,8 @@ snapshots: depd@2.0.0: {} + dependency-graph@0.11.0: {} + destroy@1.2.0: {} detect-indent@6.1.0: {} @@ -11029,6 +14918,8 @@ snapshots: detect-libc@1.0.3: optional: true + detect-libc@2.1.2: {} + detect-newline@3.1.0: {} detect-node@2.1.0: {} @@ -11094,10 +14985,14 @@ snapshots: dependencies: type-fest: 4.41.0 + dotenv@16.4.7: {} + dotenv@16.6.1: {} dotenv@8.6.0: {} + dset@3.1.4: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -11259,6 +15154,35 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -11277,6 +15201,106 @@ snapshots: optionalDependencies: source-map: 0.6.1 + eslint-config-next@15.2.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3): + dependencies: + '@next/eslint-plugin-next': 15.2.0 + '@rushstack/eslint-patch': 1.13.0 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.37.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.37.0(jiti@2.6.1)) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-config-next@15.2.1(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3): + dependencies: + '@next/eslint-plugin-next': 15.2.1 + '@rushstack/eslint-patch': 1.13.0 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.37.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.37.0(jiti@2.6.1)) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-config-next@15.2.3(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3): + dependencies: + '@next/eslint-plugin-next': 15.2.3 + '@rushstack/eslint-patch': 1.13.0 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.37.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.37.0(jiti@2.6.1)) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-config-next@15.2.4(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3): + dependencies: + '@next/eslint-plugin-next': 15.2.4 + '@rushstack/eslint-patch': 1.13.0 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.37.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.37.0(jiti@2.6.1)) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-config-next@15.3.2(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3): + dependencies: + '@next/eslint-plugin-next': 15.3.2 + '@rushstack/eslint-patch': 1.13.0 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.37.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.37.0(jiti@2.6.1)) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + eslint-config-prettier@8.10.2(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -11289,17 +15313,72 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 9.37.0(jiti@2.6.1) + get-tsconfig: 4.12.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.37.0(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)))(eslint@9.37.0(jiti@2.6.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.37.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.37.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11308,9 +15387,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.37.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)))(eslint@9.37.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -11322,12 +15401,23 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + eslint: 8.57.1 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + jest: 29.7.0(@types/node@22.15.17) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.5.2))(typescript@5.8.3): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) @@ -11373,11 +15463,30 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-playwright@0.15.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.5.2))(typescript@5.8.3))(eslint@8.57.1): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.37.0(jiti@2.6.1)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.3 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.37.0(jiti@2.6.1) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-playwright@0.15.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3))(eslint@8.57.1): dependencies: eslint: 8.57.1 optionalDependencies: - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.5.2))(typescript@5.8.3) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.15.17))(typescript@5.8.3) eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(wp-prettier@3.0.3): dependencies: @@ -11393,6 +15502,10 @@ snapshots: dependencies: eslint: 8.57.1 + eslint-plugin-react-hooks@5.2.0(eslint@9.37.0(jiti@2.6.1)): + dependencies: + eslint: 9.37.0(jiti@2.6.1) + eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: array-includes: 3.1.9 @@ -11415,6 +15528,28 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 + eslint-plugin-react@7.37.5(eslint@9.37.0(jiti@2.6.1)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.37.0(jiti@2.6.1) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -11425,10 +15560,17 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) @@ -11472,6 +15614,54 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.37.0(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.4.0 + '@eslint/core': 0.16.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.37.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + espree@9.6.1: dependencies: acorn: 8.15.0 @@ -11597,6 +15787,14 @@ snapshots: fast-fifo@1.3.2: {} + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -11611,6 +15809,10 @@ snapshots: fast-uri@3.1.0: {} + fast-xml-parser@5.3.0: + dependencies: + strnum: 2.1.1 + fastest-levenshtein@1.0.16: {} fastq@1.19.1: @@ -11625,10 +15827,33 @@ snapshots: dependencies: bser: 2.1.1 + fbjs-css-vars@1.0.2: {} + + fbjs@3.0.5: + dependencies: + cross-fetch: 3.2.0 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.41 + transitivePeerDependencies: + - encoding + fd-slicer@1.1.0: dependencies: pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -11641,6 +15866,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + filename-reserved-regex@2.0.0: {} filenamify@4.3.0: @@ -11708,6 +15937,11 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + flat-cache@6.1.14: dependencies: cacheable: 2.0.1 @@ -11718,7 +15952,9 @@ snapshots: flatted@3.3.3: {} - follow-redirects@1.15.11: {} + follow-redirects@1.15.11(debug@4.4.3): + optionalDependencies: + debug: 4.4.3 for-each@0.3.5: dependencies: @@ -11745,6 +15981,10 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded-parse@2.1.2: {} forwarded@0.2.0: {} @@ -11828,6 +16068,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-tsconfig@4.12.0: + dependencies: + resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: dependencies: basic-ftp: 5.0.5 @@ -11894,6 +16138,8 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -11939,6 +16185,65 @@ snapshots: graphemer@1.4.0: {} + graphql-config@5.1.5(@types/node@24.5.2)(graphql@16.10.0)(typescript@5.8.3): + dependencies: + '@graphql-tools/graphql-file-loader': 8.1.2(graphql@16.10.0) + '@graphql-tools/json-file-loader': 8.0.20(graphql@16.10.0) + '@graphql-tools/load': 8.1.2(graphql@16.10.0) + '@graphql-tools/merge': 9.1.1(graphql@16.10.0) + '@graphql-tools/url-loader': 8.0.33(@types/node@24.5.2)(graphql@16.10.0) + '@graphql-tools/utils': 10.9.1(graphql@16.10.0) + cosmiconfig: 8.3.6(typescript@5.8.3) + graphql: 16.10.0 + jiti: 2.6.1 + minimatch: 9.0.5 + string-env-interpolation: 1.0.1 + tslib: 2.8.1 + transitivePeerDependencies: + - '@fastify/websocket' + - '@types/node' + - bufferutil + - crossws + - supports-color + - typescript + - uWebSockets.js + - utf-8-validate + + graphql-request@6.1.0(graphql@16.10.0): + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + cross-fetch: 3.2.0 + graphql: 16.10.0 + transitivePeerDependencies: + - encoding + + graphql-tag@2.12.6(graphql@16.10.0): + dependencies: + graphql: 16.10.0 + tslib: 2.8.1 + + graphql-tag@2.12.6(graphql@16.11.0): + dependencies: + graphql: 16.11.0 + tslib: 2.8.1 + + graphql-ws@6.0.6(graphql@16.10.0)(ws@8.18.3): + dependencies: + graphql: 16.10.0 + optionalDependencies: + ws: 8.18.3 + + graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3): + dependencies: + graphql: 16.11.0 + optionalDependencies: + ws: 8.18.3 + optional: true + + graphql@16.10.0: {} + + graphql@16.11.0: {} + gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -11976,6 +16281,10 @@ snapshots: capital-case: 1.0.4 tslib: 2.8.1 + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 @@ -12046,7 +16355,7 @@ snapshots: http-proxy-middleware@2.0.9(@types/express@4.17.23): dependencies: '@types/http-proxy': 1.17.16 - http-proxy: 1.18.1 + http-proxy: 1.18.1(debug@4.4.3) is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.8 @@ -12055,10 +16364,21 @@ snapshots: transitivePeerDependencies: - debug - http-proxy@1.18.1: + http-proxy-middleware@3.0.5: + dependencies: + '@types/http-proxy': 1.17.16 + debug: 4.4.3 + http-proxy: 1.18.1(debug@4.4.3) + is-glob: 4.0.3 + is-plain-object: 5.0.0 + micromatch: 4.0.8 + transitivePeerDependencies: + - supports-color + + http-proxy@1.18.1(debug@4.4.3): dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.11 + follow-redirects: 1.15.11(debug@4.4.3) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -12118,6 +16438,8 @@ snapshots: image-ssim@0.2.0: {} + immutable@3.7.6: {} + immutable@5.1.3: {} import-fresh@3.3.1: @@ -12125,6 +16447,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-from@4.0.0: {} + import-in-the-middle@1.14.2: dependencies: acorn: 8.15.0 @@ -12170,6 +16494,26 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 + inquirer@8.2.7(@types/node@24.5.2): + dependencies: + '@inquirer/external-editor': 1.0.2(@types/node@24.5.2) + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + transitivePeerDependencies: + - '@types/node' + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -12185,6 +16529,10 @@ snapshots: '@formatjs/icu-messageformat-parser': 2.11.2 tslib: 2.8.1 + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ip-address@9.0.5: dependencies: jsbn: 1.1.0 @@ -12196,6 +16544,11 @@ snapshots: irregular-plurals@3.5.0: {} + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -12231,6 +16584,10 @@ snapshots: dependencies: builtin-modules: 3.3.0 + is-bun-module@2.0.0: + dependencies: + semver: 7.7.2 + is-callable@1.2.7: {} is-core-module@2.16.1: @@ -12281,6 +16638,10 @@ snapshots: is-interactive@1.0.0: {} + is-lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -12315,6 +16676,10 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + is-set@2.0.3: {} is-shared-array-buffer@1.0.4: @@ -12342,8 +16707,16 @@ snapshots: dependencies: which-typed-array: 1.1.19 + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + is-unicode-supported@0.1.0: {} + is-upper-case@2.0.2: + dependencies: + tslib: 2.8.1 + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -12375,6 +16748,10 @@ snapshots: isobject@3.0.1: {} + isomorphic-ws@5.0.0(ws@8.18.3): + dependencies: + ws: 8.18.3 + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: @@ -12443,7 +16820,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0 @@ -12463,6 +16840,25 @@ snapshots: - babel-plugin-macros - supports-color + jest-cli@29.7.0(@types/node@22.15.17): + dependencies: + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.15.17) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.15.17) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest-cli@29.7.0(@types/node@24.5.2): dependencies: '@jest/core': 29.7.0 @@ -12475,12 +16871,42 @@ snapshots: jest-config: 29.7.0(@types/node@24.5.2) jest-util: 29.7.0 jest-validate: 29.7.0 - yargs: 17.7.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@22.15.17): + dependencies: + '@babel/core': 7.25.7 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.7) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.15.17 transitivePeerDependencies: - - '@types/node' - babel-plugin-macros - supports-color - - ts-node jest-config@29.7.0(@types/node@24.5.2): dependencies: @@ -12549,7 +16975,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 24.5.2 + '@types/node': 22.15.17 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -12563,7 +16989,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -12573,7 +16999,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 24.5.2 + '@types/node': 22.15.17 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -12612,7 +17038,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -12647,7 +17073,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -12675,7 +17101,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -12721,7 +17147,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -12740,7 +17166,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 22.15.17 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -12749,17 +17175,29 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 24.5.2 + '@types/node': 22.15.17 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 + jest@29.7.0(@types/node@22.15.17): + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.15.17) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest@29.7.0(@types/node@24.5.2): dependencies: '@jest/core': 29.7.0 @@ -12772,6 +17210,10 @@ snapshots: - supports-color - ts-node + jiti@1.21.7: {} + + jiti@2.6.1: {} + joi@18.0.1: dependencies: '@hapi/address': 5.1.1 @@ -12782,6 +17224,8 @@ snapshots: '@hapi/topo': 6.0.2 '@standard-schema/spec': 1.0.0 + jose@5.10.0: {} + jpeg-js@0.4.4: {} js-library-detector@6.7.0: {} @@ -12848,6 +17292,11 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-to-pretty-yaml@1.2.2: + dependencies: + remedial: 1.0.8 + remove-trailing-spaces: 1.0.9 + json2php@0.0.7: {} json2php@0.0.9: {} @@ -12968,6 +17417,51 @@ snapshots: - supports-color - utf-8-validate + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -12976,6 +17470,19 @@ snapshots: dependencies: uc.micro: 1.0.6 + listr2@4.0.5(enquirer@2.4.1): + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.4.1 + rxjs: 7.8.2 + through: 2.3.8 + wrap-ansi: 7.0.0 + optionalDependencies: + enquirer: 2.4.1 + loader-runner@4.3.0: {} loader-utils@2.0.4: @@ -13004,6 +17511,8 @@ snapshots: lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} + lodash.startcase@4.4.0: {} lodash.truncate@4.4.2: {} @@ -13021,6 +17530,13 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-update@4.0.0: + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + loglevel@1.9.2: {} lookup-closest-locale@6.2.0: {} @@ -13029,6 +17545,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + lower-case-first@2.0.2: + dependencies: + tslib: 2.8.1 + lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -13047,6 +17567,14 @@ snapshots: lru-cache@7.18.3: {} + lucide-react@0.477.0(react@19.2.0): + dependencies: + react: 19.2.0 + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@4.0.0: dependencies: semver: 7.7.2 @@ -13055,6 +17583,8 @@ snapshots: dependencies: tmpl: 1.0.5 + map-cache@0.2.2: {} + map-obj@1.0.1: {} map-obj@4.3.0: {} @@ -13144,6 +17674,10 @@ snapshots: merge2@1.4.1: {} + meros@1.3.2(@types/node@24.5.2): + optionalDependencies: + '@types/node': 24.5.2 + metaviewport-parser@0.3.0: {} methods@1.1.2: {} @@ -13211,6 +17745,10 @@ snapshots: minipass@7.1.2: {} + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mitt@3.0.1: {} mixin-object@2.0.1: @@ -13243,6 +17781,8 @@ snapshots: nanoid@3.3.11: {} + napi-postinstall@0.3.4: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -13253,6 +17793,91 @@ snapshots: netmask@2.0.2: {} + next-http-proxy-middleware@1.2.7: + dependencies: + '@types/http-proxy': 1.17.3 + http-proxy: 1.18.1(debug@4.4.3) + transitivePeerDependencies: + - debug + + next@15.4.7(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1): + dependencies: + '@next/env': 15.4.7 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001743 + postcss: 8.4.31 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + styled-jsx: 5.1.6(@babel/core@7.25.7)(react@19.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.4.7 + '@next/swc-darwin-x64': 15.4.7 + '@next/swc-linux-arm64-gnu': 15.4.7 + '@next/swc-linux-arm64-musl': 15.4.7 + '@next/swc-linux-x64-gnu': 15.4.7 + '@next/swc-linux-x64-musl': 15.4.7 + '@next/swc-win32-arm64-msvc': 15.4.7 + '@next/swc-win32-x64-msvc': 15.4.7 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.55.0 + sass: 1.92.1 + sharp: 0.34.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@15.5.4(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1): + dependencies: + '@next/env': 15.5.4 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001743 + postcss: 8.4.31 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + styled-jsx: 5.1.6(@babel/core@7.25.7)(react@19.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.4 + '@next/swc-darwin-x64': 15.5.4 + '@next/swc-linux-arm64-gnu': 15.5.4 + '@next/swc-linux-arm64-musl': 15.5.4 + '@next/swc-linux-x64-gnu': 15.5.4 + '@next/swc-linux-x64-musl': 15.5.4 + '@next/swc-win32-arm64-msvc': 15.5.4 + '@next/swc-win32-x64-msvc': 15.5.4 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.55.0 + sass: 1.92.1 + sharp: 0.34.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.92.1): + dependencies: + '@next/env': 15.5.4 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001743 + postcss: 8.4.31 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + styled-jsx: 5.1.6(@babel/core@7.28.4)(react@19.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.4 + '@next/swc-darwin-x64': 15.5.4 + '@next/swc-linux-arm64-gnu': 15.5.4 + '@next/swc-linux-arm64-musl': 15.5.4 + '@next/swc-linux-x64-gnu': 15.5.4 + '@next/swc-linux-x64-musl': 15.5.4 + '@next/swc-win32-arm64-msvc': 15.5.4 + '@next/swc-win32-x64-msvc': 15.5.4 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.55.0 + sass: 1.92.1 + sharp: 0.34.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -13261,10 +17886,18 @@ snapshots: node-addon-api@7.1.1: optional: true + node-domexception@1.0.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-forge@1.3.1: {} node-int64@0.4.0: {} @@ -13285,6 +17918,10 @@ snapshots: semver: 7.7.2 validate-npm-package-license: 3.0.4 + normalize-path@2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -13335,6 +17972,8 @@ snapshots: dependencies: boolbase: 1.0.0 + nullthrows@1.1.1: {} + nwsapi@2.2.22: {} object-assign@4.1.1: {} @@ -13412,6 +18051,13 @@ snapshots: opener@1.5.2: {} + optimism@0.18.1: + dependencies: + '@wry/caches': 1.0.1 + '@wry/context': 0.7.4 + '@wry/trie': 0.5.0 + tslib: 2.8.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -13432,6 +18078,18 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + os-homedir@1.0.2: {} os-tmpdir@1.0.2: {} @@ -13476,6 +18134,10 @@ snapshots: p-map@2.1.0: {} + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 @@ -13519,6 +18181,12 @@ snapshots: parse-cache-control@1.0.1: {} + parse-filepath@1.0.2: + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 @@ -13554,6 +18222,12 @@ snapshots: path-parse@1.0.7: {} + path-root-regex@0.1.2: {} + + path-root@0.1.1: + dependencies: + path-root-regex: 0.1.2 + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -13581,6 +18255,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.3: {} + pify@4.0.1: {} pirates@4.0.7: {} @@ -13815,6 +18491,12 @@ snapshots: postcss-value-parser@4.2.0: {} + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -13839,6 +18521,8 @@ snapshots: prettier@2.8.8: {} + prettier@3.6.2: {} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -13849,6 +18533,10 @@ snapshots: progress@2.0.3: {} + promise@7.3.1: + dependencies: + asap: 2.0.6 + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -13948,11 +18636,10 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - react-dom@18.3.1(react@18.3.1): + react-dom@19.2.0(react@19.2.0): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.2.0 + scheduler: 0.27.0 react-is@16.13.1: {} @@ -13964,6 +18651,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + react@19.2.0: {} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -14058,6 +18747,25 @@ snapshots: dependencies: jsesc: 3.0.2 + rehackt@0.1.0(@types/react@19.1.3)(react@19.2.0): + optionalDependencies: + '@types/react': 19.1.3 + react: 19.2.0 + + relay-runtime@12.0.0: + dependencies: + '@babel/runtime': 7.27.0 + fbjs: 3.0.5 + invariant: 2.2.4 + transitivePeerDependencies: + - encoding + + remedial@1.0.8: {} + + remove-trailing-separator@1.1.0: {} + + remove-trailing-spaces@1.0.9: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -14093,6 +18801,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.3: {} resolve@1.22.10: @@ -14120,6 +18830,8 @@ snapshots: reusify@1.1.0: {} + rfdc@1.4.1: {} + rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -14130,6 +18842,34 @@ snapshots: robots-parser@3.0.1: {} + rollup@4.52.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 + fsevents: 2.3.3 + rtlcss@4.3.0: dependencies: escalade: 3.2.0 @@ -14204,9 +18944,7 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.27.0: {} schema-utils@3.3.0: dependencies: @@ -14221,6 +18959,8 @@ snapshots: ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) + scuid@1.1.0: {} + select-hose@2.0.0: {} selfsigned@2.4.1: @@ -14305,6 +19045,8 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + setimmediate@1.0.5: {} + setprototypeof@1.1.0: {} setprototypeof@1.2.0: {} @@ -14320,6 +19062,36 @@ snapshots: dependencies: kind-of: 6.0.3 + sharp@0.34.4: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -14362,6 +19134,8 @@ snapshots: signal-exit@4.1.0: {} + signedsource@1.0.0: {} + simple-git@3.28.0: dependencies: '@kwsites/file-exists': 1.1.1 @@ -14382,6 +19156,12 @@ snapshots: slash@4.0.0: {} + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 @@ -14489,14 +19269,20 @@ snapshots: speedline-core@1.4.3: dependencies: - '@types/node': 24.0.12 + '@types/node': 22.15.17 image-ssim: 0.2.0 jpeg-js: 0.4.4 + sponge-case@1.0.1: + dependencies: + tslib: 2.8.1 + sprintf-js@1.0.3: {} sprintf-js@1.1.3: {} + stable-hash@0.0.5: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -14519,6 +19305,8 @@ snapshots: optionalDependencies: bare-events: 2.7.0 + string-env-interpolation@1.0.1: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -14618,10 +19406,26 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + strnum@2.1.1: {} + stubborn-fs@1.2.5: {} style-search@0.1.0: {} + styled-jsx@5.1.6(@babel/core@7.25.7)(react@19.2.0): + dependencies: + client-only: 0.0.1 + react: 19.2.0 + optionalDependencies: + '@babel/core': 7.25.7 + + styled-jsx@5.1.6(@babel/core@7.28.4)(react@19.2.0): + dependencies: + client-only: 0.0.1 + react: 19.2.0 + optionalDependencies: + '@babel/core': 7.28.4 + stylehacks@6.1.1(postcss@8.5.6): dependencies: browserslist: 4.26.2 @@ -14735,8 +19539,20 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 + swap-case@2.0.2: + dependencies: + tslib: 2.8.1 + + symbol-observable@4.0.0: {} + symbol-tree@3.2.4: {} + sync-fetch@0.6.0-2: + dependencies: + node-fetch: 3.3.2 + timeout-signal: 2.0.0 + whatwg-mimetype: 4.0.0 + synckit@0.11.11: dependencies: '@pkgr/core': 0.2.9 @@ -14749,6 +19565,14 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + tailwind-merge@3.3.1: {} + + tailwindcss-animate@1.0.7(tailwindcss@4.1.14): + dependencies: + tailwindcss: 4.1.14 + + tailwindcss@4.1.14: {} + tapable@2.2.3: {} tar-fs@3.1.1: @@ -14767,6 +19591,14 @@ snapshots: fast-fifo: 1.3.2 streamx: 2.22.1 + tar@7.5.1: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + term-size@2.2.1: {} terminal-link@2.1.1: @@ -14812,6 +19644,17 @@ snapshots: thunky@1.1.0: {} + timeout-signal@2.0.0: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + title-case@3.0.3: + dependencies: + tslib: 2.8.1 + tldts-core@6.1.86: {} tldts-icann@6.1.86: @@ -14861,6 +19704,12 @@ snapshots: dependencies: typescript: 5.8.3 + ts-invariant@0.10.3: + dependencies: + tslib: 2.8.1 + + ts-log@2.2.7: {} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -14870,6 +19719,8 @@ snapshots: tslib@1.14.1: {} + tslib@2.6.3: {} + tslib@2.8.1: {} tsutils@3.21.0(typescript@5.8.3): @@ -14941,6 +19792,8 @@ snapshots: typescript@5.8.3: {} + ua-parser-js@1.0.41: {} + uc.micro@1.0.6: {} unbox-primitive@1.1.0: @@ -14955,9 +19808,12 @@ snapshots: buffer: 5.7.1 through: 2.3.8 - undici-types@7.12.0: {} + unc-path-regex@0.1.2: {} - undici-types@7.8.0: {} + undici-types@6.21.0: {} + + undici-types@7.12.0: + optional: true unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -14974,8 +19830,36 @@ snapshots: universalify@0.2.0: {} + unixify@1.0.0: + dependencies: + normalize-path: 2.1.1 + unpipe@1.0.0: {} + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: browserslist: 4.26.2 @@ -15006,6 +19890,14 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 + urlpattern-polyfill@10.1.0: {} + + urql@4.2.2(@urql/core@5.2.0(graphql@16.11.0))(react@19.2.0): + dependencies: + '@urql/core': 5.2.0(graphql@16.11.0) + react: 19.2.0 + wonka: 6.3.5 + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -15027,6 +19919,23 @@ snapshots: vary@1.1.2: {} + vite@6.3.6(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.0): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.4 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.5.2 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + sass: 1.92.1 + terser: 5.44.0 + yaml: 2.8.0 + w3c-xmlserializer@4.0.0: dependencies: xml-name-validator: 4.0.0 @@ -15058,6 +19967,8 @@ snapshots: dependencies: defaults: 1.0.4 + web-streams-polyfill@3.3.3: {} + web-vitals@4.2.4: {} webidl-conversions@3.0.1: {} @@ -15082,7 +19993,7 @@ snapshots: - bufferutil - utf-8-validate - webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@5.1.4)): + webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3): dependencies: '@discoveryjs/json-ext': 0.5.7 '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack@5.101.3) @@ -15145,7 +20056,7 @@ snapshots: ws: 8.18.3 optionalDependencies: webpack: 5.101.3(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@5.1.4)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3) transitivePeerDependencies: - bufferutil - debug @@ -15188,7 +20099,7 @@ snapshots: watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@5.1.4)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack-dev-server@5.2.2)(webpack@5.101.3) transitivePeerDependencies: - '@swc/core' - esbuild @@ -15208,6 +20119,8 @@ snapshots: whatwg-mimetype@3.0.0: {} + whatwg-mimetype@4.0.0: {} + whatwg-url@11.0.0: dependencies: tr46: 3.0.0 @@ -15271,6 +20184,8 @@ snapshots: wildcard@2.0.1: {} + wonka@6.3.5: {} + word-wrap@1.2.5: {} wp-prettier@3.0.3: {} @@ -15327,6 +20242,10 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + + yaml-ast-parser@0.0.43: {} + yaml@1.10.2: {} yaml@2.8.0: {} @@ -15356,6 +20275,12 @@ snapshots: yoctocolors-cjs@2.1.2: {} + zen-observable-ts@1.2.5: + dependencies: + zen-observable: 0.8.15 + + zen-observable@0.8.15: {} + zod@3.23.8: {} zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3e195dbf..6bfbe867 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,5 @@ packages: - 'packages/*' - 'plugins/*' + - 'examples/next/*/example-app' + - 'examples/vanilla/*/example-app' From e16a6f596a8e226e6a38ac239a979224f9ece067 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 09:12:03 -0400 Subject: [PATCH 09/44] feat(plugins): Add modular headless WordPress plugins Introduces three reusable, single-responsibility plugins for headless WordPress development: - hwp-cors-local: Enables CORS headers for local development environments - hwp-frontend-links: Adds "View on Frontend" links to WordPress admin interface - hwp-wp-env-helpers: Fixes wp-env REST API routing quirks Each plugin is independently configurable via HEADLESS_FRONTEND_URL constant and can be used standalone or in combination based on project needs. --- plugins/hwp-cors-local/README.md | 73 ++++++++++ plugins/hwp-cors-local/hwp-cors-local.php | 77 ++++++++++ plugins/hwp-frontend-links/README.md | 107 ++++++++++++++ .../hwp-frontend-links/hwp-frontend-links.php | 133 ++++++++++++++++++ plugins/hwp-wp-env-helpers/README.md | 46 ++++++ .../hwp-wp-env-helpers/hwp-wp-env-helpers.php | 53 +++++++ 6 files changed, 489 insertions(+) create mode 100644 plugins/hwp-cors-local/README.md create mode 100644 plugins/hwp-cors-local/hwp-cors-local.php create mode 100644 plugins/hwp-frontend-links/README.md create mode 100644 plugins/hwp-frontend-links/hwp-frontend-links.php create mode 100644 plugins/hwp-wp-env-helpers/README.md create mode 100644 plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php diff --git a/plugins/hwp-cors-local/README.md b/plugins/hwp-cors-local/README.md new file mode 100644 index 00000000..bf6ed733 --- /dev/null +++ b/plugins/hwp-cors-local/README.md @@ -0,0 +1,73 @@ +# HWP CORS Local + +Enables CORS (Cross-Origin Resource Sharing) headers for local headless WordPress development environments. + +## Purpose + +Allows frontend applications running on different ports or domains to access WordPress REST API endpoints during local development. + +## Requirements + +- WordPress 6.0+ +- PHP 7.4+ + +## Configuration + +Define the frontend URL using the `HEADLESS_FRONTEND_URL` constant in `wp-config.php` or via wp-env: + +```php +define( 'HEADLESS_FRONTEND_URL', 'http://localhost:3000' ); +``` + +Or in `.wp-env.json`: + +```json +{ + "config": { + "HEADLESS_FRONTEND_URL": "http://localhost:3000" + } +} +``` + +## Behavior + +- Only activates when `WP_ENVIRONMENT_TYPE` is `local` or `WP_DEBUG` is `true` +- Does not apply CORS headers if `HEADLESS_FRONTEND_URL` is not defined +- Handles preflight OPTIONS requests automatically +- Allows credentials and common HTTP methods (GET, POST, OPTIONS, PUT, DELETE) + +## Headers Added + +- `Access-Control-Allow-Origin`: Set to `HEADLESS_FRONTEND_URL` value +- `Access-Control-Allow-Methods`: GET, POST, OPTIONS, PUT, DELETE +- `Access-Control-Allow-Credentials`: true +- `Access-Control-Allow-Headers`: Content-Type, Authorization, X-Requested-With + +## Security + +This plugin should only be used in local development environments. It is automatically disabled in production when: +- `WP_ENVIRONMENT_TYPE` is not `local` +- `WP_DEBUG` is `false` + +## Installation + +### Via wp-env + +Add to `.wp-env.json`: + +```json +{ + "plugins": [ + "./path/to/hwp-cors-local" + ] +} +``` + +### Manual Installation + +1. Copy the plugin directory to `wp-content/plugins/` or `wp-content/mu-plugins/` +2. Activate from WordPress admin (if installed as regular plugin) + +## License + +GPL-2.0-or-later diff --git a/plugins/hwp-cors-local/hwp-cors-local.php b/plugins/hwp-cors-local/hwp-cors-local.php new file mode 100644 index 00000000..4c791d8a --- /dev/null +++ b/plugins/hwp-cors-local/hwp-cors-local.php @@ -0,0 +1,77 @@ +post_type === 'product' ) { + return '/shop/' . $post->post_name; + } + + return $path; +}, 10, 2 ); +``` + +### Example Patterns + +```php +// Use post ID instead of slug +add_filter( 'hwp_frontend_links_post_path', function( $path, $post ) { + return '/post/' . $post->ID; +}, 10, 2 ); + +// Include post type in path +add_filter( 'hwp_frontend_links_post_path', function( $path, $post ) { + return '/' . $post->post_type . '/' . $post->post_name; +}, 10, 2 ); +``` + +## Installation + +### Via wp-env + +Add to `.wp-env.json`: + +```json +{ + "plugins": [ + "./path/to/hwp-frontend-links" + ] +} +``` + +### Manual Installation + +1. Copy the plugin directory to `wp-content/plugins/` +2. Activate from WordPress admin + +## Behavior + +- Does not display links if `HEADLESS_FRONTEND_URL` is not defined +- Only shows admin bar link on singular post/page views +- Row actions appear on all posts and pages list screens + +## License + +GPL-2.0-or-later diff --git a/plugins/hwp-frontend-links/hwp-frontend-links.php b/plugins/hwp-frontend-links/hwp-frontend-links.php new file mode 100644 index 00000000..1c67363c --- /dev/null +++ b/plugins/hwp-frontend-links/hwp-frontend-links.php @@ -0,0 +1,133 @@ +post_name, $post ); + + return $frontend_url . $path; +} + +/** + * Add "View on Frontend" link to admin bar + * + * @param \WP_Admin_Bar $wp_admin_bar The admin bar instance + */ +function add_admin_bar_link( $wp_admin_bar ) { + if ( ! get_frontend_url() ) { + return; + } + + // Only show for singular posts/pages + if ( ! is_singular() ) { + return; + } + + global $post; + + $frontend_url = build_frontend_url( $post ); + + if ( ! $frontend_url ) { + return; + } + + $wp_admin_bar->add_node( [ + 'id' => 'hwp-view-on-frontend', + 'parent' => null, + 'group' => null, + 'title' => __( 'View on Frontend', 'hwp-frontend-links' ), + 'href' => $frontend_url, + 'meta' => [ + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'title' => __( 'View this content on the headless frontend', 'hwp-frontend-links' ), + ], + ] ); +} + +/** + * Add frontend link to post row actions + * + * @param array $actions An array of row action links + * @param \WP_Post $post The post object + * @return array Modified actions array + */ +function add_post_row_action( $actions, $post ) { + $frontend_url = build_frontend_url( $post ); + + if ( ! $frontend_url ) { + return $actions; + } + + $actions['hwp_view_frontend'] = sprintf( + '%s', + esc_url( $frontend_url ), + __( 'View on Frontend', 'hwp-frontend-links' ) + ); + + return $actions; +} + +/** + * Initialize the plugin + */ +function init() { + // Only add frontend links if configured + if ( ! get_frontend_url() ) { + return; + } + + // Add admin bar link + add_action( 'admin_bar_menu', __NAMESPACE__ . '\\add_admin_bar_link', 100 ); + + // Add row actions for posts + add_filter( 'post_row_actions', __NAMESPACE__ . '\\add_post_row_action', 10, 2 ); + add_filter( 'page_row_actions', __NAMESPACE__ . '\\add_post_row_action', 10, 2 ); +} + +init(); diff --git a/plugins/hwp-wp-env-helpers/README.md b/plugins/hwp-wp-env-helpers/README.md new file mode 100644 index 00000000..461ada01 --- /dev/null +++ b/plugins/hwp-wp-env-helpers/README.md @@ -0,0 +1,46 @@ +# HWP WP-Env Helpers + +Fixes WordPress environment quirks specific to wp-env development environments. + +## Purpose + +Resolves REST API routing issues in wp-env by forcing the use of `?rest_route=` query parameter format instead of permalink-based routing. This prevents .htaccess-related conflicts in Docker environments. + +## Requirements + +- WordPress 6.0+ +- PHP 7.4+ + +## Behavior + +- Only activates when `WP_ENVIRONMENT_TYPE` is `local` +- Forces all REST API URLs to use query parameter format: `http://localhost:8888/?rest_route=/wp/v2/posts` +- Prevents permalink-based format: `http://localhost:8888/wp-json/wp/v2/posts` +- Automatically applied to all `rest_url()` calls throughout WordPress + +## Technical Details + +Hooks into the `rest_url` filter to transform REST API URLs. This ensures consistent REST API access in wp-env environments where permalink routing may not function correctly due to Docker volume mount behavior with `.htaccess` files. + +## Installation + +### Via wp-env + +Add to `.wp-env.json`: + +```json +{ + "plugins": [ + "./path/to/hwp-wp-env-helpers" + ] +} +``` + +### Manual Installation + +1. Copy the plugin directory to `wp-content/plugins/` or `wp-content/mu-plugins/` +2. Activate from WordPress admin (if installed as regular plugin) + +## License + +GPL-2.0-or-later diff --git a/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php b/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php new file mode 100644 index 00000000..993ecf99 --- /dev/null +++ b/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php @@ -0,0 +1,53 @@ + Date: Thu, 9 Oct 2025 09:12:18 -0400 Subject: [PATCH 10/44] refactor(examples): Use production WordPress URL pattern with modular plugins Updates toolbar demo examples to use production-ready configuration: - WP_HOME points to WordPress instance (not frontend) - HEADLESS_FRONTEND_URL configured separately for frontend application - Replaces mu-plugin template approach with modular plugin references - Updates PHP version to 8.3 - Removes mu-plugin mapping in favor of standard plugin loading This allows WordPress to remain fully functional while supporting headless architecture, and enables composable plugin usage across different projects. --- .../next/toolbar-demo/scripts/setup-env.js | 12 +++++--- examples/vanilla/toolbar-demo/.wp-env.json | 6 ++-- .../vanilla/toolbar-demo/scripts/setup-env.js | 12 +++++--- scripts/templates/mu-plugin.php | 28 +++++++++++++++++-- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/examples/next/toolbar-demo/scripts/setup-env.js b/examples/next/toolbar-demo/scripts/setup-env.js index 99bb6b46..c084286a 100755 --- a/examples/next/toolbar-demo/scripts/setup-env.js +++ b/examples/next/toolbar-demo/scripts/setup-env.js @@ -29,20 +29,24 @@ console.log(` WP Test: ${ports.WP_TEST_PORT}`); // Update .wp-env.json const wpEnvConfig = { - phpVersion: '8.0', + phpVersion: '8.3', plugins: [ - 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip' + 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip', + '../../../../plugins/hwp-cors-local', + '../../../../plugins/hwp-frontend-links', + '../../../../plugins/hwp-wp-env-helpers' ], config: { WP_DEBUG: true, WP_DEBUG_LOG: true, - GRAPHQL_DEBUG: true + GRAPHQL_DEBUG: true, + WP_HOME: `http://localhost:${ports.WP_PORT}`, + HEADLESS_FRONTEND_URL: `http://localhost:${ports.FRONTEND_PORT}` }, port: ports.WP_PORT, testsPort: ports.WP_TEST_PORT, mappings: { db: './wp-env/db', - 'wp-content/mu-plugins': './mu-plugin.php', '.htaccess': './.htaccess' }, lifecycleScripts: { diff --git a/examples/vanilla/toolbar-demo/.wp-env.json b/examples/vanilla/toolbar-demo/.wp-env.json index cfc9242d..b42d5288 100644 --- a/examples/vanilla/toolbar-demo/.wp-env.json +++ b/examples/vanilla/toolbar-demo/.wp-env.json @@ -1,12 +1,14 @@ { - "phpVersion": "8.0", + "phpVersion": "8.3", "plugins": [ "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip" ], "config": { "WP_DEBUG": true, "WP_DEBUG_LOG": true, - "GRAPHQL_DEBUG": true + "GRAPHQL_DEBUG": true, + "WP_HOME": "http://localhost:8644", + "HEADLESS_FRONTEND_URL": "http://localhost:3644" }, "port": 8644, "testsPort": 8645, diff --git a/examples/vanilla/toolbar-demo/scripts/setup-env.js b/examples/vanilla/toolbar-demo/scripts/setup-env.js index 53f6f136..847eb199 100755 --- a/examples/vanilla/toolbar-demo/scripts/setup-env.js +++ b/examples/vanilla/toolbar-demo/scripts/setup-env.js @@ -29,20 +29,24 @@ console.log(` WP Test: ${ports.WP_TEST_PORT}`); // Update .wp-env.json const wpEnvConfig = { - phpVersion: '8.0', + phpVersion: '8.3', plugins: [ - 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip' + 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip', + '../../../../plugins/hwp-cors-local', + '../../../../plugins/hwp-frontend-links', + '../../../../plugins/hwp-wp-env-helpers' ], config: { WP_DEBUG: true, WP_DEBUG_LOG: true, - GRAPHQL_DEBUG: true + GRAPHQL_DEBUG: true, + WP_HOME: `http://localhost:${ports.WP_PORT}`, + HEADLESS_FRONTEND_URL: `http://localhost:${ports.FRONTEND_PORT}` }, port: ports.WP_PORT, testsPort: ports.WP_TEST_PORT, mappings: { db: './wp-env/db', - 'wp-content/mu-plugins': './mu-plugin.php', '.htaccess': './.htaccess' }, lifecycleScripts: { diff --git a/scripts/templates/mu-plugin.php b/scripts/templates/mu-plugin.php index 9f540a5e..761943e0 100644 --- a/scripts/templates/mu-plugin.php +++ b/scripts/templates/mu-plugin.php @@ -1,7 +1,7 @@ post_name; + + $wp_admin_bar->add_node([ + 'id' => 'view-on-frontend', + 'title' => 'View on Frontend', + 'href' => $frontend_url, + 'meta' => [ + 'target' => '_blank' + ] + ]); +}, 100); From 481c20faf3aa992bb99e57878e5675e1eac6151c Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 09:22:50 -0400 Subject: [PATCH 11/44] fix(examples): Use absolute paths for plugin references in wp-env wp-env cannot resolve relative plugin paths from subdirectories. Changed setup-env.js to generate absolute paths using path.resolve() and path.join(), ensuring plugins load correctly in both vanilla and Next.js examples. Also added comprehensive implementation breakdown documentation. --- IMPLEMENTATION_BREAKDOWN.md | 302 ++++++++++++++++++ .../next/toolbar-demo/scripts/setup-env.js | 7 +- examples/vanilla/toolbar-demo/.wp-env.json | 6 +- .../vanilla/toolbar-demo/scripts/setup-env.js | 7 +- 4 files changed, 314 insertions(+), 8 deletions(-) create mode 100644 IMPLEMENTATION_BREAKDOWN.md diff --git a/IMPLEMENTATION_BREAKDOWN.md b/IMPLEMENTATION_BREAKDOWN.md new file mode 100644 index 00000000..94d6a6b6 --- /dev/null +++ b/IMPLEMENTATION_BREAKDOWN.md @@ -0,0 +1,302 @@ +# Headless WordPress Plugin Implementation - Breakdown + +## Overview + +Implemented a modular, production-ready plugin architecture for headless WordPress development, replacing template-based mu-plugins with composable, single-responsibility plugins. + +## What Was Done + +### 1. Created Three Modular WordPress Plugins + +#### `/plugins/hwp-cors-local/` +**Purpose**: Enables CORS headers for local development environments + +**Key Features**: +- Only activates when `WP_ENVIRONMENT_TYPE === 'local'` or `WP_DEBUG === true` +- Configurable via `HEADLESS_FRONTEND_URL` constant +- Handles preflight OPTIONS requests automatically +- Allows credentials and common HTTP methods (GET, POST, OPTIONS, PUT, DELETE) +- **No hardcoded ports** - fully dynamic configuration + +**Implementation**: +- Hooks into `rest_api_init` action +- Filters `rest_pre_serve_request` to add CORS headers +- Returns null and does nothing if `HEADLESS_FRONTEND_URL` not defined + +**Security**: Automatically disabled in production environments + +#### `/plugins/hwp-frontend-links/` +**Purpose**: Adds "View on Frontend" links to WordPress admin interface + +**Key Features**: +- Adds admin bar link on singular post/page views +- Adds row actions on Posts and Pages list screens +- Opens links in new tab with proper security attributes +- Fully customizable via `hwp_frontend_links_post_path` filter +- **No hardcoded ports** - fully dynamic configuration + +**Implementation**: +- Hooks into `admin_bar_menu` action (priority 100) +- Filters `post_row_actions` and `page_row_actions` +- Constructs URLs using `HEADLESS_FRONTEND_URL` constant + post slug +- Returns early if `HEADLESS_FRONTEND_URL` not defined + +**Customization Examples**: +```php +// Use post ID instead of slug +add_filter( 'hwp_frontend_links_post_path', function( $path, $post ) { + return '/post/' . $post->ID; +}, 10, 2 ); + +// Include post type in path +add_filter( 'hwp_frontend_links_post_path', function( $path, $post ) { + return '/' . $post->post_type . '/' . $post->post_name; +}, 10, 2 ); +``` + +#### `/plugins/hwp-wp-env-helpers/` +**Purpose**: Fixes wp-env quirks specific to Docker environments + +**Key Features**: +- Forces REST API to use `?rest_route=` query parameter format +- Prevents .htaccess-related conflicts in Docker environments +- Only activates when `WP_ENVIRONMENT_TYPE === 'local'` + +**Implementation**: +- Hooks into `rest_url` filter +- Transforms permalink-based REST URLs to query parameter format +- Example: `http://localhost:8888/wp-json/wp/v2/posts` → `http://localhost:8888/?rest_route=/wp/v2/posts` + +**Technical Details**: This solves Docker volume mount behavior issues where permalink routing may not function correctly. + +### 2. Updated WordPress URL Configuration Pattern + +**Previous Pattern** (Aggressive/Faust-like): +- `WP_HOME` pointed to frontend application +- WordPress would redirect to frontend +- Only works for specific use cases + +**New Pattern** (Production-Ready): +- `WP_HOME` points to WordPress instance itself (`http://localhost:8644`) +- `HEADLESS_FRONTEND_URL` configured separately (`http://localhost:3644`) +- WordPress remains fully functional and accessible +- Frontend application configured independently +- Supports true decoupled architecture + +**Configuration Example** (`.wp-env.json`): +```json +{ + "config": { + "WP_HOME": "http://localhost:8644", + "HEADLESS_FRONTEND_URL": "http://localhost:3644" + } +} +``` + +### 3. Updated Example Applications + +Both `examples/next/toolbar-demo` and `examples/vanilla/toolbar-demo` were updated: + +**Changes**: +- PHP version updated from 8.0 to 8.3 +- Removed mu-plugin template mapping +- Added modular plugin references in `.wp-env.json`: + ```json + { + "plugins": [ + "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip", + "../../../../plugins/hwp-cors-local", + "../../../../plugins/hwp-frontend-links", + "../../../../plugins/hwp-wp-env-helpers" + ] + } + ``` +- Updated `setup-env.js` to generate correct constants +- Removed mu-plugin generation code + +### 4. Created Professional Documentation + +Each plugin includes a formal technical README covering: +- Purpose and requirements +- Configuration instructions +- Behavior and technical details +- Installation methods (wp-env and manual) +- Customization examples (where applicable) +- License information + +**Documentation Standards**: +- No emojis +- Surgically succinct +- Technical and precise +- Aligned with project standards + +## Git Commits Created + +### Commit 1: `feat(plugins): Add modular headless WordPress plugins` +Added three reusable plugins: +- `plugins/hwp-cors-local/` (plugin file + README) +- `plugins/hwp-frontend-links/` (plugin file + README) +- `plugins/hwp-wp-env-helpers/` (plugin file + README) + +**File Count**: 6 files (3 PHP files + 3 README files) + +### Commit 2: `refactor(examples): Use production WordPress URL pattern with modular plugins` +Updated toolbar demo examples: +- `examples/next/toolbar-demo/scripts/setup-env.js` +- `examples/vanilla/toolbar-demo/scripts/setup-env.js` +- `examples/vanilla/toolbar-demo/.wp-env.json` +- `scripts/templates/mu-plugin.php` + +**Changes**: +- WP_HOME → WordPress instance +- HEADLESS_FRONTEND_URL → Frontend application +- Plugin references instead of mu-plugin mapping +- PHP 8.3 upgrade + +## Architecture Benefits + +### 1. Modularity +- Each plugin has single responsibility +- Plugins can be used independently or together +- Easy to add/remove based on project needs + +### 2. Reusability +- Plugins work in any headless WordPress project +- Not tied to specific example implementations +- Can be distributed via Packagist or GitHub + +### 3. Production-Ready +- WordPress remains fully functional +- No aggressive URL overriding +- Clear separation of concerns +- Environment-specific activation + +### 4. Dynamic Configuration +- **Zero hardcoded ports** +- All configuration via constants +- Works with any port assignment +- Automatic port calculation via `get-ports.js` + +### 5. Composability +- Mix and match plugins based on needs +- Filter hooks for customization +- Standard WordPress plugin architecture + +## Port Calculation System + +### How It Works +1. `scripts/get-ports.js` calculates unique ports per example +2. Based on hash of example path +3. Ensures no port conflicts between examples + +### Port Assignments +- **Vanilla Example**: + - Frontend: 3644 + - WordPress: 8644 + - WP Test: 8645 + +- **Next.js Example**: + - Frontend: 3975 + - WordPress: 8975 + - WP Test: 8976 + +### Dynamic Generation +- `setup-env.js` runs on every start +- Generates `.env` files for frontend +- Generates `.wp-env.json` for WordPress +- Injects correct ports into all configuration + +## Known Issues + +### Plugin Path Resolution +**Issue**: wp-env cannot resolve relative plugin paths from example subdirectories + +**Error Message**: +``` +Warning: The 'hwp-cors-local' plugin could not be found. +``` + +**Current Path**: `../../../../plugins/hwp-cors-local` + +**Possible Solutions**: +1. Use absolute paths in `.wp-env.json` +2. Symlink plugins into example directories +3. Publish plugins and use URLs (like WPGraphQL) +4. Update wp-env configuration strategy + +**Impact**: Plugins are not loading in wp-env, so CORS and frontend links features are not active + +### Frontend Port Shift +**Issue**: Vite detected port 3644 in use and shifted to 3645 + +**Impact**: Frontend running on different port than WordPress expects + +**Solution**: Ensure ports are available before starting, or update WordPress constant dynamically + +## Testing Performed + +### Configuration Generation +✅ Both examples generate correct `.wp-env.json` files +✅ Dynamic ports calculated correctly +✅ WP_HOME points to WordPress instance +✅ HEADLESS_FRONTEND_URL points to frontend + +### WordPress Startup +✅ WordPress containers start successfully +✅ WPGraphQL activates correctly +✅ Constants injected into wp-config.php +❌ Custom plugins fail to load (path resolution issue) + +### Frontend Startup +✅ Vite starts (on shifted port) +✅ Next.js would start similarly + +### Concurrently Integration +✅ Both WordPress and frontend start together +✅ Output displays both processes + +## Next Steps + +To complete implementation: + +1. **Fix Plugin Path Resolution** + - Investigate wp-env plugin loading mechanism + - Test absolute paths vs relative paths + - Consider symlinking or alternative approaches + +2. **Verify Plugin Functionality** + - Test CORS headers with frontend API calls + - Verify admin bar links appear + - Test REST API query parameter format + +3. **Test Frontend-Backend Communication** + - Make GraphQL requests from frontend + - Verify CORS allows requests + - Test toolbar integration + +4. **Documentation Updates** + - Add troubleshooting section to plugin READMEs + - Document wp-env path resolution behavior + - Create integration examples + +## Files Modified + +### New Files Created +- `/plugins/hwp-cors-local/hwp-cors-local.php` +- `/plugins/hwp-cors-local/README.md` +- `/plugins/hwp-frontend-links/hwp-frontend-links.php` +- `/plugins/hwp-frontend-links/README.md` +- `/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php` +- `/plugins/hwp-wp-env-helpers/README.md` + +### Files Modified +- `/examples/next/toolbar-demo/scripts/setup-env.js` +- `/examples/vanilla/toolbar-demo/scripts/setup-env.js` +- `/examples/vanilla/toolbar-demo/.wp-env.json` (generated) +- `/scripts/templates/mu-plugin.php` + +## Summary + +Successfully created a modular, production-ready plugin architecture for headless WordPress development. The implementation follows WordPress best practices, uses single-responsibility plugins, provides complete documentation, and eliminates all hardcoded configuration. The system is fully dynamic, reusable across projects, and composable based on specific needs. + +The main remaining task is resolving wp-env's plugin path resolution to enable the plugins to load correctly in the development environment. diff --git a/examples/next/toolbar-demo/scripts/setup-env.js b/examples/next/toolbar-demo/scripts/setup-env.js index c084286a..66579329 100755 --- a/examples/next/toolbar-demo/scripts/setup-env.js +++ b/examples/next/toolbar-demo/scripts/setup-env.js @@ -28,13 +28,14 @@ console.log(` WordPress: ${ports.WP_PORT}`); console.log(` WP Test: ${ports.WP_TEST_PORT}`); // Update .wp-env.json +const pluginsDir = path.resolve(__dirname, '../../../../plugins'); const wpEnvConfig = { phpVersion: '8.3', plugins: [ 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip', - '../../../../plugins/hwp-cors-local', - '../../../../plugins/hwp-frontend-links', - '../../../../plugins/hwp-wp-env-helpers' + path.join(pluginsDir, 'hwp-cors-local'), + path.join(pluginsDir, 'hwp-frontend-links'), + path.join(pluginsDir, 'hwp-wp-env-helpers') ], config: { WP_DEBUG: true, diff --git a/examples/vanilla/toolbar-demo/.wp-env.json b/examples/vanilla/toolbar-demo/.wp-env.json index b42d5288..64f85905 100644 --- a/examples/vanilla/toolbar-demo/.wp-env.json +++ b/examples/vanilla/toolbar-demo/.wp-env.json @@ -1,7 +1,10 @@ { "phpVersion": "8.3", "plugins": [ - "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip" + "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip", + "/Users/joe.fusco/Documents/GitHub/hwptoolkit/plugins/hwp-cors-local", + "/Users/joe.fusco/Documents/GitHub/hwptoolkit/plugins/hwp-frontend-links", + "/Users/joe.fusco/Documents/GitHub/hwptoolkit/plugins/hwp-wp-env-helpers" ], "config": { "WP_DEBUG": true, @@ -14,7 +17,6 @@ "testsPort": 8645, "mappings": { "db": "./wp-env/db", - "wp-content/mu-plugins": "./mu-plugin.php", ".htaccess": "./.htaccess" }, "lifecycleScripts": { diff --git a/examples/vanilla/toolbar-demo/scripts/setup-env.js b/examples/vanilla/toolbar-demo/scripts/setup-env.js index 847eb199..eb65f037 100755 --- a/examples/vanilla/toolbar-demo/scripts/setup-env.js +++ b/examples/vanilla/toolbar-demo/scripts/setup-env.js @@ -28,13 +28,14 @@ console.log(` WordPress: ${ports.WP_PORT}`); console.log(` WP Test: ${ports.WP_TEST_PORT}`); // Update .wp-env.json +const pluginsDir = path.resolve(__dirname, '../../../../plugins'); const wpEnvConfig = { phpVersion: '8.3', plugins: [ 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip', - '../../../../plugins/hwp-cors-local', - '../../../../plugins/hwp-frontend-links', - '../../../../plugins/hwp-wp-env-helpers' + path.join(pluginsDir, 'hwp-cors-local'), + path.join(pluginsDir, 'hwp-frontend-links'), + path.join(pluginsDir, 'hwp-wp-env-helpers') ], config: { WP_DEBUG: true, From 4f090de7edb6082450fee6ecbc9679b37240f90f Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 09:34:04 -0400 Subject: [PATCH 12/44] fix(examples): Ensure WordPress and frontend start concurrently Updated example:start scripts in both toolbar demos to use concurrently properly. WordPress and frontend now start together using concurrently, with a 5 second delay on frontend to ensure WordPress completes startup. Changes: - Separated wp-env setup (npm install) into wp:ensure script - Modified wp:start to only run wp-env start (no blocking npm install) - Used concurrently to run both services in parallel - Added sleep 5 before frontend start to allow wp-env initialization --- examples/next/toolbar-demo/package.json | 5 +++-- examples/vanilla/toolbar-demo/package.json | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/next/toolbar-demo/package.json b/examples/next/toolbar-demo/package.json index 59b3c358..5b3ddb1a 100644 --- a/examples/next/toolbar-demo/package.json +++ b/examples/next/toolbar-demo/package.json @@ -6,9 +6,10 @@ "scripts": { "example:dev": "npm --prefix ./example-app run dev", "example:build": "npm --prefix ./example-app run build", - "example:start": "node scripts/setup-env.js && concurrently \"npm run wp:start\" \"npm run example:dev\"", + "example:start": "node scripts/setup-env.js && npm run wp:ensure && concurrently \"npm run wp:start\" \"sleep 5 && npm run example:dev\"", "example:stop": "npm run wp:stop", - "wp:start": "npm install && wp-env start", + "wp:ensure": "npm install", + "wp:start": "wp-env start", "wp:stop": "wp-env stop", "wp:destroy": "wp-env destroy" }, diff --git a/examples/vanilla/toolbar-demo/package.json b/examples/vanilla/toolbar-demo/package.json index a027a03f..24920615 100644 --- a/examples/vanilla/toolbar-demo/package.json +++ b/examples/vanilla/toolbar-demo/package.json @@ -5,11 +5,12 @@ "scripts": { "example:build": "npm run example:dev:install && npm run wp:start && npm run example:start", "example:dev:install": "cd example-app && npm install && cd ..", - "example:start": "node scripts/setup-env.js && concurrently \"npm run wp:start\" \"npm run example:dev\"", + "example:start": "node scripts/setup-env.js && npm run wp:ensure && concurrently \"npm run wp:start\" \"sleep 5 && npm run example:dev\"", "example:stop": "npm run wp:stop", "example:prune": "wp-env destroy && npm run example:build && npm run example:start", "example:dev": "npm --prefix ./example-app run dev", - "wp:start": "npm install && wp-env start", + "wp:ensure": "npm install", + "wp:start": "wp-env start", "wp:stop": "wp-env stop", "wp:destroy": "wp-env destroy", "wp-env": "wp-env" From 7fcf1a8da2104d291139b08fe10340e82d777230 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 10:03:51 -0400 Subject: [PATCH 13/44] chore(examples): Remove obsolete mu-plugin infrastructure and improve DRY - Remove mu-plugin.php template and generation code - Use relative paths for plugin references (portable across machines) - Simplify npm scripts (inline npm install, remove wp:ensure) - Add .gitignore files to exclude generated files - Align both toolbar examples with consistent configuration --- examples/next/toolbar-demo/.gitignore | 17 ++++++ examples/next/toolbar-demo/package.json | 3 +- .../next/toolbar-demo/scripts/setup-env.js | 9 ---- examples/vanilla/toolbar-demo/.gitignore | 17 ++++++ examples/vanilla/toolbar-demo/.wp-env.json | 6 +-- examples/vanilla/toolbar-demo/package.json | 3 +- .../vanilla/toolbar-demo/scripts/setup-env.js | 16 ++---- scripts/templates/mu-plugin.php | 52 ------------------- 8 files changed, 42 insertions(+), 81 deletions(-) create mode 100644 examples/next/toolbar-demo/.gitignore create mode 100644 examples/vanilla/toolbar-demo/.gitignore delete mode 100644 scripts/templates/mu-plugin.php diff --git a/examples/next/toolbar-demo/.gitignore b/examples/next/toolbar-demo/.gitignore new file mode 100644 index 00000000..02ebcbde --- /dev/null +++ b/examples/next/toolbar-demo/.gitignore @@ -0,0 +1,17 @@ +# WordPress environment +wp-env/ +.wp-env.override.json + +# Generated files +.htaccess +mu-plugin.php + +# Dependencies +node_modules/ + +# Environment +.env +.env.local + +# OS +.DS_Store diff --git a/examples/next/toolbar-demo/package.json b/examples/next/toolbar-demo/package.json index 5b3ddb1a..8959d4f9 100644 --- a/examples/next/toolbar-demo/package.json +++ b/examples/next/toolbar-demo/package.json @@ -6,9 +6,8 @@ "scripts": { "example:dev": "npm --prefix ./example-app run dev", "example:build": "npm --prefix ./example-app run build", - "example:start": "node scripts/setup-env.js && npm run wp:ensure && concurrently \"npm run wp:start\" \"sleep 5 && npm run example:dev\"", + "example:start": "node scripts/setup-env.js && npm install && concurrently \"npm run wp:start\" \"sleep 5 && npm run example:dev\"", "example:stop": "npm run wp:stop", - "wp:ensure": "npm install", "wp:start": "wp-env start", "wp:stop": "wp-env stop", "wp:destroy": "wp-env destroy" diff --git a/examples/next/toolbar-demo/scripts/setup-env.js b/examples/next/toolbar-demo/scripts/setup-env.js index 66579329..b55f1f9e 100755 --- a/examples/next/toolbar-demo/scripts/setup-env.js +++ b/examples/next/toolbar-demo/scripts/setup-env.js @@ -60,15 +60,6 @@ fs.writeFileSync(wpEnvPath, JSON.stringify(wpEnvConfig, null, 2) + '\n'); console.log(`✓ Updated .wp-env.json`); -// Generate mu-plugin.php from template -const muPluginTemplatePath = path.join(__dirname, '../../../../scripts/templates/mu-plugin.php'); -const muPluginTemplate = fs.readFileSync(muPluginTemplatePath, 'utf8'); -const muPluginContent = muPluginTemplate.replace(/{{FRONTEND_PORT}}/g, ports.FRONTEND_PORT); - -const muPluginPath = path.join(__dirname, '../mu-plugin.php'); -fs.writeFileSync(muPluginPath, muPluginContent); -console.log(`✓ Generated mu-plugin.php`); - // Copy .htaccess from template const htaccessTemplatePath = path.join(__dirname, '../../../../scripts/templates/.htaccess'); const htaccessPath = path.join(__dirname, '../.htaccess'); diff --git a/examples/vanilla/toolbar-demo/.gitignore b/examples/vanilla/toolbar-demo/.gitignore new file mode 100644 index 00000000..02ebcbde --- /dev/null +++ b/examples/vanilla/toolbar-demo/.gitignore @@ -0,0 +1,17 @@ +# WordPress environment +wp-env/ +.wp-env.override.json + +# Generated files +.htaccess +mu-plugin.php + +# Dependencies +node_modules/ + +# Environment +.env +.env.local + +# OS +.DS_Store diff --git a/examples/vanilla/toolbar-demo/.wp-env.json b/examples/vanilla/toolbar-demo/.wp-env.json index 64f85905..0253d731 100644 --- a/examples/vanilla/toolbar-demo/.wp-env.json +++ b/examples/vanilla/toolbar-demo/.wp-env.json @@ -2,9 +2,9 @@ "phpVersion": "8.3", "plugins": [ "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip", - "/Users/joe.fusco/Documents/GitHub/hwptoolkit/plugins/hwp-cors-local", - "/Users/joe.fusco/Documents/GitHub/hwptoolkit/plugins/hwp-frontend-links", - "/Users/joe.fusco/Documents/GitHub/hwptoolkit/plugins/hwp-wp-env-helpers" + "../../../../plugins/hwp-cors-local", + "../../../../plugins/hwp-frontend-links", + "../../../../plugins/hwp-wp-env-helpers" ], "config": { "WP_DEBUG": true, diff --git a/examples/vanilla/toolbar-demo/package.json b/examples/vanilla/toolbar-demo/package.json index 24920615..2c6c6f7f 100644 --- a/examples/vanilla/toolbar-demo/package.json +++ b/examples/vanilla/toolbar-demo/package.json @@ -5,11 +5,10 @@ "scripts": { "example:build": "npm run example:dev:install && npm run wp:start && npm run example:start", "example:dev:install": "cd example-app && npm install && cd ..", - "example:start": "node scripts/setup-env.js && npm run wp:ensure && concurrently \"npm run wp:start\" \"sleep 5 && npm run example:dev\"", + "example:start": "node scripts/setup-env.js && npm install && concurrently \"npm run wp:start\" \"sleep 5 && npm run example:dev\"", "example:stop": "npm run wp:stop", "example:prune": "wp-env destroy && npm run example:build && npm run example:start", "example:dev": "npm --prefix ./example-app run dev", - "wp:ensure": "npm install", "wp:start": "wp-env start", "wp:stop": "wp-env stop", "wp:destroy": "wp-env destroy", diff --git a/examples/vanilla/toolbar-demo/scripts/setup-env.js b/examples/vanilla/toolbar-demo/scripts/setup-env.js index eb65f037..bc50b562 100755 --- a/examples/vanilla/toolbar-demo/scripts/setup-env.js +++ b/examples/vanilla/toolbar-demo/scripts/setup-env.js @@ -28,14 +28,13 @@ console.log(` WordPress: ${ports.WP_PORT}`); console.log(` WP Test: ${ports.WP_TEST_PORT}`); // Update .wp-env.json -const pluginsDir = path.resolve(__dirname, '../../../../plugins'); const wpEnvConfig = { phpVersion: '8.3', plugins: [ 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip', - path.join(pluginsDir, 'hwp-cors-local'), - path.join(pluginsDir, 'hwp-frontend-links'), - path.join(pluginsDir, 'hwp-wp-env-helpers') + '../../../../plugins/hwp-cors-local', + '../../../../plugins/hwp-frontend-links', + '../../../../plugins/hwp-wp-env-helpers' ], config: { WP_DEBUG: true, @@ -60,15 +59,6 @@ fs.writeFileSync(wpEnvPath, JSON.stringify(wpEnvConfig, null, 2) + '\n'); console.log(`✓ Updated .wp-env.json`); -// Generate mu-plugin.php from template -const muPluginTemplatePath = path.join(__dirname, '../../../../scripts/templates/mu-plugin.php'); -const muPluginTemplate = fs.readFileSync(muPluginTemplatePath, 'utf8'); -const muPluginContent = muPluginTemplate.replace(/{{FRONTEND_PORT}}/g, ports.FRONTEND_PORT); - -const muPluginPath = path.join(__dirname, '../mu-plugin.php'); -fs.writeFileSync(muPluginPath, muPluginContent); -console.log(`✓ Generated mu-plugin.php`); - // Copy .htaccess from template const htaccessTemplatePath = path.join(__dirname, '../../../../scripts/templates/.htaccess'); const htaccessPath = path.join(__dirname, '../.htaccess'); diff --git a/scripts/templates/mu-plugin.php b/scripts/templates/mu-plugin.php deleted file mode 100644 index 761943e0..00000000 --- a/scripts/templates/mu-plugin.php +++ /dev/null @@ -1,52 +0,0 @@ -post_name; - - $wp_admin_bar->add_node([ - 'id' => 'view-on-frontend', - 'title' => 'View on Frontend', - 'href' => $frontend_url, - 'meta' => [ - 'target' => '_blank' - ] - ]); -}, 100); From 79cbe0f54d3db857355cffc77b07dc3ce9d8ab13 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 10:19:18 -0400 Subject: [PATCH 14/44] Support multiple frontend URLs in admin links Refactored plugin to support both single and multiple frontend configurations via HEADLESS_FRONTEND_URL or HWP_FRONTEND_LINKS. Admin bar and post row actions now display a 'View in [Label]' link for each configured frontend, improving flexibility for sites with multiple environments. --- .../hwp-frontend-links/hwp-frontend-links.php | 147 ++++++++++++------ 1 file changed, 98 insertions(+), 49 deletions(-) diff --git a/plugins/hwp-frontend-links/hwp-frontend-links.php b/plugins/hwp-frontend-links/hwp-frontend-links.php index 1c67363c..79eff88f 100644 --- a/plugins/hwp-frontend-links/hwp-frontend-links.php +++ b/plugins/hwp-frontend-links/hwp-frontend-links.php @@ -2,7 +2,7 @@ /** * Plugin Name: HWP Frontend Links * Plugin URI: https://github.com/wpengine/hwptoolkit - * Description: Adds "View on Frontend" links to WordPress admin for headless WordPress sites. Configure via HEADLESS_FRONTEND_URL constant. + * Description: Adds "View on Frontend" links to WordPress admin for headless sites. Supports single or multiple frontends. * Version: 1.0.0 * Author: WP Engine * Author URI: https://wpengine.com @@ -11,104 +11,153 @@ * Requires at least: 6.0 * Requires PHP: 7.4 * + * Configuration: + * + * Single frontend: + * define( 'HEADLESS_FRONTEND_URL', 'https://example.com' ); + * + * Multiple frontends: + * define( 'HWP_FRONTEND_LINKS', [ + * [ 'label' => 'Production', 'url' => 'https://example.com' ], + * [ 'label' => 'Staging', 'url' => 'https://staging.example.com' ] + * ] ); + * * @package HWP\FrontendLinks */ namespace HWP\FrontendLinks; -// Exit if accessed directly if ( ! defined( 'ABSPATH' ) ) { exit; } /** - * Get the frontend URL + * Get configured frontend URLs with labels * - * @return string|null The frontend URL or null if not configured + * Supports both single frontend (HEADLESS_FRONTEND_URL) and multiple frontends + * (HWP_FRONTEND_LINKS) configurations. Returns normalized array of configs. + * + * @return array Array of frontend configurations with 'label' and 'url' keys */ -function get_frontend_url() { - if ( defined( 'HEADLESS_FRONTEND_URL' ) ) { - return rtrim( HEADLESS_FRONTEND_URL, '/' ); +function get_frontend_configs() { + $configs = []; + + if ( defined( 'HWP_FRONTEND_LINKS' ) && is_array( HWP_FRONTEND_LINKS ) ) { + foreach ( HWP_FRONTEND_LINKS as $config ) { + if ( isset( $config['label'] ) && isset( $config['url'] ) ) { + $configs[] = [ + 'label' => $config['label'], + 'url' => rtrim( $config['url'], '/' ), + ]; + } + } + } + + if ( empty( $configs ) && defined( 'HEADLESS_FRONTEND_URL' ) ) { + $configs[] = [ + 'label' => 'Frontend', + 'url' => rtrim( HEADLESS_FRONTEND_URL, '/' ), + ]; } - return null; + return $configs; } /** * Build frontend URL for a post * - * @param \WP_Post $post The post object - * @return string|null The frontend URL for the post or null if not configured + * Constructs full frontend URL by combining base URL with post slug. + * Path construction is filterable via 'hwp_frontend_links_post_path'. + * + * @param \WP_Post $post The post object + * @param string $frontend_url The frontend base URL + * @return string|null Frontend URL or null if invalid */ -function build_frontend_url( $post ) { - $frontend_url = get_frontend_url(); - +function build_frontend_url( $post, $frontend_url ) { if ( ! $frontend_url || ! $post ) { return null; } - // Allow filtering of the path construction $path = apply_filters( 'hwp_frontend_links_post_path', '/' . $post->post_name, $post ); return $frontend_url . $path; } /** - * Add "View on Frontend" link to admin bar + * Add frontend links to admin bar * - * @param \WP_Admin_Bar $wp_admin_bar The admin bar instance + * Adds "View in [Label]" link(s) to admin bar for each configured frontend. + * Only displays on singular post/page views. + * + * @param \WP_Admin_Bar $wp_admin_bar Admin bar instance */ function add_admin_bar_link( $wp_admin_bar ) { - if ( ! get_frontend_url() ) { - return; - } + $frontend_configs = get_frontend_configs(); - // Only show for singular posts/pages - if ( ! is_singular() ) { + if ( empty( $frontend_configs ) || ! is_singular() ) { return; } global $post; - $frontend_url = build_frontend_url( $post ); - - if ( ! $frontend_url ) { - return; + foreach ( $frontend_configs as $index => $config ) { + $frontend_url = build_frontend_url( $post, $config['url'] ); + + if ( ! $frontend_url ) { + continue; + } + + $node_id = 'hwp-view-on-frontend' . ( $index > 0 ? '-' . $index : '' ); + $title = sprintf( __( 'View in %s', 'hwp-frontend-links' ), $config['label'] ); + + $wp_admin_bar->add_node( [ + 'id' => $node_id, + 'parent' => null, + 'group' => null, + 'title' => $title, + 'href' => $frontend_url, + 'meta' => [ + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'title' => $title, + ], + ] ); } - - $wp_admin_bar->add_node( [ - 'id' => 'hwp-view-on-frontend', - 'parent' => null, - 'group' => null, - 'title' => __( 'View on Frontend', 'hwp-frontend-links' ), - 'href' => $frontend_url, - 'meta' => [ - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'title' => __( 'View this content on the headless frontend', 'hwp-frontend-links' ), - ], - ] ); } /** - * Add frontend link to post row actions + * Add frontend links to post row actions + * + * Adds "View in [Label]" link(s) to post/page row actions in admin lists + * for each configured frontend. * - * @param array $actions An array of row action links - * @param \WP_Post $post The post object + * @param array $actions Row action links + * @param \WP_Post $post Post object * @return array Modified actions array */ function add_post_row_action( $actions, $post ) { - $frontend_url = build_frontend_url( $post ); + $frontend_configs = get_frontend_configs(); - if ( ! $frontend_url ) { + if ( empty( $frontend_configs ) ) { return $actions; } - $actions['hwp_view_frontend'] = sprintf( - '%s', - esc_url( $frontend_url ), - __( 'View on Frontend', 'hwp-frontend-links' ) - ); + foreach ( $frontend_configs as $index => $config ) { + $frontend_url = build_frontend_url( $post, $config['url'] ); + + if ( ! $frontend_url ) { + continue; + } + + $action_key = 'hwp_view_frontend' . ( $index > 0 ? '_' . $index : '' ); + $label = sprintf( __( 'View in %s', 'hwp-frontend-links' ), $config['label'] ); + + $actions[ $action_key ] = sprintf( + '%s', + esc_url( $frontend_url ), + esc_html( $label ) + ); + } return $actions; } @@ -118,7 +167,7 @@ function add_post_row_action( $actions, $post ) { */ function init() { // Only add frontend links if configured - if ( ! get_frontend_url() ) { + if ( empty( get_frontend_configs() ) ) { return; } From 5236d396dbd98212fab18f34057901152469b727 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 10:38:19 -0400 Subject: [PATCH 15/44] Update wordpress.ts --- examples/next/toolbar-demo/example-app/lib/wordpress.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/next/toolbar-demo/example-app/lib/wordpress.ts b/examples/next/toolbar-demo/example-app/lib/wordpress.ts index af35bfff..a05fc17d 100644 --- a/examples/next/toolbar-demo/example-app/lib/wordpress.ts +++ b/examples/next/toolbar-demo/example-app/lib/wordpress.ts @@ -25,9 +25,9 @@ export async function fetchFromWordPress(endpoint: string, options?: RequestInit } export async function getCurrentUser() { - // Fetch real user from WordPress REST API - // Using user ID 1 (default admin user in wp-env) - // In production, use /wp/v2/users/me with Application Passwords or OAuth + // Demo: Using user ID 1 (wp-env default admin) for simplicity + // Production: Use /wp/v2/users/me with Application Passwords or OAuth + // Note: This is acceptable in demos where auth setup would add unnecessary complexity return fetchFromWordPress('/wp/v2/users/1'); } From 316fb3674aa5320bbad9b4744771d5c68fd1c955 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 10:39:11 -0400 Subject: [PATCH 16/44] Update scripts/get-ports.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- scripts/get-ports.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/get-ports.js b/scripts/get-ports.js index edf595be..aa22934e 100755 --- a/scripts/get-ports.js +++ b/scripts/get-ports.js @@ -15,15 +15,19 @@ const crypto = require('crypto'); const path = require('path'); const fs = require('fs'); +// Port range constants for deterministic port assignment +const PORT_RANGE = 900; // Number of ports to use +const PORT_BASE = 100; // Starting port (skip first 100 ports) + /** - * Simple hash function that converts a string to a number in range [0, 999] + * Simple hash function that converts a string to a number in range [PORT_BASE, PORT_BASE + PORT_RANGE - 1] */ function hashToPort(str) { const hash = crypto.createHash('sha256').update(str).digest('hex'); - // Take first 8 hex chars and convert to decimal, then mod 900 + 100 to get range [100, 999] - // This ensures we skip the first 100 ports to avoid conflicts with common services + // Take first 8 hex chars and convert to decimal, then mod PORT_RANGE + PORT_BASE to get range [PORT_BASE, PORT_BASE + PORT_RANGE - 1] + // This ensures we skip the first PORT_BASE ports to avoid conflicts with common services const num = parseInt(hash.substring(0, 8), 16); - return (num % 900) + 100; + return (num % PORT_RANGE) + PORT_BASE; } /** From a3d62a20b92ec673bab22d56857ee08be235ca39 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 11:29:58 -0400 Subject: [PATCH 17/44] feat(plugins): add composer.json and standardize versions to 0.1.0 --- plugins/hwp-cli/composer.json | 17 +++++++++++++++++ plugins/hwp-cli/hwp-cli.php | 2 +- plugins/hwp-cors-local/composer.json | 17 +++++++++++++++++ plugins/hwp-cors-local/hwp-cors-local.php | 6 +++--- plugins/hwp-frontend-links/composer.json | 17 +++++++++++++++++ .../hwp-frontend-links/hwp-frontend-links.php | 2 +- plugins/hwp-wp-env-helpers/composer.json | 17 +++++++++++++++++ .../hwp-wp-env-helpers/hwp-wp-env-helpers.php | 2 +- 8 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 plugins/hwp-cli/composer.json create mode 100644 plugins/hwp-cors-local/composer.json create mode 100644 plugins/hwp-frontend-links/composer.json create mode 100644 plugins/hwp-wp-env-helpers/composer.json diff --git a/plugins/hwp-cli/composer.json b/plugins/hwp-cli/composer.json new file mode 100644 index 00000000..6a5cf25a --- /dev/null +++ b/plugins/hwp-cli/composer.json @@ -0,0 +1,17 @@ +{ + "name": "wpengine/hwp-cli", + "type": "wordpress-plugin", + "description": "Command-line interface for Headless WordPress Toolkit", + "license": "GPL-2.0-or-later", + "version": "0.1.0", + "authors": [ + { + "name": "WP Engine", + "email": "opensource@wpengine.com", + "homepage": "https://wpengine.com/" + } + ], + "require": { + "php": "^7.4 || ^8.0" + } +} diff --git a/plugins/hwp-cli/hwp-cli.php b/plugins/hwp-cli/hwp-cli.php index 11dddf97..ebd9c9f8 100644 --- a/plugins/hwp-cli/hwp-cli.php +++ b/plugins/hwp-cli/hwp-cli.php @@ -3,7 +3,7 @@ * Plugin Name: HWP CLI Plugin * Plugin URI: https://github.com/hwp/cli * Description: Command-line interface for Headless WordPress Toolkit - * Version: 1.0.0 + * Version: 0.1.0 * Author: HWP Team * Author URI: https://github.com/hwp * License: MIT diff --git a/plugins/hwp-cors-local/composer.json b/plugins/hwp-cors-local/composer.json new file mode 100644 index 00000000..34a20155 --- /dev/null +++ b/plugins/hwp-cors-local/composer.json @@ -0,0 +1,17 @@ +{ + "name": "wpengine/hwp-cors-local", + "type": "wordpress-plugin", + "description": "Enables CORS headers for local headless WordPress development. Allows configurable frontend origins via HEADLESS_FRONTEND_URL constant.", + "license": "GPL-2.0-or-later", + "version": "0.1.0", + "authors": [ + { + "name": "WP Engine", + "email": "opensource@wpengine.com", + "homepage": "https://wpengine.com/" + } + ], + "require": { + "php": "^7.4 || ^8.0" + } +} diff --git a/plugins/hwp-cors-local/hwp-cors-local.php b/plugins/hwp-cors-local/hwp-cors-local.php index 4c791d8a..19ff2a7f 100644 --- a/plugins/hwp-cors-local/hwp-cors-local.php +++ b/plugins/hwp-cors-local/hwp-cors-local.php @@ -3,7 +3,7 @@ * Plugin Name: HWP CORS Local * Plugin URI: https://github.com/wpengine/hwptoolkit * Description: Enables CORS headers for local headless WordPress development. Allows configurable frontend origins via HEADLESS_FRONTEND_URL constant. - * Version: 1.0.0 + * Version: 0.1.0 * Author: WP Engine * Author URI: https://wpengine.com * License: GPL-2.0-or-later @@ -65,8 +65,8 @@ function add_cors_headers( $value ) { * Initialize the plugin */ function init() { - // Only enable CORS in development environments - if ( ! defined( 'WP_ENVIRONMENT_TYPE' ) || WP_ENVIRONMENT_TYPE === 'local' || WP_DEBUG ) { + // Only enable CORS in local development environments + if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE === 'local' ) { add_action( 'rest_api_init', function() { remove_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' ); add_filter( 'rest_pre_serve_request', __NAMESPACE__ . '\\add_cors_headers' ); diff --git a/plugins/hwp-frontend-links/composer.json b/plugins/hwp-frontend-links/composer.json new file mode 100644 index 00000000..97e8ace6 --- /dev/null +++ b/plugins/hwp-frontend-links/composer.json @@ -0,0 +1,17 @@ +{ + "name": "wpengine/hwp-frontend-links", + "type": "wordpress-plugin", + "description": "Adds \"View on Frontend\" links to WordPress admin for headless sites. Supports single or multiple frontends.", + "license": "GPL-2.0-or-later", + "version": "0.1.0", + "authors": [ + { + "name": "WP Engine", + "email": "opensource@wpengine.com", + "homepage": "https://wpengine.com/" + } + ], + "require": { + "php": "^7.4 || ^8.0" + } +} diff --git a/plugins/hwp-frontend-links/hwp-frontend-links.php b/plugins/hwp-frontend-links/hwp-frontend-links.php index 79eff88f..96eb3e81 100644 --- a/plugins/hwp-frontend-links/hwp-frontend-links.php +++ b/plugins/hwp-frontend-links/hwp-frontend-links.php @@ -3,7 +3,7 @@ * Plugin Name: HWP Frontend Links * Plugin URI: https://github.com/wpengine/hwptoolkit * Description: Adds "View on Frontend" links to WordPress admin for headless sites. Supports single or multiple frontends. - * Version: 1.0.0 + * Version: 0.1.0 * Author: WP Engine * Author URI: https://wpengine.com * License: GPL-2.0-or-later diff --git a/plugins/hwp-wp-env-helpers/composer.json b/plugins/hwp-wp-env-helpers/composer.json new file mode 100644 index 00000000..13620cc8 --- /dev/null +++ b/plugins/hwp-wp-env-helpers/composer.json @@ -0,0 +1,17 @@ +{ + "name": "wpengine/hwp-wp-env-helpers", + "type": "wordpress-plugin", + "description": "Fixes for wp-env quirks. Forces REST API to use ?rest_route= format to avoid .htaccess issues.", + "license": "GPL-2.0-or-later", + "version": "0.1.0", + "authors": [ + { + "name": "WP Engine", + "email": "opensource@wpengine.com", + "homepage": "https://wpengine.com/" + } + ], + "require": { + "php": "^7.4 || ^8.0" + } +} diff --git a/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php b/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php index 993ecf99..b9a1966c 100644 --- a/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php +++ b/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php @@ -3,7 +3,7 @@ * Plugin Name: HWP WP-Env Helpers * Plugin URI: https://github.com/wpengine/hwptoolkit * Description: Fixes for wp-env quirks. Forces REST API to use ?rest_route= format to avoid .htaccess issues. - * Version: 1.0.0 + * Version: 0.1.0 * Author: WP Engine * Author URI: https://wpengine.com * License: GPL-2.0-or-later From bd694faa0f73c54f6a4f6d2705d008c02a8ded2a Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 11:30:07 -0400 Subject: [PATCH 18/44] feat(toolbar): add demo path indicator and use JSDoc comments --- .../toolbar-demo/example-app/lib/toolbar.ts | 12 ++++++-- .../toolbar-demo/example-app/src/main.js | 30 ++++++++----------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/examples/next/toolbar-demo/example-app/lib/toolbar.ts b/examples/next/toolbar-demo/example-app/lib/toolbar.ts index c5dbce46..9cf9c2ac 100644 --- a/examples/next/toolbar-demo/example-app/lib/toolbar.ts +++ b/examples/next/toolbar-demo/example-app/lib/toolbar.ts @@ -1,7 +1,9 @@ import { Toolbar } from '@wpengine/hwp-toolbar'; -// Singleton toolbar instance -// This ensures the same toolbar state is shared across the app +/** + * Singleton toolbar instance + * This ensures the same toolbar state is shared across the app + */ export const toolbar = new Toolbar({ onPreviewChange: (enabled) => { console.log('Preview mode:', enabled); @@ -10,7 +12,11 @@ export const toolbar = new Toolbar({ }, }); -// Register custom nodes +/** + * Register custom nodes + */ toolbar.register('home', 'Home', () => { window.location.href = '/'; }); + +toolbar.register('demo-path', 'examples/next/toolbar-demo'); diff --git a/examples/vanilla/toolbar-demo/example-app/src/main.js b/examples/vanilla/toolbar-demo/example-app/src/main.js index 33a1d103..aeed2751 100644 --- a/examples/vanilla/toolbar-demo/example-app/src/main.js +++ b/examples/vanilla/toolbar-demo/example-app/src/main.js @@ -4,10 +4,9 @@ import './style.css'; const WP_URL = import.meta.env.VITE_WP_URL; -// ============================================================================ -// Initialize Toolbar -// ============================================================================ - +/** + * Initialize Toolbar + */ const toolbar = new Toolbar({ onPreviewChange: (enabled) => { console.log('Preview mode:', enabled); @@ -15,30 +14,27 @@ const toolbar = new Toolbar({ } }); -// Render toolbar to DOM const renderer = new VanillaRenderer(toolbar, 'toolbar'); -// ============================================================================ -// Register Custom Nodes -// ============================================================================ - +/** + * Register Custom Nodes + */ toolbar.register('home', 'Home', () => { window.location.href = '/'; }); -// ============================================================================ -// State Management -// ============================================================================ +toolbar.register('demo-path', 'examples/vanilla/toolbar-demo'); -// Subscribe to state changes for debugging display +/** + * State Management + */ toolbar.subscribe((nodes, state) => { document.getElementById('state').textContent = JSON.stringify(state, null, 2); }); -// ============================================================================ -// Demo Actions -// ============================================================================ - +/** + * Demo Actions + */ window.login = async () => { try { const response = await fetch(`${WP_URL}/?rest_route=/wp/v2/users/1`); From eca9b26606dcac70c7c2c05dce66633bffdb3d18 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 11:35:20 -0400 Subject: [PATCH 19/44] docs: add CHANGELOG.md files for initial 0.1.0 release --- packages/toolbar/CHANGELOG.md | 22 ++++++++++++++++++++++ plugins/hwp-cli/CHANGELOG.md | 18 ++++++++++++++++++ plugins/hwp-cors-local/CHANGELOG.md | 19 +++++++++++++++++++ plugins/hwp-frontend-links/CHANGELOG.md | 20 ++++++++++++++++++++ plugins/hwp-wp-env-helpers/CHANGELOG.md | 17 +++++++++++++++++ 5 files changed, 96 insertions(+) create mode 100644 packages/toolbar/CHANGELOG.md create mode 100644 plugins/hwp-cli/CHANGELOG.md create mode 100644 plugins/hwp-cors-local/CHANGELOG.md create mode 100644 plugins/hwp-frontend-links/CHANGELOG.md create mode 100644 plugins/hwp-wp-env-helpers/CHANGELOG.md diff --git a/packages/toolbar/CHANGELOG.md b/packages/toolbar/CHANGELOG.md new file mode 100644 index 00000000..84f7a66d --- /dev/null +++ b/packages/toolbar/CHANGELOG.md @@ -0,0 +1,22 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2025-01-09 + +### Added +- Initial release of @wpengine/hwp-toolbar +- Framework-agnostic core toolbar with modern state management +- React adapter with hooks (useToolbar, useToolbarState, useWordPressContext) +- Vanilla JavaScript renderer for non-React applications +- WordPress context management with separate API (setWordPressContext) +- Plugin system via register() method for custom toolbar nodes +- Configurable positioning (top/bottom) and theming (light/dark/auto) +- Minimal base styles for full developer control +- TypeScript support with complete type definitions +- CSS exports for styling integration + +[0.1.0]: https://github.com/wpengine/hwptoolkit/releases/tag/toolbar-v0.1.0 diff --git a/plugins/hwp-cli/CHANGELOG.md b/plugins/hwp-cli/CHANGELOG.md new file mode 100644 index 00000000..885881a6 --- /dev/null +++ b/plugins/hwp-cli/CHANGELOG.md @@ -0,0 +1,18 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2025-01-09 + +### Added +- Initial release +- REST API endpoint `/wp-json/hwp/v1/cli/status` for system status checks +- REST API endpoint `/wp-json/hwp/v1/cli/plugins` for HWP plugin discovery +- Admin menu integration under Tools > HWP CLI +- Environment information (WordPress version, environment type, debug status) +- Plugin detection for HWP-prefixed plugins + +[0.1.0]: https://github.com/wpengine/hwptoolkit/releases/tag/hwp-cli-v0.1.0 diff --git a/plugins/hwp-cors-local/CHANGELOG.md b/plugins/hwp-cors-local/CHANGELOG.md new file mode 100644 index 00000000..7e34a939 --- /dev/null +++ b/plugins/hwp-cors-local/CHANGELOG.md @@ -0,0 +1,19 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2025-01-09 + +### Added +- Initial release +- CORS header management for local headless WordPress development +- Configurable frontend origins via HEADLESS_FRONTEND_URL constant +- Automatic preflight OPTIONS request handling +- Support for credentials, custom headers, and multiple HTTP methods +- Environment-aware activation (local development only) +- Security-first design preventing production activation + +[0.1.0]: https://github.com/wpengine/hwptoolkit/releases/tag/hwp-cors-local-v0.1.0 diff --git a/plugins/hwp-frontend-links/CHANGELOG.md b/plugins/hwp-frontend-links/CHANGELOG.md new file mode 100644 index 00000000..ef41dd8b --- /dev/null +++ b/plugins/hwp-frontend-links/CHANGELOG.md @@ -0,0 +1,20 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2025-01-09 + +### Added +- Initial release +- "View on Frontend" links in WordPress admin bar +- Row action links in post/page lists +- Support for single frontend configuration via HEADLESS_FRONTEND_URL +- Support for multiple frontends via HWP_FRONTEND_LINKS constant +- Filterable post path generation via hwp_frontend_links_post_path hook +- Automatic link generation for singular post/page views +- Security attributes (target="_blank", rel="noopener noreferrer") + +[0.1.0]: https://github.com/wpengine/hwptoolkit/releases/tag/hwp-frontend-links-v0.1.0 diff --git a/plugins/hwp-wp-env-helpers/CHANGELOG.md b/plugins/hwp-wp-env-helpers/CHANGELOG.md new file mode 100644 index 00000000..8773a2f8 --- /dev/null +++ b/plugins/hwp-wp-env-helpers/CHANGELOG.md @@ -0,0 +1,17 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2025-01-09 + +### Added +- Initial release +- Automatic REST API URL format conversion for wp-env compatibility +- Forces ?rest_route= query parameter format to avoid .htaccess issues +- Environment-aware activation (local development only) +- Seamless integration with wp-env Docker environments + +[0.1.0]: https://github.com/wpengine/hwptoolkit/releases/tag/hwp-wp-env-helpers-v0.1.0 From d64b0ff34d3beae952f9d53ae0f1e2d107c75a8e Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 13:06:44 -0400 Subject: [PATCH 20/44] Add standard badges --- plugins/hwp-cli/README.md | 5 +++++ plugins/hwp-cors-local/README.md | 5 +++++ plugins/hwp-frontend-links/README.md | 5 +++++ plugins/hwp-wp-env-helpers/README.md | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/plugins/hwp-cli/README.md b/plugins/hwp-cli/README.md index 0cc96b9b..c9906dd5 100644 --- a/plugins/hwp-cli/README.md +++ b/plugins/hwp-cli/README.md @@ -1,5 +1,10 @@ # HWP CLI Plugin +[![Version](https://img.shields.io/github/v/release/wpengine/hwptoolkit?include_prereleases&label=version&filter=hwp-cli-*)](https://github.com/wpengine/hwptoolkit/releases) +[![License](https://img.shields.io/badge/license-GPLv2%2B-green)](https://www.gnu.org/licenses/gpl-2.0.html) +![GitHub forks](https://img.shields.io/github/forks/wpengine/hwptoolkit?style=social) +![GitHub stars](https://img.shields.io/github/stars/wpengine/hwptoolkit?style=social) + WordPress plugin component of the Headless WordPress Toolkit CLI. ## Features diff --git a/plugins/hwp-cors-local/README.md b/plugins/hwp-cors-local/README.md index bf6ed733..6aa5d2d9 100644 --- a/plugins/hwp-cors-local/README.md +++ b/plugins/hwp-cors-local/README.md @@ -1,5 +1,10 @@ # HWP CORS Local +[![Version](https://img.shields.io/github/v/release/wpengine/hwptoolkit?include_prereleases&label=version&filter=hwp-cors-local-*)](https://github.com/wpengine/hwptoolkit/releases) +[![License](https://img.shields.io/badge/license-GPLv2%2B-green)](https://www.gnu.org/licenses/gpl-2.0.html) +![GitHub forks](https://img.shields.io/github/forks/wpengine/hwptoolkit?style=social) +![GitHub stars](https://img.shields.io/github/stars/wpengine/hwptoolkit?style=social) + Enables CORS (Cross-Origin Resource Sharing) headers for local headless WordPress development environments. ## Purpose diff --git a/plugins/hwp-frontend-links/README.md b/plugins/hwp-frontend-links/README.md index 338a593a..edd5eaea 100644 --- a/plugins/hwp-frontend-links/README.md +++ b/plugins/hwp-frontend-links/README.md @@ -1,5 +1,10 @@ # HWP Frontend Links +[![Version](https://img.shields.io/github/v/release/wpengine/hwptoolkit?include_prereleases&label=version&filter=hwp-frontend-links-*)](https://github.com/wpengine/hwptoolkit/releases) +[![License](https://img.shields.io/badge/license-GPLv2%2B-green)](https://www.gnu.org/licenses/gpl-2.0.html) +![GitHub forks](https://img.shields.io/github/forks/wpengine/hwptoolkit?style=social) +![GitHub stars](https://img.shields.io/github/stars/wpengine/hwptoolkit?style=social) + Adds "View on Frontend" links to WordPress admin interface for headless WordPress sites. ## Purpose diff --git a/plugins/hwp-wp-env-helpers/README.md b/plugins/hwp-wp-env-helpers/README.md index 461ada01..d24ee9b8 100644 --- a/plugins/hwp-wp-env-helpers/README.md +++ b/plugins/hwp-wp-env-helpers/README.md @@ -1,5 +1,10 @@ # HWP WP-Env Helpers +[![Version](https://img.shields.io/github/v/release/wpengine/hwptoolkit?include_prereleases&label=version&filter=hwp-wp-env-helpers-*)](https://github.com/wpengine/hwptoolkit/releases) +[![License](https://img.shields.io/badge/license-GPLv2%2B-green)](https://www.gnu.org/licenses/gpl-2.0.html) +![GitHub forks](https://img.shields.io/github/forks/wpengine/hwptoolkit?style=social) +![GitHub stars](https://img.shields.io/github/stars/wpengine/hwptoolkit?style=social) + Fixes WordPress environment quirks specific to wp-env development environments. ## Purpose From 310cff1a52ffb65abb7b6e7ecf588863db8ca3bc Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 19:55:37 -0400 Subject: [PATCH 21/44] fix(hwp-cors-local): add WP_DEBUG check to match documentation Update plugin initialization to activate when either WP_ENVIRONMENT_TYPE is 'local' OR WP_DEBUG is true, matching the documented behavior. Previously, the code only checked WP_ENVIRONMENT_TYPE, creating a mismatch with the README and IMPLEMENTATION_BREAKDOWN docs which stated both conditions were supported. Files modified: - plugins/hwp-cors-local/hwp-cors-local.php: Add WP_DEBUG check - plugins/hwp-cors-local/README.md: Clarify OR logic - IMPLEMENTATION_BREAKDOWN.md: Update feature description --- IMPLEMENTATION_BREAKDOWN.md | 2 +- plugins/hwp-cors-local/README.md | 6 +++--- plugins/hwp-cors-local/hwp-cors-local.php | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/IMPLEMENTATION_BREAKDOWN.md b/IMPLEMENTATION_BREAKDOWN.md index 94d6a6b6..05326363 100644 --- a/IMPLEMENTATION_BREAKDOWN.md +++ b/IMPLEMENTATION_BREAKDOWN.md @@ -12,7 +12,7 @@ Implemented a modular, production-ready plugin architecture for headless WordPre **Purpose**: Enables CORS headers for local development environments **Key Features**: -- Only activates when `WP_ENVIRONMENT_TYPE === 'local'` or `WP_DEBUG === true` +- Only activates when `WP_ENVIRONMENT_TYPE === 'local'` OR `WP_DEBUG === true` - Configurable via `HEADLESS_FRONTEND_URL` constant - Handles preflight OPTIONS requests automatically - Allows credentials and common HTTP methods (GET, POST, OPTIONS, PUT, DELETE) diff --git a/plugins/hwp-cors-local/README.md b/plugins/hwp-cors-local/README.md index 6aa5d2d9..79172dc7 100644 --- a/plugins/hwp-cors-local/README.md +++ b/plugins/hwp-cors-local/README.md @@ -36,7 +36,7 @@ Or in `.wp-env.json`: ## Behavior -- Only activates when `WP_ENVIRONMENT_TYPE` is `local` or `WP_DEBUG` is `true` +- Only activates when `WP_ENVIRONMENT_TYPE` is `local` OR `WP_DEBUG` is `true` - Does not apply CORS headers if `HEADLESS_FRONTEND_URL` is not defined - Handles preflight OPTIONS requests automatically - Allows credentials and common HTTP methods (GET, POST, OPTIONS, PUT, DELETE) @@ -50,8 +50,8 @@ Or in `.wp-env.json`: ## Security -This plugin should only be used in local development environments. It is automatically disabled in production when: -- `WP_ENVIRONMENT_TYPE` is not `local` +This plugin should only be used in local development environments. It is automatically disabled in production when both conditions are met: +- `WP_ENVIRONMENT_TYPE` is not `local` AND - `WP_DEBUG` is `false` ## Installation diff --git a/plugins/hwp-cors-local/hwp-cors-local.php b/plugins/hwp-cors-local/hwp-cors-local.php index 19ff2a7f..72c632af 100644 --- a/plugins/hwp-cors-local/hwp-cors-local.php +++ b/plugins/hwp-cors-local/hwp-cors-local.php @@ -66,7 +66,10 @@ function add_cors_headers( $value ) { */ function init() { // Only enable CORS in local development environments - if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE === 'local' ) { + $is_local = ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE === 'local' ); + $is_debug = ( defined( 'WP_DEBUG' ) && WP_DEBUG ); + + if ( $is_local || $is_debug ) { add_action( 'rest_api_init', function() { remove_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' ); add_filter( 'rest_pre_serve_request', __NAMESPACE__ . '\\add_cors_headers' ); From 144dfbe3054a1b12389b52c832704cd33f7d0245 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 19:56:31 -0400 Subject: [PATCH 22/44] feat(toolbar): add comprehensive CSS custom properties for theming Add complete set of CSS custom properties to match documented theming capabilities in README. Includes WordPress admin-inspired default values. CSS Variables Added: - --hwp-toolbar-bg: Background color (#23282d) - --hwp-toolbar-border: Border color (#32373c) - --hwp-toolbar-text: Text color (#ffffff) - --hwp-toolbar-text-hover: Hover text color (#72aee6) - --hwp-toolbar-primary: Primary action color (#0073aa) - --hwp-toolbar-primary-hover: Primary hover (#005177) - --hwp-toolbar-danger: Danger action color (#dc3232) - --hwp-toolbar-danger-hover: Danger hover (#a00) - --hwp-toolbar-divider: Divider color (#464b50) - --hwp-toolbar-shadow: Box shadow (rgba(0, 0, 0, 0.3)) - --hwp-toolbar-z-index: Stacking context (9999) - --hwp-toolbar-font-family: Font stack - --hwp-toolbar-font-size: Base font size (13px) Enhancements: - Applied variables to all toolbar elements - Added hover states with smooth transitions - Improved button, link, and dropdown styling - Added proper borders and shadows - Enhanced visual feedback for interactive elements --- packages/toolbar/src/toolbar.css | 80 ++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 4 deletions(-) diff --git a/packages/toolbar/src/toolbar.css b/packages/toolbar/src/toolbar.css index 54d305b6..42df453a 100644 --- a/packages/toolbar/src/toolbar.css +++ b/packages/toolbar/src/toolbar.css @@ -1,3 +1,19 @@ +:root { + --hwp-toolbar-bg: #23282d; + --hwp-toolbar-border: #32373c; + --hwp-toolbar-text: #ffffff; + --hwp-toolbar-text-hover: #72aee6; + --hwp-toolbar-primary: #0073aa; + --hwp-toolbar-primary-hover: #005177; + --hwp-toolbar-danger: #dc3232; + --hwp-toolbar-danger-hover: #a00; + --hwp-toolbar-divider: #464b50; + --hwp-toolbar-shadow: rgba(0, 0, 0, 0.3); + --hwp-toolbar-z-index: 9999; + --hwp-toolbar-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; + --hwp-toolbar-font-size: 13px; +} + * { box-sizing: border-box; } @@ -12,15 +28,23 @@ align-items: center; justify-content: space-between; gap: 8px; - z-index: 9999; + z-index: var(--hwp-toolbar-z-index); + background-color: var(--hwp-toolbar-bg); + border-color: var(--hwp-toolbar-border); + color: var(--hwp-toolbar-text); + font-family: var(--hwp-toolbar-font-family); + font-size: var(--hwp-toolbar-font-size); + box-shadow: 0 2px 4px var(--hwp-toolbar-shadow); } .hwp-toolbar-bottom { bottom: 0; + border-top: 1px solid var(--hwp-toolbar-border); } .hwp-toolbar-top { top: 0; + border-bottom: 1px solid var(--hwp-toolbar-border); } .hwp-toolbar-section { @@ -43,16 +67,48 @@ } .hwp-toolbar-button { - padding: 4px 8px; + padding: 4px 12px; + background: transparent; + border: 1px solid transparent; + color: var(--hwp-toolbar-text); + cursor: pointer; + font-family: inherit; + font-size: inherit; + border-radius: 2px; + transition: all 0.15s ease-in-out; +} + +.hwp-toolbar-button:hover { + color: var(--hwp-toolbar-text-hover); + background-color: rgba(255, 255, 255, 0.1); +} + +.hwp-toolbar-button-active { + background-color: var(--hwp-toolbar-primary); + color: var(--hwp-toolbar-text); +} + +.hwp-toolbar-button-active:hover { + background-color: var(--hwp-toolbar-primary-hover); } .hwp-toolbar-link { - padding: 4px 8px; + padding: 4px 12px; + color: var(--hwp-toolbar-text); + text-decoration: none; + border-radius: 2px; + transition: all 0.15s ease-in-out; +} + +.hwp-toolbar-link:hover { + color: var(--hwp-toolbar-text-hover); + background-color: rgba(255, 255, 255, 0.1); } .hwp-toolbar-divider { width: 1px; height: 20px; + background-color: var(--hwp-toolbar-divider); } .hwp-toolbar-dropdown { @@ -67,6 +123,10 @@ position: absolute; left: 0; min-width: 150px; + background-color: var(--hwp-toolbar-bg); + border: 1px solid var(--hwp-toolbar-border); + border-radius: 2px; + box-shadow: 0 2px 8px var(--hwp-toolbar-shadow); } .hwp-toolbar-bottom .hwp-toolbar-dropdown-menu { @@ -82,8 +142,20 @@ .hwp-toolbar-dropdown-item { display: block; width: 100%; - padding: 6px 12px; + padding: 8px 12px; text-align: left; + background: transparent; + border: none; + color: var(--hwp-toolbar-text); + cursor: pointer; + font-family: inherit; + font-size: inherit; + transition: all 0.15s ease-in-out; +} + +.hwp-toolbar-dropdown-item:hover { + background-color: rgba(255, 255, 255, 0.1); + color: var(--hwp-toolbar-text-hover); } .hwp-toolbar-branding { From b7c98dd87d30974e4340d425f484eefe2ef7a5b0 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 19:56:55 -0400 Subject: [PATCH 23/44] fix(toolbar-demo): use type-safe getConfig() method Replace unsafe type casting with proper getConfig() method to access toolbar configuration. This eliminates the TypeScript 'as any' escape hatch and provides proper type safety. Before: const config = (toolbar as any).config; After: const config = toolbar.getConfig(); The getConfig() method is already publicly exposed by the Toolbar class and returns a properly typed ToolbarConfig object. --- .../next/toolbar-demo/example-app/app/components/Toolbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx b/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx index debacbdb..52d72c09 100644 --- a/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx +++ b/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx @@ -11,7 +11,7 @@ export function Toolbar() { useEffect(() => { const unsubscribe = toolbar.subscribe(() => { - const config = (toolbar as any).config; + const config = toolbar.getConfig(); setPosition(config?.position || 'bottom'); }); return unsubscribe; From 906e6f6f1e2f12dbfc8fc5c0a1b184b0ba234a59 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 19:58:20 -0400 Subject: [PATCH 24/44] docs(hwp-frontend-links): document multiple frontends support Add documentation for HWP_FRONTEND_LINKS constant which enables configuring multiple frontend environments. This feature was already implemented in the code but not documented. Users can now easily see how to configure multiple frontend targets (production, staging, local) which will each appear as separate "View in [Label]" links in the WordPress admin. Example configuration added showing three frontends with custom labels. --- plugins/hwp-frontend-links/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/plugins/hwp-frontend-links/README.md b/plugins/hwp-frontend-links/README.md index edd5eaea..1b5e38ea 100644 --- a/plugins/hwp-frontend-links/README.md +++ b/plugins/hwp-frontend-links/README.md @@ -18,6 +18,8 @@ Provides quick access to view content on the headless frontend application from ## Configuration +### Single Frontend + Define the frontend URL using the `HEADLESS_FRONTEND_URL` constant in `wp-config.php` or via wp-env: ```php @@ -34,6 +36,20 @@ Or in `.wp-env.json`: } ``` +### Multiple Frontends + +For projects with multiple frontend environments (staging, production, etc.), use the `HWP_FRONTEND_LINKS` constant to define multiple targets: + +```php +define( 'HWP_FRONTEND_LINKS', [ + [ 'label' => 'Production', 'url' => 'https://example.com' ], + [ 'label' => 'Staging', 'url' => 'https://staging.example.com' ], + [ 'label' => 'Local Dev', 'url' => 'http://localhost:3000' ] +] ); +``` + +Each frontend link will appear as a separate "View in [Label]" option in both the admin bar and row actions. + ## Features ### Admin Bar Link From d9baa74aa3261ef7c4c754354b341350ef81e70d Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 19:58:59 -0400 Subject: [PATCH 25/44] feat(toolbar-demo): improve error handling with specific messages Add detailed error handling to vanilla toolbar demo login function with specific guidance for common failure scenarios. Improvements: - 404 errors: Guide user to WordPress admin for initial setup - 500+ errors: Indicate server issues and suggest checking if WP is running - Network errors: Distinguish between connection failures and provide troubleshooting steps (WordPress not running, CORS issues, wrong URL) - Generic errors: Provide fallback error message with console reference This addresses Copilot feedback about providing more specific error messages instead of generic "response.ok" checks. --- .../toolbar-demo/example-app/src/main.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/examples/vanilla/toolbar-demo/example-app/src/main.js b/examples/vanilla/toolbar-demo/example-app/src/main.js index aeed2751..b09d947c 100644 --- a/examples/vanilla/toolbar-demo/example-app/src/main.js +++ b/examples/vanilla/toolbar-demo/example-app/src/main.js @@ -56,13 +56,24 @@ window.login = async () => { }); console.log('User logged in:', user.name); + } else if (response.status === 404) { + console.error('User not found:', response.status); + alert(`User not found (404). WordPress may need initial setup.\n\nVisit: ${WP_URL}/wp-admin`); + } else if (response.status >= 500) { + console.error('WordPress server error:', response.status); + alert(`WordPress server error (${response.status}).\n\nCheck that WordPress is running:\nnpm run wp:start`); } else { - console.error('WordPress not available'); - alert('WordPress is not running at ' + WP_URL); + console.error('WordPress API error:', response.status); + alert(`WordPress API returned ${response.status}.\n\nCheck WordPress configuration.`); } } catch (error) { console.error('Error connecting to WordPress:', error); - alert('Error: Make sure WordPress is running (npm run wp:start)'); + + if (error.name === 'TypeError' && error.message.includes('Failed to fetch')) { + alert(`Cannot connect to WordPress at ${WP_URL}\n\nPossible issues:\n• WordPress is not running (run: npm run wp:start)\n• CORS is not configured\n• Wrong WordPress URL\n\nCheck the console for details.`); + } else { + alert(`Error: ${error.message}\n\nCheck the console for details.`); + } } }; From 5f2c6ba14e309e5ba4d8ff37f017fecaa68e62fc Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 19:59:27 -0400 Subject: [PATCH 26/44] docs(get-ports): add detailed port calculation documentation Add comprehensive documentation explaining the port calculation strategy and rationale behind PORT_RANGE and PORT_BASE constants. Documentation now explains: - Why PORT_RANGE is 900 (space for many examples, manageable range) - Why PORT_BASE is 100 (avoid common default ports like 3000, 8000) - The full port calculation algorithm (hash -> decimal -> modulo) - Expected port ranges (frontend: 3100-3999, WordPress: 8100-8999) - Key properties: deterministic and collision-resistant Addresses Copilot feedback about documenting "magic numbers." --- scripts/get-ports.js | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/scripts/get-ports.js b/scripts/get-ports.js index aa22934e..a83cbad8 100755 --- a/scripts/get-ports.js +++ b/scripts/get-ports.js @@ -15,9 +15,33 @@ const crypto = require('crypto'); const path = require('path'); const fs = require('fs'); -// Port range constants for deterministic port assignment -const PORT_RANGE = 900; // Number of ports to use -const PORT_BASE = 100; // Starting port (skip first 100 ports) +/** + * Port range constants for deterministic port assignment + * + * PORT_RANGE (900): + * - Provides space for up to 900 unique example configurations + * - Reduces collision probability while keeping ports in manageable range + * - Results in frontend ports between 3100-3999 + * - Results in WordPress ports between 8100-8999 + * + * PORT_BASE (100): + * - Skips first 100 offset values (0-99) to avoid very common ports + * - Prevents conflicts with default dev servers (3000, 8000, etc.) + * - Creates deterministic but collision-resistant port assignments + * + * Port Calculation Strategy: + * 1. Hash the example path (e.g., "vanilla/toolbar-demo") using SHA-256 + * 2. Take first 8 hex characters and convert to decimal + * 3. Modulo PORT_RANGE to get offset (100-999) + * 4. Add offset to base ports: frontend (3000+offset), WordPress (8000+offset) + * + * This ensures: + * - Same example always gets same ports (deterministic) + * - Different examples very likely get different ports (collision resistant) + * - Ports are human-readable and debuggable + */ +const PORT_RANGE = 900; +const PORT_BASE = 100; /** * Simple hash function that converts a string to a number in range [PORT_BASE, PORT_BASE + PORT_RANGE - 1] From 63724bcf84ae89a87afee08902b6d1dd51a4a43e Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 20:00:06 -0400 Subject: [PATCH 27/44] feat(toolbar): add comprehensive dropdown accessibility Enhance dropdown menus with full keyboard navigation, ARIA attributes, and click-outside-to-close behavior for improved accessibility and UX. Accessibility Improvements: - ARIA attributes: aria-haspopup, aria-expanded, role="menu", role="menuitem" - Keyboard navigation: Enter/Space to toggle, Escape to close - Click-outside detection to auto-close dropdown menus - Auto-close menu after selecting an item Implementation: - Proper event listener management to prevent memory leaks - Cleanup of click-outside handler when menu closes - Synchronized aria-expanded state with visual state - Screen reader friendly semantic markup This addresses accessibility concerns identified in code review. --- packages/toolbar/src/index.ts | 47 +++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/packages/toolbar/src/index.ts b/packages/toolbar/src/index.ts index 56857f94..9fd18be6 100644 --- a/packages/toolbar/src/index.ts +++ b/packages/toolbar/src/index.ts @@ -409,25 +409,68 @@ export class VanillaRenderer { trigger.className = 'hwp-toolbar-dropdown-trigger hwp-toolbar-button'; const labelText = typeof node.label === 'function' ? node.label() : node.label || ''; trigger.textContent = labelText + ' ▾'; + trigger.setAttribute('aria-haspopup', 'true'); + trigger.setAttribute('aria-expanded', 'false'); const menu = document.createElement('div'); menu.className = 'hwp-toolbar-dropdown-menu'; + menu.setAttribute('role', 'menu'); menu.style.display = 'none'; node.items!.forEach(item => { const itemEl = document.createElement('button'); itemEl.className = 'hwp-toolbar-dropdown-item'; + itemEl.setAttribute('role', 'menuitem'); const itemLabel = typeof item.label === 'function' ? item.label() : item.label || ''; itemEl.textContent = itemLabel; - if (item.onClick) itemEl.onclick = () => item.onClick!(); + if (item.onClick) { + itemEl.onclick = () => { + item.onClick!(); + closeMenu(); + }; + } menu.appendChild(itemEl); }); - trigger.onclick = () => { + const toggleMenu = () => { const isOpen = menu.style.display === 'block'; menu.style.display = isOpen ? 'none' : 'block'; + trigger.setAttribute('aria-expanded', isOpen ? 'false' : 'true'); + }; + + const closeMenu = () => { + menu.style.display = 'none'; + trigger.setAttribute('aria-expanded', 'false'); + }; + + // Click toggle + trigger.onclick = toggleMenu; + + // Keyboard navigation + trigger.onkeydown = (e: KeyboardEvent) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + toggleMenu(); + } else if (e.key === 'Escape') { + closeMenu(); + } }; + // Click outside to close + const handleClickOutside = (e: MouseEvent) => { + if (!container.contains(e.target as Node)) { + closeMenu(); + } + }; + + trigger.addEventListener('click', () => { + if (menu.style.display === 'block') { + document.addEventListener('click', handleClickOutside); + } else { + document.removeEventListener('click', handleClickOutside); + } + }); + container.appendChild(trigger); container.appendChild(menu); return container; From 90a96d8737fc74cdde01444ca8752ec0e0a4a6d5 Mon Sep 17 00:00:00 2001 From: Joe Fusco Date: Thu, 9 Oct 2025 20:00:40 -0400 Subject: [PATCH 28/44] fix(toolbar-demo): properly handle node positioning in sections Fix node filtering logic to correctly distribute nodes into left, center, and right sections based on their position property. Previous behavior: - Filtered out nodes with position='right' - Put everything else in left section - Ignored center positioning entirely New behavior: - Left section: nodes with no position or position='left' - Center section: nodes with position='center' - Right section: nodes with position='right' Also extracted renderNode helper to reduce duplication and improve code readability. --- .../example-app/app/components/Toolbar.tsx | 77 ++++++++++--------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx b/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx index 52d72c09..ecd81432 100644 --- a/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx +++ b/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx @@ -17,48 +17,55 @@ export function Toolbar() { return unsubscribe; }, []); - return ( -
    -
    - {nodes - .filter((node) => node.position !== 'right') - .map((node) => { - const label = typeof node.label === 'function' ? node.label() : node.label; + const leftNodes = nodes.filter((node) => !node.position || node.position === 'left'); + const centerNodes = nodes.filter((node) => node.position === 'center'); + const rightNodes = nodes.filter((node) => node.position === 'right'); + + const renderNode = (node: any) => { + const label = typeof node.label === 'function' ? node.label() : node.label; + + if (node.type === 'divider') { + return
    ; + } - if (node.type === 'divider') { - return
    ; - } + if (node.type === 'link' && node.href) { + return ( + + {label} + + ); + } - if (node.type === 'link' && node.href) { - return ( - - {label} - - ); - } + return ( + + ); + }; - return ( - - ); - })} + return ( +
    +
    + {leftNodes.map(renderNode)}
    -
    +
    + {centerNodes.map(renderNode)} +
    + {rightNodes.map(renderNode)} {state.user && ( - ))} + {/* Toolbar UI */}
    ); } ``` -## State Management +### 2. WordPress Context Integration + +```tsx +import { fetchWordPressUser } from '@/lib/wordpress'; + +// Fetch user and set WordPress context +const user = await fetchWordPressUser(); +toolbar.setWordPressContext({ + user: { + id: user.id, + name: user.name, + email: user.email + }, + site: { + url: 'http://localhost:8888', + adminUrl: 'http://localhost:8888/wp-admin' + } +}); +``` + +### 3. State Management + +```tsx +const { state, nodes } = useToolbar(toolbar); + +// Subscribe to state changes +useEffect(() => { + console.log('Toolbar state:', state); +}, [state]); +``` + +### 4. Custom Node Registration + +```tsx +toolbar.register('home', 'Home', () => { + router.push('/'); +}); +``` -The toolbar follows modern state management patterns (TanStack/Zustand): +## Features -1. **Framework-agnostic core** - `Toolbar` class manages state -2. **React integration** - Hooks subscribe to state changes -3. **Full UI control** - You render the toolbar however you want +- ✅ React hooks (`useToolbar`, `useToolbarState`, `useToolbarNodes`) +- ✅ Next.js App Router (App Directory) +- ✅ TypeScript support +- ✅ Framework-agnostic state management +- ✅ WordPress context integration +- ✅ Real WordPress data integration +- ✅ WPGraphQL support -## WordPress Integration +## Project Structure -The demo integrates with a local WordPress instance via REST API. +``` +toolbar-demo/ +├── example-app/ # Next.js application +│ ├── app/ +│ │ ├── components/ # React components +│ │ │ └── Toolbar.tsx +│ │ ├── globals.css +│ │ ├── layout.tsx +│ │ └── page.tsx # Demo page +│ ├── lib/ +│ │ ├── toolbar.ts # Singleton toolbar instance +│ │ └── wordpress.ts # WordPress API integration +│ ├── next.config.ts +│ ├── package.json +│ └── tsconfig.json +├── wp-env/ # WordPress environment +├── .wp-env.json # wp-env configuration +├── package.json +└── README.md +``` -### Demo Authentication +## Available Scripts -By default, the demo uses **mock authentication** to simplify the setup: +```bash +# Initial setup - installs dependencies and starts WordPress +npm run example:setup -```ts -// Demo user (no actual WordPress login required) -const user = await getCurrentUser(); // Returns mock user +# Start development servers (WordPress + Next.js) +npm run example:start -// Public posts endpoint (no authentication needed) -const posts = await getPosts(); // Fetches from /wp/v2/posts +# Stop WordPress server +npm run example:stop + +# Reset everything and start fresh +npm run example:prune + +# WordPress-only commands +npm run wp:start +npm run wp:stop +npm run wp:destroy ``` -This lets you test the toolbar immediately without WordPress login complexity. +## Key Files -### Production Authentication +- **`lib/toolbar.ts`** - Singleton toolbar instance configuration +- **`lib/wordpress.ts`** - WordPress REST API integration helpers +- **`app/components/Toolbar.tsx`** - Main toolbar component using React hooks +- **`app/page.tsx`** - Demo page showing WordPress integration -For production use, implement proper authentication using **WordPress Application Passwords**: +## WordPress Setup -1. **Generate Application Password**: - - Go to WordPress Admin → Users → Profile - - Scroll to "Application Passwords" - - Create a new password +The wp-env configuration includes: +- WordPress with WPGraphQL plugin +- Admin credentials: `admin` / `password` +- GraphQL endpoint: `http://localhost:8888/?graphql` +- REST API endpoint: `http://localhost:8888/?rest_route=/wp/v2/...` +- Pretty permalinks enabled +- CORS headers enabled for localhost:3000 -2. **Configure Environment**: - ```bash - cp .env.local.example .env.local - # Add your credentials to .env.local - ``` +## Environment Configuration -3. **Update `lib/wordpress.ts`**: - ```ts - const auth = btoa(`${process.env.WP_USERNAME}:${process.env.WP_APP_PASSWORD}`); - - export async function fetchFromWordPress(endpoint: string) { - const response = await fetch(`${WP_API_URL}/wp-json${endpoint}`, { - headers: { - 'Authorization': `Basic ${auth}` - } - }); - // ... - } - ``` +The example uses standard ports (3000 for frontend, 8888 for WordPress) to match other hwptoolkit examples. + +## TypeScript Support + +The example includes full TypeScript support with proper types for: +- Toolbar state and nodes +- WordPress API responses +- React hook return types -### Features Demonstrated +## Trouble Shooting -- **WordPress Connection**: Fetch data from WordPress REST API -- **Post Management**: Load and display WordPress posts -- **Dynamic Toolbar**: Nodes appear/disappear based on WordPress context -- **Error Handling**: Clear error messages for connection issues +To reset the WP server and re-run setup you can run `npm run example:prune` and confirm "Yes" at any prompts. -### Troubleshooting +## Learn More -**CORS Errors** -- Make sure wp-env is running: `npx wp-env start` -- Check WordPress is accessible at http://localhost:8001 -- MU plugin should enable CORS headers automatically +- [@wpengine/hwp-toolbar documentation](../../../packages/toolbar/README.md) +- [Next.js Documentation](https://nextjs.org/docs) +- [React Hooks Documentation](https://reactjs.org/docs/hooks-intro.html) +- [WPGraphQL](https://www.wpgraphql.com/) -**Connection Failed** -- Verify wp-env is running: `npx wp-env start` -- Check the port matches `.wp-env.json` (default: 8001) -- Try accessing http://localhost:8001 in your browser +## License -**No Posts Available** -- Create sample posts in WordPress Admin -- Or run: `npx wp-env run cli wp post generate --count=5` +BSD-3-Clause diff --git a/examples/next/toolbar-demo/example-app/.env.local.example b/examples/next/toolbar-demo/example-app/.env.local.example index 3cbbdc1c..9292ea3d 100644 --- a/examples/next/toolbar-demo/example-app/.env.local.example +++ b/examples/next/toolbar-demo/example-app/.env.local.example @@ -2,7 +2,7 @@ # Copy this file to .env.local and update with your values # WordPress Site URL -NEXT_PUBLIC_WP_URL=http://localhost:8891 +NEXT_PUBLIC_WP_URL=http://localhost:8888 # Production Authentication (optional) # For real authentication, generate Application Passwords in WordPress: diff --git a/examples/next/toolbar-demo/example-app/dev.sh b/examples/next/toolbar-demo/example-app/dev.sh deleted file mode 100755 index 0fff7f2d..00000000 --- a/examples/next/toolbar-demo/example-app/dev.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -set -a -source .env -set +a -npx next dev --port "$PORT" diff --git a/examples/next/toolbar-demo/example-app/package.json b/examples/next/toolbar-demo/example-app/package.json index 43a85c76..8daffa2d 100644 --- a/examples/next/toolbar-demo/example-app/package.json +++ b/examples/next/toolbar-demo/example-app/package.json @@ -3,14 +3,13 @@ "version": "0.1.0", "private": true, "scripts": { - "predev": "node ../scripts/setup-env.js", - "dev": "bash dev.sh", + "dev": "next dev --port 3000", "build": "next build", "start": "next start" }, "dependencies": { - "@wpengine/hwp-toolbar": "workspace:*", - "next": "^15.4.7", + "@wpengine/hwp-toolbar": "file:../../../../packages/toolbar", + "next": "^15.5", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/next/toolbar-demo/package.json b/examples/next/toolbar-demo/package.json index 8959d4f9..af0ea4f7 100644 --- a/examples/next/toolbar-demo/package.json +++ b/examples/next/toolbar-demo/package.json @@ -4,10 +4,12 @@ "description": "React hooks toolbar demo with Next.js App Router", "private": true, "scripts": { - "example:dev": "npm --prefix ./example-app run dev", - "example:build": "npm --prefix ./example-app run build", - "example:start": "node scripts/setup-env.js && npm install && concurrently \"npm run wp:start\" \"sleep 5 && npm run example:dev\"", + "example:setup": "npm run app:install && npm run wp:start", + "example:start": "concurrently \"npm run wp:start\" \"sleep 5 && npm run app:dev\"", "example:stop": "npm run wp:stop", + "example:prune": "npm run wp:destroy && npm run example:setup && npm run example:start", + "app:dev": "cd example-app && npm run dev && cd ..", + "app:install": "cd example-app && npm install && cd ..", "wp:start": "wp-env start", "wp:stop": "wp-env stop", "wp:destroy": "wp-env destroy" diff --git a/examples/next/toolbar-demo/scripts/setup-env.js b/examples/next/toolbar-demo/scripts/setup-env.js deleted file mode 100755 index b55f1f9e..00000000 --- a/examples/next/toolbar-demo/scripts/setup-env.js +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env node - -/** - * Generate .env file with calculated ports for this example - */ - -const { getPorts } = require('../../../../scripts/get-ports.js'); -const fs = require('fs'); -const path = require('path'); - -const examplePath = 'next/toolbar-demo'; -const ports = getPorts(examplePath); - -// Create .env file for Next.js -const envContent = `# Auto-generated by setup-env.js - DO NOT EDIT MANUALLY -PORT=${ports.FRONTEND_PORT} -NEXT_PUBLIC_WP_URL=http://localhost:${ports.WP_PORT} -WP_PORT=${ports.WP_PORT} -WP_TEST_PORT=${ports.WP_TEST_PORT} -`; - -const envPath = path.join(__dirname, '../example-app/.env'); -fs.writeFileSync(envPath, envContent); - -console.log(`✓ Generated .env for ${examplePath}`); -console.log(` Frontend: ${ports.FRONTEND_PORT}`); -console.log(` WordPress: ${ports.WP_PORT}`); -console.log(` WP Test: ${ports.WP_TEST_PORT}`); - -// Update .wp-env.json -const pluginsDir = path.resolve(__dirname, '../../../../plugins'); -const wpEnvConfig = { - phpVersion: '8.3', - plugins: [ - 'https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip', - path.join(pluginsDir, 'hwp-cors-local'), - path.join(pluginsDir, 'hwp-frontend-links'), - path.join(pluginsDir, 'hwp-wp-env-helpers') - ], - config: { - WP_DEBUG: true, - WP_DEBUG_LOG: true, - GRAPHQL_DEBUG: true, - WP_HOME: `http://localhost:${ports.WP_PORT}`, - HEADLESS_FRONTEND_URL: `http://localhost:${ports.FRONTEND_PORT}` - }, - port: ports.WP_PORT, - testsPort: ports.WP_TEST_PORT, - mappings: { - db: './wp-env/db', - '.htaccess': './.htaccess' - }, - lifecycleScripts: { - afterStart: 'wp-env run cli -- wp rewrite structure \'/%postname%/\' --hard && wp-env run cli -- wp theme activate twentytwentyfour' - } -}; - -const wpEnvPath = path.join(__dirname, '../.wp-env.json'); -fs.writeFileSync(wpEnvPath, JSON.stringify(wpEnvConfig, null, 2) + '\n'); - -console.log(`✓ Updated .wp-env.json`); - -// Copy .htaccess from template -const htaccessTemplatePath = path.join(__dirname, '../../../../scripts/templates/.htaccess'); -const htaccessPath = path.join(__dirname, '../.htaccess'); -fs.copyFileSync(htaccessTemplatePath, htaccessPath); -console.log(`✓ Generated .htaccess`); From 02b38071745431e8016a56024b3f50e886a5d42c Mon Sep 17 00:00:00 2001 From: Theofanis Despoudis <328805+theodesp@users.noreply.github.com> Date: Thu, 16 Oct 2025 12:48:13 +0100 Subject: [PATCH 40/44] Update packages/toolbar/src/core/VanillaRenderer.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/toolbar/src/core/VanillaRenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolbar/src/core/VanillaRenderer.js b/packages/toolbar/src/core/VanillaRenderer.js index f5c5ca29..c572700a 100644 --- a/packages/toolbar/src/core/VanillaRenderer.js +++ b/packages/toolbar/src/core/VanillaRenderer.js @@ -289,7 +289,7 @@ export class VanillaRenderer { // Click outside to close const handleClickOutside = (e) => { - if (!container.contains(e.target)) { + if (!(e.target instanceof Element) || !container.contains(e.target)) { closeMenu(); } }; From 7aed6567b2c9510226b0ff1bf48a4b418172dc58 Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Thu, 16 Oct 2025 15:16:49 +0100 Subject: [PATCH 41/44] Move example projects to packages/toolbar/examples Relocated Next.js and Vanilla JS toolbar demo examples and related plugins from the root examples/ and plugins/ directories into packages/toolbar/examples/. Updated documentation, configuration, and paths to reflect the new structure. Removed IMPLEMENTATION_BREAKDOWN.md as part of project cleanup. --- IMPLEMENTATION_BREAKDOWN.md | 302 --- packages/toolbar/README.md | 35 +- .../toolbar/examples/next}/.gitignore | 0 packages/toolbar/examples/next/.wp-env.json | 26 + .../toolbar/examples/next}/README.md | 6 +- .../next}/example-app/.env.local.example | 0 .../example-app/app/components/Toolbar.tsx | 0 .../next}/example-app/app/globals.css | 0 .../examples/next}/example-app/app/layout.tsx | 0 .../examples/next}/example-app/app/page.tsx | 0 .../examples/next}/example-app/lib/toolbar.ts | 0 .../next}/example-app/lib/wordpress.ts | 0 .../examples/next}/example-app/next-env.d.ts | 0 .../examples/next}/example-app/next.config.ts | 0 .../next/example-app/package-lock.json | 481 ++++ .../examples/next}/example-app/package.json | 2 +- .../examples/next}/example-app/tsconfig.json | 0 .../toolbar/examples/next/package-lock.json | 2171 +++++++++++++++++ .../toolbar/examples/next}/package.json | 2 +- .../plugins}/hwp-cors-local/CHANGELOG.md | 0 .../plugins}/hwp-cors-local/README.md | 0 .../plugins}/hwp-cors-local/composer.json | 0 .../hwp-cors-local/hwp-cors-local.php | 0 .../plugins}/hwp-frontend-links/CHANGELOG.md | 0 .../plugins}/hwp-frontend-links/README.md | 0 .../plugins}/hwp-frontend-links/composer.json | 0 .../hwp-frontend-links/hwp-frontend-links.php | 0 .../plugins}/hwp-wp-env-helpers/CHANGELOG.md | 0 .../plugins}/hwp-wp-env-helpers/README.md | 0 .../plugins}/hwp-wp-env-helpers/composer.json | 0 .../hwp-wp-env-helpers/hwp-wp-env-helpers.php | 0 .../toolbar/examples/vanilla}/.gitignore | 0 .../toolbar/examples/vanilla}/.wp-env.json | 6 +- .../toolbar/examples/vanilla}/README.md | 15 +- .../vanilla/example-app/.env.example.local | 5 + .../examples/vanilla}/example-app/index.html | 0 .../vanilla/example-app/package-lock.json | 1026 ++++++++ .../vanilla}/example-app/package.json | 4 +- .../examples/vanilla}/example-app/src/main.js | 0 .../vanilla}/example-app/src/style.css | 0 .../vanilla}/example-app/vite.config.js | 0 .../examples/vanilla/package-lock.json | 2171 +++++++++++++++++ .../toolbar/examples/vanilla}/package.json | 2 +- pnpm-workspace.yaml | 2 - 44 files changed, 5938 insertions(+), 318 deletions(-) delete mode 100644 IMPLEMENTATION_BREAKDOWN.md rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/.gitignore (100%) create mode 100644 packages/toolbar/examples/next/.wp-env.json rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/README.md (99%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/.env.local.example (100%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/app/components/Toolbar.tsx (100%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/app/globals.css (100%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/app/layout.tsx (100%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/app/page.tsx (100%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/lib/toolbar.ts (100%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/lib/wordpress.ts (100%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/next-env.d.ts (100%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/next.config.ts (100%) create mode 100644 packages/toolbar/examples/next/example-app/package-lock.json rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/package.json (86%) rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/example-app/tsconfig.json (100%) create mode 100644 packages/toolbar/examples/next/package-lock.json rename {examples/next/toolbar-demo => packages/toolbar/examples/next}/package.json (91%) rename {plugins => packages/toolbar/examples/plugins}/hwp-cors-local/CHANGELOG.md (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-cors-local/README.md (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-cors-local/composer.json (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-cors-local/hwp-cors-local.php (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-frontend-links/CHANGELOG.md (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-frontend-links/README.md (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-frontend-links/composer.json (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-frontend-links/hwp-frontend-links.php (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-wp-env-helpers/CHANGELOG.md (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-wp-env-helpers/README.md (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-wp-env-helpers/composer.json (100%) rename {plugins => packages/toolbar/examples/plugins}/hwp-wp-env-helpers/hwp-wp-env-helpers.php (100%) rename {examples/vanilla/toolbar-demo => packages/toolbar/examples/vanilla}/.gitignore (100%) rename {examples/vanilla/toolbar-demo => packages/toolbar/examples/vanilla}/.wp-env.json (82%) rename {examples/vanilla/toolbar-demo => packages/toolbar/examples/vanilla}/README.md (92%) create mode 100644 packages/toolbar/examples/vanilla/example-app/.env.example.local rename {examples/vanilla/toolbar-demo => packages/toolbar/examples/vanilla}/example-app/index.html (100%) create mode 100644 packages/toolbar/examples/vanilla/example-app/package-lock.json rename {examples/vanilla/toolbar-demo => packages/toolbar/examples/vanilla}/example-app/package.json (71%) rename {examples/vanilla/toolbar-demo => packages/toolbar/examples/vanilla}/example-app/src/main.js (100%) rename {examples/vanilla/toolbar-demo => packages/toolbar/examples/vanilla}/example-app/src/style.css (100%) rename {examples/vanilla/toolbar-demo => packages/toolbar/examples/vanilla}/example-app/vite.config.js (100%) create mode 100644 packages/toolbar/examples/vanilla/package-lock.json rename {examples/vanilla/toolbar-demo => packages/toolbar/examples/vanilla}/package.json (91%) diff --git a/IMPLEMENTATION_BREAKDOWN.md b/IMPLEMENTATION_BREAKDOWN.md deleted file mode 100644 index 05326363..00000000 --- a/IMPLEMENTATION_BREAKDOWN.md +++ /dev/null @@ -1,302 +0,0 @@ -# Headless WordPress Plugin Implementation - Breakdown - -## Overview - -Implemented a modular, production-ready plugin architecture for headless WordPress development, replacing template-based mu-plugins with composable, single-responsibility plugins. - -## What Was Done - -### 1. Created Three Modular WordPress Plugins - -#### `/plugins/hwp-cors-local/` -**Purpose**: Enables CORS headers for local development environments - -**Key Features**: -- Only activates when `WP_ENVIRONMENT_TYPE === 'local'` OR `WP_DEBUG === true` -- Configurable via `HEADLESS_FRONTEND_URL` constant -- Handles preflight OPTIONS requests automatically -- Allows credentials and common HTTP methods (GET, POST, OPTIONS, PUT, DELETE) -- **No hardcoded ports** - fully dynamic configuration - -**Implementation**: -- Hooks into `rest_api_init` action -- Filters `rest_pre_serve_request` to add CORS headers -- Returns null and does nothing if `HEADLESS_FRONTEND_URL` not defined - -**Security**: Automatically disabled in production environments - -#### `/plugins/hwp-frontend-links/` -**Purpose**: Adds "View on Frontend" links to WordPress admin interface - -**Key Features**: -- Adds admin bar link on singular post/page views -- Adds row actions on Posts and Pages list screens -- Opens links in new tab with proper security attributes -- Fully customizable via `hwp_frontend_links_post_path` filter -- **No hardcoded ports** - fully dynamic configuration - -**Implementation**: -- Hooks into `admin_bar_menu` action (priority 100) -- Filters `post_row_actions` and `page_row_actions` -- Constructs URLs using `HEADLESS_FRONTEND_URL` constant + post slug -- Returns early if `HEADLESS_FRONTEND_URL` not defined - -**Customization Examples**: -```php -// Use post ID instead of slug -add_filter( 'hwp_frontend_links_post_path', function( $path, $post ) { - return '/post/' . $post->ID; -}, 10, 2 ); - -// Include post type in path -add_filter( 'hwp_frontend_links_post_path', function( $path, $post ) { - return '/' . $post->post_type . '/' . $post->post_name; -}, 10, 2 ); -``` - -#### `/plugins/hwp-wp-env-helpers/` -**Purpose**: Fixes wp-env quirks specific to Docker environments - -**Key Features**: -- Forces REST API to use `?rest_route=` query parameter format -- Prevents .htaccess-related conflicts in Docker environments -- Only activates when `WP_ENVIRONMENT_TYPE === 'local'` - -**Implementation**: -- Hooks into `rest_url` filter -- Transforms permalink-based REST URLs to query parameter format -- Example: `http://localhost:8888/wp-json/wp/v2/posts` → `http://localhost:8888/?rest_route=/wp/v2/posts` - -**Technical Details**: This solves Docker volume mount behavior issues where permalink routing may not function correctly. - -### 2. Updated WordPress URL Configuration Pattern - -**Previous Pattern** (Aggressive/Faust-like): -- `WP_HOME` pointed to frontend application -- WordPress would redirect to frontend -- Only works for specific use cases - -**New Pattern** (Production-Ready): -- `WP_HOME` points to WordPress instance itself (`http://localhost:8644`) -- `HEADLESS_FRONTEND_URL` configured separately (`http://localhost:3644`) -- WordPress remains fully functional and accessible -- Frontend application configured independently -- Supports true decoupled architecture - -**Configuration Example** (`.wp-env.json`): -```json -{ - "config": { - "WP_HOME": "http://localhost:8644", - "HEADLESS_FRONTEND_URL": "http://localhost:3644" - } -} -``` - -### 3. Updated Example Applications - -Both `examples/next/toolbar-demo` and `examples/vanilla/toolbar-demo` were updated: - -**Changes**: -- PHP version updated from 8.0 to 8.3 -- Removed mu-plugin template mapping -- Added modular plugin references in `.wp-env.json`: - ```json - { - "plugins": [ - "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip", - "../../../../plugins/hwp-cors-local", - "../../../../plugins/hwp-frontend-links", - "../../../../plugins/hwp-wp-env-helpers" - ] - } - ``` -- Updated `setup-env.js` to generate correct constants -- Removed mu-plugin generation code - -### 4. Created Professional Documentation - -Each plugin includes a formal technical README covering: -- Purpose and requirements -- Configuration instructions -- Behavior and technical details -- Installation methods (wp-env and manual) -- Customization examples (where applicable) -- License information - -**Documentation Standards**: -- No emojis -- Surgically succinct -- Technical and precise -- Aligned with project standards - -## Git Commits Created - -### Commit 1: `feat(plugins): Add modular headless WordPress plugins` -Added three reusable plugins: -- `plugins/hwp-cors-local/` (plugin file + README) -- `plugins/hwp-frontend-links/` (plugin file + README) -- `plugins/hwp-wp-env-helpers/` (plugin file + README) - -**File Count**: 6 files (3 PHP files + 3 README files) - -### Commit 2: `refactor(examples): Use production WordPress URL pattern with modular plugins` -Updated toolbar demo examples: -- `examples/next/toolbar-demo/scripts/setup-env.js` -- `examples/vanilla/toolbar-demo/scripts/setup-env.js` -- `examples/vanilla/toolbar-demo/.wp-env.json` -- `scripts/templates/mu-plugin.php` - -**Changes**: -- WP_HOME → WordPress instance -- HEADLESS_FRONTEND_URL → Frontend application -- Plugin references instead of mu-plugin mapping -- PHP 8.3 upgrade - -## Architecture Benefits - -### 1. Modularity -- Each plugin has single responsibility -- Plugins can be used independently or together -- Easy to add/remove based on project needs - -### 2. Reusability -- Plugins work in any headless WordPress project -- Not tied to specific example implementations -- Can be distributed via Packagist or GitHub - -### 3. Production-Ready -- WordPress remains fully functional -- No aggressive URL overriding -- Clear separation of concerns -- Environment-specific activation - -### 4. Dynamic Configuration -- **Zero hardcoded ports** -- All configuration via constants -- Works with any port assignment -- Automatic port calculation via `get-ports.js` - -### 5. Composability -- Mix and match plugins based on needs -- Filter hooks for customization -- Standard WordPress plugin architecture - -## Port Calculation System - -### How It Works -1. `scripts/get-ports.js` calculates unique ports per example -2. Based on hash of example path -3. Ensures no port conflicts between examples - -### Port Assignments -- **Vanilla Example**: - - Frontend: 3644 - - WordPress: 8644 - - WP Test: 8645 - -- **Next.js Example**: - - Frontend: 3975 - - WordPress: 8975 - - WP Test: 8976 - -### Dynamic Generation -- `setup-env.js` runs on every start -- Generates `.env` files for frontend -- Generates `.wp-env.json` for WordPress -- Injects correct ports into all configuration - -## Known Issues - -### Plugin Path Resolution -**Issue**: wp-env cannot resolve relative plugin paths from example subdirectories - -**Error Message**: -``` -Warning: The 'hwp-cors-local' plugin could not be found. -``` - -**Current Path**: `../../../../plugins/hwp-cors-local` - -**Possible Solutions**: -1. Use absolute paths in `.wp-env.json` -2. Symlink plugins into example directories -3. Publish plugins and use URLs (like WPGraphQL) -4. Update wp-env configuration strategy - -**Impact**: Plugins are not loading in wp-env, so CORS and frontend links features are not active - -### Frontend Port Shift -**Issue**: Vite detected port 3644 in use and shifted to 3645 - -**Impact**: Frontend running on different port than WordPress expects - -**Solution**: Ensure ports are available before starting, or update WordPress constant dynamically - -## Testing Performed - -### Configuration Generation -✅ Both examples generate correct `.wp-env.json` files -✅ Dynamic ports calculated correctly -✅ WP_HOME points to WordPress instance -✅ HEADLESS_FRONTEND_URL points to frontend - -### WordPress Startup -✅ WordPress containers start successfully -✅ WPGraphQL activates correctly -✅ Constants injected into wp-config.php -❌ Custom plugins fail to load (path resolution issue) - -### Frontend Startup -✅ Vite starts (on shifted port) -✅ Next.js would start similarly - -### Concurrently Integration -✅ Both WordPress and frontend start together -✅ Output displays both processes - -## Next Steps - -To complete implementation: - -1. **Fix Plugin Path Resolution** - - Investigate wp-env plugin loading mechanism - - Test absolute paths vs relative paths - - Consider symlinking or alternative approaches - -2. **Verify Plugin Functionality** - - Test CORS headers with frontend API calls - - Verify admin bar links appear - - Test REST API query parameter format - -3. **Test Frontend-Backend Communication** - - Make GraphQL requests from frontend - - Verify CORS allows requests - - Test toolbar integration - -4. **Documentation Updates** - - Add troubleshooting section to plugin READMEs - - Document wp-env path resolution behavior - - Create integration examples - -## Files Modified - -### New Files Created -- `/plugins/hwp-cors-local/hwp-cors-local.php` -- `/plugins/hwp-cors-local/README.md` -- `/plugins/hwp-frontend-links/hwp-frontend-links.php` -- `/plugins/hwp-frontend-links/README.md` -- `/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php` -- `/plugins/hwp-wp-env-helpers/README.md` - -### Files Modified -- `/examples/next/toolbar-demo/scripts/setup-env.js` -- `/examples/vanilla/toolbar-demo/scripts/setup-env.js` -- `/examples/vanilla/toolbar-demo/.wp-env.json` (generated) -- `/scripts/templates/mu-plugin.php` - -## Summary - -Successfully created a modular, production-ready plugin architecture for headless WordPress development. The implementation follows WordPress best practices, uses single-responsibility plugins, provides complete documentation, and eliminates all hardcoded configuration. The system is fully dynamic, reusable across projects, and composable based on specific needs. - -The main remaining task is resolving wp-env's plugin path resolution to enable the plugins to load correctly in the development environment. diff --git a/packages/toolbar/README.md b/packages/toolbar/README.md index a409e5d1..93caafc9 100644 --- a/packages/toolbar/README.md +++ b/packages/toolbar/README.md @@ -4,6 +4,30 @@ A lightweight, performant toolbar for headless WordPress. Works with any JavaScript framework or vanilla JS. +## Table of Contents + +- [Features](#features) +- [Installation](#installation) +- [Quick Start](#quick-start) + - [Example Projects](#example-projects) + - [Vanilla JavaScript](#vanilla-javascript) + - [React (Recommended)](#react-recommended) +- [Core API](#core-api) + - [Toolbar Class](#toolbar-class) + - [Renderers](#renderers) +- [Styling](#styling) +- [React Hooks API](#react-hooks-api) + - [`useToolbar(toolbar)`](#usetoolbartoolbar) + - [`useToolbarState(toolbar)`](#usetoolbarstatetoolbar) + - [`useToolbarNodes(toolbar)`](#usetoolbarnodestoolbar) +- [Framework Examples](#framework-examples) + - [Vue](#vue) + - [Vanilla JavaScript](#vanilla-javascript-1) +- [TypeScript](#typescript) +- [Development](#development) +- [License](#license) + + ## Features - 🎯 **Framework Agnostic** - Works with React, Vue, Svelte, or vanilla JavaScript @@ -20,6 +44,15 @@ npm install @wpengine/hwp-toolbar ## Quick Start +### Example Projects + +Check out the complete example projects in the `examples/` directory: + +- **Next.js**: `examples/next/` - Full Next.js application with Apollo GraphQL integration +- **Vanilla JavaScript**: `examples/vanilla/` - Pure JavaScript implementation with demo HTML + +Each example includes setup instructions and demonstrates different integration patterns. + ### Vanilla JavaScript ```javascript @@ -260,4 +293,4 @@ open demo.html ## License -BSD-0-Clause +BSD-2-Clause diff --git a/examples/next/toolbar-demo/.gitignore b/packages/toolbar/examples/next/.gitignore similarity index 100% rename from examples/next/toolbar-demo/.gitignore rename to packages/toolbar/examples/next/.gitignore diff --git a/packages/toolbar/examples/next/.wp-env.json b/packages/toolbar/examples/next/.wp-env.json new file mode 100644 index 00000000..ae80ede2 --- /dev/null +++ b/packages/toolbar/examples/next/.wp-env.json @@ -0,0 +1,26 @@ +{ + "phpVersion": "8.3", + "plugins": [ + "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip", + "../plugins/hwp-cors-local", + "../plugins/hwp-frontend-links", + "../plugins/hwp-wp-env-helpers" + ], + "config": { + "WP_DEBUG": true, + "SCRIPT_DEBUG": false, + "GRAPHQL_DEBUG": true, + "WP_DEBUG_LOG": true, + "WP_DEBUG_DISPLAY": false, + "SAVEQUERIES": false, + "WP_HOME": "http://localhost:8888", + "HEADLESS_FRONTEND_URL": "http://localhost:3000" + }, + "mappings": { + "db": "./wp-env/db", + ".htaccess": "./.htaccess" + }, + "lifecycleScripts": { + "afterStart": "wp-env run cli -- wp theme activate twentytwentyfour && wp-env run cli -- wp rewrite structure '/%postname%/' --hard" + } +} \ No newline at end of file diff --git a/examples/next/toolbar-demo/README.md b/packages/toolbar/examples/next/README.md similarity index 99% rename from examples/next/toolbar-demo/README.md rename to packages/toolbar/examples/next/README.md index b77120bc..b3500f9a 100644 --- a/examples/next/toolbar-demo/README.md +++ b/packages/toolbar/examples/next/README.md @@ -2,13 +2,17 @@ In this example we show how to integrate the Headless WordPress Toolbar into a Next.js application using React hooks and WordPress backend using WPGraphQL. +## Table of Contents + + + ## Getting Started > [!IMPORTANT] > Docker Desktop needs to be installed to run WordPress locally. 1. Create a `.env.local` file in the `examples/next/toolbar-demo` directory with the following content: - ``` + ```env NEXT_PUBLIC_WP_URL=http://localhost:8888 ``` 2. Run `npm run example:setup` to install dependencies and configure the local WP server. diff --git a/examples/next/toolbar-demo/example-app/.env.local.example b/packages/toolbar/examples/next/example-app/.env.local.example similarity index 100% rename from examples/next/toolbar-demo/example-app/.env.local.example rename to packages/toolbar/examples/next/example-app/.env.local.example diff --git a/examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx b/packages/toolbar/examples/next/example-app/app/components/Toolbar.tsx similarity index 100% rename from examples/next/toolbar-demo/example-app/app/components/Toolbar.tsx rename to packages/toolbar/examples/next/example-app/app/components/Toolbar.tsx diff --git a/examples/next/toolbar-demo/example-app/app/globals.css b/packages/toolbar/examples/next/example-app/app/globals.css similarity index 100% rename from examples/next/toolbar-demo/example-app/app/globals.css rename to packages/toolbar/examples/next/example-app/app/globals.css diff --git a/examples/next/toolbar-demo/example-app/app/layout.tsx b/packages/toolbar/examples/next/example-app/app/layout.tsx similarity index 100% rename from examples/next/toolbar-demo/example-app/app/layout.tsx rename to packages/toolbar/examples/next/example-app/app/layout.tsx diff --git a/examples/next/toolbar-demo/example-app/app/page.tsx b/packages/toolbar/examples/next/example-app/app/page.tsx similarity index 100% rename from examples/next/toolbar-demo/example-app/app/page.tsx rename to packages/toolbar/examples/next/example-app/app/page.tsx diff --git a/examples/next/toolbar-demo/example-app/lib/toolbar.ts b/packages/toolbar/examples/next/example-app/lib/toolbar.ts similarity index 100% rename from examples/next/toolbar-demo/example-app/lib/toolbar.ts rename to packages/toolbar/examples/next/example-app/lib/toolbar.ts diff --git a/examples/next/toolbar-demo/example-app/lib/wordpress.ts b/packages/toolbar/examples/next/example-app/lib/wordpress.ts similarity index 100% rename from examples/next/toolbar-demo/example-app/lib/wordpress.ts rename to packages/toolbar/examples/next/example-app/lib/wordpress.ts diff --git a/examples/next/toolbar-demo/example-app/next-env.d.ts b/packages/toolbar/examples/next/example-app/next-env.d.ts similarity index 100% rename from examples/next/toolbar-demo/example-app/next-env.d.ts rename to packages/toolbar/examples/next/example-app/next-env.d.ts diff --git a/examples/next/toolbar-demo/example-app/next.config.ts b/packages/toolbar/examples/next/example-app/next.config.ts similarity index 100% rename from examples/next/toolbar-demo/example-app/next.config.ts rename to packages/toolbar/examples/next/example-app/next.config.ts diff --git a/packages/toolbar/examples/next/example-app/package-lock.json b/packages/toolbar/examples/next/example-app/package-lock.json new file mode 100644 index 00000000..051322d3 --- /dev/null +++ b/packages/toolbar/examples/next/example-app/package-lock.json @@ -0,0 +1,481 @@ +{ + "name": "toolbar-demo-app", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "toolbar-demo-app", + "version": "0.1.0", + "dependencies": { + "@wpengine/hwp-toolbar": "file:../../../", + "next": "^15.5", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "typescript": "^5.8.3" + } + }, + "../../..": { + "name": "@wpengine/hwp-toolbar", + "version": "0.0.1", + "license": "BSD-0-Clause", + "devDependencies": { + "react": "^18.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "../../../../node_modules/.pnpm/@types+node@20.19.19/node_modules/@types/node": { + "version": "20.19.19", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "../../../../node_modules/.pnpm/@types+react-dom@19.2.1_@types+react@19.1.3/node_modules/@types/react-dom": { + "version": "19.2.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "../../../../node_modules/.pnpm/@types+react@19.1.3/node_modules/@types/react": { + "version": "19.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "../../../../node_modules/.pnpm/next@15.5.4_@babel+core@7.25.7_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_d2870efaa1b6a2350638906ce2f2ab4a/node_modules/next": { + "version": "15.5.4", + "license": "MIT", + "dependencies": { + "@next/env": "15.5.4", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "devDependencies": { + "@ampproject/toolbox-optimizer": "2.8.3", + "@babel/code-frame": "7.26.2", + "@babel/core": "7.26.10", + "@babel/eslint-parser": "7.24.6", + "@babel/generator": "7.27.0", + "@babel/plugin-syntax-bigint": "7.8.3", + "@babel/plugin-syntax-dynamic-import": "7.8.3", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@babel/plugin-syntax-jsx": "7.25.9", + "@babel/plugin-syntax-typescript": "7.25.4", + "@babel/plugin-transform-class-properties": "7.25.9", + "@babel/plugin-transform-export-namespace-from": "7.25.9", + "@babel/plugin-transform-modules-commonjs": "7.26.3", + "@babel/plugin-transform-numeric-separator": "7.25.9", + "@babel/plugin-transform-object-rest-spread": "7.25.9", + "@babel/plugin-transform-runtime": "7.26.10", + "@babel/preset-env": "7.26.9", + "@babel/preset-react": "7.26.3", + "@babel/preset-typescript": "7.27.0", + "@babel/runtime": "7.27.0", + "@babel/traverse": "7.27.0", + "@babel/types": "7.27.0", + "@base-ui-components/react": "1.0.0-beta.2", + "@capsizecss/metrics": "3.4.0", + "@edge-runtime/cookies": "6.0.0", + "@edge-runtime/ponyfill": "4.0.0", + "@edge-runtime/primitives": "6.0.0", + "@hapi/accept": "5.0.2", + "@jest/transform": "29.5.0", + "@jest/types": "29.5.0", + "@mswjs/interceptors": "0.23.0", + "@napi-rs/triples": "1.2.0", + "@next/font": "15.5.4", + "@next/polyfill-module": "15.5.4", + "@next/polyfill-nomodule": "15.5.4", + "@next/react-refresh-utils": "15.5.4", + "@next/swc": "15.5.4", + "@opentelemetry/api": "1.6.0", + "@playwright/test": "1.51.1", + "@rspack/core": "1.4.5", + "@storybook/addon-a11y": "8.6.0", + "@storybook/addon-essentials": "8.6.0", + "@storybook/addon-interactions": "8.6.0", + "@storybook/addon-webpack5-compiler-swc": "3.0.0", + "@storybook/blocks": "8.6.0", + "@storybook/react": "8.6.0", + "@storybook/react-webpack5": "8.6.0", + "@storybook/test": "8.6.0", + "@storybook/test-runner": "0.21.0", + "@swc/core": "1.11.24", + "@swc/types": "0.1.7", + "@taskr/clear": "1.1.0", + "@taskr/esnext": "1.1.0", + "@types/amphtml-validator": "1.0.0", + "@types/babel__code-frame": "7.0.6", + "@types/babel__core": "7.20.5", + "@types/babel__generator": "7.27.0", + "@types/babel__template": "7.4.4", + "@types/babel__traverse": "7.20.7", + "@types/bytes": "3.1.1", + "@types/ci-info": "2.0.0", + "@types/compression": "0.0.36", + "@types/content-disposition": "0.5.4", + "@types/content-type": "1.1.3", + "@types/cookie": "0.3.3", + "@types/cross-spawn": "6.0.0", + "@types/debug": "4.1.5", + "@types/express-serve-static-core": "4.17.33", + "@types/fresh": "0.5.0", + "@types/glob": "7.1.1", + "@types/jsonwebtoken": "9.0.0", + "@types/lodash": "4.14.198", + "@types/lodash.curry": "4.1.6", + "@types/path-to-regexp": "1.7.0", + "@types/picomatch": "2.3.3", + "@types/platform": "1.3.4", + "@types/react": "19.0.8", + "@types/react-dom": "19.0.3", + "@types/react-is": "18.2.4", + "@types/semver": "7.3.1", + "@types/send": "0.14.4", + "@types/shell-quote": "1.7.1", + "@types/tar": "6.1.5", + "@types/text-table": "0.2.1", + "@types/ua-parser-js": "0.7.36", + "@types/webpack-sources1": "npm:@types/webpack-sources@0.1.5", + "@types/ws": "8.2.0", + "@vercel/ncc": "0.34.0", + "@vercel/nft": "0.27.1", + "@vercel/turbopack-ecmascript-runtime": "*", + "acorn": "8.14.0", + "amphtml-validator": "1.0.38", + "anser": "1.4.9", + "arg": "4.1.0", + "assert": "2.0.0", + "async-retry": "1.2.3", + "async-sema": "3.0.0", + "axe-playwright": "2.0.3", + "babel-loader": "10.0.0", + "babel-plugin-react-compiler": "19.1.0-rc.2", + "babel-plugin-transform-define": "2.0.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24", + "browserify-zlib": "0.2.0", + "browserslist": "4.24.4", + "buffer": "5.6.0", + "busboy": "1.6.0", + "bytes": "3.1.1", + "ci-info": "watson/ci-info#f43f6a1cefff47fb361c88cf4b943fdbcaafe540", + "cli-select": "1.1.2", + "client-only": "0.0.1", + "commander": "12.1.0", + "comment-json": "3.0.3", + "compression": "1.7.4", + "conf": "5.0.0", + "constants-browserify": "1.0.0", + "content-disposition": "0.5.3", + "content-type": "1.0.4", + "cookie": "0.4.1", + "cross-env": "6.0.3", + "cross-spawn": "7.0.3", + "crypto-browserify": "3.12.0", + "css-loader": "7.1.2", + "css.escape": "1.5.1", + "cssnano-preset-default": "7.0.6", + "data-uri-to-buffer": "3.0.1", + "debug": "4.1.1", + "devalue": "2.0.1", + "domain-browser": "4.19.0", + "edge-runtime": "4.0.1", + "events": "3.3.0", + "find-up": "4.1.0", + "fresh": "0.5.2", + "glob": "7.1.7", + "gzip-size": "5.1.1", + "http-proxy": "1.18.1", + "http-proxy-agent": "5.0.0", + "https-browserify": "1.0.0", + "https-proxy-agent": "5.0.1", + "icss-utils": "5.1.0", + "ignore-loader": "0.1.2", + "image-size": "1.2.1", + "is-docker": "2.0.0", + "is-wsl": "2.2.0", + "jest-worker": "27.5.1", + "json5": "2.2.3", + "jsonwebtoken": "9.0.0", + "loader-runner": "4.3.0", + "loader-utils2": "npm:loader-utils@2.0.4", + "loader-utils3": "npm:loader-utils@3.1.3", + "lodash.curry": "4.1.1", + "mini-css-extract-plugin": "2.4.4", + "msw": "2.3.0", + "nanoid": "3.1.32", + "native-url": "0.3.4", + "neo-async": "2.6.1", + "node-html-parser": "5.3.3", + "ora": "4.0.4", + "os-browserify": "0.3.0", + "p-limit": "3.1.0", + "p-queue": "6.6.2", + "path-browserify": "1.0.1", + "path-to-regexp": "6.3.0", + "picomatch": "4.0.1", + "postcss-flexbugs-fixes": "5.0.2", + "postcss-modules-extract-imports": "3.0.0", + "postcss-modules-local-by-default": "4.2.0", + "postcss-modules-scope": "3.0.0", + "postcss-modules-values": "4.0.0", + "postcss-preset-env": "7.4.3", + "postcss-safe-parser": "6.0.0", + "postcss-scss": "4.0.3", + "postcss-value-parser": "4.2.0", + "process": "0.11.10", + "punycode": "2.1.1", + "querystring-es3": "0.2.1", + "raw-body": "2.4.1", + "react-refresh": "0.12.0", + "recast": "0.23.11", + "regenerator-runtime": "0.13.4", + "safe-stable-stringify": "2.5.0", + "sass-loader": "15.0.0", + "schema-utils2": "npm:schema-utils@2.7.1", + "schema-utils3": "npm:schema-utils@3.0.0", + "semver": "7.3.2", + "send": "0.18.0", + "server-only": "0.0.1", + "setimmediate": "1.0.5", + "shell-quote": "1.7.3", + "source-map": "0.6.1", + "source-map-loader": "5.0.0", + "source-map08": "npm:source-map@0.8.0-beta.0", + "stacktrace-parser": "0.1.10", + "storybook": "8.6.0", + "stream-browserify": "3.0.0", + "stream-http": "3.1.1", + "strict-event-emitter": "0.5.0", + "string_decoder": "1.3.0", + "string-hash": "1.1.3", + "strip-ansi": "6.0.0", + "style-loader": "4.0.0", + "superstruct": "1.0.3", + "tar": "6.1.15", + "taskr": "1.1.0", + "terser": "5.27.0", + "terser-webpack-plugin": "5.3.9", + "text-table": "0.2.0", + "timers-browserify": "2.0.12", + "tty-browserify": "0.0.1", + "typescript": "5.8.2", + "ua-parser-js": "1.0.35", + "unistore": "3.4.1", + "util": "0.12.4", + "vm-browserify": "1.1.2", + "watchpack": "2.4.0", + "web-vitals": "4.2.1", + "webpack": "5.98.0", + "webpack-sources1": "npm:webpack-sources@1.4.3", + "webpack-sources3": "npm:webpack-sources@3.2.3", + "ws": "8.2.3", + "zod": "3.25.76", + "zod-validation-error": "3.4.0" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.5.4", + "@next/swc-darwin-x64": "15.5.4", + "@next/swc-linux-arm64-gnu": "15.5.4", + "@next/swc-linux-arm64-musl": "15.5.4", + "@next/swc-linux-x64-gnu": "15.5.4", + "@next/swc-linux-x64-musl": "15.5.4", + "@next/swc-win32-arm64-msvc": "15.5.4", + "@next/swc-win32-x64-msvc": "15.5.4", + "sharp": "^0.34.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "../../../../node_modules/.pnpm/react-dom@19.2.0_react@19.2.0/node_modules/react-dom": { + "version": "19.2.0", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "../../../../node_modules/.pnpm/react@18.3.1/node_modules/react": { + "version": "18.3.1", + "extraneous": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../../node_modules/.pnpm/react@19.2.0/node_modules/react": { + "version": "19.2.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript": { + "version": "5.8.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "devDependencies": { + "@dprint/formatter": "^0.4.1", + "@dprint/typescript": "0.93.3", + "@esfx/canceltoken": "^1.0.0", + "@eslint/js": "^9.17.0", + "@octokit/rest": "^21.0.2", + "@types/chai": "^4.3.20", + "@types/diff": "^5.2.3", + "@types/minimist": "^1.2.5", + "@types/mocha": "^10.0.10", + "@types/ms": "^0.7.34", + "@types/node": "latest", + "@types/source-map-support": "^0.5.10", + "@types/which": "^3.0.4", + "@typescript-eslint/rule-tester": "^8.18.1", + "@typescript-eslint/type-utils": "^8.18.1", + "@typescript-eslint/utils": "^8.18.1", + "azure-devops-node-api": "^14.1.0", + "c8": "^10.1.3", + "chai": "^4.5.0", + "chalk": "^4.1.2", + "chokidar": "^3.6.0", + "diff": "^5.2.0", + "dprint": "^0.47.6", + "esbuild": "^0.24.0", + "eslint": "^9.17.0", + "eslint-formatter-autolinkable-stylish": "^1.4.0", + "eslint-plugin-regexp": "^2.7.0", + "fast-xml-parser": "^4.5.1", + "glob": "^10.4.5", + "globals": "^15.13.0", + "hereby": "^1.10.0", + "jsonc-parser": "^3.3.1", + "knip": "^5.41.0", + "minimist": "^1.2.8", + "mocha": "^10.8.2", + "mocha-fivemat-progress-reporter": "^0.1.0", + "monocart-coverage-reports": "^2.11.4", + "ms": "^2.1.3", + "playwright": "^1.49.1", + "source-map-support": "^0.5.21", + "tslib": "^2.8.1", + "typescript": "^5.7.2", + "typescript-eslint": "^8.18.1", + "which": "^3.0.1" + }, + "engines": { + "node": ">=14.17" + } + }, + "../../../../packages/toolbar": { + "name": "@wpengine/hwp-toolbar", + "version": "0.0.1", + "extraneous": true, + "license": "BSD-0-Clause", + "devDependencies": { + "react": "^18.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "../../../packages/toolbar": { + "extraneous": true + }, + "node_modules/@types/node": { + "resolved": "../../../../node_modules/.pnpm/@types+node@20.19.19/node_modules/@types/node", + "link": true + }, + "node_modules/@types/react": { + "resolved": "../../../../node_modules/.pnpm/@types+react@19.1.3/node_modules/@types/react", + "link": true + }, + "node_modules/@types/react-dom": { + "resolved": "../../../../node_modules/.pnpm/@types+react-dom@19.2.1_@types+react@19.1.3/node_modules/@types/react-dom", + "link": true + }, + "node_modules/@wpengine/hwp-toolbar": { + "resolved": "../../..", + "link": true + }, + "node_modules/next": { + "resolved": "../../../../node_modules/.pnpm/next@15.5.4_@babel+core@7.25.7_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_d2870efaa1b6a2350638906ce2f2ab4a/node_modules/next", + "link": true + }, + "node_modules/react": { + "resolved": "../../../../node_modules/.pnpm/react@19.2.0/node_modules/react", + "link": true + }, + "node_modules/react-dom": { + "resolved": "../../../../node_modules/.pnpm/react-dom@19.2.0_react@19.2.0/node_modules/react-dom", + "link": true + }, + "node_modules/typescript": { + "resolved": "../../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript", + "link": true + } + } +} diff --git a/examples/next/toolbar-demo/example-app/package.json b/packages/toolbar/examples/next/example-app/package.json similarity index 86% rename from examples/next/toolbar-demo/example-app/package.json rename to packages/toolbar/examples/next/example-app/package.json index 8daffa2d..28d193d0 100644 --- a/examples/next/toolbar-demo/example-app/package.json +++ b/packages/toolbar/examples/next/example-app/package.json @@ -8,7 +8,7 @@ "start": "next start" }, "dependencies": { - "@wpengine/hwp-toolbar": "file:../../../../packages/toolbar", + "@wpengine/hwp-toolbar": "file:../../../", "next": "^15.5", "react": "^19.0.0", "react-dom": "^19.0.0" diff --git a/examples/next/toolbar-demo/example-app/tsconfig.json b/packages/toolbar/examples/next/example-app/tsconfig.json similarity index 100% rename from examples/next/toolbar-demo/example-app/tsconfig.json rename to packages/toolbar/examples/next/example-app/tsconfig.json diff --git a/packages/toolbar/examples/next/package-lock.json b/packages/toolbar/examples/next/package-lock.json new file mode 100644 index 00000000..b2aab9bd --- /dev/null +++ b/packages/toolbar/examples/next/package-lock.json @@ -0,0 +1,2171 @@ +{ + "name": "hwptoolkit-example-nextjs-toolbar-demo", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hwptoolkit-example-nextjs-toolbar-demo", + "version": "1.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "@wordpress/env": "^10.31.0", + "concurrently": "^8.2.2" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", + "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", + "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", + "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", + "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", + "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", + "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", + "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", + "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.9.0.tgz", + "integrity": "sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.0", + "@inquirer/confirm": "^5.1.19", + "@inquirer/editor": "^4.2.21", + "@inquirer/expand": "^4.0.21", + "@inquirer/input": "^4.2.5", + "@inquirer/number": "^3.0.21", + "@inquirer/password": "^4.0.21", + "@inquirer/rawlist": "^4.1.9", + "@inquirer/search": "^3.2.0", + "@inquirer/select": "^4.4.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", + "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", + "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", + "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/file-exists/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@kwsites/file-exists/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "24.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.2.tgz", + "integrity": "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.14.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@wordpress/env": { + "version": "10.32.0", + "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-10.32.0.tgz", + "integrity": "sha512-GHpcbfh/rUoXd7hwBy84ZBd1uhqQntd9CHrxk5hK/lLM9LULLwrRFC21ZwYwZuNjpdV+DslpsX0N/poe3ybaJQ==", + "license": "GPL-2.0-or-later", + "dependencies": { + "@inquirer/prompts": "^7.2.0", + "chalk": "^4.0.0", + "copy-dir": "^1.3.0", + "docker-compose": "^0.24.3", + "extract-zip": "^1.6.7", + "got": "^11.8.5", + "js-yaml": "^3.13.1", + "ora": "^4.0.2", + "rimraf": "^5.0.10", + "simple-git": "^3.5.0", + "terminal-link": "^2.0.0", + "yargs": "^17.3.0" + }, + "bin": { + "wp-env": "bin/wp-env" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/copy-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/copy-dir/-/copy-dir-1.3.0.tgz", + "integrity": "sha512-Q4+qBFnN4bwGwvtXXzbp4P/4iNk0MaiGAzvQ8OiMtlLjkIKjmNN689uVzShSM0908q7GoFHXIPx4zi75ocoaHw==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/docker-compose": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", + "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", + "license": "MIT", + "dependencies": { + "yaml": "^2.2.2" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "license": "MIT", + "dependencies": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-git": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", + "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/simple-git/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/simple-git/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/examples/next/toolbar-demo/package.json b/packages/toolbar/examples/next/package.json similarity index 91% rename from examples/next/toolbar-demo/package.json rename to packages/toolbar/examples/next/package.json index af0ea4f7..234f80a3 100644 --- a/examples/next/toolbar-demo/package.json +++ b/packages/toolbar/examples/next/package.json @@ -4,7 +4,7 @@ "description": "React hooks toolbar demo with Next.js App Router", "private": true, "scripts": { - "example:setup": "npm run app:install && npm run wp:start", + "example:setup": "npm install && npm run app:install && npm run wp:start", "example:start": "concurrently \"npm run wp:start\" \"sleep 5 && npm run app:dev\"", "example:stop": "npm run wp:stop", "example:prune": "npm run wp:destroy && npm run example:setup && npm run example:start", diff --git a/plugins/hwp-cors-local/CHANGELOG.md b/packages/toolbar/examples/plugins/hwp-cors-local/CHANGELOG.md similarity index 100% rename from plugins/hwp-cors-local/CHANGELOG.md rename to packages/toolbar/examples/plugins/hwp-cors-local/CHANGELOG.md diff --git a/plugins/hwp-cors-local/README.md b/packages/toolbar/examples/plugins/hwp-cors-local/README.md similarity index 100% rename from plugins/hwp-cors-local/README.md rename to packages/toolbar/examples/plugins/hwp-cors-local/README.md diff --git a/plugins/hwp-cors-local/composer.json b/packages/toolbar/examples/plugins/hwp-cors-local/composer.json similarity index 100% rename from plugins/hwp-cors-local/composer.json rename to packages/toolbar/examples/plugins/hwp-cors-local/composer.json diff --git a/plugins/hwp-cors-local/hwp-cors-local.php b/packages/toolbar/examples/plugins/hwp-cors-local/hwp-cors-local.php similarity index 100% rename from plugins/hwp-cors-local/hwp-cors-local.php rename to packages/toolbar/examples/plugins/hwp-cors-local/hwp-cors-local.php diff --git a/plugins/hwp-frontend-links/CHANGELOG.md b/packages/toolbar/examples/plugins/hwp-frontend-links/CHANGELOG.md similarity index 100% rename from plugins/hwp-frontend-links/CHANGELOG.md rename to packages/toolbar/examples/plugins/hwp-frontend-links/CHANGELOG.md diff --git a/plugins/hwp-frontend-links/README.md b/packages/toolbar/examples/plugins/hwp-frontend-links/README.md similarity index 100% rename from plugins/hwp-frontend-links/README.md rename to packages/toolbar/examples/plugins/hwp-frontend-links/README.md diff --git a/plugins/hwp-frontend-links/composer.json b/packages/toolbar/examples/plugins/hwp-frontend-links/composer.json similarity index 100% rename from plugins/hwp-frontend-links/composer.json rename to packages/toolbar/examples/plugins/hwp-frontend-links/composer.json diff --git a/plugins/hwp-frontend-links/hwp-frontend-links.php b/packages/toolbar/examples/plugins/hwp-frontend-links/hwp-frontend-links.php similarity index 100% rename from plugins/hwp-frontend-links/hwp-frontend-links.php rename to packages/toolbar/examples/plugins/hwp-frontend-links/hwp-frontend-links.php diff --git a/plugins/hwp-wp-env-helpers/CHANGELOG.md b/packages/toolbar/examples/plugins/hwp-wp-env-helpers/CHANGELOG.md similarity index 100% rename from plugins/hwp-wp-env-helpers/CHANGELOG.md rename to packages/toolbar/examples/plugins/hwp-wp-env-helpers/CHANGELOG.md diff --git a/plugins/hwp-wp-env-helpers/README.md b/packages/toolbar/examples/plugins/hwp-wp-env-helpers/README.md similarity index 100% rename from plugins/hwp-wp-env-helpers/README.md rename to packages/toolbar/examples/plugins/hwp-wp-env-helpers/README.md diff --git a/plugins/hwp-wp-env-helpers/composer.json b/packages/toolbar/examples/plugins/hwp-wp-env-helpers/composer.json similarity index 100% rename from plugins/hwp-wp-env-helpers/composer.json rename to packages/toolbar/examples/plugins/hwp-wp-env-helpers/composer.json diff --git a/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php b/packages/toolbar/examples/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php similarity index 100% rename from plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php rename to packages/toolbar/examples/plugins/hwp-wp-env-helpers/hwp-wp-env-helpers.php diff --git a/examples/vanilla/toolbar-demo/.gitignore b/packages/toolbar/examples/vanilla/.gitignore similarity index 100% rename from examples/vanilla/toolbar-demo/.gitignore rename to packages/toolbar/examples/vanilla/.gitignore diff --git a/examples/vanilla/toolbar-demo/.wp-env.json b/packages/toolbar/examples/vanilla/.wp-env.json similarity index 82% rename from examples/vanilla/toolbar-demo/.wp-env.json rename to packages/toolbar/examples/vanilla/.wp-env.json index c3558e96..da54eab1 100644 --- a/examples/vanilla/toolbar-demo/.wp-env.json +++ b/packages/toolbar/examples/vanilla/.wp-env.json @@ -2,9 +2,9 @@ "phpVersion": "8.4", "plugins": [ "https://github.com/wp-graphql/wp-graphql/releases/latest/download/wp-graphql.zip", - "../../../plugins/hwp-cors-local", - "../../../plugins/hwp-frontend-links", - "../../../plugins/hwp-wp-env-helpers" + "../plugins/hwp-cors-local", + "../plugins/hwp-frontend-links", + "../plugins/hwp-wp-env-helpers" ], "config": { "WP_DEBUG": true, diff --git a/examples/vanilla/toolbar-demo/README.md b/packages/toolbar/examples/vanilla/README.md similarity index 92% rename from examples/vanilla/toolbar-demo/README.md rename to packages/toolbar/examples/vanilla/README.md index 3201d2aa..e97c2c50 100644 --- a/examples/vanilla/toolbar-demo/README.md +++ b/packages/toolbar/examples/vanilla/README.md @@ -7,8 +7,17 @@ In this example we show how to integrate the Headless WordPress Toolbar into a v > [!IMPORTANT] > Docker Desktop needs to be installed to run WordPress locally. -1. Run `npm run example:setup` to install dependencies and configure the local WP server. -2. Run `npm run example:start` to start the WP server and Vite development server. + +1. Create a `.env.local` file in the `examples/next/toolbar-demo` directory with the following content: + ```env +VITE_FRONTEND_PORT=3000 +VITE_WP_URL=http://localhost:8888 +VITE_WP_PORT=8888 +VITE_WP_TEST_PORT=8889 + ``` + +2. Run `npm run example:setup` to install dependencies and configure the local WP server. +3. Run `npm run example:start` `to start the WP server and Vite development server. The example will be available at: - **Frontend**: http://localhost:3000 @@ -199,4 +208,4 @@ To reset the WP server and re-run setup you can run `npm run example:prune` and ## License -BSD-0-Clause +BSD-2-Clause diff --git a/packages/toolbar/examples/vanilla/example-app/.env.example.local b/packages/toolbar/examples/vanilla/example-app/.env.example.local new file mode 100644 index 00000000..c7d64dc6 --- /dev/null +++ b/packages/toolbar/examples/vanilla/example-app/.env.example.local @@ -0,0 +1,5 @@ +# Values should match the ../.wp-env.json +VITE_FRONTEND_PORT=3000 +VITE_WP_URL=http://localhost:8888 +VITE_WP_PORT=8888 +VITE_WP_TEST_PORT=8889 diff --git a/examples/vanilla/toolbar-demo/example-app/index.html b/packages/toolbar/examples/vanilla/example-app/index.html similarity index 100% rename from examples/vanilla/toolbar-demo/example-app/index.html rename to packages/toolbar/examples/vanilla/example-app/index.html diff --git a/packages/toolbar/examples/vanilla/example-app/package-lock.json b/packages/toolbar/examples/vanilla/example-app/package-lock.json new file mode 100644 index 00000000..ba7005b2 --- /dev/null +++ b/packages/toolbar/examples/vanilla/example-app/package-lock.json @@ -0,0 +1,1026 @@ +{ + "name": "toolbar-demo-app", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "toolbar-demo-app", + "version": "0.1.0", + "dependencies": { + "@wpengine/hwp-toolbar": "file:../../../", + "vite": "^6.0.11" + } + }, + "../../..": { + "name": "@wpengine/hwp-toolbar", + "version": "0.0.1", + "license": "BSD-0-Clause", + "devDependencies": { + "react": "^18.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "../../../../packages/toolbar": { + "extraneous": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@wpengine/hwp-toolbar": { + "resolved": "../../..", + "link": true + }, + "node_modules/esbuild": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vite": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.0.tgz", + "integrity": "sha512-oLnWs9Hak/LOlKjeSpOwD6JMks8BeICEdYMJBf6P4Lac/pO9tKiv/XhXnAM7nNfSkZahjlCZu9sS50zL8fSnsw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/examples/vanilla/toolbar-demo/example-app/package.json b/packages/toolbar/examples/vanilla/example-app/package.json similarity index 71% rename from examples/vanilla/toolbar-demo/example-app/package.json rename to packages/toolbar/examples/vanilla/example-app/package.json index cc5f9f92..d75dc9a2 100644 --- a/examples/vanilla/toolbar-demo/example-app/package.json +++ b/packages/toolbar/examples/vanilla/example-app/package.json @@ -9,9 +9,7 @@ "preview": "vite preview" }, "dependencies": { - "@wpengine/hwp-toolbar": "file:../../../../packages/toolbar" - }, - "devDependencies": { + "@wpengine/hwp-toolbar": "file:../../../", "vite": "^6.0.11" } } diff --git a/examples/vanilla/toolbar-demo/example-app/src/main.js b/packages/toolbar/examples/vanilla/example-app/src/main.js similarity index 100% rename from examples/vanilla/toolbar-demo/example-app/src/main.js rename to packages/toolbar/examples/vanilla/example-app/src/main.js diff --git a/examples/vanilla/toolbar-demo/example-app/src/style.css b/packages/toolbar/examples/vanilla/example-app/src/style.css similarity index 100% rename from examples/vanilla/toolbar-demo/example-app/src/style.css rename to packages/toolbar/examples/vanilla/example-app/src/style.css diff --git a/examples/vanilla/toolbar-demo/example-app/vite.config.js b/packages/toolbar/examples/vanilla/example-app/vite.config.js similarity index 100% rename from examples/vanilla/toolbar-demo/example-app/vite.config.js rename to packages/toolbar/examples/vanilla/example-app/vite.config.js diff --git a/packages/toolbar/examples/vanilla/package-lock.json b/packages/toolbar/examples/vanilla/package-lock.json new file mode 100644 index 00000000..9f056b6b --- /dev/null +++ b/packages/toolbar/examples/vanilla/package-lock.json @@ -0,0 +1,2171 @@ +{ + "name": "toolbar-demo", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "toolbar-demo", + "version": "1.0.0", + "license": "BSD-0-Clause", + "dependencies": { + "@wordpress/env": "^10.31.0", + "concurrently": "^8.2.2" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", + "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", + "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", + "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", + "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", + "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", + "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", + "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", + "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.9.0.tgz", + "integrity": "sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.0", + "@inquirer/confirm": "^5.1.19", + "@inquirer/editor": "^4.2.21", + "@inquirer/expand": "^4.0.21", + "@inquirer/input": "^4.2.5", + "@inquirer/number": "^3.0.21", + "@inquirer/password": "^4.0.21", + "@inquirer/rawlist": "^4.1.9", + "@inquirer/search": "^3.2.0", + "@inquirer/select": "^4.4.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", + "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", + "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", + "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/file-exists/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@kwsites/file-exists/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "24.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.2.tgz", + "integrity": "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.14.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@wordpress/env": { + "version": "10.32.0", + "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-10.32.0.tgz", + "integrity": "sha512-GHpcbfh/rUoXd7hwBy84ZBd1uhqQntd9CHrxk5hK/lLM9LULLwrRFC21ZwYwZuNjpdV+DslpsX0N/poe3ybaJQ==", + "license": "GPL-2.0-or-later", + "dependencies": { + "@inquirer/prompts": "^7.2.0", + "chalk": "^4.0.0", + "copy-dir": "^1.3.0", + "docker-compose": "^0.24.3", + "extract-zip": "^1.6.7", + "got": "^11.8.5", + "js-yaml": "^3.13.1", + "ora": "^4.0.2", + "rimraf": "^5.0.10", + "simple-git": "^3.5.0", + "terminal-link": "^2.0.0", + "yargs": "^17.3.0" + }, + "bin": { + "wp-env": "bin/wp-env" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/copy-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/copy-dir/-/copy-dir-1.3.0.tgz", + "integrity": "sha512-Q4+qBFnN4bwGwvtXXzbp4P/4iNk0MaiGAzvQ8OiMtlLjkIKjmNN689uVzShSM0908q7GoFHXIPx4zi75ocoaHw==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/docker-compose": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", + "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", + "license": "MIT", + "dependencies": { + "yaml": "^2.2.2" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "license": "MIT", + "dependencies": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-git": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", + "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/simple-git/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/simple-git/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/examples/vanilla/toolbar-demo/package.json b/packages/toolbar/examples/vanilla/package.json similarity index 91% rename from examples/vanilla/toolbar-demo/package.json rename to packages/toolbar/examples/vanilla/package.json index ef85f919..f5bf3107 100644 --- a/examples/vanilla/toolbar-demo/package.json +++ b/packages/toolbar/examples/vanilla/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "Vanilla JavaScript example using Vite for the Headless WordPress Toolbar", "scripts": { - "example:setup": "npm run app:install && npm run wp:start", + "example:setup": "npm install && npm run app:install && npm run wp:start", "example:start": "concurrently \"npm run wp:start\" \"sleep 5 && npm run app:dev\"", "example:stop": "npm run wp:stop", "example:prune": "npm run wp:destroy && npm run example:setup && npm run example:start", diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6bfbe867..3e195dbf 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,3 @@ packages: - 'packages/*' - 'plugins/*' - - 'examples/next/*/example-app' - - 'examples/vanilla/*/example-app' From 5f2aa1bb03a2d927c9afcc9373fd63f4a5bdf1ba Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Thu, 16 Oct 2025 15:29:57 +0100 Subject: [PATCH 42/44] Fix for next example. --- .../next/example-app/package-lock.json | 1164 ++++++++++++----- 1 file changed, 815 insertions(+), 349 deletions(-) diff --git a/packages/toolbar/examples/next/example-app/package-lock.json b/packages/toolbar/examples/next/example-app/package-lock.json index 051322d3..d0ed1b1b 100644 --- a/packages/toolbar/examples/next/example-app/package-lock.json +++ b/packages/toolbar/examples/next/example-app/package-lock.json @@ -39,35 +39,689 @@ } } }, - "../../../../node_modules/.pnpm/@types+node@20.19.19/node_modules/@types/node": { - "version": "20.19.19", + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz", + "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz", + "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz", + "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz", + "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz", + "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz", + "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz", + "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz", + "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz", + "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz", + "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz", + "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz", + "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz", + "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz", + "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz", + "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz", + "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz", + "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.5.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz", + "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz", + "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz", + "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@next/env": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.5.tgz", + "integrity": "sha512-2Zhvss36s/yL+YSxD5ZL5dz5pI6ki1OLxYlh6O77VJ68sBnlUrl5YqhBgCy7FkdMsp9RBeGFwpuDCdpJOqdKeQ==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.5.tgz", + "integrity": "sha512-lYExGHuFIHeOxf40mRLWoA84iY2sLELB23BV5FIDHhdJkN1LpRTPc1MDOawgTo5ifbM5dvAwnGuHyNm60G1+jw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.5.tgz", + "integrity": "sha512-cacs/WQqa96IhqUm+7CY+z/0j9sW6X80KE07v3IAJuv+z0UNvJtKSlT/T1w1SpaQRa9l0wCYYZlRZUhUOvEVmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.5.tgz", + "integrity": "sha512-tLd90SvkRFik6LSfuYjcJEmwqcNEnVYVOyKTacSazya/SLlSwy/VYKsDE4GIzOBd+h3gW+FXqShc2XBavccHCg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.5.tgz", + "integrity": "sha512-ekV76G2R/l3nkvylkfy9jBSYHeB4QcJ7LdDseT6INnn1p51bmDS1eGoSoq+RxfQ7B1wt+Qa0pIl5aqcx0GLpbw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.5.tgz", + "integrity": "sha512-tI+sBu+3FmWtqlqD4xKJcj3KJtqbniLombKTE7/UWyyoHmOyAo3aZ7QcEHIOgInXOG1nt0rwh0KGmNbvSB0Djg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.5.tgz", + "integrity": "sha512-kDRh+epN/ulroNJLr+toDjN+/JClY5L+OAWjOrrKCI0qcKvTw9GBx7CU/rdA2bgi4WpZN3l0rf/3+b8rduEwrQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.5.tgz", + "integrity": "sha512-GDgdNPFFqiKjTrmfw01sMMRWhVN5wOCmFzPloxa7ksDfX6TZt62tAK986f0ZYqWpvDFqeBCLAzmgTURvtQBdgw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.5.tgz", + "integrity": "sha512-5kE3oRJxc7M8RmcTANP8RGoJkaYlwIiDD92gSwCjJY0+j8w8Sl1lvxgQ3bxfHY2KkHFai9tpy/Qx1saWV8eaJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.21.tgz", + "integrity": "sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, - "../../../../node_modules/.pnpm/@types+react-dom@19.2.1_@types+react@19.1.3/node_modules/@types/react-dom": { - "version": "19.2.1", + "node_modules/@types/react": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", + "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" } }, - "../../../../node_modules/.pnpm/@types+react@19.1.3/node_modules/@types/react": { - "version": "19.1.3", + "node_modules/@wpengine/hwp-toolbar": { + "resolved": "../../..", + "link": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "../../../../node_modules/.pnpm/next@15.5.4_@babel+core@7.25.7_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_d2870efaa1b6a2350638906ce2f2ab4a/node_modules/next": { - "version": "15.5.4", + "node_modules/next": { + "version": "15.5.5", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.5.tgz", + "integrity": "sha512-OQVdBPtpBfq7HxFN0kOVb7rXXOSIkt5lTzDJDGRBcOyVvNRIWFauMqi1gIHd1pszq1542vMOGY0HP4CaiALfkA==", "license": "MIT", "dependencies": { - "@next/env": "15.5.4", + "@next/env": "15.5.5", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -76,241 +730,18 @@ "bin": { "next": "dist/bin/next" }, - "devDependencies": { - "@ampproject/toolbox-optimizer": "2.8.3", - "@babel/code-frame": "7.26.2", - "@babel/core": "7.26.10", - "@babel/eslint-parser": "7.24.6", - "@babel/generator": "7.27.0", - "@babel/plugin-syntax-bigint": "7.8.3", - "@babel/plugin-syntax-dynamic-import": "7.8.3", - "@babel/plugin-syntax-import-attributes": "7.26.0", - "@babel/plugin-syntax-jsx": "7.25.9", - "@babel/plugin-syntax-typescript": "7.25.4", - "@babel/plugin-transform-class-properties": "7.25.9", - "@babel/plugin-transform-export-namespace-from": "7.25.9", - "@babel/plugin-transform-modules-commonjs": "7.26.3", - "@babel/plugin-transform-numeric-separator": "7.25.9", - "@babel/plugin-transform-object-rest-spread": "7.25.9", - "@babel/plugin-transform-runtime": "7.26.10", - "@babel/preset-env": "7.26.9", - "@babel/preset-react": "7.26.3", - "@babel/preset-typescript": "7.27.0", - "@babel/runtime": "7.27.0", - "@babel/traverse": "7.27.0", - "@babel/types": "7.27.0", - "@base-ui-components/react": "1.0.0-beta.2", - "@capsizecss/metrics": "3.4.0", - "@edge-runtime/cookies": "6.0.0", - "@edge-runtime/ponyfill": "4.0.0", - "@edge-runtime/primitives": "6.0.0", - "@hapi/accept": "5.0.2", - "@jest/transform": "29.5.0", - "@jest/types": "29.5.0", - "@mswjs/interceptors": "0.23.0", - "@napi-rs/triples": "1.2.0", - "@next/font": "15.5.4", - "@next/polyfill-module": "15.5.4", - "@next/polyfill-nomodule": "15.5.4", - "@next/react-refresh-utils": "15.5.4", - "@next/swc": "15.5.4", - "@opentelemetry/api": "1.6.0", - "@playwright/test": "1.51.1", - "@rspack/core": "1.4.5", - "@storybook/addon-a11y": "8.6.0", - "@storybook/addon-essentials": "8.6.0", - "@storybook/addon-interactions": "8.6.0", - "@storybook/addon-webpack5-compiler-swc": "3.0.0", - "@storybook/blocks": "8.6.0", - "@storybook/react": "8.6.0", - "@storybook/react-webpack5": "8.6.0", - "@storybook/test": "8.6.0", - "@storybook/test-runner": "0.21.0", - "@swc/core": "1.11.24", - "@swc/types": "0.1.7", - "@taskr/clear": "1.1.0", - "@taskr/esnext": "1.1.0", - "@types/amphtml-validator": "1.0.0", - "@types/babel__code-frame": "7.0.6", - "@types/babel__core": "7.20.5", - "@types/babel__generator": "7.27.0", - "@types/babel__template": "7.4.4", - "@types/babel__traverse": "7.20.7", - "@types/bytes": "3.1.1", - "@types/ci-info": "2.0.0", - "@types/compression": "0.0.36", - "@types/content-disposition": "0.5.4", - "@types/content-type": "1.1.3", - "@types/cookie": "0.3.3", - "@types/cross-spawn": "6.0.0", - "@types/debug": "4.1.5", - "@types/express-serve-static-core": "4.17.33", - "@types/fresh": "0.5.0", - "@types/glob": "7.1.1", - "@types/jsonwebtoken": "9.0.0", - "@types/lodash": "4.14.198", - "@types/lodash.curry": "4.1.6", - "@types/path-to-regexp": "1.7.0", - "@types/picomatch": "2.3.3", - "@types/platform": "1.3.4", - "@types/react": "19.0.8", - "@types/react-dom": "19.0.3", - "@types/react-is": "18.2.4", - "@types/semver": "7.3.1", - "@types/send": "0.14.4", - "@types/shell-quote": "1.7.1", - "@types/tar": "6.1.5", - "@types/text-table": "0.2.1", - "@types/ua-parser-js": "0.7.36", - "@types/webpack-sources1": "npm:@types/webpack-sources@0.1.5", - "@types/ws": "8.2.0", - "@vercel/ncc": "0.34.0", - "@vercel/nft": "0.27.1", - "@vercel/turbopack-ecmascript-runtime": "*", - "acorn": "8.14.0", - "amphtml-validator": "1.0.38", - "anser": "1.4.9", - "arg": "4.1.0", - "assert": "2.0.0", - "async-retry": "1.2.3", - "async-sema": "3.0.0", - "axe-playwright": "2.0.3", - "babel-loader": "10.0.0", - "babel-plugin-react-compiler": "19.1.0-rc.2", - "babel-plugin-transform-define": "2.0.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24", - "browserify-zlib": "0.2.0", - "browserslist": "4.24.4", - "buffer": "5.6.0", - "busboy": "1.6.0", - "bytes": "3.1.1", - "ci-info": "watson/ci-info#f43f6a1cefff47fb361c88cf4b943fdbcaafe540", - "cli-select": "1.1.2", - "client-only": "0.0.1", - "commander": "12.1.0", - "comment-json": "3.0.3", - "compression": "1.7.4", - "conf": "5.0.0", - "constants-browserify": "1.0.0", - "content-disposition": "0.5.3", - "content-type": "1.0.4", - "cookie": "0.4.1", - "cross-env": "6.0.3", - "cross-spawn": "7.0.3", - "crypto-browserify": "3.12.0", - "css-loader": "7.1.2", - "css.escape": "1.5.1", - "cssnano-preset-default": "7.0.6", - "data-uri-to-buffer": "3.0.1", - "debug": "4.1.1", - "devalue": "2.0.1", - "domain-browser": "4.19.0", - "edge-runtime": "4.0.1", - "events": "3.3.0", - "find-up": "4.1.0", - "fresh": "0.5.2", - "glob": "7.1.7", - "gzip-size": "5.1.1", - "http-proxy": "1.18.1", - "http-proxy-agent": "5.0.0", - "https-browserify": "1.0.0", - "https-proxy-agent": "5.0.1", - "icss-utils": "5.1.0", - "ignore-loader": "0.1.2", - "image-size": "1.2.1", - "is-docker": "2.0.0", - "is-wsl": "2.2.0", - "jest-worker": "27.5.1", - "json5": "2.2.3", - "jsonwebtoken": "9.0.0", - "loader-runner": "4.3.0", - "loader-utils2": "npm:loader-utils@2.0.4", - "loader-utils3": "npm:loader-utils@3.1.3", - "lodash.curry": "4.1.1", - "mini-css-extract-plugin": "2.4.4", - "msw": "2.3.0", - "nanoid": "3.1.32", - "native-url": "0.3.4", - "neo-async": "2.6.1", - "node-html-parser": "5.3.3", - "ora": "4.0.4", - "os-browserify": "0.3.0", - "p-limit": "3.1.0", - "p-queue": "6.6.2", - "path-browserify": "1.0.1", - "path-to-regexp": "6.3.0", - "picomatch": "4.0.1", - "postcss-flexbugs-fixes": "5.0.2", - "postcss-modules-extract-imports": "3.0.0", - "postcss-modules-local-by-default": "4.2.0", - "postcss-modules-scope": "3.0.0", - "postcss-modules-values": "4.0.0", - "postcss-preset-env": "7.4.3", - "postcss-safe-parser": "6.0.0", - "postcss-scss": "4.0.3", - "postcss-value-parser": "4.2.0", - "process": "0.11.10", - "punycode": "2.1.1", - "querystring-es3": "0.2.1", - "raw-body": "2.4.1", - "react-refresh": "0.12.0", - "recast": "0.23.11", - "regenerator-runtime": "0.13.4", - "safe-stable-stringify": "2.5.0", - "sass-loader": "15.0.0", - "schema-utils2": "npm:schema-utils@2.7.1", - "schema-utils3": "npm:schema-utils@3.0.0", - "semver": "7.3.2", - "send": "0.18.0", - "server-only": "0.0.1", - "setimmediate": "1.0.5", - "shell-quote": "1.7.3", - "source-map": "0.6.1", - "source-map-loader": "5.0.0", - "source-map08": "npm:source-map@0.8.0-beta.0", - "stacktrace-parser": "0.1.10", - "storybook": "8.6.0", - "stream-browserify": "3.0.0", - "stream-http": "3.1.1", - "strict-event-emitter": "0.5.0", - "string_decoder": "1.3.0", - "string-hash": "1.1.3", - "strip-ansi": "6.0.0", - "style-loader": "4.0.0", - "superstruct": "1.0.3", - "tar": "6.1.15", - "taskr": "1.1.0", - "terser": "5.27.0", - "terser-webpack-plugin": "5.3.9", - "text-table": "0.2.0", - "timers-browserify": "2.0.12", - "tty-browserify": "0.0.1", - "typescript": "5.8.2", - "ua-parser-js": "1.0.35", - "unistore": "3.4.1", - "util": "0.12.4", - "vm-browserify": "1.1.2", - "watchpack": "2.4.0", - "web-vitals": "4.2.1", - "webpack": "5.98.0", - "webpack-sources1": "npm:webpack-sources@1.4.3", - "webpack-sources3": "npm:webpack-sources@3.2.3", - "ws": "8.2.3", - "zod": "3.25.76", - "zod-validation-error": "3.4.0" - }, "engines": { "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.4", - "@next/swc-darwin-x64": "15.5.4", - "@next/swc-linux-arm64-gnu": "15.5.4", - "@next/swc-linux-arm64-musl": "15.5.4", - "@next/swc-linux-x64-gnu": "15.5.4", - "@next/swc-linux-x64-musl": "15.5.4", - "@next/swc-win32-arm64-msvc": "15.5.4", - "@next/swc-win32-x64-msvc": "15.5.4", + "@next/swc-darwin-arm64": "15.5.5", + "@next/swc-darwin-x64": "15.5.5", + "@next/swc-linux-arm64-gnu": "15.5.5", + "@next/swc-linux-arm64-musl": "15.5.5", + "@next/swc-linux-x64-gnu": "15.5.5", + "@next/swc-linux-x64-musl": "15.5.5", + "@next/swc-win32-arm64-msvc": "15.5.5", + "@next/swc-win32-x64-msvc": "15.5.5", "sharp": "^0.34.3" }, "peerDependencies": { @@ -336,146 +767,181 @@ } } }, - "../../../../node_modules/.pnpm/react-dom@19.2.0_react@19.2.0/node_modules/react-dom": { - "version": "19.2.0", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, - "peerDependencies": { - "react": "^19.2.0" + "engines": { + "node": "^10 || ^12 || >=14" } }, - "../../../../node_modules/.pnpm/react@18.3.1/node_modules/react": { - "version": "18.3.1", - "extraneous": true, + "node_modules/react": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "../../../../node_modules/.pnpm/react@19.2.0/node_modules/react": { + "node_modules/react-dom": { "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "../../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript": { - "version": "5.8.3", - "dev": true, + "node_modules/sharp": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz", + "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", + "hasInstallScript": true, "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.0", + "semver": "^7.7.2" }, - "devDependencies": { - "@dprint/formatter": "^0.4.1", - "@dprint/typescript": "0.93.3", - "@esfx/canceltoken": "^1.0.0", - "@eslint/js": "^9.17.0", - "@octokit/rest": "^21.0.2", - "@types/chai": "^4.3.20", - "@types/diff": "^5.2.3", - "@types/minimist": "^1.2.5", - "@types/mocha": "^10.0.10", - "@types/ms": "^0.7.34", - "@types/node": "latest", - "@types/source-map-support": "^0.5.10", - "@types/which": "^3.0.4", - "@typescript-eslint/rule-tester": "^8.18.1", - "@typescript-eslint/type-utils": "^8.18.1", - "@typescript-eslint/utils": "^8.18.1", - "azure-devops-node-api": "^14.1.0", - "c8": "^10.1.3", - "chai": "^4.5.0", - "chalk": "^4.1.2", - "chokidar": "^3.6.0", - "diff": "^5.2.0", - "dprint": "^0.47.6", - "esbuild": "^0.24.0", - "eslint": "^9.17.0", - "eslint-formatter-autolinkable-stylish": "^1.4.0", - "eslint-plugin-regexp": "^2.7.0", - "fast-xml-parser": "^4.5.1", - "glob": "^10.4.5", - "globals": "^15.13.0", - "hereby": "^1.10.0", - "jsonc-parser": "^3.3.1", - "knip": "^5.41.0", - "minimist": "^1.2.8", - "mocha": "^10.8.2", - "mocha-fivemat-progress-reporter": "^0.1.0", - "monocart-coverage-reports": "^2.11.4", - "ms": "^2.1.3", - "playwright": "^1.49.1", - "source-map-support": "^0.5.21", - "tslib": "^2.8.1", - "typescript": "^5.7.2", - "typescript-eslint": "^8.18.1", - "which": "^3.0.1" + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.4", + "@img/sharp-darwin-x64": "0.34.4", + "@img/sharp-libvips-darwin-arm64": "1.2.3", + "@img/sharp-libvips-darwin-x64": "1.2.3", + "@img/sharp-libvips-linux-arm": "1.2.3", + "@img/sharp-libvips-linux-arm64": "1.2.3", + "@img/sharp-libvips-linux-ppc64": "1.2.3", + "@img/sharp-libvips-linux-s390x": "1.2.3", + "@img/sharp-libvips-linux-x64": "1.2.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", + "@img/sharp-libvips-linuxmusl-x64": "1.2.3", + "@img/sharp-linux-arm": "0.34.4", + "@img/sharp-linux-arm64": "0.34.4", + "@img/sharp-linux-ppc64": "0.34.4", + "@img/sharp-linux-s390x": "0.34.4", + "@img/sharp-linux-x64": "0.34.4", + "@img/sharp-linuxmusl-arm64": "0.34.4", + "@img/sharp-linuxmusl-x64": "0.34.4", + "@img/sharp-wasm32": "0.34.4", + "@img/sharp-win32-arm64": "0.34.4", + "@img/sharp-win32-ia32": "0.34.4", + "@img/sharp-win32-x64": "0.34.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { - "node": ">=14.17" + "node": ">=0.10.0" } }, - "../../../../packages/toolbar": { - "name": "@wpengine/hwp-toolbar", - "version": "0.0.1", - "extraneous": true, - "license": "BSD-0-Clause", - "devDependencies": { - "react": "^18.3.1" + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" }, "engines": { - "node": ">=18" + "node": ">= 12.0.0" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" }, "peerDependenciesMeta": { - "react": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { "optional": true } } }, - "../../../packages/toolbar": { - "extraneous": true - }, - "node_modules/@types/node": { - "resolved": "../../../../node_modules/.pnpm/@types+node@20.19.19/node_modules/@types/node", - "link": true - }, - "node_modules/@types/react": { - "resolved": "../../../../node_modules/.pnpm/@types+react@19.1.3/node_modules/@types/react", - "link": true - }, - "node_modules/@types/react-dom": { - "resolved": "../../../../node_modules/.pnpm/@types+react-dom@19.2.1_@types+react@19.1.3/node_modules/@types/react-dom", - "link": true - }, - "node_modules/@wpengine/hwp-toolbar": { - "resolved": "../../..", - "link": true - }, - "node_modules/next": { - "resolved": "../../../../node_modules/.pnpm/next@15.5.4_@babel+core@7.25.7_@opentelemetry+api@1.9.0_@playwright+test@1.55.0_react-d_d2870efaa1b6a2350638906ce2f2ab4a/node_modules/next", - "link": true - }, - "node_modules/react": { - "resolved": "../../../../node_modules/.pnpm/react@19.2.0/node_modules/react", - "link": true - }, - "node_modules/react-dom": { - "resolved": "../../../../node_modules/.pnpm/react-dom@19.2.0_react@19.2.0/node_modules/react-dom", - "link": true + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/typescript": { - "resolved": "../../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript", - "link": true + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" } } } From 712bf6ad6e957225b6f98379d3ff965b54b69295 Mon Sep 17 00:00:00 2001 From: ahuseyn Date: Fri, 17 Oct 2025 12:18:08 +0200 Subject: [PATCH 43/44] update readme --- packages/toolbar/README.md | 81 +++++++++++++++----------------------- 1 file changed, 31 insertions(+), 50 deletions(-) diff --git a/packages/toolbar/README.md b/packages/toolbar/README.md index 93caafc9..8c9dfa9d 100644 --- a/packages/toolbar/README.md +++ b/packages/toolbar/README.md @@ -30,11 +30,10 @@ A lightweight, performant toolbar for headless WordPress. Works with any JavaScr ## Features -- 🎯 **Framework Agnostic** - Works with React, Vue, Svelte, or vanilla JavaScript -- ⚡ **Zero Dependencies** - Core library has no dependencies -- 🔒 **Type Safe** - Full TypeScript support -- 🪝 **React Hooks** - First-class React support with hooks -- 🎨 **Headless UI** - Full control over rendering and styling +- **Framework Agnostic** - Works with React, Vue, Svelte, or vanilla JavaScript +- **Zero Dependencies** - Core library has no dependencies +- **React Hooks** - First-class React support with hooks +- **Headless UI** - Full control over rendering and styling ## Installation @@ -56,44 +55,44 @@ Each example includes setup instructions and demonstrates different integration ### Vanilla JavaScript ```javascript -import { Toolbar, VanillaRenderer } from '@wpengine/hwp-toolbar'; -import '@wpengine/hwp-toolbar/styles'; +import { Toolbar, VanillaRenderer } from "@wpengine/hwp-toolbar"; +import "@wpengine/hwp-toolbar/styles"; const toolbar = new Toolbar({ onPreviewChange: (enabled) => { - console.log('Preview mode:', enabled); - } + console.log("Preview mode:", enabled); + }, }); toolbar.setWordPressContext({ - user: { id: 1, name: 'Admin' }, - site: { url: 'https://example.com', adminUrl: 'https://example.com/wp-admin' }, - post: { id: 123, title: 'Hello World', type: 'post', status: 'draft', slug: 'hello-world' } + user: { id: 1, name: "Admin" }, + site: { url: "https://example.com", adminUrl: "https://example.com/wp-admin" }, + post: { id: 123, title: "Hello World", type: "post", status: "draft", slug: "hello-world" }, }); -const renderer = new VanillaRenderer(toolbar, 'toolbar'); +const renderer = new VanillaRenderer(toolbar, "toolbar"); ``` ### React (Recommended) ```tsx -import { Toolbar } from '@wpengine/hwp-toolbar'; -import { useToolbar } from '@wpengine/hwp-toolbar/react'; +import { Toolbar } from "@wpengine/hwp-toolbar"; +import { useToolbar } from "@wpengine/hwp-toolbar/react"; const toolbar = new Toolbar({ onPreviewChange: (enabled) => { - console.log('Preview mode:', enabled); - } + console.log("Preview mode:", enabled); + }, }); function MyToolbar() { const { state, nodes } = useToolbar(toolbar); return ( -
    - {nodes.map(node => ( +
    + {nodes.map((node) => ( ))} {state.user && User: {state.user.name}} @@ -107,11 +106,13 @@ function MyToolbar() { ### Toolbar **Constructor** + ```javascript new Toolbar(config?) ``` **Config:** + - `onPreviewChange?: (enabled: boolean) => void` - Preview toggle callback **Methods:** @@ -139,9 +140,9 @@ toolbar.destroy() ### VanillaRenderer ```javascript -const renderer = new VanillaRenderer(toolbar, 'element-id'); +const renderer = new VanillaRenderer(toolbar, "element-id"); // or -const renderer = new VanillaRenderer(toolbar, document.getElementById('toolbar')); +const renderer = new VanillaRenderer(toolbar, document.getElementById("toolbar")); // Cleanup renderer.destroy(); @@ -160,7 +161,7 @@ The toolbar includes three built-in nodes: Import the base styles: ```javascript -import '@wpengine/hwp-toolbar/styles'; +import "@wpengine/hwp-toolbar/styles"; ``` ### Customization @@ -174,14 +175,6 @@ Override CSS custom properties: } ``` -Available variables: -- `--hwp-toolbar-bg` - Background color -- `--hwp-toolbar-border` - Border color -- `--hwp-toolbar-text` - Text color -- `--hwp-toolbar-primary` - Primary button color -- `--hwp-toolbar-primary-hover` - Primary button hover -- And more... - ## React Hooks API ### `useToolbar(toolbar)` @@ -189,7 +182,7 @@ Available variables: Returns both state and nodes in a single hook: ```tsx -import { useToolbar } from '@wpengine/hwp-toolbar/react'; +import { useToolbar } from "@wpengine/hwp-toolbar/react"; function MyToolbar() { const { state, nodes } = useToolbar(toolbar); @@ -202,7 +195,7 @@ function MyToolbar() { Subscribe to toolbar state only: ```tsx -import { useToolbarState } from '@wpengine/hwp-toolbar/react'; +import { useToolbarState } from "@wpengine/hwp-toolbar/react"; function UserDisplay() { const state = useToolbarState(toolbar); @@ -215,15 +208,15 @@ function UserDisplay() { Subscribe to visible nodes only: ```tsx -import { useToolbarNodes } from '@wpengine/hwp-toolbar/react'; +import { useToolbarNodes } from "@wpengine/hwp-toolbar/react"; function ToolbarButtons() { const nodes = useToolbarNodes(toolbar); return ( <> - {nodes.map(node => ( + {nodes.map((node) => ( ))} @@ -241,8 +234,8 @@ function ToolbarButtons() {