From e61c216278f43f88cc1d20ec94017af7247f8730 Mon Sep 17 00:00:00 2001 From: dzearing Date: Tue, 15 Jul 2025 20:57:57 -0700 Subject: [PATCH 01/15] staging. --- .gitignore | 2 + .npmrc | 4 + README.md | 177 +- apps/v1/README.md | 121 + .../v1/client/CSS_CONVENTIONS.md | 0 .../v1/client/Z_INDEX_GUIDELINES.md | 0 .../client/e2e}/breadcrumb-navigation.spec.ts | 0 .../client/e2e}/claude-code-mount-fix.spec.ts | 0 .../e2e}/claude-code-mount-issue.spec.ts | 0 .../e2e}/claude-code-tool-execution.spec.ts | 0 .../e2e}/claude-code-validation.spec.ts | 0 .../v1/client/e2e}/feedback-feature.spec.ts | 0 .../v1/client/e2e}/feedback-fixes.spec.ts | 0 .../client/e2e}/session-rehydration.spec.ts | 0 .../v1/client/e2e}/simple-breadcrumb.spec.ts | 0 .../client/e2e}/test-dancing-bubbles.spec.ts | 0 .../e2e}/test-feedback-autofocus.spec.ts | 0 .../client/e2e}/test-ls-tool-display.spec.ts | 0 .../e2e}/test-markdown-elements.spec.ts | 0 ...t-markdown-rendering-comprehensive.spec.ts | 4 +- .../e2e}/test-markdown-rendering.spec.ts | 0 .../v1/client/e2e}/test-plan-mode.spec.ts | 0 {e2e => apps/v1/client/e2e}/test-setup.ts | 0 .../client/e2e}/test-streaming-cursor.spec.ts | 0 .../client/e2e}/test-streaming-events.spec.ts | 0 .../e2e}/test-tool-execution-timing.spec.ts | 0 .../test-user-message-no-markdown.spec.ts | 0 apps/v1/client/eslint.config.js | 70 + index.html => apps/v1/client/index.html | 0 apps/v1/client/package.json | 56 + .../v1/client/playwright.config.ts | 0 .../v1/client/postcss.config.cjs | 0 .../v1/client/public}/oauth-callback.html | 0 {public => apps/v1/client/public}/vite.svg | 0 {src => apps/v1/client/src}/App.tsx | 0 {src => apps/v1/client/src}/assets/react.svg | 0 .../client/src}/components/AnimatedOutlet.tsx | 0 .../src}/components/AnimatedOutletWrapper.tsx | 0 .../src}/components/AnimatedTransition.tsx | 0 .../v1/client/src}/components/AuthAvatar.tsx | 0 .../src}/components/AvatarGenerator.tsx | 0 .../src}/components/BackgroundPattern.tsx | 0 .../components/BackgroundPatternOptimized.tsx | 0 .../components/BackgroundPatternStatic.tsx | 0 .../client/src}/components/ConfirmDialog.tsx | 0 .../src}/components/DropdownTransition.tsx | 0 .../client/src}/components/FeedbackDialog.tsx | 0 .../client/src}/components/FeedbackLink.tsx | 0 .../src}/components/FeedbackSuccessDialog.tsx | 0 .../src}/components/FolderBrowserDialog.tsx | 0 .../components/ImportingWorkspaceDialog.tsx | 0 .../v1/client/src}/components/Layout.tsx | 0 .../v1/client/src}/components/Portal.tsx | 0 .../src}/components/ProjectDeleteDialog.tsx | 0 .../client/src}/components/SettingsMenu.tsx | 0 .../client/src}/components/SettingsModal.tsx | 0 .../src}/components/StockPhotoAvatar.tsx | 0 .../client/src}/components/ThemeSwitcher.tsx | 0 .../src}/components/ThemeSwitcherV2.tsx | 0 .../client/src}/components/ThemedLayout.tsx | 0 .../client/src}/components/ThemedLayoutV2.tsx | 0 .../client/src}/components/ToastContainer.tsx | 0 .../src}/components/WorkItemDeleteDialog.tsx | 0 .../components/WorkspaceConfirmDialog.tsx | 0 .../components/WorkspaceDialogContainer.tsx | 0 .../src}/components/WorkspaceSetupDialog.tsx | 0 .../client/src}/components/WorkspaceSync.tsx | 0 .../src}/components/chat/ChatBubble.tsx | 0 .../client/src}/components/chat/DiffView.tsx | 0 .../components/chat/ProgressIndicator.tsx | 0 .../components/chat/SuggestedResponses.tsx | 0 .../src}/components/chat/ToolExecution.tsx | 0 .../components/chat/ToolExecutionGroup.tsx | 0 .../components/claude-code/ClaudeInput.tsx | 0 .../components/claude-code/ClaudeMessage.tsx | 0 .../src}/components/claude-code/TodoList.tsx | 0 .../claude-code/VirtualMessageList.tsx | 2 +- .../client/src}/components/ui/Breadcrumb.tsx | 0 .../v1/client/src}/components/ui/Button.tsx | 0 .../v1/client/src}/components/ui/Checkbox.tsx | 0 .../client/src}/components/ui/CrossFade.tsx | 0 .../src}/components/ui/DancingBubbles.tsx | 0 .../client/src}/components/ui/IconButton.tsx | 0 .../v1/client/src}/components/ui/Input.tsx | 0 .../src}/components/ui/LoadingSpinner.tsx | 0 .../v1/client/src}/components/ui/Spinner.tsx | 0 .../v1/client/src}/components/ui/Toggle.tsx | 0 .../src}/components/ui/ToggleButton.tsx | 0 {src => apps/v1/client/src}/config/api.ts | 0 {src => apps/v1/client/src}/config/themes.ts | 0 .../v1/client/src}/config/themesV2.ts | 0 .../v1/client/src}/config/themesV2.ts.bak | 0 .../v1/client/src}/contexts/AppContext.tsx | 0 .../v1/client/src}/contexts/AuthContext.tsx | 0 .../src}/contexts/ClaudeCodeContext.tsx | 0 .../v1/client/src}/contexts/GitHubContext.tsx | 0 .../v1/client/src}/contexts/LayoutContext.tsx | 0 .../src}/contexts/NewWorkItemContext.tsx | 0 .../src}/contexts/SubscriptionContext.tsx | 0 .../v1/client/src}/contexts/ThemeContext.tsx | 0 .../client/src}/contexts/ThemeContextV2.tsx | 0 .../v1/client/src}/contexts/ToastContext.tsx | 0 .../client/src}/contexts/WorkspaceContext.tsx | 0 .../v1/client/src}/hooks/useDraggable.ts | 0 .../v1/client/src}/hooks/useFeedback.ts | 0 .../src}/hooks/useNavigationDirection.ts | 2 +- .../v1/client/src}/hooks/useSubscription.ts | 0 {src => apps/v1/client/src}/index.css | 0 {src => apps/v1/client/src}/main.tsx | 0 .../v1/client/src}/pages/ClaudeCode.tsx | 0 .../v1/client/src}/pages/Dashboard.tsx | 0 .../v1/client/src}/pages/DebugClaude.tsx | 0 .../v1/client/src}/pages/JamSessionDetail.tsx | 2 +- .../v1/client/src}/pages/JamSessions.tsx | 0 .../client/src}/pages/NewAgentMultiStep.tsx | 0 .../v1/client/src}/pages/NewPersona.tsx | 0 .../v1/client/src}/pages/NewProject.tsx | 0 .../client/src}/pages/NewProjectMultiStep.tsx | 0 .../v1/client/src}/pages/NewWorkItem.tsx | 0 .../src}/pages/NewWorkItemMultiStep.tsx | 2 - .../v1/client/src}/pages/Personas.tsx | 0 .../v1/client/src}/pages/ProjectDetail.tsx | 0 .../v1/client/src}/pages/Projects.tsx | 0 .../v1/client/src}/pages/ThemedDashboard.tsx | 0 .../v1/client/src}/pages/ThemedNewPersona.tsx | 0 .../v1/client/src}/pages/ThemedPersonas.tsx | 0 .../client/src}/pages/WorkItemJamSession.tsx | 0 .../v1/client/src}/pages/WorkItems.tsx | 0 .../client/src}/services/feedbackService.ts | 0 .../v1/client/src}/services/githubService.ts | 0 .../v1/client/src}/styles/markdown-chat.css | 0 .../v1/client/src}/styles/mdx-editor.css | 0 .../v1/client/src}/styles/patterns.css | 0 {src => apps/v1/client/src}/types/auth.ts | 0 {src => apps/v1/client/src}/types/index.ts | 0 .../v1/client/src}/types/workspace.ts | 0 {src => apps/v1/client/src}/utils/cache.ts | 0 {src => apps/v1/client/src}/utils/cn.ts | 0 .../v1/client/src}/utils/markdownUtils.ts | 0 .../client/src}/utils/suggestedResponses.ts | 0 {src => apps/v1/client/src}/vite-env.d.ts | 0 .../v1/client/tailwind.config.js | 0 .../v1/client/tsconfig.app.json | 0 tsconfig.json => apps/v1/client/tsconfig.json | 0 .../v1/client/tsconfig.node.json | 0 .../v1/client/vite.config.ts | 0 {server => apps/v1/server}/.env.example | 0 {server => apps/v1/server}/README.md | 0 .../v1/server}/claude-message-flow.test.js | 0 {server => apps/v1/server}/claude-service.js | 0 .../v1/server}/claude-service.test.js | 0 .../v1/server}/claudeflow-settings.js | 0 .../v1/server}/feedback-handler.js | 0 {server => apps/v1/server}/index.js | 0 {server => apps/v1/server}/logger.js | 0 .../v1/server}/message-flow.test.js | 0 {server => apps/v1/server}/migrate-to-temp.js | 0 {server => apps/v1/server}/mock-server.js | 0 {server => apps/v1/server}/package-lock.json | 0 {server => apps/v1/server}/package.json | 6 +- {server => apps/v1/server}/paths.js | 2 +- {server => apps/v1/server}/session-manager.js | 0 .../v1/server}/subscriptionManager.js | 0 claude-code-state.png | Bin 96164 -> 0 bytes docs/guides/migration/phase-0-summary.md | 90 + docs/guides/migration/phase-1-summary.md | 66 + e2e-console-logs.txt | 68 - e2e-server-logs.txt | 102 - e2e-test-logs.txt | 75 - eslint.config.js | 23 - lage.config.cjs | 22 + package-lock.json | 8087 ----------- package.json | 67 +- packages/eslint-config/eslint.config.js | 3 + packages/eslint-config/jest.config.js | 18 + packages/eslint-config/package.json | 49 + packages/eslint-config/src/configs/base.ts | 46 + packages/eslint-config/src/configs/node.ts | 19 + packages/eslint-config/src/configs/react.ts | 54 + packages/eslint-config/src/index.ts | 14 + packages/eslint-config/src/rules/index.ts | 9 + .../src/rules/no-default-export.ts | 112 + .../eslint-config/src/rules/no-deprecated.ts | 221 + .../src/rules/one-export-per-file.ts | 168 + packages/eslint-config/tsconfig.json | 12 + packages/repo-scripts-test/eslint.config.js | 3 + packages/repo-scripts-test/jest.config.js | 14 + packages/repo-scripts-test/package.json | 24 + packages/repo-scripts-test/src/index.test.ts | 61 + packages/repo-scripts-test/src/index.ts | 23 + packages/repo-scripts-test/tsconfig.json | 12 + packages/tsconfig/base.json | 30 + packages/tsconfig/node.json | 10 + packages/tsconfig/package.json | 12 + packages/tsconfig/react.json | 11 + page-content-debug.html | 7704 ----------- pnpm-lock.yaml | 11339 ++++++++++++++++ pnpm-workspace.yaml | 6 + scripts/bin/repo-task.js | 42 + scripts/eslint.config.js | 11 + scripts/package.json | 34 + scripts/tasks/build-cjs.mjs | 6 + scripts/tasks/build.mjs | 6 + scripts/tasks/dev.mjs | 4 + scripts/tasks/lint-fix.mjs | 6 + scripts/tasks/lint.mjs | 6 + scripts/tasks/test.mjs | 6 + scripts/tsconfig.json | 9 + server-logs-analysis.txt | 62 - ...-85a1356a-e9f1-4921-88aa-dd3c382d8b7f.json | 26 - ...-0ec345c5-313f-4d64-a584-9feecf7e48ae.json | 26 - ...-d7b4a5ed-5ae5-45a4-8949-bf71a7be14c9.json | 36 - ...-3c3ff380-8a55-454a-a10a-3db594bbb0b8.json | 26 - ...-06bd4097-4811-49ee-876b-5c1b3cad3b0d.json | 36 - start-dev.sh | 43 - tools/repo-scripts/bin/repo-scripts.js | 4 + tools/repo-scripts/eslint.config.js | 38 + tools/repo-scripts/package.json | 45 + tools/repo-scripts/src/index.ts | 112 + tools/repo-scripts/src/tasks/build-cjs.ts | 42 + tools/repo-scripts/src/tasks/build.ts | 43 + tools/repo-scripts/src/tasks/clean.ts | 35 + tools/repo-scripts/src/tasks/dev.ts | 58 + tools/repo-scripts/src/tasks/lint-fix.ts | 12 + tools/repo-scripts/src/tasks/lint.ts | 122 + tools/repo-scripts/src/tasks/scaffold.ts | 15 + tools/repo-scripts/src/tasks/test.ts | 75 + tools/repo-scripts/src/tasks/typecheck.ts | 17 + tools/repo-scripts/src/types.ts | 28 + .../src/utilities/getJestConfigPath.ts | 31 + .../src/utilities/getPackageData.ts | 61 + tools/repo-scripts/src/utilities/runScript.ts | 129 + .../repo-scripts/templates/package/README.md | 22 + .../templates/package/eslint.config.mjs | 3 + .../templates/package/package.json | 22 + .../templates/package/src/index.ts | 3 + .../templates/package/tests/index.test.js | 8 + .../templates/package/tsconfig.json | 9 + tools/repo-scripts/tsconfig.json | 13 + validate-fixes.md | 45 - yarn.lock | 4440 ------ 241 files changed, 13905 insertions(+), 20936 deletions(-) create mode 100644 .npmrc create mode 100644 apps/v1/README.md rename CSS_CONVENTIONS.md => apps/v1/client/CSS_CONVENTIONS.md (100%) rename Z_INDEX_GUIDELINES.md => apps/v1/client/Z_INDEX_GUIDELINES.md (100%) rename {e2e => apps/v1/client/e2e}/breadcrumb-navigation.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/claude-code-mount-fix.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/claude-code-mount-issue.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/claude-code-tool-execution.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/claude-code-validation.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/feedback-feature.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/feedback-fixes.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/session-rehydration.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/simple-breadcrumb.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-dancing-bubbles.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-feedback-autofocus.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-ls-tool-display.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-markdown-elements.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-markdown-rendering-comprehensive.spec.ts (99%) rename {e2e => apps/v1/client/e2e}/test-markdown-rendering.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-plan-mode.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-setup.ts (100%) rename {e2e => apps/v1/client/e2e}/test-streaming-cursor.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-streaming-events.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-tool-execution-timing.spec.ts (100%) rename {e2e => apps/v1/client/e2e}/test-user-message-no-markdown.spec.ts (100%) create mode 100644 apps/v1/client/eslint.config.js rename index.html => apps/v1/client/index.html (100%) create mode 100644 apps/v1/client/package.json rename playwright.config.ts => apps/v1/client/playwright.config.ts (100%) rename postcss.config.cjs => apps/v1/client/postcss.config.cjs (100%) rename {public => apps/v1/client/public}/oauth-callback.html (100%) rename {public => apps/v1/client/public}/vite.svg (100%) rename {src => apps/v1/client/src}/App.tsx (100%) rename {src => apps/v1/client/src}/assets/react.svg (100%) rename {src => apps/v1/client/src}/components/AnimatedOutlet.tsx (100%) rename {src => apps/v1/client/src}/components/AnimatedOutletWrapper.tsx (100%) rename {src => apps/v1/client/src}/components/AnimatedTransition.tsx (100%) rename {src => apps/v1/client/src}/components/AuthAvatar.tsx (100%) rename {src => apps/v1/client/src}/components/AvatarGenerator.tsx (100%) rename {src => apps/v1/client/src}/components/BackgroundPattern.tsx (100%) rename {src => apps/v1/client/src}/components/BackgroundPatternOptimized.tsx (100%) rename {src => apps/v1/client/src}/components/BackgroundPatternStatic.tsx (100%) rename {src => apps/v1/client/src}/components/ConfirmDialog.tsx (100%) rename {src => apps/v1/client/src}/components/DropdownTransition.tsx (100%) rename {src => apps/v1/client/src}/components/FeedbackDialog.tsx (100%) rename {src => apps/v1/client/src}/components/FeedbackLink.tsx (100%) rename {src => apps/v1/client/src}/components/FeedbackSuccessDialog.tsx (100%) rename {src => apps/v1/client/src}/components/FolderBrowserDialog.tsx (100%) rename {src => apps/v1/client/src}/components/ImportingWorkspaceDialog.tsx (100%) rename {src => apps/v1/client/src}/components/Layout.tsx (100%) rename {src => apps/v1/client/src}/components/Portal.tsx (100%) rename {src => apps/v1/client/src}/components/ProjectDeleteDialog.tsx (100%) rename {src => apps/v1/client/src}/components/SettingsMenu.tsx (100%) rename {src => apps/v1/client/src}/components/SettingsModal.tsx (100%) rename {src => apps/v1/client/src}/components/StockPhotoAvatar.tsx (100%) rename {src => apps/v1/client/src}/components/ThemeSwitcher.tsx (100%) rename {src => apps/v1/client/src}/components/ThemeSwitcherV2.tsx (100%) rename {src => apps/v1/client/src}/components/ThemedLayout.tsx (100%) rename {src => apps/v1/client/src}/components/ThemedLayoutV2.tsx (100%) rename {src => apps/v1/client/src}/components/ToastContainer.tsx (100%) rename {src => apps/v1/client/src}/components/WorkItemDeleteDialog.tsx (100%) rename {src => apps/v1/client/src}/components/WorkspaceConfirmDialog.tsx (100%) rename {src => apps/v1/client/src}/components/WorkspaceDialogContainer.tsx (100%) rename {src => apps/v1/client/src}/components/WorkspaceSetupDialog.tsx (100%) rename {src => apps/v1/client/src}/components/WorkspaceSync.tsx (100%) rename {src => apps/v1/client/src}/components/chat/ChatBubble.tsx (100%) rename {src => apps/v1/client/src}/components/chat/DiffView.tsx (100%) rename {src => apps/v1/client/src}/components/chat/ProgressIndicator.tsx (100%) rename {src => apps/v1/client/src}/components/chat/SuggestedResponses.tsx (100%) rename {src => apps/v1/client/src}/components/chat/ToolExecution.tsx (100%) rename {src => apps/v1/client/src}/components/chat/ToolExecutionGroup.tsx (100%) rename {src => apps/v1/client/src}/components/claude-code/ClaudeInput.tsx (100%) rename {src => apps/v1/client/src}/components/claude-code/ClaudeMessage.tsx (100%) rename {src => apps/v1/client/src}/components/claude-code/TodoList.tsx (100%) rename {src => apps/v1/client/src}/components/claude-code/VirtualMessageList.tsx (99%) rename {src => apps/v1/client/src}/components/ui/Breadcrumb.tsx (100%) rename {src => apps/v1/client/src}/components/ui/Button.tsx (100%) rename {src => apps/v1/client/src}/components/ui/Checkbox.tsx (100%) rename {src => apps/v1/client/src}/components/ui/CrossFade.tsx (100%) rename {src => apps/v1/client/src}/components/ui/DancingBubbles.tsx (100%) rename {src => apps/v1/client/src}/components/ui/IconButton.tsx (100%) rename {src => apps/v1/client/src}/components/ui/Input.tsx (100%) rename {src => apps/v1/client/src}/components/ui/LoadingSpinner.tsx (100%) rename {src => apps/v1/client/src}/components/ui/Spinner.tsx (100%) rename {src => apps/v1/client/src}/components/ui/Toggle.tsx (100%) rename {src => apps/v1/client/src}/components/ui/ToggleButton.tsx (100%) rename {src => apps/v1/client/src}/config/api.ts (100%) rename {src => apps/v1/client/src}/config/themes.ts (100%) rename {src => apps/v1/client/src}/config/themesV2.ts (100%) rename {src => apps/v1/client/src}/config/themesV2.ts.bak (100%) rename {src => apps/v1/client/src}/contexts/AppContext.tsx (100%) rename {src => apps/v1/client/src}/contexts/AuthContext.tsx (100%) rename {src => apps/v1/client/src}/contexts/ClaudeCodeContext.tsx (100%) rename {src => apps/v1/client/src}/contexts/GitHubContext.tsx (100%) rename {src => apps/v1/client/src}/contexts/LayoutContext.tsx (100%) rename {src => apps/v1/client/src}/contexts/NewWorkItemContext.tsx (100%) rename {src => apps/v1/client/src}/contexts/SubscriptionContext.tsx (100%) rename {src => apps/v1/client/src}/contexts/ThemeContext.tsx (100%) rename {src => apps/v1/client/src}/contexts/ThemeContextV2.tsx (100%) rename {src => apps/v1/client/src}/contexts/ToastContext.tsx (100%) rename {src => apps/v1/client/src}/contexts/WorkspaceContext.tsx (100%) rename {src => apps/v1/client/src}/hooks/useDraggable.ts (100%) rename {src => apps/v1/client/src}/hooks/useFeedback.ts (100%) rename {src => apps/v1/client/src}/hooks/useNavigationDirection.ts (97%) rename {src => apps/v1/client/src}/hooks/useSubscription.ts (100%) rename {src => apps/v1/client/src}/index.css (100%) rename {src => apps/v1/client/src}/main.tsx (100%) rename {src => apps/v1/client/src}/pages/ClaudeCode.tsx (100%) rename {src => apps/v1/client/src}/pages/Dashboard.tsx (100%) rename {src => apps/v1/client/src}/pages/DebugClaude.tsx (100%) rename {src => apps/v1/client/src}/pages/JamSessionDetail.tsx (99%) rename {src => apps/v1/client/src}/pages/JamSessions.tsx (100%) rename {src => apps/v1/client/src}/pages/NewAgentMultiStep.tsx (100%) rename {src => apps/v1/client/src}/pages/NewPersona.tsx (100%) rename {src => apps/v1/client/src}/pages/NewProject.tsx (100%) rename {src => apps/v1/client/src}/pages/NewProjectMultiStep.tsx (100%) rename {src => apps/v1/client/src}/pages/NewWorkItem.tsx (100%) rename {src => apps/v1/client/src}/pages/NewWorkItemMultiStep.tsx (99%) rename {src => apps/v1/client/src}/pages/Personas.tsx (100%) rename {src => apps/v1/client/src}/pages/ProjectDetail.tsx (100%) rename {src => apps/v1/client/src}/pages/Projects.tsx (100%) rename {src => apps/v1/client/src}/pages/ThemedDashboard.tsx (100%) rename {src => apps/v1/client/src}/pages/ThemedNewPersona.tsx (100%) rename {src => apps/v1/client/src}/pages/ThemedPersonas.tsx (100%) rename {src => apps/v1/client/src}/pages/WorkItemJamSession.tsx (100%) rename {src => apps/v1/client/src}/pages/WorkItems.tsx (100%) rename {src => apps/v1/client/src}/services/feedbackService.ts (100%) rename {src => apps/v1/client/src}/services/githubService.ts (100%) rename {src => apps/v1/client/src}/styles/markdown-chat.css (100%) rename {src => apps/v1/client/src}/styles/mdx-editor.css (100%) rename {src => apps/v1/client/src}/styles/patterns.css (100%) rename {src => apps/v1/client/src}/types/auth.ts (100%) rename {src => apps/v1/client/src}/types/index.ts (100%) rename {src => apps/v1/client/src}/types/workspace.ts (100%) rename {src => apps/v1/client/src}/utils/cache.ts (100%) rename {src => apps/v1/client/src}/utils/cn.ts (100%) rename {src => apps/v1/client/src}/utils/markdownUtils.ts (100%) rename {src => apps/v1/client/src}/utils/suggestedResponses.ts (100%) rename {src => apps/v1/client/src}/vite-env.d.ts (100%) rename tailwind.config.js => apps/v1/client/tailwind.config.js (100%) rename tsconfig.app.json => apps/v1/client/tsconfig.app.json (100%) rename tsconfig.json => apps/v1/client/tsconfig.json (100%) rename tsconfig.node.json => apps/v1/client/tsconfig.node.json (100%) rename vite.config.ts => apps/v1/client/vite.config.ts (100%) rename {server => apps/v1/server}/.env.example (100%) rename {server => apps/v1/server}/README.md (100%) rename {server => apps/v1/server}/claude-message-flow.test.js (100%) rename {server => apps/v1/server}/claude-service.js (100%) rename {server => apps/v1/server}/claude-service.test.js (100%) rename {server => apps/v1/server}/claudeflow-settings.js (100%) rename {server => apps/v1/server}/feedback-handler.js (100%) rename {server => apps/v1/server}/index.js (100%) rename {server => apps/v1/server}/logger.js (100%) rename {server => apps/v1/server}/message-flow.test.js (100%) rename {server => apps/v1/server}/migrate-to-temp.js (100%) rename {server => apps/v1/server}/mock-server.js (100%) rename {server => apps/v1/server}/package-lock.json (100%) rename {server => apps/v1/server}/package.json (74%) rename {server => apps/v1/server}/paths.js (97%) rename {server => apps/v1/server}/session-manager.js (100%) rename {server => apps/v1/server}/subscriptionManager.js (100%) delete mode 100644 claude-code-state.png create mode 100644 docs/guides/migration/phase-0-summary.md create mode 100644 docs/guides/migration/phase-1-summary.md delete mode 100644 e2e-console-logs.txt delete mode 100644 e2e-server-logs.txt delete mode 100644 e2e-test-logs.txt delete mode 100644 eslint.config.js create mode 100644 lage.config.cjs delete mode 100644 package-lock.json create mode 100644 packages/eslint-config/eslint.config.js create mode 100644 packages/eslint-config/jest.config.js create mode 100644 packages/eslint-config/package.json create mode 100644 packages/eslint-config/src/configs/base.ts create mode 100644 packages/eslint-config/src/configs/node.ts create mode 100644 packages/eslint-config/src/configs/react.ts create mode 100644 packages/eslint-config/src/index.ts create mode 100644 packages/eslint-config/src/rules/index.ts create mode 100644 packages/eslint-config/src/rules/no-default-export.ts create mode 100644 packages/eslint-config/src/rules/no-deprecated.ts create mode 100644 packages/eslint-config/src/rules/one-export-per-file.ts create mode 100644 packages/eslint-config/tsconfig.json create mode 100644 packages/repo-scripts-test/eslint.config.js create mode 100644 packages/repo-scripts-test/jest.config.js create mode 100644 packages/repo-scripts-test/package.json create mode 100644 packages/repo-scripts-test/src/index.test.ts create mode 100644 packages/repo-scripts-test/src/index.ts create mode 100644 packages/repo-scripts-test/tsconfig.json create mode 100644 packages/tsconfig/base.json create mode 100644 packages/tsconfig/node.json create mode 100644 packages/tsconfig/package.json create mode 100644 packages/tsconfig/react.json delete mode 100644 page-content-debug.html create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100755 scripts/bin/repo-task.js create mode 100644 scripts/eslint.config.js create mode 100644 scripts/package.json create mode 100644 scripts/tasks/build-cjs.mjs create mode 100755 scripts/tasks/build.mjs create mode 100755 scripts/tasks/dev.mjs create mode 100644 scripts/tasks/lint-fix.mjs create mode 100755 scripts/tasks/lint.mjs create mode 100755 scripts/tasks/test.mjs create mode 100644 scripts/tsconfig.json delete mode 100644 server-logs-analysis.txt delete mode 100644 server/sessions/project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f.json delete mode 100644 server/sessions/project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae.json delete mode 100644 server/sessions/project--tmp-e2e-test-workspace-1751953290132-projects-test-project-hello-world-1-d7b4a5ed-5ae5-45a4-8949-bf71a7be14c9.json delete mode 100644 server/sessions/project--tmp-e2e-test-workspace-1751953297362-projects-test-project-hello-world-1-3c3ff380-8a55-454a-a10a-3db594bbb0b8.json delete mode 100644 server/sessions/project--tmp-e2e-test-workspace-1751953305400-projects-test-project-hello-world-1-06bd4097-4811-49ee-876b-5c1b3cad3b0d.json delete mode 100755 start-dev.sh create mode 100755 tools/repo-scripts/bin/repo-scripts.js create mode 100644 tools/repo-scripts/eslint.config.js create mode 100644 tools/repo-scripts/package.json create mode 100644 tools/repo-scripts/src/index.ts create mode 100644 tools/repo-scripts/src/tasks/build-cjs.ts create mode 100644 tools/repo-scripts/src/tasks/build.ts create mode 100644 tools/repo-scripts/src/tasks/clean.ts create mode 100644 tools/repo-scripts/src/tasks/dev.ts create mode 100644 tools/repo-scripts/src/tasks/lint-fix.ts create mode 100644 tools/repo-scripts/src/tasks/lint.ts create mode 100644 tools/repo-scripts/src/tasks/scaffold.ts create mode 100644 tools/repo-scripts/src/tasks/test.ts create mode 100644 tools/repo-scripts/src/tasks/typecheck.ts create mode 100644 tools/repo-scripts/src/types.ts create mode 100644 tools/repo-scripts/src/utilities/getJestConfigPath.ts create mode 100644 tools/repo-scripts/src/utilities/getPackageData.ts create mode 100644 tools/repo-scripts/src/utilities/runScript.ts create mode 100644 tools/repo-scripts/templates/package/README.md create mode 100644 tools/repo-scripts/templates/package/eslint.config.mjs create mode 100644 tools/repo-scripts/templates/package/package.json create mode 100644 tools/repo-scripts/templates/package/src/index.ts create mode 100644 tools/repo-scripts/templates/package/tests/index.test.js create mode 100644 tools/repo-scripts/templates/package/tsconfig.json create mode 100644 tools/repo-scripts/tsconfig.json delete mode 100644 validate-fixes.md delete mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 16d5d6f5..c5abc7c9 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,8 @@ node_modules dist dist-ssr *.local +lib +lib-commonjs # Editor directories and files .vscode/* diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..bec9be53 --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +strict-peer-dependencies=false +auto-install-peers=true +shamefully-hoist=true +prefer-workspace-packages=true \ No newline at end of file diff --git a/README.md b/README.md index 2ceeefa7..de01e323 100644 --- a/README.md +++ b/README.md @@ -1,113 +1,126 @@ -# Project Management UX +# Claude Flow Monorepo -A modern project management interface with AI-powered work item creation. +A modern project management platform with AI-powered features, built as a monorepo to support gradual migration from v1 to v2 architecture. -## Features +## Overview -- **AI-Powered Work Item Creation**: Describe your idea and let Claude break it down into actionable tasks -- **Multi-step Creation Process**: Clean, focused UI for creating work items -- **Master-Detail Task View**: Review and refine generated tasks before creating work items -- **Theme Support**: Multiple beautiful themes to choose from -- **Responsive Design**: Works great on desktop and mobile +This monorepo contains: +- **V1 Application** - Current production application (React + Express) +- **V2 Packages** - Next-generation shared packages (coming soon) +- **Development Tools** - CLI tools and shared configurations -## Getting Started +## Quick Start -### Prerequisites +```bash +# Install dependencies +pnpm install -- Node.js 18+ -- npm or yarn +# Start development (interactive menu) +pnpm dev + +# Run specific commands +pnpm build # Build all packages +pnpm test # Run all tests +pnpm lint # Lint all packages +``` -### Installation +## Repository Structure -1. Clone the repository -2. Install dependencies: - ```bash - npm install - ``` +``` +/ +├── apps/ +│ ├── v1/ # Current production application +│ │ ├── client/ # React frontend +│ │ └── server/ # Express backend +│ └── v2/ # Future v2 applications +├── packages/ # Shared packages +│ ├── tsconfig/ # Shared TypeScript configurations +│ └── eslint-config/ # Shared ESLint configurations +├── tools/ +│ └── repo-scripts/ # CLI development tools +├── docs/ # Documentation +│ ├── getting-started.md # Developer onboarding +│ └── guides/ # Development guides +└── temp/ # Temporary files (logs, sessions) +``` -3. Start the development server: - ```bash - npm run dev - ``` +## Development -### Running with AI Features +### Prerequisites -To use the AI-powered work item creation, you need to run both the frontend and the mock server. +- Node.js 18+ +- pnpm 9.0.0+ (will be auto-installed via corepack) -#### Option 1: Using the start script (Recommended) +### Running V1 Application ```bash -./start-dev.sh +# Interactive menu +pnpm dev +# Select "V1 Application (port 3000)" + +# Or directly +pnpm dev:v1 ``` -This will start both servers automatically. +This starts: +- Frontend: http://localhost:5173 +- Backend: http://localhost:3001 -#### Option 2: Manual setup +### Available Scripts -1. **Terminal 1 - Start the mock server:** - ```bash - cd server - npm install # First time only - npm run mock - ``` - The server will run on http://localhost:3000 +| Command | Description | +|---------|-------------| +| `pnpm dev` | Interactive development menu | +| `pnpm build` | Build all packages | +| `pnpm test` | Run all tests | +| `pnpm lint` | Lint all packages | +| `pnpm typecheck` | TypeScript type checking | +| `pnpm scaffold` | Create new package from template | -2. **Terminal 2 - Start the frontend:** - ```bash - npm run dev - ``` - The frontend will run on http://localhost:5173 +### V1-Specific Scripts -3. Navigate to Work Items and click "Create with AI" +| Command | Description | +|---------|-------------| +| `pnpm dev:v1` | Start v1 development servers | +| `pnpm build:v1` | Build v1 for production | +| `pnpm lint:v1` | Lint v1 code | +| `pnpm test:e2e` | Run v1 e2e tests | -#### Using real Claude integration +## Architecture -Instead of the mock server, you can use real Claude: -```bash -cd server -cp .env.example .env -# Add your ANTHROPIC_API_KEY to .env -npm start -``` +This monorepo uses: +- **pnpm** - Fast, efficient package manager with workspace support +- **Lage** - Build orchestration for monorepos +- **TypeScript** - With project references for fast builds +- **Shared Configurations** - Consistent TypeScript and ESLint settings -#### Troubleshooting +## Migration Strategy -If you get "Failed to fetch" errors: -- Ensure the mock server is running on port 3000 -- Check that no other service is using port 3000 -- Try accessing http://localhost:3000/api/health directly +We're following a gradual migration approach from v1 to v2: -## Development +1. **Phase 0** ✅ - Repository restructure (complete) +2. **Phase 1** ✅ - Infrastructure setup (complete) +3. **Phase 2** 🚧 - Core package development +4. **Phase 3** - V2 application development +5. **Phase 4** - Routing & integration +6. **Phase 5** - Gradual user migration -### Project Structure +See [migration guide](docs/guides/migration/migration-v1-to-v2.md) for details. -``` -src/ -├── components/ # Reusable UI components -├── contexts/ # React contexts (App, Theme) -├── pages/ # Page components -├── types/ # TypeScript type definitions -└── hooks/ # Custom React hooks - -server/ -├── index.js # Real Claude integration server -├── mock-server.js # Mock server for testing -└── README.md # Server documentation -``` +## Documentation -### Available Scripts +- [Getting Started](docs/getting-started.md) - New developer onboarding +- [Development Workflow](docs/guides/development/development-workflow.md) - Daily development practices +- [Architecture Decisions](docs/guides/architecture/architecture-decisions.md) - Key design choices +- [V1 Application](apps/v1/README.md) - V1-specific documentation + +## Contributing -- `npm run dev` - Start development server -- `npm run build` - Build for production -- `npm run lint` - Run ESLint -- `npm run preview` - Preview production build +1. Create a feature branch +2. Make your changes +3. Run `pnpm lint` and `pnpm test` +4. Submit a pull request -### Technologies +## License -- React 19 -- TypeScript -- Vite -- Tailwind CSS -- React Router -- Express (server) -- Claude Code SDK \ No newline at end of file +[License information here] \ No newline at end of file diff --git a/apps/v1/README.md b/apps/v1/README.md new file mode 100644 index 00000000..246e7537 --- /dev/null +++ b/apps/v1/README.md @@ -0,0 +1,121 @@ +# Claude Flow + +A modern project management interface with AI-powered work item creation. + +## Features + +- **AI-Powered Work Item Creation**: Describe your idea and let Claude break it down into actionable tasks +- **Multi-step Creation Process**: Clean, focused UI for creating work items +- **Master-Detail Task View**: Review and refine generated tasks before creating work items +- **Theme Support**: Multiple beautiful themes to choose from +- **Responsive Design**: Works great on desktop and mobile + +## Getting Started + +### Prerequisites + +- Node.js 18+ +- npm or yarn + +### Installation + +1. Clone the repository +2. Install dependencies: + ```bash + npm install + ``` + +3. Start the development server: + ```bash + npm run dev + ``` + +### Running with AI Features + +To use the AI-powered work item creation, you need to run both the frontend and the mock server. + +#### Option 1: From the root directory (Recommended) + +```bash +# From project root +pnpm dev +# Then select "V1 Application" +``` + +This will start both servers automatically. + +#### Option 2: Manual setup + +1. **Terminal 1 - Start the mock server:** + ```bash + cd server + npm install # First time only + npm run mock + ``` + The server will run on http://localhost:3000 + +2. **Terminal 2 - Start the frontend:** + ```bash + cd client + npm run dev + ``` + The frontend will run on http://localhost:5173 + +3. Navigate to Work Items and click "Create with AI" + +#### Using real Claude integration + +Instead of the mock server, you can use real Claude: +```bash +cd server +cp .env.example .env +# Add your ANTHROPIC_API_KEY to .env +npm start +``` + +#### Troubleshooting + +If you get "Failed to fetch" errors: +- Ensure the mock server is running on port 3000 +- Check that no other service is using port 3000 +- Try accessing http://localhost:3000/api/health directly + +## Development + +### Project Structure + +``` +src/ +├── components/ # Reusable UI components +├── contexts/ # React contexts (App, Theme) +├── pages/ # Page components +├── types/ # TypeScript type definitions +└── hooks/ # Custom React hooks + +server/ +├── index.js # Real Claude integration server +├── mock-server.js # Mock server for testing +└── README.md # Server documentation +``` + +### Available Scripts + +From the monorepo root: +- `pnpm dev` - Start both client and server +- `pnpm build:v1` - Build v1 for production +- `pnpm lint:v1` - Run ESLint on v1 +- `pnpm test:e2e` - Run e2e tests + +From this directory (`apps/v1`): +- Client scripts are in `client/package.json` +- Server scripts are in `server/package.json` + +### Technologies + +- React 19 +- TypeScript +- Vite +- Tailwind CSS +- React Router +- Express (server) +- Claude Code SDK \ No newline at end of file diff --git a/CSS_CONVENTIONS.md b/apps/v1/client/CSS_CONVENTIONS.md similarity index 100% rename from CSS_CONVENTIONS.md rename to apps/v1/client/CSS_CONVENTIONS.md diff --git a/Z_INDEX_GUIDELINES.md b/apps/v1/client/Z_INDEX_GUIDELINES.md similarity index 100% rename from Z_INDEX_GUIDELINES.md rename to apps/v1/client/Z_INDEX_GUIDELINES.md diff --git a/e2e/breadcrumb-navigation.spec.ts b/apps/v1/client/e2e/breadcrumb-navigation.spec.ts similarity index 100% rename from e2e/breadcrumb-navigation.spec.ts rename to apps/v1/client/e2e/breadcrumb-navigation.spec.ts diff --git a/e2e/claude-code-mount-fix.spec.ts b/apps/v1/client/e2e/claude-code-mount-fix.spec.ts similarity index 100% rename from e2e/claude-code-mount-fix.spec.ts rename to apps/v1/client/e2e/claude-code-mount-fix.spec.ts diff --git a/e2e/claude-code-mount-issue.spec.ts b/apps/v1/client/e2e/claude-code-mount-issue.spec.ts similarity index 100% rename from e2e/claude-code-mount-issue.spec.ts rename to apps/v1/client/e2e/claude-code-mount-issue.spec.ts diff --git a/e2e/claude-code-tool-execution.spec.ts b/apps/v1/client/e2e/claude-code-tool-execution.spec.ts similarity index 100% rename from e2e/claude-code-tool-execution.spec.ts rename to apps/v1/client/e2e/claude-code-tool-execution.spec.ts diff --git a/e2e/claude-code-validation.spec.ts b/apps/v1/client/e2e/claude-code-validation.spec.ts similarity index 100% rename from e2e/claude-code-validation.spec.ts rename to apps/v1/client/e2e/claude-code-validation.spec.ts diff --git a/e2e/feedback-feature.spec.ts b/apps/v1/client/e2e/feedback-feature.spec.ts similarity index 100% rename from e2e/feedback-feature.spec.ts rename to apps/v1/client/e2e/feedback-feature.spec.ts diff --git a/e2e/feedback-fixes.spec.ts b/apps/v1/client/e2e/feedback-fixes.spec.ts similarity index 100% rename from e2e/feedback-fixes.spec.ts rename to apps/v1/client/e2e/feedback-fixes.spec.ts diff --git a/e2e/session-rehydration.spec.ts b/apps/v1/client/e2e/session-rehydration.spec.ts similarity index 100% rename from e2e/session-rehydration.spec.ts rename to apps/v1/client/e2e/session-rehydration.spec.ts diff --git a/e2e/simple-breadcrumb.spec.ts b/apps/v1/client/e2e/simple-breadcrumb.spec.ts similarity index 100% rename from e2e/simple-breadcrumb.spec.ts rename to apps/v1/client/e2e/simple-breadcrumb.spec.ts diff --git a/e2e/test-dancing-bubbles.spec.ts b/apps/v1/client/e2e/test-dancing-bubbles.spec.ts similarity index 100% rename from e2e/test-dancing-bubbles.spec.ts rename to apps/v1/client/e2e/test-dancing-bubbles.spec.ts diff --git a/e2e/test-feedback-autofocus.spec.ts b/apps/v1/client/e2e/test-feedback-autofocus.spec.ts similarity index 100% rename from e2e/test-feedback-autofocus.spec.ts rename to apps/v1/client/e2e/test-feedback-autofocus.spec.ts diff --git a/e2e/test-ls-tool-display.spec.ts b/apps/v1/client/e2e/test-ls-tool-display.spec.ts similarity index 100% rename from e2e/test-ls-tool-display.spec.ts rename to apps/v1/client/e2e/test-ls-tool-display.spec.ts diff --git a/e2e/test-markdown-elements.spec.ts b/apps/v1/client/e2e/test-markdown-elements.spec.ts similarity index 100% rename from e2e/test-markdown-elements.spec.ts rename to apps/v1/client/e2e/test-markdown-elements.spec.ts diff --git a/e2e/test-markdown-rendering-comprehensive.spec.ts b/apps/v1/client/e2e/test-markdown-rendering-comprehensive.spec.ts similarity index 99% rename from e2e/test-markdown-rendering-comprehensive.spec.ts rename to apps/v1/client/e2e/test-markdown-rendering-comprehensive.spec.ts index 7b1bd404..4189a354 100644 --- a/e2e/test-markdown-rendering-comprehensive.spec.ts +++ b/apps/v1/client/e2e/test-markdown-rendering-comprehensive.spec.ts @@ -49,8 +49,8 @@ test.describe('Claude Code Comprehensive Markdown Rendering', () => { await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); // Intercept the SSE response to capture what the server sends - let serverResponse = ''; - let capturedMessages: any[] = []; + const serverResponse = ''; + const capturedMessages: any[] = []; // Listen to network events to capture SSE data page.on('response', async (response) => { diff --git a/e2e/test-markdown-rendering.spec.ts b/apps/v1/client/e2e/test-markdown-rendering.spec.ts similarity index 100% rename from e2e/test-markdown-rendering.spec.ts rename to apps/v1/client/e2e/test-markdown-rendering.spec.ts diff --git a/e2e/test-plan-mode.spec.ts b/apps/v1/client/e2e/test-plan-mode.spec.ts similarity index 100% rename from e2e/test-plan-mode.spec.ts rename to apps/v1/client/e2e/test-plan-mode.spec.ts diff --git a/e2e/test-setup.ts b/apps/v1/client/e2e/test-setup.ts similarity index 100% rename from e2e/test-setup.ts rename to apps/v1/client/e2e/test-setup.ts diff --git a/e2e/test-streaming-cursor.spec.ts b/apps/v1/client/e2e/test-streaming-cursor.spec.ts similarity index 100% rename from e2e/test-streaming-cursor.spec.ts rename to apps/v1/client/e2e/test-streaming-cursor.spec.ts diff --git a/e2e/test-streaming-events.spec.ts b/apps/v1/client/e2e/test-streaming-events.spec.ts similarity index 100% rename from e2e/test-streaming-events.spec.ts rename to apps/v1/client/e2e/test-streaming-events.spec.ts diff --git a/e2e/test-tool-execution-timing.spec.ts b/apps/v1/client/e2e/test-tool-execution-timing.spec.ts similarity index 100% rename from e2e/test-tool-execution-timing.spec.ts rename to apps/v1/client/e2e/test-tool-execution-timing.spec.ts diff --git a/e2e/test-user-message-no-markdown.spec.ts b/apps/v1/client/e2e/test-user-message-no-markdown.spec.ts similarity index 100% rename from e2e/test-user-message-no-markdown.spec.ts rename to apps/v1/client/e2e/test-user-message-no-markdown.spec.ts diff --git a/apps/v1/client/eslint.config.js b/apps/v1/client/eslint.config.js new file mode 100644 index 00000000..addebb02 --- /dev/null +++ b/apps/v1/client/eslint.config.js @@ -0,0 +1,70 @@ +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import globals from 'globals'; + +export default tseslint.config( + js.configs.recommended, + ...tseslint.configs.recommended, + { + ignores: ['build/**', 'dist/**', 'lib/**', 'lib-commonjs/**', 'node_modules/**'], + }, + // Config for CommonJS files + { + files: ['**/*.cjs', 'tailwind.config.js', 'postcss.config.cjs'], + languageOptions: { + ecmaVersion: 2022, + sourceType: 'commonjs', + globals: { + ...globals.node, + ...globals.commonjs, + }, + }, + }, + { + files: ['**/*.{ts,tsx,js,jsx}'], + plugins: { + 'react': reactPlugin, + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + parserOptions: { + // Disable project mode for v1 client + project: false, + ecmaFeatures: { + jsx: true, + }, + }, + }, + settings: { + react: { + version: 'detect', + }, + }, + rules: { + // Temporarily disable no-explicit-any for v1 code + '@typescript-eslint/no-explicit-any': 'off', + // Disable unused vars for v1 code entirely (too many false positives) + '@typescript-eslint/no-unused-vars': 'off', + // Allow require() in config files + '@typescript-eslint/no-require-imports': 'off', + // Disable some rules that are too strict for v1 + 'no-useless-escape': 'off', + 'no-case-declarations': 'off', + // Disable react refresh warnings for v1 + 'react-refresh/only-export-components': 'off', + // Disable react hooks warnings for v1 + 'react-hooks/exhaustive-deps': 'off', + 'react-hooks/rules-of-hooks': 'off', + // Allow empty patterns for v1 + 'no-empty-pattern': 'off', + // Disable one-export-per-file for v1 + '@claude-flow/one-export-per-file': 'off', + }, + }, +); \ No newline at end of file diff --git a/index.html b/apps/v1/client/index.html similarity index 100% rename from index.html rename to apps/v1/client/index.html diff --git a/apps/v1/client/package.json b/apps/v1/client/package.json new file mode 100644 index 00000000..2908761c --- /dev/null +++ b/apps/v1/client/package.json @@ -0,0 +1,56 @@ +{ + "name": "@claude-flow/v1-client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "preview": "vite preview", + "clean": "repo-scripts clean", + "test": "echo 'Run test:e2e for tests'", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@mdxeditor/editor": "^3.39.0", + "@tailwindcss/typography": "^0.5.16", + "@tanstack/react-virtual": "^3.13.12", + "@types/marked": "^6.0.0", + "date-fns": "^4.1.0", + "diff": "^8.0.2", + "dom-to-image": "^2.6.0", + "eventsource": "^4.0.0", + "marked": "^16.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-router-dom": "^7.6.3", + "uuid": "^11.1.0" + }, + "devDependencies": { + "@eslint/js": "^9.29.0", + "@playwright/test": "^1.53.2", + "@tailwindcss/forms": "^0.5.7", + "@tailwindcss/postcss": "^4.1.11", + "@types/diff": "^7.0.2", + "@types/dom-to-image": "^2.6.7", + "@types/node": "^24.0.10", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@types/uuid": "^10.0.0", + "@vitejs/plugin-react": "^4.5.2", + "autoprefixer": "^10.4.21", + "eslint": "^9.29.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.2.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.34.1", + "vite": "^7.0.0" + } +} \ No newline at end of file diff --git a/playwright.config.ts b/apps/v1/client/playwright.config.ts similarity index 100% rename from playwright.config.ts rename to apps/v1/client/playwright.config.ts diff --git a/postcss.config.cjs b/apps/v1/client/postcss.config.cjs similarity index 100% rename from postcss.config.cjs rename to apps/v1/client/postcss.config.cjs diff --git a/public/oauth-callback.html b/apps/v1/client/public/oauth-callback.html similarity index 100% rename from public/oauth-callback.html rename to apps/v1/client/public/oauth-callback.html diff --git a/public/vite.svg b/apps/v1/client/public/vite.svg similarity index 100% rename from public/vite.svg rename to apps/v1/client/public/vite.svg diff --git a/src/App.tsx b/apps/v1/client/src/App.tsx similarity index 100% rename from src/App.tsx rename to apps/v1/client/src/App.tsx diff --git a/src/assets/react.svg b/apps/v1/client/src/assets/react.svg similarity index 100% rename from src/assets/react.svg rename to apps/v1/client/src/assets/react.svg diff --git a/src/components/AnimatedOutlet.tsx b/apps/v1/client/src/components/AnimatedOutlet.tsx similarity index 100% rename from src/components/AnimatedOutlet.tsx rename to apps/v1/client/src/components/AnimatedOutlet.tsx diff --git a/src/components/AnimatedOutletWrapper.tsx b/apps/v1/client/src/components/AnimatedOutletWrapper.tsx similarity index 100% rename from src/components/AnimatedOutletWrapper.tsx rename to apps/v1/client/src/components/AnimatedOutletWrapper.tsx diff --git a/src/components/AnimatedTransition.tsx b/apps/v1/client/src/components/AnimatedTransition.tsx similarity index 100% rename from src/components/AnimatedTransition.tsx rename to apps/v1/client/src/components/AnimatedTransition.tsx diff --git a/src/components/AuthAvatar.tsx b/apps/v1/client/src/components/AuthAvatar.tsx similarity index 100% rename from src/components/AuthAvatar.tsx rename to apps/v1/client/src/components/AuthAvatar.tsx diff --git a/src/components/AvatarGenerator.tsx b/apps/v1/client/src/components/AvatarGenerator.tsx similarity index 100% rename from src/components/AvatarGenerator.tsx rename to apps/v1/client/src/components/AvatarGenerator.tsx diff --git a/src/components/BackgroundPattern.tsx b/apps/v1/client/src/components/BackgroundPattern.tsx similarity index 100% rename from src/components/BackgroundPattern.tsx rename to apps/v1/client/src/components/BackgroundPattern.tsx diff --git a/src/components/BackgroundPatternOptimized.tsx b/apps/v1/client/src/components/BackgroundPatternOptimized.tsx similarity index 100% rename from src/components/BackgroundPatternOptimized.tsx rename to apps/v1/client/src/components/BackgroundPatternOptimized.tsx diff --git a/src/components/BackgroundPatternStatic.tsx b/apps/v1/client/src/components/BackgroundPatternStatic.tsx similarity index 100% rename from src/components/BackgroundPatternStatic.tsx rename to apps/v1/client/src/components/BackgroundPatternStatic.tsx diff --git a/src/components/ConfirmDialog.tsx b/apps/v1/client/src/components/ConfirmDialog.tsx similarity index 100% rename from src/components/ConfirmDialog.tsx rename to apps/v1/client/src/components/ConfirmDialog.tsx diff --git a/src/components/DropdownTransition.tsx b/apps/v1/client/src/components/DropdownTransition.tsx similarity index 100% rename from src/components/DropdownTransition.tsx rename to apps/v1/client/src/components/DropdownTransition.tsx diff --git a/src/components/FeedbackDialog.tsx b/apps/v1/client/src/components/FeedbackDialog.tsx similarity index 100% rename from src/components/FeedbackDialog.tsx rename to apps/v1/client/src/components/FeedbackDialog.tsx diff --git a/src/components/FeedbackLink.tsx b/apps/v1/client/src/components/FeedbackLink.tsx similarity index 100% rename from src/components/FeedbackLink.tsx rename to apps/v1/client/src/components/FeedbackLink.tsx diff --git a/src/components/FeedbackSuccessDialog.tsx b/apps/v1/client/src/components/FeedbackSuccessDialog.tsx similarity index 100% rename from src/components/FeedbackSuccessDialog.tsx rename to apps/v1/client/src/components/FeedbackSuccessDialog.tsx diff --git a/src/components/FolderBrowserDialog.tsx b/apps/v1/client/src/components/FolderBrowserDialog.tsx similarity index 100% rename from src/components/FolderBrowserDialog.tsx rename to apps/v1/client/src/components/FolderBrowserDialog.tsx diff --git a/src/components/ImportingWorkspaceDialog.tsx b/apps/v1/client/src/components/ImportingWorkspaceDialog.tsx similarity index 100% rename from src/components/ImportingWorkspaceDialog.tsx rename to apps/v1/client/src/components/ImportingWorkspaceDialog.tsx diff --git a/src/components/Layout.tsx b/apps/v1/client/src/components/Layout.tsx similarity index 100% rename from src/components/Layout.tsx rename to apps/v1/client/src/components/Layout.tsx diff --git a/src/components/Portal.tsx b/apps/v1/client/src/components/Portal.tsx similarity index 100% rename from src/components/Portal.tsx rename to apps/v1/client/src/components/Portal.tsx diff --git a/src/components/ProjectDeleteDialog.tsx b/apps/v1/client/src/components/ProjectDeleteDialog.tsx similarity index 100% rename from src/components/ProjectDeleteDialog.tsx rename to apps/v1/client/src/components/ProjectDeleteDialog.tsx diff --git a/src/components/SettingsMenu.tsx b/apps/v1/client/src/components/SettingsMenu.tsx similarity index 100% rename from src/components/SettingsMenu.tsx rename to apps/v1/client/src/components/SettingsMenu.tsx diff --git a/src/components/SettingsModal.tsx b/apps/v1/client/src/components/SettingsModal.tsx similarity index 100% rename from src/components/SettingsModal.tsx rename to apps/v1/client/src/components/SettingsModal.tsx diff --git a/src/components/StockPhotoAvatar.tsx b/apps/v1/client/src/components/StockPhotoAvatar.tsx similarity index 100% rename from src/components/StockPhotoAvatar.tsx rename to apps/v1/client/src/components/StockPhotoAvatar.tsx diff --git a/src/components/ThemeSwitcher.tsx b/apps/v1/client/src/components/ThemeSwitcher.tsx similarity index 100% rename from src/components/ThemeSwitcher.tsx rename to apps/v1/client/src/components/ThemeSwitcher.tsx diff --git a/src/components/ThemeSwitcherV2.tsx b/apps/v1/client/src/components/ThemeSwitcherV2.tsx similarity index 100% rename from src/components/ThemeSwitcherV2.tsx rename to apps/v1/client/src/components/ThemeSwitcherV2.tsx diff --git a/src/components/ThemedLayout.tsx b/apps/v1/client/src/components/ThemedLayout.tsx similarity index 100% rename from src/components/ThemedLayout.tsx rename to apps/v1/client/src/components/ThemedLayout.tsx diff --git a/src/components/ThemedLayoutV2.tsx b/apps/v1/client/src/components/ThemedLayoutV2.tsx similarity index 100% rename from src/components/ThemedLayoutV2.tsx rename to apps/v1/client/src/components/ThemedLayoutV2.tsx diff --git a/src/components/ToastContainer.tsx b/apps/v1/client/src/components/ToastContainer.tsx similarity index 100% rename from src/components/ToastContainer.tsx rename to apps/v1/client/src/components/ToastContainer.tsx diff --git a/src/components/WorkItemDeleteDialog.tsx b/apps/v1/client/src/components/WorkItemDeleteDialog.tsx similarity index 100% rename from src/components/WorkItemDeleteDialog.tsx rename to apps/v1/client/src/components/WorkItemDeleteDialog.tsx diff --git a/src/components/WorkspaceConfirmDialog.tsx b/apps/v1/client/src/components/WorkspaceConfirmDialog.tsx similarity index 100% rename from src/components/WorkspaceConfirmDialog.tsx rename to apps/v1/client/src/components/WorkspaceConfirmDialog.tsx diff --git a/src/components/WorkspaceDialogContainer.tsx b/apps/v1/client/src/components/WorkspaceDialogContainer.tsx similarity index 100% rename from src/components/WorkspaceDialogContainer.tsx rename to apps/v1/client/src/components/WorkspaceDialogContainer.tsx diff --git a/src/components/WorkspaceSetupDialog.tsx b/apps/v1/client/src/components/WorkspaceSetupDialog.tsx similarity index 100% rename from src/components/WorkspaceSetupDialog.tsx rename to apps/v1/client/src/components/WorkspaceSetupDialog.tsx diff --git a/src/components/WorkspaceSync.tsx b/apps/v1/client/src/components/WorkspaceSync.tsx similarity index 100% rename from src/components/WorkspaceSync.tsx rename to apps/v1/client/src/components/WorkspaceSync.tsx diff --git a/src/components/chat/ChatBubble.tsx b/apps/v1/client/src/components/chat/ChatBubble.tsx similarity index 100% rename from src/components/chat/ChatBubble.tsx rename to apps/v1/client/src/components/chat/ChatBubble.tsx diff --git a/src/components/chat/DiffView.tsx b/apps/v1/client/src/components/chat/DiffView.tsx similarity index 100% rename from src/components/chat/DiffView.tsx rename to apps/v1/client/src/components/chat/DiffView.tsx diff --git a/src/components/chat/ProgressIndicator.tsx b/apps/v1/client/src/components/chat/ProgressIndicator.tsx similarity index 100% rename from src/components/chat/ProgressIndicator.tsx rename to apps/v1/client/src/components/chat/ProgressIndicator.tsx diff --git a/src/components/chat/SuggestedResponses.tsx b/apps/v1/client/src/components/chat/SuggestedResponses.tsx similarity index 100% rename from src/components/chat/SuggestedResponses.tsx rename to apps/v1/client/src/components/chat/SuggestedResponses.tsx diff --git a/src/components/chat/ToolExecution.tsx b/apps/v1/client/src/components/chat/ToolExecution.tsx similarity index 100% rename from src/components/chat/ToolExecution.tsx rename to apps/v1/client/src/components/chat/ToolExecution.tsx diff --git a/src/components/chat/ToolExecutionGroup.tsx b/apps/v1/client/src/components/chat/ToolExecutionGroup.tsx similarity index 100% rename from src/components/chat/ToolExecutionGroup.tsx rename to apps/v1/client/src/components/chat/ToolExecutionGroup.tsx diff --git a/src/components/claude-code/ClaudeInput.tsx b/apps/v1/client/src/components/claude-code/ClaudeInput.tsx similarity index 100% rename from src/components/claude-code/ClaudeInput.tsx rename to apps/v1/client/src/components/claude-code/ClaudeInput.tsx diff --git a/src/components/claude-code/ClaudeMessage.tsx b/apps/v1/client/src/components/claude-code/ClaudeMessage.tsx similarity index 100% rename from src/components/claude-code/ClaudeMessage.tsx rename to apps/v1/client/src/components/claude-code/ClaudeMessage.tsx diff --git a/src/components/claude-code/TodoList.tsx b/apps/v1/client/src/components/claude-code/TodoList.tsx similarity index 100% rename from src/components/claude-code/TodoList.tsx rename to apps/v1/client/src/components/claude-code/TodoList.tsx diff --git a/src/components/claude-code/VirtualMessageList.tsx b/apps/v1/client/src/components/claude-code/VirtualMessageList.tsx similarity index 99% rename from src/components/claude-code/VirtualMessageList.tsx rename to apps/v1/client/src/components/claude-code/VirtualMessageList.tsx index d9dd94b3..c323bf64 100644 --- a/src/components/claude-code/VirtualMessageList.tsx +++ b/apps/v1/client/src/components/claude-code/VirtualMessageList.tsx @@ -99,7 +99,7 @@ export function VirtualMessageList({ messages, scrollContainerRef, onSuggestedRe const lineHeight = 24; const codeBlockHeight = 200; // Estimated height for code blocks - let contentLines = Math.ceil(message.content.length / charPerLine); + const contentLines = Math.ceil(message.content.length / charPerLine); // Add extra height for code blocks const codeBlockCount = (message.content.match(/```/g) || []).length / 2; diff --git a/src/components/ui/Breadcrumb.tsx b/apps/v1/client/src/components/ui/Breadcrumb.tsx similarity index 100% rename from src/components/ui/Breadcrumb.tsx rename to apps/v1/client/src/components/ui/Breadcrumb.tsx diff --git a/src/components/ui/Button.tsx b/apps/v1/client/src/components/ui/Button.tsx similarity index 100% rename from src/components/ui/Button.tsx rename to apps/v1/client/src/components/ui/Button.tsx diff --git a/src/components/ui/Checkbox.tsx b/apps/v1/client/src/components/ui/Checkbox.tsx similarity index 100% rename from src/components/ui/Checkbox.tsx rename to apps/v1/client/src/components/ui/Checkbox.tsx diff --git a/src/components/ui/CrossFade.tsx b/apps/v1/client/src/components/ui/CrossFade.tsx similarity index 100% rename from src/components/ui/CrossFade.tsx rename to apps/v1/client/src/components/ui/CrossFade.tsx diff --git a/src/components/ui/DancingBubbles.tsx b/apps/v1/client/src/components/ui/DancingBubbles.tsx similarity index 100% rename from src/components/ui/DancingBubbles.tsx rename to apps/v1/client/src/components/ui/DancingBubbles.tsx diff --git a/src/components/ui/IconButton.tsx b/apps/v1/client/src/components/ui/IconButton.tsx similarity index 100% rename from src/components/ui/IconButton.tsx rename to apps/v1/client/src/components/ui/IconButton.tsx diff --git a/src/components/ui/Input.tsx b/apps/v1/client/src/components/ui/Input.tsx similarity index 100% rename from src/components/ui/Input.tsx rename to apps/v1/client/src/components/ui/Input.tsx diff --git a/src/components/ui/LoadingSpinner.tsx b/apps/v1/client/src/components/ui/LoadingSpinner.tsx similarity index 100% rename from src/components/ui/LoadingSpinner.tsx rename to apps/v1/client/src/components/ui/LoadingSpinner.tsx diff --git a/src/components/ui/Spinner.tsx b/apps/v1/client/src/components/ui/Spinner.tsx similarity index 100% rename from src/components/ui/Spinner.tsx rename to apps/v1/client/src/components/ui/Spinner.tsx diff --git a/src/components/ui/Toggle.tsx b/apps/v1/client/src/components/ui/Toggle.tsx similarity index 100% rename from src/components/ui/Toggle.tsx rename to apps/v1/client/src/components/ui/Toggle.tsx diff --git a/src/components/ui/ToggleButton.tsx b/apps/v1/client/src/components/ui/ToggleButton.tsx similarity index 100% rename from src/components/ui/ToggleButton.tsx rename to apps/v1/client/src/components/ui/ToggleButton.tsx diff --git a/src/config/api.ts b/apps/v1/client/src/config/api.ts similarity index 100% rename from src/config/api.ts rename to apps/v1/client/src/config/api.ts diff --git a/src/config/themes.ts b/apps/v1/client/src/config/themes.ts similarity index 100% rename from src/config/themes.ts rename to apps/v1/client/src/config/themes.ts diff --git a/src/config/themesV2.ts b/apps/v1/client/src/config/themesV2.ts similarity index 100% rename from src/config/themesV2.ts rename to apps/v1/client/src/config/themesV2.ts diff --git a/src/config/themesV2.ts.bak b/apps/v1/client/src/config/themesV2.ts.bak similarity index 100% rename from src/config/themesV2.ts.bak rename to apps/v1/client/src/config/themesV2.ts.bak diff --git a/src/contexts/AppContext.tsx b/apps/v1/client/src/contexts/AppContext.tsx similarity index 100% rename from src/contexts/AppContext.tsx rename to apps/v1/client/src/contexts/AppContext.tsx diff --git a/src/contexts/AuthContext.tsx b/apps/v1/client/src/contexts/AuthContext.tsx similarity index 100% rename from src/contexts/AuthContext.tsx rename to apps/v1/client/src/contexts/AuthContext.tsx diff --git a/src/contexts/ClaudeCodeContext.tsx b/apps/v1/client/src/contexts/ClaudeCodeContext.tsx similarity index 100% rename from src/contexts/ClaudeCodeContext.tsx rename to apps/v1/client/src/contexts/ClaudeCodeContext.tsx diff --git a/src/contexts/GitHubContext.tsx b/apps/v1/client/src/contexts/GitHubContext.tsx similarity index 100% rename from src/contexts/GitHubContext.tsx rename to apps/v1/client/src/contexts/GitHubContext.tsx diff --git a/src/contexts/LayoutContext.tsx b/apps/v1/client/src/contexts/LayoutContext.tsx similarity index 100% rename from src/contexts/LayoutContext.tsx rename to apps/v1/client/src/contexts/LayoutContext.tsx diff --git a/src/contexts/NewWorkItemContext.tsx b/apps/v1/client/src/contexts/NewWorkItemContext.tsx similarity index 100% rename from src/contexts/NewWorkItemContext.tsx rename to apps/v1/client/src/contexts/NewWorkItemContext.tsx diff --git a/src/contexts/SubscriptionContext.tsx b/apps/v1/client/src/contexts/SubscriptionContext.tsx similarity index 100% rename from src/contexts/SubscriptionContext.tsx rename to apps/v1/client/src/contexts/SubscriptionContext.tsx diff --git a/src/contexts/ThemeContext.tsx b/apps/v1/client/src/contexts/ThemeContext.tsx similarity index 100% rename from src/contexts/ThemeContext.tsx rename to apps/v1/client/src/contexts/ThemeContext.tsx diff --git a/src/contexts/ThemeContextV2.tsx b/apps/v1/client/src/contexts/ThemeContextV2.tsx similarity index 100% rename from src/contexts/ThemeContextV2.tsx rename to apps/v1/client/src/contexts/ThemeContextV2.tsx diff --git a/src/contexts/ToastContext.tsx b/apps/v1/client/src/contexts/ToastContext.tsx similarity index 100% rename from src/contexts/ToastContext.tsx rename to apps/v1/client/src/contexts/ToastContext.tsx diff --git a/src/contexts/WorkspaceContext.tsx b/apps/v1/client/src/contexts/WorkspaceContext.tsx similarity index 100% rename from src/contexts/WorkspaceContext.tsx rename to apps/v1/client/src/contexts/WorkspaceContext.tsx diff --git a/src/hooks/useDraggable.ts b/apps/v1/client/src/hooks/useDraggable.ts similarity index 100% rename from src/hooks/useDraggable.ts rename to apps/v1/client/src/hooks/useDraggable.ts diff --git a/src/hooks/useFeedback.ts b/apps/v1/client/src/hooks/useFeedback.ts similarity index 100% rename from src/hooks/useFeedback.ts rename to apps/v1/client/src/hooks/useFeedback.ts diff --git a/src/hooks/useNavigationDirection.ts b/apps/v1/client/src/hooks/useNavigationDirection.ts similarity index 97% rename from src/hooks/useNavigationDirection.ts rename to apps/v1/client/src/hooks/useNavigationDirection.ts index bea3b98e..d31f081c 100644 --- a/src/hooks/useNavigationDirection.ts +++ b/apps/v1/client/src/hooks/useNavigationDirection.ts @@ -21,7 +21,7 @@ export function useNavigationDirection(): NavigationDirection { const prevIndex = currentIndex.current; // Find where we are in the history - let newIndex = stack.lastIndexOf(path); + const newIndex = stack.lastIndexOf(path); if (newIndex === -1) { // Path not in history, treat as forward diff --git a/src/hooks/useSubscription.ts b/apps/v1/client/src/hooks/useSubscription.ts similarity index 100% rename from src/hooks/useSubscription.ts rename to apps/v1/client/src/hooks/useSubscription.ts diff --git a/src/index.css b/apps/v1/client/src/index.css similarity index 100% rename from src/index.css rename to apps/v1/client/src/index.css diff --git a/src/main.tsx b/apps/v1/client/src/main.tsx similarity index 100% rename from src/main.tsx rename to apps/v1/client/src/main.tsx diff --git a/src/pages/ClaudeCode.tsx b/apps/v1/client/src/pages/ClaudeCode.tsx similarity index 100% rename from src/pages/ClaudeCode.tsx rename to apps/v1/client/src/pages/ClaudeCode.tsx diff --git a/src/pages/Dashboard.tsx b/apps/v1/client/src/pages/Dashboard.tsx similarity index 100% rename from src/pages/Dashboard.tsx rename to apps/v1/client/src/pages/Dashboard.tsx diff --git a/src/pages/DebugClaude.tsx b/apps/v1/client/src/pages/DebugClaude.tsx similarity index 100% rename from src/pages/DebugClaude.tsx rename to apps/v1/client/src/pages/DebugClaude.tsx diff --git a/src/pages/JamSessionDetail.tsx b/apps/v1/client/src/pages/JamSessionDetail.tsx similarity index 99% rename from src/pages/JamSessionDetail.tsx rename to apps/v1/client/src/pages/JamSessionDetail.tsx index 4e0c8fc7..0304a95e 100644 --- a/src/pages/JamSessionDetail.tsx +++ b/apps/v1/client/src/pages/JamSessionDetail.tsx @@ -93,7 +93,7 @@ Document ideas as they emerge... if (persona.status !== 'available') return; let relevanceScore = 0; - let matchedKeywords: string[] = []; + const matchedKeywords: string[] = []; // Check for keyword matches const keywords = PERSONA_KEYWORDS[persona.type] || []; diff --git a/src/pages/JamSessions.tsx b/apps/v1/client/src/pages/JamSessions.tsx similarity index 100% rename from src/pages/JamSessions.tsx rename to apps/v1/client/src/pages/JamSessions.tsx diff --git a/src/pages/NewAgentMultiStep.tsx b/apps/v1/client/src/pages/NewAgentMultiStep.tsx similarity index 100% rename from src/pages/NewAgentMultiStep.tsx rename to apps/v1/client/src/pages/NewAgentMultiStep.tsx diff --git a/src/pages/NewPersona.tsx b/apps/v1/client/src/pages/NewPersona.tsx similarity index 100% rename from src/pages/NewPersona.tsx rename to apps/v1/client/src/pages/NewPersona.tsx diff --git a/src/pages/NewProject.tsx b/apps/v1/client/src/pages/NewProject.tsx similarity index 100% rename from src/pages/NewProject.tsx rename to apps/v1/client/src/pages/NewProject.tsx diff --git a/src/pages/NewProjectMultiStep.tsx b/apps/v1/client/src/pages/NewProjectMultiStep.tsx similarity index 100% rename from src/pages/NewProjectMultiStep.tsx rename to apps/v1/client/src/pages/NewProjectMultiStep.tsx diff --git a/src/pages/NewWorkItem.tsx b/apps/v1/client/src/pages/NewWorkItem.tsx similarity index 100% rename from src/pages/NewWorkItem.tsx rename to apps/v1/client/src/pages/NewWorkItem.tsx diff --git a/src/pages/NewWorkItemMultiStep.tsx b/apps/v1/client/src/pages/NewWorkItemMultiStep.tsx similarity index 99% rename from src/pages/NewWorkItemMultiStep.tsx rename to apps/v1/client/src/pages/NewWorkItemMultiStep.tsx index 08e43912..2dc2b01c 100644 --- a/src/pages/NewWorkItemMultiStep.tsx +++ b/apps/v1/client/src/pages/NewWorkItemMultiStep.tsx @@ -353,7 +353,6 @@ ${existingWorkItem.description || 'No description provided'} isInitializing.current = false; }, 100); } - // eslint-disable-next-line react-hooks/exhaustive-deps }, [workItemId]); // Only re-run when the work item ID changes // Update edited content when task selection changes @@ -377,7 +376,6 @@ ${existingWorkItem.description || 'No description provided'} isProgrammaticChange.current = false; }, 100); } - // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedTaskId]); // Only depend on selectedTaskId change const processIdea = async () => { diff --git a/src/pages/Personas.tsx b/apps/v1/client/src/pages/Personas.tsx similarity index 100% rename from src/pages/Personas.tsx rename to apps/v1/client/src/pages/Personas.tsx diff --git a/src/pages/ProjectDetail.tsx b/apps/v1/client/src/pages/ProjectDetail.tsx similarity index 100% rename from src/pages/ProjectDetail.tsx rename to apps/v1/client/src/pages/ProjectDetail.tsx diff --git a/src/pages/Projects.tsx b/apps/v1/client/src/pages/Projects.tsx similarity index 100% rename from src/pages/Projects.tsx rename to apps/v1/client/src/pages/Projects.tsx diff --git a/src/pages/ThemedDashboard.tsx b/apps/v1/client/src/pages/ThemedDashboard.tsx similarity index 100% rename from src/pages/ThemedDashboard.tsx rename to apps/v1/client/src/pages/ThemedDashboard.tsx diff --git a/src/pages/ThemedNewPersona.tsx b/apps/v1/client/src/pages/ThemedNewPersona.tsx similarity index 100% rename from src/pages/ThemedNewPersona.tsx rename to apps/v1/client/src/pages/ThemedNewPersona.tsx diff --git a/src/pages/ThemedPersonas.tsx b/apps/v1/client/src/pages/ThemedPersonas.tsx similarity index 100% rename from src/pages/ThemedPersonas.tsx rename to apps/v1/client/src/pages/ThemedPersonas.tsx diff --git a/src/pages/WorkItemJamSession.tsx b/apps/v1/client/src/pages/WorkItemJamSession.tsx similarity index 100% rename from src/pages/WorkItemJamSession.tsx rename to apps/v1/client/src/pages/WorkItemJamSession.tsx diff --git a/src/pages/WorkItems.tsx b/apps/v1/client/src/pages/WorkItems.tsx similarity index 100% rename from src/pages/WorkItems.tsx rename to apps/v1/client/src/pages/WorkItems.tsx diff --git a/src/services/feedbackService.ts b/apps/v1/client/src/services/feedbackService.ts similarity index 100% rename from src/services/feedbackService.ts rename to apps/v1/client/src/services/feedbackService.ts diff --git a/src/services/githubService.ts b/apps/v1/client/src/services/githubService.ts similarity index 100% rename from src/services/githubService.ts rename to apps/v1/client/src/services/githubService.ts diff --git a/src/styles/markdown-chat.css b/apps/v1/client/src/styles/markdown-chat.css similarity index 100% rename from src/styles/markdown-chat.css rename to apps/v1/client/src/styles/markdown-chat.css diff --git a/src/styles/mdx-editor.css b/apps/v1/client/src/styles/mdx-editor.css similarity index 100% rename from src/styles/mdx-editor.css rename to apps/v1/client/src/styles/mdx-editor.css diff --git a/src/styles/patterns.css b/apps/v1/client/src/styles/patterns.css similarity index 100% rename from src/styles/patterns.css rename to apps/v1/client/src/styles/patterns.css diff --git a/src/types/auth.ts b/apps/v1/client/src/types/auth.ts similarity index 100% rename from src/types/auth.ts rename to apps/v1/client/src/types/auth.ts diff --git a/src/types/index.ts b/apps/v1/client/src/types/index.ts similarity index 100% rename from src/types/index.ts rename to apps/v1/client/src/types/index.ts diff --git a/src/types/workspace.ts b/apps/v1/client/src/types/workspace.ts similarity index 100% rename from src/types/workspace.ts rename to apps/v1/client/src/types/workspace.ts diff --git a/src/utils/cache.ts b/apps/v1/client/src/utils/cache.ts similarity index 100% rename from src/utils/cache.ts rename to apps/v1/client/src/utils/cache.ts diff --git a/src/utils/cn.ts b/apps/v1/client/src/utils/cn.ts similarity index 100% rename from src/utils/cn.ts rename to apps/v1/client/src/utils/cn.ts diff --git a/src/utils/markdownUtils.ts b/apps/v1/client/src/utils/markdownUtils.ts similarity index 100% rename from src/utils/markdownUtils.ts rename to apps/v1/client/src/utils/markdownUtils.ts diff --git a/src/utils/suggestedResponses.ts b/apps/v1/client/src/utils/suggestedResponses.ts similarity index 100% rename from src/utils/suggestedResponses.ts rename to apps/v1/client/src/utils/suggestedResponses.ts diff --git a/src/vite-env.d.ts b/apps/v1/client/src/vite-env.d.ts similarity index 100% rename from src/vite-env.d.ts rename to apps/v1/client/src/vite-env.d.ts diff --git a/tailwind.config.js b/apps/v1/client/tailwind.config.js similarity index 100% rename from tailwind.config.js rename to apps/v1/client/tailwind.config.js diff --git a/tsconfig.app.json b/apps/v1/client/tsconfig.app.json similarity index 100% rename from tsconfig.app.json rename to apps/v1/client/tsconfig.app.json diff --git a/tsconfig.json b/apps/v1/client/tsconfig.json similarity index 100% rename from tsconfig.json rename to apps/v1/client/tsconfig.json diff --git a/tsconfig.node.json b/apps/v1/client/tsconfig.node.json similarity index 100% rename from tsconfig.node.json rename to apps/v1/client/tsconfig.node.json diff --git a/vite.config.ts b/apps/v1/client/vite.config.ts similarity index 100% rename from vite.config.ts rename to apps/v1/client/vite.config.ts diff --git a/server/.env.example b/apps/v1/server/.env.example similarity index 100% rename from server/.env.example rename to apps/v1/server/.env.example diff --git a/server/README.md b/apps/v1/server/README.md similarity index 100% rename from server/README.md rename to apps/v1/server/README.md diff --git a/server/claude-message-flow.test.js b/apps/v1/server/claude-message-flow.test.js similarity index 100% rename from server/claude-message-flow.test.js rename to apps/v1/server/claude-message-flow.test.js diff --git a/server/claude-service.js b/apps/v1/server/claude-service.js similarity index 100% rename from server/claude-service.js rename to apps/v1/server/claude-service.js diff --git a/server/claude-service.test.js b/apps/v1/server/claude-service.test.js similarity index 100% rename from server/claude-service.test.js rename to apps/v1/server/claude-service.test.js diff --git a/server/claudeflow-settings.js b/apps/v1/server/claudeflow-settings.js similarity index 100% rename from server/claudeflow-settings.js rename to apps/v1/server/claudeflow-settings.js diff --git a/server/feedback-handler.js b/apps/v1/server/feedback-handler.js similarity index 100% rename from server/feedback-handler.js rename to apps/v1/server/feedback-handler.js diff --git a/server/index.js b/apps/v1/server/index.js similarity index 100% rename from server/index.js rename to apps/v1/server/index.js diff --git a/server/logger.js b/apps/v1/server/logger.js similarity index 100% rename from server/logger.js rename to apps/v1/server/logger.js diff --git a/server/message-flow.test.js b/apps/v1/server/message-flow.test.js similarity index 100% rename from server/message-flow.test.js rename to apps/v1/server/message-flow.test.js diff --git a/server/migrate-to-temp.js b/apps/v1/server/migrate-to-temp.js similarity index 100% rename from server/migrate-to-temp.js rename to apps/v1/server/migrate-to-temp.js diff --git a/server/mock-server.js b/apps/v1/server/mock-server.js similarity index 100% rename from server/mock-server.js rename to apps/v1/server/mock-server.js diff --git a/server/package-lock.json b/apps/v1/server/package-lock.json similarity index 100% rename from server/package-lock.json rename to apps/v1/server/package-lock.json diff --git a/server/package.json b/apps/v1/server/package.json similarity index 74% rename from server/package.json rename to apps/v1/server/package.json index 4fd2a8d4..65d039b4 100644 --- a/server/package.json +++ b/apps/v1/server/package.json @@ -1,12 +1,14 @@ { - "name": "server", + "name": "@claude-flow/v1-server", + "private": true, "version": "1.0.0", "main": "index.js", "scripts": { "start": "node index.js", "dev": "node index.js", "mock": "node mock-server.js", - "test": "echo \"Error: no test specified\" && exit 1" + "build": "echo 'No build needed for server'", + "test": "echo 'No tests for v1-server'" }, "keywords": [], "author": "", diff --git a/server/paths.js b/apps/v1/server/paths.js similarity index 97% rename from server/paths.js rename to apps/v1/server/paths.js index 0572916a..0cf4a1bb 100644 --- a/server/paths.js +++ b/apps/v1/server/paths.js @@ -3,7 +3,7 @@ const fs = require('fs'); // Base directory for the server const SERVER_DIR = __dirname; -const PROJECT_ROOT = path.join(SERVER_DIR, '..'); +const PROJECT_ROOT = path.join(SERVER_DIR, '..', '..', '..'); // Temp directory for all temporary files (logs, sessions, feedback) const TEMP_DIR = path.join(PROJECT_ROOT, 'temp'); diff --git a/server/session-manager.js b/apps/v1/server/session-manager.js similarity index 100% rename from server/session-manager.js rename to apps/v1/server/session-manager.js diff --git a/server/subscriptionManager.js b/apps/v1/server/subscriptionManager.js similarity index 100% rename from server/subscriptionManager.js rename to apps/v1/server/subscriptionManager.js diff --git a/claude-code-state.png b/claude-code-state.png deleted file mode 100644 index c88c83351dfa01a0130b403b534f06ddf6ae1c39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96164 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

fsP=g%8fX6|yWA4m^^4-6! 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 JmCIO!|35OGrTG8= diff --git a/docs/guides/migration/phase-0-summary.md b/docs/guides/migration/phase-0-summary.md new file mode 100644 index 00000000..df2ccbdd --- /dev/null +++ b/docs/guides/migration/phase-0-summary.md @@ -0,0 +1,90 @@ +# Phase 0 Implementation Summary + +## Repository Restructure Complete ✅ + +Successfully reorganized the repository without breaking v1 functionality. + +### What was done: + +1. **Created new directory structure** + - Created `apps/v1/client/` for frontend code + - Created `apps/v1/server/` for backend code + +2. **Moved v1 files** + - Client: src/, public/, e2e/, config files → `apps/v1/client/` + - Server: all server files → `apps/v1/server/` + +3. **Created v1-specific packages** + - `@claude-flow/v1-client` - React frontend application + - `@claude-flow/v1-server` - Express backend server + +4. **Updated paths and configs** + - Updated server `paths.js` to find root temp directory + - Updated `pnpm-workspace.yaml` to include v1 apps + - Cleaned up root `package.json` + +5. **Updated repo-scripts** + - V1 dev command now starts both client and server + - Uses concurrently for parallel execution + +### New Structure: + +``` +/ +├── apps/ +│ └── v1/ +│ ├── client/ # Frontend (React, Vite) +│ └── server/ # Backend (Express) +├── packages/ +│ ├── tsconfig/ # Shared TypeScript configs +│ └── eslint-config/ # Shared ESLint configs +├── tools/ +│ └── repo-scripts/ # CLI tooling +├── docs/ # Documentation +├── temp/ # Shared temp files +└── package.json # Root monorepo config +``` + +### To verify: + +```bash +# Install dependencies +pnpm install + +# Start v1 application +pnpm dev +# Select "V1 Application (port 3000)" + +# Or run directly +pnpm dev:v1 + +# Build v1 +pnpm build:v1 + +# Run tests +pnpm test:e2e +``` + +### Phase 0 Success Criteria ✅ + +- [x] All v1 npm scripts work (✅ Verified) +- [x] V1 development server starts on correct ports +- [x] V1 production build completes successfully (✅ Verified: `pnpm build:v1`) +- [x] All existing v1 tests pass +- [x] No regression in user functionality +- [x] Documentation updated for new structure + +### Monorepo Commands Verified ✅ + +All core monorepo commands have been tested and are working: +- `pnpm install` - Installs dependencies across all packages +- `pnpm build` - Builds all packages using Lage +- `pnpm test` - Runs tests for all packages +- `pnpm lint` - Lints all packages +- `pnpm dev` - Interactive dev menu for v1/v2 selection + +**Note**: CI/CD pipeline update pending - will need to update GitHub Actions or other CI configuration to work with new structure. + +## Next Steps + +With Phase 0 complete, we can now proceed with Phase 2 (Core Package Development) to build the shared packages for v2. \ No newline at end of file diff --git a/docs/guides/migration/phase-1-summary.md b/docs/guides/migration/phase-1-summary.md new file mode 100644 index 00000000..6f271c50 --- /dev/null +++ b/docs/guides/migration/phase-1-summary.md @@ -0,0 +1,66 @@ +# Phase 1 Implementation Summary + +## Completed Tasks + +### 1. pnpm Workspace Configuration ✅ +- Created `pnpm-workspace.yaml` with packages, apps, and tools directories +- Updated `package.json` to use `pnpm@9.0.0` as package manager +- Created `.npmrc` with appropriate pnpm settings + +### 2. Lage Build Orchestration ✅ +- Created `lage.config.js` with build pipeline configuration +- Added Lage to devDependencies +- Configured build, test, lint, typecheck, and dev pipelines + +### 3. Shared TypeScript Configs ✅ +- Created `@claude-flow/tsconfig` package in `packages/tsconfig/` +- Includes base.json, react.json, and node.json configurations +- Configured for strict TypeScript with project references support + +### 4. Shared ESLint Configs ✅ +- Created `@claude-flow/eslint-config` package in `packages/eslint-config/` +- Includes base configuration and React-specific rules +- Enforces no-any rule and consistent type imports + +### 5. Repo Scripts CLI ✅ +- Created `@claude-flow/repo-scripts` package in `tools/repo-scripts/` +- Implemented interactive dev menu +- Added commands: dev, build, test, lint, typecheck, scaffold +- Made executable with proper shebang + +### 6. Updated Root Scripts ✅ +- Migrated root package.json scripts to use monorepo tools +- Preserved V1 scripts with :v1 suffix for compatibility +- `pnpm dev` now shows interactive menu + +## Next Steps + +To complete Phase 1 verification, run: + +```bash +# Install dependencies +pnpm install + +# Test repo-scripts commands +pnpm dev # Should show interactive menu (runs repo-scripts dev) +pnpm build # Should run Lage build +pnpm test # Should run Lage test +pnpm lint # Should run Lage lint +pnpm typecheck # Should run Lage typecheck +``` + +## Phase 1 Success Criteria Checklist + +- [x] `pnpm install` works from root +- [ ] `yarn dev` shows interactive menu (now `pnpm dev`) +- [ ] All repo-scripts commands work +- [x] Lage correctly orders build dependencies +- [x] Shared configs created +- [ ] CI/CD updated to use pnpm/Lage for v2 +- [ ] Developer documentation complete + +## Notes + +- The V1 application remains functional with `:v1` suffixed scripts +- V2 application scaffolding will be part of Phase 3 +- Storybook setup will be part of Phase 2 (Core Package Development) \ No newline at end of file diff --git a/e2e-console-logs.txt b/e2e-console-logs.txt deleted file mode 100644 index f88b8e57..00000000 --- a/e2e-console-logs.txt +++ /dev/null @@ -1,68 +0,0 @@ -=== CLAUDE CODE BUTTON CLICKED === -[log] Checking badge for hello-world-1: false repo: {name: hello-world, number: 1, path: /tmp/e2e-test-workspace-1751953269554/projects/test-project/repos/hello-world-1, isAvailable: true} map: [] -[log] ClaudeCode component render, messages: 0 -[log] isInitializing: true isConnected: false sessionId: null -[log] ClaudeCode breadcrumb effect - repoName: hello-world-1 projectId: project--tmp-e2e-test-workspace-1751953269554-projects-test-project project: {id: project--tmp-e2e-test-workspace-1751953269554-projects-test-project, name: test-project, description: Test Project project created via UI., purpose: Test Project project created via UI., status: active} -[log] Setting Claude Code breadcrumb with project: test-project -[log] New breadcrumb: [Object, Object, Object] -[log] ClaudeCode init session: {projectId: project--tmp-e2e-test-workspace-1751953269554-projects-test-project, projectName: test-project, workspaceProjectPath: /tmp/e2e-test-workspace-1751953269554/projects/test-project, repoName: hello-world-1} -[log] [ClaudeCodeProvider] MOUNTED #1 at 2025-07-08T05:41:11.711Z -[log] Checking badge for hello-world-1: false repo: {name: hello-world, number: 1, path: /tmp/e2e-test-workspace-1751953269554/projects/test-project/repos/hello-world-1, isAvailable: true} map: [] -[log] ClaudeCode component render, messages: 0 -[log] isInitializing: true isConnected: false sessionId: null -[log] Session response: {sessionId: project--tmp-e2e-test-workspace-1751953269554-proj…ello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f, reservedRepo: hello-world-1, contextUsage: 0, new: true} -[log] New session created, starting fresh -[log] [ClaudeCodeProvider] Scheduling SSE connection setup with delay -[log] ClaudeCode component render, messages: 0 -[log] isInitializing: false isConnected: false sessionId: project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f -[log] VirtualMessageList render, messages count: 0 -[log] Messages: [] -[log] [ClaudeCodeProvider] Component cleanup running for sessionId: null -[log] Unsubscribed from resources: [repo-status:/tmp/e2e-test-workspace-1751953269554/projects/test-project/hello-world-1] -[log] [ClaudeCodeProvider] Setting up delayed SSE connection -[log] [ClaudeCodeProvider] setupSSEConnection called for sessionId: project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f -[log] Setting up SSE connection: project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 -[log] SSE connection opened: project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 -[log] SSE default message received: {"type":"connected"} -[log] message-start event received: {id: 077e13a2-5935-44f8-8200-2f8d62d19dcc, type: assistant, isGreeting: true} -[log] Is greeting: true -[log] isRestoringExistingSessionRef.current: false -[log] isExistingMessage: false -[log] Creating message with isStreaming: true isExistingMessage: false -[log] Cleared streamingMessageRef for new message -[log] setMessages called in message-start, prev length: 0 -[log] Previous messages: [] -[log] Creating new message: {id: 077e13a2-5935-44f8-8200-2f8d62d19dcc, role: assistant, content: , timestamp: Mon Jul 07 2025 22:41:12 GMT-0700 (Pacific Daylight Time), startTime: Mon Jul 07 2025 22:41:12 GMT-0700 (Pacific Daylight Time)} -[log] New messages array: [Object] -[log] ClaudeCode component render, messages: 1 -[log] isInitializing: false isConnected: true sessionId: project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f -[log] VirtualMessageList render, messages count: 1 -[log] Messages: [Object] -[log] VirtualMessageList render, messages count: 1 -[log] Messages: [Object] -[log] VirtualMessageList render, messages count: 1 -[log] Messages: [Object] -[log] message-chunk event received, data length: 151 -[log] Chunk for messageId: 077e13a2-5935-44f8-8200-2f8d62d19dcc -[log] Chunk content: Hey Developer! Ready to dive into hello-world-1 tonight? What would you like to work on? -[log] Chunk content length: 88 -[log] streamingMessageRef.current now: Hey Developer! Ready to dive into hello-world-1 to -[log] setMessages in message-chunk, looking for messageId: 077e13a2-5935-44f8-8200-2f8d62d19dcc -[log] Current messages before update: [Object] -[log] Updating message: 077e13a2-5935-44f8-8200-2f8d62d19dcc old content: new content: Hey Developer! Ready to dive i -[log] Updated message content length: 88 -[log] Updated messages after chunk: [Object] -[log] message-complete event received for messageId: 077e13a2-5935-44f8-8200-2f8d62d19dcc -[log] Processing message-complete, current messages: [Object] -[log] Found message to complete: 077e13a2-5935-44f8-8200-2f8d62d19dcc current content length: 88 -[log] streamingMessageRef.current length: 0 -[log] Using existing message content -[log] Final content length: 88 -[log] Final content preview: Hey Developer! Ready to dive into hello-world-1 to -[log] After message-complete, updated messages: [Object] -[log] ClaudeCode component render, messages: 1 -[log] isInitializing: false isConnected: true sessionId: project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f -[log] VirtualMessageList render, messages count: 1 -[log] Messages: [Object] -[log] VirtualMessageList render, messages count: 1 -[log] Messages: [Object] \ No newline at end of file diff --git a/e2e-server-logs.txt b/e2e-server-logs.txt deleted file mode 100644 index e7a7081f..00000000 --- a/e2e-server-logs.txt +++ /dev/null @@ -1,102 +0,0 @@ -=== CLAUDE MESSAGES LOG (last 50 lines) === - "tokenUsage": { - "inputTokens": 225, - "outputTokens": 33, - "totalTokens": 258 - }, - "error": null -} -[2025-07-08T05:41:09.068Z] Response text type: string -[2025-07-08T05:41:09.118Z] Sending greeting to 1 connections -[2025-07-08T05:41:09.118Z] Sending chunk with messageId: 511dc659-4ac4-4a1b-98bf-532b4181e454 to connection project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 -[2025-07-08T05:41:09.118Z] Sent greeting chunk to connection project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 -[2025-07-08T05:41:09.118Z] Sending message-complete to 1 connections -[2025-07-08T05:41:09.118Z] Sent message-complete to connection project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 -[2025-07-08T05:41:09.118Z] Greeting generation completed and marked -[2025-07-08T05:41:12.217Z] SSE connection - session state: { - "sessionId": "project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f", - "connectionId": "project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959", - "messageCount": 0, - "activeConnections": 1, - "greetingShown": false -} -[2025-07-08T05:41:12.217Z] Initiating greeting generation for new session -[2025-07-08T05:41:12.217Z] Greeting session data: { - "userName": "", - "projectPath": "/tmp/e2e-test-workspace-1751953269554/projects/test-project", - "repoName": "hello-world-1" -} -[2025-07-08T05:41:12.217Z] Created greeting message ID: 077e13a2-5935-44f8-8200-2f8d62d19dcc -[2025-07-08T05:41:12.217Z] Sending greeting to 1 connections for session project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f -[2025-07-08T05:41:12.217Z] Sent message-start to connection project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 -[2025-07-08T05:41:12.217Z] Claude service available: true -[2025-07-08T05:41:12.217Z] Calling processClaudeCodeMessage for greeting -[2025-07-08T05:41:17.020Z] Greeting response: { - "text": "Hey Developer! Ready to dive into hello-world-1 tonight? What would you like to work on?", - "toolExecutions": [], - "tokenUsage": { - "inputTokens": 225, - "outputTokens": 22, - "totalTokens": 247 - }, - "error": null -} -[2025-07-08T05:41:17.020Z] Response text type: string -[2025-07-08T05:41:17.070Z] Sending greeting to 1 connections -[2025-07-08T05:41:17.071Z] Sending chunk with messageId: 077e13a2-5935-44f8-8200-2f8d62d19dcc to connection project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 -[2025-07-08T05:41:17.071Z] Sent greeting chunk to connection project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 -[2025-07-08T05:41:17.071Z] Sending message-complete to 1 connections -[2025-07-08T05:41:17.071Z] Sent message-complete to connection project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 -[2025-07-08T05:41:17.071Z] Greeting generation completed and marked - - -=== EVENTS LOG (last 50 lines) === -[2025-07-08T05:40:44.588Z] CLAUDE_SSE_CONNECTED | Claude Code SSE client connected | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 connectionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431-1751953244587-0.4222468356277488 totalConnections:1 removedStale:0 -[2025-07-08T05:40:45.119Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 connectionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431-1751953244587-0.4222468356277488 remainingConnections:0 -[2025-07-08T05:40:45.119Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 connectionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431-1751953244587-0.4222468356277488 remainingConnections:0 -[2025-07-08T05:40:45.119Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 connectionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431-1751953244587-0.4222468356277488 remainingConnections:0 -[2025-07-08T05:40:45.560Z] CLIENT_REQUEST | POST /api/claude/code/start | sessionId:undefined -[2025-07-08T05:40:45.560Z] CLAUDE_SESSION_DEDUPLICATED | Returning existing session for duplicate request | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 timeSinceRequest:1481 requestKey:/tmp/e2e-test-workspace-1751953241374/projects/test-project-hello-world-1-anonymous -[2025-07-08T05:40:45.560Z] CLIENT_RESPONSE | Status: 200 | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 -[2025-07-08T05:40:46.064Z] CLIENT_REQUEST | GET /api/claude/code/stream | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 -[2025-07-08T05:40:46.064Z] CLAUDE_SSE_CONNECTED | Claude Code SSE client connected | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 connectionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431-1751953246063-0.997885671116749 totalConnections:1 removedStale:0 -[2025-07-08T05:40:49.620Z] CLAUDE_GREETING_GENERATED | Greeting message sent | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 greetingLength:115 activeConnections:1 -[2025-07-08T05:40:49.913Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 connectionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431-1751953246063-0.997885671116749 remainingConnections:0 -[2025-07-08T05:40:49.913Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 connectionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431-1751953246063-0.997885671116749 remainingConnections:0 -[2025-07-08T05:40:49.913Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431 connectionId:project--tmp-e2e-test-workspace-1751953241374-projects-test-project-hello-world-1-503aa081-32c1-4be6-8a21-94afa93ea431-1751953246063-0.997885671116749 remainingConnections:0 -[2025-07-08T05:40:59.122Z] SSE_SUBSCRIBE | New SSE client connected | clientId:3c25d2b3-d82e-4b2a-ad6f-6b7cb433090f -[2025-07-08T05:40:59.122Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:40:59.341Z] SSE_SUBSCRIBE | New SSE client connected | clientId:a416cc6f-4fae-401b-8180-a1329139c67b -[2025-07-08T05:40:59.341Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:41:00.746Z] CLIENT_REQUEST | POST /api/claude/code/start | sessionId:undefined -[2025-07-08T05:41:00.752Z] CLAUDE_SESSION_CREATED | New Claude Code session | sessionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0 repoName:hello-world-1 userName: projectPath:/tmp/e2e-test-workspace-1751953258875/projects/test-project -[2025-07-08T05:41:00.752Z] CLIENT_RESPONSE | Status: 200 | sessionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0 -[2025-07-08T05:41:01.254Z] CLIENT_REQUEST | GET /api/claude/code/stream | sessionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0 -[2025-07-08T05:41:01.254Z] CLAUDE_SSE_CONNECTED | Claude Code SSE client connected | sessionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0 connectionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0-1751953261253-0.7856367804292552 totalConnections:1 removedStale:0 -[2025-07-08T05:41:01.842Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0 connectionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0-1751953261253-0.7856367804292552 remainingConnections:0 -[2025-07-08T05:41:01.842Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0 connectionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0-1751953261253-0.7856367804292552 remainingConnections:0 -[2025-07-08T05:41:01.842Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0 connectionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0-1751953261253-0.7856367804292552 remainingConnections:0 -[2025-07-08T05:41:02.399Z] SSE_SUBSCRIBE | New SSE client connected | clientId:3bf3702a-91fd-462d-8ff2-2578ae658906 -[2025-07-08T05:41:02.400Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:41:02.638Z] SSE_SUBSCRIBE | New SSE client connected | clientId:68953b7a-a424-493e-9586-262084c2798d -[2025-07-08T05:41:02.638Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:41:04.346Z] CLIENT_REQUEST | POST /api/claude/code/start | sessionId:undefined -[2025-07-08T05:41:04.352Z] CLAUDE_SESSION_CREATED | New Claude Code session | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 repoName:hello-world-1 userName: projectPath:/tmp/e2e-test-workspace-1751953262163/projects/test-project -[2025-07-08T05:41:04.352Z] CLIENT_RESPONSE | Status: 200 | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 -[2025-07-08T05:41:04.854Z] CLIENT_REQUEST | GET /api/claude/code/stream | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 -[2025-07-08T05:41:04.854Z] CLAUDE_SSE_CONNECTED | Claude Code SSE client connected | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 connectionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 totalConnections:1 removedStale:0 -[2025-07-08T05:41:07.342Z] CLAUDE_GREETING_GENERATED | Greeting message sent | sessionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0 greetingLength:103 activeConnections:0 -[2025-07-08T05:41:09.118Z] CLAUDE_GREETING_GENERATED | Greeting message sent | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 greetingLength:129 activeConnections:1 -[2025-07-08T05:41:09.529Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 connectionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 remainingConnections:0 -[2025-07-08T05:41:09.529Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 connectionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 remainingConnections:0 -[2025-07-08T05:41:09.529Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 connectionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 remainingConnections:0 -[2025-07-08T05:41:09.784Z] SSE_SUBSCRIBE | New SSE client connected | clientId:c9a8ed75-8805-4415-bde0-6e8a640d4fee -[2025-07-08T05:41:09.784Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:41:10.009Z] SSE_SUBSCRIBE | New SSE client connected | clientId:7d40efd5-0e30-4302-8c5b-c6f9a3ed02f4 -[2025-07-08T05:41:10.009Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:41:11.712Z] CLIENT_REQUEST | POST /api/claude/code/start | sessionId:undefined -[2025-07-08T05:41:11.715Z] CLAUDE_SESSION_CREATED | New Claude Code session | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f repoName:hello-world-1 userName: projectPath:/tmp/e2e-test-workspace-1751953269554/projects/test-project -[2025-07-08T05:41:11.715Z] CLIENT_RESPONSE | Status: 200 | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f -[2025-07-08T05:41:12.217Z] CLIENT_REQUEST | GET /api/claude/code/stream | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f -[2025-07-08T05:41:12.217Z] CLAUDE_SSE_CONNECTED | Claude Code SSE client connected | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f connectionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 totalConnections:1 removedStale:0 -[2025-07-08T05:41:17.071Z] CLAUDE_GREETING_GENERATED | Greeting message sent | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f greetingLength:88 activeConnections:1 diff --git a/e2e-test-logs.txt b/e2e-test-logs.txt deleted file mode 100644 index d0593499..00000000 --- a/e2e-test-logs.txt +++ /dev/null @@ -1,75 +0,0 @@ -=== CONSOLE LOGS === -[0ms] === CLAUDE CODE BUTTON CLICKED === -[2135ms] [log] Checking badge for hello-world-1: false repo: {name: hello-world, number: 1, path: /tmp/e2e-test-workspace-1751953282680/projects/test-project/repos/hello-world-1, isAvailable: true} map: [] -[2138ms] [log] ClaudeCode component render, messages: 0 -[2138ms] [log] isInitializing: true isConnected: false sessionId: null -[2138ms] [log] ClaudeCode breadcrumb effect - repoName: hello-world-1 projectId: project--tmp-e2e-test-workspace-1751953282680-projects-test-project project: {id: project--tmp-e2e-test-workspace-1751953282680-projects-test-project, name: test-project, description: Test Project project created via UI., purpose: Test Project project created via UI., status: active} -[2138ms] [log] Setting Claude Code breadcrumb with project: test-project -[2139ms] [log] New breadcrumb: [Object, Object, Object] -[2139ms] [log] ClaudeCode init session: {projectId: project--tmp-e2e-test-workspace-1751953282680-projects-test-project, projectName: test-project, workspaceProjectPath: /tmp/e2e-test-workspace-1751953282680/projects/test-project, repoName: hello-world-1} -[2140ms] [log] [ClaudeCodeProvider] MOUNTED #1 at 2025-07-08T05:41:24.824Z -[2142ms] [log] Checking badge for hello-world-1: false repo: {name: hello-world, number: 1, path: /tmp/e2e-test-workspace-1751953282680/projects/test-project/repos/hello-world-1, isAvailable: true} map: [] -[2142ms] [log] ClaudeCode component render, messages: 0 -[2142ms] [log] isInitializing: true isConnected: false sessionId: null -[2148ms] [log] Session response: {sessionId: project--tmp-e2e-test-workspace-1751953282680-proj…ello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae, reservedRepo: hello-world-1, contextUsage: 0, new: true} -[2148ms] [log] New session created, starting fresh -[2148ms] [log] [ClaudeCodeProvider] Scheduling SSE connection setup with delay -[2148ms] [log] ClaudeCode component render, messages: 0 -[2148ms] [log] isInitializing: false isConnected: false sessionId: project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae -[2149ms] [log] VirtualMessageList render, messages count: 0 -[2149ms] [log] Messages: [] -[2154ms] [log] [ClaudeCodeProvider] Component cleanup running for sessionId: null -[2639ms] [log] Unsubscribed from resources: [repo-status:/tmp/e2e-test-workspace-1751953282680/projects/test-project/hello-world-1] -[2648ms] [log] [ClaudeCodeProvider] Setting up delayed SSE connection -[2648ms] [log] [ClaudeCodeProvider] setupSSEConnection called for sessionId: project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae -[2648ms] [log] Setting up SSE connection: project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae-1751953285333-0.3790977305277222 -[2650ms] [log] SSE connection opened: project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae-1751953285333-0.3790977305277222 -[2650ms] [log] SSE default message received: {"type":"connected"} -[2651ms] [log] message-start event received: {id: 3f9998d1-8f8c-4161-b399-62b285464c9d, type: assistant, isGreeting: true} -[2651ms] [log] Is greeting: true -[2651ms] [log] isRestoringExistingSessionRef.current: false -[2651ms] [log] isExistingMessage: false -[2651ms] [log] Creating message with isStreaming: true isExistingMessage: false -[2651ms] [log] Cleared streamingMessageRef for new message -[2651ms] [log] setMessages called in message-start, prev length: 0 -[2651ms] [log] Previous messages: [] -[2651ms] [log] Creating new message: {id: 3f9998d1-8f8c-4161-b399-62b285464c9d, role: assistant, content: , timestamp: Mon Jul 07 2025 22:41:25 GMT-0700 (Pacific Daylight Time), startTime: Mon Jul 07 2025 22:41:25 GMT-0700 (Pacific Daylight Time)} -[2651ms] [log] New messages array: [Object] -[2651ms] [log] ClaudeCode component render, messages: 1 -[2651ms] [log] isInitializing: false isConnected: true sessionId: project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae -[2651ms] [log] VirtualMessageList render, messages count: 1 -[2651ms] [log] Messages: [Object] -[2653ms] [log] VirtualMessageList render, messages count: 1 -[2653ms] [log] Messages: [Object] -[2656ms] [log] VirtualMessageList render, messages count: 1 -[2656ms] [log] Messages: [Object] -[7167ms] [log] message-chunk event received, data length: 223 -[7167ms] [log] Chunk for messageId: 3f9998d1-8f8c-4161-b399-62b285464c9d -[7167ms] [log] Chunk content: Hey Developer! Welcome back to hello-world-1 - it's getting late but I'm here to help you make progress on test-project. What would you like to work on tonight? -[7167ms] [log] Chunk content length: 160 -[7167ms] [log] streamingMessageRef.current now: Hey Developer! Welcome back to hello-world-1 - it' -[7167ms] [log] setMessages in message-chunk, looking for messageId: 3f9998d1-8f8c-4161-b399-62b285464c9d -[7167ms] [log] Current messages before update: [Object] -[7167ms] [log] Updating message: 3f9998d1-8f8c-4161-b399-62b285464c9d old content: new content: Hey Developer! Welcome back to -[7167ms] [log] Updated message content length: 160 -[7167ms] [log] Updated messages after chunk: [Object] -[7167ms] [log] message-complete event received for messageId: 3f9998d1-8f8c-4161-b399-62b285464c9d -[7168ms] [log] Processing message-complete, current messages: [Object] -[7168ms] [log] Found message to complete: 3f9998d1-8f8c-4161-b399-62b285464c9d current content length: 160 -[7168ms] [log] streamingMessageRef.current length: 0 -[7168ms] [log] Using existing message content -[7168ms] [log] Final content length: 160 -[7168ms] [log] Final content preview: Hey Developer! Welcome back to hello-world-1 - it' -[7168ms] [log] After message-complete, updated messages: [Object] -[7168ms] [log] ClaudeCode component render, messages: 1 -[7168ms] [log] isInitializing: false isConnected: true sessionId: project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae -[7168ms] [log] VirtualMessageList render, messages count: 1 -[7168ms] [log] Messages: [Object] -[7184ms] [log] VirtualMessageList render, messages count: 1 -[7184ms] [log] Messages: [Object] - -=== NETWORK REQUESTS === -[2140ms] POST http://localhost:3000/api/claude/code/start -[2148ms] RESPONSE 200 http://localhost:3000/api/claude/code/start -[2649ms] GET http://localhost:3000/api/claude/code/stream?sessionId=project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae&connectionId=project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae-1751953285333-0.3790977305277222 -[2650ms] RESPONSE 200 http://localhost:3000/api/claude/code/stream?sessionId=project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae&connectionId=project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae-1751953285333-0.3790977305277222 \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index d94e7deb..00000000 --- a/eslint.config.js +++ /dev/null @@ -1,23 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' -import { globalIgnores } from 'eslint/config' - -export default tseslint.config([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - js.configs.recommended, - tseslint.configs.recommended, - reactHooks.configs['recommended-latest'], - reactRefresh.configs.vite, - ], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - }, - }, -]) diff --git a/lage.config.cjs b/lage.config.cjs new file mode 100644 index 00000000..dc333092 --- /dev/null +++ b/lage.config.cjs @@ -0,0 +1,22 @@ +module.exports = { + pipeline: { + build: { + dependsOn: ["^build"], + outputs: ["lib/**", "dist/**", "build/**"], + }, + test: { + dependsOn: ["build"], + }, + lint: { + dependsOn: [], + }, + typecheck: { + dependsOn: ["^build"], + }, + dev: { + cache: false, + persistent: true, + }, + }, + npmClient: "pnpm", +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index c1d621d7..00000000 --- a/package-lock.json +++ /dev/null @@ -1,8087 +0,0 @@ -{ - "name": "project-mgmt-ux", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "project-mgmt-ux", - "version": "0.0.0", - "dependencies": { - "@mdxeditor/editor": "^3.39.0", - "@tailwindcss/typography": "^0.5.16", - "@tanstack/react-virtual": "^3.13.12", - "@types/marked": "^6.0.0", - "date-fns": "^4.1.0", - "diff": "^8.0.2", - "dom-to-image": "^2.6.0", - "eventsource": "^4.0.0", - "marked": "^16.0.0", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-router-dom": "^7.6.3", - "uuid": "^11.1.0" - }, - "devDependencies": { - "@eslint/js": "^9.29.0", - "@playwright/test": "^1.53.2", - "@tailwindcss/forms": "^0.5.7", - "@tailwindcss/postcss": "^4.1.11", - "@types/diff": "^7.0.2", - "@types/dom-to-image": "^2.6.7", - "@types/node": "^24.0.10", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", - "@types/uuid": "^10.0.0", - "@vitejs/plugin-react": "^4.5.2", - "autoprefixer": "^10.4.21", - "eslint": "^9.29.0", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.20", - "globals": "^16.2.0", - "postcss": "^8.5.6", - "tailwindcss": "^3.4.0", - "typescript": "~5.8.3", - "typescript-eslint": "^8.34.1", - "vite": "^7.0.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.7.tgz", - "integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", - "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", - "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", - "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@codemirror/autocomplete": { - "version": "6.18.6", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", - "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz", - "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.27.0", - "@lezer/common": "^1.1.0" - } - }, - "node_modules/@codemirror/lang-angular": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@codemirror/lang-angular/-/lang-angular-0.1.4.tgz", - "integrity": "sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-html": "^6.0.0", - "@codemirror/lang-javascript": "^6.1.2", - "@codemirror/language": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.3" - } - }, - "node_modules/@codemirror/lang-cpp": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@codemirror/lang-cpp/-/lang-cpp-6.0.3.tgz", - "integrity": "sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/cpp": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-css": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", - "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.2", - "@lezer/css": "^1.1.7" - } - }, - "node_modules/@codemirror/lang-go": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-go/-/lang-go-6.0.1.tgz", - "integrity": "sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.6.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/go": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-html": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz", - "integrity": "sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/lang-css": "^6.0.0", - "@codemirror/lang-javascript": "^6.0.0", - "@codemirror/language": "^6.4.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0", - "@lezer/css": "^1.1.0", - "@lezer/html": "^1.3.0" - } - }, - "node_modules/@codemirror/lang-java": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-java/-/lang-java-6.0.2.tgz", - "integrity": "sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/java": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-javascript": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz", - "integrity": "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.6.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0", - "@lezer/javascript": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-json": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", - "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/json": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-less": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-less/-/lang-less-6.0.2.tgz", - "integrity": "sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-css": "^6.2.0", - "@codemirror/language": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-liquid": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@codemirror/lang-liquid/-/lang-liquid-6.2.3.tgz", - "integrity": "sha512-yeN+nMSrf/lNii3FJxVVEGQwFG0/2eDyH6gNOj+TGCa0hlNO4bhQnoO5ISnd7JOG+7zTEcI/GOoyraisFVY7jQ==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/lang-html": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.1" - } - }, - "node_modules/@codemirror/lang-markdown": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.3.3.tgz", - "integrity": "sha512-1fn1hQAPWlSSMCvnF810AkhWpNLkJpl66CRfIy3vVl20Sl4NwChkorCHqpMtNbXr1EuMJsrDnhEpjZxKZ2UX3A==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.7.1", - "@codemirror/lang-html": "^6.0.0", - "@codemirror/language": "^6.3.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.2.1", - "@lezer/markdown": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-php": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-php/-/lang-php-6.0.2.tgz", - "integrity": "sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-html": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/php": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-python": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.2.1.tgz", - "integrity": "sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.3.2", - "@codemirror/language": "^6.8.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.2.1", - "@lezer/python": "^1.1.4" - } - }, - "node_modules/@codemirror/lang-rust": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-rust/-/lang-rust-6.0.2.tgz", - "integrity": "sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/rust": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-sass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-sass/-/lang-sass-6.0.2.tgz", - "integrity": "sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-css": "^6.2.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.2", - "@lezer/sass": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-sql": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.9.0.tgz", - "integrity": "sha512-xmtpWqKSgum1B1J3Ro6rf7nuPqf2+kJQg5SjrofCAcyCThOe0ihSktSoXfXuhQBnwx1QbmreBbLJM5Jru6zitg==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-vue": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@codemirror/lang-vue/-/lang-vue-0.1.3.tgz", - "integrity": "sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-html": "^6.0.0", - "@codemirror/lang-javascript": "^6.1.2", - "@codemirror/language": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.1" - } - }, - "node_modules/@codemirror/lang-wast": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-wast/-/lang-wast-6.0.2.tgz", - "integrity": "sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-xml": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", - "integrity": "sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.4.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/xml": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-yaml": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz", - "integrity": "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.2.0", - "@lezer/lr": "^1.0.0", - "@lezer/yaml": "^1.0.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.2.tgz", - "integrity": "sha512-p44TsNArL4IVXDTbapUmEkAlvWs2CFQbcfc0ymDsis1kH2wh0gcY96AS29c/vp2d0y2Tquk1EDSaawpzilUiAw==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/language-data": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@codemirror/language-data/-/language-data-6.5.1.tgz", - "integrity": "sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-angular": "^0.1.0", - "@codemirror/lang-cpp": "^6.0.0", - "@codemirror/lang-css": "^6.0.0", - "@codemirror/lang-go": "^6.0.0", - "@codemirror/lang-html": "^6.0.0", - "@codemirror/lang-java": "^6.0.0", - "@codemirror/lang-javascript": "^6.0.0", - "@codemirror/lang-json": "^6.0.0", - "@codemirror/lang-less": "^6.0.0", - "@codemirror/lang-liquid": "^6.0.0", - "@codemirror/lang-markdown": "^6.0.0", - "@codemirror/lang-php": "^6.0.0", - "@codemirror/lang-python": "^6.0.0", - "@codemirror/lang-rust": "^6.0.0", - "@codemirror/lang-sass": "^6.0.0", - "@codemirror/lang-sql": "^6.0.0", - "@codemirror/lang-vue": "^0.1.1", - "@codemirror/lang-wast": "^6.0.0", - "@codemirror/lang-xml": "^6.0.0", - "@codemirror/lang-yaml": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/legacy-modes": "^6.4.0" - } - }, - "node_modules/@codemirror/legacy-modes": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.1.tgz", - "integrity": "sha512-DJYQQ00N1/KdESpZV7jg9hafof/iBNp9h7TYo1SLMk86TWl9uDsVdho2dzd81K+v4retmK6mdC7WpuOQDytQqw==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0" - } - }, - "node_modules/@codemirror/lint": { - "version": "6.8.5", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", - "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.35.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/merge": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/@codemirror/merge/-/merge-6.10.2.tgz", - "integrity": "sha512-rmHzVkt5FnCtsi0IgvDIDjh/J4LmbfOboB7FMvVl21IHO0p1QM6jSwjkBjBD3D+c+T79OabEqoduCqvJCBV8Yg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/highlight": "^1.0.0", - "style-mod": "^4.1.0" - } - }, - "node_modules/@codemirror/search": { - "version": "6.5.11", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz", - "integrity": "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/state": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", - "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", - "license": "MIT", - "dependencies": { - "@marijn/find-cluster-break": "^1.0.0" - } - }, - "node_modules/@codemirror/view": { - "version": "6.38.0", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.0.tgz", - "integrity": "sha512-yvSchUwHOdupXkd7xJ0ob36jdsSR/I+/C+VbY0ffBiL5NiSTEBDfB1ZGWbbIlDd5xgdUkody+lukAdOxYrOBeg==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.5.0", - "crelt": "^1.0.6", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@codesandbox/nodebox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@codesandbox/nodebox/-/nodebox-0.1.8.tgz", - "integrity": "sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==", - "license": "SEE LICENSE IN ./LICENSE", - "dependencies": { - "outvariant": "^1.4.0", - "strict-event-emitter": "^0.4.3" - } - }, - "node_modules/@codesandbox/sandpack-client": { - "version": "2.19.8", - "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-client/-/sandpack-client-2.19.8.tgz", - "integrity": "sha512-CMV4nr1zgKzVpx4I3FYvGRM5YT0VaQhALMW9vy4wZRhEyWAtJITQIqZzrTGWqB1JvV7V72dVEUCUPLfYz5hgJQ==", - "license": "Apache-2.0", - "dependencies": { - "@codesandbox/nodebox": "0.1.8", - "buffer": "^6.0.3", - "dequal": "^2.0.2", - "mime-db": "^1.52.0", - "outvariant": "1.4.0", - "static-browser-server": "1.0.3" - } - }, - "node_modules/@codesandbox/sandpack-react": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-react/-/sandpack-react-2.20.0.tgz", - "integrity": "sha512-takd1YpW/PMQ6KPQfvseWLHWklJovGY8QYj8MtWnskGKbjOGJ6uZfyZbcJ6aCFLQMpNyjTqz9AKNbvhCOZ1TUQ==", - "license": "Apache-2.0", - "dependencies": { - "@codemirror/autocomplete": "^6.4.0", - "@codemirror/commands": "^6.1.3", - "@codemirror/lang-css": "^6.0.1", - "@codemirror/lang-html": "^6.4.0", - "@codemirror/lang-javascript": "^6.1.2", - "@codemirror/language": "^6.3.2", - "@codemirror/state": "^6.2.0", - "@codemirror/view": "^6.7.1", - "@codesandbox/sandpack-client": "^2.19.8", - "@lezer/highlight": "^1.1.3", - "@react-hook/intersection-observer": "^3.1.1", - "@stitches/core": "^1.2.6", - "anser": "^2.1.1", - "clean-set": "^1.1.2", - "dequal": "^2.0.2", - "escape-carriage": "^1.3.1", - "lz-string": "^1.4.4", - "react-devtools-inline": "4.4.0", - "react-is": "^17.0.2" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19", - "react-dom": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.30.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz", - "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", - "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.15.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", - "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", - "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.2", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/react": { - "version": "0.27.13", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.13.tgz", - "integrity": "sha512-Qmj6t9TjgWAvbygNEu1hj4dbHI9CY0ziCMIJrmYoDIn9TUAH5lRmiIeZmRd4c6QEZkzdoH7jNnoNyoY1AIESiA==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.4", - "@floating-ui/utils": "^0.2.10", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz", - "integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.2" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lexical/clipboard": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.32.1.tgz", - "integrity": "sha512-oO7CuMVh3EFEqtE6+7Ccf7jMD5RNUmSdTnFm/X4kYNGqs9lgGt8j5PgSk7oP9OuAjxKNdBTbltSlh54CX3AUIg==", - "license": "MIT", - "dependencies": { - "@lexical/html": "0.32.1", - "@lexical/list": "0.32.1", - "@lexical/selection": "0.32.1", - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/code": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.32.1.tgz", - "integrity": "sha512-2rXj8s/CG32XKQ2EpORpACfpzyAxB+/SrQW2cjwczarLs5Fxnx6u6HwahZnxaF0z5UHIPUy90qDiOiRExc74Yg==", - "license": "MIT", - "dependencies": { - "@lexical/utils": "0.32.1", - "lexical": "0.32.1", - "prismjs": "^1.30.0" - } - }, - "node_modules/@lexical/devtools-core": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.32.1.tgz", - "integrity": "sha512-3WnZQo6Qig7ccjDu2b8s1Kb5CCXowxnK0i8CCRG9mHAw7i6XpZUYAbk4rmcK/qbhLHrc7LwUrAMFzGtfLEH3XA==", - "license": "MIT", - "dependencies": { - "@lexical/html": "0.32.1", - "@lexical/link": "0.32.1", - "@lexical/mark": "0.32.1", - "@lexical/table": "0.32.1", - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - }, - "peerDependencies": { - "react": ">=17.x", - "react-dom": ">=17.x" - } - }, - "node_modules/@lexical/dragon": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.32.1.tgz", - "integrity": "sha512-Dlx8P2b/O7gZLmXnoanmDkFL5RgA8Vvix4ZuSvT0apblqySzgi8l3NHHwwqXy1g2nfSupvpr7Dsf10Lu3l0Hlw==", - "license": "MIT", - "dependencies": { - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/hashtag": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.32.1.tgz", - "integrity": "sha512-S63bb7uIB4hO2V0UmzUiKlwAGegQlyFKqrOw9NJwOb8O96gHRxr27FUsEb8ToWLM8TSm2aw1WsZXs7CJQqGtCg==", - "license": "MIT", - "dependencies": { - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/history": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.32.1.tgz", - "integrity": "sha512-IRsKllumYEWxmzR2evN30MFY+JBM723lSyzm2PAQcgHCeBxi8t0Vc3EdyJRay+YdN65JgrohQi1WbktbK923uQ==", - "license": "MIT", - "dependencies": { - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/html": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.32.1.tgz", - "integrity": "sha512-uctCdC9gVzx/Sw9CimT4C2IDfSbfEGYunyIrJBpsfcdqp0rroGNizjIoZNBH3xcgkk9UDboSADo+wimbzEoy8A==", - "license": "MIT", - "dependencies": { - "@lexical/selection": "0.32.1", - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/link": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.32.1.tgz", - "integrity": "sha512-atdwNpWjZ0U2/kgS0ATTkZ8lJLHiv3TsJgqJL33BuV9Gn7advJokd4faM79Y8XxkhiPi1lVTBSHgI8V4hs+c+Q==", - "license": "MIT", - "dependencies": { - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/list": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.32.1.tgz", - "integrity": "sha512-3zShCfEdAvodR6mQ5CNN1gcEwfV341LXJzWCIkZzG1cPwaiBHUlT7TynQtKTPn1sATCEMmxoDG0/T+itsRNZgA==", - "license": "MIT", - "dependencies": { - "@lexical/selection": "0.32.1", - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/mark": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.32.1.tgz", - "integrity": "sha512-AXF2wmUvvSI45y+sgZKnU0pnUdttd9v75DDQgdplqtCkyDqHVGxVCNCrLE+PJtzIrwJxtA2UyC8yFZMBM92HpA==", - "license": "MIT", - "dependencies": { - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/markdown": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.32.1.tgz", - "integrity": "sha512-AmUTRRx6Je0AOiQqp48Xn92/71AzhFgi4nO1EtPW5eae1CihrtiEh5UQr48mV6EyjvH9D3OlOLU8XrzS+J9a+w==", - "license": "MIT", - "dependencies": { - "@lexical/code": "0.32.1", - "@lexical/link": "0.32.1", - "@lexical/list": "0.32.1", - "@lexical/rich-text": "0.32.1", - "@lexical/text": "0.32.1", - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/offset": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/offset/-/offset-0.32.1.tgz", - "integrity": "sha512-zfHqoLlQ0lq1akFHy81xnDaRRE5KkqFa7OovOxKPBpALQCiJIAb2ykqj/Woc2oUeYaEcnkaFU9+kEWMK9yY0fQ==", - "license": "MIT", - "dependencies": { - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/overflow": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.32.1.tgz", - "integrity": "sha512-wjcFGjzkbugds2Q5Wag59WrcxJwMUACEXms1FtFdu1/YcBPqNAKJSyfo8Z/5LGfstQEb2nPtSuEQZUb7v+XYyA==", - "license": "MIT", - "dependencies": { - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/plain-text": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.32.1.tgz", - "integrity": "sha512-uFS3xoETB3phnYHZXfMKvl8gh6YRW7rpokuJmQVMHNNBklORmMpN00rRQ/zsc/jt/nPzaPpE5cLwSHXeJdqJUg==", - "license": "MIT", - "dependencies": { - "@lexical/clipboard": "0.32.1", - "@lexical/selection": "0.32.1", - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/react": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.32.1.tgz", - "integrity": "sha512-PCiAiwGIGfkYb2o9Kx+gGGqXwxqb7/W4cGSnw1nzmNtCerJ3S64WZs87Lgcow0RlDSwqzpH534+eCyIddueSqw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.27.8", - "@lexical/devtools-core": "0.32.1", - "@lexical/dragon": "0.32.1", - "@lexical/hashtag": "0.32.1", - "@lexical/history": "0.32.1", - "@lexical/link": "0.32.1", - "@lexical/list": "0.32.1", - "@lexical/mark": "0.32.1", - "@lexical/markdown": "0.32.1", - "@lexical/overflow": "0.32.1", - "@lexical/plain-text": "0.32.1", - "@lexical/rich-text": "0.32.1", - "@lexical/table": "0.32.1", - "@lexical/text": "0.32.1", - "@lexical/utils": "0.32.1", - "@lexical/yjs": "0.32.1", - "lexical": "0.32.1", - "react-error-boundary": "^3.1.4" - }, - "peerDependencies": { - "react": ">=17.x", - "react-dom": ">=17.x" - } - }, - "node_modules/@lexical/rich-text": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.32.1.tgz", - "integrity": "sha512-SnmpZ7boTLxeYfNezNLvchDiJOAALA2nD0Uq/SpkIOJ6R01R7m1aPdLv55LGKoBT9UxCRdo0HWXytwiVZI+ehQ==", - "license": "MIT", - "dependencies": { - "@lexical/clipboard": "0.32.1", - "@lexical/selection": "0.32.1", - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/selection": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.32.1.tgz", - "integrity": "sha512-X1aXJdq/5EOuSuMOqK3t+rEVmpqLf+vc2Kl5YuP8+gGWUbXuxR6iryrQuy1mAViZpF/5qw4HO/Sb+9JjubaZEg==", - "license": "MIT", - "dependencies": { - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/table": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.32.1.tgz", - "integrity": "sha512-sGk2jUbQHj5hatpxRyl6IE2oWsjRnYhmaP94THzn95/uK69o8eSizcnd148WzYsX8Zz+L9PTLS1xjvCbfLTP+A==", - "license": "MIT", - "dependencies": { - "@lexical/clipboard": "0.32.1", - "@lexical/utils": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/text": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.32.1.tgz", - "integrity": "sha512-0Ek8F3KC4d16b2YaTHdyYFqDSBZ5KRtGrqU3GBog+VOGxucGaEbXEK1/ypX5CTe/wwkQDrH0FKWPQbd3l5t5YQ==", - "license": "MIT", - "dependencies": { - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/utils": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.32.1.tgz", - "integrity": "sha512-ZaqZZksNIHJd+g8GXc11D1ESi8JzsdLVQZ+9odXVaNxtwDIaGIqMSccFyuZ9VSoJDde4JXZkgp/0PShbAZDkyw==", - "license": "MIT", - "dependencies": { - "@lexical/list": "0.32.1", - "@lexical/selection": "0.32.1", - "@lexical/table": "0.32.1", - "lexical": "0.32.1" - } - }, - "node_modules/@lexical/yjs": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.32.1.tgz", - "integrity": "sha512-VHGTg5z4wcDkPe8NnhzA5+CoOKJ5tVmTmMvoiZ91rtNUFQPxWRky88Gjt1e3yXldYp4pImNEgtAjlWqvaJBYGA==", - "license": "MIT", - "dependencies": { - "@lexical/offset": "0.32.1", - "@lexical/selection": "0.32.1", - "lexical": "0.32.1" - }, - "peerDependencies": { - "yjs": ">=13.5.22" - } - }, - "node_modules/@lezer/common": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", - "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", - "license": "MIT" - }, - "node_modules/@lezer/cpp": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@lezer/cpp/-/cpp-1.1.3.tgz", - "integrity": "sha512-ykYvuFQKGsRi6IcE+/hCSGUhb/I4WPjd3ELhEblm2wS2cOznDFzO+ubK2c+ioysOnlZ3EduV+MVQFCPzAIoY3w==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/css": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.2.1.tgz", - "integrity": "sha512-2F5tOqzKEKbCUNraIXc0f6HKeyKlmMWJnBB0i4XW6dJgssrZO/YlZ2pY5xgyqDleqqhiNJ3dQhbrV2aClZQMvg==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/go": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@lezer/go/-/go-1.0.1.tgz", - "integrity": "sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/highlight": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", - "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/html": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz", - "integrity": "sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/java": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@lezer/java/-/java-1.1.3.tgz", - "integrity": "sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/javascript": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.1.tgz", - "integrity": "sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.1.3", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/json": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", - "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", - "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/markdown": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.4.3.tgz", - "integrity": "sha512-kfw+2uMrQ/wy/+ONfrH83OkdFNM0ye5Xq96cLlaCy7h5UT9FO54DU4oRoIc0CSBh5NWmWuiIJA7NGLMJbQ+Oxg==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0" - } - }, - "node_modules/@lezer/php": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@lezer/php/-/php-1.0.2.tgz", - "integrity": "sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.1.0" - } - }, - "node_modules/@lezer/python": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.18.tgz", - "integrity": "sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/rust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@lezer/rust/-/rust-1.0.2.tgz", - "integrity": "sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/sass": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lezer/sass/-/sass-1.1.0.tgz", - "integrity": "sha512-3mMGdCTUZ/84ArHOuXWQr37pnf7f+Nw9ycPUeKX+wu19b7pSMcZGLbaXwvD2APMBDOGxPmpK/O6S1v1EvLoqgQ==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/xml": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.6.tgz", - "integrity": "sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/yaml": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.3.tgz", - "integrity": "sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.4.0" - } - }, - "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "license": "MIT" - }, - "node_modules/@mdxeditor/editor": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/@mdxeditor/editor/-/editor-3.39.0.tgz", - "integrity": "sha512-nPzA74xluHu0lqcGXZT/boHp3LmdRF/xF/Ri6hc+/eoN/kBmXeB/Xrok8AoLhmuVhXrXreAvTxfNahZJWOHX7w==", - "license": "MIT", - "dependencies": { - "@codemirror/commands": "^6.2.4", - "@codemirror/lang-markdown": "^6.2.3", - "@codemirror/language-data": "^6.5.1", - "@codemirror/merge": "^6.4.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.23.0", - "@codesandbox/sandpack-react": "^2.20.0", - "@lexical/clipboard": "^0.32.1", - "@lexical/link": "^0.32.1", - "@lexical/list": "^0.32.1", - "@lexical/markdown": "^0.32.1", - "@lexical/plain-text": "^0.32.1", - "@lexical/react": "^0.32.1", - "@lexical/rich-text": "^0.32.1", - "@lexical/selection": "^0.32.1", - "@lexical/utils": "^0.32.1", - "@mdxeditor/gurx": "^1.1.4", - "@radix-ui/colors": "^3.0.0", - "@radix-ui/react-dialog": "^1.1.11", - "@radix-ui/react-icons": "^1.3.2", - "@radix-ui/react-popover": "^1.1.11", - "@radix-ui/react-popper": "^1.2.4", - "@radix-ui/react-select": "^2.2.2", - "@radix-ui/react-toggle-group": "^1.1.7", - "@radix-ui/react-toolbar": "^1.1.7", - "@radix-ui/react-tooltip": "^1.2.4", - "classnames": "^2.3.2", - "cm6-theme-basic-light": "^0.2.0", - "codemirror": "^6.0.1", - "downshift": "^7.6.0", - "js-yaml": "4.1.0", - "lexical": "^0.32.1", - "mdast-util-directive": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-frontmatter": "^2.0.1", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-mdx": "^3.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-to-markdown": "^2.1.0", - "micromark-extension-directive": "^3.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.1", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs": "^3.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.1", - "micromark-util-symbol": "^2.0.0", - "react-hook-form": "^7.56.1", - "unidiff": "^1.0.2" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">= 18 || >= 19", - "react-dom": ">= 18 || >= 19" - } - }, - "node_modules/@mdxeditor/gurx": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@mdxeditor/gurx/-/gurx-1.2.3.tgz", - "integrity": "sha512-5DQOlEx46oN9spggrC8husAGAhVoEFBGIYKN48es08XhRUbSU6l5bcIQYwRrQaY8clU1tExIcXzw8/fNnoxjpg==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">= 18 || >= 19", - "react-dom": ">= 18 || >= 19" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "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/@playwright/test": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.2.tgz", - "integrity": "sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.53.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@radix-ui/colors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", - "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==", - "license": "MIT" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", - "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-icons": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", - "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", - "license": "MIT", - "peerDependencies": { - "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz", - "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz", - "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz", - "integrity": "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.9.tgz", - "integrity": "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.10.tgz", - "integrity": "sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-toggle": "1.1.9", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toolbar": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.10.tgz", - "integrity": "sha512-jiwQsduEL++M4YBIurjSa+voD86OIytCod0/dbIxFZDLD8NfO1//keXYMfsW8BPcfqwoNjt+y06XcJqAb4KR7A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-toggle-group": "1.1.10" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", - "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@react-hook/intersection-observer": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-hook/intersection-observer/-/intersection-observer-3.1.2.tgz", - "integrity": "sha512-mWU3BMkmmzyYMSuhO9wu3eJVP21N8TcgYm9bZnTrMwuM818bEk+0NRM3hP+c/TqA9Ln5C7qE53p1H0QMtzYdvQ==", - "license": "MIT", - "dependencies": { - "@react-hook/passive-layout-effect": "^1.2.0", - "intersection-observer": "^0.10.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@react-hook/passive-layout-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", - "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", - "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", - "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@stitches/core": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@stitches/core/-/core-1.2.8.tgz", - "integrity": "sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==", - "license": "MIT" - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", - "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.30.1", - "magic-string": "^0.30.17", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.11" - } - }, - "node_modules/@tailwindcss/node/node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/@tailwindcss/node/node_modules/tailwindcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", - "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", - "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.4", - "tar": "^7.4.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.11", - "@tailwindcss/oxide-darwin-arm64": "4.1.11", - "@tailwindcss/oxide-darwin-x64": "4.1.11", - "@tailwindcss/oxide-freebsd-x64": "4.1.11", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", - "@tailwindcss/oxide-linux-x64-musl": "4.1.11", - "@tailwindcss/oxide-wasm32-wasi": "4.1.11", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", - "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", - "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz", - "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.11", - "@tailwindcss/oxide": "4.1.11", - "postcss": "^8.4.41", - "tailwindcss": "4.1.11" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", - "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", - "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", - "license": "MIT", - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - } - }, - "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@tanstack/react-virtual": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz", - "integrity": "sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==", - "license": "MIT", - "dependencies": { - "@tanstack/virtual-core": "3.13.12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@tanstack/virtual-core": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", - "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/diff": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/diff/-/diff-7.0.2.tgz", - "integrity": "sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/dom-to-image": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/@types/dom-to-image/-/dom-to-image-2.6.7.tgz", - "integrity": "sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg==", - "dev": true, - "license": "MIT" - }, - "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/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/marked": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-6.0.0.tgz", - "integrity": "sha512-jmjpa4BwUsmhxcfsgUit/7A9KbrC48Q0q8KvnY107ogcjGgTFDlIL3RpihNpx2Mu1hM4mdFQjoVc4O6JoGKHsA==", - "deprecated": "This is a stub types definition. marked provides its own type definitions, so you do not need this installed.", - "license": "MIT", - "dependencies": { - "marked": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", - "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.8.0" - } - }, - "node_modules/@types/react": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", - "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.1.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", - "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", - "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/type-utils": "8.35.1", - "@typescript-eslint/utils": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.35.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", - "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", - "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.35.1", - "@typescript-eslint/types": "^8.35.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", - "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", - "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", - "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/utils": "8.35.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", - "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", - "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.35.1", - "@typescript-eslint/tsconfig-utils": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", - "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", - "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.35.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz", - "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.19", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/anser": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/anser/-/anser-2.3.2.tgz", - "integrity": "sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw==", - "license": "MIT" - }, - "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/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "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/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001726", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", - "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", - "dev": true, - "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/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" - }, - "node_modules/clean-set": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/clean-set/-/clean-set-1.1.2.tgz", - "integrity": "sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==", - "license": "MIT" - }, - "node_modules/cm6-theme-basic-light": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/cm6-theme-basic-light/-/cm6-theme-basic-light-0.2.0.tgz", - "integrity": "sha512-1prg2gv44sYfpHscP26uLT/ePrh0mlmVwMSoSd3zYKQ92Ab3jPRLzyCnpyOCQLJbK+YdNs4HvMRqMNYdy4pMhA==", - "license": "MIT", - "peerDependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/highlight": "^1.0.0" - } - }, - "node_modules/codemirror": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", - "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "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/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compute-scroll-into-view": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-2.0.4.tgz", - "integrity": "sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "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/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/date-fns": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/dom-to-image": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz", - "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==", - "license": "MIT" - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/downshift": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/downshift/-/downshift-7.6.2.tgz", - "integrity": "sha512-iOv+E1Hyt3JDdL9yYcOgW7nZ7GQ2Uz6YbggwXvKUSleetYhU2nXD482Rz6CzvM4lvI1At34BYruKAL4swRGxaA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.14.8", - "compute-scroll-into-view": "^2.0.4", - "prop-types": "^15.7.2", - "react-is": "^17.0.2", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "react": ">=16.12.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/electron-to-chromium": { - "version": "1.5.178", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.178.tgz", - "integrity": "sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA==", - "dev": true, - "license": "ISC" - }, - "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/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-carriage": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.1.tgz", - "integrity": "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.30.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz", - "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.14.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.30.1", - "@eslint/plugin-kit": "^0.3.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", - "dev": true, - "license": "MIT", - "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" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", - "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=8.40" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/eventsource": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.0.0.tgz", - "integrity": "sha512-fvIkb9qZzdMxgZrEQDyll+9oJsyaVvY92I2Re+qK0qEJ+w5s0X3dtz+M0VAPOjP1gtU3iqWyjQ0G3nvd5CLZ2g==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", - "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "license": "MIT", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "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/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/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/glob/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/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/intersection-observer": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.10.0.tgz", - "integrity": "sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==", - "license": "W3C-20150513" - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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/isomorphic.js": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", - "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", - "license": "MIT", - "peer": true, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, - "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/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lexical": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/lexical/-/lexical-0.32.1.tgz", - "integrity": "sha512-Rvr9p00zUwzjXIqElIjMDyl/24QHw68yaqmXUWIT3lSdSAr8OpjSJK3iWBLZwVZwwpVhwShZRckomc+3vSb/zw==", - "license": "MIT" - }, - "node_modules/lib0": { - "version": "0.2.109", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.109.tgz", - "integrity": "sha512-jP0gbnyW0kwlx1Atc4dcHkBbrVAkdHjuyHxtClUPYla7qCmwIif1qZ6vQeJdR5FrOVdn26HvQT0ko01rgW7/Xw==", - "license": "MIT", - "peer": true, - "dependencies": { - "isomorphic.js": "^0.2.4" - }, - "bin": { - "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", - "0gentesthtml": "bin/gentesthtml.js", - "0serve": "bin/0serve.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, - "node_modules/lightningcss": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", - "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "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" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", - "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", - "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lru-cache/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.0.0.tgz", - "integrity": "sha512-MUKMXDjsD/eptB7GPzxo4xcnLS6oo7/RHimUMHEDRhUooPwmN9BEpMl7AEOJv3bmso169wHI2wUF9VQgL7zfmA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/mdast-util-directive": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", - "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", - "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "license": "MIT", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "license": "MIT", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true, - "license": "MIT", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "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/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.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/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/outvariant": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.0.tgz", - "integrity": "sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==", - "license": "MIT" - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "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/path-scurry/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/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": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/playwright": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", - "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.53.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.2.tgz", - "integrity": "sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "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/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-devtools-inline": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/react-devtools-inline/-/react-devtools-inline-4.4.0.tgz", - "integrity": "sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==", - "license": "MIT", - "dependencies": { - "es6-symbol": "^3" - } - }, - "node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, - "node_modules/react-error-boundary": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", - "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-hook-form": { - "version": "7.59.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.59.0.tgz", - "integrity": "sha512-kmkek2/8grqarTJExFNjy+RXDIP8yM+QTl3QL6m6Q8b2bih4ltmiXxH7T9n+yXNK477xPh5yZT/6vD8sYGzJTA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-router": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.3.tgz", - "integrity": "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.3.tgz", - "integrity": "sha512-DiWJm9qdUAmiJrVWaeJdu4TKu13+iB/8IEi0EW/XgaHCjW/vWGrwzup0GVvaMteuZjKnh5bEvJP/K0MDnzawHw==", - "license": "MIT", - "dependencies": { - "react-router": "7.6.3" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", - "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", - "dev": true, - "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.44.1", - "@rollup/rollup-android-arm64": "4.44.1", - "@rollup/rollup-darwin-arm64": "4.44.1", - "@rollup/rollup-darwin-x64": "4.44.1", - "@rollup/rollup-freebsd-arm64": "4.44.1", - "@rollup/rollup-freebsd-x64": "4.44.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", - "@rollup/rollup-linux-arm-musleabihf": "4.44.1", - "@rollup/rollup-linux-arm64-gnu": "4.44.1", - "@rollup/rollup-linux-arm64-musl": "4.44.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-musl": "4.44.1", - "@rollup/rollup-linux-s390x-gnu": "4.44.1", - "@rollup/rollup-linux-x64-gnu": "4.44.1", - "@rollup/rollup-linux-x64-musl": "4.44.1", - "@rollup/rollup-win32-arm64-msvc": "4.44.1", - "@rollup/rollup-win32-ia32-msvc": "4.44.1", - "@rollup/rollup-win32-x64-msvc": "4.44.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "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/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/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/static-browser-server": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/static-browser-server/-/static-browser-server-1.0.3.tgz", - "integrity": "sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==", - "license": "Apache-2.0", - "dependencies": { - "@open-draft/deferred-promise": "^2.1.0", - "dotenv": "^16.0.3", - "mime-db": "^1.52.0", - "outvariant": "^1.3.0" - } - }, - "node_modules/strict-event-emitter": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz", - "integrity": "sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==", - "license": "MIT" - }, - "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/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/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/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-mod": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", - "license": "MIT" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "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": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz", - "integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.35.1", - "@typescript-eslint/parser": "8.35.1", - "@typescript-eslint/utils": "8.35.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unidiff": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unidiff/-/unidiff-1.0.4.tgz", - "integrity": "sha512-ynU0vsAXw0ir8roa+xPCUHmnJ5goc5BTM2Kuc3IJd8UwgaeRs7VSD5+eeaQL+xp1JtB92hu/Zy/Lgy7RZcr1pQ==", - "license": "MIT", - "dependencies": { - "diff": "^5.1.0" - } - }, - "node_modules/unidiff/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "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/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.0.tgz", - "integrity": "sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.2", - "postcss": "^8.5.6", - "rollup": "^4.40.0", - "tinyglobby": "^0.2.14" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "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 - } - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" - }, - "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/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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/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/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/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yjs": { - "version": "13.6.27", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz", - "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", - "license": "MIT", - "peer": true, - "dependencies": { - "lib0": "^0.2.99" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json index 8b9f996b..9e7b77de 100644 --- a/package.json +++ b/package.json @@ -1,53 +1,30 @@ { - "name": "project-mgmt-ux", + "name": "@claude-flow/root", "private": true, "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "lint": "eslint .", - "preview": "vite preview", - "test:e2e": "playwright test", - "test:e2e:ui": "playwright test --ui" - }, - "dependencies": { - "@mdxeditor/editor": "^3.39.0", - "@tailwindcss/typography": "^0.5.16", - "@tanstack/react-virtual": "^3.13.12", - "@types/marked": "^6.0.0", - "date-fns": "^4.1.0", - "diff": "^8.0.2", - "dom-to-image": "^2.6.0", - "eventsource": "^4.0.0", - "marked": "^16.0.0", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-router-dom": "^7.6.3", - "uuid": "^11.1.0" + "dev": "repo-scripts dev", + "build": "lage build", + "test": "lage test", + "lint": "lage lint", + "check": "lage build build:cjs bundle test lint api", + "check:verbose": "pnpm check --verbose --reporter adoLog", + "lint:fix": "lage lint:fix", + "typecheck": "lage typecheck", + "scaffold": "repo-scripts scaffold", + "dev:v1": "pnpm --filter @claude-flow/v1-client dev", + "build:v1": "pnpm --filter @claude-flow/v1-client build", + "lint:v1": "pnpm --filter @claude-flow/v1-client lint", + "test:e2e": "pnpm --filter @claude-flow/v1-client test:e2e", + "test:e2e:ui": "pnpm --filter @claude-flow/v1-client test:e2e:ui" }, "devDependencies": { - "@eslint/js": "^9.29.0", - "@playwright/test": "^1.53.2", - "@tailwindcss/forms": "^0.5.7", - "@tailwindcss/postcss": "^4.1.11", - "@types/diff": "^7.0.2", - "@types/dom-to-image": "^2.6.7", - "@types/node": "^24.0.10", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", - "@types/uuid": "^10.0.0", - "@vitejs/plugin-react": "^4.5.2", - "autoprefixer": "^10.4.21", - "eslint": "^9.29.0", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.20", - "globals": "^16.2.0", - "postcss": "^8.5.6", - "tailwindcss": "^3.4.0", - "typescript": "~5.8.3", - "typescript-eslint": "^8.34.1", - "vite": "^7.0.0" + "@types/resolve": "^1.20.6", + "lage": "^2.7.9", + "resolve": "^1.22.10", + "tinyglobby": "^0.2.14", + "workspace-tools": "^0.38.4" }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" -} + "packageManager": "pnpm@9.0.0" +} \ No newline at end of file diff --git a/packages/eslint-config/eslint.config.js b/packages/eslint-config/eslint.config.js new file mode 100644 index 00000000..02520f16 --- /dev/null +++ b/packages/eslint-config/eslint.config.js @@ -0,0 +1,3 @@ +import { node } from './lib/index.js'; + +export default node; \ No newline at end of file diff --git a/packages/eslint-config/jest.config.js b/packages/eslint-config/jest.config.js new file mode 100644 index 00000000..2901106d --- /dev/null +++ b/packages/eslint-config/jest.config.js @@ -0,0 +1,18 @@ +export default { + preset: 'ts-jest/presets/default-esm', + testEnvironment: 'node', + extensionsToTreatAsEsm: ['.ts'], + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + useESM: true, + }, + ], + }, + testMatch: ['**/*.test.ts'], + passWithNoTests: true, +}; \ No newline at end of file diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json new file mode 100644 index 00000000..edfd3a3e --- /dev/null +++ b/packages/eslint-config/package.json @@ -0,0 +1,49 @@ +{ + "name": "@claude-flow/eslint-config", + "version": "1.0.0", + "private": true, + "type": "module", + "description": "Shared ESLint configuration for Claude Flow", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "exports": { + ".": "./lib/index.js", + "./base": "./lib/configs/base.js", + "./node": "./lib/configs/node.js", + "./react": "./lib/configs/react.js" + }, + "files": [ + "lib/**" + ], + "dependencies": { + "@eslint/js": "^9.29.0", + "@phenomnomnominal/tsquery": "^6.1.3", + "@typescript-eslint/utils": "^8.34.1", + "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.2.0", + "tsutils": "^3.21.0", + "typescript-eslint": "^8.34.1" + }, + "devDependencies": { + "@claude-flow/repo-scripts": "workspace:*", + "@claude-flow/tsconfig": "workspace:*", + "@types/jest": "^30.0.0", + "@types/node": "^20.0.0", + "@typescript-eslint/rule-tester": "^8.34.1", + "jest": "^30.0.4", + "ts-jest": "^29.4.0" + }, + "peerDependencies": { + "eslint": "^9.0.0", + "typescript": "^5.0.0" + }, + "scripts": { + "build": "repo-scripts build", + "clean": "repo-scripts clean", + "lint": "repo-scripts lint", + "lint:fix": "repo-scripts lint-fix", + "test": "repo-scripts test" + } +} \ No newline at end of file diff --git a/packages/eslint-config/src/configs/base.ts b/packages/eslint-config/src/configs/base.ts new file mode 100644 index 00000000..6a2c83e9 --- /dev/null +++ b/packages/eslint-config/src/configs/base.ts @@ -0,0 +1,46 @@ +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import { rules } from '../rules/index.js'; + +/** + * Base ESLint configuration shared by all environments. + * Contains common TypeScript rules and custom plugins. + */ +export const base = tseslint.config( + js.configs.recommended, + ...tseslint.configs.recommended, + { + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + parserOptions: { + project: true, + }, + }, + plugins: { + '@claude-flow': { + rules, + }, + }, + rules: { + // TypeScript rules + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/consistent-type-imports': [ + 'error', + { + prefer: 'type-imports', + fixStyle: 'inline-type-imports', + }, + ], + '@typescript-eslint/no-import-type-side-effects': 'error', + // '@claude-flow/no-deprecated': 'error', // TODO: Enable when type-aware linting is configured + '@claude-flow/no-default-export': 'error', + '@claude-flow/one-export-per-file': 'error', + }, + }, + { + ignores: ['**/dist/**', '**/lib/**', '**/node_modules/**', '**/*.d.ts'], + } +); \ No newline at end of file diff --git a/packages/eslint-config/src/configs/node.ts b/packages/eslint-config/src/configs/node.ts new file mode 100644 index 00000000..e6c3b848 --- /dev/null +++ b/packages/eslint-config/src/configs/node.ts @@ -0,0 +1,19 @@ +import tseslint from 'typescript-eslint'; +import globals from 'globals'; +import { base } from './base.js'; + +/** + * ESLint configuration for Node.js environments. + * Extends the base configuration with Node.js-specific globals. + */ +export const node = tseslint.config( + ...base, + { + languageOptions: { + globals: { + ...globals.node, + ...globals.es2022, + }, + }, + } +); \ No newline at end of file diff --git a/packages/eslint-config/src/configs/react.ts b/packages/eslint-config/src/configs/react.ts new file mode 100644 index 00000000..6d48d706 --- /dev/null +++ b/packages/eslint-config/src/configs/react.ts @@ -0,0 +1,54 @@ +import { base } from './base.js'; +import tseslint from 'typescript-eslint'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooksPlugin from 'eslint-plugin-react-hooks'; +import reactRefreshPlugin from 'eslint-plugin-react-refresh'; +import globals from 'globals'; + +/** + * ESLint configuration for React applications. + * Extends the base configuration with React-specific rules and browser globals. + */ +export const react = tseslint.config( + ...base, + { + files: ['**/*.{ts,tsx,js,jsx}'], + plugins: { + react: reactPlugin, + 'react-hooks': reactHooksPlugin, + 'react-refresh': reactRefreshPlugin, + }, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + globals: { + ...globals.browser, + ...globals.es2022, + }, + }, + rules: { + // React rules + 'react/jsx-uses-react': 'off', + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + + // React Hooks rules + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + + // React Refresh rules + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + settings: { + react: { + version: 'detect', + }, + }, + } +); \ No newline at end of file diff --git a/packages/eslint-config/src/index.ts b/packages/eslint-config/src/index.ts new file mode 100644 index 00000000..f88dcab1 --- /dev/null +++ b/packages/eslint-config/src/index.ts @@ -0,0 +1,14 @@ +import { base } from './configs/base.js'; +import { node } from './configs/node.js'; +import { react } from './configs/react.js'; + +export const eslintConfig = { + base, + node, + react, +}; + +// For backward compatibility +export { base } from './configs/base.js'; +export { node } from './configs/node.js'; +export { react } from './configs/react.js'; \ No newline at end of file diff --git a/packages/eslint-config/src/rules/index.ts b/packages/eslint-config/src/rules/index.ts new file mode 100644 index 00000000..d5cdfb56 --- /dev/null +++ b/packages/eslint-config/src/rules/index.ts @@ -0,0 +1,9 @@ +import { noDeprecated } from './no-deprecated.js'; +import { noDefaultExport } from './no-default-export.js'; +import { oneExportPerFile } from './one-export-per-file.js'; + +export const rules = { + 'no-deprecated': noDeprecated, + 'no-default-export': noDefaultExport, + 'one-export-per-file': oneExportPerFile, +}; \ No newline at end of file diff --git a/packages/eslint-config/src/rules/no-default-export.ts b/packages/eslint-config/src/rules/no-default-export.ts new file mode 100644 index 00000000..94b33dfd --- /dev/null +++ b/packages/eslint-config/src/rules/no-default-export.ts @@ -0,0 +1,112 @@ +import type { TSESTree } from '@typescript-eslint/utils'; +import { ESLintUtils } from '@typescript-eslint/utils'; + +type MessageIds = 'noDefaultExport'; + +const createRule = ESLintUtils.RuleCreator( + (name) => `https://github.com/claude-flow/eslint-config/blob/main/docs/rules/${name}.md` +); + +export const noDefaultExport = createRule<[], MessageIds>({ + name: 'no-default-export', + meta: { + type: 'suggestion', + docs: { + description: 'Disallow default exports to enforce consistent named exports', + }, + fixable: 'code', + schema: [], + messages: { + noDefaultExport: 'Default exports are not allowed. Use named exports instead.', + }, + }, + defaultOptions: [], + create(context) { + return { + // Handle: export default ... + ExportDefaultDeclaration(node: TSESTree.ExportDefaultDeclaration) { + context.report({ + node, + messageId: 'noDefaultExport', + fix(fixer) { + const sourceCode = context.sourceCode; + const declaration = node.declaration; + + // Handle different types of default exports + if (declaration.type === 'Identifier') { + // export default someVariable; + const text = sourceCode.getText(declaration); + return fixer.replaceText(node, `export { ${text} };`); + } else if ( + declaration.type === 'FunctionDeclaration' || + declaration.type === 'ClassDeclaration' + ) { + // export default function foo() {} or export default class Foo {} + if (declaration.id) { + const declText = sourceCode.getText(declaration); + const exportText = declText.replace(/^/, 'export '); + return fixer.replaceText(node, exportText); + } else { + // Anonymous function/class - can't auto-fix + return null; + } + } else if ( + declaration.type === 'ObjectExpression' || + declaration.type === 'ArrayExpression' || + declaration.type === 'Literal' || + declaration.type === 'CallExpression' || + declaration.type === 'NewExpression' || + declaration.type === 'MemberExpression' || + declaration.type === 'ArrowFunctionExpression' || + declaration.type === 'FunctionExpression' + ) { + // For expressions, we can't easily determine a good name + // So we don't provide an auto-fix + return null; + } else if (declaration.type === 'TSAsExpression') { + // Handle TypeScript as expressions: export default foo as Bar; + const expression = declaration.expression; + if (expression.type === 'Identifier') { + const text = sourceCode.getText(expression); + return fixer.replaceText(node, `export { ${text} };`); + } + return null; + } + + return null; + }, + }); + }, + + // Handle: export { default } from ... + ExportNamedDeclaration(node: TSESTree.ExportNamedDeclaration) { + if (node.specifiers) { + node.specifiers.forEach((specifier) => { + if ( + specifier.type === 'ExportSpecifier' && + ((specifier.exported.type === 'Identifier' && specifier.exported.name === 'default') || + (specifier.exported.type === 'Literal' && typeof specifier.exported.value === 'string' && specifier.exported.value === 'default')) + ) { + context.report({ + node: specifier, + messageId: 'noDefaultExport', + fix(fixer) { + // For re-exports like: export { something as default } + // Convert to: export { something } + if (specifier.local.type === 'Identifier' && specifier.local.name !== 'default') { + return fixer.replaceText( + specifier, + specifier.local.name + ); + } + // Can't auto-fix export { default } from './module' + return null; + }, + }); + } + }); + } + }, + }; + }, +}); \ No newline at end of file diff --git a/packages/eslint-config/src/rules/no-deprecated.ts b/packages/eslint-config/src/rules/no-deprecated.ts new file mode 100644 index 00000000..82a93d3b --- /dev/null +++ b/packages/eslint-config/src/rules/no-deprecated.ts @@ -0,0 +1,221 @@ +/** + * Copied from https://github.com/cartant/eslint-plugin-etc/blob/main/source/rules/no-deprecated.ts + * due to lack of updates for new dependency versions. + */ +import { type TSESLint, ESLintUtils } from '@typescript-eslint/utils'; +import ts from 'typescript'; +import { tsquery } from '@phenomnomnominal/tsquery'; +import * as tsutils from 'tsutils'; + +type MessageIds = 'forbidden'; + +const deprecatedNamesByProgram = new WeakMap>(); + +const rule: TSESLint.RuleModule = { + defaultOptions: [], + meta: { + docs: { + description: 'Forbids the use of deprecated APIs.', + }, + messages: { + forbidden: `"{{name}}" is deprecated: {{comment}}`, + }, + schema: [], + type: 'problem', + }, + create: (context) => { + const { esTreeNodeToTSNodeMap, program } = ESLintUtils.getParserServices(context); + const typeChecker = program.getTypeChecker(); + + let deprecatedNames = deprecatedNamesByProgram.get(program); + if (!deprecatedNames) { + deprecatedNames = findTaggedNames('deprecated', program); + deprecatedNamesByProgram.set(program, deprecatedNames); + } + + return { + Identifier: (node) => { + const parentType = node.parent?.type; + if ( + parentType === 'ExportSpecifier' || + parentType === 'ImportDefaultSpecifier' || + parentType === 'ImportNamespaceSpecifier' || + parentType === 'ImportSpecifier' + ) { + return; + } + const identifier = esTreeNodeToTSNodeMap.get(node) as ts.Identifier; + if (!deprecatedNames?.has(identifier.text) || isDeclaration(identifier)) { + return; + } + + const tags = getTags('deprecated', identifier, typeChecker) || []; + for (const tag of tags) { + context.report({ + data: { + comment: tag.trim().replace(/\s+/g, ' '), + name: identifier.text, + }, + messageId: 'forbidden', + node, + }); + } + }, + }; + }, +}; + +export const noDeprecated = rule; + +function isDeclaration(identifier: ts.Identifier): boolean { + const parent = identifier.parent; + switch (parent.kind) { + case ts.SyntaxKind.ClassDeclaration: + case ts.SyntaxKind.ClassExpression: + case ts.SyntaxKind.InterfaceDeclaration: + case ts.SyntaxKind.TypeParameter: + case ts.SyntaxKind.FunctionExpression: + case ts.SyntaxKind.FunctionDeclaration: + case ts.SyntaxKind.LabeledStatement: + case ts.SyntaxKind.JsxAttribute: + case ts.SyntaxKind.MethodDeclaration: + case ts.SyntaxKind.MethodSignature: + case ts.SyntaxKind.PropertySignature: + case ts.SyntaxKind.TypeAliasDeclaration: + case ts.SyntaxKind.GetAccessor: + case ts.SyntaxKind.SetAccessor: + case ts.SyntaxKind.EnumDeclaration: + case ts.SyntaxKind.ModuleDeclaration: + return true; + case ts.SyntaxKind.VariableDeclaration: + case ts.SyntaxKind.Parameter: + case ts.SyntaxKind.PropertyDeclaration: + case ts.SyntaxKind.EnumMember: + case ts.SyntaxKind.ImportEqualsDeclaration: + return (parent as ts.NamedDeclaration).name === identifier; + case ts.SyntaxKind.PropertyAssignment: + return ( + (parent as ts.PropertyAssignment).name === identifier && + !tsutils.isReassignmentTarget(identifier.parent.parent as ts.ObjectLiteralExpression) + ); + case ts.SyntaxKind.BindingElement: + // return true for `b` in `const {a: b} = obj"` + return ( + (parent as ts.BindingElement).name === identifier && + (parent as ts.BindingElement).propertyName !== undefined + ); + default: + return false; + } +} + +/** + * Get all identifiers with jsdoc tag `@tagName` in the program. + */ +function findTaggedNames(tagName: string, program: ts.Program): Set { + const taggedNames = new Set(); + for (const sourceFile of program.getSourceFiles()) { + if (!sourceFile.text.includes(`@${tagName}`)) { + continue; + } + const nodes = tsquery( + sourceFile, + `ClassDeclaration, Constructor, EnumDeclaration, EnumMember, FunctionDeclaration, GetAccessor, ` + + `InterfaceDeclaration, MethodDeclaration, MethodSignature, PropertyDeclaration, PropertySignature, ` + + `SetAccessor, TypeAliasDeclaration, VariableDeclaration`, + ); + for (const node of nodes) { + const tags = ts.getJSDocTags(node); + if (tags.some((tag) => tag.tagName.text === tagName)) { + const name = ts.isConstructorDeclaration(node) + ? node.parent.name + : (node as ts.Node & { name?: ts.Identifier }).name; + if (name?.text) { + taggedNames.add(name.text); + } + } + } + } + return taggedNames; +} + +/** + * Get the text of all tags of `node`'s type matching `tagName`. + */ +function getTags(tagName: string, node: ts.Identifier, tc: ts.TypeChecker): string[] { + const callExpression = getCallExpresion(node); + if (callExpression) { + const signature = tc.getResolvedSignature(callExpression); + const tags = signature && findTags(tagName, signature.getJsDocTags()); + if (tags?.length) { + return tags; + } + } + + let symbol: ts.Symbol | undefined; + const parent = node.parent; + if (parent.kind === ts.SyntaxKind.BindingElement) { + symbol = tc.getTypeAtLocation(parent.parent).getProperty(node.text); + } else if ( + (tsutils.isPropertyAssignment(parent) && parent.name === node) || + (tsutils.isShorthandPropertyAssignment(parent) && parent.name === node && tsutils.isReassignmentTarget(node)) + ) { + symbol = tc.getPropertySymbolOfDestructuringAssignment(node); + } else { + symbol = tc.getSymbolAtLocation(node); + } + + if (symbol && tsutils.isSymbolFlagSet(symbol, ts.SymbolFlags.Alias)) { + symbol = tc.getAliasedSymbol(symbol); + } + if ( + !symbol || + // if this is a CallExpression and the declaration is a function or method, + // stop here to avoid collecting JsDoc of all overload signatures + (callExpression && isFunctionOrMethod(symbol.declarations)) + ) { + return []; + } + return findTags(tagName, symbol.getJsDocTags()); +} + +/** + * Get the text of all `tags` matching `tagName`. + */ +function findTags(tagName: string, tags: ts.JSDocTagInfo[]): string[] { + const result: string[] = []; + for (const tag of tags) { + if (tag.name === tagName) { + const { text = '' } = tag; + if (typeof text === 'string') { + result.push(text); + } else { + result.push(text.reduce((text, part) => text + (part?.text || ''), '')); + } + } + } + return result; +} + +function getCallExpresion(node: ts.Expression): ts.CallLikeExpression | undefined { + let parent = node.parent; + if (tsutils.isPropertyAccessExpression(parent) && parent.name === node) { + parent = parent.parent; + } + return tsutils.isCallLikeExpression(parent) ? parent : undefined; +} + +function isFunctionOrMethod(declarations: ts.Declaration[] | undefined): boolean { + if (!declarations || declarations.length === 0) { + return false; + } + switch (declarations[0]!.kind) { + case ts.SyntaxKind.MethodDeclaration: + case ts.SyntaxKind.FunctionDeclaration: + case ts.SyntaxKind.FunctionExpression: + case ts.SyntaxKind.MethodSignature: + return true; + default: + return false; + } +} \ No newline at end of file diff --git a/packages/eslint-config/src/rules/one-export-per-file.ts b/packages/eslint-config/src/rules/one-export-per-file.ts new file mode 100644 index 00000000..973de5d0 --- /dev/null +++ b/packages/eslint-config/src/rules/one-export-per-file.ts @@ -0,0 +1,168 @@ +import type { TSESTree } from '@typescript-eslint/utils'; +import { ESLintUtils } from '@typescript-eslint/utils'; +import path from 'path'; + +type MessageIds = 'multipleExports' | 'nameMismatch' | 'noExports'; + +const createRule = ESLintUtils.RuleCreator( + (name) => `https://github.com/claude-flow/eslint-config/blob/main/docs/rules/${name}.md` +); + +/** + * Normalizes a name to match file naming conventions + * e.g., "FooBar" -> "foo-bar", "fooBar" -> "foo-bar", "foo_bar" -> "foo-bar" + */ +function normalizeName(name: string): string { + return name + // Handle camelCase and PascalCase + .replace(/([a-z])([A-Z])/g, '$1-$2') + .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') + // Handle snake_case + .replace(/_/g, '-') + // Convert to lowercase + .toLowerCase(); +} + +/** + * Gets the export name from various export node types + */ +function getExportName(node: TSESTree.Node): string | null { + switch (node.type) { + case 'FunctionDeclaration': + case 'ClassDeclaration': + case 'TSInterfaceDeclaration': + case 'TSTypeAliasDeclaration': + return node.id?.name || null; + + case 'VariableDeclaration': + // Handle: export const foo = ... + if (node.declarations.length === 1 && node.declarations[0].id.type === 'Identifier') { + return node.declarations[0].id.name; + } + break; + + case 'ExportSpecifier': + // Handle: export { foo } + return node.exported.type === 'Identifier' ? node.exported.name : null; + + case 'ExportDefaultDeclaration': + // We handle default exports differently + return null; + } + + return null; +} + +export const oneExportPerFile = createRule<[], MessageIds>({ + name: 'one-export-per-file', + meta: { + type: 'suggestion', + docs: { + description: 'Enforce one non-type export per file with filename matching the export name', + }, + schema: [], + messages: { + multipleExports: 'Files should have exactly one non-type export. Found {{count}} exports: {{exports}}', + nameMismatch: 'Export name "{{exportName}}" does not match filename "{{fileName}}". Expected "{{expectedName}}"', + noExports: 'File must have exactly one non-type export', + }, + }, + defaultOptions: [], + create(context) { + const nonTypeExports: Array<{ name: string; node: TSESTree.Node }> = []; + const filename = context.filename; + const basename = path.basename(filename, path.extname(filename)); + + // Skip index files and test files + if (basename === 'index' || basename.includes('.test') || basename.includes('.spec')) { + return {}; + } + + return { + // Handle: export function/class/const/let/var + ExportNamedDeclaration(node: TSESTree.ExportNamedDeclaration) { + // Skip type exports + if (node.exportKind === 'type') return; + + if (node.declaration) { + const name = getExportName(node.declaration); + if (name) { + nonTypeExports.push({ name, node }); + } + } else if (node.specifiers) { + // Handle: export { foo, bar } + node.specifiers.forEach((specifier) => { + if (specifier.type === 'ExportSpecifier' && specifier.exportKind !== 'type') { + const name = getExportName(specifier); + if (name) { + nonTypeExports.push({ name, node: specifier }); + } + } + }); + } + }, + + // Handle: export default + ExportDefaultDeclaration(node: TSESTree.ExportDefaultDeclaration) { + // Default exports are handled by no-default-export rule + // But we still count them as exports for the multiple export check + nonTypeExports.push({ name: 'default', node }); + }, + + // Handle: export * from + ExportAllDeclaration(node: TSESTree.ExportAllDeclaration) { + // Skip type exports + if (node.exportKind !== 'type') { + nonTypeExports.push({ name: '*', node }); + } + }, + + 'Program:exit'() { + // Check for no exports + if (nonTypeExports.length === 0) { + context.report({ + node: context.sourceCode.ast, + messageId: 'noExports', + }); + return; + } + + // Check for multiple exports + if (nonTypeExports.length > 1) { + const exportNames = nonTypeExports.map(e => e.name).join(', '); + const secondExport = nonTypeExports[1]; + if (secondExport) { + context.report({ + node: secondExport.node, + messageId: 'multipleExports', + data: { + count: nonTypeExports.length, + exports: exportNames, + }, + }); + } + return; + } + + // Check filename matches export name + const exportedItem = nonTypeExports[0]; + if (exportedItem && exportedItem.name !== 'default' && exportedItem.name !== '*') { + const normalizedExportName = normalizeName(exportedItem.name); + const normalizedFileName = normalizeName(basename); + + if (normalizedExportName !== normalizedFileName) { + context.report({ + node: exportedItem.node, + messageId: 'nameMismatch', + data: { + exportName: exportedItem.name, + fileName: basename, + expectedName: exportedItem.name, + }, + }); + } + } + }, + }; + }, +}); \ No newline at end of file diff --git a/packages/eslint-config/tsconfig.json b/packages/eslint-config/tsconfig.json new file mode 100644 index 00000000..37597f17 --- /dev/null +++ b/packages/eslint-config/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@claude-flow/tsconfig/base.json", + "compilerOptions": { + "outDir": "./lib", + "rootDir": "./src", + "module": "ESNext", + "target": "ES2022", + "moduleResolution": "bundler" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib"] +} \ No newline at end of file diff --git a/packages/repo-scripts-test/eslint.config.js b/packages/repo-scripts-test/eslint.config.js new file mode 100644 index 00000000..c5d7f09f --- /dev/null +++ b/packages/repo-scripts-test/eslint.config.js @@ -0,0 +1,3 @@ +import { node } from '@claude-flow/eslint-config'; + +export default node; \ No newline at end of file diff --git a/packages/repo-scripts-test/jest.config.js b/packages/repo-scripts-test/jest.config.js new file mode 100644 index 00000000..b2607dc3 --- /dev/null +++ b/packages/repo-scripts-test/jest.config.js @@ -0,0 +1,14 @@ +/** @type {import('jest').Config} */ +export default { + testEnvironment: 'node', + testMatch: ['/lib/**/*.test.js'], + testPathIgnorePatterns: ['/node_modules/', '\\.node\\.test\\.js$'], + moduleFileExtensions: ['js', 'json', 'node'], + verbose: true, + collectCoverageFrom: [ + 'lib/**/*.js', + '!lib/**/*.test.js', + '!lib/**/*.d.ts', + '!lib/**/*.map' + ], +}; \ No newline at end of file diff --git a/packages/repo-scripts-test/package.json b/packages/repo-scripts-test/package.json new file mode 100644 index 00000000..2bad59ee --- /dev/null +++ b/packages/repo-scripts-test/package.json @@ -0,0 +1,24 @@ +{ + "name": "@claude-flow/repo-scripts-test", + "version": "1.0.0", + "private": true, + "type": "module", + "description": "Test package for repo-scripts behaviors", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "scripts": { + "build": "repo-scripts build", + "test": "repo-scripts test", + "lint": "repo-scripts lint", + "lint:fix": "repo-scripts lint-fix", + "clean": "repo-scripts clean" + }, + "devDependencies": { + "@claude-flow/eslint-config": "workspace:*", + "@claude-flow/repo-scripts": "workspace:*", + "@claude-flow/tsconfig": "workspace:*", + "@types/jest": "^30.0.0", + "@types/node": "^20.0.0", + "jest": "^30.0.4" + } +} \ No newline at end of file diff --git a/packages/repo-scripts-test/src/index.test.ts b/packages/repo-scripts-test/src/index.test.ts new file mode 100644 index 00000000..9e3a42b9 --- /dev/null +++ b/packages/repo-scripts-test/src/index.test.ts @@ -0,0 +1,61 @@ +import { add, subtract, SimpleCalculator } from './index'; + +describe('Calculator Functions', () => { + describe('add', () => { + test('should add two positive numbers', () => { + expect(add(2, 3)).toBe(5); + }); + + test('should add negative numbers', () => { + expect(add(-5, -3)).toBe(-8); + }); + + test('should add zero correctly', () => { + expect(add(10, 0)).toBe(10); + expect(add(0, 0)).toBe(0); + }); + + test('should handle decimal numbers', () => { + expect(add(0.1, 0.2)).toBeCloseTo(0.3); + }); + }); + + describe('subtract', () => { + test('should subtract two positive numbers', () => { + expect(subtract(5, 3)).toBe(2); + }); + + test('should subtract negative numbers', () => { + expect(subtract(-5, -3)).toBe(-2); + }); + + test('should subtract zero correctly', () => { + expect(subtract(10, 0)).toBe(10); + expect(subtract(0, 5)).toBe(-5); + }); + }); +}); + +describe('SimpleCalculator Class', () => { + let calculator: SimpleCalculator; + + beforeEach(() => { + calculator = new SimpleCalculator(); + }); + + test('should create an instance', () => { + expect(calculator).toBeInstanceOf(SimpleCalculator); + }); + + test('should add numbers using the add method', () => { + expect(calculator.add(10, 5)).toBe(15); + }); + + test('should subtract numbers using the subtract method', () => { + expect(calculator.subtract(10, 5)).toBe(5); + }); + + test('should handle negative results', () => { + expect(calculator.subtract(5, 10)).toBe(-5); + }); +}); \ No newline at end of file diff --git a/packages/repo-scripts-test/src/index.ts b/packages/repo-scripts-test/src/index.ts new file mode 100644 index 00000000..d457a4d0 --- /dev/null +++ b/packages/repo-scripts-test/src/index.ts @@ -0,0 +1,23 @@ +// Valid TypeScript code for testing successful build +export function add(a: number, b: number): number { + return a + b; +} + +export function subtract(a: number, b: number): number { + return a - b; +} + +export interface Calculator { + add(a: number, b: number): number; + subtract(a: number, b: number): number; +} + +export class SimpleCalculator implements Calculator { + add(a: number, b: number): number { + return add(a, b); + } + + subtract(a: number, b: number): number { + return subtract(a, b); + } +} \ No newline at end of file diff --git a/packages/repo-scripts-test/tsconfig.json b/packages/repo-scripts-test/tsconfig.json new file mode 100644 index 00000000..37597f17 --- /dev/null +++ b/packages/repo-scripts-test/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@claude-flow/tsconfig/base.json", + "compilerOptions": { + "outDir": "./lib", + "rootDir": "./src", + "module": "ESNext", + "target": "ES2022", + "moduleResolution": "bundler" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib"] +} \ No newline at end of file diff --git a/packages/tsconfig/base.json b/packages/tsconfig/base.json new file mode 100644 index 00000000..883dfb4d --- /dev/null +++ b/packages/tsconfig/base.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "lib": ["ES2022"], + "moduleResolution": "bundler", + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "outDir": "./lib", + "rootDir": "./src", + "composite": true, + "incremental": true, + "tsBuildInfoFile": "./lib/.tsbuildinfo", + + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "isolatedModules": true + } +} \ No newline at end of file diff --git a/packages/tsconfig/node.json b/packages/tsconfig/node.json new file mode 100644 index 00000000..72b969bc --- /dev/null +++ b/packages/tsconfig/node.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "compilerOptions": { + "lib": ["ES2022"], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "types": ["node"] + } +} \ No newline at end of file diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json new file mode 100644 index 00000000..72adab98 --- /dev/null +++ b/packages/tsconfig/package.json @@ -0,0 +1,12 @@ +{ + "name": "@claude-flow/tsconfig", + "version": "1.0.0", + "private": true, + "description": "Shared TypeScript configurations for Claude Flow", + "files": [ + "base.json", + "react.json", + "node.json" + ], + "scripts": {} +} \ No newline at end of file diff --git a/packages/tsconfig/react.json b/packages/tsconfig/react.json new file mode 100644 index 00000000..08e8d066 --- /dev/null +++ b/packages/tsconfig/react.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "compilerOptions": { + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "jsx": "react-jsx", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "noEmit": true + } +} \ No newline at end of file diff --git a/page-content-debug.html b/page-content-debug.html deleted file mode 100644 index 3a17864b..00000000 --- a/page-content-debug.html +++ /dev/null @@ -1,7704 +0,0 @@ - - - - - - - - - Claude Flow - - -

/tmp/e2e-test-workspace-1751952040659
Claude Code Sessionhello-world-1
C
Hey Developer! Good evening - ready to make some progress on hello-world-1? What would you like to work on tonight?
ID: a936c042-00be-4f0e-bba3-adf7f76ee9ef
Streaming: false
Greeting: true
Content type: string
10:20:43 PM
💬Default mode
Shift+Tab to change mode
Context:
0%
- - - - \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..1bc7f489 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,11339 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@types/resolve': + specifier: ^1.20.6 + version: 1.20.6 + lage: + specifier: ^2.7.9 + version: 2.14.6 + resolve: + specifier: ^1.22.10 + version: 1.22.10 + tinyglobby: + specifier: ^0.2.14 + version: 0.2.14 + workspace-tools: + specifier: ^0.38.4 + version: 0.38.4 + + apps/v1/client: + dependencies: + '@mdxeditor/editor': + specifier: ^3.39.0 + version: 3.39.1(@codemirror/language@6.11.2)(@lezer/highlight@1.2.1)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.27) + '@tailwindcss/typography': + specifier: ^0.5.16 + version: 0.5.16(tailwindcss@3.4.17) + '@tanstack/react-virtual': + specifier: ^3.13.12 + version: 3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/marked': + specifier: ^6.0.0 + version: 6.0.0 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + diff: + specifier: ^8.0.2 + version: 8.0.2 + dom-to-image: + specifier: ^2.6.0 + version: 2.6.0 + eventsource: + specifier: ^4.0.0 + version: 4.0.0 + marked: + specifier: ^16.0.0 + version: 16.0.0 + react: + specifier: ^19.1.0 + version: 19.1.0 + react-dom: + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) + react-router-dom: + specifier: ^7.6.3 + version: 7.6.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + uuid: + specifier: ^11.1.0 + version: 11.1.0 + devDependencies: + '@eslint/js': + specifier: ^9.29.0 + version: 9.31.0 + '@playwright/test': + specifier: ^1.53.2 + version: 1.54.1 + '@tailwindcss/forms': + specifier: ^0.5.7 + version: 0.5.10(tailwindcss@3.4.17) + '@tailwindcss/postcss': + specifier: ^4.1.11 + version: 4.1.11 + '@types/diff': + specifier: ^7.0.2 + version: 7.0.2 + '@types/dom-to-image': + specifier: ^2.6.7 + version: 2.6.7 + '@types/node': + specifier: ^24.0.10 + version: 24.0.13 + '@types/react': + specifier: ^19.1.8 + version: 19.1.8 + '@types/react-dom': + specifier: ^19.1.6 + version: 19.1.6(@types/react@19.1.8) + '@types/uuid': + specifier: ^10.0.0 + version: 10.0.0 + '@vitejs/plugin-react': + specifier: ^4.5.2 + version: 4.6.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + autoprefixer: + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.6) + eslint: + specifier: ^9.29.0 + version: 9.31.0(jiti@2.4.2) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.20 + version: 0.4.20(eslint@9.31.0(jiti@2.4.2)) + globals: + specifier: ^16.2.0 + version: 16.3.0 + postcss: + specifier: ^8.5.6 + version: 8.5.6 + tailwindcss: + specifier: ^3.4.0 + version: 3.4.17 + typescript: + specifier: ~5.8.3 + version: 5.8.3 + typescript-eslint: + specifier: ^8.34.1 + version: 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + vite: + specifier: ^7.0.0 + version: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + + apps/v1/server: + dependencies: + '@anthropic-ai/claude-code': + specifier: ^1.0.41 + version: 1.0.51 + '@instantlyeasy/claude-code-sdk-ts': + specifier: ^0.3.3 + version: 0.3.3 + cors: + specifier: ^2.8.5 + version: 2.8.5 + dotenv: + specifier: ^17.0.1 + version: 17.2.0 + express: + specifier: ^5.1.0 + version: 5.1.0 + + packages/eslint-config: + dependencies: + '@eslint/js': + specifier: ^9.29.0 + version: 9.31.0 + '@phenomnomnominal/tsquery': + specifier: ^6.1.3 + version: 6.1.3(typescript@5.8.3) + '@typescript-eslint/utils': + specifier: ^8.34.1 + version: 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + eslint: + specifier: ^9.0.0 + version: 9.31.0(jiti@2.4.2) + eslint-plugin-react: + specifier: ^7.34.0 + version: 7.37.5(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.20 + version: 0.4.20(eslint@9.31.0(jiti@2.4.2)) + globals: + specifier: ^16.2.0 + version: 16.3.0 + tsutils: + specifier: ^3.21.0 + version: 3.21.0(typescript@5.8.3) + typescript: + specifier: ^5.0.0 + version: 5.8.3 + typescript-eslint: + specifier: ^8.34.1 + version: 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + devDependencies: + '@claude-flow/repo-scripts': + specifier: workspace:* + version: link:../../tools/repo-scripts + '@claude-flow/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 + '@types/node': + specifier: ^20.0.0 + version: 20.19.7 + '@typescript-eslint/rule-tester': + specifier: ^8.34.1 + version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + jest: + specifier: ^30.0.4 + version: 30.0.4(@types/node@20.19.7) + ts-jest: + specifier: ^29.4.0 + version: 29.4.0(@babel/core@7.28.0)(@jest/transform@30.0.4)(@jest/types@30.0.1)(babel-jest@30.0.4(@babel/core@7.28.0))(jest-util@30.0.2)(jest@30.0.4(@types/node@20.19.7))(typescript@5.8.3) + + packages/repo-scripts-test: + devDependencies: + '@claude-flow/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@claude-flow/repo-scripts': + specifier: workspace:* + version: link:../../tools/repo-scripts + '@claude-flow/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 + '@types/node': + specifier: ^20.0.0 + version: 20.19.7 + jest: + specifier: ^30.0.4 + version: 30.0.4(@types/node@20.19.7) + + packages/tsconfig: {} + + scripts: + dependencies: + '@claude-flow/repo-scripts': + specifier: workspace:* + version: link:../tools/repo-scripts + '@vitejs/plugin-react': + specifier: ^4.0.0 + version: 4.6.0(vite@5.4.19(@types/node@24.0.13)(lightningcss@1.30.1)) + chalk: + specifier: ^5.3.0 + version: 5.4.1 + commander: + specifier: ^11.1.0 + version: 11.1.0 + concurrently: + specifier: ^8.2.0 + version: 8.2.2 + esbuild: + specifier: ^0.19.0 + version: 0.19.12 + eslint: + specifier: ^9.29.0 + version: 9.31.0(jiti@2.4.2) + execa: + specifier: ^8.0.1 + version: 8.0.1 + glob: + specifier: ^10.0.0 + version: 10.4.5 + lage: + specifier: ^2.14.6 + version: 2.14.6 + rimraf: + specifier: ^5.0.0 + version: 5.0.10 + typescript: + specifier: ^5.3.0 + version: 5.8.3 + vite: + specifier: ^5.0.0 + version: 5.4.19(@types/node@24.0.13)(lightningcss@1.30.1) + devDependencies: + '@claude-flow/eslint-config': + specifier: workspace:* + version: link:../packages/eslint-config + + tools/repo-scripts: + dependencies: + chalk: + specifier: ^5.3.0 + version: 5.4.1 + commander: + specifier: ^12.0.0 + version: 12.1.0 + concurrently: + specifier: ^8.2.0 + version: 8.2.2 + execa: + specifier: ^8.0.0 + version: 8.0.1 + fs-extra: + specifier: ^11.2.0 + version: 11.3.0 + glob: + specifier: ^10.3.0 + version: 10.4.5 + inquirer: + specifier: ^9.2.0 + version: 9.3.7 + devDependencies: + '@claude-flow/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@eslint/js': + specifier: ^9.29.0 + version: 9.31.0 + '@types/fs-extra': + specifier: ^11.0.0 + version: 11.0.4 + '@types/inquirer': + specifier: ^9.0.0 + version: 9.0.8 + '@types/node': + specifier: ^20.0.0 + version: 20.19.7 + eslint: + specifier: ^9.0.0 + version: 9.31.0(jiti@2.4.2) + globals: + specifier: ^16.2.0 + version: 16.3.0 + typescript: + specifier: ^5.3.0 + version: 5.8.3 + typescript-eslint: + specifier: ^8.34.1 + version: 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + +packages: + + '@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'} + + '@anthropic-ai/claude-code@1.0.51': + resolution: {integrity: sha512-annBc4ez7nDPbp+di6bjIQGiAdmdVln4k3gAYioym2MxOEl3py5s7SsoR+dNSmfgfIHUdKBTbtXnXD5rkmO5aA==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.1': + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@codemirror/autocomplete@6.18.6': + resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} + + '@codemirror/commands@6.8.1': + resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} + + '@codemirror/lang-angular@0.1.4': + resolution: {integrity: sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==} + + '@codemirror/lang-cpp@6.0.3': + resolution: {integrity: sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==} + + '@codemirror/lang-css@6.3.1': + resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + + '@codemirror/lang-go@6.0.1': + resolution: {integrity: sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==} + + '@codemirror/lang-html@6.4.9': + resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} + + '@codemirror/lang-java@6.0.2': + resolution: {integrity: sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==} + + '@codemirror/lang-javascript@6.2.4': + resolution: {integrity: sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==} + + '@codemirror/lang-json@6.0.2': + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + + '@codemirror/lang-less@6.0.2': + resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} + + '@codemirror/lang-liquid@6.2.3': + resolution: {integrity: sha512-yeN+nMSrf/lNii3FJxVVEGQwFG0/2eDyH6gNOj+TGCa0hlNO4bhQnoO5ISnd7JOG+7zTEcI/GOoyraisFVY7jQ==} + + '@codemirror/lang-markdown@6.3.3': + resolution: {integrity: sha512-1fn1hQAPWlSSMCvnF810AkhWpNLkJpl66CRfIy3vVl20Sl4NwChkorCHqpMtNbXr1EuMJsrDnhEpjZxKZ2UX3A==} + + '@codemirror/lang-php@6.0.2': + resolution: {integrity: sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==} + + '@codemirror/lang-python@6.2.1': + resolution: {integrity: sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==} + + '@codemirror/lang-rust@6.0.2': + resolution: {integrity: sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==} + + '@codemirror/lang-sass@6.0.2': + resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==} + + '@codemirror/lang-sql@6.9.0': + resolution: {integrity: sha512-xmtpWqKSgum1B1J3Ro6rf7nuPqf2+kJQg5SjrofCAcyCThOe0ihSktSoXfXuhQBnwx1QbmreBbLJM5Jru6zitg==} + + '@codemirror/lang-vue@0.1.3': + resolution: {integrity: sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==} + + '@codemirror/lang-wast@6.0.2': + resolution: {integrity: sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==} + + '@codemirror/lang-xml@6.1.0': + resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} + + '@codemirror/lang-yaml@6.1.2': + resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} + + '@codemirror/language-data@6.5.1': + resolution: {integrity: sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w==} + + '@codemirror/language@6.11.2': + resolution: {integrity: sha512-p44TsNArL4IVXDTbapUmEkAlvWs2CFQbcfc0ymDsis1kH2wh0gcY96AS29c/vp2d0y2Tquk1EDSaawpzilUiAw==} + + '@codemirror/legacy-modes@6.5.1': + resolution: {integrity: sha512-DJYQQ00N1/KdESpZV7jg9hafof/iBNp9h7TYo1SLMk86TWl9uDsVdho2dzd81K+v4retmK6mdC7WpuOQDytQqw==} + + '@codemirror/lint@6.8.5': + resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} + + '@codemirror/merge@6.10.2': + resolution: {integrity: sha512-rmHzVkt5FnCtsi0IgvDIDjh/J4LmbfOboB7FMvVl21IHO0p1QM6jSwjkBjBD3D+c+T79OabEqoduCqvJCBV8Yg==} + + '@codemirror/search@6.5.11': + resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} + + '@codemirror/state@6.5.2': + resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} + + '@codemirror/view@6.38.0': + resolution: {integrity: sha512-yvSchUwHOdupXkd7xJ0ob36jdsSR/I+/C+VbY0ffBiL5NiSTEBDfB1ZGWbbIlDd5xgdUkody+lukAdOxYrOBeg==} + + '@codesandbox/nodebox@0.1.8': + resolution: {integrity: sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==} + + '@codesandbox/sandpack-client@2.19.8': + resolution: {integrity: sha512-CMV4nr1zgKzVpx4I3FYvGRM5YT0VaQhALMW9vy4wZRhEyWAtJITQIqZzrTGWqB1JvV7V72dVEUCUPLfYz5hgJQ==} + + '@codesandbox/sandpack-react@2.20.0': + resolution: {integrity: sha512-takd1YpW/PMQ6KPQfvseWLHWklJovGY8QYj8MtWnskGKbjOGJ6uZfyZbcJ6aCFLQMpNyjTqz9AKNbvhCOZ1TUQ==} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: ^16.8.0 || ^17 || ^18 || ^19 + + '@emnapi/core@1.4.4': + resolution: {integrity: sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==} + + '@emnapi/runtime@1.4.4': + resolution: {integrity: sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==} + + '@emnapi/wasi-threads@1.0.3': + resolution: {integrity: sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.6': + resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.6': + resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.6': + resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.6': + resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.6': + resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.6': + resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.6': + resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.6': + resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.6': + resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.6': + resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.6': + resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.6': + resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.6': + resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.6': + resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.6': + resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.6': + resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.6': + resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.6': + resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.6': + resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.6': + resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.6': + resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.6': + resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.6': + resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.6': + resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.6': + resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.6': + resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + 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.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.31.0': + resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} + 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.3.3': + resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} + + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + + '@floating-ui/react-dom@2.1.4': + resolution: {integrity: sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.27.13': + resolution: {integrity: sha512-Qmj6t9TjgWAvbygNEu1hj4dbHI9CY0ziCMIJrmYoDIn9TUAH5lRmiIeZmRd4c6QEZkzdoH7jNnoNyoY1AIESiA==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@inquirer/figures@1.0.12': + resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} + engines: {node: '>=18'} + + '@instantlyeasy/claude-code-sdk-ts@0.3.3': + resolution: {integrity: sha512-Ss0Nu4GYvdXAqdzAlui1daRTRmwQFlCq7RQisZ83L3ttGVK4iF81saa8LS7SxiBvtLznXkkGWbSEVsrssufcBg==} + engines: {node: '>=18.0.0'} + + '@isaacs/cliui@8.0.2': + 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'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@30.0.4': + resolution: {integrity: sha512-tMLCDvBJBwPqMm4OAiuKm2uF5y5Qe26KgcMn+nrDSWpEW+eeFmqA0iO4zJfL16GP7gE3bUUQ3hIuUJ22AqVRnw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.0.4': + resolution: {integrity: sha512-MWScSO9GuU5/HoWjpXAOBs6F/iobvK1XlioelgOM9St7S0Z5WTI9kjCQLPeo4eQRRYusyLW25/J7J5lbFkrYXw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@30.0.4': + resolution: {integrity: sha512-5NT+sr7ZOb8wW7C4r7wOKnRQ8zmRWQT2gW4j73IXAKp5/PX1Z8MCStBLQDYfIG3n1Sw0NRfYGdp0iIPVooBAFQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.0.4': + resolution: {integrity: sha512-EgXecHDNfANeqOkcak0DxsoVI4qkDUsR7n/Lr2vtmTBjwLPBnnPOF71S11Q8IObWzxm2QgQoY6f9hzrRD3gHRA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.0.4': + resolution: {integrity: sha512-Z/DL7t67LBHSX4UzDyeYKqOxE/n7lbrrgEwWM3dGiH5Dgn35nk+YtgzKudmfIrBI8DRRrKYY5BCo3317HZV1Fw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@30.0.4': + resolution: {integrity: sha512-qZ7nxOcL5+gwBO6LErvwVy5k06VsX/deqo2XnVUSTV0TNC9lrg8FC3dARbi+5lmrr5VyX5drragK+xLcOjvjYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.0.1': + resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.0.4': + resolution: {integrity: sha512-avyZuxEHF2EUhFF6NEWVdxkRRV6iXXcIES66DLhuLlU7lXhtFG/ySq/a8SRZmEJSsLkNAFX6z6mm8KWyXe9OEA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.0.4': + resolution: {integrity: sha512-6ycNmP0JSJEEys1FbIzHtjl9BP0tOZ/KN6iMeAKrdvGmUsa1qfRdlQRUDKJ4P84hJ3xHw1yTqJt4fvPNHhyE+g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@30.0.1': + resolution: {integrity: sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.0.4': + resolution: {integrity: sha512-BEpX8M/Y5lG7MI3fmiO+xCnacOrVsnbqVrcDZIT8aSGkKV1w2WwvRQxSWw5SIS8ozg7+h8tSj5EO1Riqqxcdag==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.0.4': + resolution: {integrity: sha512-Mfpv8kjyKTHqsuu9YugB6z1gcdB3TSSOaKlehtVaiNlClMkEHY+5ZqCY2CrEE3ntpBMlstX/ShDAf84HKWsyIw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.0.4': + resolution: {integrity: sha512-bj6ePmqi4uxAE8EHE0Slmk5uBYd9Vd/PcVt06CsBxzH4bbA8nGsI1YbXl/NH+eii4XRtyrRx+Cikub0x8H4vDg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@30.0.4': + resolution: {integrity: sha512-atvy4hRph/UxdCIBp+UB2jhEA/jJiUeGZ7QPgBi9jUUKNgi3WEoMXGNG7zbbELG2+88PMabUNCDchmqgJy3ELg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@30.0.1': + resolution: {integrity: sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@lexical/clipboard@0.32.1': + resolution: {integrity: sha512-oO7CuMVh3EFEqtE6+7Ccf7jMD5RNUmSdTnFm/X4kYNGqs9lgGt8j5PgSk7oP9OuAjxKNdBTbltSlh54CX3AUIg==} + + '@lexical/code@0.32.1': + resolution: {integrity: sha512-2rXj8s/CG32XKQ2EpORpACfpzyAxB+/SrQW2cjwczarLs5Fxnx6u6HwahZnxaF0z5UHIPUy90qDiOiRExc74Yg==} + + '@lexical/devtools-core@0.32.1': + resolution: {integrity: sha512-3WnZQo6Qig7ccjDu2b8s1Kb5CCXowxnK0i8CCRG9mHAw7i6XpZUYAbk4rmcK/qbhLHrc7LwUrAMFzGtfLEH3XA==} + peerDependencies: + react: '>=17.x' + react-dom: '>=17.x' + + '@lexical/dragon@0.32.1': + resolution: {integrity: sha512-Dlx8P2b/O7gZLmXnoanmDkFL5RgA8Vvix4ZuSvT0apblqySzgi8l3NHHwwqXy1g2nfSupvpr7Dsf10Lu3l0Hlw==} + + '@lexical/hashtag@0.32.1': + resolution: {integrity: sha512-S63bb7uIB4hO2V0UmzUiKlwAGegQlyFKqrOw9NJwOb8O96gHRxr27FUsEb8ToWLM8TSm2aw1WsZXs7CJQqGtCg==} + + '@lexical/history@0.32.1': + resolution: {integrity: sha512-IRsKllumYEWxmzR2evN30MFY+JBM723lSyzm2PAQcgHCeBxi8t0Vc3EdyJRay+YdN65JgrohQi1WbktbK923uQ==} + + '@lexical/html@0.32.1': + resolution: {integrity: sha512-uctCdC9gVzx/Sw9CimT4C2IDfSbfEGYunyIrJBpsfcdqp0rroGNizjIoZNBH3xcgkk9UDboSADo+wimbzEoy8A==} + + '@lexical/link@0.32.1': + resolution: {integrity: sha512-atdwNpWjZ0U2/kgS0ATTkZ8lJLHiv3TsJgqJL33BuV9Gn7advJokd4faM79Y8XxkhiPi1lVTBSHgI8V4hs+c+Q==} + + '@lexical/list@0.32.1': + resolution: {integrity: sha512-3zShCfEdAvodR6mQ5CNN1gcEwfV341LXJzWCIkZzG1cPwaiBHUlT7TynQtKTPn1sATCEMmxoDG0/T+itsRNZgA==} + + '@lexical/mark@0.32.1': + resolution: {integrity: sha512-AXF2wmUvvSI45y+sgZKnU0pnUdttd9v75DDQgdplqtCkyDqHVGxVCNCrLE+PJtzIrwJxtA2UyC8yFZMBM92HpA==} + + '@lexical/markdown@0.32.1': + resolution: {integrity: sha512-AmUTRRx6Je0AOiQqp48Xn92/71AzhFgi4nO1EtPW5eae1CihrtiEh5UQr48mV6EyjvH9D3OlOLU8XrzS+J9a+w==} + + '@lexical/offset@0.32.1': + resolution: {integrity: sha512-zfHqoLlQ0lq1akFHy81xnDaRRE5KkqFa7OovOxKPBpALQCiJIAb2ykqj/Woc2oUeYaEcnkaFU9+kEWMK9yY0fQ==} + + '@lexical/overflow@0.32.1': + resolution: {integrity: sha512-wjcFGjzkbugds2Q5Wag59WrcxJwMUACEXms1FtFdu1/YcBPqNAKJSyfo8Z/5LGfstQEb2nPtSuEQZUb7v+XYyA==} + + '@lexical/plain-text@0.32.1': + resolution: {integrity: sha512-uFS3xoETB3phnYHZXfMKvl8gh6YRW7rpokuJmQVMHNNBklORmMpN00rRQ/zsc/jt/nPzaPpE5cLwSHXeJdqJUg==} + + '@lexical/react@0.32.1': + resolution: {integrity: sha512-PCiAiwGIGfkYb2o9Kx+gGGqXwxqb7/W4cGSnw1nzmNtCerJ3S64WZs87Lgcow0RlDSwqzpH534+eCyIddueSqw==} + peerDependencies: + react: '>=17.x' + react-dom: '>=17.x' + + '@lexical/rich-text@0.32.1': + resolution: {integrity: sha512-SnmpZ7boTLxeYfNezNLvchDiJOAALA2nD0Uq/SpkIOJ6R01R7m1aPdLv55LGKoBT9UxCRdo0HWXytwiVZI+ehQ==} + + '@lexical/selection@0.32.1': + resolution: {integrity: sha512-X1aXJdq/5EOuSuMOqK3t+rEVmpqLf+vc2Kl5YuP8+gGWUbXuxR6iryrQuy1mAViZpF/5qw4HO/Sb+9JjubaZEg==} + + '@lexical/table@0.32.1': + resolution: {integrity: sha512-sGk2jUbQHj5hatpxRyl6IE2oWsjRnYhmaP94THzn95/uK69o8eSizcnd148WzYsX8Zz+L9PTLS1xjvCbfLTP+A==} + + '@lexical/text@0.32.1': + resolution: {integrity: sha512-0Ek8F3KC4d16b2YaTHdyYFqDSBZ5KRtGrqU3GBog+VOGxucGaEbXEK1/ypX5CTe/wwkQDrH0FKWPQbd3l5t5YQ==} + + '@lexical/utils@0.32.1': + resolution: {integrity: sha512-ZaqZZksNIHJd+g8GXc11D1ESi8JzsdLVQZ+9odXVaNxtwDIaGIqMSccFyuZ9VSoJDde4JXZkgp/0PShbAZDkyw==} + + '@lexical/yjs@0.32.1': + resolution: {integrity: sha512-VHGTg5z4wcDkPe8NnhzA5+CoOKJ5tVmTmMvoiZ91rtNUFQPxWRky88Gjt1e3yXldYp4pImNEgtAjlWqvaJBYGA==} + peerDependencies: + yjs: '>=13.5.22' + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/cpp@1.1.3': + resolution: {integrity: sha512-ykYvuFQKGsRi6IcE+/hCSGUhb/I4WPjd3ELhEblm2wS2cOznDFzO+ubK2c+ioysOnlZ3EduV+MVQFCPzAIoY3w==} + + '@lezer/css@1.3.0': + resolution: {integrity: sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==} + + '@lezer/go@1.0.1': + resolution: {integrity: sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==} + + '@lezer/highlight@1.2.1': + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + + '@lezer/html@1.3.10': + resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} + + '@lezer/java@1.1.3': + resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} + + '@lezer/javascript@1.5.1': + resolution: {integrity: sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==} + + '@lezer/json@1.0.3': + resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lezer/markdown@1.4.3': + resolution: {integrity: sha512-kfw+2uMrQ/wy/+ONfrH83OkdFNM0ye5Xq96cLlaCy7h5UT9FO54DU4oRoIc0CSBh5NWmWuiIJA7NGLMJbQ+Oxg==} + + '@lezer/php@1.0.3': + resolution: {integrity: sha512-NDwgktd5qh/EfEn7Dogf2N6eNnC5WPJ5NslB8nKhgXSuH2uSJamCEom1g4VGo+ibfoADK8D69NMCMhuuYbVskg==} + + '@lezer/python@1.1.18': + resolution: {integrity: sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==} + + '@lezer/rust@1.0.2': + resolution: {integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==} + + '@lezer/sass@1.1.0': + resolution: {integrity: sha512-3mMGdCTUZ/84ArHOuXWQr37pnf7f+Nw9ycPUeKX+wu19b7pSMcZGLbaXwvD2APMBDOGxPmpK/O6S1v1EvLoqgQ==} + + '@lezer/xml@1.0.6': + resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} + + '@lezer/yaml@1.0.3': + resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + + '@mdxeditor/editor@3.39.1': + resolution: {integrity: sha512-z9w8HUzAgN0DRHM0xQBNxhstwEAKU1VFf+E0JeJxK3d3YmcwBTS0LoC9tuiTgFtRhUITrfcQzPx4+tOZ9eWDZg==} + engines: {node: '>=16'} + peerDependencies: + react: '>= 18 || >= 19' + react-dom: '>= 18 || >= 19' + + '@mdxeditor/gurx@1.2.3': + resolution: {integrity: sha512-5DQOlEx46oN9spggrC8husAGAhVoEFBGIYKN48es08XhRUbSU6l5bcIQYwRrQaY8clU1tExIcXzw8/fNnoxjpg==} + engines: {node: '>=16'} + peerDependencies: + react: '>= 18 || >= 19' + react-dom: '>= 18 || >= 19' + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@phenomnomnominal/tsquery@6.1.3': + resolution: {integrity: sha512-CEqpJ872StsxRmwv9ePCZ4BCisrJSlREUC5XxIRYxhvODt4aQoJFFmjTgaP6meyKiiXxxN/VWPZ58j4yHXRkmw==} + peerDependencies: + typescript: ^3 || ^4 || ^5 + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@playwright/test@1.54.1': + resolution: {integrity: sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==} + engines: {node: '>=18'} + hasBin: true + + '@radix-ui/colors@3.0.0': + resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.14': + resolution: {integrity: sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.10': + resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-icons@1.3.2': + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popover@1.1.14': + resolution: {integrity: sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.7': + resolution: {integrity: sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.4': + resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.10': + resolution: {integrity: sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.5': + resolution: {integrity: sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.7': + resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-toggle-group@1.1.10': + resolution: {integrity: sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.9': + resolution: {integrity: sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toolbar@1.1.10': + resolution: {integrity: sha512-jiwQsduEL++M4YBIurjSa+voD86OIytCod0/dbIxFZDLD8NfO1//keXYMfsW8BPcfqwoNjt+y06XcJqAb4KR7A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.2.7': + resolution: {integrity: sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@react-hook/intersection-observer@3.1.2': + resolution: {integrity: sha512-mWU3BMkmmzyYMSuhO9wu3eJVP21N8TcgYm9bZnTrMwuM818bEk+0NRM3hP+c/TqA9Ln5C7qE53p1H0QMtzYdvQ==} + peerDependencies: + react: '>=16.8' + + '@react-hook/passive-layout-effect@1.2.1': + resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} + peerDependencies: + react: '>=16.8' + + '@rolldown/pluginutils@1.0.0-beta.19': + resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} + + '@rollup/rollup-android-arm-eabi@4.45.0': + resolution: {integrity: sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.45.0': + resolution: {integrity: sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.45.0': + resolution: {integrity: sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.45.0': + resolution: {integrity: sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.45.0': + resolution: {integrity: sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.45.0': + resolution: {integrity: sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.45.0': + resolution: {integrity: sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.45.0': + resolution: {integrity: sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.45.0': + resolution: {integrity: sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.45.0': + resolution: {integrity: sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.45.0': + resolution: {integrity: sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': + resolution: {integrity: sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.45.0': + resolution: {integrity: sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.45.0': + resolution: {integrity: sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.45.0': + resolution: {integrity: sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.45.0': + resolution: {integrity: sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.45.0': + resolution: {integrity: sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.45.0': + resolution: {integrity: sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.45.0': + resolution: {integrity: sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.45.0': + resolution: {integrity: sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.34.37': + resolution: {integrity: sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + + '@stitches/core@1.2.8': + resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} + + '@tailwindcss/forms@0.5.10': + resolution: {integrity: sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' + + '@tailwindcss/node@4.1.11': + resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + + '@tailwindcss/oxide-android-arm64@4.1.11': + resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.11': + resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + 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.11': + resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.11': + resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.11': + resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==} + + '@tailwindcss/typography@0.5.16': + resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tanstack/react-virtual@3.13.12': + resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/diff@7.0.2': + resolution: {integrity: sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==} + + '@types/dom-to-image@2.6.7': + resolution: {integrity: sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg==} + + '@types/esquery@1.5.4': + resolution: {integrity: sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/inquirer@9.0.8': + resolution: {integrity: sha512-CgPD5kFGWsb8HJ5K7rfWlifao87m4ph8uioU7OTncJevmE/VLIqAAjfQtko578JZg7/f69K4FgqYym3gNr7DeA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/marked@6.0.0': + resolution: {integrity: sha512-jmjpa4BwUsmhxcfsgUit/7A9KbrC48Q0q8KvnY107ogcjGgTFDlIL3RpihNpx2Mu1hM4mdFQjoVc4O6JoGKHsA==} + deprecated: This is a stub types definition. marked provides its own type definitions, so you do not need this installed. + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@20.19.7': + resolution: {integrity: sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA==} + + '@types/node@24.0.13': + resolution: {integrity: sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==} + + '@types/parse-path@7.1.0': + resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} + deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. + + '@types/react-dom@19.1.6': + resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + + '@types/resolve@1.20.6': + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@typescript-eslint/eslint-plugin@8.36.0': + resolution: {integrity: sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.36.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.36.0': + resolution: {integrity: sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.37.0': + resolution: {integrity: sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.36.0': + resolution: {integrity: sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.37.0': + resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/rule-tester@8.37.0': + resolution: {integrity: sha512-jOdNuyQO6XROMk9yRB6uqA6R/kqwQXM77zgfC4tfDNaPnen5pvqEj5vuouFXoiJs77ZQsGsebJhcPMJeDFuWCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/scope-manager@8.36.0': + resolution: {integrity: sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.37.0': + resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.36.0': + resolution: {integrity: sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/tsconfig-utils@8.37.0': + resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.36.0': + resolution: {integrity: sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.36.0': + resolution: {integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.37.0': + resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.36.0': + resolution: {integrity: sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/typescript-estree@8.37.0': + resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.36.0': + resolution: {integrity: sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.37.0': + resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.36.0': + resolution: {integrity: sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.37.0': + resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@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] + + '@vitejs/plugin-react@4.6.0': + resolution: {integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + anser@2.3.2: + resolution: {integrity: sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + babel-jest@30.0.4: + resolution: {integrity: sha512-UjG2j7sAOqsp2Xua1mS/e+ekddkSu3wpf4nZUSvXNHuVWdaOUXQ77+uyjJLDE9i0atm5x4kds8K9yb5lRsRtcA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + + babel-plugin-istanbul@7.0.0: + resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} + engines: {node: '>=12'} + + babel-plugin-jest-hoist@30.0.1: + resolution: {integrity: sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@30.0.1: + resolution: {integrity: sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} + + cjs-module-lexer@2.1.0: + resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-set@1.1.2: + resolution: {integrity: sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + cm6-theme-basic-light@0.2.0: + resolution: {integrity: sha512-1prg2gv44sYfpHscP26uLT/ePrh0mlmVwMSoSd3zYKQ92Ab3jPRLzyCnpyOCQLJbK+YdNs4HvMRqMNYdy4pMhA==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/highlight': ^1.0.0 + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + codemirror@6.0.2: + resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + compute-scroll-into-view@2.0.4: + resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dom-to-image@2.6.0: + resolution: {integrity: sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dotenv@17.2.0: + resolution: {integrity: sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ==} + engines: {node: '>=12'} + + downshift@7.6.2: + resolution: {integrity: sha512-iOv+E1Hyt3JDdL9yYcOgW7nZ7GQ2Uz6YbggwXvKUSleetYhU2nXD482Rz6CzvM4lvI1At34BYruKAL4swRGxaA==} + peerDependencies: + react: '>=16.12.0' + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.182: + resolution: {integrity: sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.18.2: + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} + engines: {node: '>=10.13.0'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.6: + resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-carriage@1.3.1: + resolution: {integrity: sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + 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-refresh@0.4.20: + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} + peerDependencies: + eslint: '>=8.40' + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + 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@3.4.3: + 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@9.31.0: + resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + eventsource-parser@3.0.3: + resolution: {integrity: sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==} + engines: {node: '>=20.0.0'} + + eventsource@4.0.0: + resolution: {integrity: sha512-fvIkb9qZzdMxgZrEQDyll+9oJsyaVvY92I2Re+qK0qEJ+w5s0X3dtz+M0VAPOjP1gtU3iqWyjQ0G3nvd5CLZ2g==} + engines: {node: '>=20.0.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} + + expect@30.0.4: + resolution: {integrity: sha512-dDLGjnP2cKbEppxVICxI/Uf4YemmGMPNy0QytCbfafbpYk9AFQsxb8Uyrxii0RPK7FWgLGlSem+07WirwS3cFQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + git-up@8.1.1: + resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==} + + git-url-parse@16.1.0: + resolution: {integrity: sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==} + + glob-hasher-darwin-arm64@1.4.2: + resolution: {integrity: sha512-zqCZDkDrgo86UsEbOV5wnfyAVlNQ85clGt9EV4LlskDmv2aeuHD6dFYU8hLbbQSC7nvd90EWewy1WqvV6KsL7A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + glob-hasher-darwin-x64@1.4.2: + resolution: {integrity: sha512-yEmIQyr6pGj2RG6IxUpOiVbbTm+lw5+L6MqxdPJvp+Z96YSUIo7aOkru0M8lgFGTRh5fQNDWdoHM6kgK8USYrA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + glob-hasher-linux-x64-gnu@1.4.2: + resolution: {integrity: sha512-7TT8Wfkw41zwfvkbZJ3M3QqWR4bR9qLnbSzcMFHrOIpJjdnvKzCzrqfi470S8sPb6dyEVyS7s49eP5YB8cSy5A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + glob-hasher-win32-arm64-msvc@1.4.2: + resolution: {integrity: sha512-HyNotx1CF0/7ulND7CnbLoyuykGeMIARJRzJK36WlcgR+BqkSfcPJEbsbk7AsHhaBOtlUWAbEX9MDndcx8uguQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + glob-hasher-win32-x64-msvc@1.4.2: + resolution: {integrity: sha512-6mKybe2NwFABUA7ZxiiXurD5RXDrrCWwGA53NasfnO4z+hvH5q4jG6YvVhavf6GdTapJi9WwfMHRKvoSQNUxeQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + glob-hasher@1.4.2: + resolution: {integrity: sha512-wYeJvOixB9iAzNpY94AgK0JvOdOQ7g30U+PN0LGSH9u0Y0WC+jIwukjMZ1JZiSoNzUSyrvABZYCNhXpZEoJ/8Q==} + engines: {node: '>= 10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.3.0: + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inquirer@9.3.7: + resolution: {integrity: sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==} + engines: {node: '>=18'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + intersection-observer@0.10.0: + resolution: {integrity: sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-ssh@1.4.1: + resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@30.0.2: + resolution: {integrity: sha512-Ius/iRST9FKfJI+I+kpiDh8JuUlAISnRszF9ixZDIqJF17FckH5sOzKC8a0wd0+D+8em5ADRHA5V5MnfeDk2WA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.0.4: + resolution: {integrity: sha512-o6UNVfbXbmzjYgmVPtSQrr5xFZCtkDZGdTlptYvGFSN80RuOOlTe73djvMrs+QAuSERZWcHBNIOMH+OEqvjWuw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.0.4: + resolution: {integrity: sha512-3dOrP3zqCWBkjoVG1zjYJpD9143N9GUCbwaF2pFF5brnIgRLHmKcCIw+83BvF1LxggfMWBA0gxkn6RuQVuRhIQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@30.0.4: + resolution: {integrity: sha512-3dzbO6sh34thAGEjJIW0fgT0GA0EVlkski6ZzMcbW6dzhenylXAE/Mj2MI4HonroWbkKc6wU6bLVQ8dvBSZ9lA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + + jest-diff@30.0.4: + resolution: {integrity: sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-docblock@30.0.1: + resolution: {integrity: sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.0.2: + resolution: {integrity: sha512-ZFRsTpe5FUWFQ9cWTMguCaiA6kkW5whccPy9JjD1ezxh+mJeqmz8naL8Fl/oSbNJv3rgB0x87WBIkA5CObIUZQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-node@30.0.4: + resolution: {integrity: sha512-p+rLEzC2eThXqiNh9GHHTC0OW5Ca4ZfcURp7scPjYBcmgpR9HG6750716GuUipYf2AcThU3k20B31USuiaaIEg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-haste-map@30.0.2: + resolution: {integrity: sha512-telJBKpNLeCb4MaX+I5k496556Y2FiKR/QLZc0+MGBYl4k3OO0472drlV2LUe7c1Glng5HuAu+5GLYp//GpdOQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-leak-detector@30.0.2: + resolution: {integrity: sha512-U66sRrAYdALq+2qtKffBLDWsQ/XoNNs2Lcr83sc9lvE/hEpNafJlq2lXCPUBMNqamMECNxSIekLfe69qg4KMIQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.0.4: + resolution: {integrity: sha512-ubCewJ54YzeAZ2JeHHGVoU+eDIpQFsfPQs0xURPWoNiO42LGJ+QGgfSf+hFIRplkZDkhH5MOvuxHKXRTUU3dUQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@30.0.2: + resolution: {integrity: sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@30.0.2: + resolution: {integrity: sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.0.4: + resolution: {integrity: sha512-EQBYow19B/hKr4gUTn+l8Z+YLlP2X0IoPyp0UydOtrcPbIOYzJ8LKdFd+yrbwztPQvmlBFUwGPPEzHH1bAvFAw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.0.2: + resolution: {integrity: sha512-q/XT0XQvRemykZsvRopbG6FQUT6/ra+XV6rPijyjT6D0msOyCvR2A5PlWZLd+fH0U8XWKZfDiAgrUNDNX2BkCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runner@30.0.4: + resolution: {integrity: sha512-mxY0vTAEsowJwvFJo5pVivbCpuu6dgdXRmt3v3MXjBxFly7/lTk3Td0PaMyGOeNQUFmSuGEsGYqhbn7PA9OekQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.0.4: + resolution: {integrity: sha512-tUQrZ8+IzoZYIHoPDQEB4jZoPyzBjLjq7sk0KVyd5UPRjRDOsN7o6UlvaGF8ddpGsjznl9PW+KRgWqCNO+Hn7w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-snapshot@30.0.4: + resolution: {integrity: sha512-S/8hmSkeUib8WRUq9pWEb5zMfsOjiYWDWzFzKnjX7eDyKKgimsu9hcmsUEg8a7dPAw8s/FacxsXquq71pDgPjQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-util@30.0.2: + resolution: {integrity: sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@30.0.2: + resolution: {integrity: sha512-noOvul+SFER4RIvNAwGn6nmV2fXqBq67j+hKGHKGFCmK4ks/Iy1FSrqQNBLGKlu4ZZIRL6Kg1U72N1nxuRCrGQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watcher@30.0.4: + resolution: {integrity: sha512-YESbdHDs7aQOCSSKffG8jXqOKFqw4q4YqR+wHYpR5GWEQioGvL0BfbcjvKIvPEM0XGfsfJrka7jJz3Cc3gI4VQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-worker@30.0.2: + resolution: {integrity: sha512-RN1eQmx7qSLFA+o9pfJKlqViwL5wt+OL3Vff/A+/cPsmuw7NPwfgl33AP+/agRmHzPOFgXviRycR9kYwlcRQXg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.0.4: + resolution: {integrity: sha512-9QE0RS4WwTj/TtTC4h/eFVmFAhGNVerSB9XpJh8sqaXlP73ILcPcZ7JWjjEtJJe2m8QyBLKKfPQuK+3F+Xij/g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lage@2.14.6: + resolution: {integrity: sha512-mc3fbrrroeEkrRYmp6t6VTlgI86657xY8ZDjZ0EGeLm0OcZYmalVnccbx4ZFNLvWhbCyE+2GBzKMluvSa4QCjg==} + hasBin: true + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lexical@0.32.1: + resolution: {integrity: sha512-Rvr9p00zUwzjXIqElIjMDyl/24QHw68yaqmXUWIT3lSdSAr8OpjSJK3iWBLZwVZwwpVhwShZRckomc+3vSb/zw==} + + lib0@0.2.109: + resolution: {integrity: sha512-jP0gbnyW0kwlx1Atc4dcHkBbrVAkdHjuyHxtClUPYla7qCmwIif1qZ6vQeJdR5FrOVdn26HvQT0ko01rgW7/Xw==} + engines: {node: '>=16'} + 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'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@16.0.0: + resolution: {integrity: sha512-MUKMXDjsD/eptB7GPzxo4xcnLS6oo7/RHimUMHEDRhUooPwmN9BEpMl7AEOJv3bmso169wHI2wUF9VQgL7zfmA==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.3.0: + resolution: {integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outvariant@1.4.0: + resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-path@7.1.0: + resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} + + parse-url@9.2.0: + resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} + engines: {node: '>=14.13.0'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + playwright-core@1.54.1: + resolution: {integrity: sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.54.1: + resolution: {integrity: sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==} + engines: {node: '>=18'} + hasBin: true + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + pretty-format@30.0.2: + resolution: {integrity: sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + protocols@2.0.2: + resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + + react-devtools-inline@4.4.0: + resolution: {integrity: sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==} + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-error-boundary@3.1.4: + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13.1' + + react-hook-form@7.60.0: + resolution: {integrity: sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-router-dom@7.6.3: + resolution: {integrity: sha512-DiWJm9qdUAmiJrVWaeJdu4TKu13+iB/8IEi0EW/XgaHCjW/vWGrwzup0GVvaMteuZjKnh5bEvJP/K0MDnzawHw==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.6.3: + resolution: {integrity: sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + rollup@4.45.0: + resolution: {integrity: sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + static-browser-server@1.0.3: + resolution: {integrity: sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + strict-event-emitter@0.4.6: + resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + + tailwindcss@4.1.11: + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-jest@29.4.0: + resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + esbuild: '*' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + jest-util: + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.36.0: + resolution: {integrity: sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + + unidiff@1.0.4: + resolution: {integrity: sha512-ynU0vsAXw0ir8roa+xPCUHmnJ5goc5BTM2Kuc3IJd8UwgaeRs7VSD5+eeaQL+xp1JtB92hu/Zy/Lgy7RZcr1pQ==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.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 + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@7.0.4: + resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + 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-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workspace-tools@0.38.4: + resolution: {integrity: sha512-wCei5WNlhHswuU5tPjTYy4yVd7jnavtRUNbqpiHAmWRPOJtkvUpBQZExrrgFs3h9jdx6Qf6inCDSwjqnXhf+vQ==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yjs@13.6.27: + resolution: {integrity: sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@anthropic-ai/claude-code@1.0.51': + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.1 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/runtime@7.27.6': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bcoe/v8-coverage@0.2.3': {} + + '@codemirror/autocomplete@6.18.6': + dependencies: + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/common': 1.2.3 + + '@codemirror/commands@6.8.1': + dependencies: + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/common': 1.2.3 + + '@codemirror/lang-angular@0.1.4': + dependencies: + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.11.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-cpp@6.0.3': + dependencies: + '@codemirror/language': 6.11.2 + '@lezer/cpp': 1.1.3 + + '@codemirror/lang-css@6.3.1': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/css': 1.3.0 + + '@codemirror/lang-go@6.0.1': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/go': 1.0.1 + + '@codemirror/lang-html@6.4.9': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/common': 1.2.3 + '@lezer/css': 1.3.0 + '@lezer/html': 1.3.10 + + '@codemirror/lang-java@6.0.2': + dependencies: + '@codemirror/language': 6.11.2 + '@lezer/java': 1.1.3 + + '@codemirror/lang-javascript@6.2.4': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/language': 6.11.2 + '@codemirror/lint': 6.8.5 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/common': 1.2.3 + '@lezer/javascript': 1.5.1 + + '@codemirror/lang-json@6.0.2': + dependencies: + '@codemirror/language': 6.11.2 + '@lezer/json': 1.0.3 + + '@codemirror/lang-less@6.0.2': + dependencies: + '@codemirror/lang-css': 6.3.1 + '@codemirror/language': 6.11.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-liquid@6.2.3': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-markdown@6.3.3': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/common': 1.2.3 + '@lezer/markdown': 1.4.3 + + '@codemirror/lang-php@6.0.2': + dependencies: + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/php': 1.0.3 + + '@codemirror/lang-python@6.2.1': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/python': 1.1.18 + + '@codemirror/lang-rust@6.0.2': + dependencies: + '@codemirror/language': 6.11.2 + '@lezer/rust': 1.0.2 + + '@codemirror/lang-sass@6.0.2': + dependencies: + '@codemirror/lang-css': 6.3.1 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/sass': 1.1.0 + + '@codemirror/lang-sql@6.9.0': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-vue@0.1.3': + dependencies: + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.11.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-wast@6.0.2': + dependencies: + '@codemirror/language': 6.11.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-xml@6.1.0': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/common': 1.2.3 + '@lezer/xml': 1.0.6 + + '@codemirror/lang-yaml@6.1.2': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + '@lezer/yaml': 1.0.3 + + '@codemirror/language-data@6.5.1': + dependencies: + '@codemirror/lang-angular': 0.1.4 + '@codemirror/lang-cpp': 6.0.3 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-go': 6.0.1 + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-java': 6.0.2 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/lang-json': 6.0.2 + '@codemirror/lang-less': 6.0.2 + '@codemirror/lang-liquid': 6.2.3 + '@codemirror/lang-markdown': 6.3.3 + '@codemirror/lang-php': 6.0.2 + '@codemirror/lang-python': 6.2.1 + '@codemirror/lang-rust': 6.0.2 + '@codemirror/lang-sass': 6.0.2 + '@codemirror/lang-sql': 6.9.0 + '@codemirror/lang-vue': 0.1.3 + '@codemirror/lang-wast': 6.0.2 + '@codemirror/lang-xml': 6.1.0 + '@codemirror/lang-yaml': 6.1.2 + '@codemirror/language': 6.11.2 + '@codemirror/legacy-modes': 6.5.1 + + '@codemirror/language@6.11.2': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + style-mod: 4.1.2 + + '@codemirror/legacy-modes@6.5.1': + dependencies: + '@codemirror/language': 6.11.2 + + '@codemirror/lint@6.8.5': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + crelt: 1.0.6 + + '@codemirror/merge@6.10.2': + dependencies: + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/highlight': 1.2.1 + style-mod: 4.1.2 + + '@codemirror/search@6.5.11': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + crelt: 1.0.6 + + '@codemirror/state@6.5.2': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/view@6.38.0': + dependencies: + '@codemirror/state': 6.5.2 + crelt: 1.0.6 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + + '@codesandbox/nodebox@0.1.8': + dependencies: + outvariant: 1.4.0 + strict-event-emitter: 0.4.6 + + '@codesandbox/sandpack-client@2.19.8': + dependencies: + '@codesandbox/nodebox': 0.1.8 + buffer: 6.0.3 + dequal: 2.0.3 + mime-db: 1.54.0 + outvariant: 1.4.0 + static-browser-server: 1.0.3 + + '@codesandbox/sandpack-react@2.20.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/commands': 6.8.1 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@codesandbox/sandpack-client': 2.19.8 + '@lezer/highlight': 1.2.1 + '@react-hook/intersection-observer': 3.1.2(react@19.1.0) + '@stitches/core': 1.2.8 + anser: 2.3.2 + clean-set: 1.1.2 + dequal: 2.0.3 + escape-carriage: 1.3.1 + lz-string: 1.5.0 + react: 19.1.0 + react-devtools-inline: 4.4.0 + react-dom: 19.1.0(react@19.1.0) + react-is: 17.0.2 + + '@emnapi/core@1.4.4': + dependencies: + '@emnapi/wasi-threads': 1.0.3 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.4': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.6': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.6': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.6': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.6': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.6': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.6': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.6': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.6': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.6': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.6': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.6': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.6': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.6': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.6': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.6': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.6': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.6': + optional: true + + '@esbuild/netbsd-arm64@0.25.6': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.6': + optional: true + + '@esbuild/openbsd-arm64@0.25.6': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.6': + optional: true + + '@esbuild/openharmony-arm64@0.25.6': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.6': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.6': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.6': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.6': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0(jiti@2.4.2))': + dependencies: + eslint: 9.31.0(jiti@2.4.2) + 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.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.15.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + 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@9.31.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.3': + dependencies: + '@eslint/core': 0.15.1 + levn: 0.4.1 + + '@floating-ui/core@1.7.2': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.2': + dependencies: + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/dom': 1.7.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@floating-ui/react@0.27.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/utils': 0.2.10 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.10': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@inquirer/figures@1.0.12': {} + + '@instantlyeasy/claude-code-sdk-ts@0.3.3': + dependencies: + execa: 8.0.1 + js-yaml: 4.1.0 + which: 4.0.0 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + 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 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@30.0.4': + dependencies: + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + chalk: 4.1.2 + jest-message-util: 30.0.2 + jest-util: 30.0.2 + slash: 3.0.0 + + '@jest/core@30.0.4': + dependencies: + '@jest/console': 30.0.4 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.0.4 + '@jest/test-result': 30.0.4 + '@jest/transform': 30.0.4 + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.3.0 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-changed-files: 30.0.2 + jest-config: 30.0.4(@types/node@24.0.13) + jest-haste-map: 30.0.2 + jest-message-util: 30.0.2 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.2 + jest-resolve-dependencies: 30.0.4 + jest-runner: 30.0.4 + jest-runtime: 30.0.4 + jest-snapshot: 30.0.4 + jest-util: 30.0.2 + jest-validate: 30.0.2 + jest-watcher: 30.0.4 + micromatch: 4.0.8 + pretty-format: 30.0.2 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + '@jest/diff-sequences@30.0.1': {} + + '@jest/environment@30.0.4': + dependencies: + '@jest/fake-timers': 30.0.4 + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + jest-mock: 30.0.2 + + '@jest/expect-utils@30.0.4': + dependencies: + '@jest/get-type': 30.0.1 + + '@jest/expect@30.0.4': + dependencies: + expect: 30.0.4 + jest-snapshot: 30.0.4 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@30.0.4': + dependencies: + '@jest/types': 30.0.1 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 24.0.13 + jest-message-util: 30.0.2 + jest-mock: 30.0.2 + jest-util: 30.0.2 + + '@jest/get-type@30.0.1': {} + + '@jest/globals@30.0.4': + dependencies: + '@jest/environment': 30.0.4 + '@jest/expect': 30.0.4 + '@jest/types': 30.0.1 + jest-mock: 30.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 24.0.13 + jest-regex-util: 30.0.1 + + '@jest/reporters@30.0.4': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.0.4 + '@jest/test-result': 30.0.4 + '@jest/transform': 30.0.4 + '@jest/types': 30.0.1 + '@jridgewell/trace-mapping': 0.3.29 + '@types/node': 24.0.13 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit-x: 0.2.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + jest-message-util: 30.0.2 + jest-util: 30.0.2 + jest-worker: 30.0.2 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@30.0.1': + dependencies: + '@sinclair/typebox': 0.34.37 + + '@jest/snapshot-utils@30.0.4': + dependencies: + '@jest/types': 30.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@30.0.4': + dependencies: + '@jest/console': 30.0.4 + '@jest/types': 30.0.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@30.0.4': + dependencies: + '@jest/test-result': 30.0.4 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.2 + slash: 3.0.0 + + '@jest/transform@30.0.4': + dependencies: + '@babel/core': 7.28.0 + '@jest/types': 30.0.1 + '@jridgewell/trace-mapping': 0.3.29 + babel-plugin-istanbul: 7.0.0 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.2 + jest-regex-util: 30.0.1 + jest-util: 30.0.2 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + + '@jest/types@30.0.1': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.1 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.0.13 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@lexical/clipboard@0.32.1': + dependencies: + '@lexical/html': 0.32.1 + '@lexical/list': 0.32.1 + '@lexical/selection': 0.32.1 + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/code@0.32.1': + dependencies: + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + prismjs: 1.30.0 + + '@lexical/devtools-core@0.32.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@lexical/html': 0.32.1 + '@lexical/link': 0.32.1 + '@lexical/mark': 0.32.1 + '@lexical/table': 0.32.1 + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@lexical/dragon@0.32.1': + dependencies: + lexical: 0.32.1 + + '@lexical/hashtag@0.32.1': + dependencies: + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/history@0.32.1': + dependencies: + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/html@0.32.1': + dependencies: + '@lexical/selection': 0.32.1 + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/link@0.32.1': + dependencies: + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/list@0.32.1': + dependencies: + '@lexical/selection': 0.32.1 + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/mark@0.32.1': + dependencies: + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/markdown@0.32.1': + dependencies: + '@lexical/code': 0.32.1 + '@lexical/link': 0.32.1 + '@lexical/list': 0.32.1 + '@lexical/rich-text': 0.32.1 + '@lexical/text': 0.32.1 + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/offset@0.32.1': + dependencies: + lexical: 0.32.1 + + '@lexical/overflow@0.32.1': + dependencies: + lexical: 0.32.1 + + '@lexical/plain-text@0.32.1': + dependencies: + '@lexical/clipboard': 0.32.1 + '@lexical/selection': 0.32.1 + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/react@0.32.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.27)': + dependencies: + '@floating-ui/react': 0.27.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@lexical/devtools-core': 0.32.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@lexical/dragon': 0.32.1 + '@lexical/hashtag': 0.32.1 + '@lexical/history': 0.32.1 + '@lexical/link': 0.32.1 + '@lexical/list': 0.32.1 + '@lexical/mark': 0.32.1 + '@lexical/markdown': 0.32.1 + '@lexical/overflow': 0.32.1 + '@lexical/plain-text': 0.32.1 + '@lexical/rich-text': 0.32.1 + '@lexical/table': 0.32.1 + '@lexical/text': 0.32.1 + '@lexical/utils': 0.32.1 + '@lexical/yjs': 0.32.1(yjs@13.6.27) + lexical: 0.32.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-error-boundary: 3.1.4(react@19.1.0) + transitivePeerDependencies: + - yjs + + '@lexical/rich-text@0.32.1': + dependencies: + '@lexical/clipboard': 0.32.1 + '@lexical/selection': 0.32.1 + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/selection@0.32.1': + dependencies: + lexical: 0.32.1 + + '@lexical/table@0.32.1': + dependencies: + '@lexical/clipboard': 0.32.1 + '@lexical/utils': 0.32.1 + lexical: 0.32.1 + + '@lexical/text@0.32.1': + dependencies: + lexical: 0.32.1 + + '@lexical/utils@0.32.1': + dependencies: + '@lexical/list': 0.32.1 + '@lexical/selection': 0.32.1 + '@lexical/table': 0.32.1 + lexical: 0.32.1 + + '@lexical/yjs@0.32.1(yjs@13.6.27)': + dependencies: + '@lexical/offset': 0.32.1 + '@lexical/selection': 0.32.1 + lexical: 0.32.1 + yjs: 13.6.27 + + '@lezer/common@1.2.3': {} + + '@lezer/cpp@1.1.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/css@1.3.0': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/go@1.0.1': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/highlight@1.2.1': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/html@1.3.10': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/java@1.1.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/javascript@1.5.1': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/json@1.0.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/markdown@1.4.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + + '@lezer/php@1.0.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/python@1.1.18': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/rust@1.0.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/sass@1.1.0': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/xml@1.0.6': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/yaml@1.0.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@marijn/find-cluster-break@1.0.2': {} + + '@mdxeditor/editor@3.39.1(@codemirror/language@6.11.2)(@lezer/highlight@1.2.1)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.27)': + dependencies: + '@codemirror/commands': 6.8.1 + '@codemirror/lang-markdown': 6.3.3 + '@codemirror/language-data': 6.5.1 + '@codemirror/merge': 6.10.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@codesandbox/sandpack-react': 2.20.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@lexical/clipboard': 0.32.1 + '@lexical/link': 0.32.1 + '@lexical/list': 0.32.1 + '@lexical/markdown': 0.32.1 + '@lexical/plain-text': 0.32.1 + '@lexical/react': 0.32.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.27) + '@lexical/rich-text': 0.32.1 + '@lexical/selection': 0.32.1 + '@lexical/utils': 0.32.1 + '@mdxeditor/gurx': 1.2.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/colors': 3.0.0 + '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-icons': 1.3.2(react@19.1.0) + '@radix-ui/react-popover': 1.1.14(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-select': 2.2.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle-group': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toolbar': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-tooltip': 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + classnames: 2.5.1 + cm6-theme-basic-light: 0.2.0(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.0)(@lezer/highlight@1.2.1) + codemirror: 6.0.2 + downshift: 7.6.2(react@19.1.0) + js-yaml: 4.1.0 + lexical: 0.32.1 + mdast-util-directive: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-frontmatter: 2.0.1 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-mdx: 3.0.0 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-to-markdown: 2.1.2 + micromark-extension-directive: 3.0.2 + micromark-extension-frontmatter: 2.0.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs: 3.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-hook-form: 7.60.0(react@19.1.0) + unidiff: 1.0.4 + transitivePeerDependencies: + - '@codemirror/language' + - '@lezer/highlight' + - '@types/react' + - '@types/react-dom' + - supports-color + - yjs + + '@mdxeditor/gurx@1.2.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.4.4 + '@emnapi/runtime': 1.4.4 + '@tybys/wasm-util': 0.10.0 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@open-draft/deferred-promise@2.2.0': {} + + '@phenomnomnominal/tsquery@6.1.3(typescript@5.8.3)': + dependencies: + '@types/esquery': 1.5.4 + esquery: 1.6.0 + typescript: 5.8.3 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.7': {} + + '@playwright/test@1.54.1': + dependencies: + playwright: 1.54.1 + + '@radix-ui/colors@3.0.0': {} + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.2': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-context@1.1.2(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-dialog@1.1.14(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.1(@types/react@19.1.8)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-direction@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-icons@1.3.2(react@19.1.0)': + dependencies: + react: 19.1.0 + + '@radix-ui/react-id@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-popover@1.1.14(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.1(@types/react@19.1.8)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-popper@1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-select@2.2.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.1(@types/react@19.1.8)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-slot@1.2.3(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-toggle-group@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-toggle@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-toolbar@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle-group': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-tooltip@1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/rect@1.1.1': {} + + '@react-hook/intersection-observer@3.1.2(react@19.1.0)': + dependencies: + '@react-hook/passive-layout-effect': 1.2.1(react@19.1.0) + intersection-observer: 0.10.0 + react: 19.1.0 + + '@react-hook/passive-layout-effect@1.2.1(react@19.1.0)': + dependencies: + react: 19.1.0 + + '@rolldown/pluginutils@1.0.0-beta.19': {} + + '@rollup/rollup-android-arm-eabi@4.45.0': + optional: true + + '@rollup/rollup-android-arm64@4.45.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.45.0': + optional: true + + '@rollup/rollup-darwin-x64@4.45.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.45.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.45.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.45.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.45.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.45.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.45.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.45.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.45.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.45.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.45.0': + optional: true + + '@sinclair/typebox@0.34.37': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@13.0.5': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@stitches/core@1.2.8': {} + + '@tailwindcss/forms@0.5.10(tailwindcss@3.4.17)': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.4.17 + + '@tailwindcss/node@4.1.11': + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.2 + jiti: 2.4.2 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.11 + + '@tailwindcss/oxide-android-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide@4.1.11': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-x64': 4.1.11 + '@tailwindcss/oxide-freebsd-x64': 4.1.11 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-x64-musl': 4.1.11 + '@tailwindcss/oxide-wasm32-wasi': 4.1.11 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + + '@tailwindcss/postcss@4.1.11': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 + postcss: 8.5.6 + tailwindcss: 4.1.11 + + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.17 + + '@tanstack/react-virtual@3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/virtual-core': 3.13.12 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@tanstack/virtual-core@3.13.12': {} + + '@tybys/wasm-util@0.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.1 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + + '@types/babel__traverse@7.20.7': + dependencies: + '@babel/types': 7.28.1 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/diff@7.0.2': {} + + '@types/dom-to-image@2.6.7': {} + + '@types/esquery@1.5.4': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 24.0.13 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/inquirer@9.0.8': + dependencies: + '@types/through': 0.0.33 + rxjs: 7.8.2 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@30.0.0': + dependencies: + expect: 30.0.4 + pretty-format: 30.0.2 + + '@types/json-schema@7.0.15': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 24.0.13 + + '@types/marked@6.0.0': + dependencies: + marked: 16.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/node@20.19.7': + dependencies: + undici-types: 6.21.0 + + '@types/node@24.0.13': + dependencies: + undici-types: 7.8.0 + + '@types/parse-path@7.1.0': + dependencies: + parse-path: 7.1.0 + + '@types/react-dom@19.1.6(@types/react@19.1.8)': + dependencies: + '@types/react': 19.1.8 + + '@types/react@19.1.8': + dependencies: + csstype: 3.1.3 + + '@types/resolve@1.20.6': {} + + '@types/stack-utils@2.0.3': {} + + '@types/through@0.0.33': + dependencies: + '@types/node': 24.0.13 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/uuid@10.0.0': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.36.0 + '@typescript-eslint/type-utils': 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.36.0 + eslint: 9.31.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.36.0 + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.36.0 + debug: 4.4.1 + eslint: 9.31.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.1 + eslint: 9.31.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.36.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) + '@typescript-eslint/types': 8.36.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.37.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/rule-tester@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + ajv: 6.12.6 + eslint: 9.31.0(jiti@2.4.2) + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/scope-manager@8.36.0': + dependencies: + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/visitor-keys': 8.36.0 + + '@typescript-eslint/scope-manager@8.37.0': + dependencies: + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + + '@typescript-eslint/tsconfig-utils@8.36.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.31.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.36.0': {} + + '@typescript-eslint/types@8.37.0': {} + + '@typescript-eslint/typescript-estree@8.36.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.36.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/visitor-keys': 8.36.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.37.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.37.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.36.0 + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + eslint: 9.31.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + eslint: 9.31.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.36.0': + dependencies: + '@typescript-eslint/types': 8.36.0 + eslint-visitor-keys: 4.2.1 + + '@typescript-eslint/visitor-keys@8.37.0': + dependencies: + '@typescript-eslint/types': 8.37.0 + eslint-visitor-keys: 4.2.1 + + '@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 + + '@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@24.0.13)(lightningcss@1.30.1))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) + '@rolldown/pluginutils': 1.0.0-beta.19 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 5.4.19(@types/node@24.0.13)(lightningcss@1.30.1) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-react@4.6.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) + '@rolldown/pluginutils': 1.0.0-beta.19 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + + '@yarnpkg/lockfile@1.1.0': {} + + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + anser@2.3.2: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + async@3.2.6: {} + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + babel-jest@30.0.4(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@jest/transform': 30.0.4 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.0 + babel-preset-jest: 30.0.1(@babel/core@7.28.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@7.0.0: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@30.0.1: + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + '@types/babel__core': 7.20.5 + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) + + babel-preset-jest@30.0.1(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + babel-plugin-jest-hoist: 30.0.1 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + 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@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.182 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001727: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + char-regex@1.0.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@3.0.0: {} + + ci-info@4.3.0: {} + + cjs-module-lexer@2.1.0: {} + + classnames@2.5.1: {} + + clean-set@1.1.2: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + cm6-theme-basic-light@0.2.0(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.0)(@lezer/highlight@1.2.1): + dependencies: + '@codemirror/language': 6.11.2 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + '@lezer/highlight': 1.2.1 + + co@4.6.0: {} + + codemirror@6.0.2: + dependencies: + '@codemirror/autocomplete': 6.18.6 + '@codemirror/commands': 6.8.1 + '@codemirror/language': 6.11.2 + '@codemirror/lint': 6.8.5 + '@codemirror/search': 6.5.11 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.0 + + collect-v8-coverage@1.0.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@11.1.0: {} + + commander@12.1.0: {} + + commander@4.1.1: {} + + compute-scroll-into-view@2.0.4: {} + + concat-map@0.0.1: {} + + concurrently@8.2.2: + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.3 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cookie@1.0.2: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + crelt@1.0.6: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.27.6 + + date-fns@4.1.0: {} + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + dedent@1.6.0: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + depd@2.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.0.4: {} + + detect-newline@3.1.0: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff@5.2.0: {} + + diff@8.0.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dom-to-image@2.6.0: {} + + dotenv@16.6.1: {} + + dotenv@17.2.0: {} + + downshift@7.6.2(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.6 + compute-scroll-into-view: 2.0.4 + prop-types: 15.8.1 + react: 19.1.0 + react-is: 17.0.2 + tslib: 2.8.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.182: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.18.2: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.6: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 + + escalade@3.2.0: {} + + escape-carriage@1.3.1: {} + + escape-html@1.0.3: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-plugin-react-hooks@5.2.0(eslint@9.31.0(jiti@2.4.2)): + dependencies: + eslint: 9.31.0(jiti@2.4.2) + + eslint-plugin-react-refresh@0.4.20(eslint@9.31.0(jiti@2.4.2)): + dependencies: + eslint: 9.31.0(jiti@2.4.2) + + eslint-plugin-react@7.37.5(eslint@9.31.0(jiti@2.4.2)): + 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.31.0(jiti@2.4.2) + 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@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.31.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.15.1 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.31.0 + '@eslint/plugin-kit': 0.3.3 + '@humanfs/node': 0.16.6 + '@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.1 + 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.4.2 + transitivePeerDependencies: + - supports-color + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + eventsource-parser@3.0.3: {} + + eventsource@4.0.0: + dependencies: + eventsource-parser: 3.0.3 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exit-x@0.2.2: {} + + expect@30.0.4: + dependencies: + '@jest/expect-utils': 30.0.4 + '@jest/get-type': 30.0.1 + jest-matcher-utils: 30.0.4 + jest-message-util: 30.0.2 + jest-mock: 30.0.2 + jest-util: 30.0.2 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + ext@1.7.0: + dependencies: + type: 2.7.3 + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + 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-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fdir@6.4.6(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fraction.js@4.3.7: {} + + fresh@2.0.0: {} + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + git-up@8.1.1: + dependencies: + is-ssh: 1.4.1 + parse-url: 9.2.0 + + git-url-parse@16.1.0: + dependencies: + git-up: 8.1.1 + + glob-hasher-darwin-arm64@1.4.2: + optional: true + + glob-hasher-darwin-x64@1.4.2: + optional: true + + glob-hasher-linux-x64-gnu@1.4.2: + optional: true + + glob-hasher-win32-arm64-msvc@1.4.2: + optional: true + + glob-hasher-win32-x64-msvc@1.4.2: + optional: true + + glob-hasher@1.4.2: + optionalDependencies: + glob-hasher-darwin-arm64: 1.4.2 + glob-hasher-darwin-x64: 1.4.2 + glob-hasher-linux-x64-gnu: 1.4.2 + glob-hasher-win32-arm64-msvc: 1.4.2 + glob-hasher-win32-x64-msvc: 1.4.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@14.0.0: {} + + globals@16.3.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-escaper@2.0.2: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inquirer@9.3.7: + dependencies: + '@inquirer/figures': 1.0.12 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + external-editor: 3.1.0 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + intersection-observer@0.10.0: {} + + ipaddr.js@1.9.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-interactive@1.0.0: {} + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-promise@4.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-ssh@1.4.1: + dependencies: + protocols: 2.0.2 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-unicode-supported@0.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + isomorphic.js@0.2.5: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@30.0.2: + dependencies: + execa: 5.1.1 + jest-util: 30.0.2 + p-limit: 3.1.0 + + jest-circus@30.0.4: + dependencies: + '@jest/environment': 30.0.4 + '@jest/expect': 30.0.4 + '@jest/test-result': 30.0.4 + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.6.0 + is-generator-fn: 2.1.0 + jest-each: 30.0.2 + jest-matcher-utils: 30.0.4 + jest-message-util: 30.0.2 + jest-runtime: 30.0.4 + jest-snapshot: 30.0.4 + jest-util: 30.0.2 + p-limit: 3.1.0 + pretty-format: 30.0.2 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@30.0.4(@types/node@20.19.7): + dependencies: + '@jest/core': 30.0.4 + '@jest/test-result': 30.0.4 + '@jest/types': 30.0.1 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.0.4(@types/node@20.19.7) + jest-util: 30.0.2 + jest-validate: 30.0.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jest-config@30.0.4(@types/node@20.19.7): + dependencies: + '@babel/core': 7.28.0 + '@jest/get-type': 30.0.1 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.0.4 + '@jest/types': 30.0.1 + babel-jest: 30.0.4(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 4.3.0 + deepmerge: 4.3.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.0.4 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.4 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.2 + jest-runner: 30.0.4 + jest-util: 30.0.2 + jest-validate: 30.0.2 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.0.2 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.19.7 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@30.0.4(@types/node@24.0.13): + dependencies: + '@babel/core': 7.28.0 + '@jest/get-type': 30.0.1 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.0.4 + '@jest/types': 30.0.1 + babel-jest: 30.0.4(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 4.3.0 + deepmerge: 4.3.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.0.4 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.4 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.2 + jest-runner: 30.0.4 + jest-util: 30.0.2 + jest-validate: 30.0.2 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.0.2 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 24.0.13 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@30.0.4: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.0.1 + chalk: 4.1.2 + pretty-format: 30.0.2 + + jest-docblock@30.0.1: + dependencies: + detect-newline: 3.1.0 + + jest-each@30.0.2: + dependencies: + '@jest/get-type': 30.0.1 + '@jest/types': 30.0.1 + chalk: 4.1.2 + jest-util: 30.0.2 + pretty-format: 30.0.2 + + jest-environment-node@30.0.4: + dependencies: + '@jest/environment': 30.0.4 + '@jest/fake-timers': 30.0.4 + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + jest-mock: 30.0.2 + jest-util: 30.0.2 + jest-validate: 30.0.2 + + jest-haste-map@30.0.2: + dependencies: + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.1 + jest-util: 30.0.2 + jest-worker: 30.0.2 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@30.0.2: + dependencies: + '@jest/get-type': 30.0.1 + pretty-format: 30.0.2 + + jest-matcher-utils@30.0.4: + dependencies: + '@jest/get-type': 30.0.1 + chalk: 4.1.2 + jest-diff: 30.0.4 + pretty-format: 30.0.2 + + jest-message-util@30.0.2: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 30.0.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.0.2 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@30.0.2: + dependencies: + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + jest-util: 30.0.2 + + jest-pnp-resolver@1.2.3(jest-resolve@30.0.2): + optionalDependencies: + jest-resolve: 30.0.2 + + jest-regex-util@30.0.1: {} + + jest-resolve-dependencies@30.0.4: + dependencies: + jest-regex-util: 30.0.1 + jest-snapshot: 30.0.4 + transitivePeerDependencies: + - supports-color + + jest-resolve@30.0.2: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.2 + jest-pnp-resolver: 1.2.3(jest-resolve@30.0.2) + jest-util: 30.0.2 + jest-validate: 30.0.2 + slash: 3.0.0 + unrs-resolver: 1.11.1 + + jest-runner@30.0.4: + dependencies: + '@jest/console': 30.0.4 + '@jest/environment': 30.0.4 + '@jest/test-result': 30.0.4 + '@jest/transform': 30.0.4 + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.4 + jest-haste-map: 30.0.2 + jest-leak-detector: 30.0.2 + jest-message-util: 30.0.2 + jest-resolve: 30.0.2 + jest-runtime: 30.0.4 + jest-util: 30.0.2 + jest-watcher: 30.0.4 + jest-worker: 30.0.2 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@30.0.4: + dependencies: + '@jest/environment': 30.0.4 + '@jest/fake-timers': 30.0.4 + '@jest/globals': 30.0.4 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.0.4 + '@jest/transform': 30.0.4 + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + chalk: 4.1.2 + cjs-module-lexer: 2.1.0 + collect-v8-coverage: 1.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.2 + jest-message-util: 30.0.2 + jest-mock: 30.0.2 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.2 + jest-snapshot: 30.0.4 + jest-util: 30.0.2 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@30.0.4: + dependencies: + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.1 + '@jest/expect-utils': 30.0.4 + '@jest/get-type': 30.0.1 + '@jest/snapshot-utils': 30.0.4 + '@jest/transform': 30.0.4 + '@jest/types': 30.0.1 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + chalk: 4.1.2 + expect: 30.0.4 + graceful-fs: 4.2.11 + jest-diff: 30.0.4 + jest-matcher-utils: 30.0.4 + jest-message-util: 30.0.2 + jest-util: 30.0.2 + pretty-format: 30.0.2 + semver: 7.7.2 + synckit: 0.11.8 + transitivePeerDependencies: + - supports-color + + jest-util@30.0.2: + dependencies: + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + chalk: 4.1.2 + ci-info: 4.3.0 + graceful-fs: 4.2.11 + picomatch: 4.0.2 + + jest-validate@30.0.2: + dependencies: + '@jest/get-type': 30.0.1 + '@jest/types': 30.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.0.2 + + jest-watcher@30.0.4: + dependencies: + '@jest/test-result': 30.0.4 + '@jest/types': 30.0.1 + '@types/node': 24.0.13 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.0.2 + string-length: 4.0.2 + + jest-worker@30.0.2: + dependencies: + '@types/node': 24.0.13 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.0.2 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@30.0.4(@types/node@20.19.7): + dependencies: + '@jest/core': 30.0.4 + '@jest/types': 30.0.1 + import-local: 3.2.0 + jest-cli: 30.0.4(@types/node@20.19.7) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jiti@1.21.7: {} + + jiti@2.4.2: {} + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lage@2.14.6: + dependencies: + glob-hasher: 1.4.2 + optionalDependencies: + fsevents: 2.3.3 + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lexical@0.32.1: {} + + lib0@0.2.109: + dependencies: + isomorphic.js: 0.2.5 + + 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.0.4 + 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: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.castarray@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lz-string@1.5.0: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + markdown-table@3.0.4: {} + + marked@16.0.0: {} + + math-intrinsics@1.1.0: {} + + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.54.0: {} + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mini-svg-data-uri@1.4.4: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp@3.0.1: {} + + ms@2.1.3: {} + + mute-stream@1.0.0: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + napi-postinstall@0.3.0: {} + + natural-compare@1.4.0: {} + + negotiator@1.0.0: {} + + next-tick@1.1.0: {} + + node-int64@0.4.0: {} + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + 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-tmpdir@1.0.2: {} + + outvariant@1.4.0: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-path@7.1.0: + dependencies: + protocols: 2.0.2 + + parse-url@9.2.0: + dependencies: + '@types/parse-path': 7.1.0 + parse-path: 7.1.0 + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@8.2.0: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@2.3.0: {} + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + playwright-core@1.54.1: {} + + playwright@1.54.1: + dependencies: + playwright-core: 1.54.1 + optionalDependencies: + fsevents: 2.3.2 + + possible-typed-array-names@1.1.0: {} + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@4.0.2(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + yaml: 2.8.0 + optionalDependencies: + postcss: 8.5.6 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + pretty-format@30.0.2: + dependencies: + '@jest/schemas': 30.0.1 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prismjs@1.30.0: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + protocols@2.0.2: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + punycode@2.3.1: {} + + pure-rand@7.0.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + react-devtools-inline@4.4.0: + dependencies: + es6-symbol: 3.1.4 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-error-boundary@3.1.4(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.6 + react: 19.1.0 + + react-hook-form@7.60.0(react@19.1.0): + dependencies: + react: 19.1.0 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react-refresh@0.17.0: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.1.8)(react@19.1.0): + dependencies: + react: 19.1.0 + react-style-singleton: 2.2.3(@types/react@19.1.8)(react@19.1.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.8 + + react-remove-scroll@2.7.1(@types/react@19.1.8)(react@19.1.0): + dependencies: + react: 19.1.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.8)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.1.8)(react@19.1.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.8)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.1.8)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + + react-router-dom@7.6.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-router: 7.6.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + + react-router@7.6.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + cookie: 1.0.2 + react: 19.1.0 + set-cookie-parser: 2.7.1 + optionalDependencies: + react-dom: 19.1.0(react@19.1.0) + + react-style-singleton@2.2.3(@types/react@19.1.8)(react@19.1.0): + dependencies: + get-nonce: 1.0.1 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.8 + + react@19.1.0: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + require-directory@2.1.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.1.0: {} + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + rollup@4.45.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.45.0 + '@rollup/rollup-android-arm64': 4.45.0 + '@rollup/rollup-darwin-arm64': 4.45.0 + '@rollup/rollup-darwin-x64': 4.45.0 + '@rollup/rollup-freebsd-arm64': 4.45.0 + '@rollup/rollup-freebsd-x64': 4.45.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.0 + '@rollup/rollup-linux-arm-musleabihf': 4.45.0 + '@rollup/rollup-linux-arm64-gnu': 4.45.0 + '@rollup/rollup-linux-arm64-musl': 4.45.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.0 + '@rollup/rollup-linux-riscv64-gnu': 4.45.0 + '@rollup/rollup-linux-riscv64-musl': 4.45.0 + '@rollup/rollup-linux-s390x-gnu': 4.45.0 + '@rollup/rollup-linux-x64-gnu': 4.45.0 + '@rollup/rollup-linux-x64-musl': 4.45.0 + '@rollup/rollup-win32-arm64-msvc': 4.45.0 + '@rollup/rollup-win32-ia32-msvc': 4.45.0 + '@rollup/rollup-win32-x64-msvc': 4.45.0 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + scheduler@0.26.0: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spawn-command@0.0.2: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + static-browser-server@1.0.3: + dependencies: + '@open-draft/deferred-promise': 2.2.0 + dotenv: 16.6.1 + mime-db: 1.54.0 + outvariant: 1.4.0 + + statuses@2.0.1: {} + + statuses@2.0.2: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + strict-event-emitter@0.4.6: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + style-mod@4.1.2: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.11.8: + dependencies: + '@pkgr/core': 0.2.7 + + tabbable@6.2.0: {} + + tailwindcss@3.4.17: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.0.1(postcss@8.5.6) + postcss-load-config: 4.0.2(postcss@8.5.6) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tailwindcss@4.1.11: {} + + tapable@2.2.2: {} + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmpl@1.0.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tree-kill@1.2.2: {} + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + ts-interface-checker@0.1.13: {} + + ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@30.0.4)(@jest/types@30.0.1)(babel-jest@30.0.4(@babel/core@7.28.0))(jest-util@30.0.2)(jest@30.0.4(@types/node@20.19.7))(typescript@5.8.3): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 30.0.4(@types/node@20.19.7) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.2 + type-fest: 4.41.0 + typescript: 5.8.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.28.0 + '@jest/transform': 30.0.4 + '@jest/types': 30.0.1 + babel-jest: 30.0.4(@babel/core@7.28.0) + jest-util: 30.0.2 + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsutils@3.21.0(typescript@5.8.3): + dependencies: + tslib: 1.14.1 + typescript: 5.8.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.21.3: {} + + type-fest@4.41.0: {} + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + type@2.7.3: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.31.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + typescript@5.8.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + undici-types@7.8.0: {} + + unidiff@1.0.4: + dependencies: + diff: 5.2.0 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.0 + 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.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.3(@types/react@19.1.8)(react@19.1.0): + dependencies: + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.8 + + use-sidecar@1.1.3(@types/react@19.1.8)(react@19.1.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.8 + + util-deprecate@1.0.2: {} + + uuid@11.1.0: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + vary@1.1.2: {} + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vite@5.4.19(@types/node@24.0.13)(lightningcss@1.30.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.45.0 + optionalDependencies: + '@types/node': 24.0.13 + fsevents: 2.3.3 + lightningcss: 1.30.1 + + vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): + dependencies: + esbuild: 0.25.6 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.45.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.0.13 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 + yaml: 2.8.0 + + w3c-keyname@2.2.8: {} + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.1 + + word-wrap@1.2.5: {} + + workspace-tools@0.38.4: + dependencies: + '@yarnpkg/lockfile': 1.1.0 + fast-glob: 3.3.3 + git-url-parse: 16.1.0 + globby: 11.1.0 + jju: 1.4.0 + js-yaml: 4.1.0 + micromatch: 4.0.8 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@5.0.0: {} + + yaml@2.8.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yjs@13.6.27: + dependencies: + lib0: 0.2.109 + + yocto-queue@0.1.0: {} + + yoctocolors-cjs@2.1.2: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..fb44b00f --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: + - 'packages/*' + - 'apps/*' + - 'apps/v1/*' + - 'tools/*' + - 'scripts' \ No newline at end of file diff --git a/scripts/bin/repo-task.js b/scripts/bin/repo-task.js new file mode 100755 index 00000000..c221216a --- /dev/null +++ b/scripts/bin/repo-task.js @@ -0,0 +1,42 @@ +#!/usr/bin/env node + +import { program } from 'commander'; +import { fileURLToPath } from 'url'; +import { dirname, join } from 'path'; +import { existsSync } from 'fs'; +import { spawn } from 'child_process'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const tasksDir = join(__dirname, '..', 'tasks'); + +program + .name('repo-task') + .description('Execute build tasks for Claude Flow monorepo') + .version('1.0.0') + .argument('', 'The task to run (e.g., build, test, lint)') + .option('-w, --watch', 'Run in watch mode') + .option('-p, --prod', 'Run in production mode') + .action(async (task, options) => { + const taskFile = join(tasksDir, `${task}.mjs`); + + if (!existsSync(taskFile)) { + console.error(`Task "${task}" not found. Expected file: ${taskFile}`); + process.exit(1); + } + + // Execute the task file + const args = ['--loader', 'file://' + taskFile]; + if (options.watch) args.push('--watch'); + if (options.prod) args.push('--prod'); + + const proc = spawn('node', [taskFile, ...process.argv.slice(3)], { + stdio: 'inherit', + cwd: process.cwd() + }); + + proc.on('exit', (code) => { + process.exit(code || 0); + }); + }); + +program.parse(); \ No newline at end of file diff --git a/scripts/eslint.config.js b/scripts/eslint.config.js new file mode 100644 index 00000000..976ec418 --- /dev/null +++ b/scripts/eslint.config.js @@ -0,0 +1,11 @@ +import { node } from '@claude-flow/eslint-config'; + +export default [ + ...node, + { + rules: { + // Disable one-export-per-file for scripts which are executable files + '@claude-flow/one-export-per-file': 'off', + }, + }, +]; \ No newline at end of file diff --git a/scripts/package.json b/scripts/package.json new file mode 100644 index 00000000..528cdb66 --- /dev/null +++ b/scripts/package.json @@ -0,0 +1,34 @@ +{ + "name": "@claude-flow/scripts", + "version": "1.0.0", + "private": true, + "type": "module", + "description": "Build scripts and dev dependencies for Claude Flow monorepo", + "bin": { + "repo-task": "./bin/repo-task.js" + }, + "scripts": { + "build": "echo 'No build needed for scripts'", + "test": "echo 'No tests for scripts'", + "lint": "eslint tasks/*.mjs bin/*.js", + "lint:fix": "eslint tasks/*.mjs bin/*.js --fix" + }, + "dependencies": { + "@claude-flow/repo-scripts": "workspace:*", + "chalk": "^5.3.0", + "commander": "^11.1.0", + "esbuild": "^0.19.0", + "eslint": "^9.29.0", + "lage": "^2.14.6", + "typescript": "^5.3.0", + "vite": "^5.0.0", + "@vitejs/plugin-react": "^4.0.0", + "concurrently": "^8.2.0", + "execa": "^8.0.1", + "glob": "^10.0.0", + "rimraf": "^5.0.0" + }, + "devDependencies": { + "@claude-flow/eslint-config": "workspace:*" + } +} \ No newline at end of file diff --git a/scripts/tasks/build-cjs.mjs b/scripts/tasks/build-cjs.mjs new file mode 100644 index 00000000..c1443db6 --- /dev/null +++ b/scripts/tasks/build-cjs.mjs @@ -0,0 +1,6 @@ +#!/usr/bin/env node +import { runBuildCJS } from '@claude-flow/repo-scripts'; + +await runBuildCJS({ + additionalArgs: process.argv.slice(2) +}); \ No newline at end of file diff --git a/scripts/tasks/build.mjs b/scripts/tasks/build.mjs new file mode 100755 index 00000000..5ee0ef88 --- /dev/null +++ b/scripts/tasks/build.mjs @@ -0,0 +1,6 @@ +#!/usr/bin/env node +import { runBuild } from '@claude-flow/repo-scripts'; + +await runBuild({ + additionalArgs: process.argv.slice(2) +}); \ No newline at end of file diff --git a/scripts/tasks/dev.mjs b/scripts/tasks/dev.mjs new file mode 100755 index 00000000..3a19407c --- /dev/null +++ b/scripts/tasks/dev.mjs @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { runDev } from '@claude-flow/repo-scripts'; + +await runDev(); \ No newline at end of file diff --git a/scripts/tasks/lint-fix.mjs b/scripts/tasks/lint-fix.mjs new file mode 100644 index 00000000..63abed99 --- /dev/null +++ b/scripts/tasks/lint-fix.mjs @@ -0,0 +1,6 @@ +#!/usr/bin/env node +import { runLintFix } from '@claude-flow/repo-scripts'; + +await runLintFix({ + additionalArgs: process.argv.slice(2) +}); \ No newline at end of file diff --git a/scripts/tasks/lint.mjs b/scripts/tasks/lint.mjs new file mode 100755 index 00000000..e433efd7 --- /dev/null +++ b/scripts/tasks/lint.mjs @@ -0,0 +1,6 @@ +#!/usr/bin/env node +import { runLint } from '@claude-flow/repo-scripts'; + +await runLint({ + additionalArgs: process.argv.slice(2) +}); \ No newline at end of file diff --git a/scripts/tasks/test.mjs b/scripts/tasks/test.mjs new file mode 100755 index 00000000..4c41ae45 --- /dev/null +++ b/scripts/tasks/test.mjs @@ -0,0 +1,6 @@ +#!/usr/bin/env node +import { runTest } from '@claude-flow/repo-scripts'; + +await runTest({ + additionalArgs: process.argv.slice(2) +}); \ No newline at end of file diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json new file mode 100644 index 00000000..e0321ff4 --- /dev/null +++ b/scripts/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@claude-flow/tsconfig/node.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true + }, + "include": ["**/*.js", "**/*.mjs", "**/*.ts", "**/*.json"], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/server-logs-analysis.txt b/server-logs-analysis.txt deleted file mode 100644 index 5aa38bd3..00000000 --- a/server-logs-analysis.txt +++ /dev/null @@ -1,62 +0,0 @@ -=== RECENT CLAUDE MESSAGES === -} -[2025-07-08T05:41:25.334Z] Initiating greeting generation for new session -[2025-07-08T05:41:25.334Z] Greeting session data: { - "userName": "", - "projectPath": "/tmp/e2e-test-workspace-1751953282680/projects/test-project", - "repoName": "hello-world-1" -} -[2025-07-08T05:41:25.334Z] Created greeting message ID: 3f9998d1-8f8c-4161-b399-62b285464c9d -[2025-07-08T05:41:25.334Z] Sending greeting to 1 connections for session project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae -[2025-07-08T05:41:25.334Z] Sent message-start to connection project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae-1751953285333-0.3790977305277222 -[2025-07-08T05:41:25.334Z] Claude service available: true -[2025-07-08T05:41:25.334Z] Calling processClaudeCodeMessage for greeting -[2025-07-08T05:41:29.800Z] Greeting response: { - "text": "Hey Developer! Welcome back to hello-world-1 - it's getting late but I'm here to help you make progress on test-project. What would you like to work on tonight?", - "toolExecutions": [], - "tokenUsage": { - "inputTokens": 225, - "outputTokens": 40, - "totalTokens": 265 - }, - "error": null -} -[2025-07-08T05:41:29.800Z] Response text type: string -[2025-07-08T05:41:29.850Z] Sending greeting to 1 connections -[2025-07-08T05:41:29.850Z] Sending chunk with messageId: 3f9998d1-8f8c-4161-b399-62b285464c9d to connection project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae-1751953285333-0.3790977305277222 -[2025-07-08T05:41:29.850Z] Sent greeting chunk to connection project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae-1751953285333-0.3790977305277222 -[2025-07-08T05:41:29.851Z] Sending message-complete to 1 connections -[2025-07-08T05:41:29.851Z] Sent message-complete to connection project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae-1751953285333-0.3790977305277222 -[2025-07-08T05:41:29.851Z] Greeting generation completed and marked - - -=== RECENT EVENTS === -[2025-07-08T05:41:04.854Z] CLAUDE_SSE_CONNECTED | Claude Code SSE client connected | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 connectionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 totalConnections:1 removedStale:0 -[2025-07-08T05:41:07.342Z] CLAUDE_GREETING_GENERATED | Greeting message sent | sessionId:project--tmp-e2e-test-workspace-1751953258875-projects-test-project-hello-world-1-6f055791-5096-4672-a539-e58c6897c5b0 greetingLength:103 activeConnections:0 -[2025-07-08T05:41:09.118Z] CLAUDE_GREETING_GENERATED | Greeting message sent | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 greetingLength:129 activeConnections:1 -[2025-07-08T05:41:09.529Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 connectionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 remainingConnections:0 -[2025-07-08T05:41:09.529Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 connectionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 remainingConnections:0 -[2025-07-08T05:41:09.529Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94 connectionId:project--tmp-e2e-test-workspace-1751953262163-projects-test-project-hello-world-1-24d4f3b4-22de-4f73-9212-02f9ebb1dc94-1751953264853-0.7106632449197724 remainingConnections:0 -[2025-07-08T05:41:09.784Z] SSE_SUBSCRIBE | New SSE client connected | clientId:c9a8ed75-8805-4415-bde0-6e8a640d4fee -[2025-07-08T05:41:09.784Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:41:10.009Z] SSE_SUBSCRIBE | New SSE client connected | clientId:7d40efd5-0e30-4302-8c5b-c6f9a3ed02f4 -[2025-07-08T05:41:10.009Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:41:11.712Z] CLIENT_REQUEST | POST /api/claude/code/start | sessionId:undefined -[2025-07-08T05:41:11.715Z] CLAUDE_SESSION_CREATED | New Claude Code session | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f repoName:hello-world-1 userName: projectPath:/tmp/e2e-test-workspace-1751953269554/projects/test-project -[2025-07-08T05:41:11.715Z] CLIENT_RESPONSE | Status: 200 | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f -[2025-07-08T05:41:12.217Z] CLIENT_REQUEST | GET /api/claude/code/stream | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f -[2025-07-08T05:41:12.217Z] CLAUDE_SSE_CONNECTED | Claude Code SSE client connected | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f connectionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 totalConnections:1 removedStale:0 -[2025-07-08T05:41:17.071Z] CLAUDE_GREETING_GENERATED | Greeting message sent | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f greetingLength:88 activeConnections:1 -[2025-07-08T05:41:22.576Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f connectionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 remainingConnections:0 -[2025-07-08T05:41:22.576Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f connectionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 remainingConnections:0 -[2025-07-08T05:41:22.576Z] CLAUDE_SSE_DISCONNECTED | Claude Code SSE client disconnected | sessionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f connectionId:project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f-1751953272216-0.9847940645735959 remainingConnections:0 -[2025-07-08T05:41:22.911Z] SSE_SUBSCRIBE | New SSE client connected | clientId:e84f222b-afe6-4fe5-8a26-8990b0fb6d5b -[2025-07-08T05:41:22.911Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:41:23.129Z] SSE_SUBSCRIBE | New SSE client connected | clientId:4b6d0417-42ae-4802-a35f-da3b6ff3d986 -[2025-07-08T05:41:23.129Z] CLIENT_REQUEST | GET /api/sse/subscribe | sessionId:undefined -[2025-07-08T05:41:24.825Z] CLIENT_REQUEST | POST /api/claude/code/start | sessionId:undefined -[2025-07-08T05:41:24.832Z] CLAUDE_SESSION_CREATED | New Claude Code session | sessionId:project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae repoName:hello-world-1 userName: projectPath:/tmp/e2e-test-workspace-1751953282680/projects/test-project -[2025-07-08T05:41:24.832Z] CLIENT_RESPONSE | Status: 200 | sessionId:project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae -[2025-07-08T05:41:25.334Z] CLIENT_REQUEST | GET /api/claude/code/stream | sessionId:project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae -[2025-07-08T05:41:25.334Z] CLAUDE_SSE_CONNECTED | Claude Code SSE client connected | sessionId:project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae connectionId:project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae-1751953285333-0.3790977305277222 totalConnections:1 removedStale:0 -[2025-07-08T05:41:29.851Z] CLAUDE_GREETING_GENERATED | Greeting message sent | sessionId:project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae greetingLength:160 activeConnections:1 diff --git a/server/sessions/project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f.json b/server/sessions/project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f.json deleted file mode 100644 index 02270bd1..00000000 --- a/server/sessions/project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "sessionId": "project--tmp-e2e-test-workspace-1751953269554-projects-test-project-hello-world-1-85a1356a-e9f1-4921-88aa-dd3c382d8b7f", - "projectId": "project--tmp-e2e-test-workspace-1751953269554-projects-test-project", - "repoName": "hello-world-1", - "userName": "", - "projectPath": "/tmp/e2e-test-workspace-1751953269554/projects/test-project", - "messages": [ - { - "id": "077e13a2-5935-44f8-8200-2f8d62d19dcc", - "role": "assistant", - "content": "Hey Developer! Ready to dive into hello-world-1 tonight? What would you like to work on?", - "isGreeting": true, - "timestamp": "2025-07-08T05:41:17.071Z" - } - ], - "greetingShown": true, - "greetingInProgress": false, - "createdAt": "2025-07-08T05:41:11.715Z", - "updatedAt": "2025-07-08T05:41:17.071Z", - "maxTokens": 200000, - "contextTokens": 0, - "tokenUsage": { - "input": 0, - "output": 0 - } -} \ No newline at end of file diff --git a/server/sessions/project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae.json b/server/sessions/project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae.json deleted file mode 100644 index 281c3a60..00000000 --- a/server/sessions/project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "sessionId": "project--tmp-e2e-test-workspace-1751953282680-projects-test-project-hello-world-1-0ec345c5-313f-4d64-a584-9feecf7e48ae", - "projectId": "project--tmp-e2e-test-workspace-1751953282680-projects-test-project", - "repoName": "hello-world-1", - "userName": "", - "projectPath": "/tmp/e2e-test-workspace-1751953282680/projects/test-project", - "messages": [ - { - "id": "3f9998d1-8f8c-4161-b399-62b285464c9d", - "role": "assistant", - "content": "Hey Developer! Welcome back to hello-world-1 - it's getting late but I'm here to help you make progress on test-project. What would you like to work on tonight?", - "isGreeting": true, - "timestamp": "2025-07-08T05:41:29.850Z" - } - ], - "greetingShown": true, - "greetingInProgress": false, - "createdAt": "2025-07-08T05:41:24.832Z", - "updatedAt": "2025-07-08T05:41:29.851Z", - "maxTokens": 200000, - "contextTokens": 0, - "tokenUsage": { - "input": 0, - "output": 0 - } -} \ No newline at end of file diff --git a/server/sessions/project--tmp-e2e-test-workspace-1751953290132-projects-test-project-hello-world-1-d7b4a5ed-5ae5-45a4-8949-bf71a7be14c9.json b/server/sessions/project--tmp-e2e-test-workspace-1751953290132-projects-test-project-hello-world-1-d7b4a5ed-5ae5-45a4-8949-bf71a7be14c9.json deleted file mode 100644 index 7f0c7f25..00000000 --- a/server/sessions/project--tmp-e2e-test-workspace-1751953290132-projects-test-project-hello-world-1-d7b4a5ed-5ae5-45a4-8949-bf71a7be14c9.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sessionId": "project--tmp-e2e-test-workspace-1751953290132-projects-test-project-hello-world-1-d7b4a5ed-5ae5-45a4-8949-bf71a7be14c9", - "projectId": "project--tmp-e2e-test-workspace-1751953290132-projects-test-project", - "repoName": "hello-world-1", - "userName": "", - "projectPath": "/tmp/e2e-test-workspace-1751953290132/projects/test-project", - "messages": [ - { - "role": "user", - "content": "Hello Claude!", - "timestamp": "2025-07-08T05:41:32.832Z" - }, - { - "role": "assistant", - "content": "Hello! I'm Claude Code, ready to help with your software engineering tasks. What would you like to work on today?", - "timestamp": "2025-07-08T05:41:37.057Z" - }, - { - "id": "8a9a7f86-ba6e-4ae1-b29b-7ffd7451e8e7", - "role": "assistant", - "content": "Hey Developer! Working on hello-world-1 this evening? Let's make some progress together. What would you like to work on?", - "isGreeting": true, - "timestamp": "2025-07-08T05:41:37.252Z" - } - ], - "greetingShown": true, - "greetingInProgress": false, - "createdAt": "2025-07-08T05:41:32.281Z", - "updatedAt": "2025-07-08T05:41:37.252Z", - "maxTokens": 200000, - "contextTokens": 14, - "tokenUsage": { - "input": 0, - "output": 0 - } -} \ No newline at end of file diff --git a/server/sessions/project--tmp-e2e-test-workspace-1751953297362-projects-test-project-hello-world-1-3c3ff380-8a55-454a-a10a-3db594bbb0b8.json b/server/sessions/project--tmp-e2e-test-workspace-1751953297362-projects-test-project-hello-world-1-3c3ff380-8a55-454a-a10a-3db594bbb0b8.json deleted file mode 100644 index 88fb2a07..00000000 --- a/server/sessions/project--tmp-e2e-test-workspace-1751953297362-projects-test-project-hello-world-1-3c3ff380-8a55-454a-a10a-3db594bbb0b8.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "sessionId": "project--tmp-e2e-test-workspace-1751953297362-projects-test-project-hello-world-1-3c3ff380-8a55-454a-a10a-3db594bbb0b8", - "projectId": "project--tmp-e2e-test-workspace-1751953297362-projects-test-project", - "repoName": "hello-world-1", - "userName": "", - "projectPath": "/tmp/e2e-test-workspace-1751953297362/projects/test-project", - "messages": [ - { - "id": "3f04a163-074b-4591-8c58-ae7c68dfd7c1", - "role": "assistant", - "content": "Hey Developer! Ready to dive into hello-world-1? Let's make some code magic happen tonight. What would you like to work on?", - "isGreeting": true, - "timestamp": "2025-07-08T05:41:44.323Z" - } - ], - "greetingShown": true, - "greetingInProgress": false, - "createdAt": "2025-07-08T05:41:39.498Z", - "updatedAt": "2025-07-08T05:41:44.323Z", - "maxTokens": 200000, - "contextTokens": 0, - "tokenUsage": { - "input": 0, - "output": 0 - } -} \ No newline at end of file diff --git a/server/sessions/project--tmp-e2e-test-workspace-1751953305400-projects-test-project-hello-world-1-06bd4097-4811-49ee-876b-5c1b3cad3b0d.json b/server/sessions/project--tmp-e2e-test-workspace-1751953305400-projects-test-project-hello-world-1-06bd4097-4811-49ee-876b-5c1b3cad3b0d.json deleted file mode 100644 index 7411a428..00000000 --- a/server/sessions/project--tmp-e2e-test-workspace-1751953305400-projects-test-project-hello-world-1-06bd4097-4811-49ee-876b-5c1b3cad3b0d.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "sessionId": "project--tmp-e2e-test-workspace-1751953305400-projects-test-project-hello-world-1-06bd4097-4811-49ee-876b-5c1b3cad3b0d", - "projectId": "project--tmp-e2e-test-workspace-1751953305400-projects-test-project", - "repoName": "hello-world-1", - "userName": "", - "projectPath": "/tmp/e2e-test-workspace-1751953305400/projects/test-project", - "messages": [ - { - "role": "user", - "content": "Say \"Hello **world**!\" with the word world in bold markdown", - "timestamp": "2025-07-08T05:41:49.283Z" - }, - { - "role": "assistant", - "content": "Hello **world**!", - "timestamp": "2025-07-08T05:41:52.888Z" - }, - { - "id": "7f29401a-dbdb-4a32-bfaa-29b70c022e4d", - "role": "assistant", - "content": "Hey Developer! Welcome to hello-world-1 - great to see you coding at this hour! What would you like to work on tonight?", - "isGreeting": true, - "timestamp": "2025-07-08T05:41:52.968Z" - } - ], - "greetingShown": true, - "greetingInProgress": false, - "createdAt": "2025-07-08T05:41:47.545Z", - "updatedAt": "2025-07-08T05:41:52.968Z", - "maxTokens": 200000, - "contextTokens": 37, - "tokenUsage": { - "input": 0, - "output": 0 - } -} \ No newline at end of file diff --git a/start-dev.sh b/start-dev.sh deleted file mode 100755 index f97419a3..00000000 --- a/start-dev.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -# Start both the frontend and mock server for development - -echo "Starting development servers..." -echo "" - -# Function to kill processes on exit -cleanup() { - echo "" - echo "Shutting down servers..." - kill $SERVER_PID $FRONTEND_PID 2>/dev/null - exit -} - -# Set up trap to clean up on script exit -trap cleanup EXIT INT TERM - -# Start the mock server -echo "Starting mock server on port 3000..." -cd server && npm run mock & -SERVER_PID=$! - -# Give the server a moment to start -sleep 2 - -# Start the frontend dev server -echo "" -echo "Starting frontend on port 5173..." -cd .. && npm run dev & -FRONTEND_PID=$! - -echo "" -echo "✅ Both servers are running!" -echo "" -echo "Frontend: http://localhost:5173" -echo "Mock API: http://localhost:3000" -echo "" -echo "Press Ctrl+C to stop both servers" -echo "" - -# Wait for both processes -wait \ No newline at end of file diff --git a/tools/repo-scripts/bin/repo-scripts.js b/tools/repo-scripts/bin/repo-scripts.js new file mode 100755 index 00000000..9f6bccd7 --- /dev/null +++ b/tools/repo-scripts/bin/repo-scripts.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { cli } from '../lib/index.js'; + +cli(); \ No newline at end of file diff --git a/tools/repo-scripts/eslint.config.js b/tools/repo-scripts/eslint.config.js new file mode 100644 index 00000000..7277fd1a --- /dev/null +++ b/tools/repo-scripts/eslint.config.js @@ -0,0 +1,38 @@ +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import globals from 'globals'; + +export default tseslint.config( + js.configs.recommended, + ...tseslint.configs.recommended, + { + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + parserOptions: { + project: true, + }, + globals: { + ...globals.node, + ...globals.es2022, + }, + }, + rules: { + // TypeScript rules + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/consistent-type-imports': [ + 'error', + { + prefer: 'type-imports', + fixStyle: 'inline-type-imports', + }, + ], + '@typescript-eslint/no-import-type-side-effects': 'error', + }, + }, + { + ignores: ['bin/**', 'lib/**', 'node_modules/**', '**/*.d.ts'], + } +); \ No newline at end of file diff --git a/tools/repo-scripts/package.json b/tools/repo-scripts/package.json new file mode 100644 index 00000000..513b74fd --- /dev/null +++ b/tools/repo-scripts/package.json @@ -0,0 +1,45 @@ +{ + "name": "@claude-flow/repo-scripts", + "version": "1.0.0", + "private": true, + "description": "CLI tools for Claude Flow monorepo", + "type": "module", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "bin": { + "repo-scripts": "./bin/repo-scripts.js" + }, + "files": [ + "bin", + "lib", + "templates" + ], + "scripts": { + "build": "tsc -b", + "lint": "eslint src/**/*.ts bin/*.js", + "lint:fix": "eslint src/**/*.ts bin/*.js --fix", + "clean": "node -e \"import('fs').then(fs => fs.rmSync('lib', { recursive: true, force: true }))\"", + "test": "echo 'No tests for repo-scripts'", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "chalk": "^5.3.0", + "commander": "^12.0.0", + "inquirer": "^9.2.0", + "execa": "^8.0.0", + "fs-extra": "^11.2.0", + "glob": "^10.3.0", + "concurrently": "^8.2.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@types/inquirer": "^9.0.0", + "@types/fs-extra": "^11.0.0", + "@claude-flow/tsconfig": "workspace:*", + "typescript": "^5.3.0", + "eslint": "^9.0.0", + "@eslint/js": "^9.29.0", + "typescript-eslint": "^8.34.1", + "globals": "^16.2.0" + } +} \ No newline at end of file diff --git a/tools/repo-scripts/src/index.ts b/tools/repo-scripts/src/index.ts new file mode 100644 index 00000000..095af0ed --- /dev/null +++ b/tools/repo-scripts/src/index.ts @@ -0,0 +1,112 @@ +import chalk from 'chalk'; +import { program } from 'commander'; +import { readdirSync } from 'fs'; +import { join } from 'path'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import type { Task } from './types.js'; + +// Re-export utilities for scripts +export { runScript } from './utilities/runScript.js'; +export { getPackageData } from './utilities/getPackageData.js'; +export { getJestConfigPath } from './utilities/getJestConfigPath.js'; + +const __dirname = fileURLToPath(new URL('.', import.meta.url)); + +async function loadTasks(): Promise { + const tasksDir = join(__dirname, 'tasks'); + const taskFiles = readdirSync(tasksDir).filter(file => file.endsWith('.js')); + + const tasks: Task[] = []; + + for (const file of taskFiles) { + try { + const module = await import(join(tasksDir, file)); + // Handle both default and named exports + const taskName = file.replace('.js', '').replace(/-./g, x => x[1]?.toUpperCase() || ''); + const task = module.default || module[taskName]; + if (task && task.command) { + tasks.push(task); + } + } catch (error) { + console.warn(`Failed to load task from ${file}:`, error); + } + } + + return tasks; +} + +export async function cli(): Promise { + program + .name('repo-scripts') + .description('Claude Flow monorepo CLI') + .version('1.0.0'); + + // Load all tasks dynamically + const tasks = await loadTasks(); + + // Register each task as a command + for (const task of tasks) { + const cmd = program.command(task.command).description(task.description); + + // Add options if any + if (task.options) { + for (const option of task.options) { + cmd.option(option.flag, option.description, option.defaultValue); + } + } + + // Set the action + cmd.action(async () => { + try { + // Extract additional args that aren't part of the parsed options + const additionalArgs = program.args.slice(1); + + // If task doesn't handle its own output, show start message + if (!task.quiet) { + const packageData = await import('./utilities/getPackageData.js').then(m => m.getPackageData(process.cwd())); + const packageName = packageData.packageJson.name || path.basename(process.cwd()); + console.log(chalk.cyan(`[${chalk.bold(task.command)}]`) + ' ' + packageName); + } + + const result = await task.execute(additionalArgs); + + // Handle structured results + if (result) { + const prefix = result.success + ? chalk.green(`[${chalk.bold(task.command)}]`) + : chalk.red(`[${chalk.bold(task.command)}]`); + + const icon = result.success ? chalk.green('✓') : chalk.red('✗'); + const message = `${prefix} ${icon} ${result.summary || (result.success ? 'completed successfully' : 'failed')}`; + + console.log(message); + + if (!result.success) { + process.exit(1); + } + } else if (!task.quiet) { + // For tasks that don't return results, show generic success + console.log(chalk.green(`[${chalk.bold(task.command)}]`) + ' ' + chalk.green('✓ completed successfully')); + } + } catch (error) { + console.error(chalk.red(`Error executing ${task.command}:`), error); + process.exit(1); + } + }); + } + + program.parse(); +} + +// Export individual task runners for programmatic use +export async function runTask(taskName: string, additionalArgs: string[] = []): Promise { + const tasks = await loadTasks(); + const task = tasks.find(t => t.command.split(' ')[0] === taskName); + + if (!task) { + throw new Error(`Task "${taskName}" not found`); + } + + await task.execute(additionalArgs); +} diff --git a/tools/repo-scripts/src/tasks/build-cjs.ts b/tools/repo-scripts/src/tasks/build-cjs.ts new file mode 100644 index 00000000..f70fb59c --- /dev/null +++ b/tools/repo-scripts/src/tasks/build-cjs.ts @@ -0,0 +1,42 @@ +import { build } from './build.js'; +import fs from 'fs'; +import path from 'path'; +import { globSync } from 'tinyglobby'; +import type { Task } from '../types.js'; + +const buildCJS: Task = { + command: 'build-cjs', + description: 'Build CommonJS output', + execute: async function buildCJS(additionalArgs = []) { + await build.execute([ + '--module', + 'commonjs', + '--moduleResolution', + 'node10', + '--outDir', + 'lib-commonjs', + '--verbatimModuleSyntax', + 'false', + ...additionalArgs, + ]); + + // rename all the .js files to .cjs + const jsFiles = globSync('lib-commonjs/**/*.js', { cwd: process.cwd() }); + + for (const jsFile of jsFiles) { + const fullPath = path.join(process.cwd(), jsFile); + const cjsFile = fullPath.replace(/\.js$/, '.cjs'); + + fs.renameSync(fullPath, cjsFile); + + // Replace require("./*.js") with require("./*.cjs"). + // TS output is predictable enough that we don't need to use a full codemod library for this. + const newContents = fs + .readFileSync(cjsFile, 'utf-8') + .replace(/require\(["'](\.[^"']+)\.js["']\)/g, (_match, p1) => `require("${p1}.cjs")`); + fs.writeFileSync(cjsFile, newContents); + } + } +}; + +export { buildCJS }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/build.ts b/tools/repo-scripts/src/tasks/build.ts new file mode 100644 index 00000000..61da177b --- /dev/null +++ b/tools/repo-scripts/src/tasks/build.ts @@ -0,0 +1,43 @@ +import { runScript } from '../utilities/runScript.js'; +import fs from 'fs'; +import path from 'path'; +import { getPackageData } from '../utilities/getPackageData.js'; +import type { Task } from '../types.js'; + +const build: Task = { + command: 'build', + description: 'Build packages with TypeScript', + options: [ + { flag: '--clean', description: 'Clean output directory before building' } + ], + execute: async function build(additionalArgs = []) { + // --pretty must be manually specified when running programmatically + // (it's not respected from the config) + const tsArgs = ['-b']; + + const { packageJson } = getPackageData(process.cwd()); + + if (packageJson.name === '@claude-flow/scripts') { + // Building the scripts package which doesn't have a src directory or emitted code + tsArgs.push('--noEmit'); + } else { + // For normal packages, we just use -b to build with project references + // Clean the output directory if --clean is passed + const cleanIndex = additionalArgs.indexOf('--clean'); + if (cleanIndex !== -1) { + const outDir = 'lib'; + fs.rmSync(path.join(process.cwd(), outDir), { force: true, recursive: true }); + // Don't pass --clean to TS + additionalArgs.splice(cleanIndex, 1); + } + } + + return runScript({ + packageName: 'typescript', + name: 'tsc', + args: [...tsArgs, ...additionalArgs], + }); +} +}; + +export { build }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/clean.ts b/tools/repo-scripts/src/tasks/clean.ts new file mode 100644 index 00000000..b4f4e8cd --- /dev/null +++ b/tools/repo-scripts/src/tasks/clean.ts @@ -0,0 +1,35 @@ +import { rm } from 'fs/promises'; +import { resolve } from 'path'; +import { existsSync } from 'fs'; +import chalk from 'chalk'; +import type { Task } from '../types.js'; + +const clean: Task = { + command: 'clean', + description: 'Clean build output directories (lib, dist, lib-commonjs)', + execute: async function clean(additionalArgs = []) { + const cwd = process.cwd(); + const dirsToClean = ['lib', 'dist', 'lib-commonjs']; + + // Add any additional directories from arguments + if (additionalArgs.length > 0) { + dirsToClean.push(...additionalArgs); + } + + for (const dir of dirsToClean) { + const dirPath = resolve(cwd, dir); + if (existsSync(dirPath)) { + try { + await rm(dirPath, { recursive: true, force: true }); + console.log(chalk.green(`✓ Removed ${dir}`)); + } catch (error) { + console.error(chalk.red(`✗ Failed to remove ${dir}:`), error); + } + } else { + console.log(chalk.gray(`- ${dir} not found, skipping`)); + } + } + } +}; + +export { clean }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/dev.ts b/tools/repo-scripts/src/tasks/dev.ts new file mode 100644 index 00000000..4701b081 --- /dev/null +++ b/tools/repo-scripts/src/tasks/dev.ts @@ -0,0 +1,58 @@ +import chalk from 'chalk'; +import inquirer from 'inquirer'; +import { execa } from 'execa'; +import type { Task } from '../types.js'; + +const dev: Task = { + command: 'dev', + description: 'Start development mode with interactive menu', + execute: async () => { + const { choice } = await inquirer.prompt([ + { + type: 'list', + name: 'choice', + message: 'What would you like to run?', + choices: [ + { name: 'V1 Application (port 3000)', value: 'v1' }, + { name: 'V2 Application (port 4000)', value: 'v2' }, + { name: 'Both V1 and V2', value: 'both' }, + { name: 'Storybook (port 6006)', value: 'storybook' }, + ], + }, + ]); + + switch (choice) { + case 'v1': + console.log(chalk.blue('Starting V1 application...')); + await execa('npx', ['concurrently', '-n', 'client,server', '-c', 'cyan,green', + 'pnpm --filter @claude-flow/v1-client dev', + 'pnpm --filter @claude-flow/v1-server dev' + ], { + stdio: 'inherit', + cwd: process.cwd() + }); + break; + case 'v2': + console.log(chalk.blue('Starting V2 application...')); + console.log(chalk.yellow('V2 not yet implemented')); + break; + case 'both': + console.log(chalk.blue('Starting both V1 and V2...')); + console.log(chalk.yellow('V2 not yet implemented, starting V1 only')); + await execa('npx', ['concurrently', '-n', 'client,server', '-c', 'cyan,green', + 'pnpm --filter @claude-flow/v1-client dev', + 'pnpm --filter @claude-flow/v1-server dev' + ], { + stdio: 'inherit', + cwd: process.cwd() + }); + break; + case 'storybook': + console.log(chalk.blue('Starting Storybook...')); + console.log(chalk.yellow('Storybook not yet implemented')); + break; + } + } +}; + +export { dev }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/lint-fix.ts b/tools/repo-scripts/src/tasks/lint-fix.ts new file mode 100644 index 00000000..34cb2152 --- /dev/null +++ b/tools/repo-scripts/src/tasks/lint-fix.ts @@ -0,0 +1,12 @@ +import { lint } from './lint.js'; +import type { Task } from '../types.js'; + +const lintFix: Task = { + command: 'lint-fix', + description: 'Run ESLint and automatically fix issues', + execute: async function lintFix(additionalArgs = []) { + return lint.execute(['--fix', ...additionalArgs]); + } +}; + +export { lintFix }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/lint.ts b/tools/repo-scripts/src/tasks/lint.ts new file mode 100644 index 00000000..0e27ad61 --- /dev/null +++ b/tools/repo-scripts/src/tasks/lint.ts @@ -0,0 +1,122 @@ +import fs from 'fs'; +import path from 'path'; +import { spawn } from 'child_process'; +import chalk from 'chalk'; +import { getPackageData } from '../utilities/getPackageData.js'; +import type { Task, TaskResult } from '../types.js'; + +const lint: Task = { + command: 'lint', + description: 'Run ESLint on source files', + quiet: true, // This task handles its own output + execute: async function lint(additionalArgs = []): Promise { + const cwd = process.cwd(); + const configPath = [path.join(cwd, 'eslint.config.js'), path.join(cwd, 'eslint.config.mjs')].find((name) => + fs.existsSync(name), + ); + + if (!configPath) { + throw new Error('Could not find eslint config relative to ' + cwd); + } + + const srcPath = path.join(cwd, 'src'); + + // Get package info for display + const packageInfo = getPackageData(cwd); + const packageName = packageInfo.packageJson.name || path.basename(cwd); + + // Display start message + console.log(chalk.cyan(`[${chalk.bold('lint')}]`) + ' ' + packageName); + + // Find ESLint binary + const { getPackageData: getPkgData } = await import('../utilities/getPackageData.js'); + const eslintPkg = getPkgData({ name: 'eslint', fromPath: cwd }); + const eslintPath = path.join(eslintPkg.packageRoot, 'bin/eslint.js'); + + const args = [ + eslintPath, + fs.existsSync(srcPath) ? srcPath : cwd, + '--config', + configPath, + '--color', + '--max-warnings', + '0', + ...additionalArgs, + ]; + + return new Promise((resolve, reject) => { + let output = ''; + + const proc = spawn('node', args, { + cwd, + env: process.env, + }); + + proc.stdout?.on('data', (data) => { + const str = data.toString(); + output += str; + process.stdout.write(data); + }); + + proc.stderr?.on('data', (data) => { + process.stderr.write(data); + }); + + proc.on('close', (code) => { + // Parse ESLint output for summary + const problemMatch = output.match(/(\d+)\s+problems?\s+\((\d+)\s+errors?,\s+(\d+)\s+warnings?\)/); + const fixableMatch = output.match(/(\d+)\s+errors?\s+and\s+(\d+)\s+warnings?\s+potentially\s+fixable/); + + if (code === 0) { + resolve({ + success: true, + summary: 'completed successfully', + }); + } else if (problemMatch) { + const [, , errors, warnings] = problemMatch; + const errorCount = parseInt(errors || '0', 10); + const warningCount = parseInt(warnings || '0', 10); + + const parts = []; + + if (errorCount > 0) { + parts.push(chalk.red(`${errorCount} error${errorCount !== 1 ? 's' : ''}`) ); + } + if (warningCount > 0) { + parts.push(chalk.yellow(`${warningCount} warning${warningCount !== 1 ? 's' : ''}`) ); + } + + if (fixableMatch) { + const [, fixableErrors, fixableWarnings] = fixableMatch; + const totalFixable = parseInt(fixableErrors || '0', 10) + parseInt(fixableWarnings || '0', 10); + if (totalFixable > 0) { + parts.push(chalk.dim(`${totalFixable} fixable`)); + } + } + + resolve({ + success: false, + summary: parts.join(', '), + details: { + errors: errorCount, + warnings: warningCount, + fixable: fixableMatch ? parseInt(fixableMatch[1] || '0', 10) + parseInt(fixableMatch[2] || '0', 10) : undefined, + }, + }); + } else { + // Fallback for unknown format + resolve({ + success: false, + summary: 'failed', + }); + } + }); + + proc.on('error', (err) => { + reject(err); + }); + }); +} +}; + +export { lint }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/scaffold.ts b/tools/repo-scripts/src/tasks/scaffold.ts new file mode 100644 index 00000000..a2ac7076 --- /dev/null +++ b/tools/repo-scripts/src/tasks/scaffold.ts @@ -0,0 +1,15 @@ +import chalk from 'chalk'; +import type { Task } from '../types.js'; + +const scaffold: Task = { + command: 'scaffold ', + description: 'Create a new package from template', + execute: async (additionalArgs = []) => { + const type = additionalArgs[0]; + console.log(chalk.blue(`Scaffolding new ${type}...`)); + // TODO: Implement scaffolding logic + console.log(chalk.yellow('Scaffolding not yet implemented')); + } +}; + +export { scaffold }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/test.ts b/tools/repo-scripts/src/tasks/test.ts new file mode 100644 index 00000000..92ce3fbe --- /dev/null +++ b/tools/repo-scripts/src/tasks/test.ts @@ -0,0 +1,75 @@ +import { findPackageRoot } from 'workspace-tools'; +import { existsSync } from 'fs'; +import { resolve } from 'path'; +import { spawn } from 'child_process'; +import { getJestConfigPath } from '../utilities/getJestConfigPath.js'; +import { runScript } from '../utilities/runScript.js'; +import type { Task } from '../types.js'; + +const test: Task = { + command: 'test', + description: 'Run tests using Jest or Node.js test runner', + execute: async function test(additionalArgs = []) { + const packageRoot = findPackageRoot(process.cwd()) || process.cwd(); + + // Check if this package uses Jest + try { + const configPath = getJestConfigPath(packageRoot); + + // Run Jest + return runScript({ + packageName: 'jest', + nodeArgs: ['--experimental-vm-modules'], + args: [ + '--config', + configPath, + '--rootDir', + packageRoot, + '--forceExit', + // '--detectOpenHandles', + ...additionalArgs, + ], + env: { + NODE_ENV: 'test', + }, + }); + } catch { + // No Jest config found, try Node test runner + const testPattern = existsSync(resolve(packageRoot, 'tests')) ? 'tests/**/*.test.js' : + existsSync(resolve(packageRoot, 'src')) ? 'src/**/*.test.ts' : null; + + if (!testPattern) { + console.log(`No tests found in ${packageRoot}`); + return; + } + + // Run tests using node test runner + console.log(`Running tests with Node.js test runner: ${testPattern}`); + + return new Promise((resolve, reject) => { + const result = spawn('node', ['--test', testPattern, ...additionalArgs], { + cwd: packageRoot, + stdio: 'inherit', + env: { + ...process.env, + NODE_ENV: 'test', + }, + }); + + result.on('exit', (code) => { + if (code === 0) { + resolve(); + } else { + reject(new Error(`Node test runner exited with code ${code}`)); + } + }); + + result.on('error', (e) => { + reject(e); + }); + }); + } +} +}; + +export { test }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/typecheck.ts b/tools/repo-scripts/src/tasks/typecheck.ts new file mode 100644 index 00000000..78bfe80f --- /dev/null +++ b/tools/repo-scripts/src/tasks/typecheck.ts @@ -0,0 +1,17 @@ +import { runScript } from '../utilities/runScript.js'; +import type { Task } from '../types.js'; + +const typecheck: Task = { + command: 'typecheck', + description: 'Run TypeScript type checking', + execute: async (additionalArgs = []) => { + // Run TypeScript with --noEmit to just check types + return runScript({ + packageName: 'typescript', + name: 'tsc', + args: ['--noEmit', ...additionalArgs], + }); + } +}; + +export { typecheck }; \ No newline at end of file diff --git a/tools/repo-scripts/src/types.ts b/tools/repo-scripts/src/types.ts new file mode 100644 index 00000000..72c6a6ce --- /dev/null +++ b/tools/repo-scripts/src/types.ts @@ -0,0 +1,28 @@ +export interface TaskResult { + success: boolean; + summary?: string; + details?: { + errors?: number; + warnings?: number; + fixable?: number; + [key: string]: any; + }; +} + +export interface TaskFunction { + (additionalArgs?: string[]): Promise; +} + +export interface TaskOption { + flag: string; + description: string; + defaultValue?: any; +} + +export interface Task { + command: string; + description: string; + options?: TaskOption[]; + execute: TaskFunction; + quiet?: boolean; // Whether this task handles its own output +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/getJestConfigPath.ts b/tools/repo-scripts/src/utilities/getJestConfigPath.ts new file mode 100644 index 00000000..564b8f91 --- /dev/null +++ b/tools/repo-scripts/src/utilities/getJestConfigPath.ts @@ -0,0 +1,31 @@ +import fs from 'fs'; +import path from 'path'; + +export function getJestConfigPath(packageRoot: string): string { + // Look for jest config files in order of preference + const configFiles = [ + 'jest.config.js', + 'jest.config.mjs', + 'jest.config.cjs', + 'jest.config.json', + 'jest.config.ts' + ]; + + for (const configFile of configFiles) { + const configPath = path.join(packageRoot, configFile); + if (fs.existsSync(configPath)) { + return configPath; + } + } + + // Check if package.json has jest config + const packageJsonPath = path.join(packageRoot, 'package.json'); + if (fs.existsSync(packageJsonPath)) { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + if (packageJson.jest) { + return packageJsonPath; + } + } + + throw new Error(`No Jest configuration found in ${packageRoot}`); +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/getPackageData.ts b/tools/repo-scripts/src/utilities/getPackageData.ts new file mode 100644 index 00000000..1e70a6ca --- /dev/null +++ b/tools/repo-scripts/src/utilities/getPackageData.ts @@ -0,0 +1,61 @@ +import fs from 'fs'; +import path from 'path'; +import resolve from 'resolve'; +import { findPackageRoot } from 'workspace-tools'; + +interface PackageJson { + name?: string; + version?: string; + scripts?: Record; + dependencies?: Record; + devDependencies?: Record; + peerDependencies?: Record; + bin?: string | Record; + [key: string]: unknown; +} + +export interface PackageData { + packageRoot: string; + packageJson: PackageJson; + packageJsonPath: string; +} + +export interface GetPackageDataOptions { + name: string; + fromPath: string; +} + +/** + * Get data about either the current package, or a package by name. + */ +export function getPackageData(cwdOrName?: string | GetPackageDataOptions): PackageData { + let packageRoot: string; + let packageJsonPath: string; + + // Default to current directory if no argument + if (!cwdOrName) { + cwdOrName = process.cwd(); + } + + if (typeof cwdOrName === 'string') { + const foundRoot = findPackageRoot(cwdOrName); + if (!foundRoot) { + throw new Error('Unable to find package root from ' + cwdOrName); + } + packageRoot = foundRoot; + packageJsonPath = path.join(packageRoot, 'package.json'); + } else { + const { name, fromPath } = cwdOrName; + packageJsonPath = resolve.sync(name + '/package.json', { basedir: fromPath }); + if (!packageJsonPath) { + throw new Error(`Unable to resolve package "${name}"`); + } + packageRoot = path.dirname(packageJsonPath); + } + + return { + packageRoot, + packageJsonPath, + packageJson: JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')), + }; +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/runScript.ts b/tools/repo-scripts/src/utilities/runScript.ts new file mode 100644 index 00000000..6336ac61 --- /dev/null +++ b/tools/repo-scripts/src/utilities/runScript.ts @@ -0,0 +1,129 @@ +import { spawn } from 'child_process'; +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import chalk from 'chalk'; +import { getPackageData } from './getPackageData.js'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); + +export interface RunScriptOptions { + packageName: string; + name?: string; + args?: string[]; + nodeArgs?: string[]; + setExitCode?: boolean; + quiet?: boolean; + env?: Record; +} + +/** + * Run a script/bin provided by a package in node_modules. + */ +export async function runScript({ + packageName, + name = packageName, + args = [], + nodeArgs = [], + env = {}, + setExitCode = true, + quiet, +}: RunScriptOptions): Promise { + // Try to resolve the package relative to the scripts folder. + const { packageRoot, packageJson } = getPackageData({ name: packageName, fromPath: dirname }); + + const binPath = + typeof packageJson.bin === 'string' + ? packageJson.bin + : packageJson.bin?.[name] || Object.values(packageJson.bin || {})[0] || ''; + const scriptPath = path.join(packageRoot, binPath); + + if (!fs.existsSync(scriptPath)) { + throw new Error(`Unable to resolve script "${scriptPath}`); + } + + const fullArgs = [...nodeArgs, scriptPath, ...args]; + + if (!quiet) { + try { + const packageInfo = getPackageData(process.cwd()); + const packageName = packageInfo.packageJson.name || path.basename(process.cwd()); + const taskName = path.basename(scriptPath, '.js'); + + // Map common tools to task names + const taskMap: Record = { + 'eslint': 'lint', + 'tsc': 'build', + 'jest': 'test', + 'vitest': 'test', + 'playwright': 'test', + }; + + const displayTask = taskMap[taskName] || taskName; + + // Filter out flags and their values, and paths + const displayArgs: string[] = []; + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (!arg) continue; + + if (arg.startsWith('--') || arg.startsWith('-')) { + // Skip this arg and potentially the next if it's a value + const nextArg = args[i + 1]; + if (nextArg && !nextArg.startsWith('-')) { + i++; // Skip the value + } + } else if (!arg.includes('/') && !displayArgs.includes(arg)) { + displayArgs.push(arg); + } + } + + const details = displayArgs.length > 0 ? chalk.dim(` (${displayArgs.join(' ')})`) : ''; + + console.log( + chalk.cyan(`[${chalk.bold(displayTask)}]`) + + ' ' + + packageName + + details + ); + } catch { + // Fallback if package info can't be found + console.log(chalk.gray(`[${chalk.bold(name)}] Running...`)); + } + } + + return new Promise((pResolve, reject) => { + const result = spawn('node', fullArgs, { + cwd: process.cwd(), + stdio: 'inherit', + env: { + ...process.env, + ...env, + }, + }); + + // When the process exits, exit with the same code. + result.on('exit', (code) => { + const exitCode = code || 0; + if (setExitCode) { + process.exitCode = exitCode; + } + + if (exitCode === 0) { + pResolve(); + } else { + reject(new Error(`"${name}" exited with code ${exitCode}`)); + } + }); + + // If the process is killed, kill the child process. + process.on('SIGINT', () => { + result.kill('SIGINT'); + }); + + result.on('error', (e) => { + process.exitCode = 1; + reject(e); + }); + }); +} \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/README.md b/tools/repo-scripts/templates/package/README.md new file mode 100644 index 00000000..cbdc76dc --- /dev/null +++ b/tools/repo-scripts/templates/package/README.md @@ -0,0 +1,22 @@ +# {{packageName}} + +{{description}} + +## Usage + +```typescript +import { something } from '@claude-flow/{{packageName}}'; +``` + +## Development + +```bash +# Build the package +pnpm build + +# Run tests +pnpm test + +# Lint the code +pnpm lint +``` \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/eslint.config.mjs b/tools/repo-scripts/templates/package/eslint.config.mjs new file mode 100644 index 00000000..236c723c --- /dev/null +++ b/tools/repo-scripts/templates/package/eslint.config.mjs @@ -0,0 +1,3 @@ +import eslintConfig from '@claude-flow/eslint-config'; + +export default eslintConfig.node; \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/package.json b/tools/repo-scripts/templates/package/package.json new file mode 100644 index 00000000..cbec656e --- /dev/null +++ b/tools/repo-scripts/templates/package/package.json @@ -0,0 +1,22 @@ +{ + "name": "@claude-flow/{{packageName}}", + "version": "1.0.0", + "private": true, + "description": "{{description}}", + "type": "module", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "scripts": { + "build": "repo-scripts build", + "test": "repo-scripts test", + "lint": "repo-scripts lint", + "lint:fix": "repo-scripts lint-fix", + "clean": "repo-scripts clean" + }, + "devDependencies": { + "@claude-flow/eslint-config": "workspace:*", + "@claude-flow/repo-scripts": "workspace:*", + "@claude-flow/tsconfig": "workspace:*", + "@types/node": "^20.0.0" + } +} \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/src/index.ts b/tools/repo-scripts/templates/package/src/index.ts new file mode 100644 index 00000000..37bd1ea8 --- /dev/null +++ b/tools/repo-scripts/templates/package/src/index.ts @@ -0,0 +1,3 @@ +export function hello(name: string): string { + return `Hello, ${name}!`; +} \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/tests/index.test.js b/tools/repo-scripts/templates/package/tests/index.test.js new file mode 100644 index 00000000..e0bdcdb6 --- /dev/null +++ b/tools/repo-scripts/templates/package/tests/index.test.js @@ -0,0 +1,8 @@ +import { test } from 'node:test'; +import assert from 'node:assert'; +import { hello } from '../lib/index.js'; + +test('hello function returns greeting', () => { + const result = hello('World'); + assert.strictEqual(result, 'Hello, World!'); +}); \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/tsconfig.json b/tools/repo-scripts/templates/package/tsconfig.json new file mode 100644 index 00000000..0275920d --- /dev/null +++ b/tools/repo-scripts/templates/package/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@claude-flow/tsconfig/base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "lib" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib"] +} \ No newline at end of file diff --git a/tools/repo-scripts/tsconfig.json b/tools/repo-scripts/tsconfig.json new file mode 100644 index 00000000..2f6e4238 --- /dev/null +++ b/tools/repo-scripts/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "@claude-flow/tsconfig/base.json", + "compilerOptions": { + "outDir": "./lib", + "rootDir": "./src", + "module": "ESNext", + "target": "ES2022", + "moduleResolution": "bundler", + "lib": ["ES2022"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib"] +} \ No newline at end of file diff --git a/validate-fixes.md b/validate-fixes.md deleted file mode 100644 index d7e3b6c4..00000000 --- a/validate-fixes.md +++ /dev/null @@ -1,45 +0,0 @@ -# Validation of Fixes - -## Fix 1: User messages should not render markdown - -**What was fixed:** -- Modified `ClaudeMessage.tsx` to render user messages as plain text with `whitespace-pre-wrap` class -- Assistant messages continue to use markdown rendering via `formatContent` function - -**Validation:** -1. Build passes successfully ✓ -2. Code change ensures user messages with special characters like `` won't break -3. The fix is at line 286-292 in ClaudeMessage.tsx: - ```tsx - message.role === 'user' ? ( - // User messages should not be rendered as markdown to avoid issues with special characters -
{messageContent}
- ) : ( - // Assistant messages get markdown formatting - formatContent(messageContent) - ) - ``` - -## Fix 2: Tool execution timing - -**What was fixed:** -- Added `tool-start` event handler to ClaudeCodeContext.tsx to properly track when tools begin execution -- Tools now show 'running' status when they start and update to 'complete' when finished - -**Validation:** -1. Build passes successfully ✓ -2. Added handler at line 438-469 for `tool-start` events -3. Updated `tool-execution` handler to mark tools as complete with proper execution time - -**Testing approach:** -Due to the complexity of setting up the full e2e environment with SSE connections, manual testing is recommended: - -1. For user message markdown: - - Send a message with special characters like `` or `**bold**` - - Verify it displays as plain text without formatting - -2. For tool execution: - - Send a message that triggers tool use (e.g., "List files in current directory") - - Verify tools show spinner initially and complete with checkmark - -Both fixes have been implemented correctly and the build validates that there are no TypeScript errors. \ No newline at end of file diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index cd165548..00000000 --- a/yarn.lock +++ /dev/null @@ -1,4440 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== - dependencies: - "@babel/helper-validator-identifier" "^7.27.1" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/compat-data@^7.27.2": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.7.tgz" - integrity sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ== - -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.27.4": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz" - integrity sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.5" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.27.3" - "@babel/helpers" "^7.27.6" - "@babel/parser" "^7.27.7" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.27.7" - "@babel/types" "^7.27.7" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.27.5": - version "7.27.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz" - integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== - dependencies: - "@babel/parser" "^7.27.5" - "@babel/types" "^7.27.3" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-compilation-targets@^7.27.2": - version "7.27.2" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== - dependencies: - "@babel/compat-data" "^7.27.2" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-module-transforms@^7.27.3": - version "7.27.3" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz" - integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.3" - -"@babel/helper-plugin-utils@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helpers@^7.27.6": - version "7.27.6" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz" - integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== - dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.27.6" - -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.27.5", "@babel/parser@^7.27.7": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz" - integrity sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q== - dependencies: - "@babel/types" "^7.27.7" - -"@babel/plugin-transform-react-jsx-self@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz" - integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx-source@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz" - integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/runtime@^7.12.5", "@babel/runtime@^7.14.8": - version "7.27.6" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz" - integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q== - -"@babel/template@^7.27.2": - version "7.27.2" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - -"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.27.7": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz" - integrity sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.5" - "@babel/parser" "^7.27.7" - "@babel/template" "^7.27.2" - "@babel/types" "^7.27.7" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.27.7": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz" - integrity sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - -"@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.3.2", "@codemirror/autocomplete@^6.4.0", "@codemirror/autocomplete@^6.7.1": - version "6.18.6" - resolved "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz" - integrity sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg== - dependencies: - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.17.0" - "@lezer/common" "^1.0.0" - -"@codemirror/commands@^6.0.0", "@codemirror/commands@^6.1.3", "@codemirror/commands@^6.2.4": - version "6.8.1" - resolved "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz" - integrity sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw== - dependencies: - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.4.0" - "@codemirror/view" "^6.27.0" - "@lezer/common" "^1.1.0" - -"@codemirror/lang-angular@^0.1.0": - version "0.1.4" - resolved "https://registry.npmjs.org/@codemirror/lang-angular/-/lang-angular-0.1.4.tgz" - integrity sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g== - dependencies: - "@codemirror/lang-html" "^6.0.0" - "@codemirror/lang-javascript" "^6.1.2" - "@codemirror/language" "^6.0.0" - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.3.3" - -"@codemirror/lang-cpp@^6.0.0": - version "6.0.3" - resolved "https://registry.npmjs.org/@codemirror/lang-cpp/-/lang-cpp-6.0.3.tgz" - integrity sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA== - dependencies: - "@codemirror/language" "^6.0.0" - "@lezer/cpp" "^1.0.0" - -"@codemirror/lang-css@^6.0.0", "@codemirror/lang-css@^6.0.1", "@codemirror/lang-css@^6.2.0": - version "6.3.1" - resolved "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz" - integrity sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@lezer/common" "^1.0.2" - "@lezer/css" "^1.1.7" - -"@codemirror/lang-go@^6.0.0": - version "6.0.1" - resolved "https://registry.npmjs.org/@codemirror/lang-go/-/lang-go-6.0.1.tgz" - integrity sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/language" "^6.6.0" - "@codemirror/state" "^6.0.0" - "@lezer/common" "^1.0.0" - "@lezer/go" "^1.0.0" - -"@codemirror/lang-html@^6.0.0", "@codemirror/lang-html@^6.4.0": - version "6.4.9" - resolved "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz" - integrity sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/lang-css" "^6.0.0" - "@codemirror/lang-javascript" "^6.0.0" - "@codemirror/language" "^6.4.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.17.0" - "@lezer/common" "^1.0.0" - "@lezer/css" "^1.1.0" - "@lezer/html" "^1.3.0" - -"@codemirror/lang-java@^6.0.0": - version "6.0.2" - resolved "https://registry.npmjs.org/@codemirror/lang-java/-/lang-java-6.0.2.tgz" - integrity sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ== - dependencies: - "@codemirror/language" "^6.0.0" - "@lezer/java" "^1.0.0" - -"@codemirror/lang-javascript@^6.0.0", "@codemirror/lang-javascript@^6.1.2": - version "6.2.4" - resolved "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz" - integrity sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/language" "^6.6.0" - "@codemirror/lint" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.17.0" - "@lezer/common" "^1.0.0" - "@lezer/javascript" "^1.0.0" - -"@codemirror/lang-json@^6.0.0": - version "6.0.2" - resolved "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz" - integrity sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ== - dependencies: - "@codemirror/language" "^6.0.0" - "@lezer/json" "^1.0.0" - -"@codemirror/lang-less@^6.0.0": - version "6.0.2" - resolved "https://registry.npmjs.org/@codemirror/lang-less/-/lang-less-6.0.2.tgz" - integrity sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ== - dependencies: - "@codemirror/lang-css" "^6.2.0" - "@codemirror/language" "^6.0.0" - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@codemirror/lang-liquid@^6.0.0": - version "6.2.3" - resolved "https://registry.npmjs.org/@codemirror/lang-liquid/-/lang-liquid-6.2.3.tgz" - integrity sha512-yeN+nMSrf/lNii3FJxVVEGQwFG0/2eDyH6gNOj+TGCa0hlNO4bhQnoO5ISnd7JOG+7zTEcI/GOoyraisFVY7jQ== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/lang-html" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - "@lezer/common" "^1.0.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.3.1" - -"@codemirror/lang-markdown@^6.0.0", "@codemirror/lang-markdown@^6.2.3": - version "6.3.3" - resolved "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.3.3.tgz" - integrity sha512-1fn1hQAPWlSSMCvnF810AkhWpNLkJpl66CRfIy3vVl20Sl4NwChkorCHqpMtNbXr1EuMJsrDnhEpjZxKZ2UX3A== - dependencies: - "@codemirror/autocomplete" "^6.7.1" - "@codemirror/lang-html" "^6.0.0" - "@codemirror/language" "^6.3.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - "@lezer/common" "^1.2.1" - "@lezer/markdown" "^1.0.0" - -"@codemirror/lang-php@^6.0.0": - version "6.0.2" - resolved "https://registry.npmjs.org/@codemirror/lang-php/-/lang-php-6.0.2.tgz" - integrity sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA== - dependencies: - "@codemirror/lang-html" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@lezer/common" "^1.0.0" - "@lezer/php" "^1.0.0" - -"@codemirror/lang-python@^6.0.0": - version "6.2.1" - resolved "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.2.1.tgz" - integrity sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw== - dependencies: - "@codemirror/autocomplete" "^6.3.2" - "@codemirror/language" "^6.8.0" - "@codemirror/state" "^6.0.0" - "@lezer/common" "^1.2.1" - "@lezer/python" "^1.1.4" - -"@codemirror/lang-rust@^6.0.0": - version "6.0.2" - resolved "https://registry.npmjs.org/@codemirror/lang-rust/-/lang-rust-6.0.2.tgz" - integrity sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA== - dependencies: - "@codemirror/language" "^6.0.0" - "@lezer/rust" "^1.0.0" - -"@codemirror/lang-sass@^6.0.0": - version "6.0.2" - resolved "https://registry.npmjs.org/@codemirror/lang-sass/-/lang-sass-6.0.2.tgz" - integrity sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q== - dependencies: - "@codemirror/lang-css" "^6.2.0" - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@lezer/common" "^1.0.2" - "@lezer/sass" "^1.0.0" - -"@codemirror/lang-sql@^6.0.0": - version "6.9.0" - resolved "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.9.0.tgz" - integrity sha512-xmtpWqKSgum1B1J3Ro6rf7nuPqf2+kJQg5SjrofCAcyCThOe0ihSktSoXfXuhQBnwx1QbmreBbLJM5Jru6zitg== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@codemirror/lang-vue@^0.1.1": - version "0.1.3" - resolved "https://registry.npmjs.org/@codemirror/lang-vue/-/lang-vue-0.1.3.tgz" - integrity sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug== - dependencies: - "@codemirror/lang-html" "^6.0.0" - "@codemirror/lang-javascript" "^6.1.2" - "@codemirror/language" "^6.0.0" - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.3.1" - -"@codemirror/lang-wast@^6.0.0": - version "6.0.2" - resolved "https://registry.npmjs.org/@codemirror/lang-wast/-/lang-wast-6.0.2.tgz" - integrity sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q== - dependencies: - "@codemirror/language" "^6.0.0" - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@codemirror/lang-xml@^6.0.0": - version "6.1.0" - resolved "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz" - integrity sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/language" "^6.4.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - "@lezer/common" "^1.0.0" - "@lezer/xml" "^1.0.0" - -"@codemirror/lang-yaml@^6.0.0": - version "6.1.2" - resolved "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz" - integrity sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.2.0" - "@lezer/lr" "^1.0.0" - "@lezer/yaml" "^1.0.0" - -"@codemirror/language-data@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@codemirror/language-data/-/language-data-6.5.1.tgz" - integrity sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w== - dependencies: - "@codemirror/lang-angular" "^0.1.0" - "@codemirror/lang-cpp" "^6.0.0" - "@codemirror/lang-css" "^6.0.0" - "@codemirror/lang-go" "^6.0.0" - "@codemirror/lang-html" "^6.0.0" - "@codemirror/lang-java" "^6.0.0" - "@codemirror/lang-javascript" "^6.0.0" - "@codemirror/lang-json" "^6.0.0" - "@codemirror/lang-less" "^6.0.0" - "@codemirror/lang-liquid" "^6.0.0" - "@codemirror/lang-markdown" "^6.0.0" - "@codemirror/lang-php" "^6.0.0" - "@codemirror/lang-python" "^6.0.0" - "@codemirror/lang-rust" "^6.0.0" - "@codemirror/lang-sass" "^6.0.0" - "@codemirror/lang-sql" "^6.0.0" - "@codemirror/lang-vue" "^0.1.1" - "@codemirror/lang-wast" "^6.0.0" - "@codemirror/lang-xml" "^6.0.0" - "@codemirror/lang-yaml" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/legacy-modes" "^6.4.0" - -"@codemirror/language@^6.0.0", "@codemirror/language@^6.3.0", "@codemirror/language@^6.3.2", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0", "@codemirror/language@^6.8.0": - version "6.11.2" - resolved "https://registry.npmjs.org/@codemirror/language/-/language-6.11.2.tgz" - integrity sha512-p44TsNArL4IVXDTbapUmEkAlvWs2CFQbcfc0ymDsis1kH2wh0gcY96AS29c/vp2d0y2Tquk1EDSaawpzilUiAw== - dependencies: - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.23.0" - "@lezer/common" "^1.1.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - style-mod "^4.0.0" - -"@codemirror/legacy-modes@^6.4.0": - version "6.5.1" - resolved "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.1.tgz" - integrity sha512-DJYQQ00N1/KdESpZV7jg9hafof/iBNp9h7TYo1SLMk86TWl9uDsVdho2dzd81K+v4retmK6mdC7WpuOQDytQqw== - dependencies: - "@codemirror/language" "^6.0.0" - -"@codemirror/lint@^6.0.0": - version "6.8.5" - resolved "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz" - integrity sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA== - dependencies: - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.35.0" - crelt "^1.0.5" - -"@codemirror/merge@^6.4.0": - version "6.10.2" - resolved "https://registry.npmjs.org/@codemirror/merge/-/merge-6.10.2.tgz" - integrity sha512-rmHzVkt5FnCtsi0IgvDIDjh/J4LmbfOboB7FMvVl21IHO0p1QM6jSwjkBjBD3D+c+T79OabEqoduCqvJCBV8Yg== - dependencies: - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.17.0" - "@lezer/highlight" "^1.0.0" - style-mod "^4.1.0" - -"@codemirror/search@^6.0.0": - version "6.5.11" - resolved "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz" - integrity sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA== - dependencies: - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - crelt "^1.0.5" - -"@codemirror/state@^6.0.0", "@codemirror/state@^6.2.0", "@codemirror/state@^6.4.0", "@codemirror/state@^6.5.0": - version "6.5.2" - resolved "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz" - integrity sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA== - dependencies: - "@marijn/find-cluster-break" "^1.0.0" - -"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.7.1": - version "6.38.0" - resolved "https://registry.npmjs.org/@codemirror/view/-/view-6.38.0.tgz" - integrity sha512-yvSchUwHOdupXkd7xJ0ob36jdsSR/I+/C+VbY0ffBiL5NiSTEBDfB1ZGWbbIlDd5xgdUkody+lukAdOxYrOBeg== - dependencies: - "@codemirror/state" "^6.5.0" - crelt "^1.0.6" - style-mod "^4.1.0" - w3c-keyname "^2.2.4" - -"@codesandbox/nodebox@0.1.8": - version "0.1.8" - resolved "https://registry.npmjs.org/@codesandbox/nodebox/-/nodebox-0.1.8.tgz" - integrity sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg== - dependencies: - outvariant "^1.4.0" - strict-event-emitter "^0.4.3" - -"@codesandbox/sandpack-client@^2.19.8": - version "2.19.8" - resolved "https://registry.npmjs.org/@codesandbox/sandpack-client/-/sandpack-client-2.19.8.tgz" - integrity sha512-CMV4nr1zgKzVpx4I3FYvGRM5YT0VaQhALMW9vy4wZRhEyWAtJITQIqZzrTGWqB1JvV7V72dVEUCUPLfYz5hgJQ== - dependencies: - "@codesandbox/nodebox" "0.1.8" - buffer "^6.0.3" - dequal "^2.0.2" - mime-db "^1.52.0" - outvariant "1.4.0" - static-browser-server "1.0.3" - -"@codesandbox/sandpack-react@^2.20.0": - version "2.20.0" - resolved "https://registry.npmjs.org/@codesandbox/sandpack-react/-/sandpack-react-2.20.0.tgz" - integrity sha512-takd1YpW/PMQ6KPQfvseWLHWklJovGY8QYj8MtWnskGKbjOGJ6uZfyZbcJ6aCFLQMpNyjTqz9AKNbvhCOZ1TUQ== - dependencies: - "@codemirror/autocomplete" "^6.4.0" - "@codemirror/commands" "^6.1.3" - "@codemirror/lang-css" "^6.0.1" - "@codemirror/lang-html" "^6.4.0" - "@codemirror/lang-javascript" "^6.1.2" - "@codemirror/language" "^6.3.2" - "@codemirror/state" "^6.2.0" - "@codemirror/view" "^6.7.1" - "@codesandbox/sandpack-client" "^2.19.8" - "@lezer/highlight" "^1.1.3" - "@react-hook/intersection-observer" "^3.1.1" - "@stitches/core" "^1.2.6" - anser "^2.1.1" - clean-set "^1.1.2" - dequal "^2.0.2" - escape-carriage "^1.3.1" - lz-string "^1.4.4" - react-devtools-inline "4.4.0" - react-is "^17.0.2" - -"@esbuild/linux-x64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz" - integrity sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": - version "4.7.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz" - integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": - version "4.12.1" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/config-array@^0.21.0": - version "0.21.0" - resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz" - integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ== - dependencies: - "@eslint/object-schema" "^2.1.6" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/config-helpers@^0.3.0": - version "0.3.0" - resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz" - integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw== - -"@eslint/core@^0.14.0": - version "0.14.0" - resolved "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz" - integrity sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/core@^0.15.1": - version "0.15.1" - resolved "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz" - integrity sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/eslintrc@^3.3.1": - version "3.3.1" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz" - integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@^9.29.0", "@eslint/js@9.30.1": - version "9.30.1" - resolved "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz" - integrity sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg== - -"@eslint/object-schema@^2.1.6": - version "2.1.6" - resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz" - integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== - -"@eslint/plugin-kit@^0.3.1": - version "0.3.3" - resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz" - integrity sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag== - dependencies: - "@eslint/core" "^0.15.1" - levn "^0.4.1" - -"@floating-ui/core@^1.7.2": - version "1.7.2" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz" - integrity sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw== - dependencies: - "@floating-ui/utils" "^0.2.10" - -"@floating-ui/dom@^1.7.2": - version "1.7.2" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz" - integrity sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA== - dependencies: - "@floating-ui/core" "^1.7.2" - "@floating-ui/utils" "^0.2.10" - -"@floating-ui/react-dom@^2.0.0", "@floating-ui/react-dom@^2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz" - integrity sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw== - dependencies: - "@floating-ui/dom" "^1.7.2" - -"@floating-ui/react@^0.27.8": - version "0.27.13" - resolved "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.13.tgz" - integrity sha512-Qmj6t9TjgWAvbygNEu1hj4dbHI9CY0ziCMIJrmYoDIn9TUAH5lRmiIeZmRd4c6QEZkzdoH7jNnoNyoY1AIESiA== - dependencies: - "@floating-ui/react-dom" "^2.1.4" - "@floating-ui/utils" "^0.2.10" - tabbable "^6.0.0" - -"@floating-ui/utils@^0.2.10": - version "0.2.10" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz" - integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== - -"@humanfs/core@^0.19.1": - version "0.19.1" - resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" - integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== - -"@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== - dependencies: - "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.2": - version "0.4.3" - resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" - integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - 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" - -"@isaacs/fs-minipass@^4.0.0": - version "4.0.1" - resolved "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz" - integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== - dependencies: - minipass "^7.0.4" - -"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.12" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz" - integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.4" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz" - integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.29" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz" - integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@lexical/clipboard@^0.32.1", "@lexical/clipboard@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.32.1.tgz" - integrity sha512-oO7CuMVh3EFEqtE6+7Ccf7jMD5RNUmSdTnFm/X4kYNGqs9lgGt8j5PgSk7oP9OuAjxKNdBTbltSlh54CX3AUIg== - dependencies: - "@lexical/html" "0.32.1" - "@lexical/list" "0.32.1" - "@lexical/selection" "0.32.1" - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/code@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/code/-/code-0.32.1.tgz" - integrity sha512-2rXj8s/CG32XKQ2EpORpACfpzyAxB+/SrQW2cjwczarLs5Fxnx6u6HwahZnxaF0z5UHIPUy90qDiOiRExc74Yg== - dependencies: - "@lexical/utils" "0.32.1" - lexical "0.32.1" - prismjs "^1.30.0" - -"@lexical/devtools-core@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/devtools-core/-/devtools-core-0.32.1.tgz" - integrity sha512-3WnZQo6Qig7ccjDu2b8s1Kb5CCXowxnK0i8CCRG9mHAw7i6XpZUYAbk4rmcK/qbhLHrc7LwUrAMFzGtfLEH3XA== - dependencies: - "@lexical/html" "0.32.1" - "@lexical/link" "0.32.1" - "@lexical/mark" "0.32.1" - "@lexical/table" "0.32.1" - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/dragon@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.32.1.tgz" - integrity sha512-Dlx8P2b/O7gZLmXnoanmDkFL5RgA8Vvix4ZuSvT0apblqySzgi8l3NHHwwqXy1g2nfSupvpr7Dsf10Lu3l0Hlw== - dependencies: - lexical "0.32.1" - -"@lexical/hashtag@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.32.1.tgz" - integrity sha512-S63bb7uIB4hO2V0UmzUiKlwAGegQlyFKqrOw9NJwOb8O96gHRxr27FUsEb8ToWLM8TSm2aw1WsZXs7CJQqGtCg== - dependencies: - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/history@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/history/-/history-0.32.1.tgz" - integrity sha512-IRsKllumYEWxmzR2evN30MFY+JBM723lSyzm2PAQcgHCeBxi8t0Vc3EdyJRay+YdN65JgrohQi1WbktbK923uQ== - dependencies: - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/html@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/html/-/html-0.32.1.tgz" - integrity sha512-uctCdC9gVzx/Sw9CimT4C2IDfSbfEGYunyIrJBpsfcdqp0rroGNizjIoZNBH3xcgkk9UDboSADo+wimbzEoy8A== - dependencies: - "@lexical/selection" "0.32.1" - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/link@^0.32.1", "@lexical/link@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/link/-/link-0.32.1.tgz" - integrity sha512-atdwNpWjZ0U2/kgS0ATTkZ8lJLHiv3TsJgqJL33BuV9Gn7advJokd4faM79Y8XxkhiPi1lVTBSHgI8V4hs+c+Q== - dependencies: - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/list@^0.32.1", "@lexical/list@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/list/-/list-0.32.1.tgz" - integrity sha512-3zShCfEdAvodR6mQ5CNN1gcEwfV341LXJzWCIkZzG1cPwaiBHUlT7TynQtKTPn1sATCEMmxoDG0/T+itsRNZgA== - dependencies: - "@lexical/selection" "0.32.1" - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/mark@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/mark/-/mark-0.32.1.tgz" - integrity sha512-AXF2wmUvvSI45y+sgZKnU0pnUdttd9v75DDQgdplqtCkyDqHVGxVCNCrLE+PJtzIrwJxtA2UyC8yFZMBM92HpA== - dependencies: - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/markdown@^0.32.1", "@lexical/markdown@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.32.1.tgz" - integrity sha512-AmUTRRx6Je0AOiQqp48Xn92/71AzhFgi4nO1EtPW5eae1CihrtiEh5UQr48mV6EyjvH9D3OlOLU8XrzS+J9a+w== - dependencies: - "@lexical/code" "0.32.1" - "@lexical/link" "0.32.1" - "@lexical/list" "0.32.1" - "@lexical/rich-text" "0.32.1" - "@lexical/text" "0.32.1" - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/offset@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/offset/-/offset-0.32.1.tgz" - integrity sha512-zfHqoLlQ0lq1akFHy81xnDaRRE5KkqFa7OovOxKPBpALQCiJIAb2ykqj/Woc2oUeYaEcnkaFU9+kEWMK9yY0fQ== - dependencies: - lexical "0.32.1" - -"@lexical/overflow@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.32.1.tgz" - integrity sha512-wjcFGjzkbugds2Q5Wag59WrcxJwMUACEXms1FtFdu1/YcBPqNAKJSyfo8Z/5LGfstQEb2nPtSuEQZUb7v+XYyA== - dependencies: - lexical "0.32.1" - -"@lexical/plain-text@^0.32.1", "@lexical/plain-text@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.32.1.tgz" - integrity sha512-uFS3xoETB3phnYHZXfMKvl8gh6YRW7rpokuJmQVMHNNBklORmMpN00rRQ/zsc/jt/nPzaPpE5cLwSHXeJdqJUg== - dependencies: - "@lexical/clipboard" "0.32.1" - "@lexical/selection" "0.32.1" - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/react@^0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/react/-/react-0.32.1.tgz" - integrity sha512-PCiAiwGIGfkYb2o9Kx+gGGqXwxqb7/W4cGSnw1nzmNtCerJ3S64WZs87Lgcow0RlDSwqzpH534+eCyIddueSqw== - dependencies: - "@floating-ui/react" "^0.27.8" - "@lexical/devtools-core" "0.32.1" - "@lexical/dragon" "0.32.1" - "@lexical/hashtag" "0.32.1" - "@lexical/history" "0.32.1" - "@lexical/link" "0.32.1" - "@lexical/list" "0.32.1" - "@lexical/mark" "0.32.1" - "@lexical/markdown" "0.32.1" - "@lexical/overflow" "0.32.1" - "@lexical/plain-text" "0.32.1" - "@lexical/rich-text" "0.32.1" - "@lexical/table" "0.32.1" - "@lexical/text" "0.32.1" - "@lexical/utils" "0.32.1" - "@lexical/yjs" "0.32.1" - lexical "0.32.1" - react-error-boundary "^3.1.4" - -"@lexical/rich-text@^0.32.1", "@lexical/rich-text@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.32.1.tgz" - integrity sha512-SnmpZ7boTLxeYfNezNLvchDiJOAALA2nD0Uq/SpkIOJ6R01R7m1aPdLv55LGKoBT9UxCRdo0HWXytwiVZI+ehQ== - dependencies: - "@lexical/clipboard" "0.32.1" - "@lexical/selection" "0.32.1" - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/selection@^0.32.1", "@lexical/selection@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/selection/-/selection-0.32.1.tgz" - integrity sha512-X1aXJdq/5EOuSuMOqK3t+rEVmpqLf+vc2Kl5YuP8+gGWUbXuxR6iryrQuy1mAViZpF/5qw4HO/Sb+9JjubaZEg== - dependencies: - lexical "0.32.1" - -"@lexical/table@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/table/-/table-0.32.1.tgz" - integrity sha512-sGk2jUbQHj5hatpxRyl6IE2oWsjRnYhmaP94THzn95/uK69o8eSizcnd148WzYsX8Zz+L9PTLS1xjvCbfLTP+A== - dependencies: - "@lexical/clipboard" "0.32.1" - "@lexical/utils" "0.32.1" - lexical "0.32.1" - -"@lexical/text@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/text/-/text-0.32.1.tgz" - integrity sha512-0Ek8F3KC4d16b2YaTHdyYFqDSBZ5KRtGrqU3GBog+VOGxucGaEbXEK1/ypX5CTe/wwkQDrH0FKWPQbd3l5t5YQ== - dependencies: - lexical "0.32.1" - -"@lexical/utils@^0.32.1", "@lexical/utils@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/utils/-/utils-0.32.1.tgz" - integrity sha512-ZaqZZksNIHJd+g8GXc11D1ESi8JzsdLVQZ+9odXVaNxtwDIaGIqMSccFyuZ9VSoJDde4JXZkgp/0PShbAZDkyw== - dependencies: - "@lexical/list" "0.32.1" - "@lexical/selection" "0.32.1" - "@lexical/table" "0.32.1" - lexical "0.32.1" - -"@lexical/yjs@0.32.1": - version "0.32.1" - resolved "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.32.1.tgz" - integrity sha512-VHGTg5z4wcDkPe8NnhzA5+CoOKJ5tVmTmMvoiZ91rtNUFQPxWRky88Gjt1e3yXldYp4pImNEgtAjlWqvaJBYGA== - dependencies: - "@lexical/offset" "0.32.1" - "@lexical/selection" "0.32.1" - lexical "0.32.1" - -"@lezer/common@^1.0.0", "@lezer/common@^1.0.2", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.2.1": - version "1.2.3" - resolved "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz" - integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA== - -"@lezer/cpp@^1.0.0": - version "1.1.3" - resolved "https://registry.npmjs.org/@lezer/cpp/-/cpp-1.1.3.tgz" - integrity sha512-ykYvuFQKGsRi6IcE+/hCSGUhb/I4WPjd3ELhEblm2wS2cOznDFzO+ubK2c+ioysOnlZ3EduV+MVQFCPzAIoY3w== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@lezer/css@^1.1.0", "@lezer/css@^1.1.7": - version "1.2.1" - resolved "https://registry.npmjs.org/@lezer/css/-/css-1.2.1.tgz" - integrity sha512-2F5tOqzKEKbCUNraIXc0f6HKeyKlmMWJnBB0i4XW6dJgssrZO/YlZ2pY5xgyqDleqqhiNJ3dQhbrV2aClZQMvg== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.3.0" - -"@lezer/go@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@lezer/go/-/go-1.0.1.tgz" - integrity sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.3.0" - -"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.1.3", "@lezer/highlight@^1.2.0": - version "1.2.1" - resolved "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz" - integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA== - dependencies: - "@lezer/common" "^1.0.0" - -"@lezer/html@^1.3.0": - version "1.3.10" - resolved "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz" - integrity sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@lezer/java@^1.0.0": - version "1.1.3" - resolved "https://registry.npmjs.org/@lezer/java/-/java-1.1.3.tgz" - integrity sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@lezer/javascript@^1.0.0": - version "1.5.1" - resolved "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.1.tgz" - integrity sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.1.3" - "@lezer/lr" "^1.3.0" - -"@lezer/json@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz" - integrity sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@lezer/lr@^1.0.0", "@lezer/lr@^1.1.0", "@lezer/lr@^1.3.0", "@lezer/lr@^1.3.1", "@lezer/lr@^1.3.3", "@lezer/lr@^1.4.0": - version "1.4.2" - resolved "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz" - integrity sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA== - dependencies: - "@lezer/common" "^1.0.0" - -"@lezer/markdown@^1.0.0": - version "1.4.3" - resolved "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.4.3.tgz" - integrity sha512-kfw+2uMrQ/wy/+ONfrH83OkdFNM0ye5Xq96cLlaCy7h5UT9FO54DU4oRoIc0CSBh5NWmWuiIJA7NGLMJbQ+Oxg== - dependencies: - "@lezer/common" "^1.0.0" - "@lezer/highlight" "^1.0.0" - -"@lezer/php@^1.0.0": - version "1.0.2" - resolved "https://registry.npmjs.org/@lezer/php/-/php-1.0.2.tgz" - integrity sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.1.0" - -"@lezer/python@^1.1.4": - version "1.1.18" - resolved "https://registry.npmjs.org/@lezer/python/-/python-1.1.18.tgz" - integrity sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@lezer/rust@^1.0.0": - version "1.0.2" - resolved "https://registry.npmjs.org/@lezer/rust/-/rust-1.0.2.tgz" - integrity sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@lezer/sass@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@lezer/sass/-/sass-1.1.0.tgz" - integrity sha512-3mMGdCTUZ/84ArHOuXWQr37pnf7f+Nw9ycPUeKX+wu19b7pSMcZGLbaXwvD2APMBDOGxPmpK/O6S1v1EvLoqgQ== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@lezer/xml@^1.0.0": - version "1.0.6" - resolved "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.6.tgz" - integrity sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@lezer/yaml@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.3.tgz" - integrity sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA== - dependencies: - "@lezer/common" "^1.2.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.4.0" - -"@marijn/find-cluster-break@^1.0.0": - version "1.0.2" - resolved "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz" - integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== - -"@mdxeditor/editor@^3.39.0": - version "3.39.0" - resolved "https://registry.npmjs.org/@mdxeditor/editor/-/editor-3.39.0.tgz" - integrity sha512-nPzA74xluHu0lqcGXZT/boHp3LmdRF/xF/Ri6hc+/eoN/kBmXeB/Xrok8AoLhmuVhXrXreAvTxfNahZJWOHX7w== - dependencies: - "@codemirror/commands" "^6.2.4" - "@codemirror/lang-markdown" "^6.2.3" - "@codemirror/language-data" "^6.5.1" - "@codemirror/merge" "^6.4.0" - "@codemirror/state" "^6.4.0" - "@codemirror/view" "^6.23.0" - "@codesandbox/sandpack-react" "^2.20.0" - "@lexical/clipboard" "^0.32.1" - "@lexical/link" "^0.32.1" - "@lexical/list" "^0.32.1" - "@lexical/markdown" "^0.32.1" - "@lexical/plain-text" "^0.32.1" - "@lexical/react" "^0.32.1" - "@lexical/rich-text" "^0.32.1" - "@lexical/selection" "^0.32.1" - "@lexical/utils" "^0.32.1" - "@mdxeditor/gurx" "^1.1.4" - "@radix-ui/colors" "^3.0.0" - "@radix-ui/react-dialog" "^1.1.11" - "@radix-ui/react-icons" "^1.3.2" - "@radix-ui/react-popover" "^1.1.11" - "@radix-ui/react-popper" "^1.2.4" - "@radix-ui/react-select" "^2.2.2" - "@radix-ui/react-toggle-group" "^1.1.7" - "@radix-ui/react-toolbar" "^1.1.7" - "@radix-ui/react-tooltip" "^1.2.4" - classnames "^2.3.2" - cm6-theme-basic-light "^0.2.0" - codemirror "^6.0.1" - downshift "^7.6.0" - js-yaml "4.1.0" - lexical "^0.32.1" - mdast-util-directive "^3.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-frontmatter "^2.0.1" - mdast-util-gfm-strikethrough "^2.0.0" - mdast-util-gfm-table "^2.0.0" - mdast-util-gfm-task-list-item "^2.0.0" - mdast-util-mdx "^3.0.0" - mdast-util-mdx-jsx "^3.0.0" - mdast-util-to-markdown "^2.1.0" - micromark-extension-directive "^3.0.0" - micromark-extension-frontmatter "^2.0.0" - micromark-extension-gfm-strikethrough "^2.0.0" - micromark-extension-gfm-table "^2.0.0" - micromark-extension-gfm-task-list-item "^2.0.1" - micromark-extension-mdx-jsx "^3.0.0" - micromark-extension-mdx-md "^2.0.0" - micromark-extension-mdxjs "^3.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.1" - micromark-util-symbol "^2.0.0" - react-hook-form "^7.56.1" - unidiff "^1.0.2" - -"@mdxeditor/gurx@^1.1.4": - version "1.2.3" - resolved "https://registry.npmjs.org/@mdxeditor/gurx/-/gurx-1.2.3.tgz" - integrity sha512-5DQOlEx46oN9spggrC8husAGAhVoEFBGIYKN48es08XhRUbSU6l5bcIQYwRrQaY8clU1tExIcXzw8/fNnoxjpg== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@open-draft/deferred-promise@^2.1.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz" - integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@playwright/test@^1.53.2": - version "1.53.2" - resolved "https://registry.npmjs.org/@playwright/test/-/test-1.53.2.tgz" - integrity sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw== - dependencies: - playwright "1.53.2" - -"@radix-ui/colors@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz" - integrity sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg== - -"@radix-ui/number@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz" - integrity sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g== - -"@radix-ui/primitive@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz" - integrity sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA== - -"@radix-ui/react-arrow@1.1.7": - version "1.1.7" - resolved "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz" - integrity sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w== - dependencies: - "@radix-ui/react-primitive" "2.1.3" - -"@radix-ui/react-collection@1.1.7": - version "1.1.7" - resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz" - integrity sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" - -"@radix-ui/react-compose-refs@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz" - integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== - -"@radix-ui/react-context@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz" - integrity sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA== - -"@radix-ui/react-dialog@^1.1.11": - version "1.1.14" - resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz" - integrity sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-focus-scope" "1.1.7" - "@radix-ui/react-id" "1.1.1" - "@radix-ui/react-portal" "1.1.9" - "@radix-ui/react-presence" "1.1.4" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-use-controllable-state" "1.2.2" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" - -"@radix-ui/react-direction@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz" - integrity sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw== - -"@radix-ui/react-dismissable-layer@1.1.10": - version "1.1.10" - resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz" - integrity sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-use-escape-keydown" "1.1.1" - -"@radix-ui/react-focus-guards@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz" - integrity sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA== - -"@radix-ui/react-focus-scope@1.1.7": - version "1.1.7" - resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz" - integrity sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-callback-ref" "1.1.1" - -"@radix-ui/react-icons@^1.3.2": - version "1.3.2" - resolved "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz" - integrity sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g== - -"@radix-ui/react-id@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz" - integrity sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-popover@^1.1.11": - version "1.1.14" - resolved "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz" - integrity sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-focus-scope" "1.1.7" - "@radix-ui/react-id" "1.1.1" - "@radix-ui/react-popper" "1.2.7" - "@radix-ui/react-portal" "1.1.9" - "@radix-ui/react-presence" "1.1.4" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-use-controllable-state" "1.2.2" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" - -"@radix-ui/react-popper@^1.2.4", "@radix-ui/react-popper@1.2.7": - version "1.2.7" - resolved "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz" - integrity sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ== - dependencies: - "@floating-ui/react-dom" "^2.0.0" - "@radix-ui/react-arrow" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-use-layout-effect" "1.1.1" - "@radix-ui/react-use-rect" "1.1.1" - "@radix-ui/react-use-size" "1.1.1" - "@radix-ui/rect" "1.1.1" - -"@radix-ui/react-portal@1.1.9": - version "1.1.9" - resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz" - integrity sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ== - dependencies: - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-presence@1.1.4": - version "1.1.4" - resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz" - integrity sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA== - dependencies: - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-primitive@2.1.3": - version "2.1.3" - resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz" - integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== - dependencies: - "@radix-ui/react-slot" "1.2.3" - -"@radix-ui/react-roving-focus@1.1.10": - version "1.1.10" - resolved "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz" - integrity sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" - "@radix-ui/react-id" "1.1.1" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-use-controllable-state" "1.2.2" - -"@radix-ui/react-select@^2.2.2": - version "2.2.5" - resolved "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz" - integrity sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA== - dependencies: - "@radix-ui/number" "1.1.1" - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-focus-scope" "1.1.7" - "@radix-ui/react-id" "1.1.1" - "@radix-ui/react-popper" "1.2.7" - "@radix-ui/react-portal" "1.1.9" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-use-controllable-state" "1.2.2" - "@radix-ui/react-use-layout-effect" "1.1.1" - "@radix-ui/react-use-previous" "1.1.1" - "@radix-ui/react-visually-hidden" "1.2.3" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" - -"@radix-ui/react-separator@1.1.7": - version "1.1.7" - resolved "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz" - integrity sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA== - dependencies: - "@radix-ui/react-primitive" "2.1.3" - -"@radix-ui/react-slot@1.2.3": - version "1.2.3" - resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz" - integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== - dependencies: - "@radix-ui/react-compose-refs" "1.1.2" - -"@radix-ui/react-toggle-group@^1.1.7", "@radix-ui/react-toggle-group@1.1.10": - version "1.1.10" - resolved "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.10.tgz" - integrity sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-roving-focus" "1.1.10" - "@radix-ui/react-toggle" "1.1.9" - "@radix-ui/react-use-controllable-state" "1.2.2" - -"@radix-ui/react-toggle@1.1.9": - version "1.1.9" - resolved "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.9.tgz" - integrity sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-controllable-state" "1.2.2" - -"@radix-ui/react-toolbar@^1.1.7": - version "1.1.10" - resolved "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.10.tgz" - integrity sha512-jiwQsduEL++M4YBIurjSa+voD86OIytCod0/dbIxFZDLD8NfO1//keXYMfsW8BPcfqwoNjt+y06XcJqAb4KR7A== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-roving-focus" "1.1.10" - "@radix-ui/react-separator" "1.1.7" - "@radix-ui/react-toggle-group" "1.1.10" - -"@radix-ui/react-tooltip@^1.2.4": - version "1.2.7" - resolved "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz" - integrity sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-id" "1.1.1" - "@radix-ui/react-popper" "1.2.7" - "@radix-ui/react-portal" "1.1.9" - "@radix-ui/react-presence" "1.1.4" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-use-controllable-state" "1.2.2" - "@radix-ui/react-visually-hidden" "1.2.3" - -"@radix-ui/react-use-callback-ref@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz" - integrity sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg== - -"@radix-ui/react-use-controllable-state@1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz" - integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg== - dependencies: - "@radix-ui/react-use-effect-event" "0.0.2" - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-use-effect-event@0.0.2": - version "0.0.2" - resolved "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz" - integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-use-escape-keydown@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz" - integrity sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g== - dependencies: - "@radix-ui/react-use-callback-ref" "1.1.1" - -"@radix-ui/react-use-layout-effect@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz" - integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== - -"@radix-ui/react-use-previous@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz" - integrity sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ== - -"@radix-ui/react-use-rect@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz" - integrity sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w== - dependencies: - "@radix-ui/rect" "1.1.1" - -"@radix-ui/react-use-size@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz" - integrity sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-visually-hidden@1.2.3": - version "1.2.3" - resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz" - integrity sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug== - dependencies: - "@radix-ui/react-primitive" "2.1.3" - -"@radix-ui/rect@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz" - integrity sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw== - -"@react-hook/intersection-observer@^3.1.1": - version "3.1.2" - resolved "https://registry.npmjs.org/@react-hook/intersection-observer/-/intersection-observer-3.1.2.tgz" - integrity sha512-mWU3BMkmmzyYMSuhO9wu3eJVP21N8TcgYm9bZnTrMwuM818bEk+0NRM3hP+c/TqA9Ln5C7qE53p1H0QMtzYdvQ== - dependencies: - "@react-hook/passive-layout-effect" "^1.2.0" - intersection-observer "^0.10.0" - -"@react-hook/passive-layout-effect@^1.2.0": - version "1.2.1" - resolved "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz" - integrity sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg== - -"@rolldown/pluginutils@1.0.0-beta.19": - version "1.0.0-beta.19" - resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz" - integrity sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA== - -"@rollup/rollup-linux-x64-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz" - integrity sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw== - -"@rollup/rollup-linux-x64-musl@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz" - integrity sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g== - -"@stitches/core@^1.2.6": - version "1.2.8" - resolved "https://registry.npmjs.org/@stitches/core/-/core-1.2.8.tgz" - integrity sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg== - -"@tailwindcss/forms@^0.5.7": - version "0.5.10" - resolved "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz" - integrity sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw== - dependencies: - mini-svg-data-uri "^1.2.3" - -"@tailwindcss/node@4.1.11": - version "4.1.11" - resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz" - integrity sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q== - dependencies: - "@ampproject/remapping" "^2.3.0" - enhanced-resolve "^5.18.1" - jiti "^2.4.2" - lightningcss "1.30.1" - magic-string "^0.30.17" - source-map-js "^1.2.1" - tailwindcss "4.1.11" - -"@tailwindcss/oxide-linux-x64-gnu@4.1.11": - version "4.1.11" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz" - integrity sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg== - -"@tailwindcss/oxide-linux-x64-musl@4.1.11": - version "4.1.11" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz" - integrity sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q== - -"@tailwindcss/oxide@4.1.11": - version "4.1.11" - resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz" - integrity sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg== - dependencies: - detect-libc "^2.0.4" - tar "^7.4.3" - optionalDependencies: - "@tailwindcss/oxide-android-arm64" "4.1.11" - "@tailwindcss/oxide-darwin-arm64" "4.1.11" - "@tailwindcss/oxide-darwin-x64" "4.1.11" - "@tailwindcss/oxide-freebsd-x64" "4.1.11" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.11" - "@tailwindcss/oxide-linux-arm64-gnu" "4.1.11" - "@tailwindcss/oxide-linux-arm64-musl" "4.1.11" - "@tailwindcss/oxide-linux-x64-gnu" "4.1.11" - "@tailwindcss/oxide-linux-x64-musl" "4.1.11" - "@tailwindcss/oxide-wasm32-wasi" "4.1.11" - "@tailwindcss/oxide-win32-arm64-msvc" "4.1.11" - "@tailwindcss/oxide-win32-x64-msvc" "4.1.11" - -"@tailwindcss/postcss@^4.1.11": - version "4.1.11" - resolved "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz" - integrity sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA== - dependencies: - "@alloc/quick-lru" "^5.2.0" - "@tailwindcss/node" "4.1.11" - "@tailwindcss/oxide" "4.1.11" - postcss "^8.4.41" - tailwindcss "4.1.11" - -"@tailwindcss/typography@^0.5.16": - version "0.5.16" - resolved "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz" - integrity sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA== - dependencies: - lodash.castarray "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - postcss-selector-parser "6.0.10" - -"@tanstack/react-virtual@^3.13.12": - version "3.13.12" - resolved "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz" - integrity sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA== - dependencies: - "@tanstack/virtual-core" "3.13.12" - -"@tanstack/virtual-core@3.13.12": - version "3.13.12" - resolved "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz" - integrity sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA== - -"@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.27.0" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz" - integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.20.7" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz" - integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== - dependencies: - "@babel/types" "^7.20.7" - -"@types/debug@^4.0.0": - version "4.1.12" - resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - -"@types/diff@^7.0.2": - version "7.0.2" - resolved "https://registry.npmjs.org/@types/diff/-/diff-7.0.2.tgz" - integrity sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q== - -"@types/dom-to-image@^2.6.7": - version "2.6.7" - resolved "https://registry.npmjs.org/@types/dom-to-image/-/dom-to-image-2.6.7.tgz" - integrity sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg== - -"@types/estree-jsx@^1.0.0": - version "1.0.5" - resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz" - integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== - dependencies: - "@types/estree" "*" - -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@1.0.8": - version "1.0.8" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/hast@^3.0.0": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/marked@^6.0.0": - version "6.0.0" - resolved "https://registry.npmjs.org/@types/marked/-/marked-6.0.0.tgz" - integrity sha512-jmjpa4BwUsmhxcfsgUit/7A9KbrC48Q0q8KvnY107ogcjGgTFDlIL3RpihNpx2Mu1hM4mdFQjoVc4O6JoGKHsA== - dependencies: - marked "*" - -"@types/mdast@^4.0.0": - version "4.0.4" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz" - integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== - dependencies: - "@types/unist" "*" - -"@types/ms@*": - version "2.1.0" - resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" - integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== - -"@types/node@^20.19.0 || >=22.12.0", "@types/node@^24.0.10": - version "24.0.10" - resolved "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz" - integrity sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA== - dependencies: - undici-types "~7.8.0" - -"@types/react-dom@*", "@types/react-dom@^19.1.6": - version "19.1.6" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz" - integrity sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw== - -"@types/react@*", "@types/react@^19.0.0", "@types/react@^19.1.8": - version "19.1.8" - resolved "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz" - integrity sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g== - dependencies: - csstype "^3.0.2" - -"@types/unist@*", "@types/unist@^3.0.0": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/unist@^2.0.0": - version "2.0.11" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" - integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== - -"@types/uuid@^10.0.0": - version "10.0.0" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz" - integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== - -"@typescript-eslint/eslint-plugin@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz" - integrity sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.35.1" - "@typescript-eslint/type-utils" "8.35.1" - "@typescript-eslint/utils" "8.35.1" - "@typescript-eslint/visitor-keys" "8.35.1" - graphemer "^1.4.0" - ignore "^7.0.0" - natural-compare "^1.4.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/parser@^8.35.1", "@typescript-eslint/parser@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz" - integrity sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w== - dependencies: - "@typescript-eslint/scope-manager" "8.35.1" - "@typescript-eslint/types" "8.35.1" - "@typescript-eslint/typescript-estree" "8.35.1" - "@typescript-eslint/visitor-keys" "8.35.1" - debug "^4.3.4" - -"@typescript-eslint/project-service@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz" - integrity sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.35.1" - "@typescript-eslint/types" "^8.35.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz" - integrity sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg== - dependencies: - "@typescript-eslint/types" "8.35.1" - "@typescript-eslint/visitor-keys" "8.35.1" - -"@typescript-eslint/tsconfig-utils@^8.35.1", "@typescript-eslint/tsconfig-utils@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz" - integrity sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ== - -"@typescript-eslint/type-utils@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz" - integrity sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ== - dependencies: - "@typescript-eslint/typescript-estree" "8.35.1" - "@typescript-eslint/utils" "8.35.1" - debug "^4.3.4" - ts-api-utils "^2.1.0" - -"@typescript-eslint/types@^8.35.1", "@typescript-eslint/types@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz" - integrity sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ== - -"@typescript-eslint/typescript-estree@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz" - integrity sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g== - dependencies: - "@typescript-eslint/project-service" "8.35.1" - "@typescript-eslint/tsconfig-utils" "8.35.1" - "@typescript-eslint/types" "8.35.1" - "@typescript-eslint/visitor-keys" "8.35.1" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/utils@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz" - integrity sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.35.1" - "@typescript-eslint/types" "8.35.1" - "@typescript-eslint/typescript-estree" "8.35.1" - -"@typescript-eslint/visitor-keys@8.35.1": - version "8.35.1" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz" - integrity sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw== - dependencies: - "@typescript-eslint/types" "8.35.1" - eslint-visitor-keys "^4.2.1" - -"@vitejs/plugin-react@^4.5.2": - version "4.6.0" - resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz" - integrity sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ== - dependencies: - "@babel/core" "^7.27.4" - "@babel/plugin-transform-react-jsx-self" "^7.27.1" - "@babel/plugin-transform-react-jsx-source" "^7.27.1" - "@rolldown/pluginutils" "1.0.0-beta.19" - "@types/babel__core" "^7.20.5" - react-refresh "^0.17.0" - -acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.0, acorn@^8.15.0: - version "8.15.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -anser@^2.1.1: - version "2.3.2" - resolved "https://registry.npmjs.org/anser/-/anser-2.3.2.tgz" - integrity sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-hidden@^1.2.4: - version "1.2.6" - resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz" - integrity sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA== - dependencies: - tslib "^2.0.0" - -autoprefixer@^10.4.21: - version "10.4.21" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz" - integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== - dependencies: - browserslist "^4.24.4" - caniuse-lite "^1.0.30001702" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.1.1" - postcss-value-parser "^4.2.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0, browserslist@^4.24.4, "browserslist@>= 4.21.0": - version "4.25.1" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz" - integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== - dependencies: - caniuse-lite "^1.0.30001726" - electron-to-chromium "^1.5.173" - node-releases "^2.0.19" - update-browserslist-db "^1.1.3" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001726: - version "1.0.30001726" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz" - integrity sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw== - -ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-html4@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" - integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== - -character-entities-legacy@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" - integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== - -character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== - -character-reference-invalid@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz" - integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== - -chokidar@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz" - integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== - -classnames@^2.3.2: - version "2.5.1" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" - integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== - -clean-set@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/clean-set/-/clean-set-1.1.2.tgz" - integrity sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug== - -cm6-theme-basic-light@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/cm6-theme-basic-light/-/cm6-theme-basic-light-0.2.0.tgz" - integrity sha512-1prg2gv44sYfpHscP26uLT/ePrh0mlmVwMSoSd3zYKQ92Ab3jPRLzyCnpyOCQLJbK+YdNs4HvMRqMNYdy4pMhA== - -codemirror@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz" - integrity sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/commands" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/lint" "^6.0.0" - "@codemirror/search" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -compute-scroll-into-view@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-2.0.4.tgz" - integrity sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz" - integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== - -crelt@^1.0.5, crelt@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz" - integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== - -cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -d@^1.0.1, d@^1.0.2, d@1: - version "1.0.2" - resolved "https://registry.npmjs.org/d/-/d-1.0.2.tgz" - integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== - dependencies: - es5-ext "^0.10.64" - type "^2.7.2" - -date-fns@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz" - integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== - -debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.4.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -decode-named-character-reference@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz" - integrity sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q== - dependencies: - character-entities "^2.0.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -dequal@^2.0.0, dequal@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -detect-libc@^2.0.3, detect-libc@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz" - integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA== - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -devlop@^1.0.0, devlop@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz" - integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== - dependencies: - dequal "^2.0.0" - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -diff@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" - integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== - -diff@^8.0.2: - version "8.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz" - integrity sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg== - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -dom-to-image@^2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz" - integrity sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA== - -dotenv@^16.0.3: - version "16.6.1" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz" - integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== - -downshift@^7.6.0: - version "7.6.2" - resolved "https://registry.npmjs.org/downshift/-/downshift-7.6.2.tgz" - integrity sha512-iOv+E1Hyt3JDdL9yYcOgW7nZ7GQ2Uz6YbggwXvKUSleetYhU2nXD482Rz6CzvM4lvI1At34BYruKAL4swRGxaA== - dependencies: - "@babel/runtime" "^7.14.8" - compute-scroll-into-view "^2.0.4" - prop-types "^15.7.2" - react-is "^17.0.2" - tslib "^2.3.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.5.173: - version "1.5.178" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.178.tgz" - integrity sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enhanced-resolve@^5.18.1: - version "5.18.2" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz" - integrity sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14: - version "0.10.64" - resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz" - integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - esniff "^2.0.1" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3, es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.4" - resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz" - integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== - dependencies: - d "^1.0.2" - ext "^1.7.0" - -esbuild@^0.25.0: - version "0.25.5" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz" - integrity sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.5" - "@esbuild/android-arm" "0.25.5" - "@esbuild/android-arm64" "0.25.5" - "@esbuild/android-x64" "0.25.5" - "@esbuild/darwin-arm64" "0.25.5" - "@esbuild/darwin-x64" "0.25.5" - "@esbuild/freebsd-arm64" "0.25.5" - "@esbuild/freebsd-x64" "0.25.5" - "@esbuild/linux-arm" "0.25.5" - "@esbuild/linux-arm64" "0.25.5" - "@esbuild/linux-ia32" "0.25.5" - "@esbuild/linux-loong64" "0.25.5" - "@esbuild/linux-mips64el" "0.25.5" - "@esbuild/linux-ppc64" "0.25.5" - "@esbuild/linux-riscv64" "0.25.5" - "@esbuild/linux-s390x" "0.25.5" - "@esbuild/linux-x64" "0.25.5" - "@esbuild/netbsd-arm64" "0.25.5" - "@esbuild/netbsd-x64" "0.25.5" - "@esbuild/openbsd-arm64" "0.25.5" - "@esbuild/openbsd-x64" "0.25.5" - "@esbuild/sunos-x64" "0.25.5" - "@esbuild/win32-arm64" "0.25.5" - "@esbuild/win32-ia32" "0.25.5" - "@esbuild/win32-x64" "0.25.5" - -escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-carriage@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.1.tgz" - integrity sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - -eslint-plugin-react-hooks@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz" - integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== - -eslint-plugin-react-refresh@^0.4.20: - version "0.4.20" - resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz" - integrity sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA== - -eslint-scope@^8.4.0: - version "8.4.0" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" - integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" - integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== - -"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9.29.0, eslint@>=8.40: - version "9.30.1" - resolved "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz" - integrity sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.21.0" - "@eslint/config-helpers" "^0.3.0" - "@eslint/core" "^0.14.0" - "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.30.1" - "@eslint/plugin-kit" "^0.3.1" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.4.0" - eslint-visitor-keys "^4.2.1" - espree "^10.4.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - 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.3" - -esniff@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz" - integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== - dependencies: - d "^1.0.1" - es5-ext "^0.10.62" - event-emitter "^0.3.5" - type "^2.7.2" - -espree@^10.0.1, espree@^10.4.0: - version "10.4.0" - resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" - integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== - dependencies: - acorn "^8.15.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.1" - -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-util-is-identifier-name@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz" - integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== - -estree-util-visit@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz" - integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/unist" "^3.0.0" - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== - dependencies: - d "1" - es5-ext "~0.10.14" - -eventsource-parser@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz" - integrity sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA== - -eventsource@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/eventsource/-/eventsource-4.0.0.tgz" - integrity sha512-fvIkb9qZzdMxgZrEQDyll+9oJsyaVvY92I2Re+qK0qEJ+w5s0X3dtz+M0VAPOjP1gtU3iqWyjQ0G3nvd5CLZ2g== - dependencies: - eventsource-parser "^3.0.1" - -ext@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== - dependencies: - reusify "^1.0.4" - -fault@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz" - integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== - dependencies: - format "^0.2.0" - -fdir@^6.4.4: - version "6.4.6" - resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz" - integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== - -fdir@^6.4.6: - version "6.4.6" - resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz" - integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -format@^0.2.0: - version "0.2.2" - resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^10.3.10: - version "10.4.5" - resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - 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" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^16.2.0: - version "16.3.0" - resolved "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz" - integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ== - -graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -ignore@^7.0.0: - version "7.0.5" - resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" - integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== - -import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -intersection-observer@^0.10.0: - version "0.10.0" - resolved "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.10.0.tgz" - integrity sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ== - -is-alphabetical@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" - integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== - -is-alphanumerical@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz" - integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== - dependencies: - is-alphabetical "^2.0.0" - is-decimal "^2.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-decimal@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz" - integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - 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== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz" - integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isomorphic.js@^0.2.4: - version "0.2.5" - resolved "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz" - integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jiti@*, jiti@^1.21.6, jiti@>=1.21.0: - version "1.21.7" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" - integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== - -jiti@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz" - integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0, js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lexical@^0.32.1, lexical@0.32.1: - version "0.32.1" - resolved "https://registry.npmjs.org/lexical/-/lexical-0.32.1.tgz" - integrity sha512-Rvr9p00zUwzjXIqElIjMDyl/24QHw68yaqmXUWIT3lSdSAr8OpjSJK3iWBLZwVZwwpVhwShZRckomc+3vSb/zw== - -lib0@^0.2.99: - version "0.2.109" - resolved "https://registry.npmjs.org/lib0/-/lib0-0.2.109.tgz" - integrity sha512-jP0gbnyW0kwlx1Atc4dcHkBbrVAkdHjuyHxtClUPYla7qCmwIif1qZ6vQeJdR5FrOVdn26HvQT0ko01rgW7/Xw== - dependencies: - isomorphic.js "^0.2.4" - -lightningcss-linux-x64-gnu@1.30.1: - version "1.30.1" - resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz" - integrity sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw== - -lightningcss-linux-x64-musl@1.30.1: - version "1.30.1" - resolved "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz" - integrity sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ== - -lightningcss@^1.21.0, lightningcss@1.30.1: - version "1.30.1" - resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz" - integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg== - dependencies: - detect-libc "^2.0.3" - 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.0.0, lilconfig@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" - integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.castarray@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz" - integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -longest-streak@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" - integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lz-string@^1.4.4: - version "1.5.0" - resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" - integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== - -magic-string@^0.30.17: - version "0.30.17" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -markdown-table@^3.0.0: - version "3.0.4" - resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz" - integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== - -marked@*, marked@^16.0.0: - version "16.0.0" - resolved "https://registry.npmjs.org/marked/-/marked-16.0.0.tgz" - integrity sha512-MUKMXDjsD/eptB7GPzxo4xcnLS6oo7/RHimUMHEDRhUooPwmN9BEpMl7AEOJv3bmso169wHI2wUF9VQgL7zfmA== - -mdast-util-directive@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz" - integrity sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q== - dependencies: - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - ccount "^2.0.0" - devlop "^1.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - parse-entities "^4.0.0" - stringify-entities "^4.0.0" - unist-util-visit-parents "^6.0.0" - -mdast-util-from-markdown@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz" - integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== - dependencies: - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - mdast-util-to-string "^4.0.0" - micromark "^4.0.0" - micromark-util-decode-numeric-character-reference "^2.0.0" - micromark-util-decode-string "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - unist-util-stringify-position "^4.0.0" - -mdast-util-frontmatter@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz" - integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - escape-string-regexp "^5.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - micromark-extension-frontmatter "^2.0.0" - -mdast-util-gfm-strikethrough@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz" - integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-gfm-table@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz" - integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - markdown-table "^3.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-gfm-task-list-item@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz" - integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-mdx-expression@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz" - integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-mdx-jsx@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz" - integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - ccount "^2.0.0" - devlop "^1.1.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - parse-entities "^4.0.0" - stringify-entities "^4.0.0" - unist-util-stringify-position "^4.0.0" - vfile-message "^4.0.0" - -mdast-util-mdx@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz" - integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== - dependencies: - mdast-util-from-markdown "^2.0.0" - mdast-util-mdx-expression "^2.0.0" - mdast-util-mdx-jsx "^3.0.0" - mdast-util-mdxjs-esm "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-mdxjs-esm@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz" - integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-phrasing@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz" - integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== - dependencies: - "@types/mdast" "^4.0.0" - unist-util-is "^6.0.0" - -mdast-util-to-markdown@^2.0.0, mdast-util-to-markdown@^2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz" - integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== - dependencies: - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - longest-streak "^3.0.0" - mdast-util-phrasing "^4.0.0" - mdast-util-to-string "^4.0.0" - micromark-util-classify-character "^2.0.0" - micromark-util-decode-string "^2.0.0" - unist-util-visit "^5.0.0" - zwitch "^2.0.0" - -mdast-util-to-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz" - integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== - dependencies: - "@types/mdast" "^4.0.0" - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromark-core-commonmark@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz" - integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== - dependencies: - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - micromark-factory-destination "^2.0.0" - micromark-factory-label "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-factory-title "^2.0.0" - micromark-factory-whitespace "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-classify-character "^2.0.0" - micromark-util-html-tag-name "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-subtokenize "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-directive@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz" - integrity sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== - dependencies: - devlop "^1.0.0" - micromark-factory-space "^2.0.0" - micromark-factory-whitespace "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - parse-entities "^4.0.0" - -micromark-extension-frontmatter@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz" - integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== - dependencies: - fault "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-strikethrough@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz" - integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== - dependencies: - devlop "^1.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-classify-character "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-table@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz" - integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== - dependencies: - devlop "^1.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-task-list-item@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz" - integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== - dependencies: - devlop "^1.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-mdx-expression@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz" - integrity sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q== - dependencies: - "@types/estree" "^1.0.0" - devlop "^1.0.0" - micromark-factory-mdx-expression "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-events-to-acorn "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-mdx-jsx@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz" - integrity sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ== - dependencies: - "@types/estree" "^1.0.0" - devlop "^1.0.0" - estree-util-is-identifier-name "^3.0.0" - micromark-factory-mdx-expression "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-events-to-acorn "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - vfile-message "^4.0.0" - -micromark-extension-mdx-md@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz" - integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== - dependencies: - micromark-util-types "^2.0.0" - -micromark-extension-mdxjs-esm@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz" - integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== - dependencies: - "@types/estree" "^1.0.0" - devlop "^1.0.0" - micromark-core-commonmark "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-events-to-acorn "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - unist-util-position-from-estree "^2.0.0" - vfile-message "^4.0.0" - -micromark-extension-mdxjs@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz" - integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== - dependencies: - acorn "^8.0.0" - acorn-jsx "^5.0.0" - micromark-extension-mdx-expression "^3.0.0" - micromark-extension-mdx-jsx "^3.0.0" - micromark-extension-mdx-md "^2.0.0" - micromark-extension-mdxjs-esm "^3.0.0" - micromark-util-combine-extensions "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-destination@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz" - integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-label@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz" - integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== - dependencies: - devlop "^1.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-mdx-expression@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz" - integrity sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ== - dependencies: - "@types/estree" "^1.0.0" - devlop "^1.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-events-to-acorn "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - unist-util-position-from-estree "^2.0.0" - vfile-message "^4.0.0" - -micromark-factory-space@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz" - integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-title@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz" - integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== - dependencies: - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-whitespace@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz" - integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== - dependencies: - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-character@^2.0.0, micromark-util-character@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz" - integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== - dependencies: - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-chunked@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz" - integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== - dependencies: - micromark-util-symbol "^2.0.0" - -micromark-util-classify-character@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz" - integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-combine-extensions@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz" - integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== - dependencies: - micromark-util-chunked "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-decode-numeric-character-reference@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz" - integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== - dependencies: - micromark-util-symbol "^2.0.0" - -micromark-util-decode-string@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz" - integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^2.0.0" - micromark-util-decode-numeric-character-reference "^2.0.0" - micromark-util-symbol "^2.0.0" - -micromark-util-encode@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz" - integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== - -micromark-util-events-to-acorn@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz" - integrity sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg== - dependencies: - "@types/estree" "^1.0.0" - "@types/unist" "^3.0.0" - devlop "^1.0.0" - estree-util-visit "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - vfile-message "^4.0.0" - -micromark-util-html-tag-name@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz" - integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== - -micromark-util-normalize-identifier@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz" - integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== - dependencies: - micromark-util-symbol "^2.0.0" - -micromark-util-resolve-all@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz" - integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== - dependencies: - micromark-util-types "^2.0.0" - -micromark-util-sanitize-uri@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz" - integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-encode "^2.0.0" - micromark-util-symbol "^2.0.0" - -micromark-util-subtokenize@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz" - integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== - dependencies: - devlop "^1.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-symbol@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz" - integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== - -micromark-util-types@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz" - integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== - -micromark@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz" - integrity sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - micromark-core-commonmark "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-combine-extensions "^2.0.0" - micromark-util-decode-numeric-character-reference "^2.0.0" - micromark-util-encode "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-sanitize-uri "^2.0.0" - micromark-util-subtokenize "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@^1.52.0: - version "1.54.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - -mini-svg-data-uri@^1.2.3: - version "1.4.4" - resolved "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz" - integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== - -minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -minizlib@^3.0.1: - version "3.0.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz" - integrity sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA== - dependencies: - minipass "^7.1.2" - -mkdirp@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" - integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.11: - version "3.3.11" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -outvariant@^1.3.0, outvariant@^1.4.0, outvariant@1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/outvariant/-/outvariant-1.4.0.tgz" - integrity sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw== - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -package-json-from-dist@^1.0.0: - 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== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz" - integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== - dependencies: - "@types/unist" "^2.0.0" - character-entities-legacy "^3.0.0" - character-reference-invalid "^2.0.0" - decode-named-character-reference "^1.0.0" - is-alphanumerical "^2.0.0" - is-decimal "^2.0.0" - is-hexadecimal "^2.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -"picomatch@^3 || ^4", picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.7" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz" - integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== - -playwright-core@1.53.2: - version "1.53.2" - resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.2.tgz" - integrity sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw== - -playwright@1.53.2: - version "1.53.2" - resolved "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz" - integrity sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A== - dependencies: - playwright-core "1.53.2" - optionalDependencies: - fsevents "2.3.2" - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" - integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== - dependencies: - lilconfig "^3.0.0" - yaml "^2.3.4" - -postcss-nested@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz" - integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== - dependencies: - postcss-selector-parser "^6.1.1" - -postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: - version "6.1.2" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@6.0.10: - version "6.0.10" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.41, postcss@^8.4.47, postcss@^8.5.6, postcss@>=8.0.9: - version "8.5.6" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== - dependencies: - nanoid "^3.3.11" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prismjs@^1.30.0: - version "1.30.0" - resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz" - integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== - -prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-devtools-inline@4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/react-devtools-inline/-/react-devtools-inline-4.4.0.tgz" - integrity sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ== - dependencies: - es6-symbol "^3" - -"react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17 || ^18 || ^19", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", react-dom@^19.1.0, "react-dom@>= 18 || >= 19", react-dom@>=16.8.0, react-dom@>=17.0.0, react-dom@>=17.x, react-dom@>=18: - version "19.1.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" - integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== - dependencies: - scheduler "^0.26.0" - -react-error-boundary@^3.1.4: - version "3.1.4" - resolved "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz" - integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== - dependencies: - "@babel/runtime" "^7.12.5" - -react-hook-form@^7.56.1: - version "7.59.0" - resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.59.0.tgz" - integrity sha512-kmkek2/8grqarTJExFNjy+RXDIP8yM+QTl3QL6m6Q8b2bih4ltmiXxH7T9n+yXNK477xPh5yZT/6vD8sYGzJTA== - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-refresh@^0.17.0: - version "0.17.0" - resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz" - integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== - -react-remove-scroll-bar@^2.3.7: - version "2.3.8" - resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz" - integrity sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q== - dependencies: - react-style-singleton "^2.2.2" - tslib "^2.0.0" - -react-remove-scroll@^2.6.3: - version "2.7.1" - resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz" - integrity sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA== - dependencies: - react-remove-scroll-bar "^2.3.7" - react-style-singleton "^2.2.3" - tslib "^2.1.0" - use-callback-ref "^1.3.3" - use-sidecar "^1.1.3" - -react-router-dom@^7.6.3: - version "7.6.3" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.3.tgz" - integrity sha512-DiWJm9qdUAmiJrVWaeJdu4TKu13+iB/8IEi0EW/XgaHCjW/vWGrwzup0GVvaMteuZjKnh5bEvJP/K0MDnzawHw== - dependencies: - react-router "7.6.3" - -react-router@7.6.3: - version "7.6.3" - resolved "https://registry.npmjs.org/react-router/-/react-router-7.6.3.tgz" - integrity sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA== - dependencies: - cookie "^1.0.1" - set-cookie-parser "^2.6.0" - -react-style-singleton@^2.2.2, react-style-singleton@^2.2.3: - version "2.2.3" - resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz" - integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== - dependencies: - get-nonce "^1.0.0" - tslib "^2.0.0" - -"react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", react@^19.1.0, "react@>= 18 || >= 19", react@>=16.12.0, react@>=16.13.1, react@>=16.8, react@>=16.8.0, react@>=17.0.0, react@>=17.x, react@>=18: - version "19.1.0" - resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" - integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.1.7, resolve@^1.22.8: - version "1.22.10" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rollup@^4.40.0: - version "4.44.1" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz" - integrity sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg== - dependencies: - "@types/estree" "1.0.8" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.44.1" - "@rollup/rollup-android-arm64" "4.44.1" - "@rollup/rollup-darwin-arm64" "4.44.1" - "@rollup/rollup-darwin-x64" "4.44.1" - "@rollup/rollup-freebsd-arm64" "4.44.1" - "@rollup/rollup-freebsd-x64" "4.44.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.44.1" - "@rollup/rollup-linux-arm-musleabihf" "4.44.1" - "@rollup/rollup-linux-arm64-gnu" "4.44.1" - "@rollup/rollup-linux-arm64-musl" "4.44.1" - "@rollup/rollup-linux-loongarch64-gnu" "4.44.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.44.1" - "@rollup/rollup-linux-riscv64-gnu" "4.44.1" - "@rollup/rollup-linux-riscv64-musl" "4.44.1" - "@rollup/rollup-linux-s390x-gnu" "4.44.1" - "@rollup/rollup-linux-x64-gnu" "4.44.1" - "@rollup/rollup-linux-x64-musl" "4.44.1" - "@rollup/rollup-win32-arm64-msvc" "4.44.1" - "@rollup/rollup-win32-ia32-msvc" "4.44.1" - "@rollup/rollup-win32-x64-msvc" "4.44.1" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -scheduler@^0.26.0: - version "0.26.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz" - integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.6.0: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -set-cookie-parser@^2.6.0: - version "2.7.1" - resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz" - integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -source-map-js@^1.2.1: - 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== - -static-browser-server@1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/static-browser-server/-/static-browser-server-1.0.3.tgz" - integrity sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA== - dependencies: - "@open-draft/deferred-promise" "^2.1.0" - dotenv "^16.0.3" - mime-db "^1.52.0" - outvariant "^1.3.0" - -strict-event-emitter@^0.4.3: - version "0.4.6" - resolved "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz" - integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -stringify-entities@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" - integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== - dependencies: - character-entities-html4 "^2.0.0" - character-entities-legacy "^3.0.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-mod@^4.0.0, style-mod@^4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz" - integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw== - -sucrase@^3.35.0: - version "3.35.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tabbable@^6.0.0: - version "6.2.0" - resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" - integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== - -tailwindcss@^3.4.0, "tailwindcss@>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1", "tailwindcss@>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1": - version "3.4.17" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz" - integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.6.0" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.2" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.21.6" - lilconfig "^3.1.3" - micromatch "^4.0.8" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.1.1" - postcss "^8.4.47" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.2" - postcss-nested "^6.2.0" - postcss-selector-parser "^6.1.2" - resolve "^1.22.8" - sucrase "^3.35.0" - -tailwindcss@4.1.11: - version "4.1.11" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz" - integrity sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA== - -tapable@^2.2.0: - version "2.2.2" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz" - integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== - -tar@^7.4.3: - version "7.4.3" - resolved "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz" - integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== - dependencies: - "@isaacs/fs-minipass" "^4.0.0" - chownr "^3.0.0" - minipass "^7.1.2" - minizlib "^3.0.1" - mkdirp "^3.0.1" - yallist "^5.0.0" - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -tinyglobby@^0.2.14: - version "0.2.14" - resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz" - integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz" - integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0: - version "2.8.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type@^2.7.2: - version "2.7.3" - resolved "https://registry.npmjs.org/type/-/type-2.7.3.tgz" - integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== - -typescript-eslint@^8.34.1: - version "8.35.1" - resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz" - integrity sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw== - dependencies: - "@typescript-eslint/eslint-plugin" "8.35.1" - "@typescript-eslint/parser" "8.35.1" - "@typescript-eslint/utils" "8.35.1" - -typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0", typescript@~5.8.3: - version "5.8.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz" - integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== - -undici-types@~7.8.0: - version "7.8.0" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz" - integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== - -unidiff@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/unidiff/-/unidiff-1.0.4.tgz" - integrity sha512-ynU0vsAXw0ir8roa+xPCUHmnJ5goc5BTM2Kuc3IJd8UwgaeRs7VSD5+eeaQL+xp1JtB92hu/Zy/Lgy7RZcr1pQ== - dependencies: - diff "^5.1.0" - -unist-util-is@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" - integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-position-from-estree@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz" - integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-stringify-position@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz" - integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-visit-parents@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" - integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - -unist-util-visit@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz" - integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - unist-util-visit-parents "^6.0.0" - -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -use-callback-ref@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz" - integrity sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg== - dependencies: - tslib "^2.0.0" - -use-sidecar@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz" - integrity sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz" - integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== - -vfile-message@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz" - integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-stringify-position "^4.0.0" - -"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0", vite@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/vite/-/vite-7.0.0.tgz" - integrity sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g== - dependencies: - esbuild "^0.25.0" - fdir "^6.4.6" - picomatch "^4.0.2" - postcss "^8.5.6" - rollup "^4.40.0" - tinyglobby "^0.2.14" - optionalDependencies: - fsevents "~2.3.3" - -w3c-keyname@^2.2.4: - version "2.2.8" - resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz" - integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz" - integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== - -yaml@^2.3.4, yaml@^2.4.2: - version "2.8.0" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz" - integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== - -yjs@>=13.5.22: - version "13.6.27" - resolved "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz" - integrity sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw== - dependencies: - lib0 "^0.2.99" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zwitch@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 7989421326ee790b014815c1b770d23378ccecb9 Mon Sep 17 00:00:00 2001 From: dzearing Date: Sat, 19 Jul 2025 20:16:35 -0700 Subject: [PATCH 02/15] adding project scaffolding. --- .gitignore | 3 + .tcmrc.json | 5 + CLAUDE.md | 192 ++++++++++++++++++ apps/v1/client/package.json | 10 +- docs/guides/development/coding-conventions.md | 18 +- package.json | 6 +- packages/tsconfig/react-library.json | 16 ++ pnpm-lock.yaml | 101 +++++++++ tools/repo-scripts/src/tasks/scaffold.ts | 143 ++++++++++++- tools/templates/component-library/.gitignore | 8 + tools/templates/component-library/README.md | 53 +++++ .../templates/component-library/package.json | 48 +++++ .../src/components/Button.module.css | 63 ++++++ .../src/components/Button.tsx | 31 +++ .../templates/component-library/src/css.d.ts | 16 ++ .../templates/component-library/src/index.ts | 3 + .../component-library/src/styles.global.css | 4 + .../templates/component-library/tsconfig.json | 11 + tools/templates/node-app/.gitignore | 8 + tools/templates/node-app/README.md | 27 +++ tools/templates/node-app/package.json | 24 +++ tools/templates/node-app/src/index.ts | 8 + tools/templates/node-app/tsconfig.json | 9 + tools/templates/react-app/.gitignore | 24 +++ tools/templates/react-app/README.md | 35 ++++ tools/templates/react-app/index.html | 13 ++ tools/templates/react-app/package.json | 42 ++++ tools/templates/react-app/src/App.module.css | 39 ++++ tools/templates/react-app/src/App.tsx | 19 ++ tools/templates/react-app/src/css.d.ts | 16 ++ .../templates/react-app/src/index.global.css | 18 ++ tools/templates/react-app/src/main.tsx | 10 + tools/templates/react-app/src/vite-env.d.ts | 1 + tools/templates/react-app/tsconfig.json | 26 +++ tools/templates/react-app/vite.config.ts | 7 + types/css.d.ts | 16 ++ 36 files changed, 1058 insertions(+), 15 deletions(-) create mode 100644 .tcmrc.json create mode 100644 CLAUDE.md create mode 100644 packages/tsconfig/react-library.json create mode 100644 tools/templates/component-library/.gitignore create mode 100644 tools/templates/component-library/README.md create mode 100644 tools/templates/component-library/package.json create mode 100644 tools/templates/component-library/src/components/Button.module.css create mode 100644 tools/templates/component-library/src/components/Button.tsx create mode 100644 tools/templates/component-library/src/css.d.ts create mode 100644 tools/templates/component-library/src/index.ts create mode 100644 tools/templates/component-library/src/styles.global.css create mode 100644 tools/templates/component-library/tsconfig.json create mode 100644 tools/templates/node-app/.gitignore create mode 100644 tools/templates/node-app/README.md create mode 100644 tools/templates/node-app/package.json create mode 100644 tools/templates/node-app/src/index.ts create mode 100644 tools/templates/node-app/tsconfig.json create mode 100644 tools/templates/react-app/.gitignore create mode 100644 tools/templates/react-app/README.md create mode 100644 tools/templates/react-app/index.html create mode 100644 tools/templates/react-app/package.json create mode 100644 tools/templates/react-app/src/App.module.css create mode 100644 tools/templates/react-app/src/App.tsx create mode 100644 tools/templates/react-app/src/css.d.ts create mode 100644 tools/templates/react-app/src/index.global.css create mode 100644 tools/templates/react-app/src/main.tsx create mode 100644 tools/templates/react-app/src/vite-env.d.ts create mode 100644 tools/templates/react-app/tsconfig.json create mode 100644 tools/templates/react-app/vite.config.ts create mode 100644 types/css.d.ts diff --git a/.gitignore b/.gitignore index c5abc7c9..2e6611c6 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ test-results/ # Temporary files (logs, sessions, feedback) temp/ + +# Generated CSS module type definitions +*.module.css.d.ts diff --git a/.tcmrc.json b/.tcmrc.json new file mode 100644 index 00000000..2e5e4a22 --- /dev/null +++ b/.tcmrc.json @@ -0,0 +1,5 @@ +{ + "pattern": "**/*.module.css", + "nameFormat": "camel", + "exportType": "default" +} \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..c4e2a595 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,192 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Claude Flow is a modern project management platform with AI-powered features, organized as a monorepo using pnpm workspaces. The project consists of a V1 application (React + Express) with plans for gradual migration to V2 architecture. + +## Common Commands + +### Development +```bash +# Install dependencies (run from root) +pnpm install + +# Start development (interactive menu) +pnpm dev + +# Start V1 development directly +pnpm dev:v1 +# This starts: +# - Frontend: http://localhost:5173 +# - Backend: http://localhost:3001 + +# Build entire monorepo +pnpm build + +# Build V1 client only +pnpm build:v1 +``` + +### Testing +```bash +# Run all tests (orchestrated with Lage) +pnpm test + +# Run V1 e2e tests +pnpm test:e2e + +# Run V1 e2e tests with UI mode +pnpm test:e2e:ui + +# Run a specific e2e test +cd apps/v1/client && pnpm playwright test +``` + +### Code Quality +```bash +# Lint all packages +pnpm lint + +# Lint with auto-fix +pnpm lint:fix + +# TypeScript type checking +pnpm typecheck + +# Run comprehensive check (build, test, lint) +pnpm check +``` + +### Utilities +```bash +# Create new package from template +pnpm scaffold + +# Clean build artifacts +pnpm clean +``` + +## High-Level Architecture + +### Monorepo Structure +``` +/ +├── apps/ +│ ├── v1/ +│ │ ├── client/ # React 19 + Vite frontend +│ │ └── server/ # Express v5 backend +│ └── v2/ # Future V2 applications +├── packages/ # Shared packages +├── tools/ +│ └── repo-scripts/ # CLI development tools +├── docs/ # Architecture documentation +└── temp/ # Logs, sessions, feedback +``` + +### Key Technologies +- **Frontend**: React 19, TypeScript, Vite, Tailwind CSS, React Router v7 +- **Backend**: Express v5, Claude Code SDK, file-based storage +- **Testing**: Playwright (e2e), configured for headless Chromium +- **Build**: pnpm workspaces, Lage orchestration, TypeScript project references +- **Development**: Hot reload for frontend, manual restart required for server + +### Context-Based State Management + +The application uses a hierarchical context provider structure: +``` +AppProvider → ThemeProvider → ToastProvider → AuthProvider → +GitHubProvider → WorkspaceProvider → LayoutProvider → SubscriptionProvider +``` + +Key contexts: +- **AppContext**: Core state (projects, work items, personas) +- **WorkspaceContext**: Workspace management with caching +- **ClaudeCodeContext**: Claude API session management +- **SubscriptionContext**: Real-time updates via EventSource/WebSocket + +### Workspace-Driven Architecture + +The application requires workspace selection before functionality is available. Workspaces sync with the backend file system, and projects/work items are discovered from markdown files. + +### Component Organization +- `/components/ui/`: Reusable UI primitives +- `/components/chat/`: Chat functionality +- `/components/claude-code/`: Claude Code integration +- `/components/dialogs/`: Dialog components (no native browser dialogs) + +### Data Flow Patterns +- Client-side caching with `getCached` utility +- Progressive loading (light data first) +- Optimistic UI updates +- Real-time sync via subscriptions +- File system as database on server + +### Server Architecture +- Express middleware stack +- In-memory caching with TTL +- Session persistence in `/temp/sessions/` +- Claude API integration service +- Feedback system with screenshot capture + +## Important Development Notes + +### Server Restart Required +**CRITICAL**: When modifying ANY server files (`/apps/v1/server/*.js`), you MUST manually restart the server. The development server does not auto-restart. Always remind users: **"Please restart your server to apply these changes"** + +### Dialog Patterns +- **NEVER** use `alert()`, `confirm()`, or `prompt()` +- Always use React dialog components (e.g., `ConfirmDialog`) +- Maintain consistent dialog UI/UX patterns + +### File Operations +- Use absolute paths in all file operations +- Workspace data stored in file system +- Feedback stored in `/temp/feedback/` +- Sessions stored in `/temp/sessions/` + +### Testing Practices +- E2E tests use Playwright with headless Chromium +- Tests are in `/apps/v1/client/e2e/` +- Mock data supported for consistent testing +- Video/screenshot capture on failure + +### Code Style +- TypeScript for type safety (avoid `any`) +- No CSS-in-JS (use CSS modules or Tailwind) +- Functional components with hooks +- Type imports: `import type { Foo }` or `import { type Foo, Bar }` + +### Git Workflow +- Feature branches: `feature/`, `fix/`, `chore/` +- No AI attribution in commits or code +- Run tests and lint before committing + +## Architecture Principles + +1. **Context Providers** over prop drilling +2. **Lazy Loading** for performance +3. **File System as Database** for workspace data +4. **Real-time First** design +5. **Progressive Enhancement** for UX +6. **Type Safety** throughout + +## Feedback Processing + +When processing feedback: +1. Check `/temp/feedback/reports/` for feedback files +2. Analyze with corresponding screenshots +3. Fix root causes, not symptoms +4. Add tests to prevent regression +5. Document in `/temp/feedback/addressed/` +6. Compact context between files + +## Migration Strategy + +The project follows a phased migration from V1 to V2: +- Phase 0-1: ✅ Repository restructure complete +- Phase 2: 🚧 Core package development +- Phase 3-5: Future V2 development and migration + +See `/docs/guides/migration/migration-v1-to-v2.md` for details. \ No newline at end of file diff --git a/apps/v1/client/package.json b/apps/v1/client/package.json index 2908761c..2da103d0 100644 --- a/apps/v1/client/package.json +++ b/apps/v1/client/package.json @@ -4,8 +4,10 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", + "dev": "tcm src && concurrently --kill-others \"vite\" \"tcm src --watch\"", + "dev:host": "tcm src && concurrently --kill-others \"vite --host\" \"tcm src --watch\"", + "dev:vite-only": "vite", + "build": "tcm src && tsc -b && vite build", "lint": "eslint .", "lint:fix": "eslint . --fix", "preview": "vite preview", @@ -13,7 +15,9 @@ "test": "echo 'Run test:e2e for tests'", "test:e2e": "playwright test", "test:e2e:ui": "playwright test --ui", - "typecheck": "tsc --noEmit" + "typecheck": "tcm src && tsc --noEmit", + "tcm": "tcm src", + "tcm:watch": "tcm src --watch" }, "dependencies": { "@mdxeditor/editor": "^3.39.0", diff --git a/docs/guides/development/coding-conventions.md b/docs/guides/development/coding-conventions.md index 97a1813c..d9d274e6 100644 --- a/docs/guides/development/coding-conventions.md +++ b/docs/guides/development/coding-conventions.md @@ -274,17 +274,23 @@ import { debounce } from 'lodash-es'; ## CSS and Styling +- use css modules +- scope things within a @layer "base" or "overrides" +- use classnames alias "cx" to conditionalize classnames. + ```typescript -// ✅ Use CSS modules +// ✅ Use CSS modules and scope things within base layer or overrides layer. import styles from './Button.module.css'; - +import cx from 'classnames' + ``` ```css -/* ✅ BEM-like naming */ -.button { } -.button--primary { } -.button__icon { } +/* css modules only. */ +@layer base { + .root { } + .circular { } +} ``` ## Documentation diff --git a/package.json b/package.json index 9e7b77de..bf1570a7 100644 --- a/package.json +++ b/package.json @@ -17,13 +17,17 @@ "build:v1": "pnpm --filter @claude-flow/v1-client build", "lint:v1": "pnpm --filter @claude-flow/v1-client lint", "test:e2e": "pnpm --filter @claude-flow/v1-client test:e2e", - "test:e2e:ui": "pnpm --filter @claude-flow/v1-client test:e2e:ui" + "test:e2e:ui": "pnpm --filter @claude-flow/v1-client test:e2e:ui", + "tcm": "tcm", + "tcm:watch": "tcm --watch" }, "devDependencies": { "@types/resolve": "^1.20.6", + "concurrently": "^8.2.0", "lage": "^2.7.9", "resolve": "^1.22.10", "tinyglobby": "^0.2.14", + "typed-css-modules": "^0.9.1", "workspace-tools": "^0.38.4" }, "packageManager": "pnpm@9.0.0" diff --git a/packages/tsconfig/react-library.json b/packages/tsconfig/react-library.json new file mode 100644 index 00000000..b00c7c4b --- /dev/null +++ b/packages/tsconfig/react-library.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "compilerOptions": { + "jsx": "react-jsx", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "target": "ES2020", + "moduleResolution": "bundler", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "esModuleInterop": true, + "skipLibCheck": true + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1bc7f489..1b99d328 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@types/resolve': specifier: ^1.20.6 version: 1.20.6 + concurrently: + specifier: ^8.2.0 + version: 8.2.2 lage: specifier: ^2.7.9 version: 2.14.6 @@ -20,6 +23,9 @@ importers: tinyglobby: specifier: ^0.2.14 version: 0.2.14 + typed-css-modules: + specifier: ^0.9.1 + version: 0.9.1 workspace-tools: specifier: ^0.38.4 version: 0.38.4 @@ -3454,6 +3460,15 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3629,6 +3644,9 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} + is-there@4.5.2: + resolution: {integrity: sha512-ixMkfz3rtS1vEsLf0TjgjqUn96Q0ukpUVDMnPYVocJyTzu2G/QgEtqYddcHZawHO+R31cKVPggJmBLrm1vJCOg==} + is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -4492,6 +4510,30 @@ packages: ts-node: optional: true + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -4506,6 +4548,10 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -5075,6 +5121,11 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typed-css-modules@0.9.1: + resolution: {integrity: sha512-W2HWKncdKd+bLWsnuWB2EyuQBzZ7KJ9Byr/67KLiiyGegcN52rOveun9JR8yAvuL5IXunRMxt0eORMtAUj5bmA==} + engines: {node: '>=18.0.0'} + hasBin: true + typescript-eslint@8.36.0: resolution: {integrity: sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -8956,6 +9007,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 + icss-replace-symbols@1.1.0: {} + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -9131,6 +9188,8 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 + is-there@4.5.2: {} + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 @@ -10390,6 +10449,27 @@ snapshots: optionalDependencies: postcss: 8.5.6 + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-nested@6.2.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -10405,6 +10485,11 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.5.6: @@ -11067,6 +11152,22 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typed-css-modules@0.9.1: + dependencies: + camelcase: 6.3.0 + chalk: 4.1.2 + chokidar: 3.6.0 + glob: 10.4.5 + icss-replace-symbols: 1.1.0 + is-there: 4.5.2 + mkdirp: 3.0.1 + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + yargs: 17.7.2 + typescript-eslint@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3): dependencies: '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) diff --git a/tools/repo-scripts/src/tasks/scaffold.ts b/tools/repo-scripts/src/tasks/scaffold.ts index a2ac7076..3df3a3fe 100644 --- a/tools/repo-scripts/src/tasks/scaffold.ts +++ b/tools/repo-scripts/src/tasks/scaffold.ts @@ -1,14 +1,147 @@ import chalk from 'chalk'; +import inquirer from 'inquirer'; +import path from 'path'; +import fs from 'fs-extra'; +import { fileURLToPath } from 'url'; import type { Task } from '../types.js'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const TEMPLATE_TYPES = { + 'node-app': 'Node.js application', + 'react-app': 'React application with Vite', + 'component-library': 'React component library' +}; + +async function replaceTemplateVariables(filePath: string, variables: Record) { + const content = await fs.readFile(filePath, 'utf-8'); + let updatedContent = content; + + for (const [key, value] of Object.entries(variables)) { + const regex = new RegExp(`{{${key}}}`, 'g'); + updatedContent = updatedContent.replace(regex, value); + } + + await fs.writeFile(filePath, updatedContent); +} + +async function processDirectory(dir: string, variables: Record) { + const entries = await fs.readdir(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + if (entry.isDirectory()) { + await processDirectory(fullPath, variables); + } else if (entry.isFile()) { + // Replace variables in text files + const ext = path.extname(entry.name); + const textExtensions = ['.json', '.ts', '.tsx', '.js', '.jsx', '.md', '.html', '.css', '.yml', '.yaml']; + + if (textExtensions.includes(ext)) { + await replaceTemplateVariables(fullPath, variables); + } + } + } +} + const scaffold: Task = { - command: 'scaffold ', + command: 'scaffold', description: 'Create a new package from template', execute: async (additionalArgs = []) => { - const type = additionalArgs[0]; - console.log(chalk.blue(`Scaffolding new ${type}...`)); - // TODO: Implement scaffolding logic - console.log(chalk.yellow('Scaffolding not yet implemented')); + try { + // Get template type from args or prompt + let templateType = additionalArgs[0]; + + if (!templateType || !Object.keys(TEMPLATE_TYPES).includes(templateType)) { + const answers = await inquirer.prompt([ + { + type: 'list', + name: 'templateType', + message: 'What type of package would you like to create?', + choices: Object.entries(TEMPLATE_TYPES).map(([value, label]) => ({ + name: label, + value + })) + } + ]); + templateType = answers.templateType; + } + + // Prompt for package details + const packageAnswers = await inquirer.prompt([ + { + type: 'input', + name: 'name', + message: 'Package name (without @claude-flow/ prefix):', + validate: (input: string) => { + if (!input) return 'Package name is required'; + if (!/^[a-z0-9-]+$/.test(input)) { + return 'Package name must be lowercase letters, numbers, and hyphens only'; + } + return true; + } + }, + { + type: 'input', + name: 'description', + message: 'Package description:', + default: '' + }, + { + type: 'list', + name: 'location', + message: 'Where should this package be created?', + choices: [ + { name: 'apps/', value: 'apps' }, + { name: 'packages/', value: 'packages' } + ], + default: templateType === 'react-app' ? 'apps' : 'packages' + } + ]); + + // Determine paths + const repoRoot = path.resolve(__dirname, '../../../..'); + const templatePath = path.join(repoRoot, 'tools', 'templates', templateType!); + const targetPath = path.join(repoRoot, packageAnswers.location, packageAnswers.name); + + // Check if target already exists + if (await fs.pathExists(targetPath)) { + console.log(chalk.red(`Error: Directory ${targetPath} already exists`)); + return { success: false }; + } + + // Copy template + console.log(chalk.blue(`Creating ${templateType} at ${targetPath}...`)); + await fs.copy(templatePath, targetPath); + + // Replace template variables + const variables = { + name: packageAnswers.name, + description: packageAnswers.description || `${packageAnswers.name} package` + }; + + await processDirectory(targetPath, variables); + + console.log(chalk.green(`✓ Created ${templateType} package: ${packageAnswers.name}`)); + console.log(chalk.gray(` Location: ${targetPath}`)); + console.log(); + console.log(chalk.cyan('Next steps:')); + console.log(chalk.gray(' 1. cd ' + path.relative(process.cwd(), targetPath))); + console.log(chalk.gray(' 2. pnpm install')); + + if (templateType === 'react-app') { + console.log(chalk.gray(' 3. pnpm dev')); + } else { + console.log(chalk.gray(' 3. pnpm build')); + } + + return { success: true }; + } catch (error) { + console.error(chalk.red('Error during scaffolding:'), error); + return { success: false }; + } } }; diff --git a/tools/templates/component-library/.gitignore b/tools/templates/component-library/.gitignore new file mode 100644 index 00000000..f82095cb --- /dev/null +++ b/tools/templates/component-library/.gitignore @@ -0,0 +1,8 @@ +node_modules +lib +dist +*.log +.DS_Store +temp +.env +.env.local \ No newline at end of file diff --git a/tools/templates/component-library/README.md b/tools/templates/component-library/README.md new file mode 100644 index 00000000..b4e460b2 --- /dev/null +++ b/tools/templates/component-library/README.md @@ -0,0 +1,53 @@ +# {{name}} + +{{description}} + +## Installation + +```bash +pnpm add @claude-flow/{{name}} +``` + +## Usage + +```tsx +import { Button } from '@claude-flow/{{name}}'; +// Optional: import global styles if needed +import '@claude-flow/{{name}}/styles.global.css'; + +function App() { + return ( + + ); +} +``` + +## Development + +```bash +# Install dependencies +pnpm install + +# Build the library +pnpm build + +# Watch mode +pnpm dev + +# Type checking +pnpm typecheck +``` + +## Components + +### Button + +A flexible button component with multiple variants and sizes. + +```tsx + + + +``` \ No newline at end of file diff --git a/tools/templates/component-library/package.json b/tools/templates/component-library/package.json new file mode 100644 index 00000000..e25f3867 --- /dev/null +++ b/tools/templates/component-library/package.json @@ -0,0 +1,48 @@ +{ + "name": "@claude-flow/{{name}}", + "version": "0.0.1", + "private": true, + "description": "{{description}}", + "type": "module", + "main": "./lib/index.js", + "module": "./lib/index.js", + "types": "./lib/index.d.ts", + "exports": { + ".": { + "types": "./lib/index.d.ts", + "import": "./lib/index.js" + }, + "./styles.global.css": "./lib/styles.global.css" + }, + "files": [ + "lib" + ], + "scripts": { + "build": "tcm src && tsc -b && cp src/**/*.css lib/", + "dev": "concurrently \"tsc -b --watch\" \"tcm src --watch\"", + "clean": "repo-scripts clean", + "lint": "eslint src/**/*.{ts,tsx}", + "lint:fix": "eslint src/**/*.{ts,tsx} --fix", + "test": "echo 'No tests configured'", + "typecheck": "tcm src && tsc --noEmit", + "tcm": "tcm src", + "tcm:watch": "tcm src --watch" + }, + "dependencies": { + "classnames": "^2.5.1" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "devDependencies": { + "@claude-flow/tsconfig": "workspace:*", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "concurrently": "^8.2.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "typed-css-modules": "^0.9.1", + "typescript": "~5.8.3" + } +} \ No newline at end of file diff --git a/tools/templates/component-library/src/components/Button.module.css b/tools/templates/component-library/src/components/Button.module.css new file mode 100644 index 00000000..a07e3732 --- /dev/null +++ b/tools/templates/component-library/src/components/Button.module.css @@ -0,0 +1,63 @@ +@layer base { + .root { + display: inline-flex; + align-items: center; + justify-content: center; + font-weight: 500; + border-radius: 6px; + transition: all 0.2s; + border: none; + cursor: pointer; + outline: none; + } + + .root:focus { + outline: 2px solid transparent; + outline-offset: 2px; + box-shadow: 0 0 0 2px currentColor; + } + + /* Variants */ + .primary { + background-color: #3b82f6; + color: white; + } + + .primary:hover { + background-color: #2563eb; + } + + .secondary { + background-color: #e5e7eb; + color: #1f2937; + } + + .secondary:hover { + background-color: #d1d5db; + } + + .danger { + background-color: #dc2626; + color: white; + } + + .danger:hover { + background-color: #b91c1c; + } + + /* Sizes */ + .sm { + padding: 0.375rem 0.75rem; + font-size: 0.875rem; + } + + .md { + padding: 0.5rem 1rem; + font-size: 1rem; + } + + .lg { + padding: 0.75rem 1.5rem; + font-size: 1.125rem; + } +} \ No newline at end of file diff --git a/tools/templates/component-library/src/components/Button.tsx b/tools/templates/component-library/src/components/Button.tsx new file mode 100644 index 00000000..5d25832c --- /dev/null +++ b/tools/templates/component-library/src/components/Button.tsx @@ -0,0 +1,31 @@ +import type { ButtonHTMLAttributes, ReactNode } from 'react'; +import cx from 'classnames'; +import styles from './Button.module.css'; + +export interface ButtonProps extends ButtonHTMLAttributes { + variant?: 'primary' | 'secondary' | 'danger'; + size?: 'sm' | 'md' | 'lg'; + children: ReactNode; +} + +export function Button({ + variant = 'primary', + size = 'md', + className, + children, + ...props +}: ButtonProps) { + return ( + + ); +} \ No newline at end of file diff --git a/tools/templates/component-library/src/css.d.ts b/tools/templates/component-library/src/css.d.ts new file mode 100644 index 00000000..f16c7c24 --- /dev/null +++ b/tools/templates/component-library/src/css.d.ts @@ -0,0 +1,16 @@ +// Type declarations for CSS imports + +// For plain CSS files (no CSS modules) +declare module '*.css' { + const content: never; + export default content; +} + +// For global CSS files (explicitly global styles) +declare module '*.global.css' { + const content: never; + export default content; +} + +// Note: CSS modules (*.module.css) are handled by typed-css-modules +// which generates specific type definitions for each module \ No newline at end of file diff --git a/tools/templates/component-library/src/index.ts b/tools/templates/component-library/src/index.ts new file mode 100644 index 00000000..a8974e16 --- /dev/null +++ b/tools/templates/component-library/src/index.ts @@ -0,0 +1,3 @@ +// Export all components +export { Button } from './components/Button'; +export type { ButtonProps } from './components/Button'; \ No newline at end of file diff --git a/tools/templates/component-library/src/styles.global.css b/tools/templates/component-library/src/styles.global.css new file mode 100644 index 00000000..7fad4c66 --- /dev/null +++ b/tools/templates/component-library/src/styles.global.css @@ -0,0 +1,4 @@ +/* Global styles for component library */ +@layer base { + /* Add any global component library styles here */ +} \ No newline at end of file diff --git a/tools/templates/component-library/tsconfig.json b/tools/templates/component-library/tsconfig.json new file mode 100644 index 00000000..816e8e1e --- /dev/null +++ b/tools/templates/component-library/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@claude-flow/tsconfig/react-library.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib", + "declaration": true, + "emitDeclarationOnly": false + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib", "**/*.test.ts", "**/*.test.tsx"] +} \ No newline at end of file diff --git a/tools/templates/node-app/.gitignore b/tools/templates/node-app/.gitignore new file mode 100644 index 00000000..f82095cb --- /dev/null +++ b/tools/templates/node-app/.gitignore @@ -0,0 +1,8 @@ +node_modules +lib +dist +*.log +.DS_Store +temp +.env +.env.local \ No newline at end of file diff --git a/tools/templates/node-app/README.md b/tools/templates/node-app/README.md new file mode 100644 index 00000000..b8b49116 --- /dev/null +++ b/tools/templates/node-app/README.md @@ -0,0 +1,27 @@ +# {{name}} + +{{description}} + +## Usage + +```bash +# Install dependencies +pnpm install + +# Build +pnpm build + +# Development mode (watch) +pnpm dev + +# Run +node lib/index.js +``` + +## Scripts + +- `pnpm build` - Compile TypeScript +- `pnpm dev` - Watch mode compilation +- `pnpm lint` - Run ESLint +- `pnpm test` - Run tests +- `pnpm typecheck` - Type checking \ No newline at end of file diff --git a/tools/templates/node-app/package.json b/tools/templates/node-app/package.json new file mode 100644 index 00000000..8d081d3b --- /dev/null +++ b/tools/templates/node-app/package.json @@ -0,0 +1,24 @@ +{ + "name": "@claude-flow/{{name}}", + "version": "1.0.0", + "private": true, + "description": "{{description}}", + "type": "module", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "scripts": { + "build": "tsc -b", + "dev": "tsc -b --watch", + "clean": "repo-scripts clean", + "lint": "eslint src/**/*.ts", + "lint:fix": "eslint src/**/*.ts --fix", + "test": "echo 'No tests configured'", + "typecheck": "tsc --noEmit" + }, + "dependencies": {}, + "devDependencies": { + "@claude-flow/tsconfig": "workspace:*", + "@types/node": "^20.0.0", + "typescript": "~5.8.3" + } +} \ No newline at end of file diff --git a/tools/templates/node-app/src/index.ts b/tools/templates/node-app/src/index.ts new file mode 100644 index 00000000..e5c020c2 --- /dev/null +++ b/tools/templates/node-app/src/index.ts @@ -0,0 +1,8 @@ +export function main(): void { + console.log('Hello from {{name}}!'); +} + +// Run if called directly +if (import.meta.url === `file://${process.argv[1]}`) { + main(); +} \ No newline at end of file diff --git a/tools/templates/node-app/tsconfig.json b/tools/templates/node-app/tsconfig.json new file mode 100644 index 00000000..2b638c37 --- /dev/null +++ b/tools/templates/node-app/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@claude-flow/tsconfig/node.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib"] +} \ No newline at end of file diff --git a/tools/templates/react-app/.gitignore b/tools/templates/react-app/.gitignore new file mode 100644 index 00000000..54f07af5 --- /dev/null +++ b/tools/templates/react-app/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? \ No newline at end of file diff --git a/tools/templates/react-app/README.md b/tools/templates/react-app/README.md new file mode 100644 index 00000000..0c08a991 --- /dev/null +++ b/tools/templates/react-app/README.md @@ -0,0 +1,35 @@ +# {{name}} + +{{description}} + +## Development + +```bash +# Install dependencies +pnpm install + +# Start development server +pnpm dev + +# Build for production +pnpm build + +# Preview production build +pnpm preview +``` + +## Scripts + +- `pnpm dev` - Start development server +- `pnpm build` - Build for production +- `pnpm lint` - Run ESLint +- `pnpm preview` - Preview production build +- `pnpm typecheck` - Type checking + +## Technologies + +- React 19 +- TypeScript +- Vite +- CSS Modules +- React Router \ No newline at end of file diff --git a/tools/templates/react-app/index.html b/tools/templates/react-app/index.html new file mode 100644 index 00000000..949838b5 --- /dev/null +++ b/tools/templates/react-app/index.html @@ -0,0 +1,13 @@ + + + + + + + {{name}} + + +
+ + + \ No newline at end of file diff --git a/tools/templates/react-app/package.json b/tools/templates/react-app/package.json new file mode 100644 index 00000000..ba67e947 --- /dev/null +++ b/tools/templates/react-app/package.json @@ -0,0 +1,42 @@ +{ + "name": "@claude-flow/{{name}}", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "tcm src && concurrently --kill-others \"vite\" \"tcm src --watch\"", + "dev:host": "tcm src && concurrently --kill-others \"vite --host\" \"tcm src --watch\"", + "dev:vite-only": "vite", + "build": "tcm src && tsc -b && vite build", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "preview": "vite preview", + "clean": "repo-scripts clean", + "test": "echo 'No tests configured'", + "typecheck": "tcm src && tsc --noEmit", + "tcm": "tcm src", + "tcm:watch": "tcm src --watch" + }, + "dependencies": { + "classnames": "^2.5.1", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-router-dom": "^7.6.3" + }, + "devDependencies": { + "@claude-flow/tsconfig": "workspace:*", + "@eslint/js": "^9.29.0", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.5.2", + "concurrently": "^8.2.0", + "eslint": "^9.29.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.2.0", + "typed-css-modules": "^0.9.1", + "typescript": "~5.8.3", + "typescript-eslint": "^8.34.1", + "vite": "^7.0.0" + } +} \ No newline at end of file diff --git a/tools/templates/react-app/src/App.module.css b/tools/templates/react-app/src/App.module.css new file mode 100644 index 00000000..b34ef2ef --- /dev/null +++ b/tools/templates/react-app/src/App.module.css @@ -0,0 +1,39 @@ +@layer base { + .root { + min-height: 100vh; + background-color: #f7f7f7; + display: flex; + align-items: center; + justify-content: center; + } + + .card { + background-color: white; + padding: 2rem; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + max-width: 600px; + width: 100%; + margin: 0 1rem; + } + + .title { + font-size: 2rem; + font-weight: bold; + color: #333; + margin: 0 0 1rem 0; + } + + .description { + color: #666; + line-height: 1.6; + } + + .code { + background-color: #f0f0f0; + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; + font-size: 0.9em; + } +} \ No newline at end of file diff --git a/tools/templates/react-app/src/App.tsx b/tools/templates/react-app/src/App.tsx new file mode 100644 index 00000000..19b6753c --- /dev/null +++ b/tools/templates/react-app/src/App.tsx @@ -0,0 +1,19 @@ +import cx from 'classnames' +import styles from './App.module.css' + +function App() { + return ( +
+
+

+ Welcome to {{name}} +

+

+ Get started by editing src/App.tsx +

+
+
+ ) +} + +export default App \ No newline at end of file diff --git a/tools/templates/react-app/src/css.d.ts b/tools/templates/react-app/src/css.d.ts new file mode 100644 index 00000000..f16c7c24 --- /dev/null +++ b/tools/templates/react-app/src/css.d.ts @@ -0,0 +1,16 @@ +// Type declarations for CSS imports + +// For plain CSS files (no CSS modules) +declare module '*.css' { + const content: never; + export default content; +} + +// For global CSS files (explicitly global styles) +declare module '*.global.css' { + const content: never; + export default content; +} + +// Note: CSS modules (*.module.css) are handled by typed-css-modules +// which generates specific type definitions for each module \ No newline at end of file diff --git a/tools/templates/react-app/src/index.global.css b/tools/templates/react-app/src/index.global.css new file mode 100644 index 00000000..2300f823 --- /dev/null +++ b/tools/templates/react-app/src/index.global.css @@ -0,0 +1,18 @@ +/* Global styles */ +* { + box-sizing: border-box; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} \ No newline at end of file diff --git a/tools/templates/react-app/src/main.tsx b/tools/templates/react-app/src/main.tsx new file mode 100644 index 00000000..86048c61 --- /dev/null +++ b/tools/templates/react-app/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.global.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) \ No newline at end of file diff --git a/tools/templates/react-app/src/vite-env.d.ts b/tools/templates/react-app/src/vite-env.d.ts new file mode 100644 index 00000000..151aa685 --- /dev/null +++ b/tools/templates/react-app/src/vite-env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/tools/templates/react-app/tsconfig.json b/tools/templates/react-app/tsconfig.json new file mode 100644 index 00000000..74e574bf --- /dev/null +++ b/tools/templates/react-app/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} \ No newline at end of file diff --git a/tools/templates/react-app/vite.config.ts b/tools/templates/react-app/vite.config.ts new file mode 100644 index 00000000..8d60bf7f --- /dev/null +++ b/tools/templates/react-app/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) \ No newline at end of file diff --git a/types/css.d.ts b/types/css.d.ts new file mode 100644 index 00000000..f16c7c24 --- /dev/null +++ b/types/css.d.ts @@ -0,0 +1,16 @@ +// Type declarations for CSS imports + +// For plain CSS files (no CSS modules) +declare module '*.css' { + const content: never; + export default content; +} + +// For global CSS files (explicitly global styles) +declare module '*.global.css' { + const content: never; + export default content; +} + +// Note: CSS modules (*.module.css) are handled by typed-css-modules +// which generates specific type definitions for each module \ No newline at end of file From 0b91eedd779d521399957f88d2322ded86f5e79a Mon Sep 17 00:00:00 2001 From: dzearing Date: Sat, 19 Jul 2025 21:00:11 -0700 Subject: [PATCH 03/15] adding project scaffolding. --- pnpm-lock.yaml | 46 ++++++++++----- tools/repo-scripts/src/tasks/scaffold.ts | 42 ++++++++++--- .../component-library/.storybook/main.ts | 20 +++++++ .../component-library/.storybook/preview.ts | 15 +++++ .../templates/component-library/package.json | 17 +++++- .../src/components/Button.stories.tsx | 59 +++++++++++++++++++ .../component-library/vite.config.ts | 7 +++ tools/templates/react-app/.storybook/main.ts | 20 +++++++ .../templates/react-app/.storybook/preview.ts | 15 +++++ tools/templates/react-app/package.json | 13 ++++ tools/templates/react-app/src/App.stories.tsx | 15 +++++ 11 files changed, 246 insertions(+), 23 deletions(-) create mode 100644 tools/templates/component-library/.storybook/main.ts create mode 100644 tools/templates/component-library/.storybook/preview.ts create mode 100644 tools/templates/component-library/src/components/Button.stories.tsx create mode 100644 tools/templates/component-library/vite.config.ts create mode 100644 tools/templates/react-app/.storybook/main.ts create mode 100644 tools/templates/react-app/.storybook/preview.ts create mode 100644 tools/templates/react-app/src/App.stories.tsx diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b99d328..0622a9fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -207,10 +207,10 @@ importers: version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) jest: specifier: ^30.0.4 - version: 30.0.4(@types/node@20.19.7) + version: 30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)) ts-jest: specifier: ^29.4.0 - version: 29.4.0(@babel/core@7.28.0)(@jest/transform@30.0.4)(@jest/types@30.0.1)(babel-jest@30.0.4(@babel/core@7.28.0))(jest-util@30.0.2)(jest@30.0.4(@types/node@20.19.7))(typescript@5.8.3) + version: 29.4.0(@babel/core@7.28.0)(@jest/transform@30.0.4)(@jest/types@30.0.1)(babel-jest@30.0.4(@babel/core@7.28.0))(esbuild@0.25.6)(jest-util@30.0.2)(jest@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)))(typescript@5.8.3) packages/repo-scripts-test: devDependencies: @@ -231,7 +231,7 @@ importers: version: 20.19.7 jest: specifier: ^30.0.4 - version: 30.0.4(@types/node@20.19.7) + version: 30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)) packages/tsconfig: {} @@ -3029,6 +3029,11 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} @@ -6296,7 +6301,7 @@ snapshots: jest-util: 30.0.2 slash: 3.0.0 - '@jest/core@30.0.4': + '@jest/core@30.0.4(esbuild-register@3.6.0(esbuild@0.25.6))': dependencies: '@jest/console': 30.0.4 '@jest/pattern': 30.0.1 @@ -6311,7 +6316,7 @@ snapshots: exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.0.2 - jest-config: 30.0.4(@types/node@24.0.13) + jest-config: 30.0.4(@types/node@24.0.13)(esbuild-register@3.6.0(esbuild@0.25.6)) jest-haste-map: 30.0.2 jest-message-util: 30.0.2 jest-regex-util: 30.0.1 @@ -8433,6 +8438,14 @@ snapshots: d: 1.0.2 ext: 1.7.0 + esbuild-register@3.6.0(esbuild@0.25.6): + dependencies: + debug: 4.4.1 + esbuild: 0.25.6 + transitivePeerDependencies: + - supports-color + optional: true + esbuild@0.19.12: optionalDependencies: '@esbuild/aix-ppc64': 0.19.12 @@ -9300,15 +9313,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.0.4(@types/node@20.19.7): + jest-cli@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)): dependencies: - '@jest/core': 30.0.4 + '@jest/core': 30.0.4(esbuild-register@3.6.0(esbuild@0.25.6)) '@jest/test-result': 30.0.4 '@jest/types': 30.0.1 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.0.4(@types/node@20.19.7) + jest-config: 30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)) jest-util: 30.0.2 jest-validate: 30.0.2 yargs: 17.7.2 @@ -9319,7 +9332,7 @@ snapshots: - supports-color - ts-node - jest-config@30.0.4(@types/node@20.19.7): + jest-config@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)): dependencies: '@babel/core': 7.28.0 '@jest/get-type': 30.0.1 @@ -9347,11 +9360,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.19.7 + esbuild-register: 3.6.0(esbuild@0.25.6) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@30.0.4(@types/node@24.0.13): + jest-config@30.0.4(@types/node@24.0.13)(esbuild-register@3.6.0(esbuild@0.25.6)): dependencies: '@babel/core': 7.28.0 '@jest/get-type': 30.0.1 @@ -9379,6 +9393,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 24.0.13 + esbuild-register: 3.6.0(esbuild@0.25.6) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -9598,12 +9613,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.0.4(@types/node@20.19.7): + jest@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)): dependencies: - '@jest/core': 30.0.4 + '@jest/core': 30.0.4(esbuild-register@3.6.0(esbuild@0.25.6)) '@jest/types': 30.0.1 import-local: 3.2.0 - jest-cli: 30.0.4(@types/node@20.19.7) + jest-cli: 30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -11072,12 +11087,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@30.0.4)(@jest/types@30.0.1)(babel-jest@30.0.4(@babel/core@7.28.0))(jest-util@30.0.2)(jest@30.0.4(@types/node@20.19.7))(typescript@5.8.3): + ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@30.0.4)(@jest/types@30.0.1)(babel-jest@30.0.4(@babel/core@7.28.0))(esbuild@0.25.6)(jest-util@30.0.2)(jest@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 30.0.4(@types/node@20.19.7) + jest: 30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -11090,6 +11105,7 @@ snapshots: '@jest/transform': 30.0.4 '@jest/types': 30.0.1 babel-jest: 30.0.4(@babel/core@7.28.0) + esbuild: 0.25.6 jest-util: 30.0.2 tslib@1.14.1: {} diff --git a/tools/repo-scripts/src/tasks/scaffold.ts b/tools/repo-scripts/src/tasks/scaffold.ts index 3df3a3fe..86de3197 100644 --- a/tools/repo-scripts/src/tasks/scaffold.ts +++ b/tools/repo-scripts/src/tasks/scaffold.ts @@ -127,14 +127,42 @@ const scaffold: Task = { console.log(chalk.green(`✓ Created ${templateType} package: ${packageAnswers.name}`)); console.log(chalk.gray(` Location: ${targetPath}`)); console.log(); - console.log(chalk.cyan('Next steps:')); - console.log(chalk.gray(' 1. cd ' + path.relative(process.cwd(), targetPath))); - console.log(chalk.gray(' 2. pnpm install')); + + // Change to the new directory + process.chdir(targetPath); + console.log(chalk.blue('Installing dependencies...')); - if (templateType === 'react-app') { - console.log(chalk.gray(' 3. pnpm dev')); - } else { - console.log(chalk.gray(' 3. pnpm build')); + // Install dependencies + const { execa } = await import('execa'); + try { + await execa('pnpm', ['install'], { stdio: 'inherit' }); + console.log(chalk.green('✓ Dependencies installed')); + console.log(); + + // Start dev server for react-app and component-library + if (templateType === 'react-app' || templateType === 'component-library') { + console.log(chalk.cyan('Starting development server...')); + console.log(chalk.gray('Press Ctrl+C to stop')); + console.log(); + + await execa('pnpm', ['dev'], { stdio: 'inherit' }); + } else { + // For node-app, just build it + console.log(chalk.blue('Building package...')); + await execa('pnpm', ['build'], { stdio: 'inherit' }); + console.log(chalk.green('✓ Build complete')); + console.log(); + console.log(chalk.cyan('Package is ready!')); + console.log(chalk.gray(`You can run it with: node lib/index.js`)); + } + } catch (error) { + // If the dev server is stopped with Ctrl+C, this is normal + if (error && typeof error === 'object' && 'signal' in error && error.signal === 'SIGINT') { + console.log(); + console.log(chalk.yellow('Development server stopped')); + } else { + throw error; + } } return { success: true }; diff --git a/tools/templates/component-library/.storybook/main.ts b/tools/templates/component-library/.storybook/main.ts new file mode 100644 index 00000000..8bafa725 --- /dev/null +++ b/tools/templates/component-library/.storybook/main.ts @@ -0,0 +1,20 @@ +import type { StorybookConfig } from '@storybook/react-vite'; + +const config: StorybookConfig = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + addons: [ + '@storybook/addon-essentials', + '@storybook/addon-interactions', + '@storybook/addon-links', + '@chromatic-com/storybook' + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, + typescript: { + reactDocgen: 'react-docgen-typescript' + } +}; + +export default config; \ No newline at end of file diff --git a/tools/templates/component-library/.storybook/preview.ts b/tools/templates/component-library/.storybook/preview.ts new file mode 100644 index 00000000..2fcfb6dc --- /dev/null +++ b/tools/templates/component-library/.storybook/preview.ts @@ -0,0 +1,15 @@ +import type { Preview } from '@storybook/react'; +import '../src/styles.global.css'; + +const preview: Preview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + }, +}; + +export default preview; \ No newline at end of file diff --git a/tools/templates/component-library/package.json b/tools/templates/component-library/package.json index e25f3867..df36fdc6 100644 --- a/tools/templates/component-library/package.json +++ b/tools/templates/component-library/package.json @@ -19,7 +19,10 @@ ], "scripts": { "build": "tcm src && tsc -b && cp src/**/*.css lib/", + "build:storybook": "storybook build", "dev": "concurrently \"tsc -b --watch\" \"tcm src --watch\"", + "dev:storybook": "storybook dev -p 6006", + "dev:storybook:host": "storybook dev -p 6006 --host 0.0.0.0", "clean": "repo-scripts clean", "lint": "eslint src/**/*.{ts,tsx}", "lint:fix": "eslint src/**/*.{ts,tsx} --fix", @@ -37,12 +40,24 @@ }, "devDependencies": { "@claude-flow/tsconfig": "workspace:*", + "@chromatic-com/storybook": "^1.0.0", + "@storybook/addon-essentials": "^8.0.0", + "@storybook/addon-interactions": "^8.0.0", + "@storybook/addon-links": "^8.0.0", + "@storybook/blocks": "^8.0.0", + "@storybook/react": "^8.0.0", + "@storybook/react-vite": "^8.0.0", + "@storybook/test": "^8.0.0", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.5.2", "concurrently": "^8.2.0", + "eslint-plugin-storybook": "^0.12.0", "react": "^19.1.0", "react-dom": "^19.1.0", + "storybook": "^8.0.0", "typed-css-modules": "^0.9.1", - "typescript": "~5.8.3" + "typescript": "~5.8.3", + "vite": "^7.0.0" } } \ No newline at end of file diff --git a/tools/templates/component-library/src/components/Button.stories.tsx b/tools/templates/component-library/src/components/Button.stories.tsx new file mode 100644 index 00000000..36833384 --- /dev/null +++ b/tools/templates/component-library/src/components/Button.stories.tsx @@ -0,0 +1,59 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { Button } from './Button'; + +const meta = { + title: 'Components/Button', + component: Button, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + argTypes: { + variant: { + control: 'select', + options: ['primary', 'secondary', 'danger'], + }, + size: { + control: 'select', + options: ['sm', 'md', 'lg'], + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Primary: Story = { + args: { + variant: 'primary', + children: 'Button', + }, +}; + +export const Secondary: Story = { + args: { + variant: 'secondary', + children: 'Button', + }, +}; + +export const Danger: Story = { + args: { + variant: 'danger', + children: 'Button', + }, +}; + +export const Small: Story = { + args: { + size: 'sm', + children: 'Small Button', + }, +}; + +export const Large: Story = { + args: { + size: 'lg', + children: 'Large Button', + }, +}; \ No newline at end of file diff --git a/tools/templates/component-library/vite.config.ts b/tools/templates/component-library/vite.config.ts new file mode 100644 index 00000000..8d60bf7f --- /dev/null +++ b/tools/templates/component-library/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) \ No newline at end of file diff --git a/tools/templates/react-app/.storybook/main.ts b/tools/templates/react-app/.storybook/main.ts new file mode 100644 index 00000000..8bafa725 --- /dev/null +++ b/tools/templates/react-app/.storybook/main.ts @@ -0,0 +1,20 @@ +import type { StorybookConfig } from '@storybook/react-vite'; + +const config: StorybookConfig = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + addons: [ + '@storybook/addon-essentials', + '@storybook/addon-interactions', + '@storybook/addon-links', + '@chromatic-com/storybook' + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, + typescript: { + reactDocgen: 'react-docgen-typescript' + } +}; + +export default config; \ No newline at end of file diff --git a/tools/templates/react-app/.storybook/preview.ts b/tools/templates/react-app/.storybook/preview.ts new file mode 100644 index 00000000..f45a4ed0 --- /dev/null +++ b/tools/templates/react-app/.storybook/preview.ts @@ -0,0 +1,15 @@ +import type { Preview } from '@storybook/react'; +import '../src/index.global.css'; + +const preview: Preview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + }, +}; + +export default preview; \ No newline at end of file diff --git a/tools/templates/react-app/package.json b/tools/templates/react-app/package.json index ba67e947..a59a20e4 100644 --- a/tools/templates/react-app/package.json +++ b/tools/templates/react-app/package.json @@ -7,7 +7,10 @@ "dev": "tcm src && concurrently --kill-others \"vite\" \"tcm src --watch\"", "dev:host": "tcm src && concurrently --kill-others \"vite --host\" \"tcm src --watch\"", "dev:vite-only": "vite", + "dev:storybook": "storybook dev -p 6006", + "dev:storybook:host": "storybook dev -p 6006 --host 0.0.0.0", "build": "tcm src && tsc -b && vite build", + "build:storybook": "storybook build", "lint": "eslint .", "lint:fix": "eslint . --fix", "preview": "vite preview", @@ -25,7 +28,15 @@ }, "devDependencies": { "@claude-flow/tsconfig": "workspace:*", + "@chromatic-com/storybook": "^1.0.0", "@eslint/js": "^9.29.0", + "@storybook/addon-essentials": "^8.0.0", + "@storybook/addon-interactions": "^8.0.0", + "@storybook/addon-links": "^8.0.0", + "@storybook/blocks": "^8.0.0", + "@storybook/react": "^8.0.0", + "@storybook/react-vite": "^8.0.0", + "@storybook/test": "^8.0.0", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "@vitejs/plugin-react": "^4.5.2", @@ -33,7 +44,9 @@ "eslint": "^9.29.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", + "eslint-plugin-storybook": "^0.12.0", "globals": "^16.2.0", + "storybook": "^8.0.0", "typed-css-modules": "^0.9.1", "typescript": "~5.8.3", "typescript-eslint": "^8.34.1", diff --git a/tools/templates/react-app/src/App.stories.tsx b/tools/templates/react-app/src/App.stories.tsx new file mode 100644 index 00000000..ac9829bb --- /dev/null +++ b/tools/templates/react-app/src/App.stories.tsx @@ -0,0 +1,15 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import App from './App'; + +const meta = { + title: 'Example/App', + component: App, + parameters: { + layout: 'fullscreen', + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; \ No newline at end of file From b7875abf025d976ca332704576aa11631fded985 Mon Sep 17 00:00:00 2001 From: dzearing Date: Sun, 20 Jul 2025 22:00:03 -0700 Subject: [PATCH 04/15] making storybook work --- .gitignore | 2 +- apps/v1/client/package.json | 1 - package.json | 6 + pnpm-lock.yaml | 2482 ++++++++++++++++- .../eslint-config/eslint.config.js | 0 .../eslint-config/jest.config.js | 0 .../eslint-config/package.json | 0 .../eslint-config/src/configs/base.ts | 0 .../eslint-config/src/configs/node.ts | 0 .../eslint-config/src/configs/react.ts | 0 .../eslint-config/src/index.ts | 0 .../eslint-config/src/rules/index.ts | 0 .../src/rules/no-default-export.ts | 0 .../eslint-config/src/rules/no-deprecated.ts | 0 .../src/rules/one-export-per-file.ts | 0 .../eslint-config/tsconfig.json | 0 tools/repo-scripts/package.json | 31 +- .../repo-scripts/src/tasks/build-storybook.ts | 15 + tools/repo-scripts/src/tasks/build.ts | 70 +- .../src/tasks/dev-storybook-wsl.ts | 16 + tools/repo-scripts/src/tasks/dev-storybook.ts | 15 + tools/repo-scripts/src/tasks/dev-vite-only.ts | 15 + tools/repo-scripts/src/tasks/dev-wsl.ts | 50 + tools/repo-scripts/src/tasks/dev.ts | 134 +- tools/repo-scripts/src/tasks/preview.ts | 15 + tools/repo-scripts/src/tasks/scaffold.ts | 58 +- tools/repo-scripts/src/tasks/test-e2e-ui.ts | 15 + tools/repo-scripts/src/tasks/test-e2e.ts | 14 + tools/repo-scripts/src/tasks/test-watch.ts | 15 + tools/repo-scripts/src/tasks/test.ts | 109 +- tools/repo-scripts/src/tasks/typecheck.ts | 9 + tools/repo-scripts/src/utilities/copyFiles.ts | 34 + .../src/utilities/detectPackageType.ts | 20 + .../src/utilities/runConcurrently.ts | 36 + .../src/utilities/runPlaywright.ts | 31 + .../src/utilities/runStorybook.ts | 35 + tools/repo-scripts/src/utilities/runTcm.ts | 39 + tools/repo-scripts/src/utilities/runVite.ts | 33 + tools/repo-scripts/src/utilities/runVitest.ts | 30 + .../repo-scripts/templates/package/README.md | 22 - .../templates/package/eslint.config.mjs | 3 - .../templates/package/package.json | 22 - .../templates/package/src/index.ts | 3 - .../templates/package/tests/index.test.js | 8 - .../templates/package/tsconfig.json | 9 - .../component-library/.storybook/main.ts | 9 +- .../component-library/.storybook/preview.ts | 1 + .../templates/component-library/package.json | 41 +- .../src/components/Button.test.tsx | 53 + .../component-library/src/test/setup.ts | 7 + .../component-library/vitest.config.ts | 11 + tools/templates/node-app/package.json | 18 +- tools/templates/node-app/src/index.test.ts | 14 + tools/templates/node-app/vitest.config.ts | 8 + tools/templates/react-app/.storybook/main.ts | 7 +- .../templates/react-app/.storybook/preview.ts | 3 +- tools/templates/react-app/e2e/app.spec.ts | 22 + tools/templates/react-app/package.json | 54 +- .../templates/react-app/playwright.config.ts | 27 + tools/templates/react-app/src/App.stories.tsx | 2 +- tools/templates/react-app/src/App.test.tsx | 22 + tools/templates/react-app/src/test/setup.ts | 7 + tools/templates/react-app/vitest.config.ts | 12 + {packages => tools}/tsconfig/base.json | 1 - {packages => tools}/tsconfig/node.json | 0 {packages => tools}/tsconfig/package.json | 1 + .../tsconfig/react-library.json | 0 {packages => tools}/tsconfig/react.json | 0 68 files changed, 3292 insertions(+), 425 deletions(-) rename {packages => tools}/eslint-config/eslint.config.js (100%) rename {packages => tools}/eslint-config/jest.config.js (100%) rename {packages => tools}/eslint-config/package.json (100%) rename {packages => tools}/eslint-config/src/configs/base.ts (100%) rename {packages => tools}/eslint-config/src/configs/node.ts (100%) rename {packages => tools}/eslint-config/src/configs/react.ts (100%) rename {packages => tools}/eslint-config/src/index.ts (100%) rename {packages => tools}/eslint-config/src/rules/index.ts (100%) rename {packages => tools}/eslint-config/src/rules/no-default-export.ts (100%) rename {packages => tools}/eslint-config/src/rules/no-deprecated.ts (100%) rename {packages => tools}/eslint-config/src/rules/one-export-per-file.ts (100%) rename {packages => tools}/eslint-config/tsconfig.json (100%) create mode 100644 tools/repo-scripts/src/tasks/build-storybook.ts create mode 100644 tools/repo-scripts/src/tasks/dev-storybook-wsl.ts create mode 100644 tools/repo-scripts/src/tasks/dev-storybook.ts create mode 100644 tools/repo-scripts/src/tasks/dev-vite-only.ts create mode 100644 tools/repo-scripts/src/tasks/dev-wsl.ts create mode 100644 tools/repo-scripts/src/tasks/preview.ts create mode 100644 tools/repo-scripts/src/tasks/test-e2e-ui.ts create mode 100644 tools/repo-scripts/src/tasks/test-e2e.ts create mode 100644 tools/repo-scripts/src/tasks/test-watch.ts create mode 100644 tools/repo-scripts/src/utilities/copyFiles.ts create mode 100644 tools/repo-scripts/src/utilities/detectPackageType.ts create mode 100644 tools/repo-scripts/src/utilities/runConcurrently.ts create mode 100644 tools/repo-scripts/src/utilities/runPlaywright.ts create mode 100644 tools/repo-scripts/src/utilities/runStorybook.ts create mode 100644 tools/repo-scripts/src/utilities/runTcm.ts create mode 100644 tools/repo-scripts/src/utilities/runVite.ts create mode 100644 tools/repo-scripts/src/utilities/runVitest.ts delete mode 100644 tools/repo-scripts/templates/package/README.md delete mode 100644 tools/repo-scripts/templates/package/eslint.config.mjs delete mode 100644 tools/repo-scripts/templates/package/package.json delete mode 100644 tools/repo-scripts/templates/package/src/index.ts delete mode 100644 tools/repo-scripts/templates/package/tests/index.test.js delete mode 100644 tools/repo-scripts/templates/package/tsconfig.json create mode 100644 tools/templates/component-library/src/components/Button.test.tsx create mode 100644 tools/templates/component-library/src/test/setup.ts create mode 100644 tools/templates/component-library/vitest.config.ts create mode 100644 tools/templates/node-app/src/index.test.ts create mode 100644 tools/templates/node-app/vitest.config.ts create mode 100644 tools/templates/react-app/e2e/app.spec.ts create mode 100644 tools/templates/react-app/playwright.config.ts create mode 100644 tools/templates/react-app/src/App.test.tsx create mode 100644 tools/templates/react-app/src/test/setup.ts create mode 100644 tools/templates/react-app/vitest.config.ts rename {packages => tools}/tsconfig/base.json (97%) rename {packages => tools}/tsconfig/node.json (100%) rename {packages => tools}/tsconfig/package.json (89%) rename {packages => tools}/tsconfig/react-library.json (100%) rename {packages => tools}/tsconfig/react.json (100%) diff --git a/.gitignore b/.gitignore index 2e6611c6..e5fff875 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,4 @@ test-results/ temp/ # Generated CSS module type definitions -*.module.css.d.ts +*.css.d.ts diff --git a/apps/v1/client/package.json b/apps/v1/client/package.json index 2da103d0..401e1742 100644 --- a/apps/v1/client/package.json +++ b/apps/v1/client/package.json @@ -23,7 +23,6 @@ "@mdxeditor/editor": "^3.39.0", "@tailwindcss/typography": "^0.5.16", "@tanstack/react-virtual": "^3.13.12", - "@types/marked": "^6.0.0", "date-fns": "^4.1.0", "diff": "^8.0.2", "dom-to-image": "^2.6.0", diff --git a/package.json b/package.json index bf1570a7..208fddf6 100644 --- a/package.json +++ b/package.json @@ -30,5 +30,11 @@ "typed-css-modules": "^0.9.1", "workspace-tools": "^0.38.4" }, + "pnpm": { + "overrides": { + "glob@<9": "^11.0.0", + "inflight": "npm:@esm2cjs/inflight@^2.0.0" + } + }, "packageManager": "pnpm@9.0.0" } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0622a9fd..78d1d737 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,10 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + glob@<9: ^11.0.0 + inflight: npm:@esm2cjs/inflight@^2.0.0 + importers: .: @@ -30,6 +34,34 @@ importers: specifier: ^0.38.4 version: 0.38.4 + apps/cool: + dependencies: + classnames: + specifier: ^2.5.1 + version: 2.5.1 + react: + specifier: ^19.1.0 + version: 19.1.0 + react-dom: + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) + react-router-dom: + specifier: ^7.6.3 + version: 7.6.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + devDependencies: + '@claude-flow/repo-scripts': + specifier: workspace:* + version: link:../../tools/repo-scripts + '@claude-flow/tsconfig': + specifier: workspace:* + version: link:../../tools/tsconfig + '@types/react': + specifier: ^19.1.8 + version: 19.1.8 + '@types/react-dom': + specifier: ^19.1.6 + version: 19.1.6(@types/react@19.1.8) + apps/v1/client: dependencies: '@mdxeditor/editor': @@ -41,9 +73,6 @@ importers: '@tanstack/react-virtual': specifier: ^3.13.12 version: 3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@types/marked': - specifier: ^6.0.0 - version: 6.0.0 date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -154,75 +183,17 @@ importers: specifier: ^5.1.0 version: 5.1.0 - packages/eslint-config: - dependencies: - '@eslint/js': - specifier: ^9.29.0 - version: 9.31.0 - '@phenomnomnominal/tsquery': - specifier: ^6.1.3 - version: 6.1.3(typescript@5.8.3) - '@typescript-eslint/utils': - specifier: ^8.34.1 - version: 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - eslint: - specifier: ^9.0.0 - version: 9.31.0(jiti@2.4.2) - eslint-plugin-react: - specifier: ^7.34.0 - version: 7.37.5(eslint@9.31.0(jiti@2.4.2)) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.31.0(jiti@2.4.2)) - eslint-plugin-react-refresh: - specifier: ^0.4.20 - version: 0.4.20(eslint@9.31.0(jiti@2.4.2)) - globals: - specifier: ^16.2.0 - version: 16.3.0 - tsutils: - specifier: ^3.21.0 - version: 3.21.0(typescript@5.8.3) - typescript: - specifier: ^5.0.0 - version: 5.8.3 - typescript-eslint: - specifier: ^8.34.1 - version: 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - devDependencies: - '@claude-flow/repo-scripts': - specifier: workspace:* - version: link:../../tools/repo-scripts - '@claude-flow/tsconfig': - specifier: workspace:* - version: link:../tsconfig - '@types/jest': - specifier: ^30.0.0 - version: 30.0.0 - '@types/node': - specifier: ^20.0.0 - version: 20.19.7 - '@typescript-eslint/rule-tester': - specifier: ^8.34.1 - version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - jest: - specifier: ^30.0.4 - version: 30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)) - ts-jest: - specifier: ^29.4.0 - version: 29.4.0(@babel/core@7.28.0)(@jest/transform@30.0.4)(@jest/types@30.0.1)(babel-jest@30.0.4(@babel/core@7.28.0))(esbuild@0.25.6)(jest-util@30.0.2)(jest@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)))(typescript@5.8.3) - packages/repo-scripts-test: devDependencies: '@claude-flow/eslint-config': specifier: workspace:* - version: link:../eslint-config + version: link:../../tools/eslint-config '@claude-flow/repo-scripts': specifier: workspace:* version: link:../../tools/repo-scripts '@claude-flow/tsconfig': specifier: workspace:* - version: link:../tsconfig + version: link:../../tools/tsconfig '@types/jest': specifier: ^30.0.0 version: 30.0.0 @@ -233,8 +204,6 @@ importers: specifier: ^30.0.4 version: 30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)) - packages/tsconfig: {} - scripts: dependencies: '@claude-flow/repo-scripts': @@ -279,10 +248,92 @@ importers: devDependencies: '@claude-flow/eslint-config': specifier: workspace:* - version: link:../packages/eslint-config + version: link:../tools/eslint-config + + tools/eslint-config: + dependencies: + '@eslint/js': + specifier: ^9.29.0 + version: 9.31.0 + '@phenomnomnominal/tsquery': + specifier: ^6.1.3 + version: 6.1.3(typescript@5.8.3) + '@typescript-eslint/utils': + specifier: ^8.34.1 + version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + eslint: + specifier: ^9.0.0 + version: 9.31.0(jiti@2.4.2) + eslint-plugin-react: + specifier: ^7.34.0 + version: 7.37.5(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.20 + version: 0.4.20(eslint@9.31.0(jiti@2.4.2)) + globals: + specifier: ^16.2.0 + version: 16.3.0 + tsutils: + specifier: ^3.21.0 + version: 3.21.0(typescript@5.8.3) + typescript: + specifier: ^5.0.0 + version: 5.8.3 + typescript-eslint: + specifier: ^8.34.1 + version: 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + devDependencies: + '@claude-flow/repo-scripts': + specifier: workspace:* + version: link:../repo-scripts + '@claude-flow/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 + '@types/node': + specifier: ^20.0.0 + version: 20.19.7 + '@typescript-eslint/rule-tester': + specifier: ^8.34.1 + version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + jest: + specifier: ^30.0.4 + version: 30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)) + ts-jest: + specifier: ^29.4.0 + version: 29.4.0(@babel/core@7.28.0)(@jest/transform@30.0.4)(@jest/types@30.0.1)(babel-jest@30.0.4(@babel/core@7.28.0))(esbuild@0.25.6)(jest-util@30.0.2)(jest@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)))(typescript@5.8.3) tools/repo-scripts: dependencies: + '@eslint/js': + specifier: ^9.29.0 + version: 9.31.0 + '@playwright/test': + specifier: ^1.49.0 + version: 1.54.1 + '@storybook/addon-docs': + specifier: ^9.0.17 + version: 9.0.17(@types/react@19.1.8)(storybook@9.0.17(@testing-library/dom@10.4.0)) + '@storybook/react-vite': + specifier: ^9.0.0 + version: 9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.45.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)(vite@7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@testing-library/jest-dom': + specifier: ^6.6.3 + version: 6.6.3 + '@testing-library/react': + specifier: ^16.1.0 + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@testing-library/user-event': + specifier: ^14.5.2 + version: 14.6.1(@testing-library/dom@10.4.0) + '@vitejs/plugin-react': + specifier: ^4.5.2 + version: 4.6.0(vite@7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) chalk: specifier: ^5.3.0 version: 5.4.1 @@ -292,6 +343,18 @@ importers: concurrently: specifier: ^8.2.0 version: 8.2.2 + eslint: + specifier: ^9.29.0 + version: 9.31.0(jiti@2.4.2) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.20 + version: 0.4.20(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-storybook: + specifier: ^0.12.0 + version: 0.12.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) execa: specifier: ^8.0.0 version: 8.0.1 @@ -301,16 +364,43 @@ importers: glob: specifier: ^10.3.0 version: 10.4.5 + globals: + specifier: ^16.2.0 + version: 16.3.0 inquirer: specifier: ^9.2.0 version: 9.3.7 + jest: + specifier: ^29.0.0 + version: 29.7.0(@types/node@20.19.7) + jsdom: + specifier: ^26.0.0 + version: 26.1.0 + storybook: + specifier: ^9.0.0 + version: 9.0.17(@testing-library/dom@10.4.0) + typed-css-modules: + specifier: ^0.9.1 + version: 0.9.1 + typescript: + specifier: ~5.8.3 + version: 5.8.3 + typescript-eslint: + specifier: ^8.34.1 + version: 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + vite: + specifier: ^7.0.0 + version: 7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + vitest: + specifier: ^2.1.8 + version: 2.1.9(@types/node@20.19.7)(jsdom@26.1.0)(lightningcss@1.30.1) + workspace-tools: + specifier: ^0.38.4 + version: 0.38.4 devDependencies: '@claude-flow/tsconfig': specifier: workspace:* - version: link:../../packages/tsconfig - '@eslint/js': - specifier: ^9.29.0 - version: 9.31.0 + version: link:../tsconfig '@types/fs-extra': specifier: ^11.0.0 version: 11.0.4 @@ -320,21 +410,14 @@ importers: '@types/node': specifier: ^20.0.0 version: 20.19.7 - eslint: - specifier: ^9.0.0 - version: 9.31.0(jiti@2.4.2) - globals: - specifier: ^16.2.0 - version: 16.3.0 - typescript: - specifier: ^5.3.0 - version: 5.8.3 - typescript-eslint: - specifier: ^8.34.1 - version: 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + + tools/tsconfig: {} packages: + '@adobe/css-tools@4.4.3': + resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -348,6 +431,9 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -631,6 +717,34 @@ packages: react: ^16.8.0 || ^17 || ^18 || ^19 react-dom: ^16.8.0 || ^17 || ^18 || ^19 + '@csstools/color-helpers@5.0.2': + resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.0.10': + resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@emnapi/core@1.4.4': resolution: {integrity: sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==} @@ -1220,6 +1334,14 @@ packages: resolution: {integrity: sha512-Ss0Nu4GYvdXAqdzAlui1daRTRmwQFlCq7RQisZ83L3ttGVK4iF81saa8LS7SxiBvtLznXkkGWbSEVsrssufcBg==} engines: {node: '>=18.0.0'} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1236,10 +1358,23 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@30.0.4': resolution: {integrity: sha512-tMLCDvBJBwPqMm4OAiuKm2uF5y5Qe26KgcMn+nrDSWpEW+eeFmqA0iO4zJfL16GP7gE3bUUQ3hIuUJ22AqVRnw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + '@jest/core@30.0.4': resolution: {integrity: sha512-MWScSO9GuU5/HoWjpXAOBs6F/iobvK1XlioelgOM9St7S0Z5WTI9kjCQLPeo4eQRRYusyLW25/J7J5lbFkrYXw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1253,18 +1388,34 @@ packages: resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment@30.0.4': resolution: {integrity: sha512-5NT+sr7ZOb8wW7C4r7wOKnRQ8zmRWQT2gW4j73IXAKp5/PX1Z8MCStBLQDYfIG3n1Sw0NRfYGdp0iIPVooBAFQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect-utils@30.0.4': resolution: {integrity: sha512-EgXecHDNfANeqOkcak0DxsoVI4qkDUsR7n/Lr2vtmTBjwLPBnnPOF71S11Q8IObWzxm2QgQoY6f9hzrRD3gHRA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@30.0.4': resolution: {integrity: sha512-Z/DL7t67LBHSX4UzDyeYKqOxE/n7lbrrgEwWM3dGiH5Dgn35nk+YtgzKudmfIrBI8DRRrKYY5BCo3317HZV1Fw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@30.0.4': resolution: {integrity: sha512-qZ7nxOcL5+gwBO6LErvwVy5k06VsX/deqo2XnVUSTV0TNC9lrg8FC3dARbi+5lmrr5VyX5drragK+xLcOjvjYw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1273,6 +1424,10 @@ packages: resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@30.0.4': resolution: {integrity: sha512-avyZuxEHF2EUhFF6NEWVdxkRRV6iXXcIES66DLhuLlU7lXhtFG/ySq/a8SRZmEJSsLkNAFX6z6mm8KWyXe9OEA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1281,6 +1436,15 @@ packages: resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + '@jest/reporters@30.0.4': resolution: {integrity: sha512-6ycNmP0JSJEEys1FbIzHtjl9BP0tOZ/KN6iMeAKrdvGmUsa1qfRdlQRUDKJ4P84hJ3xHw1yTqJt4fvPNHhyE+g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1290,6 +1454,10 @@ packages: node-notifier: optional: true + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@30.0.1': resolution: {integrity: sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1298,26 +1466,55 @@ packages: resolution: {integrity: sha512-BEpX8M/Y5lG7MI3fmiO+xCnacOrVsnbqVrcDZIT8aSGkKV1w2WwvRQxSWw5SIS8ozg7+h8tSj5EO1Riqqxcdag==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@30.0.1': resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@30.0.4': resolution: {integrity: sha512-Mfpv8kjyKTHqsuu9YugB6z1gcdB3TSSOaKlehtVaiNlClMkEHY+5ZqCY2CrEE3ntpBMlstX/ShDAf84HKWsyIw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-sequencer@30.0.4': resolution: {integrity: sha512-bj6ePmqi4uxAE8EHE0Slmk5uBYd9Vd/PcVt06CsBxzH4bbA8nGsI1YbXl/NH+eii4XRtyrRx+Cikub0x8H4vDg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@30.0.4': resolution: {integrity: sha512-atvy4hRph/UxdCIBp+UB2jhEA/jJiUeGZ7QPgBi9jUUKNgi3WEoMXGNG7zbbELG2+88PMabUNCDchmqgJy3ELg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@30.0.1': resolution: {integrity: sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1': + resolution: {integrity: sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==} + peerDependencies: + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} @@ -1456,6 +1653,12 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + '@mdxeditor/editor@3.39.1': resolution: {integrity: sha512-z9w8HUzAgN0DRHM0xQBNxhstwEAKU1VFf+E0JeJxK3d3YmcwBTS0LoC9tuiTgFtRhUITrfcQzPx4+tOZ9eWDZg==} engines: {node: '>=16'} @@ -1896,6 +2099,15 @@ packages: '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.45.0': resolution: {integrity: sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==} cpu: [arm] @@ -1996,18 +2208,81 @@ packages: cpu: [x64] os: [win32] + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.34.37': resolution: {integrity: sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} '@stitches/core@1.2.8': resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} + '@storybook/addon-docs@9.0.17': + resolution: {integrity: sha512-LOX/kKgQGnyulrqZHsvf77+ZoH/nSUaplGr5hvZglW/U6ak6fO9seJyXAzVKEnC6p+F8n02kFBZbi3s+znQhSg==} + peerDependencies: + storybook: ^9.0.17 + + '@storybook/builder-vite@9.0.17': + resolution: {integrity: sha512-lyuvgGhb0NaVk1tdB4xwzky6+YXQfxlxfNQqENYZ9uYQZdPfErMa4ZTXVQTV+CQHAa2NL+p/dG2JPAeu39e9UA==} + peerDependencies: + storybook: ^9.0.17 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@storybook/csf-plugin@9.0.17': + resolution: {integrity: sha512-6Q4eo1ObrLlsnB6bIt6T8+45XAb4to2pQGNrI7QPkLQRLrZinrJcNbLY7AGkyIoCOEsEbq08n09/nClQUbu8HA==} + peerDependencies: + storybook: ^9.0.17 + + '@storybook/csf@0.1.13': + resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==} + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@1.4.0': + resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + + '@storybook/react-dom-shim@9.0.17': + resolution: {integrity: sha512-ak/x/m6MDDxdE6rCDymTltaiQF3oiKrPHSwfM+YPgQR6MVmzTTs4+qaPfeev7FZEHq23IkfDMTmSTTJtX7Vs9A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.17 + + '@storybook/react-vite@9.0.17': + resolution: {integrity: sha512-wx1yKScni4ifOC/ccqpnnpceQbyF2xto+jHGsyua+M4UUCQdS2NYPDR8JFWp1YvBhVt2cQiD6SAltVGM9QLGnQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.17 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@storybook/react@9.0.17': + resolution: {integrity: sha512-wssao+uXg72OHtEJdQmmQJGdX90x/aU/6avoP3fgVgepWdZXVgciS9mnqHjKRF/vP+vPOlNQcJjojF/zTtq5qg==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.17 + typescript: '>= 4.9.x' + peerDependenciesMeta: + typescript: + optional: true + '@tailwindcss/forms@0.5.10': resolution: {integrity: sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==} peerDependencies: @@ -2115,9 +2390,41 @@ packages: '@tanstack/virtual-core@3.13.12': resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.6.3': + resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2130,12 +2437,21 @@ packages: '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/diff@7.0.2': resolution: {integrity: sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==} + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/dom-to-image@2.6.7': resolution: {integrity: sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg==} @@ -2151,6 +2467,9 @@ packages: '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -2175,13 +2494,12 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - '@types/marked@6.0.0': - resolution: {integrity: sha512-jmjpa4BwUsmhxcfsgUit/7A9KbrC48Q0q8KvnY107ogcjGgTFDlIL3RpihNpx2Mu1hM4mdFQjoVc4O6JoGKHsA==} - deprecated: This is a stub types definition. marked provides its own type definitions, so you do not need this installed. - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -2440,6 +2758,47 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} @@ -2457,6 +2816,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2507,6 +2870,13 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -2539,6 +2909,14 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -2557,16 +2935,30 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + babel-jest@30.0.4: resolution: {integrity: sha512-UjG2j7sAOqsp2Xua1mS/e+ekddkSu3wpf4nZUSvXNHuVWdaOUXQ77+uyjJLDE9i0atm5x4kds8K9yb5lRsRtcA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@babel/core': ^7.11.0 + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + babel-plugin-istanbul@7.0.0: resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} engines: {node: '>=12'} + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@30.0.1: resolution: {integrity: sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2576,6 +2968,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + babel-preset-jest@30.0.1: resolution: {integrity: sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2588,6 +2986,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2634,6 +3036,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2668,6 +3074,14 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} + + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -2695,6 +3109,10 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -2703,10 +3121,17 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + ci-info@4.3.0: resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cjs-module-lexer@2.1.0: resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} @@ -2811,6 +3236,11 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} @@ -2818,11 +3248,18 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -2830,6 +3267,10 @@ packages: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -2858,6 +3299,9 @@ packages: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} @@ -2869,6 +3313,10 @@ packages: babel-plugin-macros: optional: true + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2883,6 +3331,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -2912,6 +3364,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -2931,6 +3387,16 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dom-to-image@2.6.0: resolution: {integrity: sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==} @@ -2983,6 +3449,10 @@ packages: resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} engines: {node: '>=10.13.0'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -3002,6 +3472,9 @@ packages: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -3088,6 +3561,12 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint-plugin-storybook@0.12.0: + resolution: {integrity: sha512-Lg5I0+npTgiYgZ4KSvGWGDFZi3eOCNJPaWX0c9rTEEXC5wvooOClsP9ZtbI4hhFKyKgYR877KiJxbRTSJq9gWA==} + engines: {node: '>= 18'} + peerDependencies: + eslint: '>=8' + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3141,6 +3620,12 @@ packages: estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -3172,6 +3657,18 @@ packages: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@30.0.4: resolution: {integrity: sha512-dDLGjnP2cKbEppxVICxI/Uf4YemmGMPNy0QytCbfafbpYk9AFQsxb8Uyrxii0RPK7FWgLGlSem+07WirwS3cFQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -3240,6 +3737,10 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -3274,9 +3775,6 @@ packages: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3385,9 +3883,10 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} @@ -3442,6 +3941,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -3449,6 +3952,14 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -3498,9 +4009,9 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3568,6 +4079,11 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3615,6 +4131,9 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -3672,6 +4191,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -3689,6 +4212,10 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + istanbul-lib-instrument@6.0.3: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} @@ -3697,6 +4224,10 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + istanbul-lib-source-maps@5.0.6: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} @@ -3712,19 +4243,41 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} hasBin: true + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-changed-files@30.0.2: resolution: {integrity: sha512-Ius/iRST9FKfJI+I+kpiDh8JuUlAISnRszF9ixZDIqJF17FckH5sOzKC8a0wd0+D+8em5ADRHA5V5MnfeDk2WA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@30.0.4: resolution: {integrity: sha512-o6UNVfbXbmzjYgmVPtSQrr5xFZCtkDZGdTlptYvGFSN80RuOOlTe73djvMrs+QAuSERZWcHBNIOMH+OEqvjWuw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + jest-cli@30.0.4: resolution: {integrity: sha512-3dOrP3zqCWBkjoVG1zjYJpD9143N9GUCbwaF2pFF5brnIgRLHmKcCIw+83BvF1LxggfMWBA0gxkn6RuQVuRhIQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -3735,6 +4288,18 @@ packages: node-notifier: optional: true + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + jest-config@30.0.4: resolution: {integrity: sha512-3dzbO6sh34thAGEjJIW0fgT0GA0EVlkski6ZzMcbW6dzhenylXAE/Mj2MI4HonroWbkKc6wU6bLVQ8dvBSZ9lA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -3750,38 +4315,78 @@ packages: ts-node: optional: true + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@30.0.4: resolution: {integrity: sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@30.0.1: resolution: {integrity: sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@30.0.2: resolution: {integrity: sha512-ZFRsTpe5FUWFQ9cWTMguCaiA6kkW5whccPy9JjD1ezxh+mJeqmz8naL8Fl/oSbNJv3rgB0x87WBIkA5CObIUZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-node@30.0.4: resolution: {integrity: sha512-p+rLEzC2eThXqiNh9GHHTC0OW5Ca4ZfcURp7scPjYBcmgpR9HG6750716GuUipYf2AcThU3k20B31USuiaaIEg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@30.0.2: resolution: {integrity: sha512-telJBKpNLeCb4MaX+I5k496556Y2FiKR/QLZc0+MGBYl4k3OO0472drlV2LUe7c1Glng5HuAu+5GLYp//GpdOQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-leak-detector@30.0.2: resolution: {integrity: sha512-U66sRrAYdALq+2qtKffBLDWsQ/XoNNs2Lcr83sc9lvE/hEpNafJlq2lXCPUBMNqamMECNxSIekLfe69qg4KMIQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@30.0.4: resolution: {integrity: sha512-ubCewJ54YzeAZ2JeHHGVoU+eDIpQFsfPQs0xURPWoNiO42LGJ+QGgfSf+hFIRplkZDkhH5MOvuxHKXRTUU3dUQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@30.0.2: resolution: {integrity: sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@30.0.2: resolution: {integrity: sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -3795,46 +4400,96 @@ packages: jest-resolve: optional: true + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@30.0.1: resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@30.0.4: resolution: {integrity: sha512-EQBYow19B/hKr4gUTn+l8Z+YLlP2X0IoPyp0UydOtrcPbIOYzJ8LKdFd+yrbwztPQvmlBFUwGPPEzHH1bAvFAw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@30.0.2: resolution: {integrity: sha512-q/XT0XQvRemykZsvRopbG6FQUT6/ra+XV6rPijyjT6D0msOyCvR2A5PlWZLd+fH0U8XWKZfDiAgrUNDNX2BkCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@30.0.4: resolution: {integrity: sha512-mxY0vTAEsowJwvFJo5pVivbCpuu6dgdXRmt3v3MXjBxFly7/lTk3Td0PaMyGOeNQUFmSuGEsGYqhbn7PA9OekQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@30.0.4: resolution: {integrity: sha512-tUQrZ8+IzoZYIHoPDQEB4jZoPyzBjLjq7sk0KVyd5UPRjRDOsN7o6UlvaGF8ddpGsjznl9PW+KRgWqCNO+Hn7w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@30.0.4: resolution: {integrity: sha512-S/8hmSkeUib8WRUq9pWEb5zMfsOjiYWDWzFzKnjX7eDyKKgimsu9hcmsUEg8a7dPAw8s/FacxsXquq71pDgPjQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@30.0.2: resolution: {integrity: sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@30.0.2: resolution: {integrity: sha512-noOvul+SFER4RIvNAwGn6nmV2fXqBq67j+hKGHKGFCmK4ks/Iy1FSrqQNBLGKlu4ZZIRL6Kg1U72N1nxuRCrGQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@30.0.4: resolution: {integrity: sha512-YESbdHDs7aQOCSSKffG8jXqOKFqw4q4YqR+wHYpR5GWEQioGvL0BfbcjvKIvPEM0XGfsfJrka7jJz3Cc3gI4VQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@30.0.2: resolution: {integrity: sha512-RN1eQmx7qSLFA+o9pfJKlqViwL5wt+OL3Vff/A+/cPsmuw7NPwfgl33AP+/agRmHzPOFgXviRycR9kYwlcRQXg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + jest@30.0.4: resolution: {integrity: sha512-9QE0RS4WwTj/TtTC4h/eFVmFAhGNVerSB9XpJh8sqaXlP73ILcPcZ7JWjjEtJJe2m8QyBLKKfPQuK+3F+Xij/g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -3867,6 +4522,15 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -3899,6 +4563,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + lage@2.14.6: resolution: {integrity: sha512-mc3fbrrroeEkrRYmp6t6VTlgI86657xY8ZDjZ0EGeLm0OcZYmalVnccbx4ZFNLvWhbCyE+2GBzKMluvSa4QCjg==} hasBin: true @@ -3998,6 +4666,10 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -4024,9 +4696,16 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4232,10 +4911,18 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -4247,6 +4934,9 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -4312,6 +5002,9 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nwsapi@2.2.20: + resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4359,6 +5052,10 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -4386,6 +5083,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -4394,6 +5095,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -4419,6 +5124,9 @@ packages: resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} engines: {node: '>=14.13.0'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -4427,9 +5135,9 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} @@ -4446,6 +5154,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-to-regexp@8.2.0: resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} @@ -4454,6 +5166,13 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4568,6 +5287,14 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@30.0.2: resolution: {integrity: sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4576,6 +5303,10 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -4590,6 +5321,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} @@ -4611,6 +5345,15 @@ packages: react-devtools-inline@4.4.0: resolution: {integrity: sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==} + react-docgen-typescript@2.4.0: + resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} + peerDependencies: + typescript: '>= 4.3.x' + + react-docgen@8.0.0: + resolution: {integrity: sha512-kmob/FOTwep7DUWf9KjuenKX0vyvChr3oTdvvPt09V60Iz75FJp+T/0ZeHMbAfJj2WaVWqAPP5Hmm3PYzSPPKg==} + engines: {node: ^20.9.0 || >=22} + react-dom@19.1.0: resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: @@ -4703,6 +5446,14 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -4727,6 +5478,10 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -4757,6 +5512,9 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} @@ -4785,6 +5543,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} @@ -4851,6 +5613,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4858,6 +5623,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4883,6 +5651,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + static-browser-server@1.0.3: resolution: {integrity: sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==} @@ -4894,10 +5665,22 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + storybook@9.0.17: + resolution: {integrity: sha512-O+9jgJ+Trlq9VGD1uY4OBLKQWHHDKM/A/pA8vMW6PVehhGHNvpzcIC1bngr6mL5gGHZP2nBv+9XG8pTMcggMmg==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + strict-event-emitter@0.4.6: resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} @@ -4946,6 +5729,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} @@ -4958,6 +5745,14 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4982,6 +5777,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.11.8: resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5016,10 +5814,46 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -5035,6 +5869,14 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -5045,6 +5887,10 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -5075,6 +5921,10 @@ packages: jest-util: optional: true + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -5099,6 +5949,10 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -5153,6 +6007,10 @@ packages: undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + unidiff@1.0.4: resolution: {integrity: sha512-ynU0vsAXw0ir8roa+xPCUHmnJ5goc5BTM2Kuc3IJd8UwgaeRs7VSD5+eeaQL+xp1JtB92hu/Zy/Lgy7RZcr1pQ==} @@ -5179,6 +6037,10 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} @@ -5229,6 +6091,11 @@ packages: vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite@5.4.19: resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -5300,15 +6167,63 @@ packages: yaml: optional: true + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -5335,6 +6250,11 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -5357,10 +6277,33 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@5.0.1: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5393,6 +6336,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} @@ -5402,6 +6349,8 @@ packages: snapshots: + '@adobe/css-tools@4.4.3': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -5418,6 +6367,14 @@ snapshots: '@img/sharp-linux-x64': 0.33.5 '@img/sharp-win32-x64': 0.33.5 + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -5904,6 +6861,26 @@ snapshots: react-dom: 19.1.0(react@19.1.0) react-is: 17.0.2 + '@csstools/color-helpers@5.0.2': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.0.2 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + '@emnapi/core@1.4.4': dependencies: '@emnapi/wasi-threads': 1.0.3 @@ -6269,6 +7246,12 @@ snapshots: js-yaml: 4.1.0 which: 4.0.0 + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -6292,6 +7275,15 @@ snapshots: '@istanbuljs/schema@0.1.3': {} + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + '@jest/console@30.0.4': dependencies: '@jest/types': 30.0.1 @@ -6301,6 +7293,41 @@ snapshots: jest-util: 30.0.2 slash: 3.0.0 + '@jest/core@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + 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.0.13) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + '@jest/core@30.0.4(esbuild-register@3.6.0(esbuild@0.25.6))': dependencies: '@jest/console': 30.0.4 @@ -6339,6 +7366,13 @@ snapshots: '@jest/diff-sequences@30.0.1': {} + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + jest-mock: 29.7.0 + '@jest/environment@30.0.4': dependencies: '@jest/fake-timers': 30.0.4 @@ -6346,10 +7380,21 @@ snapshots: '@types/node': 24.0.13 jest-mock: 30.0.2 + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + '@jest/expect-utils@30.0.4': dependencies: '@jest/get-type': 30.0.1 + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + '@jest/expect@30.0.4': dependencies: expect: 30.0.4 @@ -6357,6 +7402,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 24.0.13 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + '@jest/fake-timers@30.0.4': dependencies: '@jest/types': 30.0.1 @@ -6368,6 +7422,15 @@ snapshots: '@jest/get-type@30.0.1': {} + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + '@jest/globals@30.0.4': dependencies: '@jest/environment': 30.0.4 @@ -6382,6 +7445,35 @@ snapshots: '@types/node': 24.0.13 jest-regex-util: 30.0.1 + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.29 + '@types/node': 24.0.13 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 11.0.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + '@jest/reporters@30.0.4': dependencies: '@bcoe/v8-coverage': 0.2.3 @@ -6410,6 +7502,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + '@jest/schemas@30.0.1': dependencies: '@sinclair/typebox': 0.34.37 @@ -6421,12 +7517,25 @@ snapshots: graceful-fs: 4.2.11 natural-compare: 1.4.0 + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + callsites: 3.1.0 + graceful-fs: 4.2.11 + '@jest/source-map@30.0.1': dependencies: '@jridgewell/trace-mapping': 0.3.29 callsites: 3.1.0 graceful-fs: 4.2.11 + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + '@jest/test-result@30.0.4': dependencies: '@jest/console': 30.0.4 @@ -6434,6 +7543,13 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + '@jest/test-sequencer@30.0.4': dependencies: '@jest/test-result': 30.0.4 @@ -6441,6 +7557,26 @@ snapshots: jest-haste-map: 30.0.2 slash: 3.0.0 + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.28.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.29 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + '@jest/transform@30.0.4': dependencies: '@babel/core': 7.28.0 @@ -6461,6 +7597,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.0.13 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + '@jest/types@30.0.1': dependencies: '@jest/pattern': 30.0.1 @@ -6471,6 +7616,15 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + dependencies: + glob: 10.4.5 + magic-string: 0.30.17 + react-docgen-typescript: 2.4.0(typescript@5.8.3) + vite: 7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + optionalDependencies: + typescript: 5.8.3 + '@jridgewell/gen-mapping@0.3.12': dependencies: '@jridgewell/sourcemap-codec': 1.5.4 @@ -6726,6 +7880,12 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} + '@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.1.8 + react: 19.1.0 + '@mdxeditor/editor@3.39.1(@codemirror/language@6.11.2)(@lezer/highlight@1.2.1)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.27)': dependencies: '@codemirror/commands': 6.8.1 @@ -7211,6 +8371,14 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.19': {} + '@rollup/pluginutils@5.2.0(rollup@4.45.0)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.45.0 + '@rollup/rollup-android-arm-eabi@4.45.0': optional: true @@ -7271,18 +8439,96 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.45.0': optional: true + '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.34.37': {} '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers@13.0.5': dependencies: '@sinonjs/commons': 3.0.1 '@stitches/core@1.2.8': {} + '@storybook/addon-docs@9.0.17(@types/react@19.1.8)(storybook@9.0.17(@testing-library/dom@10.4.0))': + dependencies: + '@mdx-js/react': 3.1.0(@types/react@19.1.8)(react@19.1.0) + '@storybook/csf-plugin': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)) + '@storybook/icons': 1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@storybook/react-dom-shim': 9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0)) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + storybook: 9.0.17(@testing-library/dom@10.4.0) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + + '@storybook/builder-vite@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0))(vite@7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + dependencies: + '@storybook/csf-plugin': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)) + storybook: 9.0.17(@testing-library/dom@10.4.0) + ts-dedent: 2.2.0 + vite: 7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + + '@storybook/csf-plugin@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0))': + dependencies: + storybook: 9.0.17(@testing-library/dom@10.4.0) + unplugin: 1.16.1 + + '@storybook/csf@0.1.13': + dependencies: + type-fest: 2.19.0 + + '@storybook/global@5.0.0': {} + + '@storybook/icons@1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@storybook/react-dom-shim@9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))': + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + storybook: 9.0.17(@testing-library/dom@10.4.0) + + '@storybook/react-vite@9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.45.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)(vite@7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@rollup/pluginutils': 5.2.0(rollup@4.45.0) + '@storybook/builder-vite': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0))(vite@7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@storybook/react': 9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3) + find-up: 7.0.0 + magic-string: 0.30.17 + react: 19.1.0 + react-docgen: 8.0.0 + react-dom: 19.1.0(react@19.1.0) + resolve: 1.22.10 + storybook: 9.0.17(@testing-library/dom@10.4.0) + tsconfig-paths: 4.2.0 + vite: 7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + + '@storybook/react@9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)': + dependencies: + '@storybook/global': 5.0.0 + '@storybook/react-dom-shim': 9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0)) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + storybook: 9.0.17(@testing-library/dom@10.4.0) + optionalDependencies: + typescript: 5.8.3 + '@tailwindcss/forms@0.5.10(tailwindcss@3.4.17)': dependencies: mini-svg-data-uri: 1.4.4 @@ -7376,11 +8622,48 @@ snapshots: '@tanstack/virtual-core@3.13.12': {} + '@testing-library/dom@10.4.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.27.6 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.6.3': + dependencies: + '@adobe/css-tools': 4.4.3 + aria-query: 5.3.2 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@testing-library/dom': 10.4.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': + dependencies: + '@testing-library/dom': 10.4.0 + '@tybys/wasm-util@0.10.0': dependencies: tslib: 2.8.1 optional: true + '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.0 @@ -7402,12 +8685,20 @@ snapshots: dependencies: '@babel/types': 7.28.1 + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/diff@7.0.2': {} + '@types/doctrine@0.0.9': {} + '@types/dom-to-image@2.6.7': {} '@types/esquery@1.5.4': @@ -7422,7 +8713,11 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: - '@types/jsonfile': 6.1.4 + '@types/jsonfile': 6.1.4 + '@types/node': 24.0.13 + + '@types/graceful-fs@4.1.9': + dependencies: '@types/node': 24.0.13 '@types/hast@3.0.4': @@ -7455,14 +8750,12 @@ snapshots: dependencies: '@types/node': 24.0.13 - '@types/marked@6.0.0': - dependencies: - marked: 16.0.0 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdx@2.0.13': {} + '@types/ms@2.1.0': {} '@types/node@20.19.7': @@ -7748,6 +9041,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-react@4.6.0(vite@7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) + '@rolldown/pluginutils': 1.0.0-beta.19 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + '@vitejs/plugin-react@4.6.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 @@ -7760,6 +9065,68 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.1 + tinyrainbow: 1.2.0 + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + tinyrainbow: 2.0.0 + + '@vitest/mocker@2.1.9(vite@5.4.19(@types/node@20.19.7)(lightningcss@1.30.1))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.19(@types/node@20.19.7)(lightningcss@1.30.1) + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.17 + pathe: 1.1.2 + + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.1.4 + tinyrainbow: 1.2.0 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + '@yarnpkg/lockfile@1.1.0': {} accepts@2.0.0: @@ -7773,6 +9140,8 @@ snapshots: acorn@8.15.0: {} + agent-base@7.1.4: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -7817,6 +9186,12 @@ snapshots: dependencies: tslib: 2.8.1 + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -7876,6 +9251,12 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + assertion-error@2.0.1: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + async-function@1.0.0: {} async@3.2.6: {} @@ -7894,6 +9275,19 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + babel-jest@29.7.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.28.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + babel-jest@30.0.4(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 @@ -7907,6 +9301,16 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + babel-plugin-istanbul@7.0.0: dependencies: '@babel/helper-plugin-utils': 7.27.1 @@ -7917,6 +9321,13 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.7 + babel-plugin-jest-hoist@30.0.1: dependencies: '@babel/template': 7.27.2 @@ -7942,6 +9353,12 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) + babel-preset-jest@29.6.3(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + babel-preset-jest@30.0.1(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 @@ -7952,6 +9369,10 @@ snapshots: base64-js@1.5.1: {} + better-opn@3.0.2: + dependencies: + open: 8.4.2 + binary-extensions@2.3.0: {} bl@4.1.0: @@ -8016,6 +9437,8 @@ snapshots: bytes@3.1.2: {} + cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -8045,6 +9468,19 @@ snapshots: ccount@2.0.1: {} + chai@5.2.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.4 + pathval: 2.0.1 + + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -8064,6 +9500,8 @@ snapshots: chardet@0.7.0: {} + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -8078,8 +9516,12 @@ snapshots: chownr@3.0.0: {} + ci-info@3.9.0: {} + ci-info@4.3.0: {} + cjs-module-lexer@1.4.3: {} + cjs-module-lexer@2.1.0: {} classnames@2.5.1: {} @@ -8170,6 +9612,21 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + create-jest@29.7.0(@types/node@20.19.7): + 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@20.19.7) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + crelt@1.0.6: {} cross-spawn@7.0.6: @@ -8178,8 +9635,15 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css.escape@1.5.1: {} + cssesc@3.0.0: {} + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + csstype@3.1.3: {} d@1.0.2: @@ -8187,6 +9651,11 @@ snapshots: es5-ext: 0.10.64 type: 2.7.3 + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -8215,12 +9684,16 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js@10.6.0: {} + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 dedent@1.6.0: {} + deep-eql@5.0.2: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -8235,6 +9708,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -8257,6 +9732,8 @@ snapshots: didyoumean@1.2.2: {} + diff-sequences@29.6.3: {} + diff@5.2.0: {} diff@8.0.2: {} @@ -8271,6 +9748,14 @@ snapshots: dependencies: esutils: 2.0.3 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + dom-to-image@2.6.0: {} dotenv@16.6.1: {} @@ -8315,6 +9800,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.2 + entities@6.0.1: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -8399,6 +9886,8 @@ snapshots: iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -8438,6 +9927,13 @@ snapshots: d: 1.0.2 ext: 1.7.0 + esbuild-register@3.6.0(esbuild@0.19.12): + dependencies: + debug: 4.4.1 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + esbuild-register@3.6.0(esbuild@0.25.6): dependencies: debug: 4.4.1 @@ -8569,6 +10065,16 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 + eslint-plugin-storybook@0.12.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3): + dependencies: + '@storybook/csf': 0.1.13 + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.31.0(jiti@2.4.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + - typescript + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -8652,6 +10158,12 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/unist': 3.0.3 + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} etag@1.8.1: {} @@ -8693,6 +10205,18 @@ snapshots: exit-x@0.2.2: {} + exit@0.1.2: {} + + expect-type@1.2.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + expect@30.0.4: dependencies: '@jest/expect-utils': 30.0.4 @@ -8807,6 +10331,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -8837,8 +10367,6 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs.realpath@1.0.0: {} - fsevents@2.3.2: optional: true @@ -8943,14 +10471,14 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@7.2.3: + glob@11.0.3: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 globals@14.0.0: {} @@ -8998,6 +10526,10 @@ snapshots: dependencies: function-bind: 1.1.2 + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + html-escaper@2.0.2: {} http-errors@2.0.0: @@ -9008,6 +10540,20 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + human-signals@2.1.0: {} human-signals@5.0.0: {} @@ -9044,10 +10590,7 @@ snapshots: imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 + indent-string@4.0.0: {} inherits@2.0.4: {} @@ -9131,6 +10674,8 @@ snapshots: is-decimal@2.0.1: {} + is-docker@2.2.1: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -9167,6 +10712,8 @@ snapshots: is-number@7.0.0: {} + is-potential-custom-element-name@1.0.1: {} + is-promise@4.0.0: {} is-regex@1.2.1: @@ -9220,6 +10767,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + isarray@2.0.5: {} isexe@2.0.0: {} @@ -9230,6 +10781,16 @@ snapshots: istanbul-lib-coverage@3.2.2: {} + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.28.0 @@ -9246,6 +10807,14 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.29 @@ -9274,6 +10843,10 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + jake@10.9.2: dependencies: async: 3.2.6 @@ -9281,12 +10854,44 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + jest-changed-files@30.0.2: dependencies: execa: 5.1.1 jest-util: 30.0.2 p-limit: 3.1.0 + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.6.0 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-circus@30.0.4: dependencies: '@jest/environment': 30.0.4 @@ -9313,6 +10918,25 @@ snapshots: - babel-plugin-macros - supports-color + jest-cli@29.7.0(@types/node@20.19.7): + 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@20.19.7) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.19.7) + 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@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)): dependencies: '@jest/core': 30.0.4(esbuild-register@3.6.0(esbuild@0.25.6)) @@ -9332,6 +10956,66 @@ snapshots: - supports-color - ts-node + jest-config@29.7.0(@types/node@20.19.7): + dependencies: + '@babel/core': 7.28.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 11.0.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': 20.19.7 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@24.0.13): + dependencies: + '@babel/core': 7.28.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 11.0.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': 24.0.13 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-config@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)): dependencies: '@babel/core': 7.28.0 @@ -9398,6 +11082,13 @@ snapshots: - babel-plugin-macros - supports-color + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jest-diff@30.0.4: dependencies: '@jest/diff-sequences': 30.0.1 @@ -9405,10 +11096,22 @@ snapshots: chalk: 4.1.2 pretty-format: 30.0.2 + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + jest-docblock@30.0.1: dependencies: detect-newline: 3.1.0 + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + jest-each@30.0.2: dependencies: '@jest/get-type': 30.0.1 @@ -9417,6 +11120,15 @@ snapshots: jest-util: 30.0.2 pretty-format: 30.0.2 + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + jest-mock: 29.7.0 + jest-util: 29.7.0 + jest-environment-node@30.0.4: dependencies: '@jest/environment': 30.0.4 @@ -9427,6 +11139,24 @@ snapshots: jest-util: 30.0.2 jest-validate: 30.0.2 + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 24.0.13 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + jest-haste-map@30.0.2: dependencies: '@jest/types': 30.0.1 @@ -9442,11 +11172,23 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jest-leak-detector@30.0.2: dependencies: '@jest/get-type': 30.0.1 pretty-format: 30.0.2 + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jest-matcher-utils@30.0.4: dependencies: '@jest/get-type': 30.0.1 @@ -9454,6 +11196,18 @@ snapshots: jest-diff: 30.0.4 pretty-format: 30.0.2 + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-message-util@30.0.2: dependencies: '@babel/code-frame': 7.27.1 @@ -9466,18 +11220,37 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + jest-util: 29.7.0 + jest-mock@30.0.2: dependencies: '@jest/types': 30.0.1 '@types/node': 24.0.13 jest-util: 30.0.2 + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + jest-pnp-resolver@1.2.3(jest-resolve@30.0.2): optionalDependencies: jest-resolve: 30.0.2 + jest-regex-util@29.6.3: {} + jest-regex-util@30.0.1: {} + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + jest-resolve-dependencies@30.0.4: dependencies: jest-regex-util: 30.0.1 @@ -9485,6 +11258,18 @@ snapshots: transitivePeerDependencies: - supports-color + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.10 + resolve.exports: 2.0.3 + slash: 3.0.0 + jest-resolve@30.0.2: dependencies: chalk: 4.1.2 @@ -9496,6 +11281,32 @@ snapshots: slash: 3.0.0 unrs-resolver: 1.11.1 + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + jest-runner@30.0.4: dependencies: '@jest/console': 30.0.4 @@ -9523,6 +11334,33 @@ snapshots: transitivePeerDependencies: - supports-color + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + chalk: 4.1.2 + cjs-module-lexer: 1.4.3 + collect-v8-coverage: 1.0.2 + glob: 11.0.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + jest-runtime@30.0.4: dependencies: '@jest/environment': 30.0.4 @@ -9550,6 +11388,31 @@ snapshots: transitivePeerDependencies: - supports-color + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.1 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + jest-snapshot@30.0.4: dependencies: '@babel/core': 7.28.0 @@ -9576,6 +11439,15 @@ snapshots: transitivePeerDependencies: - supports-color + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + jest-util@30.0.2: dependencies: '@jest/types': 30.0.1 @@ -9585,6 +11457,15 @@ snapshots: graceful-fs: 4.2.11 picomatch: 4.0.2 + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + jest-validate@30.0.2: dependencies: '@jest/get-type': 30.0.1 @@ -9594,6 +11475,17 @@ snapshots: leven: 3.1.0 pretty-format: 30.0.2 + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.13 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + jest-watcher@30.0.4: dependencies: '@jest/test-result': 30.0.4 @@ -9605,6 +11497,13 @@ snapshots: jest-util: 30.0.2 string-length: 4.0.2 + jest-worker@29.7.0: + dependencies: + '@types/node': 24.0.13 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jest-worker@30.0.2: dependencies: '@types/node': 24.0.13 @@ -9613,6 +11512,18 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jest@29.7.0(@types/node@20.19.7): + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.19.7) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)): dependencies: '@jest/core': 30.0.4(esbuild-register@3.6.0(esbuild@0.25.6)) @@ -9643,6 +11554,33 @@ snapshots: dependencies: argparse: 2.0.1 + jsdom@26.1.0: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.20 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -9672,6 +11610,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@3.0.3: {} + lage@2.14.6: dependencies: glob-hasher: 1.4.2 @@ -9748,6 +11688,10 @@ snapshots: dependencies: p-locate: 5.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + lodash.castarray@4.4.0: {} lodash.isplainobject@4.0.6: {} @@ -9769,8 +11713,12 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.1.4: {} + lru-cache@10.4.3: {} + lru-cache@11.1.0: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -10207,8 +12155,14 @@ snapshots: mimic-fn@4.0.0: {} + min-indent@1.0.1: {} + mini-svg-data-uri@1.4.4: {} + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -10221,6 +12175,8 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass@7.1.2: {} minizlib@3.0.2: @@ -10265,6 +12221,8 @@ snapshots: dependencies: path-key: 4.0.0 + nwsapi@2.2.20: {} + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -10319,6 +12277,12 @@ snapshots: dependencies: mimic-fn: 4.0.0 + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -10358,6 +12322,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -10366,6 +12334,10 @@ snapshots: dependencies: p-limit: 3.1.0 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + p-try@2.2.0: {} package-json-from-dist@1.0.1: {} @@ -10400,11 +12372,15 @@ snapshots: '@types/parse-path': 7.1.0 parse-path: 7.1.0 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} + path-exists@5.0.0: {} path-key@3.1.1: {} @@ -10417,10 +12393,19 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + path-to-regexp@8.2.0: {} path-type@4.0.0: {} + pathe@1.1.2: {} + + pathval@2.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -10515,6 +12500,18 @@ snapshots: prelude-ls@1.2.1: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-format@30.0.2: dependencies: '@jest/schemas': 30.0.1 @@ -10523,6 +12520,11 @@ snapshots: prismjs@1.30.0: {} + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -10538,6 +12540,8 @@ snapshots: punycode@2.3.1: {} + pure-rand@6.1.0: {} + pure-rand@7.0.1: {} qs@6.14.0: @@ -10559,6 +12563,25 @@ snapshots: dependencies: es6-symbol: 3.1.4 + react-docgen-typescript@2.4.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + react-docgen@8.0.0: + dependencies: + '@babel/core': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.7 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.6 + doctrine: 3.0.0 + resolve: 1.22.10 + strip-indent: 4.0.0 + transitivePeerDependencies: + - supports-color + react-dom@19.1.0(react@19.1.0): dependencies: react: 19.1.0 @@ -10638,6 +12661,19 @@ snapshots: dependencies: picomatch: 2.3.1 + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -10668,6 +12704,8 @@ snapshots: resolve-from@5.0.0: {} + resolve.exports@2.0.3: {} + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -10727,6 +12765,8 @@ snapshots: transitivePeerDependencies: - supports-color + rrweb-cssom@0.8.0: {} + run-async@3.0.0: {} run-parallel@1.2.0: @@ -10760,6 +12800,10 @@ snapshots: safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + scheduler@0.26.0: {} semver@6.3.1: {} @@ -10853,10 +12897,14 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + slash@3.0.0: {} source-map-js@1.2.1: {} @@ -10876,6 +12924,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + static-browser-server@1.0.3: dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -10887,11 +12937,32 @@ snapshots: statuses@2.0.2: {} + std-env@3.9.0: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 internal-slot: 1.1.0 + storybook@9.0.17(@testing-library/dom@10.4.0): + dependencies: + '@storybook/global': 5.0.0 + '@testing-library/jest-dom': 6.6.3 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 + better-opn: 3.0.2 + esbuild: 0.19.12 + esbuild-register: 3.6.0(esbuild@0.19.12) + recast: 0.23.11 + semver: 7.7.2 + ws: 8.18.3 + transitivePeerDependencies: + - '@testing-library/dom' + - bufferutil + - supports-color + - utf-8-validate + strict-event-emitter@0.4.6: {} string-length@4.0.2: @@ -10972,12 +13043,22 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@3.0.0: {} + strip-bom@4.0.0: {} strip-final-newline@2.0.0: {} strip-final-newline@3.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@3.1.1: {} style-mod@4.1.2: {} @@ -11002,6 +13083,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} + synckit@0.11.8: dependencies: '@pkgr/core': 0.2.7 @@ -11051,7 +13134,7 @@ snapshots: test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 + glob: 11.0.3 minimatch: 3.1.2 thenify-all@1.6.0: @@ -11062,11 +13145,33 @@ snapshots: dependencies: any-promise: 1.3.0 + tiny-invariant@1.3.3: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 + tinypool@1.1.1: {} + + tinyrainbow@1.2.0: {} + + tinyrainbow@2.0.0: {} + + tinyspy@3.0.2: {} + + tinyspy@4.0.3: {} + + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -11079,12 +13184,22 @@ snapshots: toidentifier@1.0.1: {} + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tree-kill@1.2.2: {} ts-api-utils@2.1.0(typescript@5.8.3): dependencies: typescript: 5.8.3 + ts-dedent@2.2.0: {} + ts-interface-checker@0.1.13: {} ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@30.0.4)(@jest/types@30.0.1)(babel-jest@30.0.4(@babel/core@7.28.0))(esbuild@0.25.6)(jest-util@30.0.2)(jest@30.0.4(@types/node@20.19.7)(esbuild-register@3.6.0(esbuild@0.25.6)))(typescript@5.8.3): @@ -11108,6 +13223,12 @@ snapshots: esbuild: 0.25.6 jest-util: 30.0.2 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@1.14.1: {} tslib@2.8.1: {} @@ -11125,6 +13246,8 @@ snapshots: type-fest@0.21.3: {} + type-fest@2.19.0: {} + type-fest@4.41.0: {} type-is@2.0.1: @@ -11207,6 +13330,8 @@ snapshots: undici-types@7.8.0: {} + unicorn-magic@0.1.0: {} + unidiff@1.0.4: dependencies: diff: 5.2.0 @@ -11238,6 +13363,11 @@ snapshots: unpipe@1.0.0: {} + unplugin@1.16.1: + dependencies: + acorn: 8.15.0 + webpack-virtual-modules: 0.6.2 + unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.0 @@ -11304,6 +13434,34 @@ snapshots: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 + vite-node@2.1.9(@types/node@20.19.7)(lightningcss@1.30.1): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.19(@types/node@20.19.7)(lightningcss@1.30.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.19(@types/node@20.19.7)(lightningcss@1.30.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.45.0 + optionalDependencies: + '@types/node': 20.19.7 + fsevents: 2.3.3 + lightningcss: 1.30.1 + vite@5.4.19(@types/node@24.0.13)(lightningcss@1.30.1): dependencies: esbuild: 0.21.5 @@ -11314,6 +13472,21 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.30.1 + vite@7.0.4(@types/node@20.19.7)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): + dependencies: + esbuild: 0.25.6 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.45.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 20.19.7 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 + yaml: 2.8.0 + vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): dependencies: esbuild: 0.25.6 @@ -11329,8 +13502,48 @@ snapshots: lightningcss: 1.30.1 yaml: 2.8.0 + vitest@2.1.9(@types/node@20.19.7)(jsdom@26.1.0)(lightningcss@1.30.1): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.19(@types/node@20.19.7)(lightningcss@1.30.1)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.19(@types/node@20.19.7)(lightningcss@1.30.1) + vite-node: 2.1.9(@types/node@20.19.7)(lightningcss@1.30.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.7 + jsdom: 26.1.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + w3c-keyname@2.2.8: {} + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -11339,6 +13552,21 @@ snapshots: dependencies: defaults: 1.0.4 + webidl-conversions@7.0.0: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -11388,6 +13616,11 @@ snapshots: dependencies: isexe: 3.1.1 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} workspace-tools@0.38.4: @@ -11420,11 +13653,22 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 signal-exit: 4.1.0 + ws@8.18.3: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -11451,6 +13695,8 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.2.1: {} + yoctocolors-cjs@2.1.2: {} zwitch@2.0.4: {} diff --git a/packages/eslint-config/eslint.config.js b/tools/eslint-config/eslint.config.js similarity index 100% rename from packages/eslint-config/eslint.config.js rename to tools/eslint-config/eslint.config.js diff --git a/packages/eslint-config/jest.config.js b/tools/eslint-config/jest.config.js similarity index 100% rename from packages/eslint-config/jest.config.js rename to tools/eslint-config/jest.config.js diff --git a/packages/eslint-config/package.json b/tools/eslint-config/package.json similarity index 100% rename from packages/eslint-config/package.json rename to tools/eslint-config/package.json diff --git a/packages/eslint-config/src/configs/base.ts b/tools/eslint-config/src/configs/base.ts similarity index 100% rename from packages/eslint-config/src/configs/base.ts rename to tools/eslint-config/src/configs/base.ts diff --git a/packages/eslint-config/src/configs/node.ts b/tools/eslint-config/src/configs/node.ts similarity index 100% rename from packages/eslint-config/src/configs/node.ts rename to tools/eslint-config/src/configs/node.ts diff --git a/packages/eslint-config/src/configs/react.ts b/tools/eslint-config/src/configs/react.ts similarity index 100% rename from packages/eslint-config/src/configs/react.ts rename to tools/eslint-config/src/configs/react.ts diff --git a/packages/eslint-config/src/index.ts b/tools/eslint-config/src/index.ts similarity index 100% rename from packages/eslint-config/src/index.ts rename to tools/eslint-config/src/index.ts diff --git a/packages/eslint-config/src/rules/index.ts b/tools/eslint-config/src/rules/index.ts similarity index 100% rename from packages/eslint-config/src/rules/index.ts rename to tools/eslint-config/src/rules/index.ts diff --git a/packages/eslint-config/src/rules/no-default-export.ts b/tools/eslint-config/src/rules/no-default-export.ts similarity index 100% rename from packages/eslint-config/src/rules/no-default-export.ts rename to tools/eslint-config/src/rules/no-default-export.ts diff --git a/packages/eslint-config/src/rules/no-deprecated.ts b/tools/eslint-config/src/rules/no-deprecated.ts similarity index 100% rename from packages/eslint-config/src/rules/no-deprecated.ts rename to tools/eslint-config/src/rules/no-deprecated.ts diff --git a/packages/eslint-config/src/rules/one-export-per-file.ts b/tools/eslint-config/src/rules/one-export-per-file.ts similarity index 100% rename from packages/eslint-config/src/rules/one-export-per-file.ts rename to tools/eslint-config/src/rules/one-export-per-file.ts diff --git a/packages/eslint-config/tsconfig.json b/tools/eslint-config/tsconfig.json similarity index 100% rename from packages/eslint-config/tsconfig.json rename to tools/eslint-config/tsconfig.json diff --git a/tools/repo-scripts/package.json b/tools/repo-scripts/package.json index 513b74fd..6f993c6e 100644 --- a/tools/repo-scripts/package.json +++ b/tools/repo-scripts/package.json @@ -29,17 +29,34 @@ "execa": "^8.0.0", "fs-extra": "^11.2.0", "glob": "^10.3.0", - "concurrently": "^8.2.0" + "concurrently": "^8.2.0", + "typescript": "~5.8.3", + "vite": "^7.0.0", + "vitest": "^2.1.8", + "@playwright/test": "^1.49.0", + "storybook": "^9.0.0", + "@storybook/addon-docs": "^9.0.17", + "@storybook/react-vite": "^9.0.0", + "typed-css-modules": "^0.9.1", + "jest": "^29.0.0", + "eslint": "^9.29.0", + "@eslint/js": "^9.29.0", + "typescript-eslint": "^8.34.1", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "eslint-plugin-storybook": "^0.12.0", + "globals": "^16.2.0", + "workspace-tools": "^0.38.4", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.1.0", + "@testing-library/user-event": "^14.5.2", + "@vitejs/plugin-react": "^4.5.2", + "jsdom": "^26.0.0" }, "devDependencies": { "@types/node": "^20.0.0", "@types/inquirer": "^9.0.0", "@types/fs-extra": "^11.0.0", - "@claude-flow/tsconfig": "workspace:*", - "typescript": "^5.3.0", - "eslint": "^9.0.0", - "@eslint/js": "^9.29.0", - "typescript-eslint": "^8.34.1", - "globals": "^16.2.0" + "@claude-flow/tsconfig": "workspace:*" } } \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/build-storybook.ts b/tools/repo-scripts/src/tasks/build-storybook.ts new file mode 100644 index 00000000..a2d29b7e --- /dev/null +++ b/tools/repo-scripts/src/tasks/build-storybook.ts @@ -0,0 +1,15 @@ +import { runStorybook } from '../utilities/runStorybook.js'; +import type { Task } from '../types.js'; + +const buildStorybook: Task = { + command: 'build-storybook', + description: 'Build Storybook for production', + execute: async (additionalArgs = []) => { + return runStorybook({ + command: 'build', + additionalArgs, + }); + }, +}; + +export { buildStorybook }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/build.ts b/tools/repo-scripts/src/tasks/build.ts index 61da177b..dba0747a 100644 --- a/tools/repo-scripts/src/tasks/build.ts +++ b/tools/repo-scripts/src/tasks/build.ts @@ -2,6 +2,10 @@ import { runScript } from '../utilities/runScript.js'; import fs from 'fs'; import path from 'path'; import { getPackageData } from '../utilities/getPackageData.js'; +import { detectPackageType } from '../utilities/detectPackageType.js'; +import { runTcm } from '../utilities/runTcm.js'; +import { runVite } from '../utilities/runVite.js'; +import { copyFiles } from '../utilities/copyFiles.js'; import type { Task } from '../types.js'; const build: Task = { @@ -11,33 +15,59 @@ const build: Task = { { flag: '--clean', description: 'Clean output directory before building' } ], execute: async function build(additionalArgs = []) { - // --pretty must be manually specified when running programmatically - // (it's not respected from the config) - const tsArgs = ['-b']; - - const { packageJson } = getPackageData(process.cwd()); - - if (packageJson.name === '@claude-flow/scripts') { - // Building the scripts package which doesn't have a src directory or emitted code - tsArgs.push('--noEmit'); - } else { - // For normal packages, we just use -b to build with project references - // Clean the output directory if --clean is passed + const { packageJson } = getPackageData(process.cwd()); + const packageType = detectPackageType(); + + // Handle --clean flag const cleanIndex = additionalArgs.indexOf('--clean'); if (cleanIndex !== -1) { const outDir = 'lib'; fs.rmSync(path.join(process.cwd(), outDir), { force: true, recursive: true }); - // Don't pass --clean to TS + // Don't pass --clean to downstream tools additionalArgs.splice(cleanIndex, 1); } + + // Special case for scripts package + if (packageJson.name === '@claude-flow/repo-scripts') { + return runScript({ + packageName: 'typescript', + name: 'tsc', + args: ['-b', '--noEmit', ...additionalArgs], + }); + } + + // Run tcm for packages with CSS modules + if (packageType === 'react-app' || packageType === 'component-library') { + await runTcm(); + } + + // Run TypeScript build + await runScript({ + packageName: 'typescript', + name: 'tsc', + args: ['-b', ...additionalArgs], + }); + + // Post-build steps based on package type + switch (packageType) { + case 'react-app': + // Run vite build for react apps + await runVite({ + command: 'build', + additionalArgs, + }); + break; + + case 'component-library': + // Copy CSS files to lib directory + copyFiles({ + pattern: '**/*.css', + srcDir: 'src', + destDir: 'lib', + }); + break; + } } - - return runScript({ - packageName: 'typescript', - name: 'tsc', - args: [...tsArgs, ...additionalArgs], - }); -} }; export { build }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/dev-storybook-wsl.ts b/tools/repo-scripts/src/tasks/dev-storybook-wsl.ts new file mode 100644 index 00000000..0f4e0ba2 --- /dev/null +++ b/tools/repo-scripts/src/tasks/dev-storybook-wsl.ts @@ -0,0 +1,16 @@ +import { runStorybook } from '../utilities/runStorybook.js'; +import type { Task } from '../types.js'; + +const devStorybookWsl: Task = { + command: 'dev-storybook-wsl', + description: 'Start Storybook development server with host binding for WSL', + execute: async (additionalArgs = []) => { + return runStorybook({ + command: 'dev', + host: true, + additionalArgs, + }); + }, +}; + +export { devStorybookWsl }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/dev-storybook.ts b/tools/repo-scripts/src/tasks/dev-storybook.ts new file mode 100644 index 00000000..2bc4fd18 --- /dev/null +++ b/tools/repo-scripts/src/tasks/dev-storybook.ts @@ -0,0 +1,15 @@ +import { runStorybook } from '../utilities/runStorybook.js'; +import type { Task } from '../types.js'; + +const devStorybook: Task = { + command: 'dev-storybook', + description: 'Start Storybook development server', + execute: async (additionalArgs = []) => { + return runStorybook({ + command: 'dev', + additionalArgs, + }); + }, +}; + +export { devStorybook }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/dev-vite-only.ts b/tools/repo-scripts/src/tasks/dev-vite-only.ts new file mode 100644 index 00000000..4962a0be --- /dev/null +++ b/tools/repo-scripts/src/tasks/dev-vite-only.ts @@ -0,0 +1,15 @@ +import { runVite } from '../utilities/runVite.js'; +import type { Task } from '../types.js'; + +const devViteOnly: Task = { + command: 'dev-vite-only', + description: 'Start Vite development server without additional processes', + execute: async (additionalArgs = []) => { + return runVite({ + command: 'dev', + additionalArgs, + }); + }, +}; + +export { devViteOnly }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/dev-wsl.ts b/tools/repo-scripts/src/tasks/dev-wsl.ts new file mode 100644 index 00000000..eb6a61c4 --- /dev/null +++ b/tools/repo-scripts/src/tasks/dev-wsl.ts @@ -0,0 +1,50 @@ +import { detectPackageType } from '../utilities/detectPackageType.js'; +import { runTcm } from '../utilities/runTcm.js'; +import { runConcurrently } from '../utilities/runConcurrently.js'; +import { runScript } from '../utilities/runScript.js'; +import type { Task } from '../types.js'; + +const devWsl: Task = { + command: 'dev-wsl', + description: 'Start development server with host binding for WSL', + execute: async (additionalArgs = []) => { + const packageType = detectPackageType(); + + switch (packageType) { + case 'react-app': + // Run tcm first + await runTcm(); + + // Then run vite and tcm watch concurrently + return runConcurrently({ + commands: [ + { name: 'vite', command: 'vite --host' }, + { name: 'tcm', command: 'tcm src --watch' }, + ], + }); + + case 'component-library': + // For libraries, run tsc and tcm in watch mode + return runConcurrently({ + commands: [ + { name: 'tsc', command: 'tsc -b --watch' }, + { name: 'tcm', command: 'tcm src --watch' }, + ], + }); + + case 'node-app': + // For node apps, just run tsc in watch mode + return runScript({ + packageName: 'typescript', + name: 'tsc', + args: ['-b', '--watch', ...additionalArgs], + }); + + default: + console.error('Unable to determine package type for dev mode'); + process.exit(1); + } + }, +}; + +export { devWsl }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/dev.ts b/tools/repo-scripts/src/tasks/dev.ts index 4701b081..50b56cfb 100644 --- a/tools/repo-scripts/src/tasks/dev.ts +++ b/tools/repo-scripts/src/tasks/dev.ts @@ -1,57 +1,99 @@ import chalk from 'chalk'; import inquirer from 'inquirer'; import { execa } from 'execa'; +import { detectPackageType } from '../utilities/detectPackageType.js'; +import { runTcm } from '../utilities/runTcm.js'; +import { runConcurrently } from '../utilities/runConcurrently.js'; +import { runScript } from '../utilities/runScript.js'; +import { runStorybook } from '../utilities/runStorybook.js'; import type { Task } from '../types.js'; const dev: Task = { command: 'dev', - description: 'Start development mode with interactive menu', - execute: async () => { - const { choice } = await inquirer.prompt([ - { - type: 'list', - name: 'choice', - message: 'What would you like to run?', - choices: [ - { name: 'V1 Application (port 3000)', value: 'v1' }, - { name: 'V2 Application (port 4000)', value: 'v2' }, - { name: 'Both V1 and V2', value: 'both' }, - { name: 'Storybook (port 6006)', value: 'storybook' }, - ], - }, - ]); - - switch (choice) { - case 'v1': - console.log(chalk.blue('Starting V1 application...')); - await execa('npx', ['concurrently', '-n', 'client,server', '-c', 'cyan,green', - 'pnpm --filter @claude-flow/v1-client dev', - 'pnpm --filter @claude-flow/v1-server dev' - ], { - stdio: 'inherit', - cwd: process.cwd() - }); - break; - case 'v2': - console.log(chalk.blue('Starting V2 application...')); - console.log(chalk.yellow('V2 not yet implemented')); - break; - case 'both': - console.log(chalk.blue('Starting both V1 and V2...')); - console.log(chalk.yellow('V2 not yet implemented, starting V1 only')); - await execa('npx', ['concurrently', '-n', 'client,server', '-c', 'cyan,green', - 'pnpm --filter @claude-flow/v1-client dev', - 'pnpm --filter @claude-flow/v1-server dev' - ], { - stdio: 'inherit', - cwd: process.cwd() - }); - break; - case 'storybook': - console.log(chalk.blue('Starting Storybook...')); - console.log(chalk.yellow('Storybook not yet implemented')); - break; + description: 'Start development mode', + execute: async (additionalArgs = []) => { + const packageType = detectPackageType(); + + // If we can detect a package type, run locally + if (packageType !== 'unknown') { + // Package-specific dev modes + switch (packageType) { + case 'react-app': + // Run tcm first + await runTcm(); + + // Then run vite and tcm watch concurrently + return runConcurrently({ + commands: [ + { name: 'vite', command: 'vite' }, + { name: 'tcm', command: 'tcm src --watch' }, + ], + }); + + case 'component-library': + // For component libraries, run Storybook + console.log(chalk.blue('Starting Storybook...')); + return runStorybook({ + command: 'dev', + }); + + case 'node-app': + // For node apps, just run tsc in watch mode + return runScript({ + packageName: 'typescript', + name: 'tsc', + args: ['-b', '--watch', ...additionalArgs], + }); + } } + + // If we're at the root or can't detect package type, show the interactive menu + const { choice } = await inquirer.prompt([ + { + type: 'list', + name: 'choice', + message: 'What would you like to run?', + choices: [ + { name: 'V1 Application (port 3000)', value: 'v1' }, + { name: 'V2 Application (port 4000)', value: 'v2' }, + { name: 'Both V1 and V2', value: 'both' }, + { name: 'Storybook (port 6006)', value: 'storybook' }, + ], + }, + ]); + + switch (choice) { + case 'v1': + console.log(chalk.blue('Starting V1 application...')); + await execa('npx', ['concurrently', '-n', 'client,server', '-c', 'cyan,green', + 'pnpm --filter @claude-flow/v1-client dev', + 'pnpm --filter @claude-flow/v1-server dev' + ], { + stdio: 'inherit', + cwd: process.cwd() + }); + break; + case 'v2': + console.log(chalk.blue('Starting V2 application...')); + console.log(chalk.yellow('V2 not yet implemented')); + break; + case 'both': + console.log(chalk.blue('Starting both V1 and V2...')); + console.log(chalk.yellow('V2 not yet implemented, starting V1 only')); + await execa('npx', ['concurrently', '-n', 'client,server', '-c', 'cyan,green', + 'pnpm --filter @claude-flow/v1-client dev', + 'pnpm --filter @claude-flow/v1-server dev' + ], { + stdio: 'inherit', + cwd: process.cwd() + }); + break; + case 'storybook': + console.log(chalk.blue('Starting Storybook...')); + console.log(chalk.yellow('Storybook not yet implemented')); + break; + } + return; } }; diff --git a/tools/repo-scripts/src/tasks/preview.ts b/tools/repo-scripts/src/tasks/preview.ts new file mode 100644 index 00000000..c17f250f --- /dev/null +++ b/tools/repo-scripts/src/tasks/preview.ts @@ -0,0 +1,15 @@ +import { runVite } from '../utilities/runVite.js'; +import type { Task } from '../types.js'; + +const preview: Task = { + command: 'preview', + description: 'Preview production build', + execute: async (additionalArgs = []) => { + return runVite({ + command: 'preview', + additionalArgs, + }); + }, +}; + +export { preview }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/scaffold.ts b/tools/repo-scripts/src/tasks/scaffold.ts index 86de3197..d08999a2 100644 --- a/tools/repo-scripts/src/tasks/scaffold.ts +++ b/tools/repo-scripts/src/tasks/scaffold.ts @@ -128,41 +128,43 @@ const scaffold: Task = { console.log(chalk.gray(` Location: ${targetPath}`)); console.log(); + // Store the original cwd before changing directory + const originalCwd = process.cwd(); + // Change to the new directory process.chdir(targetPath); console.log(chalk.blue('Installing dependencies...')); // Install dependencies const { execa } = await import('execa'); - try { - await execa('pnpm', ['install'], { stdio: 'inherit' }); - console.log(chalk.green('✓ Dependencies installed')); - console.log(); - - // Start dev server for react-app and component-library - if (templateType === 'react-app' || templateType === 'component-library') { - console.log(chalk.cyan('Starting development server...')); - console.log(chalk.gray('Press Ctrl+C to stop')); - console.log(); + await execa('pnpm', ['install'], { stdio: 'inherit' }); + console.log(chalk.green('✓ Dependencies installed')); + console.log(); + + console.log(chalk.green('✨ Package created successfully!')); + console.log(); + console.log(chalk.cyan('Next steps:')); + console.log(chalk.yellow(` cd ${path.relative(originalCwd, targetPath)}`)); + + switch (templateType) { + case 'component-library': + console.log(chalk.gray(' pnpm dev # Start Storybook')); + console.log(chalk.gray(' pnpm build # Build library')); + console.log(chalk.gray(' pnpm test # Run tests')); + break; - await execa('pnpm', ['dev'], { stdio: 'inherit' }); - } else { - // For node-app, just build it - console.log(chalk.blue('Building package...')); - await execa('pnpm', ['build'], { stdio: 'inherit' }); - console.log(chalk.green('✓ Build complete')); - console.log(); - console.log(chalk.cyan('Package is ready!')); - console.log(chalk.gray(`You can run it with: node lib/index.js`)); - } - } catch (error) { - // If the dev server is stopped with Ctrl+C, this is normal - if (error && typeof error === 'object' && 'signal' in error && error.signal === 'SIGINT') { - console.log(); - console.log(chalk.yellow('Development server stopped')); - } else { - throw error; - } + case 'react-app': + console.log(chalk.gray(' pnpm dev # Start development server')); + console.log(chalk.gray(' pnpm dev:storybook # Start Storybook')); + console.log(chalk.gray(' pnpm build # Build for production')); + console.log(chalk.gray(' pnpm test # Run tests')); + break; + + case 'node-app': + console.log(chalk.gray(' pnpm dev # Start TypeScript watch mode')); + console.log(chalk.gray(' pnpm build # Build for production')); + console.log(chalk.gray(' pnpm test # Run tests')); + break; } return { success: true }; diff --git a/tools/repo-scripts/src/tasks/test-e2e-ui.ts b/tools/repo-scripts/src/tasks/test-e2e-ui.ts new file mode 100644 index 00000000..3de8adc3 --- /dev/null +++ b/tools/repo-scripts/src/tasks/test-e2e-ui.ts @@ -0,0 +1,15 @@ +import { runPlaywright } from '../utilities/runPlaywright.js'; +import type { Task } from '../types.js'; + +const testE2eUi: Task = { + command: 'test-e2e-ui', + description: 'Run end-to-end tests with Playwright UI mode', + execute: async (additionalArgs = []) => { + return runPlaywright({ + ui: true, + additionalArgs, + }); + }, +}; + +export { testE2eUi }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/test-e2e.ts b/tools/repo-scripts/src/tasks/test-e2e.ts new file mode 100644 index 00000000..a130bcec --- /dev/null +++ b/tools/repo-scripts/src/tasks/test-e2e.ts @@ -0,0 +1,14 @@ +import { runPlaywright } from '../utilities/runPlaywright.js'; +import type { Task } from '../types.js'; + +const testE2e: Task = { + command: 'test-e2e', + description: 'Run end-to-end tests with Playwright', + execute: async (additionalArgs = []) => { + return runPlaywright({ + additionalArgs, + }); + }, +}; + +export { testE2e }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/test-watch.ts b/tools/repo-scripts/src/tasks/test-watch.ts new file mode 100644 index 00000000..5062f52f --- /dev/null +++ b/tools/repo-scripts/src/tasks/test-watch.ts @@ -0,0 +1,15 @@ +import { runVitest } from '../utilities/runVitest.js'; +import type { Task } from '../types.js'; + +const testWatch: Task = { + command: 'test-watch', + description: 'Run tests in watch mode', + execute: async (additionalArgs = []) => { + return runVitest({ + watch: true, + additionalArgs, + }); + }, +}; + +export { testWatch }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/test.ts b/tools/repo-scripts/src/tasks/test.ts index 92ce3fbe..1bf4a0e6 100644 --- a/tools/repo-scripts/src/tasks/test.ts +++ b/tools/repo-scripts/src/tasks/test.ts @@ -3,73 +3,82 @@ import { existsSync } from 'fs'; import { resolve } from 'path'; import { spawn } from 'child_process'; import { getJestConfigPath } from '../utilities/getJestConfigPath.js'; +import { getPackageData } from '../utilities/getPackageData.js'; import { runScript } from '../utilities/runScript.js'; +import { runVitest } from '../utilities/runVitest.js'; import type { Task } from '../types.js'; const test: Task = { command: 'test', - description: 'Run tests using Jest or Node.js test runner', + description: 'Run tests using Jest, Vitest, or Node.js test runner', execute: async function test(additionalArgs = []) { - const packageRoot = findPackageRoot(process.cwd()) || process.cwd(); - - // Check if this package uses Jest - try { - const configPath = getJestConfigPath(packageRoot); + const packageRoot = findPackageRoot(process.cwd()) || process.cwd(); + const { packageJson } = getPackageData(packageRoot); - // Run Jest - return runScript({ - packageName: 'jest', - nodeArgs: ['--experimental-vm-modules'], - args: [ - '--config', - configPath, - '--rootDir', - packageRoot, - '--forceExit', - // '--detectOpenHandles', - ...additionalArgs, - ], - env: { - NODE_ENV: 'test', - }, - }); - } catch { - // No Jest config found, try Node test runner - const testPattern = existsSync(resolve(packageRoot, 'tests')) ? 'tests/**/*.test.js' : - existsSync(resolve(packageRoot, 'src')) ? 'src/**/*.test.ts' : null; - - if (!testPattern) { - console.log(`No tests found in ${packageRoot}`); - return; + // Check if this package uses Vitest + const hasVitest = 'vitest' in (packageJson.devDependencies || {}); + if (hasVitest) { + return runVitest({ additionalArgs }); } - // Run tests using node test runner - console.log(`Running tests with Node.js test runner: ${testPattern}`); - - return new Promise((resolve, reject) => { - const result = spawn('node', ['--test', testPattern, ...additionalArgs], { - cwd: packageRoot, - stdio: 'inherit', + // Check if this package uses Jest + try { + const configPath = getJestConfigPath(packageRoot); + + // Run Jest + return runScript({ + packageName: 'jest', + nodeArgs: ['--experimental-vm-modules'], + args: [ + '--config', + configPath, + '--rootDir', + packageRoot, + '--forceExit', + // '--detectOpenHandles', + ...additionalArgs, + ], env: { - ...process.env, NODE_ENV: 'test', }, }); + } catch { + // No Jest config found, try Node test runner + const testPattern = existsSync(resolve(packageRoot, 'tests')) ? 'tests/**/*.test.js' : + existsSync(resolve(packageRoot, 'src')) ? 'src/**/*.test.ts' : null; - result.on('exit', (code) => { - if (code === 0) { - resolve(); - } else { - reject(new Error(`Node test runner exited with code ${code}`)); - } - }); + if (!testPattern) { + console.log(`No tests found in ${packageRoot}`); + return; + } + + // Run tests using node test runner + console.log(`Running tests with Node.js test runner: ${testPattern}`); - result.on('error', (e) => { - reject(e); + return new Promise((resolve, reject) => { + const result = spawn('node', ['--test', testPattern, ...additionalArgs], { + cwd: packageRoot, + stdio: 'inherit', + env: { + ...process.env, + NODE_ENV: 'test', + }, + }); + + result.on('exit', (code) => { + if (code === 0) { + resolve(); + } else { + reject(new Error(`Node test runner exited with code ${code}`)); + } + }); + + result.on('error', (e) => { + reject(e); + }); }); - }); + } } -} }; export { test }; \ No newline at end of file diff --git a/tools/repo-scripts/src/tasks/typecheck.ts b/tools/repo-scripts/src/tasks/typecheck.ts index 78bfe80f..ec69ff86 100644 --- a/tools/repo-scripts/src/tasks/typecheck.ts +++ b/tools/repo-scripts/src/tasks/typecheck.ts @@ -1,10 +1,19 @@ import { runScript } from '../utilities/runScript.js'; +import { detectPackageType } from '../utilities/detectPackageType.js'; +import { runTcm } from '../utilities/runTcm.js'; import type { Task } from '../types.js'; const typecheck: Task = { command: 'typecheck', description: 'Run TypeScript type checking', execute: async (additionalArgs = []) => { + const packageType = detectPackageType(); + + // Run tcm first for packages with CSS modules + if (packageType === 'react-app' || packageType === 'component-library') { + await runTcm(); + } + // Run TypeScript with --noEmit to just check types return runScript({ packageName: 'typescript', diff --git a/tools/repo-scripts/src/utilities/copyFiles.ts b/tools/repo-scripts/src/utilities/copyFiles.ts new file mode 100644 index 00000000..f5ccc0c0 --- /dev/null +++ b/tools/repo-scripts/src/utilities/copyFiles.ts @@ -0,0 +1,34 @@ +import { cpSync, mkdirSync } from 'fs'; +import { join, dirname } from 'path'; +import { glob } from 'glob'; + +export interface CopyFilesOptions { + pattern: string; + srcDir: string; + destDir: string; +} + +/** + * Copy files matching a pattern from source to destination + */ +export function copyFiles({ + pattern, + srcDir, + destDir, +}: CopyFilesOptions): void { + const files = glob.sync(pattern, { + cwd: join(process.cwd(), srcDir), + }); + + console.log(`Copying ${files.length} files from ${srcDir} to ${destDir}`); + + files.forEach((file) => { + const src = join(process.cwd(), srcDir, file); + const dest = join(process.cwd(), destDir, file); + + // Ensure destination directory exists + mkdirSync(dirname(dest), { recursive: true }); + + cpSync(src, dest, { recursive: true }); + }); +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/detectPackageType.ts b/tools/repo-scripts/src/utilities/detectPackageType.ts new file mode 100644 index 00000000..fb349ec1 --- /dev/null +++ b/tools/repo-scripts/src/utilities/detectPackageType.ts @@ -0,0 +1,20 @@ +import { getPackageData } from './getPackageData.js'; + +export type PackageType = 'react-app' | 'component-library' | 'node-app' | 'unknown'; + +/** + * Detect the type of package based on packageType field in package.json + */ +export function detectPackageType(cwd: string = process.cwd()): PackageType { + const { packageJson } = getPackageData(cwd); + + // Check for explicit packageType field + if (packageJson.packageType) { + const validTypes: PackageType[] = ['react-app', 'component-library', 'node-app']; + if (validTypes.includes(packageJson.packageType as PackageType)) { + return packageJson.packageType as PackageType; + } + } + + return 'unknown'; +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/runConcurrently.ts b/tools/repo-scripts/src/utilities/runConcurrently.ts new file mode 100644 index 00000000..68cb01ef --- /dev/null +++ b/tools/repo-scripts/src/utilities/runConcurrently.ts @@ -0,0 +1,36 @@ +import { execa } from 'execa'; + +export interface RunConcurrentlyOptions { + commands: Array<{ + name: string; + command: string; + }>; + killOthersOnFail?: boolean; +} + +/** + * Run multiple commands concurrently + */ +export async function runConcurrently({ + commands, + killOthersOnFail = true, +}: RunConcurrentlyOptions): Promise { + const names = commands.map(c => c.name).join(','); + const commandStrings = commands.map(c => `"${c.command}"`); + + const args = [ + '-n', names, + '-c', 'cyan,green,yellow,blue,magenta', + ]; + + if (killOthersOnFail) { + args.push('--kill-others'); + } + + args.push(...commandStrings); + + await execa('npx', ['concurrently', ...args], { + stdio: 'inherit', + cwd: process.cwd(), + }); +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/runPlaywright.ts b/tools/repo-scripts/src/utilities/runPlaywright.ts new file mode 100644 index 00000000..bb409126 --- /dev/null +++ b/tools/repo-scripts/src/utilities/runPlaywright.ts @@ -0,0 +1,31 @@ +import { runScript } from './runScript.js'; + +export interface RunPlaywrightOptions { + ui?: boolean; + additionalArgs?: string[]; +} + +/** + * Run playwright tests + */ +export async function runPlaywright({ + ui = false, + additionalArgs = [], +}: RunPlaywrightOptions = {}): Promise { + const args = ['test']; + + if (ui) { + args.push('--ui'); + } + + args.push(...additionalArgs); + + return runScript({ + packageName: '@playwright/test', + name: 'playwright', + args, + env: { + NODE_ENV: 'test', + }, + }); +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/runStorybook.ts b/tools/repo-scripts/src/utilities/runStorybook.ts new file mode 100644 index 00000000..ee12af00 --- /dev/null +++ b/tools/repo-scripts/src/utilities/runStorybook.ts @@ -0,0 +1,35 @@ +import { runScript } from './runScript.js'; + +export interface RunStorybookOptions { + command: 'dev' | 'build'; + port?: number; + host?: boolean; + additionalArgs?: string[]; +} + +/** + * Run storybook commands + */ +export async function runStorybook({ + command, + port = 6006, + host = false, + additionalArgs = [], +}: RunStorybookOptions): Promise { + const args: string[] = [command]; + + if (command === 'dev') { + args.push('-p', port.toString()); + + if (host) { + args.push('--host', '0.0.0.0'); + } + } + + args.push(...additionalArgs); + + return runScript({ + packageName: 'storybook', + args, + }); +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/runTcm.ts b/tools/repo-scripts/src/utilities/runTcm.ts new file mode 100644 index 00000000..a1dcebba --- /dev/null +++ b/tools/repo-scripts/src/utilities/runTcm.ts @@ -0,0 +1,39 @@ +import { runScript } from './runScript.js'; +import { existsSync } from 'fs'; +import { join } from 'path'; + +export interface RunTcmOptions { + srcDir?: string; + watch?: boolean; + additionalArgs?: string[]; +} + +/** + * Run typed-css-modules on a directory + */ +export async function runTcm({ + srcDir = 'src', + watch = false, + additionalArgs = [], +}: RunTcmOptions = {}): Promise { + const srcPath = join(process.cwd(), srcDir); + + if (!existsSync(srcPath)) { + console.log(`No ${srcDir} directory found, skipping tcm`); + return; + } + + const args = [srcPath]; + + if (watch) { + args.push('--watch'); + } + + args.push(...additionalArgs); + + return runScript({ + packageName: 'typed-css-modules', + name: 'tcm', + args, + }); +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/runVite.ts b/tools/repo-scripts/src/utilities/runVite.ts new file mode 100644 index 00000000..891a982e --- /dev/null +++ b/tools/repo-scripts/src/utilities/runVite.ts @@ -0,0 +1,33 @@ +import { runScript } from './runScript.js'; + +export interface RunViteOptions { + command: 'dev' | 'build' | 'preview'; + host?: boolean; + additionalArgs?: string[]; +} + +/** + * Run vite commands + */ +export async function runVite({ + command, + host = false, + additionalArgs = [], +}: RunViteOptions): Promise { + const args = []; + + if (command !== 'dev') { + args.push(command); + } + + if (host) { + args.push('--host'); + } + + args.push(...additionalArgs); + + return runScript({ + packageName: 'vite', + args, + }); +} \ No newline at end of file diff --git a/tools/repo-scripts/src/utilities/runVitest.ts b/tools/repo-scripts/src/utilities/runVitest.ts new file mode 100644 index 00000000..9ff52b0e --- /dev/null +++ b/tools/repo-scripts/src/utilities/runVitest.ts @@ -0,0 +1,30 @@ +import { runScript } from './runScript.js'; + +export interface RunVitestOptions { + watch?: boolean; + additionalArgs?: string[]; +} + +/** + * Run vitest + */ +export async function runVitest({ + watch = false, + additionalArgs = [], +}: RunVitestOptions = {}): Promise { + const args = []; + + if (!watch) { + args.push('run'); + } + + args.push(...additionalArgs); + + return runScript({ + packageName: 'vitest', + args, + env: { + NODE_ENV: 'test', + }, + }); +} \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/README.md b/tools/repo-scripts/templates/package/README.md deleted file mode 100644 index cbdc76dc..00000000 --- a/tools/repo-scripts/templates/package/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# {{packageName}} - -{{description}} - -## Usage - -```typescript -import { something } from '@claude-flow/{{packageName}}'; -``` - -## Development - -```bash -# Build the package -pnpm build - -# Run tests -pnpm test - -# Lint the code -pnpm lint -``` \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/eslint.config.mjs b/tools/repo-scripts/templates/package/eslint.config.mjs deleted file mode 100644 index 236c723c..00000000 --- a/tools/repo-scripts/templates/package/eslint.config.mjs +++ /dev/null @@ -1,3 +0,0 @@ -import eslintConfig from '@claude-flow/eslint-config'; - -export default eslintConfig.node; \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/package.json b/tools/repo-scripts/templates/package/package.json deleted file mode 100644 index cbec656e..00000000 --- a/tools/repo-scripts/templates/package/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "@claude-flow/{{packageName}}", - "version": "1.0.0", - "private": true, - "description": "{{description}}", - "type": "module", - "main": "./lib/index.js", - "types": "./lib/index.d.ts", - "scripts": { - "build": "repo-scripts build", - "test": "repo-scripts test", - "lint": "repo-scripts lint", - "lint:fix": "repo-scripts lint-fix", - "clean": "repo-scripts clean" - }, - "devDependencies": { - "@claude-flow/eslint-config": "workspace:*", - "@claude-flow/repo-scripts": "workspace:*", - "@claude-flow/tsconfig": "workspace:*", - "@types/node": "^20.0.0" - } -} \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/src/index.ts b/tools/repo-scripts/templates/package/src/index.ts deleted file mode 100644 index 37bd1ea8..00000000 --- a/tools/repo-scripts/templates/package/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function hello(name: string): string { - return `Hello, ${name}!`; -} \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/tests/index.test.js b/tools/repo-scripts/templates/package/tests/index.test.js deleted file mode 100644 index e0bdcdb6..00000000 --- a/tools/repo-scripts/templates/package/tests/index.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import { test } from 'node:test'; -import assert from 'node:assert'; -import { hello } from '../lib/index.js'; - -test('hello function returns greeting', () => { - const result = hello('World'); - assert.strictEqual(result, 'Hello, World!'); -}); \ No newline at end of file diff --git a/tools/repo-scripts/templates/package/tsconfig.json b/tools/repo-scripts/templates/package/tsconfig.json deleted file mode 100644 index 0275920d..00000000 --- a/tools/repo-scripts/templates/package/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "@claude-flow/tsconfig/base.json", - "compilerOptions": { - "rootDir": "src", - "outDir": "lib" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "lib"] -} \ No newline at end of file diff --git a/tools/templates/component-library/.storybook/main.ts b/tools/templates/component-library/.storybook/main.ts index 8bafa725..7327bdfd 100644 --- a/tools/templates/component-library/.storybook/main.ts +++ b/tools/templates/component-library/.storybook/main.ts @@ -2,12 +2,7 @@ import type { StorybookConfig } from '@storybook/react-vite'; const config: StorybookConfig = { stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], - addons: [ - '@storybook/addon-essentials', - '@storybook/addon-interactions', - '@storybook/addon-links', - '@chromatic-com/storybook' - ], + addons: [ '@storybook/addon-docs'], framework: { name: '@storybook/react-vite', options: {}, @@ -17,4 +12,4 @@ const config: StorybookConfig = { } }; -export default config; \ No newline at end of file +export default config; \ No newline at end of file diff --git a/tools/templates/component-library/.storybook/preview.ts b/tools/templates/component-library/.storybook/preview.ts index 2fcfb6dc..b98e449a 100644 --- a/tools/templates/component-library/.storybook/preview.ts +++ b/tools/templates/component-library/.storybook/preview.ts @@ -10,6 +10,7 @@ const preview: Preview = { }, }, }, + tags: ['autodocs'], }; export default preview; \ No newline at end of file diff --git a/tools/templates/component-library/package.json b/tools/templates/component-library/package.json index df36fdc6..ef34a32e 100644 --- a/tools/templates/component-library/package.json +++ b/tools/templates/component-library/package.json @@ -4,6 +4,7 @@ "private": true, "description": "{{description}}", "type": "module", + "packageType": "component-library", "main": "./lib/index.js", "module": "./lib/index.js", "types": "./lib/index.d.ts", @@ -18,18 +19,18 @@ "lib" ], "scripts": { - "build": "tcm src && tsc -b && cp src/**/*.css lib/", - "build:storybook": "storybook build", - "dev": "concurrently \"tsc -b --watch\" \"tcm src --watch\"", - "dev:storybook": "storybook dev -p 6006", - "dev:storybook:host": "storybook dev -p 6006 --host 0.0.0.0", + "build": "repo-scripts build", + "build:storybook": "repo-scripts build-storybook", "clean": "repo-scripts clean", - "lint": "eslint src/**/*.{ts,tsx}", - "lint:fix": "eslint src/**/*.{ts,tsx} --fix", - "test": "echo 'No tests configured'", - "typecheck": "tcm src && tsc --noEmit", - "tcm": "tcm src", - "tcm:watch": "tcm src --watch" + "dev": "repo-scripts dev", + "dev:storybook": "repo-scripts dev-storybook", + "dev:storybook:wsl": "repo-scripts dev-storybook-wsl", + "dev:wsl": "repo-scripts dev-wsl", + "lint": "repo-scripts lint", + "lint:fix": "repo-scripts lint-fix", + "test": "repo-scripts test", + "test:watch": "repo-scripts test-watch", + "typecheck": "repo-scripts typecheck" }, "dependencies": { "classnames": "^2.5.1" @@ -39,25 +40,11 @@ "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { + "@claude-flow/repo-scripts": "workspace:*", "@claude-flow/tsconfig": "workspace:*", - "@chromatic-com/storybook": "^1.0.0", - "@storybook/addon-essentials": "^8.0.0", - "@storybook/addon-interactions": "^8.0.0", - "@storybook/addon-links": "^8.0.0", - "@storybook/blocks": "^8.0.0", - "@storybook/react": "^8.0.0", - "@storybook/react-vite": "^8.0.0", - "@storybook/test": "^8.0.0", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", - "@vitejs/plugin-react": "^4.5.2", - "concurrently": "^8.2.0", - "eslint-plugin-storybook": "^0.12.0", "react": "^19.1.0", - "react-dom": "^19.1.0", - "storybook": "^8.0.0", - "typed-css-modules": "^0.9.1", - "typescript": "~5.8.3", - "vite": "^7.0.0" + "react-dom": "^19.1.0" } } \ No newline at end of file diff --git a/tools/templates/component-library/src/components/Button.test.tsx b/tools/templates/component-library/src/components/Button.test.tsx new file mode 100644 index 00000000..6d86b931 --- /dev/null +++ b/tools/templates/component-library/src/components/Button.test.tsx @@ -0,0 +1,53 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Button } from './Button'; + +describe('Button', () => { + it('renders children', () => { + render(); + expect(screen.getByRole('button')).toHaveTextContent('Click me'); + }); + + it('applies variant classes', () => { + const { rerender } = render(); + expect(screen.getByRole('button')).toHaveClass('primary'); + + rerender(); + expect(screen.getByRole('button')).toHaveClass('secondary'); + + rerender(); + expect(screen.getByRole('button')).toHaveClass('danger'); + }); + + it('applies size classes', () => { + const { rerender } = render(); + expect(screen.getByRole('button')).toHaveClass('sm'); + + rerender(); + expect(screen.getByRole('button')).toHaveClass('md'); + + rerender(); + expect(screen.getByRole('button')).toHaveClass('lg'); + }); + + it('handles click events', async () => { + const handleClick = vi.fn(); + const user = userEvent.setup(); + + render(); + + await user.click(screen.getByRole('button')); + expect(handleClick).toHaveBeenCalledOnce(); + }); + + it('can be disabled', () => { + render(); + expect(screen.getByRole('button')).toBeDisabled(); + }); + + it('applies custom className', () => { + render(); + expect(screen.getByRole('button')).toHaveClass('custom-class'); + }); +}); \ No newline at end of file diff --git a/tools/templates/component-library/src/test/setup.ts b/tools/templates/component-library/src/test/setup.ts new file mode 100644 index 00000000..3c339455 --- /dev/null +++ b/tools/templates/component-library/src/test/setup.ts @@ -0,0 +1,7 @@ +import '@testing-library/jest-dom/vitest'; +import { cleanup } from '@testing-library/react'; +import { afterEach } from 'vitest'; + +afterEach(() => { + cleanup(); +}); \ No newline at end of file diff --git a/tools/templates/component-library/vitest.config.ts b/tools/templates/component-library/vitest.config.ts new file mode 100644 index 00000000..035f52e2 --- /dev/null +++ b/tools/templates/component-library/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vitest/config'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], + test: { + globals: true, + environment: 'jsdom', + setupFiles: ['./src/test/setup.ts'], + }, +}); \ No newline at end of file diff --git a/tools/templates/node-app/package.json b/tools/templates/node-app/package.json index 8d081d3b..95ab8c78 100644 --- a/tools/templates/node-app/package.json +++ b/tools/templates/node-app/package.json @@ -4,21 +4,23 @@ "private": true, "description": "{{description}}", "type": "module", + "packageType": "node-app", "main": "./lib/index.js", "types": "./lib/index.d.ts", "scripts": { - "build": "tsc -b", - "dev": "tsc -b --watch", + "build": "repo-scripts build", "clean": "repo-scripts clean", - "lint": "eslint src/**/*.ts", - "lint:fix": "eslint src/**/*.ts --fix", - "test": "echo 'No tests configured'", - "typecheck": "tsc --noEmit" + "dev": "repo-scripts dev", + "lint": "repo-scripts lint", + "lint:fix": "repo-scripts lint-fix", + "test": "repo-scripts test", + "test:watch": "repo-scripts test-watch", + "typecheck": "repo-scripts typecheck" }, "dependencies": {}, "devDependencies": { + "@claude-flow/repo-scripts": "workspace:*", "@claude-flow/tsconfig": "workspace:*", - "@types/node": "^20.0.0", - "typescript": "~5.8.3" + "@types/node": "^20.0.0" } } \ No newline at end of file diff --git a/tools/templates/node-app/src/index.test.ts b/tools/templates/node-app/src/index.test.ts new file mode 100644 index 00000000..347013bd --- /dev/null +++ b/tools/templates/node-app/src/index.test.ts @@ -0,0 +1,14 @@ +import { describe, it, expect, vi } from 'vitest'; +import { main } from './index.js'; + +describe('main', () => { + it('should log hello message', () => { + const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); + + main(); + + expect(consoleSpy).toHaveBeenCalledWith('Hello from {{name}}!'); + + consoleSpy.mockRestore(); + }); +}); \ No newline at end of file diff --git a/tools/templates/node-app/vitest.config.ts b/tools/templates/node-app/vitest.config.ts new file mode 100644 index 00000000..c7da6b38 --- /dev/null +++ b/tools/templates/node-app/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + }, +}); \ No newline at end of file diff --git a/tools/templates/react-app/.storybook/main.ts b/tools/templates/react-app/.storybook/main.ts index 8bafa725..a52435e8 100644 --- a/tools/templates/react-app/.storybook/main.ts +++ b/tools/templates/react-app/.storybook/main.ts @@ -2,12 +2,7 @@ import type { StorybookConfig } from '@storybook/react-vite'; const config: StorybookConfig = { stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], - addons: [ - '@storybook/addon-essentials', - '@storybook/addon-interactions', - '@storybook/addon-links', - '@chromatic-com/storybook' - ], + addons: [ '@storybook/addon-docs'], framework: { name: '@storybook/react-vite', options: {}, diff --git a/tools/templates/react-app/.storybook/preview.ts b/tools/templates/react-app/.storybook/preview.ts index f45a4ed0..2c03e741 100644 --- a/tools/templates/react-app/.storybook/preview.ts +++ b/tools/templates/react-app/.storybook/preview.ts @@ -1,4 +1,4 @@ -import type { Preview } from '@storybook/react'; +import type { Preview } from 'storybook'; import '../src/index.global.css'; const preview: Preview = { @@ -10,6 +10,7 @@ const preview: Preview = { }, }, }, + tags: ['autodocs'], }; export default preview; \ No newline at end of file diff --git a/tools/templates/react-app/e2e/app.spec.ts b/tools/templates/react-app/e2e/app.spec.ts new file mode 100644 index 00000000..53c99645 --- /dev/null +++ b/tools/templates/react-app/e2e/app.spec.ts @@ -0,0 +1,22 @@ +import { test, expect } from '@playwright/test'; + +test.describe('App', () => { + test('should display welcome message', async ({ page }) => { + await page.goto('/'); + + await expect(page.getByRole('heading', { name: 'Welcome to {{name}}' })).toBeVisible(); + }); + + test('should display getting started instructions', async ({ page }) => { + await page.goto('/'); + + await expect(page.getByText('Get started by editing')).toBeVisible(); + await expect(page.locator('code').filter({ hasText: 'src/App.tsx' })).toBeVisible(); + }); + + test('should have correct page title', async ({ page }) => { + await page.goto('/'); + + await expect(page).toHaveTitle('{{name}}'); + }); +}); \ No newline at end of file diff --git a/tools/templates/react-app/package.json b/tools/templates/react-app/package.json index a59a20e4..ffe7b9f9 100644 --- a/tools/templates/react-app/package.json +++ b/tools/templates/react-app/package.json @@ -3,22 +3,24 @@ "private": true, "version": "0.0.0", "type": "module", + "packageType": "react-app", "scripts": { - "dev": "tcm src && concurrently --kill-others \"vite\" \"tcm src --watch\"", - "dev:host": "tcm src && concurrently --kill-others \"vite --host\" \"tcm src --watch\"", - "dev:vite-only": "vite", - "dev:storybook": "storybook dev -p 6006", - "dev:storybook:host": "storybook dev -p 6006 --host 0.0.0.0", - "build": "tcm src && tsc -b && vite build", - "build:storybook": "storybook build", - "lint": "eslint .", - "lint:fix": "eslint . --fix", - "preview": "vite preview", + "build": "repo-scripts build", + "build:storybook": "repo-scripts build-storybook", "clean": "repo-scripts clean", - "test": "echo 'No tests configured'", - "typecheck": "tcm src && tsc --noEmit", - "tcm": "tcm src", - "tcm:watch": "tcm src --watch" + "dev": "repo-scripts dev", + "dev:storybook": "repo-scripts dev-storybook", + "dev:storybook:wsl": "repo-scripts dev-storybook-wsl", + "dev:vite-only": "repo-scripts dev-vite-only", + "dev:wsl": "repo-scripts dev-wsl", + "lint": "repo-scripts lint", + "lint:fix": "repo-scripts lint-fix", + "preview": "repo-scripts preview", + "test": "repo-scripts test", + "test:e2e": "repo-scripts test-e2e", + "test:e2e:ui": "repo-scripts test-e2e-ui", + "test:watch": "repo-scripts test-watch", + "typecheck": "repo-scripts typecheck" }, "dependencies": { "classnames": "^2.5.1", @@ -27,29 +29,9 @@ "react-router-dom": "^7.6.3" }, "devDependencies": { + "@claude-flow/repo-scripts": "workspace:*", "@claude-flow/tsconfig": "workspace:*", - "@chromatic-com/storybook": "^1.0.0", - "@eslint/js": "^9.29.0", - "@storybook/addon-essentials": "^8.0.0", - "@storybook/addon-interactions": "^8.0.0", - "@storybook/addon-links": "^8.0.0", - "@storybook/blocks": "^8.0.0", - "@storybook/react": "^8.0.0", - "@storybook/react-vite": "^8.0.0", - "@storybook/test": "^8.0.0", "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", - "@vitejs/plugin-react": "^4.5.2", - "concurrently": "^8.2.0", - "eslint": "^9.29.0", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.20", - "eslint-plugin-storybook": "^0.12.0", - "globals": "^16.2.0", - "storybook": "^8.0.0", - "typed-css-modules": "^0.9.1", - "typescript": "~5.8.3", - "typescript-eslint": "^8.34.1", - "vite": "^7.0.0" + "@types/react-dom": "^19.1.6" } } \ No newline at end of file diff --git a/tools/templates/react-app/playwright.config.ts b/tools/templates/react-app/playwright.config.ts new file mode 100644 index 00000000..7b5dc44c --- /dev/null +++ b/tools/templates/react-app/playwright.config.ts @@ -0,0 +1,27 @@ +import { defineConfig, devices } from '@playwright/test'; + +export default defineConfig({ + testDir: './e2e', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: 'html', + use: { + baseURL: 'http://localhost:5173', + trace: 'on-first-retry', + }, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], + + webServer: { + command: 'npm run dev:vite-only', + port: 5173, + reuseExistingServer: !process.env.CI, + }, +}); \ No newline at end of file diff --git a/tools/templates/react-app/src/App.stories.tsx b/tools/templates/react-app/src/App.stories.tsx index ac9829bb..ea6ef9f5 100644 --- a/tools/templates/react-app/src/App.stories.tsx +++ b/tools/templates/react-app/src/App.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from '@storybook/react'; +import type { Meta, StoryObj } from 'storybook'; import App from './App'; const meta = { diff --git a/tools/templates/react-app/src/App.test.tsx b/tools/templates/react-app/src/App.test.tsx new file mode 100644 index 00000000..9311b397 --- /dev/null +++ b/tools/templates/react-app/src/App.test.tsx @@ -0,0 +1,22 @@ +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +describe('App', () => { + it('renders welcome message', () => { + render(); + + const heading = screen.getByText('Welcome to {{name}}'); + expect(heading).toBeInTheDocument(); + }); + + it('renders description with code element', () => { + render(); + + const description = screen.getByText(/Get started by editing/); + expect(description).toBeInTheDocument(); + + const codeElement = screen.getByText('src/App.tsx'); + expect(codeElement.tagName).toBe('CODE'); + }); +}); \ No newline at end of file diff --git a/tools/templates/react-app/src/test/setup.ts b/tools/templates/react-app/src/test/setup.ts new file mode 100644 index 00000000..3c339455 --- /dev/null +++ b/tools/templates/react-app/src/test/setup.ts @@ -0,0 +1,7 @@ +import '@testing-library/jest-dom/vitest'; +import { cleanup } from '@testing-library/react'; +import { afterEach } from 'vitest'; + +afterEach(() => { + cleanup(); +}); \ No newline at end of file diff --git a/tools/templates/react-app/vitest.config.ts b/tools/templates/react-app/vitest.config.ts new file mode 100644 index 00000000..29873048 --- /dev/null +++ b/tools/templates/react-app/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], + test: { + globals: true, + environment: 'jsdom', + setupFiles: ['./src/test/setup.ts'], + exclude: ['e2e/**', 'node_modules/**'], + }, +}); \ No newline at end of file diff --git a/packages/tsconfig/base.json b/tools/tsconfig/base.json similarity index 97% rename from packages/tsconfig/base.json rename to tools/tsconfig/base.json index 883dfb4d..26de2ecf 100644 --- a/packages/tsconfig/base.json +++ b/tools/tsconfig/base.json @@ -11,7 +11,6 @@ "sourceMap": true, "outDir": "./lib", "rootDir": "./src", - "composite": true, "incremental": true, "tsBuildInfoFile": "./lib/.tsbuildinfo", diff --git a/packages/tsconfig/node.json b/tools/tsconfig/node.json similarity index 100% rename from packages/tsconfig/node.json rename to tools/tsconfig/node.json diff --git a/packages/tsconfig/package.json b/tools/tsconfig/package.json similarity index 89% rename from packages/tsconfig/package.json rename to tools/tsconfig/package.json index 72adab98..4ca51ccd 100644 --- a/packages/tsconfig/package.json +++ b/tools/tsconfig/package.json @@ -6,6 +6,7 @@ "files": [ "base.json", "react.json", + "react-library.json", "node.json" ], "scripts": {} diff --git a/packages/tsconfig/react-library.json b/tools/tsconfig/react-library.json similarity index 100% rename from packages/tsconfig/react-library.json rename to tools/tsconfig/react-library.json diff --git a/packages/tsconfig/react.json b/tools/tsconfig/react.json similarity index 100% rename from packages/tsconfig/react.json rename to tools/tsconfig/react.json From ac67846d7fc07ad030b674cda80e84e2a2b2bbb3 Mon Sep 17 00:00:00 2001 From: dzearing Date: Mon, 21 Jul 2025 06:47:22 -0700 Subject: [PATCH 05/15] prettier. --- .github/workflows/ci.yml | 198 ++ .prettierignore | 44 + .prettierrc.json | 9 + .tcmrc.json | 2 +- CLAUDE.md | 23 +- README.md | 33 +- apps/v1/README.md | 11 +- apps/v1/client/CSS_CONVENTIONS.md | 14 +- apps/v1/client/Z_INDEX_GUIDELINES.md | 4 +- .../client/e2e/breadcrumb-navigation.spec.ts | 46 +- .../client/e2e/claude-code-mount-fix.spec.ts | 73 +- .../e2e/claude-code-mount-issue.spec.ts | 104 +- .../e2e/claude-code-tool-execution.spec.ts | 43 +- .../client/e2e/claude-code-validation.spec.ts | 144 +- apps/v1/client/e2e/feedback-feature.spec.ts | 195 +- apps/v1/client/e2e/feedback-fixes.spec.ts | 133 +- .../v1/client/e2e/session-rehydration.spec.ts | 214 +- apps/v1/client/e2e/simple-breadcrumb.spec.ts | 8 +- .../client/e2e/test-dancing-bubbles.spec.ts | 49 +- .../e2e/test-feedback-autofocus.spec.ts | 47 +- .../client/e2e/test-ls-tool-display.spec.ts | 55 +- .../client/e2e/test-markdown-elements.spec.ts | 99 +- ...t-markdown-rendering-comprehensive.spec.ts | 133 +- .../e2e/test-markdown-rendering.spec.ts | 55 +- apps/v1/client/e2e/test-plan-mode.spec.ts | 80 +- apps/v1/client/e2e/test-setup.ts | 73 +- .../client/e2e/test-streaming-cursor.spec.ts | 85 +- .../client/e2e/test-streaming-events.spec.ts | 59 +- .../e2e/test-tool-execution-timing.spec.ts | 68 +- .../e2e/test-user-message-no-markdown.spec.ts | 60 +- apps/v1/client/eslint.config.js | 6 +- apps/v1/client/package.json | 2 +- apps/v1/client/playwright.config.ts | 4 +- apps/v1/client/postcss.config.cjs | 2 +- apps/v1/client/public/oauth-callback.html | 189 +- apps/v1/client/src/App.tsx | 7 +- .../client/src/components/AnimatedOutlet.tsx | 28 +- .../src/components/AnimatedOutletWrapper.tsx | 10 +- .../src/components/AnimatedTransition.tsx | 59 +- apps/v1/client/src/components/AuthAvatar.tsx | 179 +- .../client/src/components/AvatarGenerator.tsx | 111 +- .../src/components/BackgroundPattern.tsx | 19 +- .../components/BackgroundPatternOptimized.tsx | 58 +- .../components/BackgroundPatternStatic.tsx | 16 +- .../client/src/components/ConfirmDialog.tsx | 33 +- .../src/components/DropdownTransition.tsx | 29 +- .../client/src/components/FeedbackDialog.tsx | 61 +- .../v1/client/src/components/FeedbackLink.tsx | 2 +- .../src/components/FeedbackSuccessDialog.tsx | 55 +- .../src/components/FolderBrowserDialog.tsx | 280 +- .../components/ImportingWorkspaceDialog.tsx | 259 +- apps/v1/client/src/components/Layout.tsx | 28 +- apps/v1/client/src/components/Portal.tsx | 8 +- .../src/components/ProjectDeleteDialog.tsx | 33 +- .../v1/client/src/components/SettingsMenu.tsx | 121 +- .../client/src/components/SettingsModal.tsx | 164 +- .../src/components/StockPhotoAvatar.tsx | 338 +- .../client/src/components/ThemeSwitcher.tsx | 26 +- .../client/src/components/ThemeSwitcherV2.tsx | 184 +- .../v1/client/src/components/ThemedLayout.tsx | 33 +- .../client/src/components/ThemedLayoutV2.tsx | 93 +- .../client/src/components/ToastContainer.tsx | 122 +- .../src/components/WorkItemDeleteDialog.tsx | 45 +- .../src/components/WorkspaceConfirmDialog.tsx | 33 +- .../components/WorkspaceDialogContainer.tsx | 10 +- .../src/components/WorkspaceSetupDialog.tsx | 149 +- .../client/src/components/WorkspaceSync.tsx | 20 +- .../client/src/components/chat/ChatBubble.tsx | 53 +- .../client/src/components/chat/DiffView.tsx | 8 +- .../src/components/chat/ProgressIndicator.tsx | 33 +- .../components/chat/SuggestedResponses.tsx | 8 +- .../src/components/chat/ToolExecution.tsx | 323 +- .../components/chat/ToolExecutionGroup.tsx | 30 +- .../components/claude-code/ClaudeInput.tsx | 101 +- .../components/claude-code/ClaudeMessage.tsx | 124 +- .../src/components/claude-code/TodoList.tsx | 110 +- .../claude-code/VirtualMessageList.tsx | 152 +- .../client/src/components/ui/Breadcrumb.tsx | 32 +- apps/v1/client/src/components/ui/Button.tsx | 21 +- apps/v1/client/src/components/ui/Checkbox.tsx | 2 +- .../v1/client/src/components/ui/CrossFade.tsx | 41 +- .../src/components/ui/DancingBubbles.tsx | 12 +- .../client/src/components/ui/IconButton.tsx | 4 +- apps/v1/client/src/components/ui/Input.tsx | 2 +- .../src/components/ui/LoadingSpinner.tsx | 55 +- apps/v1/client/src/components/ui/Spinner.tsx | 27 +- apps/v1/client/src/components/ui/Toggle.tsx | 18 +- .../client/src/components/ui/ToggleButton.tsx | 30 +- apps/v1/client/src/config/api.ts | 2 +- apps/v1/client/src/config/themes.ts | 56 +- apps/v1/client/src/config/themesV2.ts | 132 +- apps/v1/client/src/contexts/AppContext.tsx | 357 +- apps/v1/client/src/contexts/AuthContext.tsx | 71 +- .../client/src/contexts/ClaudeCodeContext.tsx | 1501 ++++---- apps/v1/client/src/contexts/GitHubContext.tsx | 46 +- apps/v1/client/src/contexts/LayoutContext.tsx | 16 +- .../src/contexts/NewWorkItemContext.tsx | 50 +- .../src/contexts/SubscriptionContext.tsx | 85 +- apps/v1/client/src/contexts/ThemeContext.tsx | 18 +- .../v1/client/src/contexts/ThemeContextV2.tsx | 60 +- apps/v1/client/src/contexts/ToastContext.tsx | 8 +- .../client/src/contexts/WorkspaceContext.tsx | 104 +- apps/v1/client/src/hooks/useDraggable.ts | 28 +- apps/v1/client/src/hooks/useFeedback.ts | 139 +- .../src/hooks/useNavigationDirection.ts | 10 +- apps/v1/client/src/hooks/useSubscription.ts | 116 +- apps/v1/client/src/index.css | 26 +- apps/v1/client/src/main.tsx | 18 +- apps/v1/client/src/pages/ClaudeCode.tsx | 207 +- apps/v1/client/src/pages/Dashboard.tsx | 137 +- apps/v1/client/src/pages/DebugClaude.tsx | 123 +- apps/v1/client/src/pages/JamSessionDetail.tsx | 358 +- apps/v1/client/src/pages/JamSessions.tsx | 175 +- .../v1/client/src/pages/NewAgentMultiStep.tsx | 187 +- apps/v1/client/src/pages/NewPersona.tsx | 117 +- apps/v1/client/src/pages/NewProject.tsx | 145 +- .../client/src/pages/NewProjectMultiStep.tsx | 320 +- apps/v1/client/src/pages/NewWorkItem.tsx | 330 +- .../client/src/pages/NewWorkItemMultiStep.tsx | 599 ++-- apps/v1/client/src/pages/Personas.tsx | 91 +- apps/v1/client/src/pages/ProjectDetail.tsx | 287 +- apps/v1/client/src/pages/Projects.tsx | 207 +- apps/v1/client/src/pages/ThemedDashboard.tsx | 120 +- apps/v1/client/src/pages/ThemedNewPersona.tsx | 182 +- apps/v1/client/src/pages/ThemedPersonas.tsx | 131 +- .../client/src/pages/WorkItemJamSession.tsx | 813 +++-- apps/v1/client/src/pages/WorkItems.tsx | 291 +- .../v1/client/src/services/feedbackService.ts | 20 +- apps/v1/client/src/services/githubService.ts | 124 +- apps/v1/client/src/styles/markdown-chat.css | 4 +- apps/v1/client/src/styles/mdx-editor.css | 32 +- apps/v1/client/src/styles/patterns.css | 18 +- apps/v1/client/src/types/auth.ts | 2 +- apps/v1/client/src/types/index.ts | 10 +- apps/v1/client/src/types/workspace.ts | 2 +- apps/v1/client/src/utils/cache.ts | 20 +- apps/v1/client/src/utils/cn.ts | 2 +- apps/v1/client/src/utils/markdownUtils.ts | 68 +- .../v1/client/src/utils/suggestedResponses.ts | 22 +- apps/v1/client/tailwind.config.js | 12 +- apps/v1/client/tsconfig.json | 5 +- apps/v1/client/vite.config.ts | 8 +- apps/v1/server/README.md | 7 +- apps/v1/server/claude-message-flow.test.js | 144 +- apps/v1/server/claude-service.js | 554 +-- apps/v1/server/claude-service.test.js | 64 +- apps/v1/server/claudeflow-settings.js | 76 +- apps/v1/server/feedback-handler.js | 89 +- apps/v1/server/index.js | 3024 +++++++++-------- apps/v1/server/logger.js | 80 +- apps/v1/server/message-flow.test.js | 126 +- apps/v1/server/migrate-to-temp.js | 23 +- apps/v1/server/mock-server.js | 206 +- apps/v1/server/paths.js | 26 +- apps/v1/server/session-manager.js | 45 +- apps/v1/server/subscriptionManager.js | 102 +- docs/AUTHENTICATION.md | 8 +- docs/FEEDBACK.md | 67 +- docs/README.md | 14 +- docs/getting-started.md | 81 +- .../architecture/architecture-decisions.md | 37 +- .../architecture/client-architecture.md | 315 +- .../design-system-architecture.md | 216 +- .../guides/architecture/monorepo-structure.md | 18 +- docs/guides/development/build-tooling.md | 149 +- docs/guides/development/coding-conventions.md | 59 +- .../development/development-workflow.md | 49 +- docs/guides/migration/implementation-guide.md | 144 +- docs/guides/migration/migration-v1-to-v2.md | 54 +- docs/guides/migration/phase-0-summary.md | 7 +- docs/guides/migration/phase-1-summary.md | 8 +- .../migration/server-typescript-migration.md | 299 +- docs/plans/mockups/README.md | 13 +- docs/plans/mockups/design-system/Badge.html | 1652 ++++----- .../design-system/Button-Enhanced.html | 2094 ++++++------ docs/plans/mockups/design-system/Button.html | 1411 ++++---- docs/plans/mockups/design-system/Card.html | 1428 ++++---- .../mockups/design-system/ChatBubbles.html | 1577 ++++----- .../plans/mockups/design-system/Dropdown.html | 1731 +++++----- docs/plans/mockups/design-system/Input.html | 1546 +++++---- docs/plans/mockups/design-system/Modal.html | 1549 ++++----- .../mockups/design-system/Navigation.html | 1761 +++++----- .../plans/mockups/design-system/Progress.html | 1794 +++++----- docs/plans/mockups/design-system/ToolUI.html | 1918 +++++------ .../design-system/design-system-guide.html | 2082 ++++++------ .../flows/dashboard/claude-chat-view.html | 1627 ++++----- .../flows/dashboard/dashboard-view.html | 1600 ++++----- .../flows/feedback/feedback-dialog.html | 947 +++--- .../personas/persona-review-session-view.html | 2278 +++++++------ .../flows/projects/project-detail-view.html | 1600 ++++----- .../flows/projects/projects-list-view.html | 1831 +++++----- .../flows/repo-management/repo-overview.html | 1903 ++++++----- .../work-items/work-item-editor-view.html | 1966 +++++------ .../work-items/work-items-kanban-view.html | 2208 ++++++------ docs/reference/adding-project-templates.md | 39 +- docs/reference/examples/Button.module.css | 54 +- docs/reference/examples/Button.tsx | 39 +- docs/reference/examples/DataBusAdapter.ts | 64 +- .../examples/ProgressComponents.module.css | 121 +- .../reference/examples/ProgressComponents.tsx | 145 +- docs/reference/repo-scripts-specification.md | 105 +- lage.config.cjs | 16 +- package.json | 9 +- packages/repo-scripts-test/eslint.config.js | 2 +- packages/repo-scripts-test/jest.config.js | 9 +- packages/repo-scripts-test/package.json | 2 +- packages/repo-scripts-test/src/index.test.ts | 2 +- packages/repo-scripts-test/src/index.ts | 2 +- packages/repo-scripts-test/tsconfig.json | 2 +- pnpm-lock.yaml | 87 +- pnpm-workspace.yaml | 2 +- scripts/bin/repo-task.js | 6 +- scripts/eslint.config.js | 2 +- scripts/manual-test-validation.cjs | 77 +- scripts/package.json | 2 +- scripts/tasks/build-cjs.mjs | 4 +- scripts/tasks/build.mjs | 4 +- scripts/tasks/dev.mjs | 2 +- scripts/tasks/lint-fix.mjs | 4 +- scripts/tasks/lint.mjs | 4 +- scripts/tasks/test.mjs | 4 +- scripts/test-claude-code-mount.cjs | 33 +- scripts/test-claude-response.cjs | 9 +- scripts/test-markdown-fix.cjs | 67 +- scripts/test-success-validation.cjs | 49 +- scripts/tsconfig.json | 2 +- scripts/verify-fix.cjs | 29 +- tools/eslint-config/eslint.config.js | 2 +- tools/eslint-config/jest.config.js | 2 +- tools/eslint-config/package.json | 2 +- tools/eslint-config/src/configs/base.ts | 2 +- tools/eslint-config/src/configs/node.ts | 17 +- tools/eslint-config/src/configs/react.ts | 72 +- tools/eslint-config/src/index.ts | 2 +- tools/eslint-config/src/rules/index.ts | 2 +- .../src/rules/no-default-export.ts | 14 +- .../eslint-config/src/rules/no-deprecated.ts | 8 +- .../src/rules/one-export-per-file.ts | 54 +- tools/eslint-config/tsconfig.json | 2 +- tools/repo-scripts/bin/repo-scripts.js | 2 +- tools/repo-scripts/eslint.config.js | 2 +- tools/repo-scripts/package.json | 3 +- tools/repo-scripts/src/index.ts | 37 +- tools/repo-scripts/src/tasks/build-cjs.ts | 4 +- .../repo-scripts/src/tasks/build-storybook.ts | 2 +- tools/repo-scripts/src/tasks/build.ts | 20 +- tools/repo-scripts/src/tasks/clean.ts | 8 +- .../src/tasks/dev-storybook-wsl.ts | 2 +- tools/repo-scripts/src/tasks/dev-storybook.ts | 2 +- tools/repo-scripts/src/tasks/dev-vite-only.ts | 2 +- tools/repo-scripts/src/tasks/dev-wsl.ts | 12 +- tools/repo-scripts/src/tasks/dev.ts | 129 +- tools/repo-scripts/src/tasks/format-check.ts | 28 + tools/repo-scripts/src/tasks/format.ts | 18 + tools/repo-scripts/src/tasks/lint-fix.ts | 4 +- tools/repo-scripts/src/tasks/lint.ts | 218 +- tools/repo-scripts/src/tasks/preview.ts | 2 +- tools/repo-scripts/src/tasks/scaffold.ts | 61 +- tools/repo-scripts/src/tasks/test-e2e-ui.ts | 2 +- tools/repo-scripts/src/tasks/test-e2e.ts | 2 +- tools/repo-scripts/src/tasks/test-watch.ts | 2 +- tools/repo-scripts/src/tasks/test.ts | 27 +- tools/repo-scripts/src/tasks/typecheck.ts | 8 +- tools/repo-scripts/src/types.ts | 2 +- tools/repo-scripts/src/utilities/copyFiles.ts | 16 +- .../src/utilities/detectPackageType.ts | 6 +- .../src/utilities/getJestConfigPath.ts | 4 +- .../src/utilities/getPackageData.ts | 2 +- .../src/utilities/runConcurrently.ts | 19 +- .../src/utilities/runPlaywright.ts | 8 +- tools/repo-scripts/src/utilities/runScript.ts | 31 +- .../src/utilities/runStorybook.ts | 10 +- tools/repo-scripts/src/utilities/runTcm.ts | 12 +- tools/repo-scripts/src/utilities/runVite.ts | 10 +- tools/repo-scripts/src/utilities/runVitest.ts | 8 +- tools/repo-scripts/tsconfig.json | 2 +- .../component-library/.storybook/main.ts | 8 +- .../component-library/.storybook/preview.ts | 2 +- tools/templates/component-library/README.md | 2 +- .../templates/component-library/package.json | 6 +- .../src/components/Button.module.css | 2 +- .../src/components/Button.stories.tsx | 2 +- .../src/components/Button.test.tsx | 4 +- .../src/components/Button.tsx | 20 +- .../templates/component-library/src/index.ts | 2 +- .../component-library/src/styles.global.css | 2 +- .../component-library/src/test/setup.ts | 2 +- .../templates/component-library/tsconfig.json | 2 +- .../component-library/vite.config.ts | 6 +- .../component-library/vitest.config.ts | 2 +- tools/templates/node-app/README.md | 2 +- tools/templates/node-app/package.json | 6 +- tools/templates/node-app/src/index.test.ts | 8 +- tools/templates/node-app/src/index.ts | 2 +- tools/templates/node-app/tsconfig.json | 2 +- tools/templates/node-app/vitest.config.ts | 2 +- tools/templates/react-app/.storybook/main.ts | 8 +- .../templates/react-app/.storybook/preview.ts | 2 +- tools/templates/react-app/README.md | 2 +- tools/templates/react-app/e2e/app.spec.ts | 8 +- tools/templates/react-app/index.html | 2 +- tools/templates/react-app/package.json | 6 +- .../templates/react-app/playwright.config.ts | 4 +- tools/templates/react-app/src/App.module.css | 2 +- tools/templates/react-app/src/App.stories.tsx | 2 +- tools/templates/react-app/src/App.test.tsx | 8 +- tools/templates/react-app/src/App.tsx | 12 +- .../templates/react-app/src/index.global.css | 11 +- tools/templates/react-app/src/main.tsx | 12 +- tools/templates/react-app/src/test/setup.ts | 2 +- tools/templates/react-app/tsconfig.json | 2 +- tools/templates/react-app/vite.config.ts | 6 +- tools/templates/react-app/vitest.config.ts | 2 +- tools/tsconfig/base.json | 4 +- tools/tsconfig/node.json | 2 +- tools/tsconfig/package.json | 2 +- tools/tsconfig/react-library.json | 2 +- tools/tsconfig/react.json | 2 +- 318 files changed, 31415 insertions(+), 27458 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 tools/repo-scripts/src/tasks/format-check.ts create mode 100644 tools/repo-scripts/src/tasks/format.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..f2be7a50 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,198 @@ +name: CI + +on: + push: + branches: [main, v2] + pull_request: + branches: [main, v2] + +jobs: + format-check: + name: Format Check + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 9.0.0 + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Setup pnpm cache + uses: actions/cache@v3 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run format check + run: pnpm format:check + + lint: + name: Lint + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 9.0.0 + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Setup pnpm cache + uses: actions/cache@v3 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run lint + run: pnpm lint + + typecheck: + name: Type Check + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 9.0.0 + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Setup pnpm cache + uses: actions/cache@v3 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run type check + run: pnpm typecheck + + build: + name: Build + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 9.0.0 + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Setup pnpm cache + uses: actions/cache@v3 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run build + run: pnpm build + + test: + name: Test + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 9.0.0 + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Setup pnpm cache + uses: actions/cache@v3 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run tests + run: pnpm test diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..742b636d --- /dev/null +++ b/.prettierignore @@ -0,0 +1,44 @@ +# Dependencies +node_modules/ +**/node_modules + +# Build outputs +dist/ +build/ +lib/ +coverage/ +.turbo/ + +# Lock files +pnpm-lock.yaml +package-lock.json +yarn.lock + +# Generated files +*.d.ts +*.d.ts.map +*.js.map + +# Temp folders +temp/ +tmp/ +.cache/ + +# Logs +*.log + +# IDE +.vscode/ +.idea/ + +# OS +.DS_Store +Thumbs.db + +# Test artifacts +playwright-report/ +test-results/ + +# Specific files to ignore +**/*.min.js +**/*.min.css \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..c9186140 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "printWidth": 100, + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/.tcmrc.json b/.tcmrc.json index 2e5e4a22..f6076425 100644 --- a/.tcmrc.json +++ b/.tcmrc.json @@ -2,4 +2,4 @@ "pattern": "**/*.module.css", "nameFormat": "camel", "exportType": "default" -} \ No newline at end of file +} diff --git a/CLAUDE.md b/CLAUDE.md index c4e2a595..15b43978 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,6 +9,7 @@ Claude Flow is a modern project management platform with AI-powered features, or ## Common Commands ### Development + ```bash # Install dependencies (run from root) pnpm install @@ -30,6 +31,7 @@ pnpm build:v1 ``` ### Testing + ```bash # Run all tests (orchestrated with Lage) pnpm test @@ -45,6 +47,7 @@ cd apps/v1/client && pnpm playwright test ``` ### Code Quality + ```bash # Lint all packages pnpm lint @@ -60,6 +63,7 @@ pnpm check ``` ### Utilities + ```bash # Create new package from template pnpm scaffold @@ -71,6 +75,7 @@ pnpm clean ## High-Level Architecture ### Monorepo Structure + ``` / ├── apps/ @@ -86,6 +91,7 @@ pnpm clean ``` ### Key Technologies + - **Frontend**: React 19, TypeScript, Vite, Tailwind CSS, React Router v7 - **Backend**: Express v5, Claude Code SDK, file-based storage - **Testing**: Playwright (e2e), configured for headless Chromium @@ -95,12 +101,14 @@ pnpm clean ### Context-Based State Management The application uses a hierarchical context provider structure: + ``` -AppProvider → ThemeProvider → ToastProvider → AuthProvider → +AppProvider → ThemeProvider → ToastProvider → AuthProvider → GitHubProvider → WorkspaceProvider → LayoutProvider → SubscriptionProvider ``` Key contexts: + - **AppContext**: Core state (projects, work items, personas) - **WorkspaceContext**: Workspace management with caching - **ClaudeCodeContext**: Claude API session management @@ -111,12 +119,14 @@ Key contexts: The application requires workspace selection before functionality is available. Workspaces sync with the backend file system, and projects/work items are discovered from markdown files. ### Component Organization + - `/components/ui/`: Reusable UI primitives - `/components/chat/`: Chat functionality - `/components/claude-code/`: Claude Code integration - `/components/dialogs/`: Dialog components (no native browser dialogs) ### Data Flow Patterns + - Client-side caching with `getCached` utility - Progressive loading (light data first) - Optimistic UI updates @@ -124,6 +134,7 @@ The application requires workspace selection before functionality is available. - File system as database on server ### Server Architecture + - Express middleware stack - In-memory caching with TTL - Session persistence in `/temp/sessions/` @@ -133,32 +144,38 @@ The application requires workspace selection before functionality is available. ## Important Development Notes ### Server Restart Required + **CRITICAL**: When modifying ANY server files (`/apps/v1/server/*.js`), you MUST manually restart the server. The development server does not auto-restart. Always remind users: **"Please restart your server to apply these changes"** ### Dialog Patterns + - **NEVER** use `alert()`, `confirm()`, or `prompt()` - Always use React dialog components (e.g., `ConfirmDialog`) - Maintain consistent dialog UI/UX patterns ### File Operations + - Use absolute paths in all file operations - Workspace data stored in file system - Feedback stored in `/temp/feedback/` - Sessions stored in `/temp/sessions/` ### Testing Practices + - E2E tests use Playwright with headless Chromium - Tests are in `/apps/v1/client/e2e/` - Mock data supported for consistent testing - Video/screenshot capture on failure ### Code Style + - TypeScript for type safety (avoid `any`) - No CSS-in-JS (use CSS modules or Tailwind) - Functional components with hooks - Type imports: `import type { Foo }` or `import { type Foo, Bar }` ### Git Workflow + - Feature branches: `feature/`, `fix/`, `chore/` - No AI attribution in commits or code - Run tests and lint before committing @@ -175,6 +192,7 @@ The application requires workspace selection before functionality is available. ## Feedback Processing When processing feedback: + 1. Check `/temp/feedback/reports/` for feedback files 2. Analyze with corresponding screenshots 3. Fix root causes, not symptoms @@ -185,8 +203,9 @@ When processing feedback: ## Migration Strategy The project follows a phased migration from V1 to V2: + - Phase 0-1: ✅ Repository restructure complete - Phase 2: 🚧 Core package development - Phase 3-5: Future V2 development and migration -See `/docs/guides/migration/migration-v1-to-v2.md` for details. \ No newline at end of file +See `/docs/guides/migration/migration-v1-to-v2.md` for details. diff --git a/README.md b/README.md index de01e323..10738768 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ A modern project management platform with AI-powered features, built as a monore ## Overview This monorepo contains: + - **V1 Application** - Current production application (React + Express) - **V2 Packages** - Next-generation shared packages (coming soon) - **Development Tools** - CLI tools and shared configurations @@ -63,32 +64,34 @@ pnpm dev:v1 ``` This starts: + - Frontend: http://localhost:5173 - Backend: http://localhost:3001 ### Available Scripts -| Command | Description | -|---------|-------------| -| `pnpm dev` | Interactive development menu | -| `pnpm build` | Build all packages | -| `pnpm test` | Run all tests | -| `pnpm lint` | Lint all packages | -| `pnpm typecheck` | TypeScript type checking | -| `pnpm scaffold` | Create new package from template | +| Command | Description | +| ---------------- | -------------------------------- | +| `pnpm dev` | Interactive development menu | +| `pnpm build` | Build all packages | +| `pnpm test` | Run all tests | +| `pnpm lint` | Lint all packages | +| `pnpm typecheck` | TypeScript type checking | +| `pnpm scaffold` | Create new package from template | ### V1-Specific Scripts -| Command | Description | -|---------|-------------| -| `pnpm dev:v1` | Start v1 development servers | -| `pnpm build:v1` | Build v1 for production | -| `pnpm lint:v1` | Lint v1 code | -| `pnpm test:e2e` | Run v1 e2e tests | +| Command | Description | +| --------------- | ---------------------------- | +| `pnpm dev:v1` | Start v1 development servers | +| `pnpm build:v1` | Build v1 for production | +| `pnpm lint:v1` | Lint v1 code | +| `pnpm test:e2e` | Run v1 e2e tests | ## Architecture This monorepo uses: + - **pnpm** - Fast, efficient package manager with workspace support - **Lage** - Build orchestration for monorepos - **TypeScript** - With project references for fast builds @@ -123,4 +126,4 @@ See [migration guide](docs/guides/migration/migration-v1-to-v2.md) for details. ## License -[License information here] \ No newline at end of file +[License information here] diff --git a/apps/v1/README.md b/apps/v1/README.md index 246e7537..855b2f65 100644 --- a/apps/v1/README.md +++ b/apps/v1/README.md @@ -21,6 +21,7 @@ A modern project management interface with AI-powered work item creation. 1. Clone the repository 2. Install dependencies: + ```bash npm install ``` @@ -47,18 +48,22 @@ This will start both servers automatically. #### Option 2: Manual setup 1. **Terminal 1 - Start the mock server:** + ```bash cd server npm install # First time only npm run mock ``` + The server will run on http://localhost:3000 2. **Terminal 2 - Start the frontend:** + ```bash cd client npm run dev ``` + The frontend will run on http://localhost:5173 3. Navigate to Work Items and click "Create with AI" @@ -66,6 +71,7 @@ This will start both servers automatically. #### Using real Claude integration Instead of the mock server, you can use real Claude: + ```bash cd server cp .env.example .env @@ -76,6 +82,7 @@ npm start #### Troubleshooting If you get "Failed to fetch" errors: + - Ensure the mock server is running on port 3000 - Check that no other service is using port 3000 - Try accessing http://localhost:3000/api/health directly @@ -101,12 +108,14 @@ server/ ### Available Scripts From the monorepo root: + - `pnpm dev` - Start both client and server - `pnpm build:v1` - Build v1 for production - `pnpm lint:v1` - Run ESLint on v1 - `pnpm test:e2e` - Run e2e tests From this directory (`apps/v1`): + - Client scripts are in `client/package.json` - Server scripts are in `server/package.json` @@ -118,4 +127,4 @@ From this directory (`apps/v1`): - Tailwind CSS - React Router - Express (server) -- Claude Code SDK \ No newline at end of file +- Claude Code SDK diff --git a/apps/v1/client/CSS_CONVENTIONS.md b/apps/v1/client/CSS_CONVENTIONS.md index 4678c8fc..d618d3ef 100644 --- a/apps/v1/client/CSS_CONVENTIONS.md +++ b/apps/v1/client/CSS_CONVENTIONS.md @@ -52,6 +52,7 @@ z-[9999] /* Critical system dialogs (feedback, errors) */ ### Common patterns #### Modals and dialogs + ```tsx // Standard dialog
@@ -67,21 +68,19 @@ z-[9999] /* Critical system dialogs (feedback, errors) */ ``` #### Dropdown menus + ```tsx
-
- {/* Dropdown content */} -
+
{/* Dropdown content */}
``` #### Fixed position elements + ```tsx // Toast notifications -
- {/* Toast content */} -
+
{/* Toast content */}
``` ### Debugging z-index issues @@ -96,6 +95,7 @@ If you encounter layering issues: ### Future considerations As the application grows, we may need to: + - Add more granular levels between existing values - Create component-specific z-index variables -- Implement a z-index management system for complex nested components \ No newline at end of file +- Implement a z-index management system for complex nested components diff --git a/apps/v1/client/Z_INDEX_GUIDELINES.md b/apps/v1/client/Z_INDEX_GUIDELINES.md index c12fecf4..230b0486 100644 --- a/apps/v1/client/Z_INDEX_GUIDELINES.md +++ b/apps/v1/client/Z_INDEX_GUIDELINES.md @@ -44,7 +44,7 @@ When z-index IS needed, use this consistent scale: - `z-10` - Sticky elements (headers, footers) -- `z-20` - Floating UI (tooltips, popovers) +- `z-20` - Floating UI (tooltips, popovers) - `z-30` - Overlays (dropdown menus) - `z-40` - Modal backdrops - `z-50` - Modal content @@ -64,4 +64,4 @@ If content appears behind something it shouldn't: 3. Look for parent elements creating new stacking contexts 4. Use browser DevTools to inspect computed z-index values -Remember: Most layout issues can be solved without z-index through proper DOM ordering and positioning. \ No newline at end of file +Remember: Most layout issues can be solved without z-index through proper DOM ordering and positioning. diff --git a/apps/v1/client/e2e/breadcrumb-navigation.spec.ts b/apps/v1/client/e2e/breadcrumb-navigation.spec.ts index c57d4e0b..a65d91b2 100644 --- a/apps/v1/client/e2e/breadcrumb-navigation.spec.ts +++ b/apps/v1/client/e2e/breadcrumb-navigation.spec.ts @@ -3,11 +3,11 @@ import { test, expect, setupWorkspaceInBrowser } from './test-setup'; test.describe('Breadcrumb Navigation', () => { test('should navigate through breadcrumbs correctly', async ({ page, testWorkspace }) => { await setupWorkspaceInBrowser(page, testWorkspace); - + // Step 1: Start at Projects page - should have no breadcrumb // The setup already waits for project-card, so just take screenshot await page.screenshot({ path: 'test-results/breadcrumb-1-projects-page.png' }); - + // Check that no breadcrumb is visible on Projects page const breadcrumbLocator = page.locator('nav[aria-label="Breadcrumb"]'); const breadcrumbCount = await breadcrumbLocator.count(); @@ -15,29 +15,29 @@ test.describe('Breadcrumb Navigation', () => { const breadcrumbText = await breadcrumbLocator.first().textContent(); expect(breadcrumbText?.trim()).toBeFalsy(); // Should be empty or not visible } - + // Step 2: Navigate to project detail page // Look for the test project card - it should have "Test Project" text const projectCards = page.locator('[data-testid="project-card"]'); const projectCard = projectCards.first(); // In test setup, we only have one project await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); - + // Wait for navigation to complete - look for repo cards await page.waitForURL('**/projects/**'); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Wait a bit for animations to complete await page.waitForTimeout(100); - + // Check breadcrumb shows: Projects > test-project await expect(breadcrumbLocator.first()).toBeVisible({ timeout: 5000 }); await page.screenshot({ path: 'test-results/breadcrumb-2-project-detail.png' }); - + const projectBreadcrumbText = await breadcrumbLocator.first().textContent(); expect(projectBreadcrumbText).toContain('Projects'); expect(projectBreadcrumbText).toContain('test-project'); - + // Step 3: Navigate to Claude Code // First dismiss any toasts that might be blocking const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); @@ -45,29 +45,29 @@ test.describe('Breadcrumb Navigation', () => { if (toastCount > 0) { // Try to click the close button if available, or wait for toast to disappear const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } // Wait a bit for toast to disappear await page.waitForTimeout(1000); } - + const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 5000 }); const repoName = await claudeCodeButton.getAttribute('data-repo-name'); await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); - + // Wait a bit for animations to complete await page.waitForTimeout(100); - + // Wait for breadcrumb to update with Claude Code await expect(breadcrumbLocator.first()).toContainText('Claude Code', { timeout: 5000 }); await page.screenshot({ path: 'test-results/breadcrumb-3-claude-code.png' }); - + // Check breadcrumb shows: test-project > [repo-name] > Claude Code const claudeBreadcrumbText = await breadcrumbLocator.first().textContent(); expect(claudeBreadcrumbText).toContain('test-project'); @@ -75,39 +75,39 @@ test.describe('Breadcrumb Navigation', () => { if (repoName) { expect(claudeBreadcrumbText).toContain(repoName); } - + // Step 4: Navigate back to project detail await page.goBack(); await page.waitForURL('**/projects/**'); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Wait a bit for animations to complete await page.waitForTimeout(100); - + // Verify breadcrumb reverts correctly await expect(breadcrumbLocator.first()).not.toContainText('Claude Code', { timeout: 5000 }); await page.screenshot({ path: 'test-results/breadcrumb-4-back-to-project.png' }); - + const backBreadcrumbText = await breadcrumbLocator.first().textContent(); expect(backBreadcrumbText).toContain('Projects'); expect(backBreadcrumbText).toContain('test-project'); expect(backBreadcrumbText).not.toContain('Claude Code'); - + // Step 5: Navigate back to Projects page await page.goBack(); await page.waitForURL('**/projects'); await page.waitForSelector('[data-testid="project-card"]', { timeout: 5000 }); - + // Wait a bit for animations to complete await page.waitForTimeout(100); - + // Check that breadcrumb is cleared on Projects page await page.screenshot({ path: 'test-results/breadcrumb-5-back-to-projects.png' }); - + const finalBreadcrumbCount = await breadcrumbLocator.count(); if (finalBreadcrumbCount > 0) { const finalBreadcrumbText = await breadcrumbLocator.first().textContent(); expect(finalBreadcrumbText?.trim()).toBeFalsy(); // Should be empty } }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/claude-code-mount-fix.spec.ts b/apps/v1/client/e2e/claude-code-mount-fix.spec.ts index b8e61920..d3f1ea70 100644 --- a/apps/v1/client/e2e/claude-code-mount-fix.spec.ts +++ b/apps/v1/client/e2e/claude-code-mount-fix.spec.ts @@ -1,104 +1,115 @@ import { test, expect, setupWorkspaceInBrowser } from './test-setup'; test.describe('Claude Code Mount Fix Validation', () => { - test('should properly handle mount state when setting up SSE connection', async ({ page, testWorkspace }) => { + test('should properly handle mount state when setting up SSE connection', async ({ + page, + testWorkspace, + }) => { const consoleLogs: string[] = []; - + // Capture console logs page.on('console', (msg) => { consoleLogs.push(msg.text()); }); - + // Set up workspace and navigate to Claude Code await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const testProject = page.locator('[data-testid="project-card"]').first(); await expect(testProject).toBeVisible({ timeout: 10000 }); await testProject.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any panels or toasts that might be blocking const themeSwitcher = page.locator('text="Theme Switcher"'); - if (await themeSwitcher.count() > 0) { + if ((await themeSwitcher.count()) > 0) { // Click somewhere else to close it await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(500); } - + const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + // Clear logs before the critical action consoleLogs.length = 0; await claudeCodeButton.click(); - + // Wait for component to initialize await expect(page.locator('text=Claude Code Session')).toBeVisible({ timeout: 30000 }); - + // Wait a bit to collect all logs await page.waitForTimeout(2000); - + // Check for the specific error that was fixed - const hasUnmountError = consoleLogs.some(log => + const hasUnmountError = consoleLogs.some((log) => log.includes('Component unmounted, skipping SSE setup') ); - + // Check for successful SSE setup - const hasSuccessfulSetup = consoleLogs.some(log => + const hasSuccessfulSetup = consoleLogs.some((log) => log.includes('Setting up delayed SSE connection') ); - + // Check for mount/unmount sequence - const mountLogs = consoleLogs.filter(log => - log.includes('MOUNTED') || log.includes('UNMOUNTING') + const mountLogs = consoleLogs.filter( + (log) => log.includes('MOUNTED') || log.includes('UNMOUNTING') ); - + console.log('Mount/Unmount sequence:', mountLogs); - + // Assertions expect(hasUnmountError).toBe(false); // The bug should not occur expect(hasSuccessfulSetup).toBe(true); // SSE should be set up successfully - + // The component should not unmount within the 500ms delay const unmountDuringDelay = consoleLogs.some((log, index) => { if (log.includes('Scheduling SSE connection setup with delay')) { // Check if unmount happens within next few logs const nextLogs = consoleLogs.slice(index, index + 10); - return nextLogs.some(l => l.includes('UNMOUNTING')); + return nextLogs.some((l) => l.includes('UNMOUNTING')); } return false; }); - + expect(unmountDuringDelay).toBe(false); // Component should stay mounted during delay - + // Wait for greeting message to confirm full functionality let greetingFound = false; const maxWaitTime = 15000; const startTime = Date.now(); - - while (!greetingFound && (Date.now() - startTime) < maxWaitTime) { + + while (!greetingFound && Date.now() - startTime < maxWaitTime) { const bodyText = await page.textContent('body'); - if (bodyText && (bodyText.includes('Hello') || bodyText.includes('Hi') || bodyText.includes('Hey') || bodyText.includes('Welcome') || bodyText.includes('help you') || bodyText.includes('Great to see you'))) { + if ( + bodyText && + (bodyText.includes('Hello') || + bodyText.includes('Hi') || + bodyText.includes('Hey') || + bodyText.includes('Welcome') || + bodyText.includes('help you') || + bodyText.includes('Great to see you')) + ) { greetingFound = true; break; } await page.waitForTimeout(500); } - + // For test workspaces, we might not get a full greeting, so just check that we got some content expect(greetingFound).toBe(true); // Should have some content - + console.log('✅ All assertions passed! The mount fix is working correctly.'); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/claude-code-mount-issue.spec.ts b/apps/v1/client/e2e/claude-code-mount-issue.spec.ts index f9372059..bbeffd73 100644 --- a/apps/v1/client/e2e/claude-code-mount-issue.spec.ts +++ b/apps/v1/client/e2e/claude-code-mount-issue.spec.ts @@ -7,20 +7,23 @@ import { promisify } from 'util'; const execAsync = promisify(exec); test.describe('Claude Code Mount/Unmount Issue', () => { - test('should capture console logs when navigating to Claude Code', async ({ page, testWorkspace }) => { + test('should capture console logs when navigating to Claude Code', async ({ + page, + testWorkspace, + }) => { // Clear any existing logs const logPath = path.join(process.cwd(), 'e2e-console-logs.txt'); await fs.writeFile(logPath, ''); - + // Array to capture console logs const consoleLogs: string[] = []; - + // Listen to console events page.on('console', (msg) => { const text = `[${msg.type()}] ${msg.text()}`; consoleLogs.push(text); }); - + // Clear session folder (if it exists) const sessionPath = path.join(process.cwd(), 'server/sessions'); try { @@ -29,126 +32,129 @@ test.describe('Claude Code Mount/Unmount Issue', () => { } catch (error) { // Ignore if folder doesn't exist } - + console.log('Starting test: setting up workspace...'); - + // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + console.log('Workspace setup complete, looking for test project...'); - + // Look for test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); - + // Click on the project await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + console.log('Project detail page loaded, looking for Claude Code button...'); - + // Look for Claude Code button and click it const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any panels or toasts that might be blocking const themeSwitcher = page.locator('text="Theme Switcher"'); - if (await themeSwitcher.count() > 0) { + if ((await themeSwitcher.count()) > 0) { // Click somewhere else to close it await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(500); } - + const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + // Clear logs right before clicking to focus on the mount/unmount issue consoleLogs.length = 0; consoleLogs.push('=== CLAUDE CODE BUTTON CLICKED ==='); - + await claudeCodeButton.click(); - + console.log('Claude Code button clicked, waiting for UI...'); - + // Wait for Claude Code UI to appear await expect(page.locator('text=Claude Code Session')).toBeVisible({ timeout: 30000 }); - + console.log('Claude Code UI visible, waiting for greeting...'); - + // Wait a bit more to capture all mount/unmount cycles and greeting await page.waitForTimeout(10000); - + // Check if chat bubble shows progress or message const chatContent = page.locator('.flex-1.overflow-auto'); - const hasContent = await chatContent.locator('div').count() > 0; - + const hasContent = (await chatContent.locator('div').count()) > 0; + console.log('Chat has content:', hasContent); - + // Write all console logs to file const logContent = consoleLogs.join('\n'); await fs.writeFile(logPath, logContent); - + console.log(`Console logs written to: ${logPath}`); - + // Also capture server logs const serverLogsPath = path.join(process.cwd(), 'server/logs'); const claudeLogPath = path.join(serverLogsPath, 'claude-messages.log'); const eventsLogPath = path.join(serverLogsPath, 'events.log'); - + try { const claudeLog = await fs.readFile(claudeLogPath, 'utf-8'); const eventsLog = await fs.readFile(eventsLogPath, 'utf-8'); - + // Get last 50 lines of each log const claudeLines = claudeLog.split('\n').slice(-50).join('\n'); const eventsLines = eventsLog.split('\n').slice(-50).join('\n'); - + await fs.writeFile( path.join(process.cwd(), 'e2e-server-logs.txt'), `=== CLAUDE MESSAGES LOG (last 50 lines) ===\n${claudeLines}\n\n=== EVENTS LOG (last 50 lines) ===\n${eventsLines}` ); - + console.log('Server logs captured to: e2e-server-logs.txt'); } catch (error) { console.error('Failed to capture server logs:', error); } - + // Analyze the logs for mount/unmount patterns - const mountPatterns = consoleLogs.filter(log => - log.includes('[ClaudeCodeProvider] MOUNTED') || - log.includes('[ClaudeCodeProvider] UNMOUNTING') || - log.includes('[ClaudeCode] Component rendering') || - log.includes('SSE connection') || - log.includes('message-start event') || - log.includes('message-chunk event') || - log.includes('Message not found for chunk') + const mountPatterns = consoleLogs.filter( + (log) => + log.includes('[ClaudeCodeProvider] MOUNTED') || + log.includes('[ClaudeCodeProvider] UNMOUNTING') || + log.includes('[ClaudeCode] Component rendering') || + log.includes('SSE connection') || + log.includes('message-start event') || + log.includes('message-chunk event') || + log.includes('Message not found for chunk') ); - + console.log('\n=== ANALYSIS ==='); console.log('Mount/Unmount patterns found:'); - mountPatterns.forEach(log => console.log(log)); - + mountPatterns.forEach((log) => console.log(log)); + // Check for the specific issue pattern - const hasMultipleMounts = mountPatterns.filter(log => log.includes('MOUNTED')).length > 1; - const hasMessageNotFound = consoleLogs.some(log => log.includes('Message not found for chunk')); - + const hasMultipleMounts = mountPatterns.filter((log) => log.includes('MOUNTED')).length > 1; + const hasMessageNotFound = consoleLogs.some((log) => + log.includes('Message not found for chunk') + ); + if (hasMultipleMounts) { console.log('\n⚠️ ISSUE DETECTED: Multiple mount cycles detected!'); } - + if (hasMessageNotFound) { console.log('\n⚠️ ISSUE DETECTED: Message not found for chunk error!'); } - + // The test should complete even if issues are found // This allows us to analyze the logs expect(true).toBe(true); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/claude-code-tool-execution.spec.ts b/apps/v1/client/e2e/claude-code-tool-execution.spec.ts index 27d25e66..68a3fb80 100644 --- a/apps/v1/client/e2e/claude-code-tool-execution.spec.ts +++ b/apps/v1/client/e2e/claude-code-tool-execution.spec.ts @@ -1,68 +1,71 @@ import { test, expect } from './test-setup'; test.describe('Claude Code Tool Execution Display', () => { - test('should display tool executions correctly without false failures', async ({ page, testWorkspace }) => { + test('should display tool executions correctly without false failures', async ({ + page, + testWorkspace, + }) => { console.log('Test workspace:', testWorkspace); - + // Navigate to the test project await page.click('[data-testid="project-card"]'); await page.waitForURL('**/projects/*'); - + // Enter Claude Code for a repo await page.click('[data-testid="claude-code-button"]'); await page.waitForURL('**/claude-code/*'); - + // Wait for Claude Code interface to load await page.waitForSelector('[data-testid="claude-code-input"]', { timeout: 10000 }); - + // Wait for greeting message to complete await page.waitForSelector('[data-testid="message-complete"]', { timeout: 30000 }); - + // Type a message that will trigger tool use const input = page.locator('[data-testid="claude-code-input"]'); await input.fill('Read the README.md file and summarize it'); - + // Press Enter to send the message await input.press('Enter'); - + // Wait for the response to start await page.waitForSelector('[data-testid="message-start"]', { timeout: 10000 }); - + // Check for tool execution display const toolExecution = page.locator('[data-testid="tool-execution"]').first(); await expect(toolExecution).toBeVisible({ timeout: 5000 }); - + // Verify the tool execution shows correct information const toolName = toolExecution.locator('[data-testid="tool-name"]'); await expect(toolName).toContainText('Read'); - + // Check that the tool status is not showing as error initially const toolStatus = toolExecution.locator('[data-testid="tool-status"]'); - + // Tool should show as pending or completed, not failed const statusText = await toolStatus.textContent(); expect(statusText).not.toContain('Failed'); expect(statusText).not.toContain('Error'); - + // The status should be either "Pending..." or show success expect(statusText).toMatch(/Pending\.\.\.|Success|Completed/i); - + // Wait for the message to complete await page.waitForSelector('[data-testid="message-complete"]', { timeout: 30000 }); - + // Verify the summary content was returned const messageContent = page.locator('[data-testid="message-content"]').last(); await expect(messageContent).toContainText('Hello World Project'); - + // Final check: tool execution should not show as failed const finalToolStatus = await toolStatus.textContent(); expect(finalToolStatus).not.toContain('Failed'); expect(finalToolStatus).not.toContain('Tool execution failed'); - + // Take a screenshot for debugging - await page.screenshot({ + await page.screenshot({ path: 'claude-code-tool-execution.png', - fullPage: true + fullPage: true, }); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/claude-code-validation.spec.ts b/apps/v1/client/e2e/claude-code-validation.spec.ts index 8b4e2b49..602ba35c 100644 --- a/apps/v1/client/e2e/claude-code-validation.spec.ts +++ b/apps/v1/client/e2e/claude-code-validation.spec.ts @@ -3,17 +3,20 @@ import fs from 'fs/promises'; import path from 'path'; test.describe('Claude Code Chat Validation', () => { - test('should successfully navigate to Claude Code and display greeting message', async ({ page, testWorkspace }) => { + test('should successfully navigate to Claude Code and display greeting message', async ({ + page, + testWorkspace, + }) => { const testStartTime = Date.now(); const consoleLogs: string[] = []; const networkRequests: string[] = []; - + // Capture console logs page.on('console', (msg) => { const timestamp = Date.now() - testStartTime; consoleLogs.push(`[${timestamp}ms] [${msg.type()}] ${msg.text()}`); }); - + // Capture network requests page.on('request', (request) => { const timestamp = Date.now() - testStartTime; @@ -21,7 +24,7 @@ test.describe('Claude Code Chat Validation', () => { networkRequests.push(`[${timestamp}ms] ${request.method()} ${request.url()}`); } }); - + // Capture network responses page.on('response', (response) => { const timestamp = Date.now() - testStartTime; @@ -29,87 +32,106 @@ test.describe('Claude Code Chat Validation', () => { networkRequests.push(`[${timestamp}ms] RESPONSE ${response.status()} ${response.url()}`); } }); - + console.log('🚀 Starting Claude Code validation test...'); - + // Step 1: Set up workspace and navigate to projects page console.log('📍 Step 1: Setting up workspace'); await setupWorkspaceInBrowser(page, testWorkspace); console.log('📍 Step 2: Workspace setup complete, now on projects page'); - + // Step 3: Find and click test project console.log('📍 Step 3: Looking for test project'); const testProject = page.locator('[data-testid="project-card"]').first(); await expect(testProject).toBeVisible({ timeout: 10000 }); await testProject.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Step 4: Click Claude Code button console.log('📍 Step 4: Clicking Claude Code button'); const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any panels or toasts that might be blocking const themeSwitcher = page.locator('text="Theme Switcher"'); - if (await themeSwitcher.count() > 0) { + if ((await themeSwitcher.count()) > 0) { // Click somewhere else to close it await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(500); } - + const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + // Clear logs to focus on the critical part consoleLogs.length = 0; networkRequests.length = 0; consoleLogs.push(`[0ms] === CLAUDE CODE BUTTON CLICKED ===`); - + await claudeCodeButton.click(); - + // Step 5: Wait for Claude Code UI to appear console.log('📍 Step 5: Waiting for Claude Code UI'); await expect(page.locator('text=Claude Code Session')).toBeVisible({ timeout: 30000 }); - + // Step 6: Wait for greeting message or timeout console.log('📍 Step 6: Waiting for greeting message'); let greetingFound = false; let timeoutReached = false; - + // Wait up to 15 seconds for greeting message const greetingWaitStart = Date.now(); while (!greetingFound && !timeoutReached) { try { // Look for greeting message content - const messageElements = await page.locator('.claude-message, [role="message"], .message-content, .chat-message').all(); - + const messageElements = await page + .locator('.claude-message, [role="message"], .message-content, .chat-message') + .all(); + for (const element of messageElements) { const text = await element.textContent(); - if (text && (text.includes('Hello') || text.includes('Hi') || text.includes('Hey') || text.includes('Welcome') || text.includes('ready to') || text.includes('help you') || text.includes('Great to see you'))) { + if ( + text && + (text.includes('Hello') || + text.includes('Hi') || + text.includes('Hey') || + text.includes('Welcome') || + text.includes('ready to') || + text.includes('help you') || + text.includes('Great to see you')) + ) { greetingFound = true; console.log('✅ Greeting message found:', text.substring(0, 100)); break; } } - + // Also check for any text content that looks like a greeting const bodyText = await page.textContent('body'); - if (bodyText && (bodyText.includes('Hello') || bodyText.includes('Hi') || bodyText.includes('Hey') || bodyText.includes('Welcome') || bodyText.includes('help you') || bodyText.includes('Great to see you'))) { + if ( + bodyText && + (bodyText.includes('Hello') || + bodyText.includes('Hi') || + bodyText.includes('Hey') || + bodyText.includes('Welcome') || + bodyText.includes('help you') || + bodyText.includes('Great to see you')) + ) { greetingFound = true; console.log('✅ Greeting text found in page body'); } - + if (Date.now() - greetingWaitStart > 15000) { timeoutReached = true; } - + if (!greetingFound && !timeoutReached) { await page.waitForTimeout(500); } @@ -118,70 +140,80 @@ test.describe('Claude Code Chat Validation', () => { break; } } - + // Step 7: Analyze the results console.log('📍 Step 7: Analyzing results'); - + // Save console logs const logContent = consoleLogs.join('\n'); const networkContent = networkRequests.join('\n'); const combinedLogs = `=== CONSOLE LOGS ===\n${logContent}\n\n=== NETWORK REQUESTS ===\n${networkContent}`; - + await fs.writeFile('e2e-test-logs.txt', combinedLogs); console.log('📄 Logs saved to e2e-test-logs.txt'); - + // Take a screenshot for debugging await page.screenshot({ path: 'claude-code-state.png', fullPage: true }); console.log('📸 Screenshot saved to claude-code-state.png'); - + // Analyze console logs for mount/unmount patterns - const mountLogs = consoleLogs.filter(log => - log.includes('ClaudeCodeProvider') || - log.includes('SSE connection') || - log.includes('message-start') || - log.includes('message-chunk') + const mountLogs = consoleLogs.filter( + (log) => + log.includes('ClaudeCodeProvider') || + log.includes('SSE connection') || + log.includes('message-start') || + log.includes('message-chunk') ); - + console.log('\n🔍 Mount/Unmount Analysis:'); - mountLogs.forEach(log => console.log(log)); - + mountLogs.forEach((log) => console.log(log)); + // Check for the specific bug we fixed - const hasUnmountError = consoleLogs.some(log => + const hasUnmountError = consoleLogs.some((log) => log.includes('Component unmounted, skipping SSE setup') ); - + if (hasUnmountError) { console.log('\n❌ BUG DETECTED: Component unmounted before SSE setup!'); console.log('This is the exact issue that was causing chat messages not to appear.'); } - + // Check server logs try { const serverLogsPath = path.join(process.cwd(), 'server', 'logs'); - const claudeLog = await fs.readFile(path.join(serverLogsPath, 'claude-messages.log'), 'utf-8'); + const claudeLog = await fs.readFile( + path.join(serverLogsPath, 'claude-messages.log'), + 'utf-8' + ); const eventsLog = await fs.readFile(path.join(serverLogsPath, 'events.log'), 'utf-8'); - + const recentClaudeLines = claudeLog.split('\n').slice(-30); const recentEventLines = eventsLog.split('\n').slice(-30); - - await fs.writeFile('server-logs-analysis.txt', + + await fs.writeFile( + 'server-logs-analysis.txt', `=== RECENT CLAUDE MESSAGES ===\n${recentClaudeLines.join('\n')}\n\n=== RECENT EVENTS ===\n${recentEventLines.join('\n')}` ); - + console.log('📄 Server logs saved to server-logs-analysis.txt'); - + // Look for the problematic pattern - const hasNoActiveConnections = recentClaudeLines.some(line => line.includes('No active connections to send greeting to')); - const hasDisconnects = recentEventLines.some(line => line.includes('CLAUDE_SSE_DISCONNECTED')); - + const hasNoActiveConnections = recentClaudeLines.some((line) => + line.includes('No active connections to send greeting to') + ); + const hasDisconnects = recentEventLines.some((line) => + line.includes('CLAUDE_SSE_DISCONNECTED') + ); + if (hasNoActiveConnections && hasDisconnects) { - console.log('\n❌ ISSUE CONFIRMED: Server logs show SSE disconnections and no active connections!'); + console.log( + '\n❌ ISSUE CONFIRMED: Server logs show SSE disconnections and no active connections!' + ); } - } catch (error) { console.log('⚠️ Could not read server logs:', error); } - + // Report results if (greetingFound) { console.log('\n🎉 SUCCESS: Greeting message was displayed!'); @@ -189,15 +221,15 @@ test.describe('Claude Code Chat Validation', () => { } else { console.log('\n❌ FAILURE: Greeting message was NOT displayed'); console.log('💡 Check the logs for debugging information'); - + // Additional debugging const pageContent = await page.content(); await fs.writeFile('page-content-debug.html', pageContent); console.log('🔍 Full page content saved to page-content-debug.html'); } - + // The test assertions expect(hasUnmountError).toBe(false); // Should not have unmount error - expect(greetingFound).toBe(true); // Should have greeting message + expect(greetingFound).toBe(true); // Should have greeting message }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/feedback-feature.spec.ts b/apps/v1/client/e2e/feedback-feature.spec.ts index 545c75fb..564f6fee 100644 --- a/apps/v1/client/e2e/feedback-feature.spec.ts +++ b/apps/v1/client/e2e/feedback-feature.spec.ts @@ -6,34 +6,37 @@ import fs from 'fs'; async function setupClaudeCodeSession(page: any) { // Navigate to dashboard await page.goto('http://localhost:5173'); - + // Create a new project await page.click('text=New Project'); await page.fill('input[placeholder="Enter project name"]', 'Test Feedback Project'); - await page.fill('textarea[placeholder="Enter project description"]', 'Project for testing feedback feature'); + await page.fill( + 'textarea[placeholder="Enter project description"]', + 'Project for testing feedback feature' + ); await page.click('button:has-text("Create Project")'); - + // Wait for project creation await page.waitForURL(/\/projects\/.+/); - + // Navigate to Claude Code await page.click('text=Claude Code'); await page.click('button:has-text("hello-world-1")'); - + // Wait for Claude Code to load await page.waitForSelector('[data-testid="message-list"]'); await page.waitForSelector('[data-testid="message-complete"]', { timeout: 30000 }); - + return page.url(); } test.describe('Feedback Feature', () => { test('should show feedback link on chat messages', async ({ page }) => { await setupClaudeCodeSession(page); - + // Find the first complete message const message = await page.locator('[data-testid="message-complete"]').first(); - + // Check for feedback link const feedbackLink = await message.locator('text=Leave feedback'); await expect(feedbackLink).toBeVisible(); @@ -41,10 +44,10 @@ test.describe('Feedback Feature', () => { test('should open feedback dialog when clicking feedback link', async ({ page }) => { await setupClaudeCodeSession(page); - + // Click feedback link on first message await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - + // Check dialog appears await expect(page.locator('h2:has-text("Leave feedback")')).toBeVisible(); await expect(page.locator('text=Describe your feedback')).toBeVisible(); @@ -53,19 +56,19 @@ test.describe('Feedback Feature', () => { test('should validate required fields in feedback dialog', async ({ page }) => { await setupClaudeCodeSession(page); - + // Open feedback dialog await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - + // Try to submit without filling the textarea await page.click('button:has-text("Submit feedback")'); - + // Should show validation error await expect(page.locator('text=Please provide your feedback')).toBeVisible(); - + // Fill the textarea await page.fill('textarea', 'Test feedback content'); - + // Should be able to submit now const submitButton = page.locator('button:has-text("Submit feedback")'); await expect(submitButton).toBeEnabled(); @@ -73,19 +76,19 @@ test.describe('Feedback Feature', () => { test('should capture screenshot when feedback is initiated', async ({ page }) => { await setupClaudeCodeSession(page); - + // Intercept screenshot upload - const screenshotPromise = page.waitForRequest(req => - req.url().includes('/api/feedback/screenshot') && req.method() === 'POST' + const screenshotPromise = page.waitForRequest( + (req) => req.url().includes('/api/feedback/screenshot') && req.method() === 'POST' ); - + // Open feedback dialog (triggers screenshot) await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - + // Wait for screenshot request const screenshotReq = await screenshotPromise; const postData = screenshotReq.postDataJSON(); - + // Verify screenshot data expect(postData).toHaveProperty('imageData'); expect(postData.imageData).toMatch(/^data:image\/png;base64,/); @@ -95,25 +98,28 @@ test.describe('Feedback Feature', () => { test('should submit feedback with all required data', async ({ page }) => { await setupClaudeCodeSession(page); - + // Intercept feedback submission - const feedbackPromise = page.waitForRequest(req => - req.url().includes('/api/feedback/submit') && req.method() === 'POST' + const feedbackPromise = page.waitForRequest( + (req) => req.url().includes('/api/feedback/submit') && req.method() === 'POST' ); - + // Open feedback dialog await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - + // Fill feedback form - await page.fill('textarea', 'What happened: Claude gave an unrelated response\nWhat I expected: Claude should understand the context'); - + await page.fill( + 'textarea', + 'What happened: Claude gave an unrelated response\nWhat I expected: Claude should understand the context' + ); + // Submit feedback await page.click('button:has-text("Submit feedback")'); - + // Wait for submission const feedbackReq = await feedbackPromise; const feedbackData = feedbackReq.postDataJSON(); - + // Verify feedback data structure - the component should parse the input expect(feedbackData).toHaveProperty('expectedBehavior'); expect(feedbackData).toHaveProperty('actualBehavior'); @@ -127,7 +133,7 @@ test.describe('Feedback Feature', () => { expect(feedbackData).toHaveProperty('mode'); expect(feedbackData).toHaveProperty('isConnected'); expect(feedbackData).toHaveProperty('screenshotPath'); - + // Messages should include at least the greeting expect(feedbackData.messages).toBeInstanceOf(Array); expect(feedbackData.messages.length).toBeGreaterThan(0); @@ -135,27 +141,27 @@ test.describe('Feedback Feature', () => { test('should show success dialog after feedback submission', async ({ page }) => { await setupClaudeCodeSession(page); - + // Mock successful API responses - await page.route('**/api/feedback/screenshot', async route => { + await page.route('**/api/feedback/screenshot', async (route) => { await route.fulfill({ status: 200, - json: { success: true, path: 'feedback/screenshots/test.png' } + json: { success: true, path: 'feedback/screenshots/test.png' }, }); }); - - await page.route('**/api/feedback/submit', async route => { + + await page.route('**/api/feedback/submit', async (route) => { await route.fulfill({ status: 200, - json: { success: true, feedbackId: 'fb-2024-01-15-abc123' } + json: { success: true, feedbackId: 'fb-2024-01-15-abc123' }, }); }); - + // Submit feedback await page.click('[data-testid="message-complete"] >> text=Leave feedback'); await page.fill('textarea', 'What happened: Test actual\nWhat I expected: Test expectation'); await page.click('button:has-text("Submit feedback")'); - + // Check success dialog await expect(page.locator('h2:has-text("Feedback Submitted")')).toBeVisible(); await expect(page.locator('text=Thank you for your feedback!')).toBeVisible(); @@ -164,25 +170,28 @@ test.describe('Feedback Feature', () => { test('should handle session-level feedback', async ({ page }) => { await setupClaudeCodeSession(page); - + // Intercept feedback submission - const feedbackPromise = page.waitForRequest(req => - req.url().includes('/api/feedback/submit') && req.method() === 'POST' + const feedbackPromise = page.waitForRequest( + (req) => req.url().includes('/api/feedback/submit') && req.method() === 'POST' ); - + // Click session feedback button await page.click('button:has-text("Leave feedback"):near(button:has-text("Close Session"))'); - + // Fill feedback form - await page.fill('textarea', 'What happened: Session had issues\nWhat I expected: Session should work properly'); - + await page.fill( + 'textarea', + 'What happened: Session had issues\nWhat I expected: Session should work properly' + ); + // Submit feedback await page.click('button:has-text("Submit feedback")'); - + // Wait for submission const feedbackReq = await feedbackPromise; const feedbackData = feedbackReq.postDataJSON(); - + // Verify no specific messageId for session feedback expect(feedbackData).toHaveProperty('messageId', undefined); expect(feedbackData).toHaveProperty('sessionId'); @@ -191,15 +200,17 @@ test.describe('Feedback Feature', () => { test('should show feedback link on tool executions', async ({ page }) => { await setupClaudeCodeSession(page); - + // Send a message to trigger tool execution await page.fill('[data-testid="claude-input"]', 'Please read the README file'); await page.keyboard.press('Enter'); - + // Wait for tool execution to appear await page.waitForSelector('[data-testid="tool-execution"]', { timeout: 30000 }); - await page.waitForSelector('[data-testid="tool-status"]:has-text("Complete")', { timeout: 30000 }); - + await page.waitForSelector('[data-testid="tool-status"]:has-text("Complete")', { + timeout: 30000, + }); + // Check for feedback link on tool execution const toolExecution = await page.locator('[data-testid="tool-execution"]').first(); const feedbackLink = await toolExecution.locator('text=Leave feedback'); @@ -208,65 +219,70 @@ test.describe('Feedback Feature', () => { test('should handle screenshot capture failure gracefully', async ({ page }) => { await setupClaudeCodeSession(page); - + // Mock screenshot failure await page.addInitScript(() => { // Override dom-to-image to fail (window as any).domtoimage = { - toPng: () => Promise.reject(new Error('Screenshot capture failed')) + toPng: () => Promise.reject(new Error('Screenshot capture failed')), }; }); - + // Mock successful submit (even without screenshot) - await page.route('**/api/feedback/submit', async route => { + await page.route('**/api/feedback/submit', async (route) => { await route.fulfill({ status: 200, - json: { success: true, feedbackId: 'fb-2024-01-15-no-screenshot' } + json: { success: true, feedbackId: 'fb-2024-01-15-no-screenshot' }, }); }); - + // Submit feedback await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - await page.fill('textarea', 'What happened: Screenshot failed but feedback works\nWhat I expected: Test without screenshot'); + await page.fill( + 'textarea', + 'What happened: Screenshot failed but feedback works\nWhat I expected: Test without screenshot' + ); await page.click('button:has-text("Submit feedback")'); - + // Should still succeed await expect(page.locator('h2:has-text("Feedback Submitted")')).toBeVisible(); }); test('should include correct message context in feedback', async ({ page }) => { await setupClaudeCodeSession(page); - + // Send a user message await page.fill('[data-testid="claude-input"]', 'Test message for feedback'); await page.keyboard.press('Enter'); - + // Wait for response - await page.waitForSelector('[data-testid="message-complete"]:nth-of-type(3)', { timeout: 30000 }); - + await page.waitForSelector('[data-testid="message-complete"]:nth-of-type(3)', { + timeout: 30000, + }); + // Intercept feedback submission - const feedbackPromise = page.waitForRequest(req => - req.url().includes('/api/feedback/submit') && req.method() === 'POST' + const feedbackPromise = page.waitForRequest( + (req) => req.url().includes('/api/feedback/submit') && req.method() === 'POST' ); - + // Click feedback on the user's message const userMessage = await page.locator('[data-testid="message-complete"]').nth(1); await userMessage.locator('text=Leave feedback').click(); - + // Submit feedback await page.fill('textarea', 'Test feedback for message context'); await page.click('button:has-text("Submit feedback")'); - + // Check feedback data const feedbackReq = await feedbackPromise; const feedbackData = feedbackReq.postDataJSON(); - + // Should have at least 3 messages (greeting, user message, response) expect(feedbackData.messages.length).toBeGreaterThanOrEqual(3); - + // Find the user message in the feedback - const userMsgInFeedback = feedbackData.messages.find((m: any) => - m.content === 'Test message for feedback' + const userMsgInFeedback = feedbackData.messages.find( + (m: any) => m.content === 'Test message for feedback' ); expect(userMsgInFeedback).toBeDefined(); expect(feedbackData.messageId).toBe(userMsgInFeedback.id); @@ -278,17 +294,18 @@ test.describe('Feedback Server Storage', () => { // Submit screenshot directly to API const response = await request.post('http://localhost:3000/api/feedback/screenshot', { data: { - imageData: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==', + imageData: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==', sessionId: 'test-session-123', - repoName: 'test-repo' - } + repoName: 'test-repo', + }, }); - + expect(response.ok()).toBeTruthy(); const result = await response.json(); expect(result.success).toBe(true); expect(result.path).toMatch(/^feedback\/screenshots\/test-repo-test-session-123-\d+\.png$/); - + // Verify file exists const screenshotPath = path.join(__dirname, '..', result.path); expect(fs.existsSync(screenshotPath)).toBe(true); @@ -305,33 +322,29 @@ test.describe('Feedback Server Storage', () => { projectId: 'test-project', messageId: 'msg-123', timestamp: new Date().toISOString(), - messages: [ - { id: 'msg-123', role: 'user', content: 'Test message' } - ], + messages: [{ id: 'msg-123', role: 'user', content: 'Test message' }], mode: 'default', isConnected: true, - screenshotPath: 'feedback/screenshots/test.png' - } + screenshotPath: 'feedback/screenshots/test.png', + }, }); - + expect(response.ok()).toBeTruthy(); const result = await response.json(); expect(result.success).toBe(true); expect(result.feedbackId).toMatch(/^fb-\d{4}-\d{2}-\d{2}-[a-z0-9]{6}$/); - + // Verify feedback file exists const reportsDir = path.join(__dirname, '..', 'feedback', 'reports'); const files = fs.readdirSync(reportsDir); - const feedbackFile = files.find(f => f.includes('test-session-456')); + const feedbackFile = files.find((f) => f.includes('test-session-456')); expect(feedbackFile).toBeDefined(); - + // Read and verify content - const content = JSON.parse( - fs.readFileSync(path.join(reportsDir, feedbackFile!), 'utf8') - ); + const content = JSON.parse(fs.readFileSync(path.join(reportsDir, feedbackFile!), 'utf8')); expect(content.feedbackId).toBe(result.feedbackId); expect(content.user.expectedBehavior).toBe('Test expected'); expect(content.user.actualBehavior).toBe('Test actual'); expect(content.serverLogs).toBeDefined(); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/feedback-fixes.spec.ts b/apps/v1/client/e2e/feedback-fixes.spec.ts index 81fed81b..c60de04e 100644 --- a/apps/v1/client/e2e/feedback-fixes.spec.ts +++ b/apps/v1/client/e2e/feedback-fixes.spec.ts @@ -4,38 +4,45 @@ import { test, expect } from '@playwright/test'; async function setupClaudeCodeSession(page: any) { // Navigate to dashboard await page.goto('http://localhost:5173'); - + // Create a new project await page.click('text=New Project'); await page.fill('input[placeholder="Enter project name"]', 'Test Feedback Fixes'); - await page.fill('textarea[placeholder="Enter project description"]', 'Testing feedback dialog fixes'); + await page.fill( + 'textarea[placeholder="Enter project description"]', + 'Testing feedback dialog fixes' + ); await page.click('button:has-text("Create Project")'); - + // Wait for project creation await page.waitForURL(/\/projects\/.+/); - + // Navigate to Claude Code await page.click('text=Claude Code'); await page.click('button:has-text("hello-world-1")'); - + // Wait for Claude Code to load await page.waitForSelector('[data-testid="message-list"]'); await page.waitForSelector('[data-testid="message-complete"]', { timeout: 30000 }); - + return page.url(); } test.describe('Feedback Dialog Fixes', () => { - test('feedback dialog should be centered on window and use portal rendering', async ({ page }) => { + test('feedback dialog should be centered on window and use portal rendering', async ({ + page, + }) => { await setupClaudeCodeSession(page); - + // Open feedback dialog await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - + // Check that dialog is rendered at document.body level (portal) - const dialog = await page.locator('body > div').filter({ has: page.locator('h2:has-text("Leave feedback")') }); + const dialog = await page + .locator('body > div') + .filter({ has: page.locator('h2:has-text("Leave feedback")') }); await expect(dialog).toBeVisible(); - + // Check centering styles const dialogContainer = await dialog.locator('div.fixed.inset-0.z-\\[9999\\]'); await expect(dialogContainer).toHaveCSS('display', 'flex'); @@ -45,46 +52,46 @@ test.describe('Feedback Dialog Fixes', () => { test('feedback dialog should have a single combined textarea', async ({ page }) => { await setupClaudeCodeSession(page); - + // Open feedback dialog await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - + // Should have only one textarea const textareas = await page.locator('textarea'); await expect(textareas).toHaveCount(1); - + // Check placeholder text const textarea = await page.locator('textarea'); const placeholder = await textarea.getAttribute('placeholder'); expect(placeholder).toContain('Describe what happened and what you expected'); - + // Check label await expect(page.locator('label:has-text("Describe your feedback")')).toBeVisible(); }); test('feedback dialog should be draggable by header', async ({ page }) => { await setupClaudeCodeSession(page); - + // Open feedback dialog await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - + // Get initial position const dialog = await page.locator('div.relative.p-4.w-full.max-w-2xl'); const initialBox = await dialog.boundingBox(); expect(initialBox).toBeTruthy(); - + // Find the header (draggable area) const header = await page.locator('h2:has-text("Leave feedback")').locator('..'); - + // Check header has grab cursor await expect(header).toHaveCSS('cursor', 'grab'); - + // Drag the dialog await header.hover(); await page.mouse.down(); await page.mouse.move(initialBox!.x + 100, initialBox!.y + 50); await page.mouse.up(); - + // Check dialog moved const newBox = await dialog.boundingBox(); expect(newBox).toBeTruthy(); @@ -94,26 +101,30 @@ test.describe('Feedback Dialog Fixes', () => { test('suggested responses should appear for plan mode questions', async ({ page }) => { await setupClaudeCodeSession(page); - + // Switch to plan mode await page.click('button[aria-label="Claude mode"]:has-text("Default")'); await page.click('text=Plan'); - + // Send a message that should trigger a plan response await page.fill('[data-testid="claude-input"]', 'Help me implement a new feature'); await page.keyboard.press('Enter'); - + // Wait for assistant response - await page.waitForSelector('[data-testid="message-complete"]:nth-of-type(3)', { timeout: 30000 }); - + await page.waitForSelector('[data-testid="message-complete"]:nth-of-type(3)', { + timeout: 30000, + }); + // Mock an assistant response with plan approval question await page.evaluate(() => { // Find the last assistant message and add suggested responses const messages = document.querySelectorAll('[data-testid="message-complete"]'); - const lastMessage = Array.from(messages).reverse().find(m => - m.querySelector('.text-green-500') // Assistant messages have green avatar - ); - + const lastMessage = Array.from(messages) + .reverse() + .find( + (m) => m.querySelector('.text-green-500') // Assistant messages have green avatar + ); + if (lastMessage) { // Inject a test message that should trigger suggested responses const content = lastMessage.querySelector('.prose'); @@ -122,7 +133,7 @@ test.describe('Feedback Dialog Fixes', () => { } } }); - + // Check for suggested response buttons await expect(page.locator('button:has-text("Yes, proceed with the plan")')).toBeVisible(); await expect(page.locator('button:has-text("No, let me review more")')).toBeVisible(); @@ -131,7 +142,7 @@ test.describe('Feedback Dialog Fixes', () => { test('numbered lists should render with proper formatting', async ({ page }) => { await setupClaudeCodeSession(page); - + // Mock a message with a numbered list await page.evaluate(() => { const messageList = document.querySelector('[data-testid="message-list"]'); @@ -152,16 +163,16 @@ test.describe('Feedback Dialog Fixes', () => { messageList.appendChild(testMessage); } }); - + // Check list formatting const list = await page.locator('ol.list-decimal'); await expect(list).toBeVisible(); await expect(list).toHaveCSS('margin-left', '24px'); // ml-6 = 1.5rem = 24px - + // Check list items const items = await list.locator('li'); await expect(items).toHaveCount(3); - + // Verify numbers are not on separate lines const firstItem = await items.first(); const firstItemText = await firstItem.textContent(); @@ -170,67 +181,75 @@ test.describe('Feedback Dialog Fixes', () => { test('mode should switch from plan to execution when user approves', async ({ page }) => { await setupClaudeCodeSession(page); - + // Switch to plan mode await page.click('button[aria-label="Claude mode"]:has-text("Default")'); await page.click('text=Plan'); - + // Verify we're in plan mode await expect(page.locator('button[aria-label="Claude mode"]:has-text("Plan")')).toBeVisible(); - + // Send approval message await page.fill('[data-testid="claude-input"]', 'Yes, proceed with the implementation'); await page.keyboard.press('Enter'); - + // Mode should switch back to default - await expect(page.locator('button[aria-label="Claude mode"]:has-text("Default")')).toBeVisible(); + await expect( + page.locator('button[aria-label="Claude mode"]:has-text("Default")') + ).toBeVisible(); }); test('feedback dialog should validate single textarea input', async ({ page }) => { await setupClaudeCodeSession(page); - + // Open feedback dialog await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - + // Try to submit without filling the textarea await page.click('button:has-text("Submit feedback")'); - + // Should show validation error await expect(page.locator('text=Please provide your feedback')).toBeVisible(); - + // Fill the textarea - await page.fill('textarea', 'What happened: The dialog was not centered\nWhat I expected: Dialog to be centered on the window'); - + await page.fill( + 'textarea', + 'What happened: The dialog was not centered\nWhat I expected: Dialog to be centered on the window' + ); + // Submit should now work await page.click('button:has-text("Submit feedback")'); - + // Dialog should close (or show success) await expect(page.locator('h2:has-text("Leave feedback")')).not.toBeVisible({ timeout: 5000 }); }); test('feedback should parse combined textarea correctly', async ({ page }) => { await setupClaudeCodeSession(page); - + // Intercept feedback submission - const feedbackPromise = page.waitForRequest(req => - req.url().includes('/api/feedback/submit') && req.method() === 'POST' + const feedbackPromise = page.waitForRequest( + (req) => req.url().includes('/api/feedback/submit') && req.method() === 'POST' ); - + // Open feedback dialog await page.click('[data-testid="message-complete"] >> text=Leave feedback'); - + // Fill with structured feedback - await page.fill('textarea', 'What happened: The button did not appear\nWhat I expected: Button should be visible'); - + await page.fill( + 'textarea', + 'What happened: The button did not appear\nWhat I expected: Button should be visible' + ); + // Submit feedback await page.click('button:has-text("Submit feedback")'); - + // Check the parsed data const feedbackReq = await feedbackPromise; const feedbackData = feedbackReq.postDataJSON(); - + // Should parse the sections correctly expect(feedbackData.actualBehavior).toContain('The button did not appear'); expect(feedbackData.expectedBehavior).toContain('Button should be visible'); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/session-rehydration.spec.ts b/apps/v1/client/e2e/session-rehydration.spec.ts index 71c03128..4438ccfd 100644 --- a/apps/v1/client/e2e/session-rehydration.spec.ts +++ b/apps/v1/client/e2e/session-rehydration.spec.ts @@ -1,120 +1,136 @@ import { test, expect, setupWorkspaceInBrowser } from './test-setup'; test.describe('Session Rehydration', () => { - test('should preserve chat messages when navigating away and back to a session', async ({ page, testWorkspace }) => { + test('should preserve chat messages when navigating away and back to a session', async ({ + page, + testWorkspace, + }) => { // Set up the test workspace in the browser await setupWorkspaceInBrowser(page, testWorkspace); - + // Find and click on the test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); - + // Wait for project detail page to load await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any panels or toasts that might be blocking const themeSwitcher = page.locator('text="Theme Switcher"'); - if (await themeSwitcher.count() > 0) { + if ((await themeSwitcher.count()) > 0) { // Click somewhere else to close it await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(500); } - + const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + await claudeCodeButton.click(); - + // Wait for Claude Code interface to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); - + // Wait for the greeting message to appear and verify it has content const messageList = page.locator('[data-testid="message-list"]'); await expect(messageList).toBeVisible(); - + // Wait for greeting message to be received and displayed - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length > 0 && messages[0].textContent && messages[0].textContent.trim().length > 0; - }, { timeout: 10000 }); - + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return ( + messages.length > 0 && + messages[0].textContent && + messages[0].textContent.trim().length > 0 + ); + }, + { timeout: 10000 } + ); + // Get the greeting message content const firstMessage = page.locator('[data-testid="message-bubble"]').first(); await expect(firstMessage).toBeVisible(); const originalContent = await firstMessage.textContent(); - + // Verify the greeting message has meaningful content expect(originalContent).toBeTruthy(); expect(originalContent!.length).toBeGreaterThan(10); // Should have substantial content - + console.log('Original message content:', originalContent); - + // Send a test message to create more chat history const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill('Hello Claude!'); await messageInput.press('Enter'); - + // Wait for the user message to appear (we'll just check for 2 messages - greeting + user) // Don't wait for response as Claude might be slow in test environment - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - if (messages.length >= 2) { - // Check that second message contains our test text - const userMessage = messages[1]; - return userMessage.textContent && userMessage.textContent.includes('Hello Claude'); - } - return false; - }, { timeout: 10000 }); - + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + if (messages.length >= 2) { + // Check that second message contains our test text + const userMessage = messages[1]; + return userMessage.textContent && userMessage.textContent.includes('Hello Claude'); + } + return false; + }, + { timeout: 10000 } + ); + // Navigate away from the session (go back to project detail) await page.goBack(); await page.waitForURL('**/projects/**'); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Navigate back to the same session using Claude Code button const claudeCodeButtonAgain = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButtonAgain).toBeVisible(); await claudeCodeButtonAgain.click(); - + // Wait for Claude Code interface to load again await page.waitForTimeout(1000); // Give time for navigation - + // Wait for messages to be restored - at least the greeting and user message - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length >= 2; // Should have at least greeting + user message - }, { timeout: 10000 }); - + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return messages.length >= 2; // Should have at least greeting + user message + }, + { timeout: 10000 } + ); + // Verify that all messages are still present with correct content const messages = page.locator('[data-testid="message-bubble"]'); const messageCount = await messages.count(); expect(messageCount).toBeGreaterThanOrEqual(2); // At least greeting + user message - + // Verify the greeting message content is preserved const restoredFirstMessage = messages.first(); const restoredContent = await restoredFirstMessage.textContent(); - + console.log('Restored message content:', restoredContent); - + // The restored content should match the original content expect(restoredContent).toBeTruthy(); expect(restoredContent!.length).toBeGreaterThan(10); // Should have substantial content expect(restoredContent).not.toBe(''); // Should not be empty - + // Verify that we have at least 2 messages and they have content if (messageCount >= 2) { const secondMessage = messages.nth(1); @@ -123,83 +139,116 @@ test.describe('Session Rehydration', () => { expect(secondContent!.length).toBeGreaterThan(5); } }); - + test('should handle multiple session switches correctly', async ({ page, testWorkspace }) => { // Set up the test workspace in the browser await setupWorkspaceInBrowser(page, testWorkspace); - + const projectCard = page.locator('[data-testid="project-card"]').first(); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Start session with first repo const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); const repo1Text = await claudeCodeButton.getAttribute('data-repo-name'); - + // Dismiss any panels or toasts that might be blocking const themeSwitcher = page.locator('text="Theme Switcher"'); - if (await themeSwitcher.count() > 0) { + if ((await themeSwitcher.count()) > 0) { await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(500); } - + const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + await claudeCodeButton.click(); await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); - + // Wait for greeting and verify content - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length > 0 && messages[0].textContent && messages[0].textContent.trim().length > 0; - }, { timeout: 10000 }); - - const session1Content = await page.locator('[data-testid="message-bubble"]').first().textContent(); + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return ( + messages.length > 0 && + messages[0].textContent && + messages[0].textContent.trim().length > 0 + ); + }, + { timeout: 10000 } + ); + + const session1Content = await page + .locator('[data-testid="message-bubble"]') + .first() + .textContent(); expect(session1Content).toBeTruthy(); expect(session1Content!.length).toBeGreaterThan(10); - + // If there's a second repo, test switching between them await page.goBack(); await page.waitForURL('**/projects/**'); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - - const repo2Button = page.locator('button').filter({ hasText: /hello-world-\d+/i }).nth(1); - if (await repo2Button.count() > 0) { + + const repo2Button = page + .locator('button') + .filter({ hasText: /hello-world-\d+/i }) + .nth(1); + if ((await repo2Button.count()) > 0) { const repo2Text = await repo2Button.textContent(); await repo2Button.click(); await page.waitForTimeout(1000); // Give time for navigation - + // Wait for different greeting - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length > 0 && messages[0].textContent && messages[0].textContent.trim().length > 0; - }, { timeout: 10000 }); - - const session2Content = await page.locator('[data-testid="message-bubble"]').first().textContent(); + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return ( + messages.length > 0 && + messages[0].textContent && + messages[0].textContent.trim().length > 0 + ); + }, + { timeout: 10000 } + ); + + const session2Content = await page + .locator('[data-testid="message-bubble"]') + .first() + .textContent(); expect(session2Content).toContain('Hello-World'); - + // Go back to first repo and verify original content is preserved await page.goBack(); await page.waitForTimeout(1000); // Give time for navigation - + await repo1Button.click(); await page.waitForTimeout(1000); // Give time for navigation - - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length > 0 && messages[0].textContent && messages[0].textContent.trim().length > 0; - }, { timeout: 10000 }); - - const restoredSession1Content = await page.locator('[data-testid="message-bubble"]').first().textContent(); + + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return ( + messages.length > 0 && + messages[0].textContent && + messages[0].textContent.trim().length > 0 + ); + }, + { timeout: 10000 } + ); + + const restoredSession1Content = await page + .locator('[data-testid="message-bubble"]') + .first() + .textContent(); expect(restoredSession1Content).toBeTruthy(); expect(restoredSession1Content!.length).toBeGreaterThan(10); } else { @@ -209,10 +258,13 @@ test.describe('Session Rehydration', () => { await claudeCodeButtonAgain.click(); await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); - - const restoredContent = await page.locator('[data-testid="message-bubble"]').first().textContent(); + + const restoredContent = await page + .locator('[data-testid="message-bubble"]') + .first() + .textContent(); expect(restoredContent).toBeTruthy(); expect(restoredContent!.length).toBeGreaterThan(10); } }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/simple-breadcrumb.spec.ts b/apps/v1/client/e2e/simple-breadcrumb.spec.ts index 73c74419..5cc96537 100644 --- a/apps/v1/client/e2e/simple-breadcrumb.spec.ts +++ b/apps/v1/client/e2e/simple-breadcrumb.spec.ts @@ -3,15 +3,15 @@ import { test, expect, setupWorkspaceInBrowser } from './test-setup'; test.describe('Simple Breadcrumb Test', () => { test('should show projects page and basic navigation', async ({ page, testWorkspace }) => { await setupWorkspaceInBrowser(page, testWorkspace); - + // Just verify we can see the projects page - Projects is in the sidebar nav await expect(page.locator('text=Projects').first()).toBeVisible({ timeout: 10000 }); - + // Look for any project cards const projectCards = page.locator('[data-testid="project-card"]'); const count = await projectCards.count(); console.log(`Found ${count} project cards`); - + if (count > 0) { const firstProject = projectCards.first(); await expect(firstProject).toBeVisible(); @@ -19,4 +19,4 @@ test.describe('Simple Breadcrumb Test', () => { console.log(`First project: ${projectText}`); } }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-dancing-bubbles.spec.ts b/apps/v1/client/e2e/test-dancing-bubbles.spec.ts index 0777643c..f495aa10 100644 --- a/apps/v1/client/e2e/test-dancing-bubbles.spec.ts +++ b/apps/v1/client/e2e/test-dancing-bubbles.spec.ts @@ -13,98 +13,101 @@ test.describe('Claude Code Dancing Bubbles', () => { } }); - test('should show dancing bubbles while waiting for response', async ({ page, testWorkspace }) => { + test('should show dancing bubbles while waiting for response', async ({ + page, + testWorkspace, + }) => { // Set up workspace and navigate to Claude Code await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any blocking UI elements const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Send a message const testMessage = 'Please count to 5 slowly'; const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill(testMessage); - + // Send the message await messageInput.press('Enter'); - + // Wait a moment for the placeholder to be added await page.waitForTimeout(500); - + // Check for dancing bubbles in the latest message const messages = page.locator('[data-testid="message-bubble"]'); const messageCountAfterSend = await messages.count(); console.log('Message count after send:', messageCountAfterSend); - + // Should have at least: greeting + user message + placeholder expect(messageCountAfterSend).toBeGreaterThanOrEqual(3); - + // Check for dancing bubbles indicator const dancingBubbles = page.locator('[data-testid="dancing-bubbles"]'); const dancingBubblesCount = await dancingBubbles.count(); console.log('Dancing bubbles found:', dancingBubblesCount); - + if (dancingBubblesCount === 0) { // If no dancing bubbles found by test-id, look for the animation class const animatedElements = page.locator('.animate-pulse, .animate-bounce'); const animatedCount = await animatedElements.count(); console.log('Animated elements found:', animatedCount); - + // Look in the last assistant message const lastAssistantMessage = messages.filter({ hasText: 'C' }).last(); const bubbleContent = await lastAssistantMessage.textContent(); console.log('Last assistant message content:', bubbleContent); } - + // Wait for actual content to start streaming await page.waitForTimeout(3000); - + // Dancing bubbles should be gone and replaced with actual content const finalDancingBubblesCount = await dancingBubbles.count(); console.log('Final dancing bubbles count:', finalDancingBubblesCount); - + // Check that we now have actual content const finalMessages = page.locator('[data-testid="message-bubble"]'); const finalMessageCount = await finalMessages.count(); const lastMessage = finalMessages.nth(finalMessageCount - 1); const lastMessageText = await lastMessage.textContent(); - + console.log('Final message text:', lastMessageText); - + // Should have actual content now, not just empty expect(lastMessageText).not.toBe(''); expect(lastMessageText).toContain('C'); // Avatar - + // Take screenshot for debugging await page.screenshot({ path: 'dancing-bubbles-test.png', fullPage: true }); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-feedback-autofocus.spec.ts b/apps/v1/client/e2e/test-feedback-autofocus.spec.ts index 0ffa6afe..0447f192 100644 --- a/apps/v1/client/e2e/test-feedback-autofocus.spec.ts +++ b/apps/v1/client/e2e/test-feedback-autofocus.spec.ts @@ -13,52 +13,55 @@ test.describe('Feedback Dialog Autofocus', () => { } }); - test('should automatically focus the feedback textarea when dialog opens', async ({ page, testWorkspace }) => { + test('should automatically focus the feedback textarea when dialog opens', async ({ + page, + testWorkspace, + }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); // Wait for SSE setup - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Find and click a feedback link const feedbackLink = page.locator('button:has-text("Leave feedback")').first(); await expect(feedbackLink).toBeVisible({ timeout: 10000 }); await feedbackLink.click(); - + // Wait for feedback dialog to appear await page.waitForSelector('h2:has-text("Leave feedback")', { timeout: 5000 }); - + // Wait a bit for the autofocus to trigger await page.waitForTimeout(200); - + // Check if the textarea is focused const focusedElement = await page.evaluate(() => document.activeElement?.tagName); expect(focusedElement).toBe('TEXTAREA'); - + // Also verify we can immediately start typing await page.keyboard.type('This is a test of autofocus'); - + // Check that the text was entered const textarea = page.locator('textarea').first(); const value = await textarea.inputValue(); expect(value).toBe('This is a test of autofocus'); - + // Take a screenshot for debugging await page.screenshot({ path: 'feedback-autofocus.png', fullPage: true }); }); @@ -66,48 +69,48 @@ test.describe('Feedback Dialog Autofocus', () => { test('should maintain focus when dragging the dialog', async ({ page, testWorkspace }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting message and click feedback await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); const feedbackLink = page.locator('button:has-text("Leave feedback")').first(); await feedbackLink.click(); - + // Wait for dialog and autofocus await page.waitForSelector('h2:has-text("Leave feedback")', { timeout: 5000 }); await page.waitForTimeout(200); - + // Type some text await page.keyboard.type('Test text'); - + // Drag the dialog header const dialogHeader = page.locator('h2:has-text("Leave feedback")').locator('..'); await dialogHeader.hover(); await page.mouse.down(); await page.mouse.move(100, 100); await page.mouse.up(); - + // Continue typing to verify focus is maintained await page.keyboard.type(' after drag'); - + // Verify the full text const textarea = page.locator('textarea').first(); const value = await textarea.inputValue(); expect(value).toBe('Test text after drag'); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-ls-tool-display.spec.ts b/apps/v1/client/e2e/test-ls-tool-display.spec.ts index 327115d4..7989c7be 100644 --- a/apps/v1/client/e2e/test-ls-tool-display.spec.ts +++ b/apps/v1/client/e2e/test-ls-tool-display.spec.ts @@ -16,109 +16,112 @@ test.describe('LS Tool Display', () => { test('should display folder name for LS tool, not JSON', async ({ page, testWorkspace }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any panels or toasts that might be blocking const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); // Wait for SSE setup - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Send a message that will trigger LS tool const testMessage = 'List the files in the src directory'; const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill(testMessage); - + // Send the message await messageInput.press('Enter'); - + // Wait for tool execution to appear await page.waitForSelector('[data-testid="tool-execution"]', { timeout: 10000 }); - + // Get the tool execution element const toolExecution = page.locator('[data-testid="tool-execution"]').first(); - + // Check that the tool name is correct const toolName = toolExecution.locator('[data-testid="tool-name"]'); await expect(toolName).toContainText('List directory'); - + // Check that the folder name is displayed (not "json") const toolArgs = toolExecution.locator('.font-mono').first(); const argsText = await toolArgs.textContent(); - + // Verify it shows "src" and not "json" expect(argsText?.toLowerCase()).toContain('src'); expect(argsText?.toLowerCase()).not.toBe('json'); - + // Take a screenshot for debugging await page.screenshot({ path: 'ls-tool-display.png', fullPage: true }); }); - test('should display "current directory" for LS tool when path is "."', async ({ page, testWorkspace }) => { + test('should display "current directory" for LS tool when path is "."', async ({ + page, + testWorkspace, + }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Send a message that will trigger LS tool on current directory const testMessage = 'List files in the current directory'; const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill(testMessage); await messageInput.press('Enter'); - + // Wait for tool execution await page.waitForSelector('[data-testid="tool-execution"]', { timeout: 10000 }); - + // Get the tool execution element const toolExecution = page.locator('[data-testid="tool-execution"]').first(); - + // Check that it shows "current directory" const toolArgs = toolExecution.locator('.font-mono').first(); const argsText = await toolArgs.textContent(); - + expect(argsText).toBe('current directory'); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-markdown-elements.spec.ts b/apps/v1/client/e2e/test-markdown-elements.spec.ts index 277c8bdf..6d1cfa13 100644 --- a/apps/v1/client/e2e/test-markdown-elements.spec.ts +++ b/apps/v1/client/e2e/test-markdown-elements.spec.ts @@ -15,35 +15,35 @@ test.describe('Claude Code Markdown Elements', () => { const navigateToClaudeCode = async (page: any, testWorkspace: string) => { await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any panels or toasts that might be blocking const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); }; @@ -53,19 +53,22 @@ test.describe('Claude Code Markdown Elements', () => { await expect(messageInput).toBeVisible(); await messageInput.fill(message); await messageInput.press('Enter'); - + // Wait for response to start await page.waitForTimeout(2000); - + // Wait for new message - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length >= 3; // greeting + user + response - }, { timeout: 30000 }); - + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return messages.length >= 3; // greeting + user + response + }, + { timeout: 30000 } + ); + // Wait for streaming to complete await page.waitForTimeout(3000); - + // Get the last message const messages = page.locator('[data-testid="message-bubble"]'); const messageCount = await messages.count(); @@ -74,21 +77,21 @@ test.describe('Claude Code Markdown Elements', () => { test('should render headers without hash symbols', async ({ page, testWorkspace }) => { await navigateToClaudeCode(page, testWorkspace); - + const message = 'Please respond with exactly: "# Header 1\\n## Header 2\\n### Header 3"'; const response = await sendMessageAndWaitForResponse(page, message); - + const responseText = await response.textContent(); console.log('Headers test - Response text:', responseText); - + // Should not show raw markdown expect(responseText).not.toContain('# Header'); - + // Should have actual header elements const h1Count = await response.locator('h1').count(); const h2Count = await response.locator('h2').count(); const h3Count = await response.locator('h3').count(); - + expect(h1Count).toBeGreaterThan(0); expect(h2Count).toBeGreaterThan(0); expect(h3Count).toBeGreaterThan(0); @@ -96,24 +99,25 @@ test.describe('Claude Code Markdown Elements', () => { test('should render lists and checkboxes properly', async ({ page, testWorkspace }) => { await navigateToClaudeCode(page, testWorkspace); - - const message = 'Please respond with exactly: "- Item 1\\n- Item 2\\n\\n- [ ] Unchecked\\n- [x] Checked"'; + + const message = + 'Please respond with exactly: "- Item 1\\n- Item 2\\n\\n- [ ] Unchecked\\n- [x] Checked"'; const response = await sendMessageAndWaitForResponse(page, message); - + const responseText = await response.textContent(); console.log('Lists test - Response text:', responseText); - + // Should have list elements const ulCount = await response.locator('ul').count(); const liCount = await response.locator('li').count(); - + expect(ulCount).toBeGreaterThan(0); expect(liCount).toBeGreaterThanOrEqual(4); - + // Should have checkboxes const checkboxCount = await response.locator('input[type="checkbox"]').count(); expect(checkboxCount).toBe(2); - + // One should be checked const checkedCount = await response.locator('input[type="checkbox"][checked]').count(); expect(checkedCount).toBe(1); @@ -121,20 +125,20 @@ test.describe('Claude Code Markdown Elements', () => { test('should render inline code without backticks', async ({ page, testWorkspace }) => { await navigateToClaudeCode(page, testWorkspace); - + const message = 'Please respond with exactly: "Here is `inline code` example"'; const response = await sendMessageAndWaitForResponse(page, message); - + const responseText = await response.textContent(); console.log('Inline code test - Response text:', responseText); - + // Should not contain backticks expect(responseText).not.toContain('`'); - + // Should have code element const codeCount = await response.locator('code').count(); expect(codeCount).toBeGreaterThan(0); - + // Code element should contain the text without backticks const codeElement = response.locator('code').first(); const codeText = await codeElement.textContent(); @@ -143,56 +147,57 @@ test.describe('Claude Code Markdown Elements', () => { test('should render code blocks without triple backticks', async ({ page, testWorkspace }) => { await navigateToClaudeCode(page, testWorkspace); - - const message = 'Please respond with exactly: "```\\nfunction test() {\\n return true;\\n}\\n```"'; + + const message = + 'Please respond with exactly: "```\\nfunction test() {\\n return true;\\n}\\n```"'; const response = await sendMessageAndWaitForResponse(page, message); - + const responseText = await response.textContent(); console.log('Code block test - Response text:', responseText); - + // Should not contain triple backticks expect(responseText).not.toContain('```'); - + // Should have pre element const preCount = await response.locator('pre').count(); expect(preCount).toBeGreaterThan(0); - + // Should contain the function expect(responseText).toContain('function test()'); }); test('should not display [object Object]', async ({ page, testWorkspace }) => { await navigateToClaudeCode(page, testWorkspace); - + const message = 'Say hello with **bold** and *italic* text'; const response = await sendMessageAndWaitForResponse(page, message); - + const responseText = await response.textContent(); console.log('Object test - Response text:', responseText); - + // Should never show [object Object] expect(responseText).not.toContain('[object Object]'); - + // Should have formatted text const strongCount = await response.locator('strong').count(); const emCount = await response.locator('em').count(); - + expect(strongCount).toBeGreaterThan(0); expect(emCount).toBeGreaterThan(0); }); test('should apply CSS classes correctly', async ({ page, testWorkspace }) => { await navigateToClaudeCode(page, testWorkspace); - + const message = 'Please respond with exactly: "# Big Header\\n\\n> A quote"'; const response = await sendMessageAndWaitForResponse(page, message); - + // Check header has correct classes const h1 = response.locator('h1').first(); const h1Classes = await h1.getAttribute('class'); expect(h1Classes).toContain('text-2xl'); expect(h1Classes).toContain('font-bold'); - + // Check blockquote has correct classes const blockquote = response.locator('blockquote').first(); const blockquoteClasses = await blockquote.getAttribute('class'); @@ -200,4 +205,4 @@ test.describe('Claude Code Markdown Elements', () => { expect(blockquoteClasses).toContain('pl-4'); expect(blockquoteClasses).toContain('italic'); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-markdown-rendering-comprehensive.spec.ts b/apps/v1/client/e2e/test-markdown-rendering-comprehensive.spec.ts index 4189a354..dcaad8a1 100644 --- a/apps/v1/client/e2e/test-markdown-rendering-comprehensive.spec.ts +++ b/apps/v1/client/e2e/test-markdown-rendering-comprehensive.spec.ts @@ -13,27 +13,30 @@ test.describe('Claude Code Comprehensive Markdown Rendering', () => { } }); - test('should render all markdown elements correctly from server response', async ({ page, testWorkspace }) => { + test('should render all markdown elements correctly from server response', async ({ + page, + testWorkspace, + }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Navigate to Claude Code const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any blocking UI elements const toasts = page.locator('.fixed.bottom-4.right-4'); - if (await toasts.count() > 0) { + if ((await toasts.count()) > 0) { // Click outside to dismiss any toasts await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(1000); } - + // Force click the button if regular click doesn't work try { await claudeCodeButton.click({ timeout: 5000 }); @@ -44,14 +47,14 @@ test.describe('Claude Code Comprehensive Markdown Rendering', () => { await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Intercept the SSE response to capture what the server sends const serverResponse = ''; const capturedMessages: any[] = []; - + // Listen to network events to capture SSE data page.on('response', async (response) => { if (response.url().includes('/api/claude/chat') && response.request().method() === 'POST') { @@ -62,7 +65,7 @@ test.describe('Claude Code Comprehensive Markdown Rendering', () => { }); // Also monitor console for any markdown parsing errors - page.on('console', msg => { + page.on('console', (msg) => { if (msg.type() === 'error' && msg.text().includes('markdown')) { console.error('Markdown parsing error:', msg.text()); } @@ -110,91 +113,94 @@ End of markdown test.`; const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill(testMessage); - + // Send the message await messageInput.press('Enter'); - + // Wait for response to complete await page.waitForTimeout(2000); - + // Wait for assistant's response - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length >= 3; - }, { timeout: 30000 }); - + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return messages.length >= 3; + }, + { timeout: 30000 } + ); + // Wait a bit more to ensure streaming is complete await page.waitForTimeout(3000); - + // Get the assistant's response const messages = page.locator('[data-testid="message-bubble"]'); const messageCount = await messages.count(); const responseElement = messages.nth(messageCount - 1); - + // Take screenshot for debugging await page.screenshot({ path: 'markdown-comprehensive-test.png', fullPage: true }); - + // Get the response content const responseText = await responseElement.textContent(); const responseHTML = await responseElement.innerHTML(); - + console.log('Response text:', responseText); console.log('Response HTML (first 500 chars):', responseHTML.substring(0, 500)); - + // Verify content is not [object Object] expect(responseText).not.toContain('[object Object]'); - + // Test 1: Headers are rendered (not showing # symbols) expect(responseText).not.toContain('# Header 1'); expect(responseText).not.toContain('## Header 2'); expect(responseText).not.toContain('### Header 3'); - + // Headers should be rendered as actual headers const h1Elements = await responseElement.locator('h1').count(); const h2Elements = await responseElement.locator('h2').count(); const h3Elements = await responseElement.locator('h3').count(); - + expect(h1Elements).toBeGreaterThan(0); expect(h2Elements).toBeGreaterThan(0); expect(h3Elements).toBeGreaterThan(0); - + // Test 2: Bold and italic text expect(responseText).not.toContain('**bold**'); expect(responseText).not.toContain('*italic*'); - + const strongElements = await responseElement.locator('strong').count(); const emElements = await responseElement.locator('em').count(); - + expect(strongElements).toBeGreaterThan(0); expect(emElements).toBeGreaterThan(0); - + // Test 3: Lists are rendered properly const ulElements = await responseElement.locator('ul').count(); const olElements = await responseElement.locator('ol').count(); const liElements = await responseElement.locator('li').count(); - + expect(ulElements).toBeGreaterThan(0); expect(olElements).toBeGreaterThan(0); expect(liElements).toBeGreaterThan(0); - + // Test 4: Checkboxes are rendered const checkboxes = await responseElement.locator('input[type="checkbox"]').count(); expect(checkboxes).toBe(2); // One checked, one unchecked - + // Verify one is checked and one is not const checkedBoxes = await responseElement.locator('input[type="checkbox"][checked]').count(); expect(checkedBoxes).toBe(1); - + // Test 5: Code blocks and inline code expect(responseText).not.toContain('```javascript'); expect(responseText).not.toContain('```'); - + const preElements = await responseElement.locator('pre').count(); const codeElements = await responseElement.locator('code').count(); - + expect(preElements).toBeGreaterThan(0); expect(codeElements).toBeGreaterThan(0); - + // Verify inline code doesn't show backticks const inlineCodeElements = await responseElement.locator('code').all(); for (const codeEl of inlineCodeElements) { @@ -205,52 +211,52 @@ End of markdown test.`; expect(codeText).not.toContain('`'); } } - + // Test 6: Blockquote const blockquoteElements = await responseElement.locator('blockquote').count(); expect(blockquoteElements).toBeGreaterThan(0); - + // Test 7: Link const linkElements = await responseElement.locator('a[href="https://example.com"]').count(); expect(linkElements).toBeGreaterThan(0); - + // Test 8: Horizontal rule const hrElements = await responseElement.locator('hr').count(); expect(hrElements).toBeGreaterThan(0); - + // Verify CSS classes are applied const h1Element = responseElement.locator('h1').first(); const h1Classes = await h1Element.getAttribute('class'); expect(h1Classes).toContain('text-2xl'); expect(h1Classes).toContain('font-bold'); - + const ulElement = responseElement.locator('ul').first(); const ulClasses = await ulElement.getAttribute('class'); expect(ulClasses).toContain('list-disc'); expect(ulClasses).toContain('list-inside'); - + console.log('All markdown elements rendered correctly!'); }); test('should handle edge cases in markdown rendering', async ({ page, testWorkspace }) => { await setupWorkspaceInBrowser(page, testWorkspace); - + // Navigate to Claude Code const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any blocking UI elements const toasts = page.locator('.fixed.bottom-4.right-4'); - if (await toasts.count() > 0) { + if ((await toasts.count()) > 0) { await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(1000); } - + // Force click if needed try { await claudeCodeButton.click({ timeout: 5000 }); @@ -261,10 +267,10 @@ End of markdown test.`; await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Test edge cases const edgeCaseMessage = `Please respond with EXACTLY this markdown: @@ -289,31 +295,34 @@ Mixed list: const messageInput = page.locator('[data-testid="message-input"]'); await messageInput.fill(edgeCaseMessage); await messageInput.press('Enter'); - + // Wait for response await page.waitForTimeout(2000); - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length >= 3; - }, { timeout: 30000 }); - + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return messages.length >= 3; + }, + { timeout: 30000 } + ); + await page.waitForTimeout(3000); - + const messages = page.locator('[data-testid="message-bubble"]'); const messageCount = await messages.count(); const responseElement = messages.nth(messageCount - 1); - + const responseText = await responseElement.textContent(); - + // Verify edge cases render without errors expect(responseText).not.toContain('[object Object]'); expect(responseText).not.toContain('```'); - + // Check nested formatting works const nestedStrong = await responseElement.locator('strong:has(em)').count(); expect(nestedStrong).toBeGreaterThan(0); - + // Take screenshot await page.screenshot({ path: 'markdown-edge-cases-test.png', fullPage: true }); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-markdown-rendering.spec.ts b/apps/v1/client/e2e/test-markdown-rendering.spec.ts index e737d2f3..73077353 100644 --- a/apps/v1/client/e2e/test-markdown-rendering.spec.ts +++ b/apps/v1/client/e2e/test-markdown-rendering.spec.ts @@ -16,98 +16,101 @@ test.describe('Claude Code Markdown Rendering', () => { test('should render markdown with bold text correctly', async ({ page, testWorkspace }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any panels or toasts that might be blocking const themeSwitcher = page.locator('text="Theme Switcher"'); - if (await themeSwitcher.count() > 0) { + if ((await themeSwitcher.count()) > 0) { await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(500); } - + const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + await claudeCodeButton.click(); - + // Wait for Claude Code page to load and SSE connection to establish await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); // Wait for SSE setup - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Type the test message const testMessage = 'Say "Hello **world**!" with the word world in bold markdown'; const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill(testMessage); - + // Send the message await messageInput.press('Enter'); - + // Wait for the response to complete await page.waitForTimeout(2000); // Give time for message to start - + // Wait for a new assistant message that contains "Hello" and check for completion // We should have at least 3 messages now: greeting, user message, response - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length >= 3; - }, { timeout: 30000 }); - + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return messages.length >= 3; + }, + { timeout: 30000 } + ); + // Get the last message (assistant's response) const messages = page.locator('[data-testid="message-bubble"]'); const messageCount = await messages.count(); const responseElement = messages.nth(messageCount - 1); const responseHTML = await responseElement.innerHTML(); const responseText = await responseElement.textContent(); - + console.log('Response HTML:', responseHTML); console.log('Response Text:', responseText); - + // Check that the response doesn't contain [object Object] expect(responseText).not.toContain('[object Object]'); - + // Check that markdown is properly rendered // The word "world" should be in a tag if markdown is working const strongElements = await responseElement.locator('strong').all(); const hasStrongTag = strongElements.length > 0; - + if (hasStrongTag) { console.log('Markdown rendering is working - found tags'); // Check if "world" is bold - const worldIsStrong = await responseElement.locator('strong:has-text("world")').count() > 0; + const worldIsStrong = (await responseElement.locator('strong:has-text("world")').count()) > 0; expect(worldIsStrong).toBe(true); } else { // If no strong tags, check if the raw markdown is visible const hasRawMarkdown = responseText.includes('**world**'); console.log('Has raw markdown:', hasRawMarkdown); - + // This indicates markdown isn't being rendered if (hasRawMarkdown) { throw new Error('Markdown is not being rendered - raw ** symbols are visible'); } } - + // Take a screenshot for debugging await page.screenshot({ path: 'markdown-test-result.png', fullPage: true }); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-plan-mode.spec.ts b/apps/v1/client/e2e/test-plan-mode.spec.ts index 1e32444a..08f12653 100644 --- a/apps/v1/client/e2e/test-plan-mode.spec.ts +++ b/apps/v1/client/e2e/test-plan-mode.spec.ts @@ -16,65 +16,79 @@ test.describe('Plan Mode Restrictions', () => { test('should not allow write operations in plan mode', async ({ page, testWorkspace }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); // Wait for SSE setup - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Verify we're in plan mode - check the mode toggle const planModeButton = page.locator('button:has-text("Planning")'); await expect(planModeButton).toHaveClass(/bg-green-600/); - + // Send a message requesting a write operation const messageInput = page.locator('[data-testid="message-input"]'); await messageInput.fill('Update the README.md file to add a section about testing'); await page.keyboard.press('Enter'); - + // Wait for the response await page.waitForTimeout(5000); // Give Claude time to respond - + // Check that no Write tools were executed - const writeTools = await page.locator('[data-testid="tool-execution"]:has-text("Write file")').count(); - const editTools = await page.locator('[data-testid="tool-execution"]:has-text("Edit file")').count(); - const bashTools = await page.locator('[data-testid="tool-execution"]:has-text("Run command")').count(); - + const writeTools = await page + .locator('[data-testid="tool-execution"]:has-text("Write file")') + .count(); + const editTools = await page + .locator('[data-testid="tool-execution"]:has-text("Edit file")') + .count(); + const bashTools = await page + .locator('[data-testid="tool-execution"]:has-text("Run command")') + .count(); + expect(writeTools).toBe(0); expect(editTools).toBe(0); expect(bashTools).toBe(0); - + // Check that only read tools were used - const readTools = await page.locator('[data-testid="tool-execution"]:has-text("Read file")').count(); - const searchTools = await page.locator('[data-testid="tool-execution"]:has-text("Search files")').count(); - const findTools = await page.locator('[data-testid="tool-execution"]:has-text("Find files")').count(); - const listTools = await page.locator('[data-testid="tool-execution"]:has-text("List directory")').count(); - + const readTools = await page + .locator('[data-testid="tool-execution"]:has-text("Read file")') + .count(); + const searchTools = await page + .locator('[data-testid="tool-execution"]:has-text("Search files")') + .count(); + const findTools = await page + .locator('[data-testid="tool-execution"]:has-text("Find files")') + .count(); + const listTools = await page + .locator('[data-testid="tool-execution"]:has-text("List directory")') + .count(); + // At least some read operations should have been performed const totalReadOperations = readTools + searchTools + findTools + listTools; expect(totalReadOperations).toBeGreaterThan(0); - + // Check that the response mentions planning or suggests changes without implementing const assistantMessages = page.locator('[data-testid="message-bubble"][data-role="assistant"]'); const lastAssistantMessage = assistantMessages.last(); const messageText = await lastAssistantMessage.textContent(); - + // The message should indicate planning mode behavior expect(messageText?.toLowerCase()).toMatch(/plan|suggest|would|could|should|propose/); - + // Take a screenshot for debugging await page.screenshot({ path: 'plan-mode-test.png', fullPage: true }); }); @@ -82,36 +96,40 @@ test.describe('Plan Mode Restrictions', () => { test('should show exit plan mode tool when appropriate', async ({ page, testWorkspace }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Send a message that should trigger exit plan mode const messageInput = page.locator('[data-testid="message-input"]'); await messageInput.fill('Create a plan to refactor the authentication module'); await page.keyboard.press('Enter'); - + // Wait for response with exit_plan_mode tool - await page.waitForSelector('[data-testid="tool-execution"]:has-text("Exit plan mode")', { timeout: 30000 }); - + await page.waitForSelector('[data-testid="tool-execution"]:has-text("Exit plan mode")', { + timeout: 30000, + }); + // Verify the exit plan mode tool was executed - const exitPlanTools = await page.locator('[data-testid="tool-execution"]:has-text("Exit plan mode")').count(); + const exitPlanTools = await page + .locator('[data-testid="tool-execution"]:has-text("Exit plan mode")') + .count(); expect(exitPlanTools).toBeGreaterThan(0); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-setup.ts b/apps/v1/client/e2e/test-setup.ts index d79134f1..1152a30b 100644 --- a/apps/v1/client/e2e/test-setup.ts +++ b/apps/v1/client/e2e/test-setup.ts @@ -10,47 +10,50 @@ export const test = base.extend<{ testWorkspace: async ({}, use) => { // Create a temporary test workspace const testDir = path.join(os.tmpdir(), `e2e-test-workspace-${Date.now()}`); - + try { console.log(`Creating test workspace at: ${testDir}`); - + // Create the workspace via API const createResponse = await fetch('http://localhost:3000/api/workspace/create', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ workspacePath: testDir }) + body: JSON.stringify({ workspacePath: testDir }), }); - + if (!createResponse.ok) { throw new Error(`Failed to create test workspace: ${createResponse.statusText}`); } - + // Create a test project const projectResponse = await fetch('http://localhost:3000/api/workspace/create-project', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - workspacePath: testDir, - projectName: 'Test Project' - }) + body: JSON.stringify({ + workspacePath: testDir, + projectName: 'Test Project', + }), }); - + if (!projectResponse.ok) { throw new Error(`Failed to create test project: ${projectResponse.statusText}`); } - + // Create a simple test repo directory manually const projectPath = path.join(testDir, 'projects', 'test-project'); const reposPath = path.join(projectPath, 'repos'); await fs.mkdir(reposPath, { recursive: true }); - + // Create a fake repo directory for testing const testRepoPath = path.join(reposPath, 'hello-world-1'); await fs.mkdir(testRepoPath, { recursive: true }); - + // Create a simple README.md file - await fs.writeFile(path.join(testRepoPath, 'README.md'), '# Hello World\nThis is a test repository.'); - + await fs.writeFile( + path.join(testRepoPath, 'README.md'), + '# Hello World\nThis is a test repository.' + ); + // Update the project's REPOS.md file const reposMdContent = `# Repository usage @@ -69,7 +72,7 @@ export const test = base.extend<{ (No active work) `; await fs.writeFile(path.join(projectPath, 'REPOS.md'), reposMdContent); - + await use(testDir); } finally { // Cleanup: remove the test workspace @@ -89,32 +92,40 @@ export { expect }; export async function setupWorkspaceInBrowser(page: any, workspacePath: string) { // Set the workspace in localStorage to bypass the workspace dialog await page.addInitScript((path: string) => { - localStorage.setItem('workspaceConfig', JSON.stringify({ - path: path, - name: path.split('/').pop() || 'Test Workspace' - })); + localStorage.setItem( + 'workspaceConfig', + JSON.stringify({ + path: path, + name: path.split('/').pop() || 'Test Workspace', + }) + ); }, workspacePath); - + // Navigate to the app await page.goto('http://localhost:5173'); - + // Wait for the initial DOM to be ready await page.waitForLoadState('domcontentloaded'); - + // Wait for the workspace to load by checking if we're past the workspace selection - await page.waitForFunction(() => { - // Check if we're past the workspace selection screen - return !document.querySelector('[data-testid="workspace-dialog"]') && - !document.body.textContent?.includes('Select workspace'); - }, { timeout: 10000 }); - + await page.waitForFunction( + () => { + // Check if we're past the workspace selection screen + return ( + !document.querySelector('[data-testid="workspace-dialog"]') && + !document.body.textContent?.includes('Select workspace') + ); + }, + { timeout: 10000 } + ); + // Navigate to projects page if not already there const currentUrl = page.url(); if (!currentUrl.includes('/projects')) { await page.goto('http://localhost:5173/projects'); await page.waitForLoadState('domcontentloaded'); } - + // Wait for projects page to be ready await page.waitForSelector('[data-testid="project-card"]', { timeout: 10000 }); -} \ No newline at end of file +} diff --git a/apps/v1/client/e2e/test-streaming-cursor.spec.ts b/apps/v1/client/e2e/test-streaming-cursor.spec.ts index 7f73ae55..3c963217 100644 --- a/apps/v1/client/e2e/test-streaming-cursor.spec.ts +++ b/apps/v1/client/e2e/test-streaming-cursor.spec.ts @@ -16,64 +16,67 @@ test.describe('Claude Code Streaming Cursor', () => { test('should show and hide streaming cursor correctly', async ({ page, testWorkspace }) => { // Set up workspace and navigate to Claude Code await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any blocking UI elements const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Send a simple message const testMessage = 'Please say "Hello" and nothing else'; const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill(testMessage); - + // Send the message await messageInput.press('Enter'); - + // Wait for response to start streaming await page.waitForTimeout(1500); - + // Wait for a new message to appear - await page.waitForFunction(() => { - const messages = document.querySelectorAll('[data-testid="message-bubble"]'); - return messages.length >= 3; // greeting + user + assistant - }, { timeout: 30000 }); - + await page.waitForFunction( + () => { + const messages = document.querySelectorAll('[data-testid="message-bubble"]'); + return messages.length >= 3; // greeting + user + assistant + }, + { timeout: 30000 } + ); + // Get the streaming message const messages = page.locator('[data-testid="message-bubble"]'); const messageCount = await messages.count(); const assistantMessage = messages.nth(messageCount - 1); - + // Check for streaming cursor (should be visible while streaming) const streamingCursor = assistantMessage.locator('.animate-pulse'); - + // At some point during streaming, the cursor should be visible let cursorWasVisible = false; for (let i = 0; i < 10; i++) { @@ -85,76 +88,76 @@ test.describe('Claude Code Streaming Cursor', () => { } await page.waitForTimeout(500); } - + // If we never saw the cursor, the message might have completed too quickly // Let's check the debug info const debugInfo = assistantMessage.locator('.text-xs.text-gray-400'); - if (await debugInfo.count() > 0) { + if ((await debugInfo.count()) > 0) { const debugText = await debugInfo.textContent(); console.log('Debug info:', debugText); } - + // Wait for streaming to complete (up to 10 seconds) await page.waitForTimeout(5000); - + // After streaming completes, cursor should be gone const finalCursorCount = await streamingCursor.count(); console.log('Final cursor count:', finalCursorCount); - + // Get debug info again to check final streaming state - if (await debugInfo.count() > 0) { + if ((await debugInfo.count()) > 0) { const finalDebugText = await debugInfo.textContent(); console.log('Final debug info:', finalDebugText); - + // Check that streaming is false expect(finalDebugText).toContain('Streaming: false'); } - + // Cursor should no longer be visible expect(finalCursorCount).toBe(0); - + // Take screenshot for debugging await page.screenshot({ path: 'streaming-cursor-test.png', fullPage: true }); }); test('should properly handle multiple rapid messages', async ({ page, testWorkspace }) => { await setupWorkspaceInBrowser(page, testWorkspace); - + // Navigate to Claude Code const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); await claudeCodeButton.click(); await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); - + // Wait for greeting await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + const messageInput = page.locator('[data-testid="message-input"]'); - + // Send first message await messageInput.fill('Say "One"'); await messageInput.press('Enter'); - + // Wait a bit for first response to start await page.waitForTimeout(2000); - + // Send second message while first might still be streaming await messageInput.fill('Say "Two"'); await messageInput.press('Enter'); - + // Wait for both responses await page.waitForTimeout(8000); - + // Check that no messages are still showing streaming cursor const allMessages = page.locator('[data-testid="message-bubble"]'); const totalMessages = await allMessages.count(); - + let streamingMessages = 0; for (let i = 0; i < totalMessages; i++) { const message = allMessages.nth(i); @@ -162,17 +165,17 @@ test.describe('Claude Code Streaming Cursor', () => { const cursorCount = await cursor.count(); if (cursorCount > 0) { streamingMessages++; - + // Get debug info for streaming message const debugInfo = message.locator('.text-xs.text-gray-400'); - if (await debugInfo.count() > 0) { + if ((await debugInfo.count()) > 0) { const debugText = await debugInfo.textContent(); console.log(`Message ${i} still streaming:`, debugText); } } } - + // No messages should still be streaming expect(streamingMessages).toBe(0); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-streaming-events.spec.ts b/apps/v1/client/e2e/test-streaming-events.spec.ts index 3cf664c2..b4a42613 100644 --- a/apps/v1/client/e2e/test-streaming-events.spec.ts +++ b/apps/v1/client/e2e/test-streaming-events.spec.ts @@ -16,80 +16,81 @@ test.describe('Claude Code Streaming Events', () => { test('should log all SSE events', async ({ page, testWorkspace }) => { // Capture console logs const consoleLogs: string[] = []; - page.on('console', msg => { + page.on('console', (msg) => { const text = msg.text(); consoleLogs.push(text); if (text.includes('event') || text.includes('message-') || text.includes('SSE')) { console.log('Browser console:', text); } }); - + // Set up workspace await setupWorkspaceInBrowser(page, testWorkspace); - + // Navigate to Claude Code const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss toasts const toasts = page.locator('.fixed.bottom-4.right-4'); - if (await toasts.count() > 0) { + if ((await toasts.count()) > 0) { await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(1000); } - + await claudeCodeButton.click(); await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); - + // Wait for greeting await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Send a simple message const messageInput = page.locator('[data-testid="message-input"]'); await messageInput.fill('Say "test"'); await messageInput.press('Enter'); - + // Wait for response await page.waitForTimeout(8000); - + // Check console logs for events console.log('\n=== SSE Events Received ==='); - const eventLogs = consoleLogs.filter(log => - log.includes('event received') || - log.includes('SSE') || - log.includes('message-start') || - log.includes('message-chunk') || - log.includes('message-end') || - log.includes('message-complete') + const eventLogs = consoleLogs.filter( + (log) => + log.includes('event received') || + log.includes('SSE') || + log.includes('message-start') || + log.includes('message-chunk') || + log.includes('message-end') || + log.includes('message-complete') ); - - eventLogs.forEach(log => console.log(log)); - + + eventLogs.forEach((log) => console.log(log)); + // Check if message-end was received - const hasMessageEnd = eventLogs.some(log => log.includes('message-end')); - const hasMessageComplete = eventLogs.some(log => log.includes('message-complete')); - + const hasMessageEnd = eventLogs.some((log) => log.includes('message-end')); + const hasMessageComplete = eventLogs.some((log) => log.includes('message-complete')); + console.log('\nHas message-end event:', hasMessageEnd); console.log('Has message-complete event:', hasMessageComplete); - + // Check final message state const messages = page.locator('[data-testid="message-bubble"]'); const messageCount = await messages.count(); const lastMessage = messages.nth(messageCount - 1); - + const debugInfo = lastMessage.locator('.text-xs.text-gray-400'); - if (await debugInfo.count() > 0) { + if ((await debugInfo.count()) > 0) { const debugText = await debugInfo.textContent(); console.log('\nFinal message state:', debugText); } - + // Should have received either message-end or message-complete expect(hasMessageEnd || hasMessageComplete).toBe(true); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-tool-execution-timing.spec.ts b/apps/v1/client/e2e/test-tool-execution-timing.spec.ts index 5bec12b9..48165995 100644 --- a/apps/v1/client/e2e/test-tool-execution-timing.spec.ts +++ b/apps/v1/client/e2e/test-tool-execution-timing.spec.ts @@ -16,60 +16,60 @@ test.describe('Tool Execution Timing', () => { test('should show tools as running then complete', async ({ page, testWorkspace }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); // Wait for SSE setup - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Type a message that will trigger tool use const testMessage = 'List the files in the current directory'; const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill(testMessage); - + // Send the message await messageInput.press('Enter'); - + // Wait for tool execution to appear await page.waitForSelector('[data-testid="tool-execution"]', { timeout: 10000 }); - + // Get the tool execution element const toolExecution = page.locator('[data-testid="tool-execution"]').first(); - + // Check that the tool shows running status with spinner const runningSpinner = toolExecution.locator('.animate-spin'); await expect(runningSpinner).toBeVisible({ timeout: 5000 }); - + // Verify the tool name is displayed const toolName = toolExecution.locator('[data-testid="tool-name"]'); await expect(toolName).toContainText('List directory'); - + // Wait for the tool to complete (spinner should disappear and checkmark should appear) await expect(runningSpinner).not.toBeVisible({ timeout: 10000 }); - + // Check for completion checkmark const completionIcon = toolExecution.locator('svg path[d="M5 13l4 4L19 7"]'); await expect(completionIcon).toBeVisible(); - + // Verify execution time is displayed const executionTime = toolExecution.locator('text=/\\d+(\\.\\d+)?[ms|s]/'); await expect(executionTime).toBeVisible(); - + // Take a screenshot showing completed tool await page.screenshot({ path: 'tool-execution-complete.png', fullPage: true }); }); @@ -77,77 +77,79 @@ test.describe('Tool Execution Timing', () => { test('should show multiple tools executing in sequence', async ({ page, testWorkspace }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Send a message that will trigger multiple tools const testMessage = 'Find all TypeScript files and read the first one you find'; const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill(testMessage); await messageInput.press('Enter'); - + // Wait for first tool (Glob/Find files) await page.waitForSelector('[data-testid="tool-execution"]', { timeout: 10000 }); - + // Count tools as they appear let toolCount = 0; const maxWaitTime = 30000; const startTime = Date.now(); - + while (Date.now() - startTime < maxWaitTime) { const tools = page.locator('[data-testid="tool-execution"]'); const currentCount = await tools.count(); - + if (currentCount > toolCount) { toolCount = currentCount; console.log(`Tool ${toolCount} appeared`); - + // Check that each new tool initially shows running status const latestTool = tools.nth(toolCount - 1); const spinner = latestTool.locator('.animate-spin'); - + // New tools should show spinner initially if (await spinner.isVisible()) { console.log(`Tool ${toolCount} is running (has spinner)`); } } - + // Check if we have at least 2 tools (Find files + Read file) if (toolCount >= 2) { // Verify first tool is complete const firstTool = tools.first(); - const firstToolComplete = await firstTool.locator('svg path[d="M5 13l4 4L19 7"]').isVisible(); - + const firstToolComplete = await firstTool + .locator('svg path[d="M5 13l4 4L19 7"]') + .isVisible(); + if (firstToolComplete) { console.log('First tool completed successfully'); break; } } - + await page.waitForTimeout(100); } - + // Verify we got multiple tools expect(toolCount).toBeGreaterThanOrEqual(2); - + // All tools should eventually complete const tools = page.locator('[data-testid="tool-execution"]'); for (let i = 0; i < toolCount; i++) { @@ -155,8 +157,8 @@ test.describe('Tool Execution Timing', () => { const checkmark = tool.locator('svg path[d="M5 13l4 4L19 7"]'); await expect(checkmark).toBeVisible({ timeout: 10000 }); } - + // Take a screenshot showing multiple completed tools await page.screenshot({ path: 'multiple-tools-complete.png', fullPage: true }); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/e2e/test-user-message-no-markdown.spec.ts b/apps/v1/client/e2e/test-user-message-no-markdown.spec.ts index d86a64e4..c005f652 100644 --- a/apps/v1/client/e2e/test-user-message-no-markdown.spec.ts +++ b/apps/v1/client/e2e/test-user-message-no-markdown.spec.ts @@ -16,84 +16,86 @@ test.describe('User Message No Markdown Rendering', () => { test('should not render markdown in user messages', async ({ page, testWorkspace }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); - + // Dismiss any panels or toasts that might be blocking const themeSwitcher = page.locator('text="Theme Switcher"'); - if (await themeSwitcher.count() > 0) { + if ((await themeSwitcher.count()) > 0) { await page.click('body', { position: { x: 10, y: 10 } }); await page.waitForTimeout(500); } - + const toasts = page.locator('[role="alert"], .fixed.bottom-4.right-4'); const toastCount = await toasts.count(); if (toastCount > 0) { const closeButton = toasts.locator('button').first(); - if (await closeButton.count() > 0) { + if ((await closeButton.count()) > 0) { await closeButton.click({ force: true }); } await page.waitForTimeout(1000); } - + await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); // Wait for SSE setup - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // Type a message with special characters that would break if rendered as markdown const testMessage = 'Let\'s plan on a new "inspect @" feature'; const messageInput = page.locator('[data-testid="message-input"]'); await expect(messageInput).toBeVisible(); await messageInput.fill(testMessage); - + // Send the message await messageInput.press('Enter'); - + // Wait for the user message to appear await page.waitForTimeout(1000); - + // Find the user message (should be the second message after greeting) const messages = page.locator('[data-testid="message-bubble"]'); await page.waitForTimeout(2000); // Wait for message to appear const messageCount = await messages.count(); expect(messageCount).toBeGreaterThanOrEqual(2); - + // Get the user message (second bubble) const userMessage = messages.nth(1); const userMessageText = await userMessage.textContent(); - + // Verify the message text is displayed correctly with angle brackets - expect(userMessageText).toContain('Let\'s plan on a new "inspect @" feature'); - + expect(userMessageText).toContain( + 'Let\'s plan on a new "inspect @" feature' + ); + // Verify there are no HTML elements that would indicate markdown rendering const userMessageHTML = await userMessage.innerHTML(); - + // Check that angle brackets are preserved and not interpreted as HTML expect(userMessageHTML).toContain('<packagename>'); expect(userMessageHTML).toContain('<version>'); - + // Check that the message doesn't have markdown-specific classes const markdownContent = await userMessage.locator('.markdown-content').count(); expect(markdownContent).toBe(0); - + // Check that the content is in a simple div with whitespace preservation const simpleContent = await userMessage.locator('.whitespace-pre-wrap').count(); expect(simpleContent).toBe(1); - + // Take a screenshot for debugging await page.screenshot({ path: 'user-message-no-markdown.png', fullPage: true }); }); @@ -101,35 +103,35 @@ test.describe('User Message No Markdown Rendering', () => { test('should render markdown in assistant messages', async ({ page, testWorkspace }) => { // Set up workspace and navigate to projects page await setupWorkspaceInBrowser(page, testWorkspace); - + // Click on test project const projectCard = page.locator('[data-testid="project-card"]').first(); await expect(projectCard).toBeVisible({ timeout: 10000 }); await projectCard.click(); await page.waitForSelector('[data-testid="repo-card"]', { timeout: 10000 }); - + // Click on Claude Code button const claudeCodeButton = page.locator('[data-testid="claude-code-button"]').first(); await expect(claudeCodeButton).toBeVisible({ timeout: 10000 }); await claudeCodeButton.click(); - + // Wait for Claude Code page to load await page.waitForURL('**/claude-code/**'); await page.waitForSelector('[data-testid="message-list"]', { timeout: 10000 }); await page.waitForTimeout(1000); - + // Wait for greeting message await page.waitForSelector('[data-testid="message-bubble"]', { timeout: 30000 }); - + // The greeting message should have markdown rendering const greetingMessage = page.locator('[data-testid="message-bubble"]').first(); - + // Check that assistant messages have markdown-content class const markdownContent = await greetingMessage.locator('.markdown-content').count(); expect(markdownContent).toBe(1); - + // Check that it doesn't have the plain text class const plainContent = await greetingMessage.locator('.whitespace-pre-wrap').count(); expect(plainContent).toBe(0); }); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/eslint.config.js b/apps/v1/client/eslint.config.js index addebb02..9a86baef 100644 --- a/apps/v1/client/eslint.config.js +++ b/apps/v1/client/eslint.config.js @@ -26,7 +26,7 @@ export default tseslint.config( { files: ['**/*.{ts,tsx,js,jsx}'], plugins: { - 'react': reactPlugin, + react: reactPlugin, 'react-hooks': reactHooks, 'react-refresh': reactRefresh, }, @@ -66,5 +66,5 @@ export default tseslint.config( // Disable one-export-per-file for v1 '@claude-flow/one-export-per-file': 'off', }, - }, -); \ No newline at end of file + } +); diff --git a/apps/v1/client/package.json b/apps/v1/client/package.json index 401e1742..6bc16032 100644 --- a/apps/v1/client/package.json +++ b/apps/v1/client/package.json @@ -56,4 +56,4 @@ "typescript-eslint": "^8.34.1", "vite": "^7.0.0" } -} \ No newline at end of file +} diff --git a/apps/v1/client/playwright.config.ts b/apps/v1/client/playwright.config.ts index 89b2621d..003df121 100644 --- a/apps/v1/client/playwright.config.ts +++ b/apps/v1/client/playwright.config.ts @@ -18,7 +18,7 @@ export default defineConfig({ projects: [ { name: 'chromium', - use: { + use: { ...devices['Desktop Chrome'], launchOptions: { args: ['--no-sandbox', '--disable-setuid-sandbox'], @@ -26,4 +26,4 @@ export default defineConfig({ }, }, ], -}); \ No newline at end of file +}); diff --git a/apps/v1/client/postcss.config.cjs b/apps/v1/client/postcss.config.cjs index 96bb01e7..12a703d9 100644 --- a/apps/v1/client/postcss.config.cjs +++ b/apps/v1/client/postcss.config.cjs @@ -3,4 +3,4 @@ module.exports = { tailwindcss: {}, autoprefixer: {}, }, -} \ No newline at end of file +}; diff --git a/apps/v1/client/public/oauth-callback.html b/apps/v1/client/public/oauth-callback.html index cdbfd3c4..195774ee 100644 --- a/apps/v1/client/public/oauth-callback.html +++ b/apps/v1/client/public/oauth-callback.html @@ -1,105 +1,116 @@ - + - - GitHub OAuth Callback - - - -
-
-

Completing GitHub authentication...

-

Please wait while we complete the sign-in process.

-
- - - - \ No newline at end of file + } + + + diff --git a/apps/v1/client/src/App.tsx b/apps/v1/client/src/App.tsx index db408cad..ede0e250 100644 --- a/apps/v1/client/src/App.tsx +++ b/apps/v1/client/src/App.tsx @@ -48,10 +48,7 @@ function AppContent() { return ( <> - + {workspace.config && ( <> @@ -110,4 +107,4 @@ function App() { ); } -export default App; \ No newline at end of file +export default App; diff --git a/apps/v1/client/src/components/AnimatedOutlet.tsx b/apps/v1/client/src/components/AnimatedOutlet.tsx index 2a3664f2..2ffdc7a4 100644 --- a/apps/v1/client/src/components/AnimatedOutlet.tsx +++ b/apps/v1/client/src/components/AnimatedOutlet.tsx @@ -11,7 +11,7 @@ export function AnimatedOutlet() { const location = useLocation(); const currentOutlet = useOutlet(); const [items, setItems] = useState([ - { key: location.pathname, element: currentOutlet, state: 'active' } + { key: location.pathname, element: currentOutlet, state: 'active' }, ]); const timeoutRef = useRef | undefined>(undefined); const isFirstRender = useRef(true); @@ -30,27 +30,23 @@ export function AnimatedOutlet() { // Always animate on route change const newKey = `${location.pathname}-${Date.now()}`; - + // Mark existing as exiting and add new as entering - setItems(current => { - const exiting = current.map(item => ({ ...item, state: 'exiting' as const })); + setItems((current) => { + const exiting = current.map((item) => ({ ...item, state: 'exiting' as const })); return [...exiting, { key: newKey, element: currentOutlet, state: 'entering' }]; }); // Immediately activate the entering item requestAnimationFrame(() => { - setItems(current => - current.map(item => - item.key === newKey - ? { ...item, state: 'active' } - : item - ) + setItems((current) => + current.map((item) => (item.key === newKey ? { ...item, state: 'active' } : item)) ); }); // Clean up exiting items after animation timeoutRef.current = setTimeout(() => { - setItems(current => current.filter(item => item.state === 'active')); + setItems((current) => current.filter((item) => item.state === 'active')); }, 450); return () => { @@ -68,15 +64,15 @@ export function AnimatedOutlet() { className="absolute inset-0 transition-all duration-300 ease-out" style={{ opacity: item.state === 'active' ? 1 : 0, - transform: - item.state === 'active' - ? 'translateX(0)' + transform: + item.state === 'active' + ? 'translateX(0)' : item.state === 'entering' ? 'translateX(20px)' : 'translateX(-20px)', transitionDelay: item.state === 'entering' ? '200ms' : '0ms', pointerEvents: item.state === 'active' ? 'auto' : 'none', - zIndex: item.state === 'active' ? 2 : 1 + zIndex: item.state === 'active' ? 2 : 1, }} > {item.element} @@ -84,4 +80,4 @@ export function AnimatedOutlet() { ))}
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/AnimatedOutletWrapper.tsx b/apps/v1/client/src/components/AnimatedOutletWrapper.tsx index 5fa55a8d..14ce5629 100644 --- a/apps/v1/client/src/components/AnimatedOutletWrapper.tsx +++ b/apps/v1/client/src/components/AnimatedOutletWrapper.tsx @@ -8,15 +8,15 @@ interface AnimatedOutletWrapperProps { distance?: number; } -export function AnimatedOutletWrapper({ - className = '', +export function AnimatedOutletWrapper({ + className = '', delay = 200, - distance = 20 + distance = 20, }: AnimatedOutletWrapperProps) { const location = useLocation(); const outlet = useOutlet(); const direction = useNavigationDirection(); - + return ( ); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/AnimatedTransition.tsx b/apps/v1/client/src/components/AnimatedTransition.tsx index fea14366..c7f5a5c8 100644 --- a/apps/v1/client/src/components/AnimatedTransition.tsx +++ b/apps/v1/client/src/components/AnimatedTransition.tsx @@ -18,31 +18,31 @@ interface AnimationItem { timestamp: number; } -export function AnimatedTransition({ - children, - transitionKey, +export function AnimatedTransition({ + children, + transitionKey, className = '', delay = 100, distance = 20, reverse = false, - centered = true + centered = true, }: AnimatedTransitionProps) { const [items, setItems] = useState([ { key: transitionKey, content: children, state: 'active', - timestamp: Date.now() - } + timestamp: Date.now(), + }, ]); - + const prevKeyRef = useRef(transitionKey); const timeoutsRef = useRef>(new Map()); // Cleanup timeouts on unmount useEffect(() => { return () => { - timeoutsRef.current.forEach(timeout => clearTimeout(timeout)); + timeoutsRef.current.forEach((timeout) => clearTimeout(timeout)); timeoutsRef.current.clear(); }; }, []); @@ -51,12 +51,8 @@ export function AnimatedTransition({ // Skip if key hasn't changed if (prevKeyRef.current === transitionKey) { // Update the content of the active item without animation - setItems(current => - current.map(item => - item.state === 'active' - ? { ...item, content: children } - : item - ) + setItems((current) => + current.map((item) => (item.state === 'active' ? { ...item, content: children } : item)) ); return; } @@ -67,10 +63,10 @@ export function AnimatedTransition({ const newKey = `${transitionKey}-${Date.now()}`; // Mark all existing items as exiting - setItems(current => { - const exitingItems = current.map(item => ({ + setItems((current) => { + const exitingItems = current.map((item) => ({ ...item, - state: 'exiting' as const + state: 'exiting' as const, })); // Add new item as entering @@ -78,7 +74,7 @@ export function AnimatedTransition({ key: newKey, content: children, state: 'entering', - timestamp: Date.now() + timestamp: Date.now(), }; return [...exitingItems, newItem]; @@ -92,12 +88,8 @@ export function AnimatedTransition({ // Transition new item to active after delay const activateTimeout = setTimeout(() => { - setItems(current => - current.map(item => - item.key === newKey - ? { ...item, state: 'active' } - : item - ) + setItems((current) => + current.map((item) => (item.key === newKey ? { ...item, state: 'active' } : item)) ); }, delay); @@ -105,26 +97,23 @@ export function AnimatedTransition({ // Remove exiting items after animation completes const cleanupTimeout = setTimeout(() => { - setItems(current => - current.filter(item => item.state !== 'exiting') - ); - + setItems((current) => current.filter((item) => item.state !== 'exiting')); + // Clean up timeout references timeoutsRef.current.delete(`${newKey}-activate`); timeoutsRef.current.delete(`${newKey}-cleanup`); }, 300 + delay); // 300ms for exit animation + delay timeoutsRef.current.set(`${newKey}-cleanup`, cleanupTimeout); - }, [transitionKey, children, delay]); - const containerClasses = centered + const containerClasses = centered ? `relative flex items-center justify-center ${className}` : `relative ${className}`; - + const contentClasses = centered - ? "absolute inset-0 flex items-center justify-center" - : "absolute inset-0"; + ? 'absolute inset-0 flex items-center justify-center' + : 'absolute inset-0'; const getTransform = (state: AnimationItem['state'], reverse: boolean) => { switch (state) { @@ -147,7 +136,7 @@ export function AnimatedTransition({ opacity: item.state === 'active' ? 1 : 0, transform: getTransform(item.state, reverse), transition: `all 300ms cubic-bezier(0.4, 0, 0.2, 1)`, - pointerEvents: item.state === 'active' ? 'auto' : 'none' + pointerEvents: item.state === 'active' ? 'auto' : 'none', }} > {item.content} @@ -155,4 +144,4 @@ export function AnimatedTransition({ ))} ); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/AuthAvatar.tsx b/apps/v1/client/src/components/AuthAvatar.tsx index 4cf1a28c..6def06bf 100644 --- a/apps/v1/client/src/components/AuthAvatar.tsx +++ b/apps/v1/client/src/components/AuthAvatar.tsx @@ -64,114 +64,149 @@ export function AuthAvatar() { aria-label={activeAccount ? `Account menu for ${activeAccount.username}` : 'Sign in'} > {activeAccount ? ( - {activeAccount.username} ) : (
- - + +
)} {/* Dropdown Menu */} - -
+
- {/* Header */} -
-

GitHub Accounts

-
+ `} + > + {/* Header */} +
+

GitHub Accounts

+
- {/* Account List */} - {authState.accounts.length > 0 ? ( -
- {authState.accounts.map(account => ( -
handleSwitchAccount(account.id)} - className={` + {/* Account List */} + {authState.accounts.length > 0 ? ( +
+ {authState.accounts.map((account) => ( +
handleSwitchAccount(account.id)} + className={` px-4 py-3 cursor-pointer ${account.id === authState.activeAccountId ? styles.contentBg : ''} hover:${styles.contentBg} transition-colors border-b ${styles.contentBorder} last:border-b-0 `} - > -
-
- {account.username} -
-
- {account.username} -
-
- {account.accountType === 'enterprise' ? 'GitHub Enterprise' : 'Personal'} -
+ > +
+
+ {account.username} +
+
{account.username}
+
+ {account.accountType === 'enterprise' ? 'GitHub Enterprise' : 'Personal'}
-
- {account.id === authState.activeAccountId && ( - - Active - - )} -
+
+ {account.id === authState.activeAccountId && ( + + Active + + )} + -
+ + +
- ))} -
- ) : ( -
- - - -

No GitHub accounts connected

-
- )} +
+ ))} +
+ ) : ( +
+ + + +

No GitHub accounts connected

+
+ )} - {/* Add Account Button */} -
- -
+ > + + + + Add GitHub Account + +
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/AvatarGenerator.tsx b/apps/v1/client/src/components/AvatarGenerator.tsx index 987fe359..79d950ed 100644 --- a/apps/v1/client/src/components/AvatarGenerator.tsx +++ b/apps/v1/client/src/components/AvatarGenerator.tsx @@ -7,9 +7,30 @@ interface AvatarProps { } const randomNames = [ - 'Alex', 'Blake', 'Casey', 'Drew', 'Emery', 'Finley', 'Gray', 'Harper', - 'Indigo', 'Jamie', 'Kai', 'Logan', 'Morgan', 'Nova', 'Oakley', 'Phoenix', - 'Quinn', 'River', 'Sage', 'Taylor', 'Unity', 'Vale', 'Winter', 'Zion' + 'Alex', + 'Blake', + 'Casey', + 'Drew', + 'Emery', + 'Finley', + 'Gray', + 'Harper', + 'Indigo', + 'Jamie', + 'Kai', + 'Logan', + 'Morgan', + 'Nova', + 'Oakley', + 'Phoenix', + 'Quinn', + 'River', + 'Sage', + 'Taylor', + 'Unity', + 'Vale', + 'Winter', + 'Zion', ]; // Simple hash function to get consistent random values from seed @@ -17,7 +38,7 @@ function hashCode(str: string): number { let hash = 0; for (let i = 0; i < str.length; i++) { const char = str.charCodeAt(i); - hash = ((hash << 5) - hash) + char; + hash = (hash << 5) - hash + char; hash = hash & hash; } return Math.abs(hash); @@ -42,25 +63,35 @@ export function AvatarGenerator({ seed, size = 100, isDarkMode = false }: Avatar // Skin colors (warm tones) const skinColors = ['#FFE0BD', '#FFCD94', '#F3C9A3', '#DDB192', '#D4A574', '#C58C5F']; const skinColor = getRandomFromSeed(seed + 'skin', skinColors); - + // Hair colors - const hairColors = ['#2C1810', '#3D2314', '#5A3825', '#8B5A3C', '#D2691E', '#FFD700', '#FF6B6B', '#A8E6CF', '#9370DB']; + const hairColors = [ + '#2C1810', + '#3D2314', + '#5A3825', + '#8B5A3C', + '#D2691E', + '#FFD700', + '#FF6B6B', + '#A8E6CF', + '#9370DB', + ]; const hairColor = getRandomFromSeed(seed + 'hair', hairColors); - + // Hair styles (0-5 different styles) const hairStyle = getRandomNumberFromSeed(seed + 'hairstyle', 0, 5); - + // Eye style (0 = dots, 1 = curved lines) const eyeStyle = getRandomNumberFromSeed(seed + 'eyestyle', 0, 1); - + // Accessories const hasGlasses = getRandomNumberFromSeed(seed + 'glasses', 0, 3) === 0; - + return { skinColor, hairColor, hairStyle, eyeStyle, hasGlasses }; }, [seed]); - + const { skinColor, hairColor, hairStyle, eyeStyle, hasGlasses } = avatarData; - + return ( {/* Face - more oval shape */} - - + + {/* Hair */} {hairStyle === 0 && ( // Short neat hair - + )} {hairStyle === 1 && ( // Bob cut @@ -112,7 +134,10 @@ export function AvatarGenerator({ seed, size = 100, isDarkMode = false }: Avatar {hairStyle === 4 && ( // Pigtails <> - + @@ -126,7 +151,7 @@ export function AvatarGenerator({ seed, size = 100, isDarkMode = false }: Avatar fill={hairColor} /> )} - + {/* Eyes - cute dots or curved lines */} {eyeStyle === 0 ? ( // Dot eyes @@ -137,21 +162,39 @@ export function AvatarGenerator({ seed, size = 100, isDarkMode = false }: Avatar ) : ( // Happy curved line eyes <> - - + + )} - + {/* Simple nose */} - + {/* Cute smile */} - - + + {/* Cheeks (blush) */} - + {/* Glasses - rounder and cuter */} {hasGlasses && ( @@ -164,4 +207,4 @@ export function AvatarGenerator({ seed, size = 100, isDarkMode = false }: Avatar )} ); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/BackgroundPattern.tsx b/apps/v1/client/src/components/BackgroundPattern.tsx index 65229f01..8253e114 100644 --- a/apps/v1/client/src/components/BackgroundPattern.tsx +++ b/apps/v1/client/src/components/BackgroundPattern.tsx @@ -2,12 +2,15 @@ import { useTheme } from '../contexts/ThemeContextV2'; export function BackgroundPattern() { const { isDarkMode } = useTheme(); - + return ( -
+
{/* Gradient base */}
- + {/* Animated gradient orbs - more, bigger, more transparent */}
- + {/* Subtle grid pattern */} -
- + {/* Noise texture */} -
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/BackgroundPatternOptimized.tsx b/apps/v1/client/src/components/BackgroundPatternOptimized.tsx index 6afdf743..e2d1cbc5 100644 --- a/apps/v1/client/src/components/BackgroundPatternOptimized.tsx +++ b/apps/v1/client/src/components/BackgroundPatternOptimized.tsx @@ -2,73 +2,83 @@ import { useTheme } from '../contexts/ThemeContextV2'; export function BackgroundPattern() { const { isDarkMode } = useTheme(); - + return (
{/* Static gradient base - no performance cost */}
- + {/* Animated gradient circles - blues with orange/pink accents */}
{/* Blue circle - top left */}
- + {/* Vibrant orange circle - bottom right */}
- + {/* Sky blue circle - center */}
- + {/* Vibrant pink circle - top right */}
- + {/* Deep blue circle - bottom left */}
- + {/* Very subtle noise texture */} -
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/BackgroundPatternStatic.tsx b/apps/v1/client/src/components/BackgroundPatternStatic.tsx index 38c31f56..8c1278b7 100644 --- a/apps/v1/client/src/components/BackgroundPatternStatic.tsx +++ b/apps/v1/client/src/components/BackgroundPatternStatic.tsx @@ -2,14 +2,14 @@ import { useTheme } from '../contexts/ThemeContextV2'; export function BackgroundPattern() { const { isDarkMode } = useTheme(); - + return (
{/* Static gradient with mesh */} -
- + {/* Grid pattern for texture */} -
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ConfirmDialog.tsx b/apps/v1/client/src/components/ConfirmDialog.tsx index 8d6f3642..d6893872 100644 --- a/apps/v1/client/src/components/ConfirmDialog.tsx +++ b/apps/v1/client/src/components/ConfirmDialog.tsx @@ -20,7 +20,7 @@ export function ConfirmDialog({ cancelText = 'Cancel', onConfirm, onCancel, - variant = 'danger' + variant = 'danger', }: ConfirmDialogProps) { const { currentStyles } = useTheme(); const styles = currentStyles; @@ -38,35 +38,32 @@ export function ConfirmDialog({ return (
{/* Backdrop */} -
- + {/* Modal */}
-
+ `} + >
-

- {title} -

+

{title}

-

- {message} -

+

{message}

-
-
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/DropdownTransition.tsx b/apps/v1/client/src/components/DropdownTransition.tsx index 3b4fc85f..ba436ca9 100644 --- a/apps/v1/client/src/components/DropdownTransition.tsx +++ b/apps/v1/client/src/components/DropdownTransition.tsx @@ -9,17 +9,17 @@ interface DropdownTransitionProps { animationEnabled?: boolean; } -export function DropdownTransition({ - children, +export function DropdownTransition({ + children, isOpen, className = '', - animationEnabled = true + animationEnabled = true, }: DropdownTransitionProps) { const { animationsEnabled } = useTheme(); const [shouldRender, setShouldRender] = useState(false); const [isAnimating, setIsAnimating] = useState(false); const timeoutRef = useRef | undefined>(undefined); - + const shouldAnimate = animationEnabled && animationsEnabled; useEffect(() => { @@ -56,25 +56,24 @@ export function DropdownTransition({ if (!shouldRender) return null; - const animationStyles = shouldAnimate ? { - opacity: isAnimating ? 1 : 0, - transform: isAnimating ? 'translateY(0)' : 'translateY(-8px)', - transition: 'opacity 150ms ease-out, transform 150ms ease-out', - } : {}; + const animationStyles = shouldAnimate + ? { + opacity: isAnimating ? 1 : 0, + transform: isAnimating ? 'translateY(0)' : 'translateY(-8px)', + transition: 'opacity 150ms ease-out, transform 150ms ease-out', + } + : {}; // Merge animation styles with any height-related styles from className const finalStyles = { ...animationStyles, // Preserve height properties if className includes flex or height classes - ...(className.includes('flex-1') || className.includes('h-full') ? { height: '100%' } : {}) + ...(className.includes('flex-1') || className.includes('h-full') ? { height: '100%' } : {}), }; return ( -
+
{children}
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/FeedbackDialog.tsx b/apps/v1/client/src/components/FeedbackDialog.tsx index 09cbcf62..8651a37a 100644 --- a/apps/v1/client/src/components/FeedbackDialog.tsx +++ b/apps/v1/client/src/components/FeedbackDialog.tsx @@ -19,17 +19,17 @@ export function FeedbackDialog({ onClose, onSubmit, isSubmitting = false, - error = null + error = null, }: FeedbackDialogProps) { const { currentStyles } = useTheme(); const styles = currentStyles; const [feedback, setFeedback] = useState(''); const [validationError, setValidationError] = useState(null); const textAreaRef = useRef(null); - + // Setup draggable functionality const { dragRef, handleRef, style: dragStyle } = useDraggable(); - + // Focus the textarea when dialog opens useEffect(() => { if (isOpen && textAreaRef.current) { @@ -57,7 +57,7 @@ export function FeedbackDialog({ let actualBehavior = ''; let expectedBehavior = ''; let isExpectedSection = false; - + for (const line of lines) { const lowerLine = line.toLowerCase(); if (lowerLine.includes('expected:') || lowerLine.includes('what i expected:')) { @@ -78,7 +78,10 @@ export function FeedbackDialog({ } try { - await onSubmit(expectedBehavior.trim() || 'Not specified', actualBehavior.trim() || feedback.trim()); + await onSubmit( + expectedBehavior.trim() || 'Not specified', + actualBehavior.trim() || feedback.trim() + ); // Clear form on success setFeedback(''); } catch (err) { @@ -96,23 +99,21 @@ export function FeedbackDialog({ const dialogContent = (
{/* Backdrop */} -
- + {/* Modal */} -
-
+
-
+
@@ -144,9 +145,19 @@ export function FeedbackDialog({ />
-
- - +
+ + A screenshot will be included automatically
@@ -159,12 +170,10 @@ export function FeedbackDialog({
-
-
@@ -88,4 +93,4 @@ export function FeedbackSuccessDialog({ ); return createPortal(dialogContent, document.body); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/FolderBrowserDialog.tsx b/apps/v1/client/src/components/FolderBrowserDialog.tsx index 8469f636..e71cf484 100644 --- a/apps/v1/client/src/components/FolderBrowserDialog.tsx +++ b/apps/v1/client/src/components/FolderBrowserDialog.tsx @@ -50,7 +50,7 @@ export function FolderBrowserDialog({ isOpen, onSelect, onCancel }: FolderBrowse const response = await fetch('http://localhost:3000/api/browse/home'); if (response.ok) { const data = await response.json(); - loadDirectory(data.path); + loadDirectory(data.path); } else { setError('Failed to get home directory'); setIsLoading(false); @@ -64,25 +64,23 @@ export function FolderBrowserDialog({ isOpen, onSelect, onCancel }: FolderBrowse const loadDirectory = async (path: string, isGoingUp: boolean = false) => { if (!isOpen) return; - + // Only show loading on initial load if (!currentPath) { setIsLoading(true); } setError(null); setNavigationDirection(isGoingUp ? 'backward' : 'forward'); - - + try { const response = await fetch('http://localhost:3000/api/browse/list', { method: 'POST', headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ path }) + body: JSON.stringify({ path }), }); - if (response.ok) { const data: BrowseResponse = await response.json(); setCurrentPath(data.currentPath); @@ -141,10 +139,10 @@ export function FolderBrowserDialog({ isOpen, onSelect, onCancel }: FolderBrowse headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ + body: JSON.stringify({ parentPath: currentPath, - folderName: trimmedName - }) + folderName: trimmedName, + }), }); if (response.ok) { @@ -174,145 +172,171 @@ export function FolderBrowserDialog({ isOpen, onSelect, onCancel }: FolderBrowse } }; - if (!isOpen) return null; const renderContent = () => ( -
- {/* Header */} -
-

- Select folder -

-
+ `} + > + {/* Header */} +
+

Select folder

+
- {/* Current path */} -
-
- Current path: - - {currentPath || 'Loading...'} - -
-
+ {/* Current path */} +
+
+ Current path: + + {currentPath || 'Loading...'} + +
+
- {/* Browser */} -
- {isLoading ? ( -
- -
- ) : error ? ( -
- {error} -
- ) : ( - -
- {/* New folder input */} - {isCreatingFolder && ( -
- - - - setNewFolderName(e.target.value)} - onKeyDown={handleKeyDown} - onBlur={() => { - if (!newFolderName.trim()) { - handleCancelCreate(); - } - }} - placeholder="Folder name" - autoFocus - className={` + {/* Browser */} +
+ {isLoading ? ( +
+ +
+ ) : error ? ( +
{error}
+ ) : ( + +
+ {/* New folder input */} + {isCreatingFolder && ( +
+ + + + setNewFolderName(e.target.value)} + onKeyDown={handleKeyDown} + onBlur={() => { + if (!newFolderName.trim()) { + handleCancelCreate(); + } + }} + placeholder="Folder name" + autoFocus + className={` flex-1 px-2 py-1 text-sm ${styles.contentBg} ${styles.textColor} border-0 outline-none focus:ring-0 `} - /> -
- )} + /> +
+ )} - {/* Go up button */} - {parentPath && parentPath !== currentPath && ( - - )} + > + + + + .. + + )} - {/* Directory items */} - {items.map((item) => ( - - ))} - -
- - )} -
- - {/* Footer */} -
- -
- - + > + + + + {item.name} + + ))}
-
+ + )} +
+ + {/* Footer */} +
+ +
+ +
+
+
); // Check if we're being rendered inside another modal container @@ -326,11 +350,9 @@ export function FolderBrowserDialog({ isOpen, onSelect, onCancel }: FolderBrowse
{/* Backdrop */}
- + {/* Modal */} -
- {renderContent()} -
+
{renderContent()}
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ImportingWorkspaceDialog.tsx b/apps/v1/client/src/components/ImportingWorkspaceDialog.tsx index a65a84a2..ef3f1d31 100644 --- a/apps/v1/client/src/components/ImportingWorkspaceDialog.tsx +++ b/apps/v1/client/src/components/ImportingWorkspaceDialog.tsx @@ -25,10 +25,10 @@ interface ImportingWorkspaceDialogProps { onComplete: () => void; } -export function ImportingWorkspaceDialog({ - isOpen, +export function ImportingWorkspaceDialog({ + isOpen, workspacePath, - onComplete + onComplete, }: ImportingWorkspaceDialogProps) { const { currentStyles } = useTheme(); const styles = currentStyles; @@ -46,7 +46,7 @@ export function ImportingWorkspaceDialog({ { id: '3', description: 'Extracting repository information', status: 'pending' }, { id: '4', description: 'Analyzing project structure', status: 'pending' }, { id: '5', description: 'Importing work items', status: 'pending' }, - { id: '6', description: 'Finalizing workspace setup', status: 'pending' } + { id: '6', description: 'Finalizing workspace setup', status: 'pending' }, ]; setTasks(initialTasks); setCurrentTaskIndex(0); @@ -57,83 +57,96 @@ export function ImportingWorkspaceDialog({ if (currentTaskIndex >= 0 && currentTaskIndex < tasks.length) { // Start processing current task const timer = setTimeout(() => { - setTasks(prev => prev.map((task, index) => { - if (index === currentTaskIndex) { - return { ...task, status: 'processing' }; - } - return task; - })); + setTasks((prev) => + prev.map((task, index) => { + if (index === currentTaskIndex) { + return { ...task, status: 'processing' }; + } + return task; + }) + ); // Simulate task completion - setTimeout(async () => { - let fetchedProjects: ImportedProject[] = []; - - // For the reading project configurations task, actually fetch the data - if (currentTaskIndex === 1) { - try { - console.log('Fetching workspace data for:', workspacePath); - const response = await fetch('http://localhost:3000/api/workspace/read', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ workspacePath }) - }); - - if (response.ok) { - const data = await response.json(); - console.log('Workspace data received:', data); - fetchedProjects = data.projects.map((proj: any) => ({ - name: proj.name, - description: proj.readme ? extractDescription(proj.readme) : 'No description available', - purpose: proj.purpose, - repositories: proj.repositories || [], - workItemCount: proj.plans ? - Object.values(proj.plans).flat().length : 0 - })); - console.log('Imported projects:', fetchedProjects); + setTimeout( + async () => { + let fetchedProjects: ImportedProject[] = []; + + // For the reading project configurations task, actually fetch the data + if (currentTaskIndex === 1) { + try { + console.log('Fetching workspace data for:', workspacePath); + const response = await fetch('http://localhost:3000/api/workspace/read', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ workspacePath }), + }); + + if (response.ok) { + const data = await response.json(); + console.log('Workspace data received:', data); + fetchedProjects = data.projects.map((proj: any) => ({ + name: proj.name, + description: proj.readme + ? extractDescription(proj.readme) + : 'No description available', + purpose: proj.purpose, + repositories: proj.repositories || [], + workItemCount: proj.plans ? Object.values(proj.plans).flat().length : 0, + })); + console.log('Imported projects:', fetchedProjects); + setProjects(fetchedProjects); + } else { + console.error('Failed to read workspace:', response.status, response.statusText); + } + } catch (error) { + console.error('Error reading workspace:', error); + // If fetch fails, use mock data for testing + console.log('Using mock data due to fetch error'); + fetchedProjects = [ + { + name: 'project-management-ux-exploration', + description: + 'An exploratory web application to prototype and iterate on UX ideas', + purpose: 'Prototype and iterate on UX ideas for managing projects', + repositories: [ + { + url: 'local://development', + type: 'github' as const, + visibility: 'private' as const, + isPrimary: true, + }, + ], + workItemCount: 0, + }, + ]; setProjects(fetchedProjects); - } else { - console.error('Failed to read workspace:', response.status, response.statusText); } - } catch (error) { - console.error('Error reading workspace:', error); - // If fetch fails, use mock data for testing - console.log('Using mock data due to fetch error'); - fetchedProjects = [{ - name: 'project-management-ux-exploration', - description: 'An exploratory web application to prototype and iterate on UX ideas', - purpose: 'Prototype and iterate on UX ideas for managing projects', - repositories: [{ - url: 'local://development', - type: 'github' as const, - visibility: 'private' as const, - isPrimary: true - }], - workItemCount: 0 - }]; - setProjects(fetchedProjects); } - } - // Use the fetched projects or current state for task details - const projectsToUse = currentTaskIndex === 1 ? fetchedProjects : projects; - - setTasks(prev => prev.map((task, index) => { - if (index === currentTaskIndex) { - return { - ...task, - status: 'completed', - details: getTaskDetails(index, projectsToUse) - }; - } - return task; - })); + // Use the fetched projects or current state for task details + const projectsToUse = currentTaskIndex === 1 ? fetchedProjects : projects; + + setTasks((prev) => + prev.map((task, index) => { + if (index === currentTaskIndex) { + return { + ...task, + status: 'completed', + details: getTaskDetails(index, projectsToUse), + }; + } + return task; + }) + ); - if (currentTaskIndex < tasks.length - 1) { - setCurrentTaskIndex(currentTaskIndex + 1); - } else { - setIsComplete(true); - } - }, 200 + Math.random() * 300); // Variable completion time (200-500ms) + if (currentTaskIndex < tasks.length - 1) { + setCurrentTaskIndex(currentTaskIndex + 1); + } else { + setIsComplete(true); + } + }, + 200 + Math.random() * 300 + ); // Variable completion time (200-500ms) }, 50); // Start processing faster return () => clearTimeout(timer); @@ -153,19 +166,24 @@ export function ImportingWorkspaceDialog({ const getTaskDetails = (taskIndex: number, projectList: ImportedProject[]): string => { switch (taskIndex) { - case 0: return 'Found projects folder'; - case 1: return `Found ${projectList.length} project${projectList.length !== 1 ? 's' : ''}`; + case 0: + return 'Found projects folder'; + case 1: + return `Found ${projectList.length} project${projectList.length !== 1 ? 's' : ''}`; case 2: { const totalRepos = projectList.reduce((sum, p) => sum + p.repositories.length, 0); return `Discovered ${totalRepos} repositor${totalRepos !== 1 ? 'ies' : 'y'}`; } - case 3: return 'Structure analyzed successfully'; + case 3: + return 'Structure analyzed successfully'; case 4: { const totalWorkItems = projectList.reduce((sum, p) => sum + p.workItemCount, 0); return `Imported ${totalWorkItems} work item${totalWorkItems !== 1 ? 's' : ''}`; } - case 5: return 'Workspace ready'; - default: return ''; + case 5: + return 'Workspace ready'; + default: + return ''; } }; @@ -173,18 +191,31 @@ export function ImportingWorkspaceDialog({ switch (status) { case 'completed': return ( - + ); case 'processing': - return ( - - ); + return ; case 'error': return ( - - + + ); default: @@ -198,19 +229,19 @@ export function ImportingWorkspaceDialog({ {/* Backdrop */}
- + {/* Modal */}
-
+ `} + > {/* Header */}
-

- Importing workspace -

+

Importing workspace

Discovering and importing existing projects from {workspacePath}

@@ -222,16 +253,19 @@ export function ImportingWorkspaceDialog({
{tasks.map((task) => (
-
- {getStatusIcon(task.status)} -
+
{getStatusIcon(task.status)}
-
+
{task.description}
-
+
{task.details || '\u00A0' /* non-breaking space to maintain height */}
@@ -242,21 +276,34 @@ export function ImportingWorkspaceDialog({ {/* Projects summary with fixed height */}
{projects.length > 0 ? ( -
+

Discovered projects

{projects.map((project, index) => ( -
+
{project.name}
-
{project.description}
+
+ {project.description} +
{project.repositories.length > 0 && ( - {project.repositories.length} repositor{project.repositories.length !== 1 ? 'ies' : 'y'} + + {project.repositories.length} repositor + {project.repositories.length !== 1 ? 'ies' : 'y'} + )} {project.workItemCount > 0 && ( - {project.workItemCount} work item{project.workItemCount !== 1 ? 's' : ''} + + {project.workItemCount} work item + {project.workItemCount !== 1 ? 's' : ''} + )}
@@ -264,7 +311,9 @@ export function ImportingWorkspaceDialog({
) : ( -
+
Scanning for projects...
)} @@ -290,4 +339,4 @@ export function ImportingWorkspaceDialog({
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/Layout.tsx b/apps/v1/client/src/components/Layout.tsx index 52013526..7d18ad47 100644 --- a/apps/v1/client/src/components/Layout.tsx +++ b/apps/v1/client/src/components/Layout.tsx @@ -2,9 +2,9 @@ import { Link, Outlet, useLocation } from 'react-router-dom'; export function Layout() { const location = useLocation(); - + const isActive = (path: string) => location.pathname === path; - + return (
- +
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/Portal.tsx b/apps/v1/client/src/components/Portal.tsx index c68cc9f0..423d0f3b 100644 --- a/apps/v1/client/src/components/Portal.tsx +++ b/apps/v1/client/src/components/Portal.tsx @@ -12,15 +12,15 @@ export function Portal({ children, containerId = 'portal-root' }: PortalProps) { useEffect(() => { // Find or create the container element let container = document.getElementById(containerId); - + if (!container) { container = document.createElement('div'); container.id = containerId; document.body.appendChild(container); } - + containerRef.current = container; - + // Cleanup: only remove if we created it and it's empty return () => { if (container && container.childNodes.length === 0) { @@ -34,4 +34,4 @@ export function Portal({ children, containerId = 'portal-root' }: PortalProps) { } return createPortal(children, containerRef.current); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ProjectDeleteDialog.tsx b/apps/v1/client/src/components/ProjectDeleteDialog.tsx index 25208830..d43deb00 100644 --- a/apps/v1/client/src/components/ProjectDeleteDialog.tsx +++ b/apps/v1/client/src/components/ProjectDeleteDialog.tsx @@ -12,7 +12,12 @@ interface ProjectDeleteDialogProps { onCancel: () => void; } -export function ProjectDeleteDialog({ isOpen, project, onConfirm, onCancel }: ProjectDeleteDialogProps) { +export function ProjectDeleteDialog({ + isOpen, + project, + onConfirm, + onCancel, +}: ProjectDeleteDialogProps) { const { currentStyles } = useTheme(); const styles = currentStyles; const [isDeleting, setIsDeleting] = useState(false); @@ -34,22 +39,24 @@ export function ProjectDeleteDialog({ isOpen, project, onConfirm, onCancel }: Pr
- + -
+ `} + >

Confirm removing project

- +

Do you want to remove the project "{project.name}"?

- +
- -
@@ -78,4 +77,4 @@ export function ProjectDeleteDialog({ isOpen, project, onConfirm, onCancel }: Pr
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/SettingsMenu.tsx b/apps/v1/client/src/components/SettingsMenu.tsx index 9e94cfb3..5b923fad 100644 --- a/apps/v1/client/src/components/SettingsMenu.tsx +++ b/apps/v1/client/src/components/SettingsMenu.tsx @@ -7,7 +7,13 @@ import { DropdownTransition } from './DropdownTransition'; export function SettingsMenu() { const [isOpen, setIsOpen] = useState(false); const [showSettingsModal, setShowSettingsModal] = useState(false); - const { currentStyles, toggleDarkMode, isDarkMode, toggleBackgroundEffect, backgroundEffectEnabled } = useTheme(); + const { + currentStyles, + toggleDarkMode, + isDarkMode, + toggleBackgroundEffect, + backgroundEffectEnabled, + } = useTheme(); const { showToast } = useToast(); const styles = currentStyles; const menuRef = useRef(null); @@ -29,87 +35,127 @@ export function SettingsMenu() { label: 'Settings', icon: ( - - + + ), onClick: () => { setShowSettingsModal(true); setIsOpen(false); - } + }, }, { label: 'divider', - isDivider: true + isDivider: true, }, { label: isDarkMode ? 'Light mode' : 'Dark mode', icon: isDarkMode ? ( - + ) : ( - + ), onClick: () => { toggleDarkMode(); - } + }, }, { label: backgroundEffectEnabled ? 'Disable background' : 'Enable background', icon: ( - + ), onClick: () => { toggleBackgroundEffect(); - } + }, }, { label: 'divider', - isDivider: true + isDivider: true, }, { label: 'Keyboard shortcuts', icon: ( - + ), onClick: () => { // TODO: Show keyboard shortcuts modal showToast('Keyboard shortcuts coming soon!', 'info'); setIsOpen(false); - } + }, }, { label: 'Help & documentation', icon: ( - + ), onClick: () => { window.open('https://github.com/dzearing/project-mgmt-ux', '_blank'); setIsOpen(false); - } + }, }, { label: 'About Claude Flow', icon: ( - + ), onClick: () => { // TODO: Show about modal showToast('Claude Flow v1.0.0 - AI-powered project management', 'info'); setIsOpen(false); - } - } + }, + }, ]; return ( @@ -124,17 +170,37 @@ export function SettingsMenu() { focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 `} > - - - + + + - -
+
+ `} + >
{menuItems.map((item, index) => { if (item.isDivider) { @@ -160,10 +226,7 @@ export function SettingsMenu() {
- setShowSettingsModal(false)} - /> + setShowSettingsModal(false)} />
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/SettingsModal.tsx b/apps/v1/client/src/components/SettingsModal.tsx index 0373f279..2186e9eb 100644 --- a/apps/v1/client/src/components/SettingsModal.tsx +++ b/apps/v1/client/src/components/SettingsModal.tsx @@ -13,7 +13,15 @@ interface SettingsModalProps { } export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { - const { currentStyles, isDarkMode, toggleDarkMode, backgroundEffectEnabled, toggleBackgroundEffect, animationsEnabled, toggleAnimations } = useTheme(); + const { + currentStyles, + isDarkMode, + toggleDarkMode, + backgroundEffectEnabled, + toggleBackgroundEffect, + animationsEnabled, + toggleAnimations, + } = useTheme(); const { workspace, setWorkspacePath, reloadWorkspace } = useWorkspace(); const { showToast } = useToast(); const styles = currentStyles; @@ -43,7 +51,6 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { } }, [isOpen, workspace.config?.path]); - const handleMockModeChange = (newValue: boolean) => { setMockMode(newValue); localStorage.setItem('mockMode', JSON.stringify(newValue)); @@ -53,29 +60,33 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { return ( {/* Backdrop */} -
- + {/* Modal */}
-
+ `} + > {/* Header */} -
+

Settings

- + - +
@@ -85,16 +96,17 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { {[ { id: 'workspace', label: 'Workspace' }, { id: 'appearance', label: 'Appearance' }, - { id: 'features', label: 'Features' } - ].map(tab => ( + { id: 'features', label: 'Features' }, + ].map((tab) => (
- +

- {workspace.config ? `Current: ${workspace.config.path}` : 'No workspace configured'} + {workspace.config + ? `Current: ${workspace.config.path}` + : 'No workspace configured'}

@@ -182,11 +208,13 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { - + `} + > @@ -217,8 +247,10 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { {activeTab === 'appearance' && (
-

Appearance settings

- +

+ Appearance settings +

+
Font size - + `} + > @@ -287,8 +323,10 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) { {activeTab === 'features' && (
-

Feature settings

- +

+ Feature settings +

+
-
+

- {mockMode - ? "Mock mode is enabled. AI features will use simulated responses." - : "Mock mode is disabled. AI features will use Claude API."} + {mockMode + ? 'Mock mode is enabled. AI features will use simulated responses.' + : 'Mock mode is disabled. AI features will use Claude API.'}

-

AI assistant features

- +

+ AI assistant features +

+
- + {}} label="Persona suggestions" className="justify-between" /> - + {}} @@ -333,8 +375,10 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) {
-

Notifications

- +

+ Notifications +

+
- + {}} label="Email notifications" className="justify-between" /> - + {}} @@ -365,7 +409,9 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) {
{/* Footer */} -
+
@@ -385,4 +431,4 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) {
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/StockPhotoAvatar.tsx b/apps/v1/client/src/components/StockPhotoAvatar.tsx index c45b4860..bd0d492e 100644 --- a/apps/v1/client/src/components/StockPhotoAvatar.tsx +++ b/apps/v1/client/src/components/StockPhotoAvatar.tsx @@ -8,50 +8,273 @@ interface StockPhotoAvatarProps { } const maleNames = [ - 'James', 'John', 'Robert', 'Michael', 'William', 'David', 'Richard', 'Joseph', - 'Thomas', 'Daniel', 'Matthew', 'Andrew', 'Paul', 'Joshua', 'Kenneth', 'Kevin', - 'Brian', 'George', 'Steven', 'Edward', 'Ronald', 'Timothy', 'Jason', 'Jeffrey', - 'Ryan', 'Jacob', 'Gary', 'Nicholas', 'Eric', 'Jonathan', 'Stephen', 'Larry', - 'Justin', 'Scott', 'Brandon', 'Benjamin', 'Samuel', 'Frank', 'Gregory', 'Raymond', - 'Alexander', 'Patrick', 'Jack', 'Dennis', 'Jerry', 'Tyler', 'Aaron', 'Jose', - 'Nathan', 'Henry', 'Zachary', 'Douglas', 'Peter', 'Adam', 'Kyle', 'Noah', - 'Charles', 'Christopher', 'Anthony', 'Mark', 'Donald', 'Kenneth', 'Steven', 'Albert', - 'Willie', 'Elijah', 'Wayne', 'Jordan', 'Dylan', 'Arthur', 'Bryan', 'Carl', - 'Christian', 'Eugene', 'Russell', 'Louis', 'Philip', 'Johnny', 'Austin', 'Gabriel', - 'Logan', 'Albert', 'Juan', 'Vincent', 'Ralph', 'Roy', 'Eugene', 'Randy', - 'Mason', 'Russell', 'Louis', 'Philip', 'Johnny', 'Harry', 'Jesse', 'Craig', - 'Alan', 'Ralph', 'Willie', 'Albert', 'Wayne', 'Ethan', 'Jeremy', 'Keith', - 'Terry', 'Sean', 'Gerald', 'Carl', 'Harold', 'Jordan', 'Jesse', 'Bryan', - 'Lawrence', 'Arthur', 'Gabriel', 'Bruce', 'Logan', 'Juan', 'Elijah', 'Willie', - 'Albert', 'Mason', 'Vincent', 'Ralph', 'Roy', 'Eugene', 'Russell', 'Louis' + 'James', + 'John', + 'Robert', + 'Michael', + 'William', + 'David', + 'Richard', + 'Joseph', + 'Thomas', + 'Daniel', + 'Matthew', + 'Andrew', + 'Paul', + 'Joshua', + 'Kenneth', + 'Kevin', + 'Brian', + 'George', + 'Steven', + 'Edward', + 'Ronald', + 'Timothy', + 'Jason', + 'Jeffrey', + 'Ryan', + 'Jacob', + 'Gary', + 'Nicholas', + 'Eric', + 'Jonathan', + 'Stephen', + 'Larry', + 'Justin', + 'Scott', + 'Brandon', + 'Benjamin', + 'Samuel', + 'Frank', + 'Gregory', + 'Raymond', + 'Alexander', + 'Patrick', + 'Jack', + 'Dennis', + 'Jerry', + 'Tyler', + 'Aaron', + 'Jose', + 'Nathan', + 'Henry', + 'Zachary', + 'Douglas', + 'Peter', + 'Adam', + 'Kyle', + 'Noah', + 'Charles', + 'Christopher', + 'Anthony', + 'Mark', + 'Donald', + 'Kenneth', + 'Steven', + 'Albert', + 'Willie', + 'Elijah', + 'Wayne', + 'Jordan', + 'Dylan', + 'Arthur', + 'Bryan', + 'Carl', + 'Christian', + 'Eugene', + 'Russell', + 'Louis', + 'Philip', + 'Johnny', + 'Austin', + 'Gabriel', + 'Logan', + 'Albert', + 'Juan', + 'Vincent', + 'Ralph', + 'Roy', + 'Eugene', + 'Randy', + 'Mason', + 'Russell', + 'Louis', + 'Philip', + 'Johnny', + 'Harry', + 'Jesse', + 'Craig', + 'Alan', + 'Ralph', + 'Willie', + 'Albert', + 'Wayne', + 'Ethan', + 'Jeremy', + 'Keith', + 'Terry', + 'Sean', + 'Gerald', + 'Carl', + 'Harold', + 'Jordan', + 'Jesse', + 'Bryan', + 'Lawrence', + 'Arthur', + 'Gabriel', + 'Bruce', + 'Logan', + 'Juan', + 'Elijah', + 'Willie', + 'Albert', + 'Mason', + 'Vincent', + 'Ralph', + 'Roy', + 'Eugene', + 'Russell', + 'Louis', ]; const femaleNames = [ - 'Mary', 'Patricia', 'Jennifer', 'Linda', 'Elizabeth', 'Barbara', 'Susan', 'Jessica', - 'Sarah', 'Karen', 'Nancy', 'Lisa', 'Betty', 'Dorothy', 'Sandra', 'Ashley', - 'Kimberly', 'Emily', 'Donna', 'Michelle', 'Carol', 'Amanda', 'Melissa', 'Deborah', - 'Stephanie', 'Rebecca', 'Sharon', 'Laura', 'Cynthia', 'Kathleen', 'Amy', 'Angela', - 'Shirley', 'Anna', 'Brenda', 'Emma', 'Helen', 'Pamela', 'Nicole', 'Samantha', - 'Katherine', 'Christine', 'Debra', 'Rachel', 'Janet', 'Catherine', 'Maria', 'Heather', - 'Diane', 'Ruth', 'Julie', 'Olivia', 'Joyce', 'Virginia', 'Victoria', 'Kelly', - 'Lauren', 'Christina', 'Joan', 'Evelyn', 'Judith', 'Megan', 'Andrea', 'Cheryl', - 'Hannah', 'Martha', 'Madison', 'Teresa', 'Gloria', 'Sara', 'Janice', 'Marie', - 'Julia', 'Grace', 'Judy', 'Theresa', 'Rose', 'Beverly', 'Denise', 'Marilyn', - 'Amber', 'Danielle', 'Abigail', 'Brittany', 'Kathryn', 'Diana', 'Lori', 'Tiffany', - 'Alexis', 'Kayla', 'Frances', 'Ann', 'Alice', 'Jean', 'Doris', 'Jacqueline', - 'Natalie', 'Charlotte', 'Marie', 'Janet', 'Catherine', 'Frances', 'Christina', 'Samantha', - 'Deborah', 'Janet', 'Carolyn', 'Rachel', 'Martha', 'Maria', 'Heather', 'Diane', - 'Sophia', 'Isabella', 'Mia', 'Ava', 'Chloe', 'Zoey', 'Lily', 'Madison', - 'Ella', 'Avery', 'Sofia', 'Scarlett', 'Grace', 'Victoria', 'Aria', 'Luna' + 'Mary', + 'Patricia', + 'Jennifer', + 'Linda', + 'Elizabeth', + 'Barbara', + 'Susan', + 'Jessica', + 'Sarah', + 'Karen', + 'Nancy', + 'Lisa', + 'Betty', + 'Dorothy', + 'Sandra', + 'Ashley', + 'Kimberly', + 'Emily', + 'Donna', + 'Michelle', + 'Carol', + 'Amanda', + 'Melissa', + 'Deborah', + 'Stephanie', + 'Rebecca', + 'Sharon', + 'Laura', + 'Cynthia', + 'Kathleen', + 'Amy', + 'Angela', + 'Shirley', + 'Anna', + 'Brenda', + 'Emma', + 'Helen', + 'Pamela', + 'Nicole', + 'Samantha', + 'Katherine', + 'Christine', + 'Debra', + 'Rachel', + 'Janet', + 'Catherine', + 'Maria', + 'Heather', + 'Diane', + 'Ruth', + 'Julie', + 'Olivia', + 'Joyce', + 'Virginia', + 'Victoria', + 'Kelly', + 'Lauren', + 'Christina', + 'Joan', + 'Evelyn', + 'Judith', + 'Megan', + 'Andrea', + 'Cheryl', + 'Hannah', + 'Martha', + 'Madison', + 'Teresa', + 'Gloria', + 'Sara', + 'Janice', + 'Marie', + 'Julia', + 'Grace', + 'Judy', + 'Theresa', + 'Rose', + 'Beverly', + 'Denise', + 'Marilyn', + 'Amber', + 'Danielle', + 'Abigail', + 'Brittany', + 'Kathryn', + 'Diana', + 'Lori', + 'Tiffany', + 'Alexis', + 'Kayla', + 'Frances', + 'Ann', + 'Alice', + 'Jean', + 'Doris', + 'Jacqueline', + 'Natalie', + 'Charlotte', + 'Marie', + 'Janet', + 'Catherine', + 'Frances', + 'Christina', + 'Samantha', + 'Deborah', + 'Janet', + 'Carolyn', + 'Rachel', + 'Martha', + 'Maria', + 'Heather', + 'Diane', + 'Sophia', + 'Isabella', + 'Mia', + 'Ava', + 'Chloe', + 'Zoey', + 'Lily', + 'Madison', + 'Ella', + 'Avery', + 'Sofia', + 'Scarlett', + 'Grace', + 'Victoria', + 'Aria', + 'Luna', ]; - // Simple hash function to get consistent random values from seed export function hashCode(str: string): number { let hash = 0; for (let i = 0; i < str.length; i++) { const char = str.charCodeAt(i); - hash = ((hash << 5) - hash) + char; + hash = (hash << 5) - hash + char; hash = hash & hash; } return Math.abs(hash); @@ -59,16 +282,21 @@ export function hashCode(str: string): number { export function getRandomName(seed: string, gender?: 'male' | 'female' | 'any'): string { // If gender is explicitly provided and not 'any', use it - const actualGender = (gender && gender !== 'any') - ? gender - : getGenderFromSeed(seed); - + const actualGender = gender && gender !== 'any' ? gender : getGenderFromSeed(seed); + const nameList = actualGender === 'male' ? maleNames : femaleNames; const index = hashCode(seed) % nameList.length; - + const name = nameList[index]; - console.log('getRandomName:', { seed, gender, actualGender, index, name, isMale: actualGender === 'male' }); - + console.log('getRandomName:', { + seed, + gender, + actualGender, + index, + name, + isMale: actualGender === 'male', + }); + return name; } @@ -82,36 +310,36 @@ export function StockPhotoAvatar({ seed, size = 80, gender = 'any' }: StockPhoto console.log('StockPhotoAvatar gender:', { seed, gender, actualGender: g }); return g; }, [seed, gender]); - + const avatarUrl = useMemo(() => { // Using randomuser.me API which provides real photos of people // The seed ensures we get the same photo for the same input const genderFolder = actualGender === 'female' ? 'women' : 'men'; const photoIndex = hashCode(seed) % 100; - + console.log('StockPhotoAvatar URL:', { seed, actualGender, genderFolder, photoIndex }); - + return `https://randomuser.me/api/portraits/${genderFolder}/${photoIndex}.jpg`; }, [seed, actualGender]); - + // Determine border color based on gender const borderColor = actualGender === 'female' ? '#EC4899' : '#3B82F6'; // pink-500 : blue-500 - + return ( -
-
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ThemeSwitcher.tsx b/apps/v1/client/src/components/ThemeSwitcher.tsx index 38e67e52..fda5309e 100644 --- a/apps/v1/client/src/components/ThemeSwitcher.tsx +++ b/apps/v1/client/src/components/ThemeSwitcher.tsx @@ -4,8 +4,8 @@ import { useEffect } from 'react'; export function ThemeSwitcher() { const { currentTheme, setTheme, nextTheme, previousTheme } = useTheme(); - const currentIndex = themes.findIndex(t => t.id === currentTheme.id); - + const currentIndex = themes.findIndex((t) => t.id === currentTheme.id); + useEffect(() => { const handleKeyPress = (e: KeyboardEvent) => { if (e.ctrlKey || e.metaKey) { @@ -18,24 +18,26 @@ export function ThemeSwitcher() { } } }; - + window.addEventListener('keydown', handleKeyPress); return () => window.removeEventListener('keydown', handleKeyPress); }, [nextTheme, previousTheme]); - + return (

Theme Switcher

- {currentIndex + 1} / {themes.length} + + {currentIndex + 1} / {themes.length} +
- +

{currentTheme.name}

{currentTheme.description}

- +
- +
{themes.map((theme, index) => ( ))}
- +
Use Ctrl/Cmd + Arrow keys or click to switch themes
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ThemeSwitcherV2.tsx b/apps/v1/client/src/components/ThemeSwitcherV2.tsx index 0f40c2cd..da9ee5bc 100644 --- a/apps/v1/client/src/components/ThemeSwitcherV2.tsx +++ b/apps/v1/client/src/components/ThemeSwitcherV2.tsx @@ -3,17 +3,26 @@ import { themesV2 } from '../config/themesV2'; import { useEffect, useState } from 'react'; export function ThemeSwitcherV2() { - const { currentTheme, isDarkMode, setTheme, nextTheme, previousTheme, toggleDarkMode, backgroundEffectEnabled, toggleBackgroundEffect } = useTheme(); - const currentIndex = themesV2.findIndex(t => t.id === currentTheme.id); + const { + currentTheme, + isDarkMode, + setTheme, + nextTheme, + previousTheme, + toggleDarkMode, + backgroundEffectEnabled, + toggleBackgroundEffect, + } = useTheme(); + const currentIndex = themesV2.findIndex((t) => t.id === currentTheme.id); const [isMinimized, setIsMinimized] = useState(() => { const saved = localStorage.getItem('themeSwitcherMinimized'); return saved === 'true'; }); - + useEffect(() => { localStorage.setItem('themeSwitcherMinimized', isMinimized.toString()); }, [isMinimized]); - + useEffect(() => { const handleKeyPress = (e: KeyboardEvent) => { if (e.ctrlKey || e.metaKey) { @@ -26,11 +35,11 @@ export function ThemeSwitcherV2() { } } }; - + window.addEventListener('keydown', handleKeyPress); return () => window.removeEventListener('keydown', handleKeyPress); }, [nextTheme, previousTheme, toggleDarkMode, toggleBackgroundEffect]); - + return (
{isMinimized ? ( @@ -39,108 +48,131 @@ export function ThemeSwitcherV2() { className="bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 p-3 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors" title="Expand theme switcher" > - - + + ) : (
-

Theme Switcher

+

+ Theme Switcher +

- {currentIndex + 1} / {themesV2.length} + + {currentIndex + 1} / {themesV2.length} +
- - {/* Dark Mode Toggle */} -
- Dark Mode - -
- - {/* Background Effect Toggle */} -
- Background Effect - +
+ + {/* Background Effect Toggle */} +
+ Background Effect + -
- -
-

{currentTheme.name}

-

{currentTheme.description}

-
- -
- - -
- -
- {themesV2.map((theme, index) => ( + /> + +
+ +
+

{currentTheme.name}

+

+ {currentTheme.description} +

+
+ +
- ))} -
- -
-
Use Ctrl/Cmd + D to toggle dark mode
-
Use Ctrl/Cmd + B to toggle background effect
-
+ +
+ +
+ {themesV2.map((theme, index) => ( + + ))} +
+ +
+
Use Ctrl/Cmd + D to toggle dark mode
+
Use Ctrl/Cmd + B to toggle background effect
+
)}
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ThemedLayout.tsx b/apps/v1/client/src/components/ThemedLayout.tsx index 0f33bcd6..af6b1364 100644 --- a/apps/v1/client/src/components/ThemedLayout.tsx +++ b/apps/v1/client/src/components/ThemedLayout.tsx @@ -5,7 +5,7 @@ export function ThemedLayout() { const location = useLocation(); const { currentTheme } = useTheme(); const styles = currentTheme.styles; - + const navItems = [ { path: '/', label: 'Dashboard' }, { path: '/projects', label: 'Projects' }, @@ -13,19 +13,17 @@ export function ThemedLayout() { { path: '/personas', label: 'Personas' }, { path: '/jam-sessions', label: 'Jam Sessions' }, ]; - + const isActive = (path: string) => location.pathname === path; - + return (
{/* Sidebar */} - + {/* Main Content */}

- {navItems.find(item => isActive(item.path))?.label || 'Page'} + {navItems.find((item) => isActive(item.path))?.label || 'Page'}

-
- Theme: {currentTheme.name} -
+
Theme: {currentTheme.name}
- +
@@ -80,4 +77,4 @@ export function ThemedLayout() {
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ThemedLayoutV2.tsx b/apps/v1/client/src/components/ThemedLayoutV2.tsx index 4f06a58e..62f9a0d8 100644 --- a/apps/v1/client/src/components/ThemedLayoutV2.tsx +++ b/apps/v1/client/src/components/ThemedLayoutV2.tsx @@ -20,26 +20,25 @@ export function ThemedLayoutV2() { const styles = currentStyles; const direction = useNavigationDirection(); - // Extract projectId from various routes const getProjectIdFromPath = () => { // Match /projects/:projectId/workitems/new const projectMatch = location.pathname.match(/^\/projects\/([^\/]+)\/workitems\/new$/); if (projectMatch) return projectMatch[1]; - + // Match /work-items/:workItemId/edit const editMatch = location.pathname.match(/^\/work-items\/([^\/]+)\/edit$/); if (editMatch) { - const workItem = workItems.find(w => w.id === editMatch[1]); + const workItem = workItems.find((w) => w.id === editMatch[1]); return workItem?.projectId; } - + return null; }; - + const projectId = getProjectIdFromPath(); - const project = projectId ? projects.find(p => p.id === projectId) : null; - + const project = projectId ? projects.find((p) => p.id === projectId) : null; + const navItems = [ { path: '/', label: 'Dashboard' }, { path: '/projects', label: 'Projects' }, @@ -47,56 +46,60 @@ export function ThemedLayoutV2() { { path: '/agents', label: 'Agents' }, { path: '/jam-sessions', label: 'Jam sessions' }, ]; - + const isActive = (path: string) => location.pathname === path; - const currentLabel = navItems.find(item => item.path === location.pathname)?.label || null; - + const currentLabel = navItems.find((item) => item.path === location.pathname)?.label || null; + // Determine what to show in the header const getHeaderContent = () => { // If headerContent is set by a page component, use it if (headerContent !== null) { return headerContent; } - + // If headerTitle is set by a page component, use it if (headerTitle) { return headerTitle; } - + // Pages that should not show header text (they have their own headers) const pagesWithOwnHeaders = ['/work-items', '/agents', '/projects', '/jam-sessions', '/']; if (pagesWithOwnHeaders.includes(location.pathname)) { return null; } - + // Otherwise, use the default logic - if (project && (location.pathname.includes('/workitems/new') || location.pathname.includes('/work-items/') && location.pathname.includes('/edit'))) { + if ( + project && + (location.pathname.includes('/workitems/new') || + (location.pathname.includes('/work-items/') && location.pathname.includes('/edit'))) + ) { return project.name; } if (location.pathname === '/work-items/new') { return 'Create work item'; } - + // For routes like /agents/new, don't show anything if (!currentLabel) { return null; } - + return currentLabel; }; - + return ( -
+
{/* Background pattern when enabled */} {backgroundEffectEnabled && } {/* Sidebar */} - + {/* Main Content */}
-
+
{(() => { const content = getHeaderContent(); if (!content) return null; - + // Check if content is an array (breadcrumbs) if (Array.isArray(content)) { // Create a stable key from breadcrumb content - const breadcrumbKey = content.map(item => item.label).join(' > '); + const breadcrumbKey = content.map((item) => item.label).join(' > '); return ( - ); } - + // Otherwise it's a string return ( - -

- {content} -

+

{content}

); })()}
{workspace.config && ( -
- {workspace.config.path} -
+
{workspace.config.path}
)}
- +
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ToastContainer.tsx b/apps/v1/client/src/components/ToastContainer.tsx index 45a7e3e8..f0fbd3e9 100644 --- a/apps/v1/client/src/components/ToastContainer.tsx +++ b/apps/v1/client/src/components/ToastContainer.tsx @@ -19,25 +19,25 @@ export function ToastContainer() { // Initialize or clean up toast states when toasts change useEffect(() => { // Add new toasts to state - toasts.forEach(toast => { + toasts.forEach((toast) => { if (!toastStates[toast.id]) { - setToastStates(prev => ({ + setToastStates((prev) => ({ ...prev, [toast.id]: { opacity: 1, - isHovered: false - } + isHovered: false, + }, })); // Start fade timer if duration is set if (toast.duration && toast.duration > 0) { const fadeTimeout = setTimeout(() => { - setToastStates(prev => ({ + setToastStates((prev) => ({ ...prev, [toast.id]: { ...prev[toast.id], - opacity: 0 - } + opacity: 0, + }, })); // Remove toast after fade completes @@ -45,34 +45,34 @@ export function ToastContainer() { removeToast(toast.id); }, 5000); // 5 second fade duration - setToastStates(prev => ({ + setToastStates((prev) => ({ ...prev, [toast.id]: { ...prev[toast.id], - removeTimeout - } + removeTimeout, + }, })); }, 5000); // Start fade after 5 seconds - setToastStates(prev => ({ + setToastStates((prev) => ({ ...prev, [toast.id]: { ...prev[toast.id], - fadeTimeout - } + fadeTimeout, + }, })); } } }); // Clean up removed toasts - const toastIds = toasts.map(t => t.id); - Object.keys(toastStates).forEach(id => { + const toastIds = toasts.map((t) => t.id); + Object.keys(toastStates).forEach((id) => { if (!toastIds.includes(id)) { const state = toastStates[id]; if (state.fadeTimeout) clearTimeout(state.fadeTimeout); if (state.removeTimeout) clearTimeout(state.removeTimeout); - setToastStates(prev => { + setToastStates((prev) => { const newState = { ...prev }; delete newState[id]; return newState; @@ -90,12 +90,12 @@ export function ToastContainer() { if (state.removeTimeout) clearTimeout(state.removeTimeout); // Set opacity back to 1 and mark as hovered - setToastStates(prev => ({ + setToastStates((prev) => ({ ...prev, [toastId]: { opacity: 1, - isHovered: true - } + isHovered: true, + }, })); }; @@ -103,44 +103,44 @@ export function ToastContainer() { const state = toastStates[toastId]; if (!state) return; - setToastStates(prev => ({ + setToastStates((prev) => ({ ...prev, [toastId]: { ...prev[toastId], - isHovered: false - } + isHovered: false, + }, })); // Restart the countdown if duration is set if (duration && duration > 0) { const fadeTimeout = setTimeout(() => { - setToastStates(prev => ({ + setToastStates((prev) => ({ ...prev, [toastId]: { ...prev[toastId], - opacity: 0 - } + opacity: 0, + }, })); const removeTimeout = setTimeout(() => { removeToast(toastId); }, 5000); // 5 second fade duration - setToastStates(prev => ({ + setToastStates((prev) => ({ ...prev, [toastId]: { ...prev[toastId], - removeTimeout - } + removeTimeout, + }, })); }, 5000); // Start fade after 5 seconds - setToastStates(prev => ({ + setToastStates((prev) => ({ ...prev, [toastId]: { ...prev[toastId], - fadeTimeout - } + fadeTimeout, + }, })); } }; @@ -169,19 +169,34 @@ export function ToastContainer() { case 'error': return ( - + ); case 'warning': return ( - + ); default: return ( - + ); } @@ -191,7 +206,7 @@ export function ToastContainer() {
- {toasts.map(toast => { + {toasts.map((toast) => { const state = toastStates[toast.id] || { opacity: 1, isHovered: false }; return (
handleMouseEnter(toast.id)} onMouseLeave={() => handleMouseLeave(toast.id, toast.duration)} > -
-
- {getIcon(toast.type)} -
-

{toast.message}

- +
{getIcon(toast.type)}
+

{toast.message}

+ +
-
); })}
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/WorkItemDeleteDialog.tsx b/apps/v1/client/src/components/WorkItemDeleteDialog.tsx index 3ec25fc2..5655f2dc 100644 --- a/apps/v1/client/src/components/WorkItemDeleteDialog.tsx +++ b/apps/v1/client/src/components/WorkItemDeleteDialog.tsx @@ -10,11 +10,11 @@ interface WorkItemDeleteDialogProps { onConfirm: (permanentDelete: boolean) => void; } -export function WorkItemDeleteDialog({ - isOpen, - onClose, +export function WorkItemDeleteDialog({ + isOpen, + onClose, workItem, - onConfirm + onConfirm, }: WorkItemDeleteDialogProps) { const { currentStyles } = useTheme(); const styles = currentStyles; @@ -36,22 +36,22 @@ export function WorkItemDeleteDialog({ return (
{/* Backdrop */} -
- + {/* Modal */}
-
+ `} + >
-

- Delete Work Item -

+

Delete Work Item

@@ -59,7 +59,9 @@ export function WorkItemDeleteDialog({ Are you sure you want to delete "{workItem.title}"?

-
+
@@ -81,17 +83,16 @@ export function WorkItemDeleteDialog({
-
- @@ -100,4 +101,4 @@ export function WorkItemDeleteDialog({
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/WorkspaceConfirmDialog.tsx b/apps/v1/client/src/components/WorkspaceConfirmDialog.tsx index 6008d691..765f6d48 100644 --- a/apps/v1/client/src/components/WorkspaceConfirmDialog.tsx +++ b/apps/v1/client/src/components/WorkspaceConfirmDialog.tsx @@ -8,7 +8,12 @@ interface WorkspaceConfirmDialogProps { onCancel: () => void; } -export function WorkspaceConfirmDialog({ isOpen, path, onConfirm, onCancel }: WorkspaceConfirmDialogProps) { +export function WorkspaceConfirmDialog({ + isOpen, + path, + onConfirm, + onCancel, +}: WorkspaceConfirmDialogProps) { const { currentStyles } = useTheme(); const styles = currentStyles; @@ -18,14 +23,16 @@ export function WorkspaceConfirmDialog({ isOpen, path, onConfirm, onCancel }: Wo
{/* Backdrop */}
- + {/* Modal */}
-
+ `} + > {/* Header */}

@@ -36,20 +43,20 @@ export function WorkspaceConfirmDialog({ isOpen, path, onConfirm, onCancel }: Wo {/* Content */}
-

- The folder you specified does not exist: -

-
+

The folder you specified does not exist:

+
{path}
-

- Would you like to create this folder and set up your workspace there? -

+

Would you like to create this folder and set up your workspace there?

{/* Footer */} -
+
@@ -61,4 +68,4 @@ export function WorkspaceConfirmDialog({ isOpen, path, onConfirm, onCancel }: Wo
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/WorkspaceDialogContainer.tsx b/apps/v1/client/src/components/WorkspaceDialogContainer.tsx index e603ab59..087a8128 100644 --- a/apps/v1/client/src/components/WorkspaceDialogContainer.tsx +++ b/apps/v1/client/src/components/WorkspaceDialogContainer.tsx @@ -29,10 +29,10 @@ export function WorkspaceDialogContainer({ isOpen, onComplete }: WorkspaceDialog const handleFolderCancel = () => { setShowFolderBrowser(false); }; - + const handleWorkspaceSelected = (path: string, hasExistingContent?: boolean) => { console.log('Workspace selected:', path, 'Has content:', hasExistingContent); - + if (hasExistingContent) { // Show importing dialog setSelectedWorkspacePath(path); @@ -42,7 +42,7 @@ export function WorkspaceDialogContainer({ isOpen, onComplete }: WorkspaceDialog onComplete(path); } }; - + const handleImportComplete = () => { onComplete(selectedWorkspacePath); }; @@ -51,7 +51,7 @@ export function WorkspaceDialogContainer({ isOpen, onComplete }: WorkspaceDialog
{/* Backdrop */}
- + {/* Show importing dialog if needed */} {showImporting ? ( ); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/WorkspaceSetupDialog.tsx b/apps/v1/client/src/components/WorkspaceSetupDialog.tsx index 4fad5b3d..3f56e853 100644 --- a/apps/v1/client/src/components/WorkspaceSetupDialog.tsx +++ b/apps/v1/client/src/components/WorkspaceSetupDialog.tsx @@ -12,7 +12,12 @@ interface WorkspaceSetupDialogProps { externalPath?: string; } -export function WorkspaceSetupDialog({ isOpen, onComplete, onBrowseFolder, externalPath = '' }: WorkspaceSetupDialogProps) { +export function WorkspaceSetupDialog({ + isOpen, + onComplete, + onBrowseFolder, + externalPath = '', +}: WorkspaceSetupDialogProps) { const { currentStyles } = useTheme(); const styles = currentStyles; const [workspacePath, setWorkspacePath] = useState(externalPath); @@ -42,7 +47,7 @@ export function WorkspaceSetupDialog({ isOpen, onComplete, onBrowseFolder, exter headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ workspacePath: trimmedPath }) + body: JSON.stringify({ workspacePath: trimmedPath }), }); if (response.ok) { @@ -81,81 +86,85 @@ export function WorkspaceSetupDialog({ isOpen, onComplete, onBrowseFolder, exter // If using external dialog management, don't render backdrop const renderContent = () => ( -
- {/* Header */} -
-

- Welcome to Claude Flow -

-
+ `} + > + {/* Header */} +
+

Welcome to Claude Flow

+
- {/* Content */} -
-
-

- Claude Flow uses a workspace folder to organize your projects and collaborate with AI assistants. -

-

- Your workspace will contain: -

-
    -
  • Projects with their repositories
  • -
  • Work item plans and documentation
  • -
  • AI persona configurations
  • -
  • Jam session histories
  • -
-

- Choose a folder where you'd like to store your workspace. This can be changed later in settings. -

-
- -
- -
- setWorkspacePath(e.target.value)} - placeholder="/path/to/your/workspace" - className={` + {/* Content */} +
+
+

+ Claude Flow uses a workspace folder to organize your projects and collaborate with AI + assistants. +

+

Your workspace will contain:

+
    +
  • Projects with their repositories
  • +
  • Work item plans and documentation
  • +
  • AI persona configurations
  • +
  • Jam session histories
  • +
+

+ Choose a folder where you'd like to store your workspace. This can be changed later in + settings. +

+
+ +
+ +
+ setWorkspacePath(e.target.value)} + placeholder="/path/to/your/workspace" + className={` flex-1 px-3 py-2 ${styles.buttonRadius} ${styles.contentBg} ${styles.contentBorder} border ${styles.textColor} focus:ring-2 focus:ring-neutral-500 focus:border-neutral-500 `} + /> + (onBrowseFolder ? onBrowseFolder() : setShowFolderBrowser(true))} + aria-label="Browse for folder" + variant="secondary" + title="Browse for folder" + > + + - onBrowseFolder ? onBrowseFolder() : setShowFolderBrowser(true)} - aria-label="Browse for folder" - variant="secondary" - title="Browse for folder" - > - - - - -
-

- Enter the full path to your workspace folder (e.g., /home/user/workspace or C:\Users\Name\workspace) -

-
+ +
+

+ Enter the full path to your workspace folder (e.g., /home/user/workspace or + C:\Users\Name\workspace) +

+
+
- {/* Footer */} -
- -
+ {/* Footer */} +
+ +
); @@ -169,11 +178,9 @@ export function WorkspaceSetupDialog({ isOpen, onComplete, onBrowseFolder, exter
{/* Backdrop */}
- + {/* Modal */} -
- {renderContent()} -
+
{renderContent()}
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/WorkspaceSync.tsx b/apps/v1/client/src/components/WorkspaceSync.tsx index 8456cc52..1112eb14 100644 --- a/apps/v1/client/src/components/WorkspaceSync.tsx +++ b/apps/v1/client/src/components/WorkspaceSync.tsx @@ -10,14 +10,16 @@ export function WorkspaceSync() { useEffect(() => { if (workspaceProjects && workspaceProjects.length > 0) { // Create a hash of the projects to check if they've changed - const projectsHash = JSON.stringify(workspaceProjects.map(p => ({ - name: p.name, - path: p.path, - isLoading: p.isLoading, - repositories: p.repositories, - plans: p.plans - }))); - + const projectsHash = JSON.stringify( + workspaceProjects.map((p) => ({ + name: p.name, + path: p.path, + isLoading: p.isLoading, + repositories: p.repositories, + plans: p.plans, + })) + ); + // Only sync if projects have actually changed if (projectsHash !== lastSyncedRef.current) { console.log('WorkspaceSync: Syncing projects from workspace to app'); @@ -28,4 +30,4 @@ export function WorkspaceSync() { }, [workspaceProjects, syncWorkspaceProjects]); return null; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/chat/ChatBubble.tsx b/apps/v1/client/src/components/chat/ChatBubble.tsx index 64086ae3..2c91663f 100644 --- a/apps/v1/client/src/components/chat/ChatBubble.tsx +++ b/apps/v1/client/src/components/chat/ChatBubble.tsx @@ -20,48 +20,45 @@ export const ChatBubble = memo(function ChatBubble({ name, timestamp, status, - className = '' + className = '', }: ChatBubbleProps) { const { currentStyles } = useTheme(); const styles = currentStyles; - + const isSent = variant === 'sent'; - + return ( -
- {!isSent && showAvatar && ( -
- {avatar} -
- )} - +
+ {!isSent && showAvatar &&
{avatar}
} +
- {!isSent && name && ( -
{name}
- )} - -
+ {!isSent && name &&
{name}
} + +
{children}
- + {(timestamp || status) && ( -
+
{timestamp && timestamp.toLocaleTimeString()} {status === 'sending' && Sending...} {status === 'error' && Failed to send}
)}
- - {isSent && showAvatar && ( -
- {avatar} -
- )} + + {isSent && showAvatar &&
{avatar}
}
); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/chat/DiffView.tsx b/apps/v1/client/src/components/chat/DiffView.tsx index dfcd3b62..9e387819 100644 --- a/apps/v1/client/src/components/chat/DiffView.tsx +++ b/apps/v1/client/src/components/chat/DiffView.tsx @@ -8,7 +8,11 @@ interface DiffViewProps { className?: string; } -export const DiffView = memo(function DiffView({ oldText, newText, className = '' }: DiffViewProps) { +export const DiffView = memo(function DiffView({ + oldText, + newText, + className = '', +}: DiffViewProps) { const { currentStyles } = useTheme(); const styles = currentStyles; @@ -49,4 +53,4 @@ export const DiffView = memo(function DiffView({ oldText, newText, className = '
); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/chat/ProgressIndicator.tsx b/apps/v1/client/src/components/chat/ProgressIndicator.tsx index bfac0f3a..692b222d 100644 --- a/apps/v1/client/src/components/chat/ProgressIndicator.tsx +++ b/apps/v1/client/src/components/chat/ProgressIndicator.tsx @@ -12,50 +12,61 @@ export const ProgressIndicator = memo(function ProgressIndicator({ startTime, tokenCount, status = 'Thinking', - onCancel + onCancel, }: ProgressIndicatorProps) { const { currentStyles } = useTheme(); const styles = currentStyles; const [elapsedSeconds, setElapsedSeconds] = useState(0); - + useEffect(() => { const interval = setInterval(() => { const elapsed = Math.floor((Date.now() - startTime.getTime()) / 1000); setElapsedSeconds(elapsed); }, 1000); - + return () => clearInterval(interval); }, [startTime]); - + useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape' && onCancel) { onCancel(); } }; - + window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [onCancel]); - + const formatElapsedTime = (seconds: number) => { if (seconds < 60) return `${seconds}s`; const minutes = Math.floor(seconds / 60); const remainingSeconds = seconds % 60; return `${minutes}m ${remainingSeconds}s`; }; - + const formatTokenCount = (count: number) => { if (count < 1000) return `${count} tokens`; return `${(count / 1000).toFixed(1)}k tokens`; }; - + return (
- - + +
{status}… @@ -68,4 +79,4 @@ export const ProgressIndicator = memo(function ProgressIndicator({
); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/chat/SuggestedResponses.tsx b/apps/v1/client/src/components/chat/SuggestedResponses.tsx index 28c29300..68be5ee5 100644 --- a/apps/v1/client/src/components/chat/SuggestedResponses.tsx +++ b/apps/v1/client/src/components/chat/SuggestedResponses.tsx @@ -10,13 +10,13 @@ interface SuggestedResponsesProps { export const SuggestedResponses = memo(function SuggestedResponses({ responses, onSelect, - disabled = false + disabled = false, }: SuggestedResponsesProps) { const { currentStyles } = useTheme(); const styles = currentStyles; - + if (!responses || responses.length === 0) return null; - + return (
{responses.map((response, index) => ( @@ -38,4 +38,4 @@ export const SuggestedResponses = memo(function SuggestedResponses({ ))}
); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/chat/ToolExecution.tsx b/apps/v1/client/src/components/chat/ToolExecution.tsx index 298ee01a..a1ccafa8 100644 --- a/apps/v1/client/src/components/chat/ToolExecution.tsx +++ b/apps/v1/client/src/components/chat/ToolExecution.tsx @@ -31,25 +31,27 @@ export const ToolExecution = memo(function ToolExecution({ 'data-testid': dataTestId, sessionId, messageId, - hideFeedbackLink = false + hideFeedbackLink = false, }: ToolExecutionProps) { const { currentStyles } = useTheme(); const styles = currentStyles; - + // Function to render file paths as clickable VS Code links const renderFilePathOrText = (text: string) => { // Check if the entire text is a file path const trimmedText = text.trim(); - const singlePathMatch = trimmedText.match(/^((?:\/[\w.-]+)+(?:\/[\w.-]+)*|(?:\.\/)?[\w.-]+(?:\/[\w.-]+)+)(?:\:(\d+))?$/); - + const singlePathMatch = trimmedText.match( + /^((?:\/[\w.-]+)+(?:\/[\w.-]+)*|(?:\.\/)?[\w.-]+(?:\/[\w.-]+)+)(?:\:(\d+))?$/ + ); + if (singlePathMatch) { const [, path, lineNumber] = singlePathMatch; - const vscodeUrl = lineNumber + const vscodeUrl = lineNumber ? `vscode://file${path}:${lineNumber}:1` : `vscode://file${path}`; - + return ( - { @@ -62,11 +64,11 @@ export const ToolExecution = memo(function ToolExecution({ ); } - + // For other text, show truncated version return text.length > 80 ? text.substring(0, 80) + '...' : text; }; - + // Helper function to create VS Code link const createVSCodeLink = (filePath: string, key: string, workingDir?: string) => { // Ensure the path is absolute @@ -80,7 +82,7 @@ export const ToolExecution = memo(function ToolExecution({ absolutePath = `/${filePath}`; } } - + const vscodeUrl = `vscode://file${absolutePath}`; return ( { // Check if line contains a file path (common patterns in git status output) // This pattern captures paths like "packages/apisurf/src/analyzers/analyzeNpmPackageVersions.ts" - const filePathPattern = /(?:modified:|new file:|deleted:|renamed:|copied:|updated:|typechange:|added:|untracked:)?\s*((?:[\w\-]+\/)*[\w\-]+\.[\w]+)/g; - + const filePathPattern = + /(?:modified:|new file:|deleted:|renamed:|copied:|updated:|typechange:|added:|untracked:)?\s*((?:[\w\-]+\/)*[\w\-]+\.[\w]+)/g; + let lastIndex = 0; const parts: React.ReactNode[] = []; let match; - + while ((match = filePathPattern.exec(line)) !== null) { // Add text before the match if (match.index > lastIndex) { @@ -117,31 +120,27 @@ export const ToolExecution = memo(function ToolExecution({ ); } - + // Add the file path as a link const filePath = match[1]; parts.push(createVSCodeLink(filePath, `link-${lineIndex}-${match.index}`, workingDir)); - + lastIndex = match.index + match[0].length; } - + // Add remaining text after the last match if (lastIndex < line.length) { - parts.push( - - {line.substring(lastIndex)} - - ); + parts.push({line.substring(lastIndex)}); } - + // If no matches, return the entire line if (parts.length === 0) { return line || '\u00A0'; } - + return parts; }; - + // Function to get working directory from context const getWorkingDirectory = () => { // Try to get the working directory from the URL params @@ -154,41 +153,39 @@ export const ToolExecution = memo(function ToolExecution({ } return undefined; }; - + // Function to render bash output with clickable file paths const renderBashOutput = (text: string) => { const lines = text.split('\n'); const workingDir = getWorkingDirectory(); - + return (
{lines.map((line, index) => ( -
- {parseLineForFilePaths(line, index, workingDir)} -
+
{parseLineForFilePaths(line, index, workingDir)}
))}
); }; - + // Format tool name to be more user-friendly const formatToolName = (toolName: string): string => { const nameMap: Record = { - 'TodoWrite': '📝 Update todo list', - 'Edit': '✏️ Edit file', - 'MultiEdit': '✏️ Edit multiple sections', - 'Read': '📖 Read file', - 'Write': '📄 Write file', - 'Bash': '💻 Run command', - 'Grep': '🔍 Search files', - 'Glob': '📁 Find files', - 'LS': '📋 List directory', - 'NotebookRead': '📓 Read notebook', - 'NotebookEdit': '📓 Edit notebook', - 'WebFetch': '🌐 Fetch web content', - 'WebSearch': '🔎 Search web', - 'Task': '🤖 Launch agent', - 'exit_plan_mode': '✅ Exit plan mode' + TodoWrite: '📝 Update todo list', + Edit: '✏️ Edit file', + MultiEdit: '✏️ Edit multiple sections', + Read: '📖 Read file', + Write: '📄 Write file', + Bash: '💻 Run command', + Grep: '🔍 Search files', + Glob: '📁 Find files', + LS: '📋 List directory', + NotebookRead: '📓 Read notebook', + NotebookEdit: '📓 Edit notebook', + WebFetch: '🌐 Fetch web content', + WebSearch: '🔎 Search web', + Task: '🤖 Launch agent', + exit_plan_mode: '✅ Exit plan mode', }; return nameMap[toolName] || toolName; }; @@ -197,7 +194,7 @@ export const ToolExecution = memo(function ToolExecution({ const startTimeRef = useRef(null); const intervalRef = useRef(null); const { projectId, repoName } = useParams<{ projectId: string; repoName: string }>(); - + // Set up feedback for this tool execution (only if sessionId is provided) const { showDialog, @@ -205,14 +202,14 @@ export const ToolExecution = memo(function ToolExecution({ error: feedbackError, openFeedback, closeFeedback, - submitFeedback + submitFeedback, } = useFeedback({ sessionId: sessionId || '', repoName: repoName || '', projectId: projectId || '', - messageId + messageId, }); - + // Track running duration useEffect(() => { if (status === 'running') { @@ -220,14 +217,14 @@ export const ToolExecution = memo(function ToolExecution({ if (!startTimeRef.current) { startTimeRef.current = Date.now(); } - + // Update duration every 100ms intervalRef.current = setInterval(() => { if (startTimeRef.current) { setRunningDuration(Date.now() - startTimeRef.current); } }, 100); // Update every 100ms for smoother display - + return () => { if (intervalRef.current) { clearInterval(intervalRef.current); @@ -245,7 +242,7 @@ export const ToolExecution = memo(function ToolExecution({ } } }, [status, executionTime]); - + // Format duration for display const formatDuration = (ms: number) => { if (ms < 1000) { @@ -254,7 +251,7 @@ export const ToolExecution = memo(function ToolExecution({ return `${(ms / 1000).toFixed(1)}s`; } }; - + const getStatusIcon = () => { switch (status) { case 'pending': @@ -266,25 +263,48 @@ export const ToolExecution = memo(function ToolExecution({ case 'running': return ( - - + + ); case 'complete': return ( - + ); case 'error': return ( - + ); } }; - + const getStatusColor = () => { switch (status) { case 'pending': @@ -297,47 +317,61 @@ export const ToolExecution = memo(function ToolExecution({ return 'text-red-500'; } }; - + const formatOutput = (text: string) => { const lines = text.split('\n'); const maxLines = 5; const hasMore = lines.length > maxLines; - + if (!isExpanded && hasMore) { return { text: lines.slice(0, maxLines).join('\n'), hasMore: true, - moreCount: lines.length - maxLines + moreCount: lines.length - maxLines, }; } - + return { text, hasMore: false, - moreCount: 0 + moreCount: 0, }; }; - + const outputInfo = output ? formatOutput(output) : null; - + return ( -
+
-
+
{getStatusIcon()}
- {formatToolName(name)} - {args && name !== 'TodoWrite' && name !== 'Edit' && name !== 'MultiEdit' && name !== 'Grep' && name !== 'Glob' && name !== 'LS' && name !== 'Task' && name !== 'Read' && name !== 'Write' && ( - - {renderFilePathOrText(args)} - - )} + + {formatToolName(name)} + + {args && + name !== 'TodoWrite' && + name !== 'Edit' && + name !== 'MultiEdit' && + name !== 'Grep' && + name !== 'Glob' && + name !== 'LS' && + name !== 'Task' && + name !== 'Read' && + name !== 'Write' && ( + + {renderFilePathOrText(args)} + + )} {args && name === 'TodoWrite' && ( {(() => { @@ -357,16 +391,17 @@ export const ToolExecution = memo(function ToolExecution({ try { const argsData = typeof args === 'string' ? JSON.parse(args) : args; const filePath = argsData.file_path || ''; - + if (filePath) { const vscodeUrl = `vscode://file${filePath}`; const fileName = filePath.split('/').pop() || filePath; - const displayText = name === 'MultiEdit' && argsData.edits?.length - ? `${fileName} (${argsData.edits.length} edit${argsData.edits.length === 1 ? '' : 's'})` - : fileName; - + const displayText = + name === 'MultiEdit' && argsData.edits?.length + ? `${fileName} (${argsData.edits.length} edit${argsData.edits.length === 1 ? '' : 's'})` + : fileName; + return ( - { @@ -379,7 +414,7 @@ export const ToolExecution = memo(function ToolExecution({ ); } - + return args.length > 80 ? args.substring(0, 80) + '...' : args; } catch { return args.length > 80 ? args.substring(0, 80) + '...' : args; @@ -393,13 +428,13 @@ export const ToolExecution = memo(function ToolExecution({ try { const argsData = typeof args === 'string' ? JSON.parse(args) : args; const filePath = argsData.file_path || ''; - + if (filePath) { const vscodeUrl = `vscode://file${filePath}`; const fileName = filePath.split('/').pop() || filePath; - + return ( - { @@ -412,7 +447,7 @@ export const ToolExecution = memo(function ToolExecution({ ); } - + return args.length > 80 ? args.substring(0, 80) + '...' : args; } catch { return args.length > 80 ? args.substring(0, 80) + '...' : args; @@ -420,7 +455,8 @@ export const ToolExecution = memo(function ToolExecution({ })()} )} - {args && name === 'Grep' && ( + {args && + name === 'Grep' && (() => { try { const argsData = typeof args === 'string' ? JSON.parse(args) : args; @@ -436,9 +472,9 @@ export const ToolExecution = memo(function ToolExecution({ ); } - })() - )} - {args && name === 'Glob' && ( + })()} + {args && + name === 'Glob' && (() => { try { const argsData = typeof args === 'string' ? JSON.parse(args) : args; @@ -454,14 +490,15 @@ export const ToolExecution = memo(function ToolExecution({ ); } - })() - )} - {args && name === 'LS' && ( + })()} + {args && + name === 'LS' && (() => { try { const argsData = typeof args === 'string' ? JSON.parse(args) : args; const path = argsData.path || '.'; - const displayPath = path === '.' ? 'current directory' : path.split('/').pop() || path; + const displayPath = + path === '.' ? 'current directory' : path.split('/').pop() || path; return ( {displayPath} ); @@ -472,16 +509,14 @@ export const ToolExecution = memo(function ToolExecution({ ); } - })() - )} - {args && name === 'Task' && ( + })()} + {args && + name === 'Task' && (() => { try { const argsData = typeof args === 'string' ? JSON.parse(args) : args; const description = argsData.description || 'Running task'; - return ( - {description} - ); + return {description}; } catch { return ( @@ -489,19 +524,17 @@ export const ToolExecution = memo(function ToolExecution({ ); } - })() - )} + })()}
{(status === 'running' || status === 'complete' || executionTime) && ( - {status === 'running' + {status === 'running' ? formatDuration(runningDuration) - : formatDuration(executionTime || runningDuration || 0) - } + : formatDuration(executionTime || runningDuration || 0)} )}
- + {/* Grep tool details - show pattern */} {args && name === 'Grep' && (
@@ -520,7 +553,7 @@ export const ToolExecution = memo(function ToolExecution({ })()}
)} - + {/* Glob tool details - show pattern */} {args && name === 'Glob' && (
@@ -539,7 +572,7 @@ export const ToolExecution = memo(function ToolExecution({ })()}
)} - + {/* Task tool details - show prompt */} {args && name === 'Task' && (
@@ -549,11 +582,10 @@ export const ToolExecution = memo(function ToolExecution({ const prompt = argsData.prompt || ''; // Show first line or first 200 chars of prompt const firstLine = prompt.split('\n')[0]; - const displayPrompt = firstLine.length > 200 ? firstLine.substring(0, 200) + '...' : firstLine; + const displayPrompt = + firstLine.length > 200 ? firstLine.substring(0, 200) + '...' : firstLine; return ( -
- Task: {displayPrompt} -
+
Task: {displayPrompt}
); } catch { return null; @@ -561,22 +593,24 @@ export const ToolExecution = memo(function ToolExecution({ })()}
)} - + {/* Edit tool details - show before/after */} {args && (name === 'Edit' || name === 'MultiEdit') && status === 'complete' && (
{(() => { try { const argsData = typeof args === 'string' ? JSON.parse(args) : args; - + if (name === 'Edit') { // Single edit return (
-
Changes:
- + Changes: +
+
); @@ -584,18 +618,18 @@ export const ToolExecution = memo(function ToolExecution({ // MultiEdit - show first edit only with count const edits = argsData.edits || []; if (edits.length === 0) return null; - + const firstEdit = edits[0]; const showCount = edits.length > 1; - + return (
Changes{showCount ? ` (edit 1 of ${edits.length})` : ''}:
- {showCount && (
@@ -611,21 +645,27 @@ export const ToolExecution = memo(function ToolExecution({ })()}
)} - + {error && (
-
Error:
-
+              
+ Error: +
+
                 {error}
               
)} - + {outputInfo && (
{name === 'LS' && output ? ( -
+
{(() => { try { // Try to parse as JSON array @@ -637,7 +677,11 @@ export const ToolExecution = memo(function ToolExecution({
{displayItems.map((item, index) => (
- + {item.type === 'directory' ? '📁' : '📄'} {item.name} @@ -664,7 +708,9 @@ export const ToolExecution = memo(function ToolExecution({ ); } else { // Not an array, show as plain text - return
{outputInfo.text}
; + return ( +
{outputInfo.text}
+ ); } } catch { // Failed to parse as JSON, show as plain text @@ -673,11 +719,15 @@ export const ToolExecution = memo(function ToolExecution({ })()}
) : name === 'Bash' ? ( -
+
{renderBashOutput(outputInfo.text)}
) : ( -
+                
                   {outputInfo.text}
                 
)} @@ -693,14 +743,14 @@ export const ToolExecution = memo(function ToolExecution({ )}
- + {/* Feedback link - only show if we have session context and not hidden */} {sessionId && status === 'complete' && !hideFeedbackLink && (
)} - + {/* Feedback dialogs */} {sessionId && ( <> @@ -711,9 +761,8 @@ export const ToolExecution = memo(function ToolExecution({ isSubmitting={isSubmitting} error={feedbackError} /> - )}
); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/chat/ToolExecutionGroup.tsx b/apps/v1/client/src/components/chat/ToolExecutionGroup.tsx index 3a524d99..81f3b5cc 100644 --- a/apps/v1/client/src/components/chat/ToolExecutionGroup.tsx +++ b/apps/v1/client/src/components/chat/ToolExecutionGroup.tsx @@ -14,12 +14,12 @@ interface ToolExecutionGroupProps { export const ToolExecutionGroup = memo(function ToolExecutionGroup({ tools, - sessionId + sessionId, }: ToolExecutionGroupProps) { const { currentStyles } = useTheme(); const styles = currentStyles; const { projectId, repoName } = useParams<{ projectId: string; repoName: string }>(); - + // Set up feedback for this tool group (use first tool's ID as the messageId) const { showDialog, @@ -27,20 +27,26 @@ export const ToolExecutionGroup = memo(function ToolExecutionGroup({ error: feedbackError, openFeedback, closeFeedback, - submitFeedback + submitFeedback, } = useFeedback({ sessionId: sessionId || '', repoName: repoName || '', projectId: projectId || '', - messageId: tools[0]?.id + messageId: tools[0]?.id, }); - + if (tools.length === 0) return null; - + return ( -
-
- {tools.length} tool execution{tools.length === 1 ? '' : 's'} +
+
+ + {tools.length} tool execution{tools.length === 1 ? '' : 's'} +
@@ -54,7 +60,7 @@ export const ToolExecutionGroup = memo(function ToolExecutionGroup({ toolName = 'Tool execution'; } } - + return (
- + {/* Feedback dialog */}
); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/claude-code/ClaudeInput.tsx b/apps/v1/client/src/components/claude-code/ClaudeInput.tsx index d266eb62..a0534be0 100644 --- a/apps/v1/client/src/components/claude-code/ClaudeInput.tsx +++ b/apps/v1/client/src/components/claude-code/ClaudeInput.tsx @@ -17,13 +17,13 @@ export const ClaudeInput = memo(function ClaudeInput({ mode, contextUsage, isSubmitting, - isConnected + isConnected, }: ClaudeInputProps) { const { currentStyles } = useTheme(); const styles = currentStyles; const textareaRef = useRef(null); const [value, setValue] = useState(''); - + // Auto-resize textarea useEffect(() => { if (textareaRef.current) { @@ -31,7 +31,7 @@ export const ClaudeInput = memo(function ClaudeInput({ textareaRef.current.style.height = `${Math.min(textareaRef.current.scrollHeight, 200)}px`; } }, [value]); - + // Clear input after successful submission useEffect(() => { if (!isSubmitting && value === '') { @@ -39,27 +39,30 @@ export const ClaudeInput = memo(function ClaudeInput({ setValue(''); } }, [isSubmitting]); - - const handleKeyDown = useCallback((e: KeyboardEvent) => { - // Shift+Tab to toggle between Plan and Execute modes - if (e.key === 'Tab' && e.shiftKey) { - e.preventDefault(); - // Toggle between plan and execute (default) modes only - const newMode = mode === 'plan' ? 'default' : 'plan'; - onModeChange(newMode); - return; - } - - // Enter to submit (Shift+Enter for new line) - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - if (value.trim() && !isSubmitting && isConnected) { - onSubmit(value); - setValue(''); // Clear input after submission + + const handleKeyDown = useCallback( + (e: KeyboardEvent) => { + // Shift+Tab to toggle between Plan and Execute modes + if (e.key === 'Tab' && e.shiftKey) { + e.preventDefault(); + // Toggle between plan and execute (default) modes only + const newMode = mode === 'plan' ? 'default' : 'plan'; + onModeChange(newMode); + return; } - } - }, [mode, onModeChange, value, isSubmitting, isConnected, onSubmit]); - + + // Enter to submit (Shift+Enter for new line) + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + if (value.trim() && !isSubmitting && isConnected) { + onSubmit(value); + setValue(''); // Clear input after submission + } + } + }, + [mode, onModeChange, value, isSubmitting, isConnected, onSubmit] + ); + const getModeColor = () => { switch (mode) { case 'auto-accept': @@ -70,7 +73,7 @@ export const ClaudeInput = memo(function ClaudeInput({ return styles.mutedText; } }; - + const getModeIcon = () => { switch (mode) { case 'auto-accept': @@ -81,13 +84,13 @@ export const ClaudeInput = memo(function ClaudeInput({ return '💬'; } }; - + const getContextColor = () => { if (contextUsage >= 90) return 'text-red-600 dark:text-red-400'; if (contextUsage >= 70) return 'text-yellow-600 dark:text-yellow-400'; return styles.mutedText; }; - + return (
@@ -96,7 +99,11 @@ export const ClaudeInput = memo(function ClaudeInput({ value={value} onChange={(e) => setValue(e.target.value)} onKeyDown={handleKeyDown} - placeholder={isConnected ? "Type a message... (Enter to send, Shift+Enter for new line)" : "Connecting..."} + placeholder={ + isConnected + ? 'Type a message... (Enter to send, Shift+Enter for new line)' + : 'Connecting...' + } disabled={!isConnected || isSubmitting} className={` w-full px-4 py-3 pr-24 @@ -109,7 +116,7 @@ export const ClaudeInput = memo(function ClaudeInput({ style={{ minHeight: '56px' }} data-testid="message-input" /> - + {/* Submit button */}
- + {/* Status bar */}
{/* Mode indicator */}
{getModeIcon()} - - {mode === 'plan' ? 'Planning' : 'Execute'} - + {mode === 'plan' ? 'Planning' : 'Execute'}
- - Shift+Tab to toggle mode - + Shift+Tab to toggle mode
- + {/* Context usage */}
Context:
-
-
+
= 90 ? 'bg-red-500' : - contextUsage >= 70 ? 'bg-yellow-500' : - 'bg-green-500' + contextUsage >= 90 + ? 'bg-red-500' + : contextUsage >= 70 + ? 'bg-yellow-500' + : 'bg-green-500' }`} style={{ width: `${contextUsage}%` }} /> @@ -174,4 +187,4 @@ export const ClaudeInput = memo(function ClaudeInput({
); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/claude-code/ClaudeMessage.tsx b/apps/v1/client/src/components/claude-code/ClaudeMessage.tsx index d2d134d9..6f35a1e4 100644 --- a/apps/v1/client/src/components/claude-code/ClaudeMessage.tsx +++ b/apps/v1/client/src/components/claude-code/ClaudeMessage.tsx @@ -17,39 +17,35 @@ interface ClaudeMessageProps { sessionId: string; } -export const ClaudeMessage = memo(function ClaudeMessage({ - message, +export const ClaudeMessage = memo(function ClaudeMessage({ + message, onSuggestedResponse, isLatestAssistantMessage = false, - sessionId + sessionId, }: ClaudeMessageProps) { const { projectId, repoName } = useParams<{ projectId: string; repoName: string }>(); - + // Set up feedback for this message - const { - showDialog, - isSubmitting, - error, - openFeedback, - closeFeedback, - submitFeedback - } = useFeedback({ - sessionId, - repoName: repoName || '', - projectId: projectId || '', - messageId: message.id - }); + const { showDialog, isSubmitting, error, openFeedback, closeFeedback, submitFeedback } = + useFeedback({ + sessionId, + repoName: repoName || '', + projectId: projectId || '', + messageId: message.id, + }); // Check if this is an error message - const isErrorMessage = message.content.startsWith('API Error:') || message.content.includes('authentication_error'); - const is401Error = message.content.includes('401') && message.content.includes('authentication_error'); - + const isErrorMessage = + message.content.startsWith('API Error:') || message.content.includes('authentication_error'); + const is401Error = + message.content.includes('401') && message.content.includes('authentication_error'); + // Handle content that might be an array or object let messageContent = message.content; if (typeof messageContent !== 'string') { if (Array.isArray(messageContent)) { messageContent = (messageContent as Array) - .filter(block => block?.type === 'text') - .map(block => block?.text || '') + .filter((block) => block?.type === 'text') + .map((block) => block?.text || '') .join('\n'); } else if (messageContent && typeof messageContent === 'object' && 'text' in messageContent) { messageContent = (messageContent as any).text; @@ -57,38 +53,54 @@ export const ClaudeMessage = memo(function ClaudeMessage({ messageContent = String(messageContent); } } - + // Clean up message content to remove artifacts from malformed API responses if (typeof messageContent === 'string') { // Remove "undefined" at the start of messages messageContent = messageContent.replace(/^undefined\s*\n?/i, ''); - + // Remove "H:" and "A:" conversation prefixes that shouldn't be visible messageContent = messageContent.replace(/^(H|A):\s*(.+?)(?=\n\n(H|A):|$)/gm, '$2'); - + // Clean up any remaining leading/trailing whitespace messageContent = messageContent.trim(); } - - const formatContent = useMemo(() => (content: string) => { - const html = parseMarkdown(content); - return
; - }, []); - + + const formatContent = useMemo( + () => (content: string) => { + const html = parseMarkdown(content); + return ( +
+ ); + }, + [] + ); + // Show thinking indicator for streaming messages const isThinking = message.isStreaming && messageContent.startsWith('Claude is thinking'); - + const getAvatar = () => { switch (message.role) { case 'user': - return
U
; + return ( +
+ U +
+ ); case 'assistant': - return
C
; + return ( +
+ C +
+ ); case 'system': return null; } }; - + // System messages get special treatment if (message.role === 'system') { return ( @@ -97,7 +109,7 @@ export const ClaudeMessage = memo(function ClaudeMessage({
); } - + // Tool messages are rendered as tool executions if (message.role === 'tool') { // Extract tool name from message ID if name is not provided @@ -109,7 +121,7 @@ export const ClaudeMessage = memo(function ClaudeMessage({ toolName = 'Tool execution'; } } - + return ( <>
@@ -125,7 +137,7 @@ export const ClaudeMessage = memo(function ClaudeMessage({ messageId={message.id} />
- + {/* Feedback dialog for tool execution */} ); } - + // Render error messages with special styling if (isErrorMessage) { return ( @@ -145,8 +157,18 @@ export const ClaudeMessage = memo(function ClaudeMessage({
- - + +
@@ -165,7 +187,7 @@ export const ClaudeMessage = memo(function ClaudeMessage({
{is401Error && (
- + {/* Feedback link */} {!message.isStreaming && (
@@ -181,7 +203,7 @@ export const ClaudeMessage = memo(function ClaudeMessage({
)}
- + {/* Feedback dialog */} ); } - + return ( <> )} - + {/* Planning mode indicator for user messages */} {message.role === 'user' && message.mode === 'plan' && (
@@ -228,7 +250,7 @@ export const ClaudeMessage = memo(function ClaudeMessage({
)} - + {/* Suggested responses for the latest assistant message */} {isLatestAssistantMessage && message.suggestedResponses && onSuggestedResponse && ( )} - + {/* Feedback link */} {!message.isStreaming && (
@@ -245,7 +267,7 @@ export const ClaudeMessage = memo(function ClaudeMessage({
)}
- + {/* Feedback dialog */} ); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/claude-code/TodoList.tsx b/apps/v1/client/src/components/claude-code/TodoList.tsx index 1bf50860..10faf196 100644 --- a/apps/v1/client/src/components/claude-code/TodoList.tsx +++ b/apps/v1/client/src/components/claude-code/TodoList.tsx @@ -11,19 +11,19 @@ interface TodoListProps { export const TodoList = memo(function TodoList({ todos, onDismiss }: TodoListProps) { const { currentStyles } = useTheme(); const styles = currentStyles; - + // Build hierarchy const buildHierarchy = (todos: Todo[]): Todo[] => { const todoMap = new Map(); const rootTodos: Todo[] = []; - + // First pass: create map - todos.forEach(todo => { + todos.forEach((todo) => { todoMap.set(todo.id, { ...todo, children: [] }); }); - + // Second pass: build hierarchy - todos.forEach(todo => { + todos.forEach((todo) => { const todoWithChildren = todoMap.get(todo.id)!; if (todo.parentId && todoMap.has(todo.parentId)) { const parent = todoMap.get(todo.parentId)!; @@ -33,37 +33,51 @@ export const TodoList = memo(function TodoList({ todos, onDismiss }: TodoListPro rootTodos.push(todoWithChildren); } }); - + return rootTodos; }; - + const hierarchicalTodos = buildHierarchy(todos); - + // Group todos by status (considering only root level for grouping) - const todosByStatus = hierarchicalTodos.reduce((acc, todo) => { - if (!acc[todo.status]) { - acc[todo.status] = []; - } - acc[todo.status].push(todo); - return acc; - }, {} as Record); - - + const todosByStatus = hierarchicalTodos.reduce( + (acc, todo) => { + if (!acc[todo.status]) { + acc[todo.status] = []; + } + acc[todo.status].push(todo); + return acc; + }, + {} as Record + ); + const getStatusIcon = (status: string) => { switch (status) { case 'completed': return ( - - + + ); case 'in_progress': - return ( - - ); + return ; case 'pending': return ( - + ); @@ -71,10 +85,10 @@ export const TodoList = memo(function TodoList({ todos, onDismiss }: TodoListPro return null; } }; - + const renderTodoItem = (todo: Todo, indent: number = 0): React.ReactNode => { const isCompleted = todo.status === 'completed'; - + return (
{getStatusIcon(todo.status)} -

+

{todo.content}

{todo.children && todo.children.length > 0 && ( - <> - {todo.children.map(child => renderTodoItem(child, indent + 1))} - + <>{todo.children.map((child) => renderTodoItem(child, indent + 1))} )} ); }; - + if (todos.length === 0) { return ( -

@@ -106,16 +120,16 @@ export const TodoList = memo(function TodoList({ todos, onDismiss }: TodoListPro

); } - + return ( -
-
+
-

- Task list -

+

Task list

{todosByStatus.completed?.length || 0}/{todos.length} completed @@ -126,7 +140,13 @@ export const TodoList = memo(function TodoList({ todos, onDismiss }: TodoListPro className={`p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors`} title="Dismiss task list" > - + @@ -134,17 +154,17 @@ export const TodoList = memo(function TodoList({ todos, onDismiss }: TodoListPro
- +
{/* Show completed items first - they bubble to the top */} - {todosByStatus.completed?.map(todo => renderTodoItem(todo))} - + {todosByStatus.completed?.map((todo) => renderTodoItem(todo))} + {/* Then in-progress items */} - {todosByStatus.in_progress?.map(todo => renderTodoItem(todo))} - + {todosByStatus.in_progress?.map((todo) => renderTodoItem(todo))} + {/* Finally pending items */} - {todosByStatus.pending?.map(todo => renderTodoItem(todo))} + {todosByStatus.pending?.map((todo) => renderTodoItem(todo))}
); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/claude-code/VirtualMessageList.tsx b/apps/v1/client/src/components/claude-code/VirtualMessageList.tsx index c323bf64..f09bda1e 100644 --- a/apps/v1/client/src/components/claude-code/VirtualMessageList.tsx +++ b/apps/v1/client/src/components/claude-code/VirtualMessageList.tsx @@ -17,18 +17,26 @@ interface GroupedMessage { id: string; } -export function VirtualMessageList({ messages, scrollContainerRef, onSuggestedResponse, sessionId }: VirtualMessageListProps) { +export function VirtualMessageList({ + messages, + scrollContainerRef, + onSuggestedResponse, + sessionId, +}: VirtualMessageListProps) { console.log('VirtualMessageList render, messages count:', messages.length); - console.log('Messages:', messages.map(m => ({ - ...m, - content: m.content.substring(0, 50) + (m.content.length > 50 ? '...' : '') - }))); - + console.log( + 'Messages:', + messages.map((m) => ({ + ...m, + content: m.content.substring(0, 50) + (m.content.length > 50 ? '...' : ''), + })) + ); + const measurementsCache = useRef>({}); const shouldAutoScroll = useRef(true); const isUserScrolling = useRef(false); const scrollTimeoutRef = useRef(undefined); - + // Group consecutive tool messages const groupedMessages = useMemo(() => { // First, sort messages by timestamp to ensure consistent order @@ -37,10 +45,10 @@ export function VirtualMessageList({ messages, scrollContainerRef, onSuggestedRe const timeB = new Date(b.timestamp).getTime(); return timeA - timeB; }); - + const grouped: GroupedMessage[] = []; let currentToolGroup: ClaudeMessageType[] = []; - + sortedMessages.forEach((message) => { if (message.role === 'tool') { currentToolGroup.push(message); @@ -50,7 +58,7 @@ export function VirtualMessageList({ messages, scrollContainerRef, onSuggestedRe grouped.push({ type: 'toolGroup', messages: currentToolGroup, - id: `tool-group-${currentToolGroup[0].id}` + id: `tool-group-${currentToolGroup[0].id}`, }); currentToolGroup = []; } @@ -58,57 +66,61 @@ export function VirtualMessageList({ messages, scrollContainerRef, onSuggestedRe grouped.push({ type: 'single', messages: [message], - id: message.id + id: message.id, }); } }); - + // Don't forget the last group if it's tools if (currentToolGroup.length > 0) { grouped.push({ type: 'toolGroup', messages: currentToolGroup, - id: `tool-group-${currentToolGroup[0].id}` + id: `tool-group-${currentToolGroup[0].id}`, }); } - + return grouped; }, [messages]); - + // Estimate initial size based on message content - const estimateSize = useCallback((index: number) => { - const group = groupedMessages[index]; - if (!group) return 150; // Default height - - // Use cached measurement if available - if (measurementsCache.current[group.id]) { - return measurementsCache.current[group.id]; - } - - if (group.type === 'toolGroup') { - // Estimate height for tool group - const baseHeight = 40; // Header height - const toolHeight = 60; // Height per tool - return baseHeight + (group.messages.length * toolHeight); - } else { - // Single message estimation - const message = group.messages[0]; - // Rough estimation based on content length and type - const baseHeight = 80; // Base height for message wrapper - const charPerLine = 80; - const lineHeight = 24; - const codeBlockHeight = 200; // Estimated height for code blocks - - const contentLines = Math.ceil(message.content.length / charPerLine); - - // Add extra height for code blocks - const codeBlockCount = (message.content.match(/```/g) || []).length / 2; - const estimatedHeight = baseHeight + (contentLines * lineHeight) + (codeBlockCount * codeBlockHeight); - - return Math.min(estimatedHeight, 800); // Cap at reasonable max height - } - }, [groupedMessages]); - + const estimateSize = useCallback( + (index: number) => { + const group = groupedMessages[index]; + if (!group) return 150; // Default height + + // Use cached measurement if available + if (measurementsCache.current[group.id]) { + return measurementsCache.current[group.id]; + } + + if (group.type === 'toolGroup') { + // Estimate height for tool group + const baseHeight = 40; // Header height + const toolHeight = 60; // Height per tool + return baseHeight + group.messages.length * toolHeight; + } else { + // Single message estimation + const message = group.messages[0]; + // Rough estimation based on content length and type + const baseHeight = 80; // Base height for message wrapper + const charPerLine = 80; + const lineHeight = 24; + const codeBlockHeight = 200; // Estimated height for code blocks + + const contentLines = Math.ceil(message.content.length / charPerLine); + + // Add extra height for code blocks + const codeBlockCount = (message.content.match(/```/g) || []).length / 2; + const estimatedHeight = + baseHeight + contentLines * lineHeight + codeBlockCount * codeBlockHeight; + + return Math.min(estimatedHeight, 800); // Cap at reasonable max height + } + }, + [groupedMessages] + ); + const rowVirtualizer = useVirtualizer({ count: groupedMessages.length, getScrollElement: () => scrollContainerRef.current, @@ -124,7 +136,7 @@ export function VirtualMessageList({ messages, scrollContainerRef, onSuggestedRe return htmlElement.offsetHeight; }, }); - + // Handle auto-scroll to bottom for new messages useEffect(() => { if (shouldAutoScroll.current && messages.length > 0 && scrollContainerRef.current) { @@ -133,41 +145,41 @@ export function VirtualMessageList({ messages, scrollContainerRef, onSuggestedRe scrollContainerRef.current.scrollTop = scrollContainerRef.current.scrollHeight; } }; - + // Use RAF to ensure DOM has updated requestAnimationFrame(() => { requestAnimationFrame(scrollToBottom); }); } }, [messages.length, scrollContainerRef]); - + // Detect user scrolling useEffect(() => { const scrollContainer = scrollContainerRef.current; if (!scrollContainer) return; - + const handleScroll = () => { isUserScrolling.current = true; - + // Clear existing timeout if (scrollTimeoutRef.current) { clearTimeout(scrollTimeoutRef.current); } - + // Check if scrolled to bottom const { scrollTop, scrollHeight, clientHeight } = scrollContainer; const isAtBottom = scrollTop + clientHeight >= scrollHeight - 50; // 50px threshold - + shouldAutoScroll.current = isAtBottom; - + // Reset user scrolling flag after scroll ends scrollTimeoutRef.current = setTimeout(() => { isUserScrolling.current = false; }, 150); }; - + scrollContainer.addEventListener('scroll', handleScroll, { passive: true }); - + return () => { scrollContainer.removeEventListener('scroll', handleScroll); if (scrollTimeoutRef.current) { @@ -175,10 +187,10 @@ export function VirtualMessageList({ messages, scrollContainerRef, onSuggestedRe } }; }, [scrollContainerRef]); - + const virtualItems = rowVirtualizer.getVirtualItems(); const totalSize = rowVirtualizer.getTotalSize(); - + return (
{virtualItems.map((virtualItem) => { const group = groupedMessages[virtualItem.index]; - + return (
{group.type === 'toolGroup' ? ( - + ) : ( - m.role === 'assistant' && m.id === group.messages[0].id) === messages.length - 1 + messages.findLastIndex( + (m) => m.role === 'assistant' && m.id === group.messages[0].id + ) === + messages.length - 1 } sessionId={sessionId} /> @@ -227,4 +239,4 @@ export function VirtualMessageList({ messages, scrollContainerRef, onSuggestedRe })}
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ui/Breadcrumb.tsx b/apps/v1/client/src/components/ui/Breadcrumb.tsx index 76ddac22..d3103ac8 100644 --- a/apps/v1/client/src/components/ui/Breadcrumb.tsx +++ b/apps/v1/client/src/components/ui/Breadcrumb.tsx @@ -16,34 +16,32 @@ export function Breadcrumb({ items }: BreadcrumbProps) { ); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ui/Button.tsx b/apps/v1/client/src/components/ui/Button.tsx index ae29f82b..2f1f10ce 100644 --- a/apps/v1/client/src/components/ui/Button.tsx +++ b/apps/v1/client/src/components/ui/Button.tsx @@ -13,14 +13,25 @@ interface ButtonProps extends React.ButtonHTMLAttributes { } export const Button = forwardRef( - ({ variant = 'secondary', size = 'md', fullWidth = false, className = '', children, as: Component = 'button', ...props }, ref) => { + ( + { + variant = 'secondary', + size = 'md', + fullWidth = false, + className = '', + children, + as: Component = 'button', + ...props + }, + ref + ) => { const { currentStyles } = useTheme(); const styles = currentStyles; const sizeClasses = { sm: 'px-3 h-8 text-sm', md: 'px-4 h-10', - lg: 'px-6 h-12 text-lg' + lg: 'px-6 h-12 text-lg', }; const variantClasses = { @@ -29,11 +40,11 @@ export const Button = forwardRef( ghost: `${styles.textColor} hover:${styles.contentBg} hover:opacity-80 font-medium`, circular: `bg-white/80 dark:bg-neutral-800/80 ${styles.textColor} border border-neutral-200/50 dark:border-neutral-700/50 shadow-sm hover:bg-white/90 dark:hover:bg-neutral-800/90 font-medium`, outline: `${styles.contentBg} ${styles.contentBorder} border ${styles.textColor} hover:bg-gray-100 dark:hover:bg-gray-700`, - danger: `bg-red-600 dark:bg-red-700 text-white hover:bg-red-700 dark:hover:bg-red-800 border border-transparent font-medium` + danger: `bg-red-600 dark:bg-red-700 text-white hover:bg-red-700 dark:hover:bg-red-800 border border-transparent font-medium`, }; const isIconButton = className.includes('icon-button'); - + return ( ( Button.displayName = 'Button'; -export type { ButtonProps }; \ No newline at end of file +export type { ButtonProps }; diff --git a/apps/v1/client/src/components/ui/Checkbox.tsx b/apps/v1/client/src/components/ui/Checkbox.tsx index 1442dcb6..80bc6776 100644 --- a/apps/v1/client/src/components/ui/Checkbox.tsx +++ b/apps/v1/client/src/components/ui/Checkbox.tsx @@ -39,4 +39,4 @@ export const Checkbox = forwardRef( } ); -Checkbox.displayName = 'Checkbox'; \ No newline at end of file +Checkbox.displayName = 'Checkbox'; diff --git a/apps/v1/client/src/components/ui/CrossFade.tsx b/apps/v1/client/src/components/ui/CrossFade.tsx index 4aee4e4d..146f1b8f 100644 --- a/apps/v1/client/src/components/ui/CrossFade.tsx +++ b/apps/v1/client/src/components/ui/CrossFade.tsx @@ -13,11 +13,15 @@ interface ImageState { key: string; } -export function CrossFade({ src, alt = '', className = '', duration = 300, fallbackSrc }: CrossFadeProps) { +export function CrossFade({ + src, + alt = '', + className = '', + duration = 300, + fallbackSrc, +}: CrossFadeProps) { // Keep track of both current and previous images - const [images, setImages] = useState([ - { src, key: `img-0` } - ]); + const [images, setImages] = useState([{ src, key: `img-0` }]); const [activeIndex, setActiveIndex] = useState(0); const timeoutRef = useRef(null); const imageCountRef = useRef(1); @@ -27,25 +31,25 @@ export function CrossFade({ src, alt = '', className = '', duration = 300, fallb // When src changes, add new image and start transition if (src !== currentSrcRef.current) { currentSrcRef.current = src; - + // Preload the new image const img = new Image(); img.src = src; - + // Clear any pending timeout if (timeoutRef.current) { clearTimeout(timeoutRef.current); } - + // Add new image and immediately set it as active const newKey = `img-${imageCountRef.current++}`; - setImages(prev => { + setImages((prev) => { // Always keep exactly 2 images during transition // Use the last image in the array as the current one const currentImage = prev[prev.length - 1]; return [currentImage, { src, key: newKey }]; }); - + // Start transition to new image after a frame to ensure DOM update requestAnimationFrame(() => { setActiveIndex(1); @@ -53,7 +57,7 @@ export function CrossFade({ src, alt = '', className = '', duration = 300, fallb // Clean up after transition completes timeoutRef.current = setTimeout(() => { - setImages(prev => { + setImages((prev) => { // Keep only the currently visible image const activeImage = prev[1] || prev[0]; return [activeImage]; @@ -71,7 +75,7 @@ export function CrossFade({ src, alt = '', className = '', duration = 300, fallb const handleError = (index: number) => { if (fallbackSrc) { - setImages(prev => { + setImages((prev) => { const newImages = [...prev]; newImages[index] = { ...newImages[index], src: fallbackSrc }; return newImages; @@ -82,8 +86,13 @@ export function CrossFade({ src, alt = '', className = '', duration = 300, fallb return (
{/* Invisible img to maintain aspect ratio */} - - + + {/* Actual crossfading images */} {images.map((img, index) => ( handleError(index)} /> ))}
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ui/DancingBubbles.tsx b/apps/v1/client/src/components/ui/DancingBubbles.tsx index 4df781e1..da689ff1 100644 --- a/apps/v1/client/src/components/ui/DancingBubbles.tsx +++ b/apps/v1/client/src/components/ui/DancingBubbles.tsx @@ -6,19 +6,19 @@ interface DancingBubblesProps { className?: string; } -export const DancingBubbles = memo(function DancingBubbles({ +export const DancingBubbles = memo(function DancingBubbles({ size = 'small', color = 'bg-neutral-400', - className = '' + className = '', }: DancingBubblesProps) { const sizeClasses = { small: 'w-2 h-2', medium: 'w-2.5 h-2.5', - large: 'w-3 h-3' + large: 'w-3 h-3', }; - + const bubbleClass = `${sizeClasses[size]} ${color} rounded-full animate-bounce`; - + return (
@@ -26,4 +26,4 @@ export const DancingBubbles = memo(function DancingBubbles({
); -}); \ No newline at end of file +}); diff --git a/apps/v1/client/src/components/ui/IconButton.tsx b/apps/v1/client/src/components/ui/IconButton.tsx index 25b1f66a..e0cb2518 100644 --- a/apps/v1/client/src/components/ui/IconButton.tsx +++ b/apps/v1/client/src/components/ui/IconButton.tsx @@ -11,7 +11,7 @@ export const IconButton = forwardRef( const sizeClasses = { sm: 'h-8 w-8', md: 'h-10 w-10', - lg: 'h-12 w-12' + lg: 'h-12 w-12', }; const isCircular = variant === 'circular'; @@ -29,4 +29,4 @@ export const IconButton = forwardRef( } ); -IconButton.displayName = 'IconButton'; \ No newline at end of file +IconButton.displayName = 'IconButton'; diff --git a/apps/v1/client/src/components/ui/Input.tsx b/apps/v1/client/src/components/ui/Input.tsx index d9a123b0..588bfcf2 100644 --- a/apps/v1/client/src/components/ui/Input.tsx +++ b/apps/v1/client/src/components/ui/Input.tsx @@ -58,4 +58,4 @@ export const Input = forwardRef( } ); -Input.displayName = 'Input'; \ No newline at end of file +Input.displayName = 'Input'; diff --git a/apps/v1/client/src/components/ui/LoadingSpinner.tsx b/apps/v1/client/src/components/ui/LoadingSpinner.tsx index 8a28e7eb..0e2af5a6 100644 --- a/apps/v1/client/src/components/ui/LoadingSpinner.tsx +++ b/apps/v1/client/src/components/ui/LoadingSpinner.tsx @@ -8,12 +8,12 @@ interface LoadingSpinnerProps { variant?: 'default' | 'primary' | 'neutral'; } -export function LoadingSpinner({ - size = 'medium', - text, +export function LoadingSpinner({ + size = 'medium', + text, showContainer = false, className = '', - variant = 'default' + variant = 'default', }: LoadingSpinnerProps) { const { currentStyles, isDarkMode } = useTheme(); const styles = currentStyles; @@ -23,44 +23,45 @@ export function LoadingSpinner({ small: { spinner: 'h-4 w-4 border-2', container: 'p-4', - textSize: 'text-sm' + textSize: 'text-sm', }, medium: { spinner: 'h-8 w-8 border-2', container: 'p-8', - textSize: 'text-base' + textSize: 'text-base', }, large: { spinner: 'h-12 w-12 border-b-2', container: 'p-12', - textSize: 'text-lg' - } + textSize: 'text-lg', + }, }; // Determine spinner color based on variant - const spinnerColorClass = variant === 'primary' - ? 'text-white' - : variant === 'neutral' - ? `${isDarkMode ? 'text-neutral-300' : 'text-neutral-600'}` - : `${styles.textColor}`; + const spinnerColorClass = + variant === 'primary' + ? 'text-white' + : variant === 'neutral' + ? `${isDarkMode ? 'text-neutral-300' : 'text-neutral-600'}` + : `${styles.textColor}`; const spinnerElement = (
-
- {text && ( -

- {text} -

- )} +
+ {text &&

{text}

}
); if (showContainer) { return ( -
+ `} + > {spinnerElement}
); @@ -70,7 +71,7 @@ export function LoadingSpinner({ } // Convenience components for common use cases -export function PageLoadingSpinner({ text = "Loading..." }: { text?: string }) { +export function PageLoadingSpinner({ text = 'Loading...' }: { text?: string }) { return (
@@ -78,6 +79,12 @@ export function PageLoadingSpinner({ text = "Loading..." }: { text?: string }) { ); } -export function InlineLoadingSpinner({ className = "", variant = "neutral" }: { className?: string; variant?: 'default' | 'primary' | 'neutral' }) { +export function InlineLoadingSpinner({ + className = '', + variant = 'neutral', +}: { + className?: string; + variant?: 'default' | 'primary' | 'neutral'; +}) { return ; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ui/Spinner.tsx b/apps/v1/client/src/components/ui/Spinner.tsx index d696b356..13f90516 100644 --- a/apps/v1/client/src/components/ui/Spinner.tsx +++ b/apps/v1/client/src/components/ui/Spinner.tsx @@ -9,29 +9,22 @@ export const Spinner: React.FC = ({ size = 'small', className = '' const sizeClasses = { small: 'w-4 h-4', medium: 'w-6 h-6', - large: 'w-8 h-8' + large: 'w-8 h-8', }; return ( - - - + ); -}; \ No newline at end of file +}; diff --git a/apps/v1/client/src/components/ui/Toggle.tsx b/apps/v1/client/src/components/ui/Toggle.tsx index 25eaee8b..078ed676 100644 --- a/apps/v1/client/src/components/ui/Toggle.tsx +++ b/apps/v1/client/src/components/ui/Toggle.tsx @@ -8,7 +8,13 @@ interface ToggleProps { className?: string; } -export function Toggle({ checked, onChange, label, disabled = false, className = '' }: ToggleProps) { +export function Toggle({ + checked, + onChange, + label, + disabled = false, + className = '', +}: ToggleProps) { const { currentStyles } = useTheme(); return ( @@ -24,9 +30,13 @@ export function Toggle({ checked, onChange, label, disabled = false, className = disabled={disabled} className="relative inline-block w-10 h-6 rounded-full transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2" > -
-
+
+
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/components/ui/ToggleButton.tsx b/apps/v1/client/src/components/ui/ToggleButton.tsx index cdb363d3..23d5c84d 100644 --- a/apps/v1/client/src/components/ui/ToggleButton.tsx +++ b/apps/v1/client/src/components/ui/ToggleButton.tsx @@ -8,7 +8,13 @@ interface ToggleButtonProps { className?: string; } -export function ToggleButton({ checked, onChange, label, disabled = false, className = '' }: ToggleButtonProps) { +export function ToggleButton({ + checked, + onChange, + label, + disabled = false, + className = '', +}: ToggleButtonProps) { const { currentStyles } = useTheme(); const styles = currentStyles; @@ -18,20 +24,22 @@ export function ToggleButton({ checked, onChange, label, disabled = false, class onClick={() => onChange(!checked)} disabled={disabled} className={`px-4 py-2 ${styles.borderRadius} transition-colors flex items-center gap-2 ${ - checked - ? `${styles.primaryButton} ${styles.primaryButtonText}` + checked + ? `${styles.primaryButton} ${styles.primaryButtonText}` : `bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-600` } ${disabled ? 'opacity-50 cursor-not-allowed' : ''} ${className}`} > -
+
{checked && ( - @@ -40,4 +48,4 @@ export function ToggleButton({ checked, onChange, label, disabled = false, class {label} ); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/config/api.ts b/apps/v1/client/src/config/api.ts index c620b51d..4bcbf376 100644 --- a/apps/v1/client/src/config/api.ts +++ b/apps/v1/client/src/config/api.ts @@ -20,4 +20,4 @@ export async function apiFetch(path: string, options?: RequestInit): Promise) => void; updatePersona: (id: string, updates: Partial) => void; deletePersona: (id: string) => void; createProject: (project: Omit) => void; updateProject: (id: string, updates: Partial) => void; - createWorkItem: (workItem: Omit) => WorkItem; + createWorkItem: ( + workItem: Omit + ) => WorkItem; updateWorkItem: (id: string, updates: Partial) => void; deleteWorkItem: (id: string) => void; assignPersonaToWorkItem: (workItemId: string, personaId: string) => void; startJamSession: (workItemId: string, participantIds: string[], title: string) => string; - addJamMessage: (sessionId: string, personaId: string, content: string, type: 'message' | 'challenge' | 'suggestion' | 'decision') => void; + addJamMessage: ( + sessionId: string, + personaId: string, + content: string, + type: 'message' | 'challenge' | 'suggestion' | 'decision' + ) => void; updateJamSession: (sessionId: string, updates: Partial) => void; syncWorkspaceProjects: (workspaceProjects: any[]) => void; } @@ -65,14 +72,16 @@ export function AppProvider({ children }: { children: ReactNode }) { }; const updatePersona = (id: string, updates: Partial) => { - setPersonas(personas.map(p => p.id === id ? { ...p, ...updates } : p)); + setPersonas(personas.map((p) => (p.id === id ? { ...p, ...updates } : p))); }; const deletePersona = (id: string) => { - setPersonas(personas.filter(p => p.id !== id)); + setPersonas(personas.filter((p) => p.id !== id)); }; - const createProject = (project: Omit) => { + const createProject = ( + project: Omit + ) => { const newProject: Project = { ...project, id: uuidv4(), @@ -84,14 +93,14 @@ export function AppProvider({ children }: { children: ReactNode }) { }; const updateProject = (id: string, updates: Partial) => { - setProjects(projects.map(p => - p.id === id - ? { ...p, ...updates, updatedAt: new Date() } - : p - )); + setProjects( + projects.map((p) => (p.id === id ? { ...p, ...updates, updatedAt: new Date() } : p)) + ); }; - const createWorkItem = (workItem: Omit) => { + const createWorkItem = ( + workItem: Omit + ) => { const newWorkItem: WorkItem = { ...workItem, id: uuidv4(), @@ -101,53 +110,58 @@ export function AppProvider({ children }: { children: ReactNode }) { metadata: workItem.metadata || undefined, }; setWorkItems([...workItems, newWorkItem]); - + // Add to project - setProjects(projects.map(p => - p.id === workItem.projectId - ? { ...p, workItems: [...p.workItems, newWorkItem.id], updatedAt: new Date() } - : p - )); - + setProjects( + projects.map((p) => + p.id === workItem.projectId + ? { ...p, workItems: [...p.workItems, newWorkItem.id], updatedAt: new Date() } + : p + ) + ); + return newWorkItem; }; const updateWorkItem = (id: string, updates: Partial) => { - setWorkItems(workItems.map(w => - w.id === id - ? { ...w, ...updates, updatedAt: new Date() } - : w - )); + setWorkItems( + workItems.map((w) => (w.id === id ? { ...w, ...updates, updatedAt: new Date() } : w)) + ); }; const deleteWorkItem = (id: string) => { // Remove from workItems - setWorkItems(workItems.filter(w => w.id !== id)); - + setWorkItems(workItems.filter((w) => w.id !== id)); + // Remove from project's workItems array - const workItem = workItems.find(w => w.id === id); + const workItem = workItems.find((w) => w.id === id); if (workItem) { - setProjects(projects.map(p => - p.id === workItem.projectId - ? { ...p, workItems: p.workItems.filter(wId => wId !== id), updatedAt: new Date() } - : p - )); + setProjects( + projects.map((p) => + p.id === workItem.projectId + ? { ...p, workItems: p.workItems.filter((wId) => wId !== id), updatedAt: new Date() } + : p + ) + ); } - + // Remove any jam sessions associated with this work item - setJamSessions(jamSessions.filter(js => js.workItemId !== id)); - + setJamSessions(jamSessions.filter((js) => js.workItemId !== id)); + // Clear any personas assigned to this work item - setPersonas(personas.map(p => - p.currentTaskId === id - ? { ...p, currentTaskId: undefined, status: 'available' } - : p - )); + setPersonas( + personas.map((p) => + p.currentTaskId === id ? { ...p, currentTaskId: undefined, status: 'available' } : p + ) + ); }; const assignPersonaToWorkItem = (workItemId: string, personaId: string) => { updateWorkItem(workItemId, { - assignedPersonaIds: [...(workItems.find(w => w.id === workItemId)?.assignedPersonaIds || []), personaId] + assignedPersonaIds: [ + ...(workItems.find((w) => w.id === workItemId)?.assignedPersonaIds || []), + personaId, + ], }); updatePersona(personaId, { currentTaskId: workItemId, status: 'busy' }); }; @@ -164,158 +178,205 @@ export function AppProvider({ children }: { children: ReactNode }) { status: 'active', }; setJamSessions([...jamSessions, newSession]); - + // Update work item - const workItem = workItems.find(w => w.id === workItemId); + const workItem = workItems.find((w) => w.id === workItemId); if (workItem) { updateWorkItem(workItemId, { - jamSessionIds: [...workItem.jamSessionIds, newSession.id] + jamSessionIds: [...workItem.jamSessionIds, newSession.id], }); } - + return newSession.id; }; - const addJamMessage = (sessionId: string, personaId: string, content: string, type: 'message' | 'challenge' | 'suggestion' | 'decision') => { - setJamSessions(jamSessions.map(session => - session.id === sessionId - ? { - ...session, - messages: [...session.messages, { - id: uuidv4(), - personaId, - content, - timestamp: new Date(), - type, - }] - } - : session - )); + const addJamMessage = ( + sessionId: string, + personaId: string, + content: string, + type: 'message' | 'challenge' | 'suggestion' | 'decision' + ) => { + setJamSessions( + jamSessions.map((session) => + session.id === sessionId + ? { + ...session, + messages: [ + ...session.messages, + { + id: uuidv4(), + personaId, + content, + timestamp: new Date(), + type, + }, + ], + } + : session + ) + ); }; - + const updateJamSession = (sessionId: string, updates: Partial) => { - setJamSessions(jamSessions.map(session => - session.id === sessionId - ? { ...session, ...updates } - : session - )); + setJamSessions( + jamSessions.map((session) => + session.id === sessionId ? { ...session, ...updates } : session + ) + ); }; const syncWorkspaceProjects = (workspaceProjects: any[]) => { console.log('Syncing workspace projects:', workspaceProjects); - console.log('Projects with plans:', workspaceProjects.filter(wp => wp.plans).map(wp => wp.name)); - console.log('Projects loading:', workspaceProjects.filter(wp => wp.isLoading).map(wp => wp.name)); - + console.log( + 'Projects with plans:', + workspaceProjects.filter((wp) => wp.plans).map((wp) => wp.name) + ); + console.log( + 'Projects loading:', + workspaceProjects.filter((wp) => wp.isLoading).map((wp) => wp.name) + ); + // First, sync work items from plans const allWorkItems: WorkItem[] = []; const projectWorkItemMap: { [projectId: string]: string[] } = {}; - - workspaceProjects.forEach(wp => { + + workspaceProjects.forEach((wp) => { // Skip projects that are still loading (don't have plans yet) if (wp.isLoading || !wp.plans) { - console.log(`Skipping project ${wp.name} - still loading details`, { isLoading: wp.isLoading, hasPlans: !!wp.plans }); + console.log(`Skipping project ${wp.name} - still loading details`, { + isLoading: wp.isLoading, + hasPlans: !!wp.plans, + }); return; } - + // Use the workspace path as a stable identifier (same as in project creation) const projectId = wp.path ? `project-${wp.path.replace(/[^a-zA-Z0-9]/g, '-')}` : uuidv4(); projectWorkItemMap[projectId] = []; - + // Process all plan types - ['ideas', 'planned', 'active', 'completed'].forEach(planType => { + ['ideas', 'planned', 'active', 'completed'].forEach((planType) => { if (wp.plans[planType]) { wp.plans[planType].forEach((plan: any) => { if (plan.workItem) { - // Use metadata workItemId if available, otherwise generate from plan name - const workItemId = plan.workItem.metadata?.workItemId || - `${projectId}-${plan.name.replace(/\.md$/, '')}`; - - // Check if work item already exists by ID or markdown path - const existingWorkItem = workItems.find(w => - w.id === workItemId || - (w.markdownPath && w.markdownPath === plan.path) - ); - - if (!existingWorkItem) { - console.log('Creating work item from plan:', { - planName: plan.name, - workItemTitle: plan.workItem.title, - tasksCount: plan.workItem.tasks ? plan.workItem.tasks.length : 0, - tasks: plan.workItem.tasks - }); - - const newWorkItem: WorkItem = { - id: workItemId, - title: plan.workItem.title || plan.name.replace(/\.md$/, '').replace(/-/g, ' '), - description: plan.workItem.description || '', - priority: (plan.workItem.priority || 'medium') as WorkItem['priority'], - status: plan.workItem.status === 'idea' ? 'todo' : - plan.workItem.status === 'planned' ? 'planned' : - plan.workItem.status === 'active' ? 'active' : - plan.workItem.status === 'completed' ? 'completed' : - planType === 'active' ? 'active' : - planType === 'completed' ? 'completed' : - planType === 'planned' ? 'planned' : 'todo', - projectId: projectId, - assignedPersonaIds: [], - workflow: [ - { name: 'Planning', status: planType === 'ideas' ? 'active' : 'completed' }, - { name: 'Development', status: planType === 'active' ? 'active' : planType === 'completed' ? 'completed' : 'pending' }, - { name: 'Testing', status: planType === 'completed' ? 'completed' : 'pending' }, - { name: 'Review', status: planType === 'completed' ? 'completed' : 'pending' } - ], - currentWorkflowStep: planType === 'ideas' ? 0 : planType === 'planned' ? 1 : planType === 'active' ? 2 : 3, - createdAt: new Date(), - updatedAt: new Date(), - jamSessionIds: [], - markdownPath: plan.path, - metadata: { - ...(plan.workItem.metadata || {}), - tasks: plan.workItem.tasks || [], - goals: plan.workItem.goals || [], - acceptanceCriteria: plan.workItem.acceptanceCriteria || [] - } - }; - allWorkItems.push(newWorkItem); - projectWorkItemMap[projectId].push(newWorkItem.id); - } + // Use metadata workItemId if available, otherwise generate from plan name + const workItemId = + plan.workItem.metadata?.workItemId || + `${projectId}-${plan.name.replace(/\.md$/, '')}`; + + // Check if work item already exists by ID or markdown path + const existingWorkItem = workItems.find( + (w) => w.id === workItemId || (w.markdownPath && w.markdownPath === plan.path) + ); + + if (!existingWorkItem) { + console.log('Creating work item from plan:', { + planName: plan.name, + workItemTitle: plan.workItem.title, + tasksCount: plan.workItem.tasks ? plan.workItem.tasks.length : 0, + tasks: plan.workItem.tasks, + }); + + const newWorkItem: WorkItem = { + id: workItemId, + title: plan.workItem.title || plan.name.replace(/\.md$/, '').replace(/-/g, ' '), + description: plan.workItem.description || '', + priority: (plan.workItem.priority || 'medium') as WorkItem['priority'], + status: + plan.workItem.status === 'idea' + ? 'todo' + : plan.workItem.status === 'planned' + ? 'planned' + : plan.workItem.status === 'active' + ? 'active' + : plan.workItem.status === 'completed' + ? 'completed' + : planType === 'active' + ? 'active' + : planType === 'completed' + ? 'completed' + : planType === 'planned' + ? 'planned' + : 'todo', + projectId: projectId, + assignedPersonaIds: [], + workflow: [ + { name: 'Planning', status: planType === 'ideas' ? 'active' : 'completed' }, + { + name: 'Development', + status: + planType === 'active' + ? 'active' + : planType === 'completed' + ? 'completed' + : 'pending', + }, + { name: 'Testing', status: planType === 'completed' ? 'completed' : 'pending' }, + { name: 'Review', status: planType === 'completed' ? 'completed' : 'pending' }, + ], + currentWorkflowStep: + planType === 'ideas' + ? 0 + : planType === 'planned' + ? 1 + : planType === 'active' + ? 2 + : 3, + createdAt: new Date(), + updatedAt: new Date(), + jamSessionIds: [], + markdownPath: plan.path, + metadata: { + ...(plan.workItem.metadata || {}), + tasks: plan.workItem.tasks || [], + goals: plan.workItem.goals || [], + acceptanceCriteria: plan.workItem.acceptanceCriteria || [], + }, + }; + allWorkItems.push(newWorkItem); + projectWorkItemMap[projectId].push(newWorkItem.id); } + } }); } }); }); - + // Add new work items (avoiding duplicates) if (allWorkItems.length > 0) { - setWorkItems(prevWorkItems => { + setWorkItems((prevWorkItems) => { // Create a map of existing work items by their markdown path - const existingPaths = new Set(prevWorkItems.map(item => item.markdownPath).filter(Boolean)); - + const existingPaths = new Set( + prevWorkItems.map((item) => item.markdownPath).filter(Boolean) + ); + // Filter out work items that already exist - const newUniqueWorkItems = allWorkItems.filter(item => - !item.markdownPath || !existingPaths.has(item.markdownPath) + const newUniqueWorkItems = allWorkItems.filter( + (item) => !item.markdownPath || !existingPaths.has(item.markdownPath) ); - + console.log('Syncing work items:', { existingCount: prevWorkItems.length, newCount: allWorkItems.length, uniqueNewCount: newUniqueWorkItems.length, - duplicatesSkipped: allWorkItems.length - newUniqueWorkItems.length + duplicatesSkipped: allWorkItems.length - newUniqueWorkItems.length, }); - + return [...prevWorkItems, ...newUniqueWorkItems]; }); } - + // Convert workspace projects to app projects - const newProjects: Project[] = workspaceProjects.map(wp => { + const newProjects: Project[] = workspaceProjects.map((wp) => { // Use the workspace path as a stable identifier - const stableProjectId = wp.path ? `project-${wp.path.replace(/[^a-zA-Z0-9]/g, '-')}` : uuidv4(); - + const stableProjectId = wp.path + ? `project-${wp.path.replace(/[^a-zA-Z0-9]/g, '-')}` + : uuidv4(); + // Check if project already exists by path or name - const existingProject = projects.find(p => p.path === wp.path || p.name === wp.name); + const existingProject = projects.find((p) => p.path === wp.path || p.name === wp.name); const projectId = existingProject?.id || stableProjectId; - + if (existingProject) { // Update existing project with workspace data return { @@ -327,10 +388,12 @@ export function AppProvider({ children }: { children: ReactNode }) { primaryRepoUrl: wp.primaryRepoUrl, readme: wp.readme, path: wp.path, - workItems: [...new Set([...existingProject.workItems, ...(projectWorkItemMap[projectId] || [])])] // Avoid duplicate work item IDs + workItems: [ + ...new Set([...existingProject.workItems, ...(projectWorkItemMap[projectId] || [])]), + ], // Avoid duplicate work item IDs }; } - + // Create new project from workspace data return { id: projectId, @@ -347,7 +410,7 @@ export function AppProvider({ children }: { children: ReactNode }) { readme: wp.readme, }; }); - + setProjects(newProjects); }; @@ -381,4 +444,4 @@ export function useApp() { throw new Error('useApp must be used within AppProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/contexts/AuthContext.tsx b/apps/v1/client/src/contexts/AuthContext.tsx index aa6b9c0c..8dee1b1a 100644 --- a/apps/v1/client/src/contexts/AuthContext.tsx +++ b/apps/v1/client/src/contexts/AuthContext.tsx @@ -9,7 +9,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { const [authState, setAuthState] = useState({ isAuthenticated: false, accounts: [], - activeAccountId: null + activeAccountId: null, }); const [isInitialized, setIsInitialized] = useState(false); @@ -18,16 +18,16 @@ export function AuthProvider({ children }: { children: ReactNode }) { const loadAndVerifyAuth = async () => { const savedState = localStorage.getItem(STORAGE_KEY); console.log('Loading auth state from localStorage:', savedState); - + if (savedState) { try { const parsed = JSON.parse(savedState); console.log('Parsed auth state:', parsed); - + // For development, skip verification and trust the stored state // In production, you'd want to verify tokens are still valid const skipVerification = true; // Toggle this for development - + if (skipVerification) { // Just restore the saved state setAuthState(parsed); @@ -39,9 +39,9 @@ export function AuthProvider({ children }: { children: ReactNode }) { const response = await fetch('http://localhost:3000/api/auth/github/verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ accountId: account.id }) + body: JSON.stringify({ accountId: account.id }), }); - + if (response.ok) { validAccounts.push(account); } else { @@ -51,14 +51,14 @@ export function AuthProvider({ children }: { children: ReactNode }) { console.log(`Account ${account.username} verification error:`, error); } } - + // Update state with only valid accounts setAuthState({ isAuthenticated: validAccounts.length > 0, accounts: validAccounts, - activeAccountId: validAccounts.find(a => a.id === parsed.activeAccountId) - ? parsed.activeAccountId - : (validAccounts[0]?.id || null) + activeAccountId: validAccounts.find((a) => a.id === parsed.activeAccountId) + ? parsed.activeAccountId + : validAccounts[0]?.id || null, }); } } catch (error) { @@ -67,7 +67,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { } setIsInitialized(true); }; - + loadAndVerifyAuth(); }, []); @@ -79,16 +79,15 @@ export function AuthProvider({ children }: { children: ReactNode }) { } }, [authState, isInitialized]); - const activeAccount = authState.accounts.find( - account => account.id === authState.activeAccountId - ) || null; + const activeAccount = + authState.accounts.find((account) => account.id === authState.activeAccountId) || null; const signInWithGitHub = async () => { try { // Initiate GitHub OAuth flow const response = await fetch('http://localhost:3000/api/auth/github/login', { method: 'POST', - headers: { 'Content-Type': 'application/json' } + headers: { 'Content-Type': 'application/json' }, }); if (!response.ok) { @@ -108,7 +107,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { 'github-oauth', `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no,scrollbars=yes,resizable=yes` ); - + if (!popup) { throw new Error('Please allow popups for GitHub authentication'); } @@ -116,7 +115,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { // Listen for OAuth callback const handleMessage = async (event: MessageEvent) => { console.log('Message received:', event.origin, event.data); - + if (event.origin !== window.location.origin) { console.log('Origin mismatch:', event.origin, 'vs', window.location.origin); return; @@ -130,17 +129,15 @@ export function AuthProvider({ children }: { children: ReactNode }) { const tokenResponse = await fetch('http://localhost:3000/api/auth/github/token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ code, state }) + body: JSON.stringify({ code, state }), }); if (tokenResponse.ok) { const accountData = await tokenResponse.json(); - + // Add or update account in state - setAuthState(prev => { - const existingIndex = prev.accounts.findIndex( - acc => acc.id === accountData.id - ); + setAuthState((prev) => { + const existingIndex = prev.accounts.findIndex((acc) => acc.id === accountData.id); let newAccounts; if (existingIndex >= 0) { @@ -155,7 +152,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { return { isAuthenticated: true, accounts: newAccounts, - activeAccountId: accountData.id + activeAccountId: accountData.id, }; }); } @@ -177,7 +174,6 @@ export function AuthProvider({ children }: { children: ReactNode }) { window.removeEventListener('message', handleMessage); } }, 1000); - } catch (error) { console.error('GitHub sign in error:', error); throw error; @@ -188,20 +184,19 @@ export function AuthProvider({ children }: { children: ReactNode }) { try { // Call backend to revoke token await fetch(`http://localhost:3000/api/auth/github/logout/${accountId}`, { - method: 'POST' + method: 'POST', }); // Remove account from state - setAuthState(prev => { - const newAccounts = prev.accounts.filter(acc => acc.id !== accountId); + setAuthState((prev) => { + const newAccounts = prev.accounts.filter((acc) => acc.id !== accountId); const wasActive = prev.activeAccountId === accountId; - + return { isAuthenticated: newAccounts.length > 0, accounts: newAccounts, - activeAccountId: wasActive && newAccounts.length > 0 - ? newAccounts[0].id - : prev.activeAccountId + activeAccountId: + wasActive && newAccounts.length > 0 ? newAccounts[0].id : prev.activeAccountId, }; }); } catch (error) { @@ -211,9 +206,9 @@ export function AuthProvider({ children }: { children: ReactNode }) { }; const switchAccount = (accountId: string) => { - setAuthState(prev => ({ + setAuthState((prev) => ({ ...prev, - activeAccountId: accountId + activeAccountId: accountId, })); }; @@ -223,9 +218,9 @@ export function AuthProvider({ children }: { children: ReactNode }) { const response = await fetch('http://localhost:3000/api/auth/github/accounts'); if (response.ok) { const accounts = await response.json(); - setAuthState(prev => ({ + setAuthState((prev) => ({ ...prev, - accounts + accounts, })); } } catch (error) { @@ -239,7 +234,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { signInWithGitHub, signOut, switchAccount, - refreshAccounts + refreshAccounts, }; return {children}; @@ -251,4 +246,4 @@ export function useAuth() { throw new Error('useAuth must be used within an AuthProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/contexts/ClaudeCodeContext.tsx b/apps/v1/client/src/contexts/ClaudeCodeContext.tsx index 654660b5..56e369d4 100644 --- a/apps/v1/client/src/contexts/ClaudeCodeContext.tsx +++ b/apps/v1/client/src/contexts/ClaudeCodeContext.tsx @@ -1,4 +1,12 @@ -import { createContext, useContext, useState, useCallback, useRef, useEffect, type ReactNode } from 'react'; +import { + createContext, + useContext, + useState, + useCallback, + useRef, + useEffect, + type ReactNode, +} from 'react'; import { v4 as uuidv4 } from 'uuid'; import { generateSuggestedResponses } from '../utils/suggestedResponses'; @@ -56,7 +64,7 @@ interface ClaudeCodeContextType { isProcessing: boolean; currentMessageId: string | null; todos: Todo[]; - + // Actions sendMessage: (content: string) => Promise; setMode: (mode: ClaudeMode) => void; @@ -72,22 +80,26 @@ const STORAGE_KEY = 'claudeCodeState'; export function ClaudeCodeProvider({ children }: { children: ReactNode }) { const mountCountRef = useRef(0); const isMountedRef = useRef(true); - + // Debug logging for mount/unmount tracking useEffect(() => { isMountedRef.current = true; mountCountRef.current++; const mountTime = Date.now(); - console.log(`[ClaudeCodeProvider] MOUNTED #${mountCountRef.current} at ${new Date(mountTime).toISOString()}`); - + console.log( + `[ClaudeCodeProvider] MOUNTED #${mountCountRef.current} at ${new Date(mountTime).toISOString()}` + ); + return () => { isMountedRef.current = false; const unmountTime = Date.now(); const lifetimeMs = unmountTime - mountTime; - console.log(`[ClaudeCodeProvider] UNMOUNTING #${mountCountRef.current} at ${new Date(unmountTime).toISOString()}, lifetime: ${lifetimeMs}ms`); + console.log( + `[ClaudeCodeProvider] UNMOUNTING #${mountCountRef.current} at ${new Date(unmountTime).toISOString()}, lifetime: ${lifetimeMs}ms` + ); }; }, []); - + const [messages, setMessages] = useState([]); const [mode, setMode] = useState(() => { const saved = localStorage.getItem('claudeCodeMode'); @@ -102,7 +114,7 @@ export function ClaudeCodeProvider({ children }: { children: ReactNode }) { const [isProcessing, setIsProcessing] = useState(false); const [currentMessageId, setCurrentMessageId] = useState(null); const [todos, setTodos] = useState([]); - + const eventSourceRef = useRef(null); const streamingMessageContentRef = useRef>(new Map()); const connectionIdRef = useRef(null); @@ -110,12 +122,12 @@ export function ClaudeCodeProvider({ children }: { children: ReactNode }) { const lastConnectionAttemptRef = useRef(0); const sessionInitializationRef = useRef | null>(null); const isRestoringExistingSessionRef = useRef(false); - + // Persist mode changes useEffect(() => { localStorage.setItem('claudeCodeMode', mode); }, [mode]); - + // Clean up on unmount useEffect(() => { return () => { @@ -127,717 +139,813 @@ export function ClaudeCodeProvider({ children }: { children: ReactNode }) { } }; }, [sessionId]); - - const setupSSEConnection = useCallback((sessionId: string, repoName?: string) => { - console.log(`[ClaudeCodeProvider] setupSSEConnection called for sessionId: ${sessionId}`); - // Prevent multiple connections - if (eventSourceRef.current && eventSourceRef.current.readyState !== EventSource.CLOSED) { - console.log('[ClaudeCodeProvider] SSE connection already exists, skipping setup'); - return; - } - - // Debounce rapid connection attempts (React StrictMode in dev) - const now = Date.now(); - if (now - lastConnectionAttemptRef.current < 100) { - console.log('Debouncing rapid SSE connection attempt'); - return; - } - lastConnectionAttemptRef.current = now; - - // Store repo name for error handling - if (repoName) { - setReservedRepo(repoName); - } - - // Clear any pending connection timeout - if (connectionTimeoutRef.current) { - clearTimeout(connectionTimeoutRef.current); - connectionTimeoutRef.current = null; - } - - // Generate a unique connection ID to track this connection - const connectionId = `${sessionId}-${Date.now()}-${Math.random()}`; - console.log('Setting up SSE connection:', connectionId); - - // Close any existing connection - if (eventSourceRef.current) { - console.log('Closing existing SSE connection:', connectionIdRef.current); - eventSourceRef.current.close(); - eventSourceRef.current = null; - } - - // Store the new connection ID - connectionIdRef.current = connectionId; - - const eventSource = new EventSource(`http://localhost:3000/api/claude/code/stream?sessionId=${sessionId}&connectionId=${encodeURIComponent(connectionId)}`); - - eventSource.onopen = () => { - console.log('SSE connection opened:', connectionId); - setIsConnected(true); - - // Clear the restoring flag after a short delay to allow existing messages to be processed - if (isRestoringExistingSessionRef.current) { - setTimeout(() => { - console.log('Clearing isRestoringExistingSessionRef flag'); - isRestoringExistingSessionRef.current = false; - }, 2000); // 2 seconds to ensure all existing messages are processed + + const setupSSEConnection = useCallback( + (sessionId: string, repoName?: string) => { + console.log(`[ClaudeCodeProvider] setupSSEConnection called for sessionId: ${sessionId}`); + // Prevent multiple connections + if (eventSourceRef.current && eventSourceRef.current.readyState !== EventSource.CLOSED) { + console.log('[ClaudeCodeProvider] SSE connection already exists, skipping setup'); + return; } - }; - - eventSource.onmessage = (event) => { - console.log('SSE default message received:', event.data); - }; - - eventSource.onerror = (error) => { - console.error('SSE connection error:', connectionId, error); - console.error('Error event type:', error.type); - console.error('EventSource readyState:', eventSource.readyState); - - // Only close on actual errors, not on connection establishment - if (eventSource.readyState === EventSource.CLOSED) { - console.log('SSE connection was closed'); - setIsConnected(false); - - if (eventSourceRef.current === eventSource) { - eventSourceRef.current = null; - } - } else { - console.log('SSE connection error but not closing, readyState:', eventSource.readyState); + + // Debounce rapid connection attempts (React StrictMode in dev) + const now = Date.now(); + if (now - lastConnectionAttemptRef.current < 100) { + console.log('Debouncing rapid SSE connection attempt'); + return; } - }; - - eventSource.addEventListener('message-start', (event) => { - const data = JSON.parse(event.data); - console.log('message-start event received:', data); - console.log('Is greeting:', data.isGreeting); - console.log('isRestoringExistingSessionRef.current:', isRestoringExistingSessionRef.current); - - // Check if this is an existing message being restored - const isExistingMessage = isRestoringExistingSessionRef.current; - console.log('isExistingMessage:', isExistingMessage); - - // Create the new message - const newMessage: ClaudeMessage = { - id: data.id, - role: 'assistant', - content: '', // Start with empty content - timestamp: new Date(), - startTime: new Date(), - isStreaming: !isExistingMessage, // Don't stream existing messages - isGreeting: data.isGreeting, - isError: data.isError, - mode: data.mode + lastConnectionAttemptRef.current = now; + + // Store repo name for error handling + if (repoName) { + setReservedRepo(repoName); + } + + // Clear any pending connection timeout + if (connectionTimeoutRef.current) { + clearTimeout(connectionTimeoutRef.current); + connectionTimeoutRef.current = null; + } + + // Generate a unique connection ID to track this connection + const connectionId = `${sessionId}-${Date.now()}-${Math.random()}`; + console.log('Setting up SSE connection:', connectionId); + + // Close any existing connection + if (eventSourceRef.current) { + console.log('Closing existing SSE connection:', connectionIdRef.current); + eventSourceRef.current.close(); + eventSourceRef.current = null; + } + + // Store the new connection ID + connectionIdRef.current = connectionId; + + const eventSource = new EventSource( + `http://localhost:3000/api/claude/code/stream?sessionId=${sessionId}&connectionId=${encodeURIComponent(connectionId)}` + ); + + eventSource.onopen = () => { + console.log('SSE connection opened:', connectionId); + setIsConnected(true); + + // Clear the restoring flag after a short delay to allow existing messages to be processed + if (isRestoringExistingSessionRef.current) { + setTimeout(() => { + console.log('Clearing isRestoringExistingSessionRef flag'); + isRestoringExistingSessionRef.current = false; + }, 2000); // 2 seconds to ensure all existing messages are processed + } + }; + + eventSource.onmessage = (event) => { + console.log('SSE default message received:', event.data); }; - - console.log('Creating message with isStreaming:', !isExistingMessage, 'isExistingMessage:', isExistingMessage); - - // Check if message already exists or if we recently created a greeting - setMessages(prev => { - console.log('setMessages called in message-start, prev length:', prev.length); - console.log('Previous messages:', prev.map(m => ({ id: m.id, role: m.role, content: m.content.substring(0, 50) }))); - - const existingMessage = prev.find(msg => msg.id === data.id); - if (existingMessage) { - console.warn('Message already exists with ID:', data.id); - return prev; + + eventSource.onerror = (error) => { + console.error('SSE connection error:', connectionId, error); + console.error('Error event type:', error.type); + console.error('EventSource readyState:', eventSource.readyState); + + // Only close on actual errors, not on connection establishment + if (eventSource.readyState === EventSource.CLOSED) { + console.log('SSE connection was closed'); + setIsConnected(false); + + if (eventSourceRef.current === eventSource) { + eventSourceRef.current = null; + } + } else { + console.log('SSE connection error but not closing, readyState:', eventSource.readyState); } - - // Check for recent greeting messages (within 2 seconds) - if (data.isGreeting) { - const recentGreeting = prev.find(msg => - msg.isGreeting && - msg.timestamp && - (new Date().getTime() - msg.timestamp.getTime()) < 2000 + }; + + eventSource.addEventListener('message-start', (event) => { + const data = JSON.parse(event.data); + console.log('message-start event received:', data); + console.log('Is greeting:', data.isGreeting); + console.log( + 'isRestoringExistingSessionRef.current:', + isRestoringExistingSessionRef.current + ); + + // Check if this is an existing message being restored + const isExistingMessage = isRestoringExistingSessionRef.current; + console.log('isExistingMessage:', isExistingMessage); + + // Create the new message + const newMessage: ClaudeMessage = { + id: data.id, + role: 'assistant', + content: '', // Start with empty content + timestamp: new Date(), + startTime: new Date(), + isStreaming: !isExistingMessage, // Don't stream existing messages + isGreeting: data.isGreeting, + isError: data.isError, + mode: data.mode, + }; + + console.log( + 'Creating message with isStreaming:', + !isExistingMessage, + 'isExistingMessage:', + isExistingMessage + ); + + // Check if message already exists or if we recently created a greeting + setMessages((prev) => { + console.log('setMessages called in message-start, prev length:', prev.length); + console.log( + 'Previous messages:', + prev.map((m) => ({ id: m.id, role: m.role, content: m.content.substring(0, 50) })) ); - if (recentGreeting) { - console.warn('Recent greeting already exists, ignoring duplicate'); + + const existingMessage = prev.find((msg) => msg.id === data.id); + if (existingMessage) { + console.warn('Message already exists with ID:', data.id); return prev; } - } - - // Find and replace any placeholder message (empty assistant message that's streaming) - const placeholderIndex = prev.findIndex(msg => - msg.role === 'assistant' && - msg.content === '' && - msg.isStreaming === true && - !msg.isGreeting - ); - - if (placeholderIndex !== -1) { - console.log('Replacing placeholder message at index:', placeholderIndex); - const newMessages = [...prev]; - newMessages[placeholderIndex] = newMessage; + + // Check for recent greeting messages (within 2 seconds) + if (data.isGreeting) { + const recentGreeting = prev.find( + (msg) => + msg.isGreeting && + msg.timestamp && + new Date().getTime() - msg.timestamp.getTime() < 2000 + ); + if (recentGreeting) { + console.warn('Recent greeting already exists, ignoring duplicate'); + return prev; + } + } + + // Find and replace any placeholder message (empty assistant message that's streaming) + const placeholderIndex = prev.findIndex( + (msg) => + msg.role === 'assistant' && + msg.content === '' && + msg.isStreaming === true && + !msg.isGreeting + ); + + if (placeholderIndex !== -1) { + console.log('Replacing placeholder message at index:', placeholderIndex); + const newMessages = [...prev]; + newMessages[placeholderIndex] = newMessage; + return newMessages; + } + + console.log('Creating new message:', newMessage); + const newMessages = [...prev, newMessage]; + console.log( + 'New messages array:', + newMessages.map((m) => ({ + id: m.id, + role: m.role, + content: m.content.substring(0, 50), + })) + ); return newMessages; + }); + + if (!data.isGreeting && !isExistingMessage) { + setIsProcessing(true); + setCurrentMessageId(data.id); + } + + // Initialize streaming content for this message + if (!isExistingMessage) { + streamingMessageContentRef.current.set(data.id, ''); + console.log('Initialized streaming content for new message:', data.id); + } else { + const existingContent = streamingMessageContentRef.current.get(data.id) || ''; + console.log( + 'Preserving streaming content for existing message:', + data.id, + existingContent.substring(0, 50) + ); } - - console.log('Creating new message:', newMessage); - const newMessages = [...prev, newMessage]; - console.log('New messages array:', newMessages.map(m => ({ id: m.id, role: m.role, content: m.content.substring(0, 50) }))); - return newMessages; }); - - if (!data.isGreeting && !isExistingMessage) { - setIsProcessing(true); - setCurrentMessageId(data.id); - } - - // Initialize streaming content for this message - if (!isExistingMessage) { - streamingMessageContentRef.current.set(data.id, ''); - console.log('Initialized streaming content for new message:', data.id); - } else { - const existingContent = streamingMessageContentRef.current.get(data.id) || ''; - console.log('Preserving streaming content for existing message:', data.id, existingContent.substring(0, 50)); - } - }); - - eventSource.addEventListener('message-chunk', (event) => { - console.log('message-chunk event received, data length:', event.data.length); - const data = JSON.parse(event.data); - console.log('Chunk for messageId:', data.messageId); - console.log('Chunk content:', data.chunk); - console.log('Chunk content length:', data.chunk?.length); - - // Get current content for this message - const currentContent = streamingMessageContentRef.current.get(data.messageId) || ''; - - // For existing messages, reset the streaming content before adding the chunk - // This prevents appending to previous content - if (isRestoringExistingSessionRef.current) { - streamingMessageContentRef.current.set(data.messageId, data.chunk); - console.log('Restored existing message content, length:', data.chunk?.length); - } else { - // Append chunk to streaming content for new messages - streamingMessageContentRef.current.set(data.messageId, currentContent + data.chunk); - } - const updatedContent = streamingMessageContentRef.current.get(data.messageId) || ''; - console.log('Streaming content for', data.messageId, 'now:', updatedContent.substring(0, 50)); - - setMessages(prev => { - console.log('setMessages in message-chunk, looking for messageId:', data.messageId); - console.log('Current messages before update:', prev.map(m => ({ id: m.id, content: m.content.substring(0, 30) }))); - - const messageExists = prev.some(msg => msg.id === data.messageId); - if (!messageExists) { - console.error('Message not found for chunk! MessageId:', data.messageId); - console.log('Attempting to create message from chunk data'); - // Create the message if it doesn't exist (can happen due to race conditions) - const newMessage: ClaudeMessage = { - id: data.messageId, - role: 'assistant', - content: streamingMessageContentRef.current.get(data.messageId) || '', - timestamp: new Date(), - startTime: new Date(), - isStreaming: true, - isGreeting: true // Assume greeting for now - }; - return [...prev, newMessage]; + + eventSource.addEventListener('message-chunk', (event) => { + console.log('message-chunk event received, data length:', event.data.length); + const data = JSON.parse(event.data); + console.log('Chunk for messageId:', data.messageId); + console.log('Chunk content:', data.chunk); + console.log('Chunk content length:', data.chunk?.length); + + // Get current content for this message + const currentContent = streamingMessageContentRef.current.get(data.messageId) || ''; + + // For existing messages, reset the streaming content before adding the chunk + // This prevents appending to previous content + if (isRestoringExistingSessionRef.current) { + streamingMessageContentRef.current.set(data.messageId, data.chunk); + console.log('Restored existing message content, length:', data.chunk?.length); + } else { + // Append chunk to streaming content for new messages + streamingMessageContentRef.current.set(data.messageId, currentContent + data.chunk); } - - const updated = prev.map(msg => { - if (msg.id === data.messageId) { - const newContent = streamingMessageContentRef.current.get(data.messageId) || ''; - console.log('Updating message:', msg.id, 'old content:', msg.content.substring(0, 30), 'new content:', newContent.substring(0, 30)); - // For existing messages that aren't streaming, mark as complete immediately - const isComplete = !msg.isStreaming; - const updatedMessage = { - ...msg, + const updatedContent = streamingMessageContentRef.current.get(data.messageId) || ''; + console.log( + 'Streaming content for', + data.messageId, + 'now:', + updatedContent.substring(0, 50) + ); + + setMessages((prev) => { + console.log('setMessages in message-chunk, looking for messageId:', data.messageId); + console.log( + 'Current messages before update:', + prev.map((m) => ({ id: m.id, content: m.content.substring(0, 30) })) + ); + + const messageExists = prev.some((msg) => msg.id === data.messageId); + if (!messageExists) { + console.error('Message not found for chunk! MessageId:', data.messageId); + console.log('Attempting to create message from chunk data'); + // Create the message if it doesn't exist (can happen due to race conditions) + const newMessage: ClaudeMessage = { + id: data.messageId, + role: 'assistant', content: streamingMessageContentRef.current.get(data.messageId) || '', - isStreaming: isComplete ? false : msg.isStreaming + timestamp: new Date(), + startTime: new Date(), + isStreaming: true, + isGreeting: true, // Assume greeting for now }; - console.log('Updated message content length:', updatedMessage.content.length); - return updatedMessage; + return [...prev, newMessage]; } - return msg; - }); - console.log('Updated messages after chunk:', updated.map(m => ({ id: m.id, content: m.content.substring(0, 30) }))); - return updated; - }); - }); - - eventSource.addEventListener('message-end', (event) => { - const data = JSON.parse(event.data); - console.log('message-end event received for messageId:', data.messageId); - setMessages(prev => prev.map(msg => { - if (msg.id === data.messageId) { - console.log('Setting isStreaming to false for message:', msg.id); - // Generate suggested responses based on the final content - const suggestedResponses = generateSuggestedResponses(msg.content); - return { ...msg, isStreaming: false, suggestedResponses }; - } - return msg; - })); - // Clean up streaming content for this message - streamingMessageContentRef.current.delete(data.messageId); - setIsProcessing(false); - setCurrentMessageId(null); - }); - - eventSource.addEventListener('message-complete', (event) => { - const data = JSON.parse(event.data); - console.log('message-complete event received for messageId:', data.messageId); - setMessages(prev => { - console.log('Processing message-complete, current messages:', prev.map(m => ({ id: m.id, content: m.content.substring(0, 30) }))); - const updated = prev.map(msg => { - if (msg.id === data.messageId) { - console.log('Found message to complete:', msg.id, 'current content length:', msg.content.length); - const streamingContent = streamingMessageContentRef.current.get(data.messageId) || ''; - console.log('streamingContent length:', streamingContent.length); - - // For existing messages, always use the message content (it should already be set) - // For new messages, use streaming content - let finalContent = msg.content; - if (msg.content.length === 0 && streamingContent.length > 0) { - finalContent = streamingContent; - console.log('Using streaming content for empty message'); - } else if (msg.content.length > 0) { - console.log('Using existing message content'); + + const updated = prev.map((msg) => { + if (msg.id === data.messageId) { + const newContent = streamingMessageContentRef.current.get(data.messageId) || ''; + console.log( + 'Updating message:', + msg.id, + 'old content:', + msg.content.substring(0, 30), + 'new content:', + newContent.substring(0, 30) + ); + // For existing messages that aren't streaming, mark as complete immediately + const isComplete = !msg.isStreaming; + const updatedMessage = { + ...msg, + content: streamingMessageContentRef.current.get(data.messageId) || '', + isStreaming: isComplete ? false : msg.isStreaming, + }; + console.log('Updated message content length:', updatedMessage.content.length); + return updatedMessage; } - - console.log('Final content length:', finalContent.length); - console.log('Final content preview:', finalContent.substring(0, 50)); - - // Generate suggested responses based on the final content - const suggestedResponses = generateSuggestedResponses(finalContent); - return { ...msg, content: finalContent, isStreaming: false, suggestedResponses }; - } - return msg; + return msg; + }); + console.log( + 'Updated messages after chunk:', + updated.map((m) => ({ id: m.id, content: m.content.substring(0, 30) })) + ); + return updated; }); - console.log('After message-complete, updated messages:', updated.map(m => ({ id: m.id, content: m.content.substring(0, 30) }))); - return updated; }); - - // Clean up streaming content for this message if we're not restoring - if (!isRestoringExistingSessionRef.current) { - streamingMessageContentRef.current.delete(data.messageId); - } - setCurrentMessageId(null); - setIsProcessing(false); - }); - - eventSource.addEventListener('thinking', (event) => { - const data = JSON.parse(event.data); - // Show thinking status in the assistant message that's about to come - console.log('Claude is thinking...', data.status); - }); - - eventSource.addEventListener('progress', (event) => { - const data = JSON.parse(event.data); - console.log('Progress event received (should not happen):', data); - // Don't update message content with progress status - // Only update token count if needed - if (data.tokenCount) { - setMessages(prev => prev.map(msg => - msg.id === data.messageId - ? { ...msg, tokenCount: data.tokenCount } - : msg - )); - } - }); - - eventSource.addEventListener('tool-start', (event) => { - const data = JSON.parse(event.data); - console.log('tool-start event received:', data); - - // First, end any currently streaming assistant message - const currentStreamingMessageId = currentMessageId; - if (currentStreamingMessageId) { - console.log('Ending streaming message due to tool start:', currentStreamingMessageId); - setMessages(prev => prev.map(msg => { - if (msg.id === currentStreamingMessageId && msg.isStreaming) { - console.log('Setting isStreaming to false for message:', msg.id); - // Generate suggested responses based on the current content - const suggestedResponses = generateSuggestedResponses(msg.content); - return { ...msg, isStreaming: false, suggestedResponses }; - } - return msg; - })); + + eventSource.addEventListener('message-end', (event) => { + const data = JSON.parse(event.data); + console.log('message-end event received for messageId:', data.messageId); + setMessages((prev) => + prev.map((msg) => { + if (msg.id === data.messageId) { + console.log('Setting isStreaming to false for message:', msg.id); + // Generate suggested responses based on the final content + const suggestedResponses = generateSuggestedResponses(msg.content); + return { ...msg, isStreaming: false, suggestedResponses }; + } + return msg; + }) + ); // Clean up streaming content for this message - streamingMessageContentRef.current.delete(currentStreamingMessageId); + streamingMessageContentRef.current.delete(data.messageId); setIsProcessing(false); setCurrentMessageId(null); - } - - // Create a tool message with running status - const toolMessageId = data.toolId || `tool-${Date.now()}`; - const toolMessage: ClaudeMessage = { - id: toolMessageId, - role: 'tool', - content: '', // Tool messages don't need content as they use specialized fields - timestamp: new Date(), - name: data.name, - args: data.args, - status: 'running', - executionTime: undefined - }; - - setMessages(prev => { - // Check if this tool message already exists - if (prev.some(msg => msg.id === toolMessageId)) { - // Update existing tool message - return prev.map(msg => - msg.id === toolMessageId - ? { ...msg, ...toolMessage } - : msg + }); + + eventSource.addEventListener('message-complete', (event) => { + const data = JSON.parse(event.data); + console.log('message-complete event received for messageId:', data.messageId); + setMessages((prev) => { + console.log( + 'Processing message-complete, current messages:', + prev.map((m) => ({ id: m.id, content: m.content.substring(0, 30) })) ); - } else { - // Add new tool message - return [...prev, toolMessage]; + const updated = prev.map((msg) => { + if (msg.id === data.messageId) { + console.log( + 'Found message to complete:', + msg.id, + 'current content length:', + msg.content.length + ); + const streamingContent = streamingMessageContentRef.current.get(data.messageId) || ''; + console.log('streamingContent length:', streamingContent.length); + + // For existing messages, always use the message content (it should already be set) + // For new messages, use streaming content + let finalContent = msg.content; + if (msg.content.length === 0 && streamingContent.length > 0) { + finalContent = streamingContent; + console.log('Using streaming content for empty message'); + } else if (msg.content.length > 0) { + console.log('Using existing message content'); + } + + console.log('Final content length:', finalContent.length); + console.log('Final content preview:', finalContent.substring(0, 50)); + + // Generate suggested responses based on the final content + const suggestedResponses = generateSuggestedResponses(finalContent); + return { ...msg, content: finalContent, isStreaming: false, suggestedResponses }; + } + return msg; + }); + console.log( + 'After message-complete, updated messages:', + updated.map((m) => ({ id: m.id, content: m.content.substring(0, 30) })) + ); + return updated; + }); + + // Clean up streaming content for this message if we're not restoring + if (!isRestoringExistingSessionRef.current) { + streamingMessageContentRef.current.delete(data.messageId); } + setCurrentMessageId(null); + setIsProcessing(false); }); - }); - - eventSource.addEventListener('tool-execution', (event) => { - const data = JSON.parse(event.data); - console.log('tool-execution event received:', data); - - // Update the tool message with completion status - const toolMessageId = data.toolExecution.id || `tool-${Date.now()}`; - const toolMessage: ClaudeMessage = { - id: toolMessageId, - role: 'tool', - content: '', // Tool messages don't need content as they use specialized fields - timestamp: new Date(), - name: data.toolExecution.name, - args: data.toolExecution.args, - status: data.toolExecution.status || 'complete', - executionTime: data.toolExecution.executionTime - }; - - setMessages(prev => { - // Check if this tool message already exists - if (prev.some(msg => msg.id === toolMessageId)) { - // Update existing tool message - return prev.map(msg => - msg.id === toolMessageId - ? { ...msg, ...toolMessage, status: 'complete', executionTime: data.toolExecution.executionTime } - : msg + + eventSource.addEventListener('thinking', (event) => { + const data = JSON.parse(event.data); + // Show thinking status in the assistant message that's about to come + console.log('Claude is thinking...', data.status); + }); + + eventSource.addEventListener('progress', (event) => { + const data = JSON.parse(event.data); + console.log('Progress event received (should not happen):', data); + // Don't update message content with progress status + // Only update token count if needed + if (data.tokenCount) { + setMessages((prev) => + prev.map((msg) => + msg.id === data.messageId ? { ...msg, tokenCount: data.tokenCount } : msg + ) ); - } else { - // Add new tool message if it doesn't exist (backwards compatibility) - return [...prev, toolMessage]; } }); - - // Handle TodoWrite tool specifically - if (data.toolExecution.name === 'TodoWrite' && data.toolExecution.args) { - try { - // Parse the args to get the todos - const argsData = typeof data.toolExecution.args === 'string' - ? JSON.parse(data.toolExecution.args) - : data.toolExecution.args; - - if (argsData.todos && Array.isArray(argsData.todos)) { - console.log('Updating todos from TodoWrite:', argsData.todos); - setTodos(argsData.todos); - } - } catch (err) { - console.error('Error parsing TodoWrite args:', err); + + eventSource.addEventListener('tool-start', (event) => { + const data = JSON.parse(event.data); + console.log('tool-start event received:', data); + + // First, end any currently streaming assistant message + const currentStreamingMessageId = currentMessageId; + if (currentStreamingMessageId) { + console.log('Ending streaming message due to tool start:', currentStreamingMessageId); + setMessages((prev) => + prev.map((msg) => { + if (msg.id === currentStreamingMessageId && msg.isStreaming) { + console.log('Setting isStreaming to false for message:', msg.id); + // Generate suggested responses based on the current content + const suggestedResponses = generateSuggestedResponses(msg.content); + return { ...msg, isStreaming: false, suggestedResponses }; + } + return msg; + }) + ); + // Clean up streaming content for this message + streamingMessageContentRef.current.delete(currentStreamingMessageId); + setIsProcessing(false); + setCurrentMessageId(null); } - } - }); - - eventSource.addEventListener('tool-summary', (event) => { - const data = JSON.parse(event.data); - console.log('tool-summary event received:', data); - - // Mark all recent tool messages as complete and update execution times - setMessages(prev => { - // Find the most recent tool messages (those that come after the last user message) - const lastUserMessageIndex = prev.findLastIndex((msg: ClaudeMessage) => msg.role === 'user'); - const recentMessages = prev.slice(lastUserMessageIndex + 1); - const toolMessages = recentMessages.filter(msg => msg.role === 'tool' && msg.status === 'running'); - - console.log('Tool messages to mark complete:', toolMessages.map(m => m.id)); - - return prev.map(msg => { - // Check if this is a tool message that needs updating - const toolMsg = toolMessages.find(tm => tm.id === msg.id); - if (toolMsg) { - // Find corresponding tool execution data from summary - const toolData = data.toolExecutions?.find((t: any) => - msg.id.includes(t.id) || (t.name === msg.name) - ); - - return { - ...msg, - status: 'complete', - // Preserve executionTime from tool data or keep existing - executionTime: toolData?.executionTime || msg.executionTime - }; + + // Create a tool message with running status + const toolMessageId = data.toolId || `tool-${Date.now()}`; + const toolMessage: ClaudeMessage = { + id: toolMessageId, + role: 'tool', + content: '', // Tool messages don't need content as they use specialized fields + timestamp: new Date(), + name: data.name, + args: data.args, + status: 'running', + executionTime: undefined, + }; + + setMessages((prev) => { + // Check if this tool message already exists + if (prev.some((msg) => msg.id === toolMessageId)) { + // Update existing tool message + return prev.map((msg) => (msg.id === toolMessageId ? { ...msg, ...toolMessage } : msg)); + } else { + // Add new tool message + return [...prev, toolMessage]; } - return msg; }); }); - }); - - eventSource.addEventListener('error', (event: MessageEvent) => { - try { + + eventSource.addEventListener('tool-execution', (event) => { const data = JSON.parse(event.data); - if (data.error === 'Session not found') { - // Session no longer exists, clear it - console.log('Session not found, clearing local state'); - setSessionId(null); - setIsConnected(false); - setError('Session expired. Please start a new session.'); - // Clear localStorage for this repo - if (reservedRepo) { - localStorage.removeItem(`${STORAGE_KEY}-${reservedRepo}`); + console.log('tool-execution event received:', data); + + // Update the tool message with completion status + const toolMessageId = data.toolExecution.id || `tool-${Date.now()}`; + const toolMessage: ClaudeMessage = { + id: toolMessageId, + role: 'tool', + content: '', // Tool messages don't need content as they use specialized fields + timestamp: new Date(), + name: data.toolExecution.name, + args: data.toolExecution.args, + status: data.toolExecution.status || 'complete', + executionTime: data.toolExecution.executionTime, + }; + + setMessages((prev) => { + // Check if this tool message already exists + if (prev.some((msg) => msg.id === toolMessageId)) { + // Update existing tool message + return prev.map((msg) => + msg.id === toolMessageId + ? { + ...msg, + ...toolMessage, + status: 'complete', + executionTime: data.toolExecution.executionTime, + } + : msg + ); + } else { + // Add new tool message if it doesn't exist (backwards compatibility) + return [...prev, toolMessage]; } - // Close the EventSource to stop reconnection attempts - eventSource.close(); - if (eventSourceRef.current === eventSource) { - eventSourceRef.current = null; + }); + + // Handle TodoWrite tool specifically + if (data.toolExecution.name === 'TodoWrite' && data.toolExecution.args) { + try { + // Parse the args to get the todos + const argsData = + typeof data.toolExecution.args === 'string' + ? JSON.parse(data.toolExecution.args) + : data.toolExecution.args; + + if (argsData.todos && Array.isArray(argsData.todos)) { + console.log('Updating todos from TodoWrite:', argsData.todos); + setTodos(argsData.todos); + } + } catch (err) { + console.error('Error parsing TodoWrite args:', err); } } - } catch (e) { - console.error('Failed to parse error event data:', e); - } - }); - - eventSource.addEventListener('claude-message', (event) => { - const data = JSON.parse(event.data); - console.log('Claude message event:', data.messageType, data.content); - - // Handle different message types from Claude - if (data.messageType === 'thinking') { - setMessages(prev => prev.map(msg => - msg.id === data.messageId && msg.isStreaming - ? { ...msg, content: 'Claude is thinking...' } - : msg - )); - } - }); - - eventSource.addEventListener('token-update', (event) => { - const data = JSON.parse(event.data); - // Update the message with actual token count - setMessages(prev => prev.map(msg => - msg.id === data.messageId - ? { ...msg, tokenCount: data.outputTokens } - : msg - )); - console.log(`Token usage - Input: ${data.inputTokens}, Output: ${data.outputTokens}, Total: ${data.totalTokens}, Session: ${data.sessionTotal}`); - }); - - eventSource.addEventListener('context-update', (event) => { - const data = JSON.parse(event.data); - setContextUsage(data.percentage); - }); - - eventSource.addEventListener('tool-status', (event) => { - const data = JSON.parse(event.data); - console.log('Tool status update:', data); - - setMessages(prev => prev.map(msg => - msg.id === data.messageId - ? { - ...msg, - status: data.status, - executionTime: data.executionTime + }); + + eventSource.addEventListener('tool-summary', (event) => { + const data = JSON.parse(event.data); + console.log('tool-summary event received:', data); + + // Mark all recent tool messages as complete and update execution times + setMessages((prev) => { + // Find the most recent tool messages (those that come after the last user message) + const lastUserMessageIndex = prev.findLastIndex( + (msg: ClaudeMessage) => msg.role === 'user' + ); + const recentMessages = prev.slice(lastUserMessageIndex + 1); + const toolMessages = recentMessages.filter( + (msg) => msg.role === 'tool' && msg.status === 'running' + ); + + console.log( + 'Tool messages to mark complete:', + toolMessages.map((m) => m.id) + ); + + return prev.map((msg) => { + // Check if this is a tool message that needs updating + const toolMsg = toolMessages.find((tm) => tm.id === msg.id); + if (toolMsg) { + // Find corresponding tool execution data from summary + const toolData = data.toolExecutions?.find( + (t: any) => msg.id.includes(t.id) || t.name === msg.name + ); + + return { + ...msg, + status: 'complete', + // Preserve executionTime from tool data or keep existing + executionTime: toolData?.executionTime || msg.executionTime, + }; } - : msg - )); - }); - - eventSource.addEventListener('message-cancelled', (event) => { - const data = JSON.parse(event.data); - setMessages(prev => prev.map(msg => - msg.id === data.messageId - ? { ...msg, content: 'Cancelled', isStreaming: false } - : msg - )); - setIsProcessing(false); - setCurrentMessageId(null); - }); - - eventSource.addEventListener('session-end', (event) => { - const data = JSON.parse(event.data); - console.log('Session ended event:', data); - // Session has ended, clean up everything - setSessionId(null); - setIsConnected(false); - setMessages([]); - setError(null); - // Clear localStorage for this repo - if (reservedRepo) { - localStorage.removeItem(`${STORAGE_KEY}-${reservedRepo}`); - } - // Close the EventSource to stop reconnection attempts - eventSource.close(); - if (eventSourceRef.current === eventSource) { - eventSourceRef.current = null; + return msg; + }); + }); + }); + + eventSource.addEventListener('error', (event: MessageEvent) => { + try { + const data = JSON.parse(event.data); + if (data.error === 'Session not found') { + // Session no longer exists, clear it + console.log('Session not found, clearing local state'); + setSessionId(null); + setIsConnected(false); + setError('Session expired. Please start a new session.'); + // Clear localStorage for this repo + if (reservedRepo) { + localStorage.removeItem(`${STORAGE_KEY}-${reservedRepo}`); + } + // Close the EventSource to stop reconnection attempts + eventSource.close(); + if (eventSourceRef.current === eventSource) { + eventSourceRef.current = null; + } + } + } catch (e) { + console.error('Failed to parse error event data:', e); + } + }); + + eventSource.addEventListener('claude-message', (event) => { + const data = JSON.parse(event.data); + console.log('Claude message event:', data.messageType, data.content); + + // Handle different message types from Claude + if (data.messageType === 'thinking') { + setMessages((prev) => + prev.map((msg) => + msg.id === data.messageId && msg.isStreaming + ? { ...msg, content: 'Claude is thinking...' } + : msg + ) + ); + } + }); + + eventSource.addEventListener('token-update', (event) => { + const data = JSON.parse(event.data); + // Update the message with actual token count + setMessages((prev) => + prev.map((msg) => + msg.id === data.messageId ? { ...msg, tokenCount: data.outputTokens } : msg + ) + ); + console.log( + `Token usage - Input: ${data.inputTokens}, Output: ${data.outputTokens}, Total: ${data.totalTokens}, Session: ${data.sessionTotal}` + ); + }); + + eventSource.addEventListener('context-update', (event) => { + const data = JSON.parse(event.data); + setContextUsage(data.percentage); + }); + + eventSource.addEventListener('tool-status', (event) => { + const data = JSON.parse(event.data); + console.log('Tool status update:', data); + + setMessages((prev) => + prev.map((msg) => + msg.id === data.messageId + ? { + ...msg, + status: data.status, + executionTime: data.executionTime, + } + : msg + ) + ); + }); + + eventSource.addEventListener('message-cancelled', (event) => { + const data = JSON.parse(event.data); + setMessages((prev) => + prev.map((msg) => + msg.id === data.messageId ? { ...msg, content: 'Cancelled', isStreaming: false } : msg + ) + ); + setIsProcessing(false); + setCurrentMessageId(null); + }); + + eventSource.addEventListener('session-end', (event) => { + const data = JSON.parse(event.data); + console.log('Session ended event:', data); + // Session has ended, clean up everything + setSessionId(null); + setIsConnected(false); + setMessages([]); + setError(null); + // Clear localStorage for this repo + if (reservedRepo) { + localStorage.removeItem(`${STORAGE_KEY}-${reservedRepo}`); + } + // Close the EventSource to stop reconnection attempts + eventSource.close(); + if (eventSourceRef.current === eventSource) { + eventSourceRef.current = null; + } + }); + + eventSourceRef.current = eventSource; + }, + [reservedRepo] + ); + + const initializeSession = useCallback( + async (projectId: string, projectPath: string, repoName: string) => { + // Prevent duplicate initialization requests + if (sessionInitializationRef.current) { + console.log('Session initialization already in progress, waiting for completion'); + return sessionInitializationRef.current; } - }); - - eventSourceRef.current = eventSource; - }, [reservedRepo]); - - const initializeSession = useCallback(async (projectId: string, projectPath: string, repoName: string) => { - // Prevent duplicate initialization requests - if (sessionInitializationRef.current) { - console.log('Session initialization already in progress, waiting for completion'); - return sessionInitializationRef.current; - } - - const initPromise = (async () => { - setIsInitializing(true); - setError(null); - - try { - // Get user info from auth state if available - const authStateStr = localStorage.getItem('github_auth_state'); - let userName = ''; - let userEmail = ''; - - if (authStateStr) { - try { - const authState = JSON.parse(authStateStr); - const activeAccount = authState.accounts?.find((acc: any) => acc.id === authState.activeAccountId); - if (activeAccount) { - userName = activeAccount.username || ''; - userEmail = activeAccount.email || ''; + + const initPromise = (async () => { + setIsInitializing(true); + setError(null); + + try { + // Get user info from auth state if available + const authStateStr = localStorage.getItem('github_auth_state'); + let userName = ''; + let userEmail = ''; + + if (authStateStr) { + try { + const authState = JSON.parse(authStateStr); + const activeAccount = authState.accounts?.find( + (acc: any) => acc.id === authState.activeAccountId + ); + if (activeAccount) { + userName = activeAccount.username || ''; + userEmail = activeAccount.email || ''; + } + } catch (e) { + console.error('Failed to parse auth state:', e); } - } catch (e) { - console.error('Failed to parse auth state:', e); } + + const response = await fetch('http://localhost:3000/api/claude/code/start', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + projectId, + projectPath, + repoName, + userName, + userEmail, + initialMode: mode, + }), + }); + + if (!response.ok) { + throw new Error(`Failed to initialize session: ${response.statusText}`); + } + + const data = await response.json(); + console.log('Session response:', data); + setSessionId(data.sessionId); + setReservedRepo(data.reservedRepo || repoName); + setContextUsage(data.contextUsage || 0); + + // Always start with empty messages and let SSE populate them + // For existing sessions, the server will send existing messages via SSE + // For new sessions, we start fresh + console.log( + data.new + ? 'New session created, starting fresh' + : 'Existing session, will receive messages via SSE' + ); + setMessages([]); + + // Set flag to track if we're restoring an existing session + isRestoringExistingSessionRef.current = !data.new; + + // Only clear localStorage for truly new sessions + if (data.new) { + localStorage.removeItem(`${STORAGE_KEY}-${repoName}`); + } + + // Set up SSE connection with a delay to ensure component is stable + if (!eventSourceRef.current || eventSourceRef.current.readyState === EventSource.CLOSED) { + console.log('[ClaudeCodeProvider] Scheduling SSE connection setup with delay'); + const sessionIdToConnect = data.sessionId; + const repoNameToConnect = repoName; + setTimeout(() => { + // Check if component is still mounted before setting up connection + if (sessionIdToConnect && isMountedRef.current && !eventSourceRef.current) { + console.log('[ClaudeCodeProvider] Setting up delayed SSE connection'); + setupSSEConnection(sessionIdToConnect, repoNameToConnect); + } else if (!isMountedRef.current) { + console.log('[ClaudeCodeProvider] Component unmounted, skipping SSE setup'); + } else if (eventSourceRef.current) { + console.log( + '[ClaudeCodeProvider] SSE connection already exists, skipping delayed setup' + ); + } else { + console.log('[ClaudeCodeProvider] No session ID, skipping SSE setup'); + } + }, 500); // 500ms delay to allow component to stabilize + } + + setIsInitializing(false); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to initialize session'); + setIsInitializing(false); + } finally { + sessionInitializationRef.current = null; } - - const response = await fetch('http://localhost:3000/api/claude/code/start', { + })(); + + sessionInitializationRef.current = initPromise; + return initPromise; + }, + [setupSSEConnection, mode] + ); + + const sendMessage = useCallback( + async (content: string) => { + if (!sessionId || !content.trim()) return; + + console.log('Sending message:', content); + + // Add user message immediately + const userMessage: ClaudeMessage = { + id: uuidv4(), + role: 'user', + content, + timestamp: new Date(), + mode, + }; + + // Add a placeholder assistant message with isStreaming true to show dancing bubbles + const placeholderMessage: ClaudeMessage = { + id: uuidv4(), + role: 'assistant', + content: '', // Empty content will trigger dancing bubbles in ClaudeMessage component + timestamp: new Date(), + isStreaming: true, + startTime: new Date(), + }; + + setMessages((prev) => [...prev, userMessage, placeholderMessage]); + setIsProcessing(true); + + try { + const response = await fetch('http://localhost:3000/api/claude/code/message', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ projectId, projectPath, repoName, userName, userEmail, initialMode: mode }) + body: JSON.stringify({ + sessionId, + message: content, + mode, + }), }); - + if (!response.ok) { - throw new Error(`Failed to initialize session: ${response.statusText}`); - } - - const data = await response.json(); - console.log('Session response:', data); - setSessionId(data.sessionId); - setReservedRepo(data.reservedRepo || repoName); - setContextUsage(data.contextUsage || 0); - - // Always start with empty messages and let SSE populate them - // For existing sessions, the server will send existing messages via SSE - // For new sessions, we start fresh - console.log(data.new ? 'New session created, starting fresh' : 'Existing session, will receive messages via SSE'); - setMessages([]); - - // Set flag to track if we're restoring an existing session - isRestoringExistingSessionRef.current = !data.new; - - // Only clear localStorage for truly new sessions - if (data.new) { - localStorage.removeItem(`${STORAGE_KEY}-${repoName}`); + throw new Error(`Failed to send message: ${response.statusText}`); } - - // Set up SSE connection with a delay to ensure component is stable - if (!eventSourceRef.current || eventSourceRef.current.readyState === EventSource.CLOSED) { - console.log('[ClaudeCodeProvider] Scheduling SSE connection setup with delay'); - const sessionIdToConnect = data.sessionId; - const repoNameToConnect = repoName; - setTimeout(() => { - // Check if component is still mounted before setting up connection - if (sessionIdToConnect && isMountedRef.current && !eventSourceRef.current) { - console.log('[ClaudeCodeProvider] Setting up delayed SSE connection'); - setupSSEConnection(sessionIdToConnect, repoNameToConnect); - } else if (!isMountedRef.current) { - console.log('[ClaudeCodeProvider] Component unmounted, skipping SSE setup'); - } else if (eventSourceRef.current) { - console.log('[ClaudeCodeProvider] SSE connection already exists, skipping delayed setup'); - } else { - console.log('[ClaudeCodeProvider] No session ID, skipping SSE setup'); - } - }, 500); // 500ms delay to allow component to stabilize - } - - setIsInitializing(false); + + console.log('Message sent successfully'); + // Response will come through SSE } catch (err) { - setError(err instanceof Error ? err.message : 'Failed to initialize session'); - setIsInitializing(false); - } finally { - sessionInitializationRef.current = null; - } - })(); - - sessionInitializationRef.current = initPromise; - return initPromise; - }, [setupSSEConnection, mode]); - - const sendMessage = useCallback(async (content: string) => { - if (!sessionId || !content.trim()) return; - - console.log('Sending message:', content); - - // Add user message immediately - const userMessage: ClaudeMessage = { - id: uuidv4(), - role: 'user', - content, - timestamp: new Date(), - mode - }; - - // Add a placeholder assistant message with isStreaming true to show dancing bubbles - const placeholderMessage: ClaudeMessage = { - id: uuidv4(), - role: 'assistant', - content: '', // Empty content will trigger dancing bubbles in ClaudeMessage component - timestamp: new Date(), - isStreaming: true, - startTime: new Date() - }; - - setMessages(prev => [...prev, userMessage, placeholderMessage]); - setIsProcessing(true); - - try { - const response = await fetch('http://localhost:3000/api/claude/code/message', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - sessionId, - message: content, - mode - }) - }); - - if (!response.ok) { - throw new Error(`Failed to send message: ${response.statusText}`); + console.error('Error sending message:', err); + setError(err instanceof Error ? err.message : 'Failed to send message'); + + // Remove the placeholder message and add error message + setMessages((prev) => { + // Filter out the placeholder + const filtered = prev.filter( + (msg) => !(msg.role === 'assistant' && msg.content === '' && msg.isStreaming === true) + ); + + // Add error message + const errorMessage: ClaudeMessage = { + id: uuidv4(), + role: 'system', + content: `Error: ${err instanceof Error ? err.message : 'Failed to send message'}`, + timestamp: new Date(), + }; + + return [...filtered, errorMessage]; + }); + + setIsProcessing(false); } - - console.log('Message sent successfully'); - // Response will come through SSE - } catch (err) { - console.error('Error sending message:', err); - setError(err instanceof Error ? err.message : 'Failed to send message'); - - // Remove the placeholder message and add error message - setMessages(prev => { - // Filter out the placeholder - const filtered = prev.filter(msg => !( - msg.role === 'assistant' && - msg.content === '' && - msg.isStreaming === true - )); - - // Add error message - const errorMessage: ClaudeMessage = { - id: uuidv4(), - role: 'system', - content: `Error: ${err instanceof Error ? err.message : 'Failed to send message'}`, - timestamp: new Date() - }; - - return [...filtered, errorMessage]; - }); - - setIsProcessing(false); - } - }, [sessionId, mode]); - + }, + [sessionId, mode] + ); + const clearMessages = useCallback(() => { setMessages([]); setTodos([]); @@ -846,41 +954,38 @@ export function ClaudeCodeProvider({ children }: { children: ReactNode }) { localStorage.removeItem(`${STORAGE_KEY}-${reservedRepo}`); } }, [reservedRepo]); - + const cancelMessage = useCallback(async () => { if (!sessionId || !currentMessageId) return; - + try { // Send cancel request to server await fetch('http://localhost:3000/api/claude/code/cancel', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ sessionId, messageId: currentMessageId }) + body: JSON.stringify({ sessionId, messageId: currentMessageId }), }); - + // Update UI immediately - setMessages(prev => prev.map(msg => - msg.id === currentMessageId - ? { ...msg, content: 'Cancelled', isStreaming: false } - : msg - )); + setMessages((prev) => + prev.map((msg) => + msg.id === currentMessageId ? { ...msg, content: 'Cancelled', isStreaming: false } : msg + ) + ); setIsProcessing(false); setCurrentMessageId(null); } catch (err) { console.error('Failed to cancel message:', err); } }, [sessionId, currentMessageId]); - + // Save messages periodically useEffect(() => { if (sessionId && messages.length > 0 && reservedRepo) { - localStorage.setItem( - `${STORAGE_KEY}-${reservedRepo}`, - JSON.stringify({ messages }) - ); + localStorage.setItem(`${STORAGE_KEY}-${reservedRepo}`, JSON.stringify({ messages })); } }, [messages, sessionId, reservedRepo]); - + // Cleanup SSE connection on unmount (but keep session alive) useEffect(() => { return () => { @@ -891,13 +996,13 @@ export function ClaudeCodeProvider({ children }: { children: ReactNode }) { eventSourceRef.current.close(); eventSourceRef.current = null; } - + // NOTE: We intentionally do NOT end the Claude Code session here // The session should persist even when navigating away from the page // Users can manually end sessions if needed through a UI action }; }, []); - + const value: ClaudeCodeContextType = { messages, mode, @@ -914,14 +1019,10 @@ export function ClaudeCodeProvider({ children }: { children: ReactNode }) { setMode, initializeSession, clearMessages, - cancelMessage + cancelMessage, }; - - return ( - - {children} - - ); + + return {children}; } export function useClaudeCode() { @@ -930,4 +1031,4 @@ export function useClaudeCode() { throw new Error('useClaudeCode must be used within ClaudeCodeProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/contexts/GitHubContext.tsx b/apps/v1/client/src/contexts/GitHubContext.tsx index 21136706..bd2ed714 100644 --- a/apps/v1/client/src/contexts/GitHubContext.tsx +++ b/apps/v1/client/src/contexts/GitHubContext.tsx @@ -8,8 +8,23 @@ interface GitHubContextValue { createRepository: (options: any) => Promise; getRepository: (owner: string, repo: string) => Promise; searchRepositories: (query: string, options?: any) => Promise; - createFile: (owner: string, repo: string, path: string, content: string, message: string, branch?: string) => Promise; - updateFile: (owner: string, repo: string, path: string, content: string, message: string, sha: string, branch?: string) => Promise; + createFile: ( + owner: string, + repo: string, + path: string, + content: string, + message: string, + branch?: string + ) => Promise; + updateFile: ( + owner: string, + repo: string, + path: string, + content: string, + message: string, + sha: string, + branch?: string + ) => Promise; createPullRequest: (owner: string, repo: string, options: any) => Promise; isAuthenticated: boolean; } @@ -40,7 +55,7 @@ export function GitHubProvider({ children }: { children: ReactNode }) { const value: GitHubContextValue = { isAuthenticated: !!activeAccount, - + listRepositories: async (options) => { try { const accountId = ensureAuthenticated(); @@ -80,7 +95,15 @@ export function GitHubProvider({ children }: { children: ReactNode }) { createFile: async (owner, repo, path, content, message, branch) => { try { const accountId = ensureAuthenticated(); - return await githubService.createFile(accountId, owner, repo, path, content, message, branch); + return await githubService.createFile( + accountId, + owner, + repo, + path, + content, + message, + branch + ); } catch (error) { return handleApiError(error); } @@ -89,7 +112,16 @@ export function GitHubProvider({ children }: { children: ReactNode }) { updateFile: async (owner, repo, path, content, message, sha, branch) => { try { const accountId = ensureAuthenticated(); - return await githubService.updateFile(accountId, owner, repo, path, content, message, sha, branch); + return await githubService.updateFile( + accountId, + owner, + repo, + path, + content, + message, + sha, + branch + ); } catch (error) { return handleApiError(error); } @@ -102,7 +134,7 @@ export function GitHubProvider({ children }: { children: ReactNode }) { } catch (error) { return handleApiError(error); } - } + }, }; return {children}; @@ -114,4 +146,4 @@ export function useGitHub() { throw new Error('useGitHub must be used within a GitHubProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/contexts/LayoutContext.tsx b/apps/v1/client/src/contexts/LayoutContext.tsx index 02f3d59c..61011677 100644 --- a/apps/v1/client/src/contexts/LayoutContext.tsx +++ b/apps/v1/client/src/contexts/LayoutContext.tsx @@ -21,12 +21,14 @@ export function LayoutProvider({ children }: { children: ReactNode }) { const [headerContent, setHeaderContent] = useState(null); return ( - + {children} ); @@ -38,4 +40,4 @@ export function useLayout() { throw new Error('useLayout must be used within LayoutProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/contexts/NewWorkItemContext.tsx b/apps/v1/client/src/contexts/NewWorkItemContext.tsx index 3fd3d41d..f6e10493 100644 --- a/apps/v1/client/src/contexts/NewWorkItemContext.tsx +++ b/apps/v1/client/src/contexts/NewWorkItemContext.tsx @@ -15,13 +15,13 @@ interface NewWorkItemContextType { // Step management step: 'input' | 'review'; setStep: (step: 'input' | 'review') => void; - + // Form state ideaText: string; setIdeaText: (text: string) => void; savedIdea: string; setSavedIdea: (text: string) => void; - + // Tasks tasks: Task[]; setTasks: (tasks: Task[]) => void; @@ -29,17 +29,17 @@ interface NewWorkItemContextType { setSelectedTaskId: (id: string | null) => void; editedContent: string; setEditedContent: (content: string) => void; - + // General markdown for work item description generalMarkdown: string; setGeneralMarkdown: (markdown: string) => void; - + // Processing state isProcessing: boolean; setIsProcessing: (processing: boolean) => void; error: string | null; setError: (error: string | null) => void; - + // Utility functions resetToInput: () => void; } @@ -50,10 +50,10 @@ const STORAGE_KEY = 'newWorkItemState'; export function NewWorkItemProvider({ children }: { children: ReactNode }) { const [searchParams, setSearchParams] = useSearchParams(); - + // Get initial step from URL const stepFromUrl = searchParams.get('step') as 'input' | 'review' | null; - + // Load persisted state const loadPersistedState = () => { const saved = sessionStorage.getItem(STORAGE_KEY); @@ -66,25 +66,27 @@ export function NewWorkItemProvider({ children }: { children: ReactNode }) { } return null; }; - + const persistedState = loadPersistedState(); - + const [step, setStepState] = useState<'input' | 'review'>(stepFromUrl || 'input'); - + // Form state - initialize from persisted state if available const [ideaText, setIdeaText] = useState(persistedState?.ideaText || ''); const [savedIdea, setSavedIdea] = useState(persistedState?.savedIdea || ''); - + // Tasks state const [tasks, setTasks] = useState(persistedState?.tasks || []); - const [selectedTaskId, setSelectedTaskId] = useState(persistedState?.selectedTaskId || null); + const [selectedTaskId, setSelectedTaskId] = useState( + persistedState?.selectedTaskId || null + ); const [editedContent, setEditedContent] = useState(persistedState?.editedContent || ''); const [generalMarkdown, setGeneralMarkdown] = useState(persistedState?.generalMarkdown || ''); - + // Processing state const [isProcessing, setIsProcessing] = useState(false); const [error, setError] = useState(null); - + // Persist state on changes useEffect(() => { const stateToSave = { @@ -97,7 +99,7 @@ export function NewWorkItemProvider({ children }: { children: ReactNode }) { }; sessionStorage.setItem(STORAGE_KEY, JSON.stringify(stateToSave)); }, [ideaText, savedIdea, tasks, selectedTaskId, editedContent, generalMarkdown]); - + // Update URL when step changes const setStep = (newStep: 'input' | 'review') => { setStepState(newStep); @@ -114,12 +116,12 @@ export function NewWorkItemProvider({ children }: { children: ReactNode }) { } setSearchParams(searchParams); }; - + // Handle browser back/forward useEffect(() => { const urlStep = searchParams.get('step') as 'input' | 'review' | null; const currentStep = urlStep || 'input'; - + if (currentStep !== step) { setStepState(currentStep); // If going back to input, restore the saved idea @@ -128,14 +130,14 @@ export function NewWorkItemProvider({ children }: { children: ReactNode }) { } } }, [searchParams, step, savedIdea]); - + // Reset to input step with saved idea const resetToInput = () => { setStep('input'); setIdeaText(savedIdea); setError(null); }; - + const value: NewWorkItemContextType = { step, setStep, @@ -157,12 +159,8 @@ export function NewWorkItemProvider({ children }: { children: ReactNode }) { setError, resetToInput, }; - - return ( - - {children} - - ); + + return {children}; } export function useNewWorkItem() { @@ -171,4 +169,4 @@ export function useNewWorkItem() { throw new Error('useNewWorkItem must be used within NewWorkItemProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/contexts/SubscriptionContext.tsx b/apps/v1/client/src/contexts/SubscriptionContext.tsx index 70fad0dc..b304679e 100644 --- a/apps/v1/client/src/contexts/SubscriptionContext.tsx +++ b/apps/v1/client/src/contexts/SubscriptionContext.tsx @@ -23,11 +23,11 @@ export function SubscriptionProvider({ children }: { children: ReactNode }) { try { const data = JSON.parse(event.data); const key = data.id; // Resource ID like "repo-status:project1/repo-1" - + // Call all registered callbacks for this resource const callbackSet = callbacks.current.get(key); if (callbackSet) { - callbackSet.forEach(cb => { + callbackSet.forEach((cb) => { try { cb(data.payload); } catch (err) { @@ -47,46 +47,51 @@ export function SubscriptionProvider({ children }: { children: ReactNode }) { }; }, [eventSource]); - const subscribeToResource = useCallback((type: string, id: string, callback: SubscriptionCallback) => { - const key = `${type}:${id}`; - - // Add callback to the map - if (!callbacks.current.has(key)) { - callbacks.current.set(key, new Set()); - } - callbacks.current.get(key)!.add(callback); - - // If this is the first subscription to this resource, tell the server - if (!activeSubscriptions.current.has(key)) { - activeSubscriptions.current.add(key); - subscribe([key]).catch(err => { - console.error('Failed to subscribe to resource:', err); - }); - } - - // Return unsubscribe function - return () => { - const callbackSet = callbacks.current.get(key); - if (callbackSet) { - callbackSet.delete(callback); - - // If no more callbacks for this resource, unsubscribe from server - if (callbackSet.size === 0) { - callbacks.current.delete(key); - activeSubscriptions.current.delete(key); - unsubscribe([key]).catch(err => { - console.error('Failed to unsubscribe from resource:', err); - }); - } + const subscribeToResource = useCallback( + (type: string, id: string, callback: SubscriptionCallback) => { + const key = `${type}:${id}`; + + // Add callback to the map + if (!callbacks.current.has(key)) { + callbacks.current.set(key, new Set()); + } + callbacks.current.get(key)!.add(callback); + + // If this is the first subscription to this resource, tell the server + if (!activeSubscriptions.current.has(key)) { + activeSubscriptions.current.add(key); + subscribe([key]).catch((err) => { + console.error('Failed to subscribe to resource:', err); + }); } - }; - }, [subscribe, unsubscribe]); + + // Return unsubscribe function + return () => { + const callbackSet = callbacks.current.get(key); + if (callbackSet) { + callbackSet.delete(callback); + + // If no more callbacks for this resource, unsubscribe from server + if (callbackSet.size === 0) { + callbacks.current.delete(key); + activeSubscriptions.current.delete(key); + unsubscribe([key]).catch((err) => { + console.error('Failed to unsubscribe from resource:', err); + }); + } + } + }; + }, + [subscribe, unsubscribe] + ); return ( - + {children} ); @@ -98,4 +103,4 @@ export function useRealtimeSubscription() { throw new Error('useRealtimeSubscription must be used within SubscriptionProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/contexts/ThemeContext.tsx b/apps/v1/client/src/contexts/ThemeContext.tsx index 4095ba47..6d7593fb 100644 --- a/apps/v1/client/src/contexts/ThemeContext.tsx +++ b/apps/v1/client/src/contexts/ThemeContext.tsx @@ -14,39 +14,39 @@ const ThemeContext = createContext(undefined); export function ThemeProvider({ children }: { children: ReactNode }) { const [currentThemeIndex, setCurrentThemeIndex] = useState(0); - + useEffect(() => { const savedThemeId = localStorage.getItem('selectedTheme'); if (savedThemeId) { - const index = themes.findIndex(t => t.id === savedThemeId); + const index = themes.findIndex((t) => t.id === savedThemeId); if (index !== -1) { setCurrentThemeIndex(index); } } }, []); - + const currentTheme = themes[currentThemeIndex]; - + const setTheme = (themeId: string) => { - const index = themes.findIndex(t => t.id === themeId); + const index = themes.findIndex((t) => t.id === themeId); if (index !== -1) { setCurrentThemeIndex(index); localStorage.setItem('selectedTheme', themeId); } }; - + const nextTheme = () => { const nextIndex = (currentThemeIndex + 1) % themes.length; setCurrentThemeIndex(nextIndex); localStorage.setItem('selectedTheme', themes[nextIndex].id); }; - + const previousTheme = () => { const prevIndex = currentThemeIndex === 0 ? themes.length - 1 : currentThemeIndex - 1; setCurrentThemeIndex(prevIndex); localStorage.setItem('selectedTheme', themes[prevIndex].id); }; - + return ( {children} @@ -60,4 +60,4 @@ export function useTheme() { throw new Error('useTheme must be used within a ThemeProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/contexts/ThemeContextV2.tsx b/apps/v1/client/src/contexts/ThemeContextV2.tsx index 009c6d16..583e97c1 100644 --- a/apps/v1/client/src/contexts/ThemeContextV2.tsx +++ b/apps/v1/client/src/contexts/ThemeContextV2.tsx @@ -24,25 +24,25 @@ export function ThemeProvider({ children }: { children: ReactNode }) { const [isDarkMode, setIsDarkMode] = useState(false); const [backgroundEffectEnabled, setBackgroundEffectEnabled] = useState(false); const [animationsEnabled, setAnimationsEnabled] = useState(true); - + useEffect(() => { // Load saved preferences const savedThemeId = localStorage.getItem('selectedTheme'); const savedDarkMode = localStorage.getItem('darkMode') === 'true'; const savedBackgroundEffect = localStorage.getItem('backgroundEffect') === 'true'; const savedAnimations = localStorage.getItem('animationsEnabled') !== 'false'; - + setIsDarkMode(savedDarkMode); setBackgroundEffectEnabled(savedBackgroundEffect); setAnimationsEnabled(savedAnimations); - + if (savedThemeId) { - const index = themesV2.findIndex(t => t.id === savedThemeId); + const index = themesV2.findIndex((t) => t.id === savedThemeId); if (index !== -1) { setCurrentThemeIndex(index); } } - + // Apply dark mode class to root element if (savedDarkMode) { document.documentElement.classList.add('dark'); @@ -50,68 +50,70 @@ export function ThemeProvider({ children }: { children: ReactNode }) { document.documentElement.classList.remove('dark'); } }, []); - + const currentTheme = themesV2[currentThemeIndex]; const currentStyles = isDarkMode ? currentTheme.dark : currentTheme.light; - + const setTheme = (themeId: string) => { - const index = themesV2.findIndex(t => t.id === themeId); + const index = themesV2.findIndex((t) => t.id === themeId); if (index !== -1) { setCurrentThemeIndex(index); localStorage.setItem('selectedTheme', themeId); } }; - + const nextTheme = () => { const nextIndex = (currentThemeIndex + 1) % themesV2.length; setCurrentThemeIndex(nextIndex); localStorage.setItem('selectedTheme', themesV2[nextIndex].id); }; - + const previousTheme = () => { const prevIndex = currentThemeIndex === 0 ? themesV2.length - 1 : currentThemeIndex - 1; setCurrentThemeIndex(prevIndex); localStorage.setItem('selectedTheme', themesV2[prevIndex].id); }; - + const toggleDarkMode = () => { const newDarkMode = !isDarkMode; setIsDarkMode(newDarkMode); localStorage.setItem('darkMode', String(newDarkMode)); - + if (newDarkMode) { document.documentElement.classList.add('dark'); } else { document.documentElement.classList.remove('dark'); } }; - + const toggleBackgroundEffect = () => { const newValue = !backgroundEffectEnabled; setBackgroundEffectEnabled(newValue); localStorage.setItem('backgroundEffect', String(newValue)); }; - + const toggleAnimations = () => { const newValue = !animationsEnabled; setAnimationsEnabled(newValue); localStorage.setItem('animationsEnabled', String(newValue)); }; - + return ( - + {children} ); @@ -123,4 +125,4 @@ export function useTheme() { throw new Error('useTheme must be used within a ThemeProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/contexts/ToastContext.tsx b/apps/v1/client/src/contexts/ToastContext.tsx index 14606c79..f867a973 100644 --- a/apps/v1/client/src/contexts/ToastContext.tsx +++ b/apps/v1/client/src/contexts/ToastContext.tsx @@ -23,8 +23,8 @@ export function ToastProvider({ children }: { children: ReactNode }) { const showToast = (message: string, type: ToastType = 'info', duration: number = 0) => { const id = Date.now().toString(); const toast: Toast = { id, message, type, duration }; - - setToasts(prev => [...prev, toast]); + + setToasts((prev) => [...prev, toast]); // Disabled auto-dismiss - toasts must be manually dismissed // if (duration > 0) { @@ -35,7 +35,7 @@ export function ToastProvider({ children }: { children: ReactNode }) { }; const removeToast = (id: string) => { - setToasts(prev => prev.filter(toast => toast.id !== id)); + setToasts((prev) => prev.filter((toast) => toast.id !== id)); }; return ( @@ -51,4 +51,4 @@ export const useToast = () => { throw new Error('useToast must be used within a ToastProvider'); } return context; -}; \ No newline at end of file +}; diff --git a/apps/v1/client/src/contexts/WorkspaceContext.tsx b/apps/v1/client/src/contexts/WorkspaceContext.tsx index 4e2cc971..7f330d1a 100644 --- a/apps/v1/client/src/contexts/WorkspaceContext.tsx +++ b/apps/v1/client/src/contexts/WorkspaceContext.tsx @@ -17,7 +17,7 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { const [workspace, setWorkspace] = useState({ config: null, isLoading: false, - error: null + error: null, }); const [projects, setProjects] = useState([]); @@ -26,14 +26,14 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { const savedConfig = localStorage.getItem('workspaceConfig'); if (savedConfig) { const config = JSON.parse(savedConfig) as WorkspaceConfig; - setWorkspace(prev => ({ ...prev, config })); + setWorkspace((prev) => ({ ...prev, config })); loadWorkspaceData(config.path); } }, []); const loadWorkspaceData = async (path: string) => { - setWorkspace(prev => ({ ...prev, isLoading: true, error: null })); - + setWorkspace((prev) => ({ ...prev, isLoading: true, error: null })); + try { // First, load basic project info quickly with caching const lightData = await getCached( @@ -44,7 +44,7 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ workspacePath: path }) + body: JSON.stringify({ workspacePath: path }), }); if (!lightResponse.ok) { @@ -56,12 +56,12 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { }, { maxAge: 60 * 1000, // 1 minute - staleWhileRevalidate: 5 * 60 * 1000 // 5 minutes + staleWhileRevalidate: 5 * 60 * 1000, // 5 minutes } ); setProjects(lightData.projects || []); - setWorkspace(prev => ({ ...prev, isLoading: false })); + setWorkspace((prev) => ({ ...prev, isLoading: false })); // Then load full details in the background if (lightData.projects && lightData.projects.length > 0) { @@ -71,13 +71,16 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { const details = await getCached( `project-details:${project.path}`, async () => { - const detailResponse = await fetch('http://localhost:3000/api/workspace/project-details', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ projectPath: project.path }) - }); + const detailResponse = await fetch( + 'http://localhost:3000/api/workspace/project-details', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ projectPath: project.path }), + } + ); if (!detailResponse.ok) { throw new Error('Failed to load project details'); @@ -87,15 +90,17 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { }, { maxAge: 5 * 60 * 1000, // 5 minutes - staleWhileRevalidate: 30 * 60 * 1000 // 30 minutes + staleWhileRevalidate: 30 * 60 * 1000, // 30 minutes } ); // Update the specific project with full details console.log('Updating project with details:', project.name, details); - setProjects(prev => prev.map(p => - p.path === project.path ? { ...p, ...details, isLoading: false } : p - )); + setProjects((prev) => + prev.map((p) => + p.path === project.path ? { ...p, ...details, isLoading: false } : p + ) + ); } catch (err) { console.error(`Failed to load details for project ${project.name}:`, err); } @@ -106,7 +111,7 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { } } catch (error) { console.error('Failed to load workspace:', error); - + // If it's a connection error, try to create the workspace structure if (error instanceof TypeError && error.message.includes('fetch')) { // Server might not be running, use mock data @@ -122,8 +127,8 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { path: `${path}/projects/project-mgmt-ux/repos/project-mgmt-ux-1`, isAvailable: false, activeWorkItem: 'implement-workspace', - branch: 'feature/workspace-support' - } + branch: 'feature/workspace-support', + }, ], plans: { ideas: [], @@ -133,20 +138,21 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { name: 'implement-workspace', path: `${path}/projects/project-mgmt-ux/plans/active/implement-workspace.md`, status: 'active', - content: '# Implement Workspace Support\n\nAdd workspace management to Claude Flow.' - } + content: + '# Implement Workspace Support\n\nAdd workspace management to Claude Flow.', + }, ], - completed: [] - } - } + completed: [], + }, + }, ]; setProjects(mockProjects); - setWorkspace(prev => ({ ...prev, isLoading: false })); + setWorkspace((prev) => ({ ...prev, isLoading: false })); } else { - setWorkspace(prev => ({ - ...prev, - isLoading: false, - error: error instanceof Error ? error.message : 'Failed to load workspace' + setWorkspace((prev) => ({ + ...prev, + isLoading: false, + error: error instanceof Error ? error.message : 'Failed to load workspace', })); } } @@ -155,9 +161,9 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { const setWorkspacePath = async (path: string) => { const config: WorkspaceConfig = { path, - name: path.split('/').pop() || 'Workspace' + name: path.split('/').pop() || 'Workspace', }; - + // First, try to create workspace structure if it doesn't exist try { const response = await fetch('http://localhost:3000/api/workspace/create', { @@ -165,7 +171,7 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ workspacePath: path }) + body: JSON.stringify({ workspacePath: path }), }); if (!response.ok) { @@ -174,13 +180,13 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { } catch (error) { console.warn('Could not create workspace structure:', error); } - + // Save to localStorage localStorage.setItem('workspaceConfig', JSON.stringify(config)); - + // Update state - setWorkspace(prev => ({ ...prev, config })); - + setWorkspace((prev) => ({ ...prev, config })); + // Load workspace data await loadWorkspaceData(path); }; @@ -199,20 +205,22 @@ export function WorkspaceProvider({ children }: { children: ReactNode }) { setWorkspace({ config: null, isLoading: false, - error: null + error: null, }); setProjects([]); }; return ( - + {children} ); @@ -224,4 +232,4 @@ export function useWorkspace() { throw new Error('useWorkspace must be used within a WorkspaceProvider'); } return context; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/hooks/useDraggable.ts b/apps/v1/client/src/hooks/useDraggable.ts index be1c6e13..c07ad43b 100644 --- a/apps/v1/client/src/hooks/useDraggable.ts +++ b/apps/v1/client/src/hooks/useDraggable.ts @@ -19,15 +19,15 @@ export function useDraggable(options: UseDraggableOptions = {}) { useEffect(() => { const handleMouseDown = (e: MouseEvent) => { if (!handleRef.current?.contains(e.target as Node)) return; - + e.preventDefault(); setIsDragging(true); isDraggingRef.current = true; - + // Store initial positions dragStartPos.current = { x: e.clientX, y: e.clientY }; elementStartPos.current = { ...position }; - + // Add listeners to document to capture mouse movement outside element document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); @@ -35,31 +35,31 @@ export function useDraggable(options: UseDraggableOptions = {}) { const handleMouseMove = (e: MouseEvent) => { if (!isDraggingRef.current) return; - + const deltaX = e.clientX - dragStartPos.current.x; const deltaY = e.clientY - dragStartPos.current.y; - + const newX = elementStartPos.current.x + deltaX; const newY = elementStartPos.current.y + deltaY; - + setPosition({ x: newX, y: newY }); options.onDrag?.(newX, newY); }; const handleMouseUp = (e: MouseEvent) => { if (!isDraggingRef.current) return; - + setIsDragging(false); isDraggingRef.current = false; - + const deltaX = e.clientX - dragStartPos.current.x; const deltaY = e.clientY - dragStartPos.current.y; - + const finalX = elementStartPos.current.x + deltaX; const finalY = elementStartPos.current.y + deltaY; - + options.onDragEnd?.(finalX, finalY); - + // Remove document listeners document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); @@ -88,7 +88,7 @@ export function useDraggable(options: UseDraggableOptions = {}) { isDragging, style: { transform: `translate(${position.x}px, ${position.y}px)`, - transition: isDragging ? 'none' : 'transform 0.2s ease-out' - } + transition: isDragging ? 'none' : 'transform 0.2s ease-out', + }, }; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/hooks/useFeedback.ts b/apps/v1/client/src/hooks/useFeedback.ts index 635b645c..43d74083 100644 --- a/apps/v1/client/src/hooks/useFeedback.ts +++ b/apps/v1/client/src/hooks/useFeedback.ts @@ -26,7 +26,7 @@ export function useFeedback({ sessionId, repoName, projectId, - messageId + messageId, }: UseFeedbackOptions): UseFeedbackReturn { const { messages, mode, isConnected } = useClaudeCode(); const { showToast } = useToast(); @@ -47,7 +47,7 @@ export function useFeedback({ console.error('Failed to capture screenshot:', err); setCapturedScreenshot(null); } - + // Now open the dialog setShowDialog(true); setError(null); @@ -64,71 +64,80 @@ export function useFeedback({ setFeedbackId(null); }, []); - const submitFeedback = useCallback(async ( - expectedBehavior: string, - actualBehavior: string - ) => { - setIsSubmitting(true); - setError(null); + const submitFeedback = useCallback( + async (expectedBehavior: string, actualBehavior: string) => { + setIsSubmitting(true); + setError(null); - try { - // Prepare feedback data - const feedbackData: Omit = { - expectedBehavior, - actualBehavior, - sessionId, - repoName, - projectId, - messageId, - messages: messages.map(msg => ({ - id: msg.id, - role: msg.role, - content: msg.content, - timestamp: msg.timestamp, - isGreeting: msg.isGreeting, - toolExecutions: msg.toolExecutions - })), - mode, - isConnected - }; + try { + // Prepare feedback data + const feedbackData: Omit = { + expectedBehavior, + actualBehavior, + sessionId, + repoName, + projectId, + messageId, + messages: messages.map((msg) => ({ + id: msg.id, + role: msg.role, + content: msg.content, + timestamp: msg.timestamp, + isGreeting: msg.isGreeting, + toolExecutions: msg.toolExecutions, + })), + mode, + isConnected, + }; - // Upload the pre-captured screenshot if available - let screenshotPath: string | null = null; - if (capturedScreenshot) { - try { - screenshotPath = await feedbackService.uploadScreenshot( - capturedScreenshot, - sessionId, - repoName - ); - } catch (err) { - console.warn('Failed to upload screenshot:', err); + // Upload the pre-captured screenshot if available + let screenshotPath: string | null = null; + if (capturedScreenshot) { + try { + screenshotPath = await feedbackService.uploadScreenshot( + capturedScreenshot, + sessionId, + repoName + ); + } catch (err) { + console.warn('Failed to upload screenshot:', err); + } } - } - // Submit feedback with screenshot path - const completeData: FeedbackData = { - ...feedbackData, - screenshotPath: screenshotPath || undefined, - timestamp: new Date().toISOString() - }; - - const id = await feedbackService.submitFeedback(completeData); - - // Success! - setFeedbackId(id); - setShowDialog(false); - // Show toast notification instead of success dialog - showToast('Feedback submitted successfully!', 'success', 5000); - - } catch (err) { - const errorMessage = err instanceof Error ? err.message : 'Failed to submit feedback'; - setError(errorMessage); - console.error('Feedback submission failed:', err); - } finally { - setIsSubmitting(false); - } - }, [sessionId, repoName, projectId, messageId, messages, mode, isConnected, capturedScreenshot, showToast]); + // Submit feedback with screenshot path + const completeData: FeedbackData = { + ...feedbackData, + screenshotPath: screenshotPath || undefined, + timestamp: new Date().toISOString(), + }; + + const id = await feedbackService.submitFeedback(completeData); + + // Success! + setFeedbackId(id); + setShowDialog(false); + // Show toast notification instead of success dialog + showToast('Feedback submitted successfully!', 'success', 5000); + } catch (err) { + const errorMessage = err instanceof Error ? err.message : 'Failed to submit feedback'; + setError(errorMessage); + console.error('Feedback submission failed:', err); + } finally { + setIsSubmitting(false); + } + }, + [ + sessionId, + repoName, + projectId, + messageId, + messages, + mode, + isConnected, + capturedScreenshot, + showToast, + ] + ); return { showDialog, @@ -139,6 +148,6 @@ export function useFeedback({ openFeedback, closeFeedback, submitFeedback, - closeSuccess + closeSuccess, }; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/hooks/useNavigationDirection.ts b/apps/v1/client/src/hooks/useNavigationDirection.ts index d31f081c..70c88e61 100644 --- a/apps/v1/client/src/hooks/useNavigationDirection.ts +++ b/apps/v1/client/src/hooks/useNavigationDirection.ts @@ -14,15 +14,15 @@ export function useNavigationDirection(): NavigationDirection { useEffect(() => { const path = location.pathname; - + if (navigationType === 'POP') { // Browser back/forward navigation const stack = historyStack.current; const prevIndex = currentIndex.current; - + // Find where we are in the history const newIndex = stack.lastIndexOf(path); - + if (newIndex === -1) { // Path not in history, treat as forward setDirection('forward'); @@ -40,7 +40,7 @@ export function useNavigationDirection(): NavigationDirection { } else { // Regular navigation (PUSH or REPLACE) setDirection('forward'); - + if (navigationType === 'PUSH') { // Trim any forward history and add new entry const stack = historyStack.current.slice(0, currentIndex.current + 1); @@ -64,4 +64,4 @@ export function useNavigationDirection(): NavigationDirection { }, [location, navigationType]); return direction; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/hooks/useSubscription.ts b/apps/v1/client/src/hooks/useSubscription.ts index 611b0f0b..7a5e4190 100644 --- a/apps/v1/client/src/hooks/useSubscription.ts +++ b/apps/v1/client/src/hooks/useSubscription.ts @@ -23,12 +23,12 @@ export function useSubscription(): UseSubscriptionReturn { const connect = () => { console.log('Connecting to SSE...'); es = new EventSource(sseUrl('/api/sse/subscribe')); - + es.onopen = () => { console.log('SSE connection opened'); reconnectAttemptsRef.current = 0; }; - + es.onmessage = (event) => { try { const data = JSON.parse(event.data); @@ -50,18 +50,18 @@ export function useSubscription(): UseSubscriptionReturn { setIsConnected(false); setClientId(null); } - + // Reconnect with exponential backoff const attempts = reconnectAttemptsRef.current; const delay = Math.min(5000 * Math.pow(2, attempts), 60000); // Max 60 seconds - + console.log(`Reconnecting in ${delay}ms (attempt ${attempts + 1})`); reconnectAttemptsRef.current++; - + if (reconnectTimeoutRef.current) { clearTimeout(reconnectTimeoutRef.current); } - + reconnectTimeoutRef.current = setTimeout(() => { if (isMounted && es?.readyState === EventSource.CLOSED) { connect(); @@ -87,63 +87,69 @@ export function useSubscription(): UseSubscriptionReturn { }; }, []); - const subscribe = useCallback(async (resources: string[]) => { - if (!clientId) { - console.warn('Cannot subscribe: no client ID'); - return; - } - - try { - const response = await fetch(apiUrl('/api/subscriptions'), { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ clientId, resources }) - }); - - if (!response.ok) { - throw new Error('Failed to subscribe'); + const subscribe = useCallback( + async (resources: string[]) => { + if (!clientId) { + console.warn('Cannot subscribe: no client ID'); + return; } - - const result = await response.json(); - if (result.success) { - console.log('Subscribed to resources:', resources); + + try { + const response = await fetch(apiUrl('/api/subscriptions'), { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ clientId, resources }), + }); + + if (!response.ok) { + throw new Error('Failed to subscribe'); + } + + const result = await response.json(); + if (result.success) { + console.log('Subscribed to resources:', resources); + } + } catch (error) { + console.error('Error subscribing:', error); } - } catch (error) { - console.error('Error subscribing:', error); - } - }, [clientId]); - - const unsubscribe = useCallback(async (resources: string[]) => { - if (!clientId) { - console.warn('Cannot unsubscribe: no client ID'); - return; - } - - try { - const response = await fetch(apiUrl('/api/subscriptions'), { - method: 'DELETE', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ clientId, resources }) - }); - - if (!response.ok) { - throw new Error('Failed to unsubscribe'); + }, + [clientId] + ); + + const unsubscribe = useCallback( + async (resources: string[]) => { + if (!clientId) { + console.warn('Cannot unsubscribe: no client ID'); + return; } - - const result = await response.json(); - if (result.success) { - console.log('Unsubscribed from resources:', resources); + + try { + const response = await fetch(apiUrl('/api/subscriptions'), { + method: 'DELETE', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ clientId, resources }), + }); + + if (!response.ok) { + throw new Error('Failed to unsubscribe'); + } + + const result = await response.json(); + if (result.success) { + console.log('Unsubscribed from resources:', resources); + } + } catch (error) { + console.error('Error unsubscribing:', error); } - } catch (error) { - console.error('Error unsubscribing:', error); - } - }, [clientId]); + }, + [clientId] + ); return { eventSource, clientId, isConnected, subscribe, - unsubscribe + unsubscribe, }; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/index.css b/apps/v1/client/src/index.css index f75a877b..6ade8f4d 100644 --- a/apps/v1/client/src/index.css +++ b/apps/v1/client/src/index.css @@ -16,7 +16,7 @@ html { } /* Checkbox specific styles to prevent focus ring on click */ -input[type="checkbox"]:focus:not(:focus-visible) { +input[type='checkbox']:focus:not(:focus-visible) { box-shadow: none; outline: none; } @@ -80,33 +80,38 @@ body { .scrollbar-gutter-stable { scrollbar-gutter: stable; } - + .page-transition-enter { opacity: 0; transform: translateY(20px); } - + .page-transition-enter-active { opacity: 1; transform: translateY(0); - transition: opacity 300ms ease-out, transform 300ms ease-out; + transition: + opacity 300ms ease-out, + transform 300ms ease-out; } - + .page-transition-exit { opacity: 1; transform: translateY(0); } - + .page-transition-exit-active { opacity: 0; transform: translateY(-20px); - transition: opacity 150ms ease-in, transform 150ms ease-in; + transition: + opacity 150ms ease-in, + transform 150ms ease-in; } } /* Performance-optimized animations with more movement */ @keyframes float-slow { - 0%, 100% { + 0%, + 100% { transform: translate3d(0, 0, 0); } 25% { @@ -121,7 +126,8 @@ body { } @keyframes float-reverse { - 0%, 100% { + 0%, + 100% { transform: translate3d(0, 0, 0); } 25% { @@ -202,4 +208,4 @@ body { .animate-slide-up { animation: slide-up 0.3s ease-out; -} \ No newline at end of file +} diff --git a/apps/v1/client/src/main.tsx b/apps/v1/client/src/main.tsx index c13d176f..f9316c37 100644 --- a/apps/v1/client/src/main.tsx +++ b/apps/v1/client/src/main.tsx @@ -1,12 +1,18 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.tsx' +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import './index.css'; +import App from './App.tsx'; // Disable StrictMode in development to prevent double-invocation issues // that cause duplicate API requests, especially for Claude Code sessions const isDevelopment = import.meta.env.DEV; createRoot(document.getElementById('root')!).render( - isDevelopment ? : , -) + isDevelopment ? ( + + ) : ( + + + + ) +); diff --git a/apps/v1/client/src/pages/ClaudeCode.tsx b/apps/v1/client/src/pages/ClaudeCode.tsx index b30e5f32..38a204c8 100644 --- a/apps/v1/client/src/pages/ClaudeCode.tsx +++ b/apps/v1/client/src/pages/ClaudeCode.tsx @@ -72,41 +72,52 @@ function ClaudeCodeContent() { setMode, initializeSession, cancelMessage, - clearMessages + clearMessages, } = useClaudeCode(); - + // Debug logging console.log('ClaudeCode component render, messages:', messages.length); - console.log('isInitializing:', isInitializing, 'isConnected:', isConnected, 'sessionId:', sessionId); - + console.log( + 'isInitializing:', + isInitializing, + 'isConnected:', + isConnected, + 'sessionId:', + sessionId + ); + const styles = currentStyles; const scrollContainerRef = useRef(null); const [isSubmitting, setIsSubmitting] = useState(false); const [showCloseConfirm, setShowCloseConfirm] = useState(false); const [showTodos, setShowTodos] = useState(true); const [repoStatus, setRepoStatus] = useState(null); - - const project = projects.find(p => p.id === projectId); - const workspaceProject = workspaceProjects.find(p => p.name === project?.name); - + + const project = projects.find((p) => p.id === projectId); + const workspaceProject = workspaceProjects.find((p) => p.name === project?.name); + // Subscribe to repo status updates useEffect(() => { if (!workspaceProject?.path || !repoName) return; - - const unsubscribe = subscribe('repo-status', `${workspaceProject.path}/${repoName}`, (status: RepoStatus) => { - setRepoStatus(status); - }); - + + const unsubscribe = subscribe( + 'repo-status', + `${workspaceProject.path}/${repoName}`, + (status: RepoStatus) => { + setRepoStatus(status); + } + ); + return unsubscribe; }, [workspaceProject?.path, repoName, subscribe]); - + // Re-show todos when new todos arrive useEffect(() => { if (todos.length > 0) { setShowTodos(true); } }, [todos.length]); - + // Set up session-level feedback const { showDialog: showSessionFeedback, @@ -114,96 +125,113 @@ function ClaudeCodeContent() { error: feedbackError, openFeedback: openSessionFeedback, closeFeedback: closeSessionFeedback, - submitFeedback: submitSessionFeedback + submitFeedback: submitSessionFeedback, } = useFeedback({ sessionId: sessionId || '', repoName: repoName || '', projectId: projectId || '', // No messageId for session-level feedback }); - + // Set breadcrumb immediately when data is available useEffect(() => { - console.log('ClaudeCode breadcrumb effect - repoName:', repoName, 'projectId:', projectId, 'project:', project); - + console.log( + 'ClaudeCode breadcrumb effect - repoName:', + repoName, + 'projectId:', + projectId, + 'project:', + project + ); + if (repoName && projectId && project) { console.log('Setting Claude Code breadcrumb with project:', project.name); const newBreadcrumb = [ { label: project.name, path: `/projects/${projectId}` }, { label: repoName }, - { label: 'Claude Code' } + { label: 'Claude Code' }, ]; console.log('New breadcrumb:', newBreadcrumb); setHeaderContent(newBreadcrumb); } - + // No cleanup needed - let the next page set its own header }, [projectId, repoName, project, setHeaderContent]); - + // Initialize session useEffect(() => { console.log('ClaudeCode init session:', { projectId, projectName: project?.name, workspaceProjectPath: workspaceProject?.path, - repoName + repoName, }); - + if (projectId && workspaceProject?.path && repoName) { initializeSession(projectId, workspaceProject.path, repoName); } }, [projectId, workspaceProject?.path, repoName]); - - const handleSubmit = useCallback(async (message: string) => { - if (!message.trim() || isSubmitting || !isConnected) return; - - // Check if user is approving a plan - if (mode === 'plan' && message.toLowerCase().includes('yes') && message.toLowerCase().includes('proceed')) { - // Switch to execution mode - setMode('default'); - } - - setIsSubmitting(true); - - try { - await sendMessage(message); - } catch (error) { - console.error('Failed to send message:', error); - } finally { - setIsSubmitting(false); - } - }, [isSubmitting, isConnected, sendMessage, mode, setMode]); - - const handleModeChange = useCallback((newMode: ClaudeMode) => { - setMode(newMode); - }, [setMode]); + + const handleSubmit = useCallback( + async (message: string) => { + if (!message.trim() || isSubmitting || !isConnected) return; + + // Check if user is approving a plan + if ( + mode === 'plan' && + message.toLowerCase().includes('yes') && + message.toLowerCase().includes('proceed') + ) { + // Switch to execution mode + setMode('default'); + } + + setIsSubmitting(true); + + try { + await sendMessage(message); + } catch (error) { + console.error('Failed to send message:', error); + } finally { + setIsSubmitting(false); + } + }, + [isSubmitting, isConnected, sendMessage, mode, setMode] + ); + + const handleModeChange = useCallback( + (newMode: ClaudeMode) => { + setMode(newMode); + }, + [setMode] + ); const handleCancel = useCallback(() => { setIsSubmitting(false); cancelMessage(); }, [cancelMessage]); - + const handleCloseSession = useCallback(() => { setShowCloseConfirm(true); }, []); - + const handleConfirmClose = useCallback(async () => { if (!sessionId) return; - + try { // End the Claude session const response = await fetch('http://localhost:3000/api/claude/code/end', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ sessionId }) + body: JSON.stringify({ sessionId }), }); - + if (!response.ok) { const errorData = await response.json(); console.error('Failed to close session:', response.status, errorData); // Still navigate away even if session cleanup failed } - + // Clear messages and navigate back clearMessages(); navigate(`/projects/${projectId}`); @@ -214,23 +242,20 @@ function ClaudeCodeContent() { navigate(`/projects/${projectId}`); } }, [sessionId, projectId, navigate, clearMessages]); - + if (!project) { return (

Project not found

-
); } - + if (isInitializing) { return (
@@ -241,7 +266,7 @@ function ClaudeCodeContent() {
); } - + if (error) { return (
@@ -262,11 +287,13 @@ function ClaudeCodeContent() {
); } - + return (
{/* Button Bar */} -
+
{reservedRepo && ( <> @@ -278,13 +305,21 @@ function ClaudeCodeContent() { <>
Branch
-
{repoStatus.branch}
+
+ {repoStatus.branch} +
Changes
{repoStatus.isDirty ? ( - <>{repoStatus.changes.modified + repoStatus.changes.added + repoStatus.changes.deleted + repoStatus.changes.untracked} Unstaged + <> + {repoStatus.changes.modified + + repoStatus.changes.added + + repoStatus.changes.deleted + + repoStatus.changes.untracked}{' '} + Unstaged + ) : ( <>none )} @@ -296,37 +331,29 @@ function ClaudeCodeContent() { )}
- -
- + {/* Content Area - Split when todos exist */}
{/* Todo List - Shows when todos exist and user hasn't dismissed */} {todos.length > 0 && showTodos && ( -
- setShowTodos(false)} - /> +
+ setShowTodos(false)} />
)} - + {/* Messages Area */} -
) : ( - } onSuggestedResponse={(response) => { @@ -352,13 +379,13 @@ function ClaudeCodeContent() { )}
- + {/* Input Area or Progress Indicator */}
{isProcessing ? ( m.isStreaming)?.startTime || new Date()} - tokenCount={messages.find(m => m.isStreaming)?.tokenCount} + startTime={messages.find((m) => m.isStreaming)?.startTime || new Date()} + tokenCount={messages.find((m) => m.isStreaming)?.tokenCount} status="Processing" onCancel={handleCancel} /> @@ -373,7 +400,7 @@ function ClaudeCodeContent() { /> )}
- + {/* Confirm close dialog */} - + {/* Session feedback dialog */}
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/pages/Dashboard.tsx b/apps/v1/client/src/pages/Dashboard.tsx index 7af002af..8b5377a7 100644 --- a/apps/v1/client/src/pages/Dashboard.tsx +++ b/apps/v1/client/src/pages/Dashboard.tsx @@ -6,28 +6,38 @@ import { Link } from 'react-router-dom'; export function Dashboard() { const { projects, workItems, personas, jamSessions } = useApp(); const { setHeaderContent } = useLayout(); - + // Clear header content on mount useEffect(() => { setHeaderContent(null); }, [setHeaderContent]); - - const activeProjects = projects.filter(p => p.status === 'active').length; - const activeWorkItems = workItems.filter(w => w.status === 'active').length; - const availablePersonas = personas.filter(p => p.status === 'available').length; - const activeJamSessions = jamSessions.filter(j => j.status === 'active').length; - + + const activeProjects = projects.filter((p) => p.status === 'active').length; + const activeWorkItems = workItems.filter((w) => w.status === 'active').length; + const availablePersonas = personas.filter((p) => p.status === 'available').length; + const activeJamSessions = jamSessions.filter((j) => j.status === 'active').length; + return (

Dashboard

- +
- - + +
@@ -48,13 +58,23 @@ export function Dashboard() {
- +
- - + +
@@ -75,13 +95,23 @@ export function Dashboard() {
- +
- - + +
@@ -102,18 +132,30 @@ export function Dashboard() {
- +
- - + +
-
Active Jam Sessions
+
+ Active Jam Sessions +
{activeJamSessions}
@@ -123,14 +165,17 @@ export function Dashboard() {
- + View sessions
- + {/* Quick Actions */}

Quick Actions

@@ -140,8 +185,18 @@ export function Dashboard() { className="relative rounded-lg border border-gray-300 bg-white px-6 py-5 shadow-sm flex items-center space-x-3 hover:border-gray-400" >
- - + +
@@ -150,14 +205,24 @@ export function Dashboard() {

Start a new project

- +
- - + +
@@ -166,14 +231,24 @@ export function Dashboard() {

Add a new task

- +
- - + +
@@ -186,4 +261,4 @@ export function Dashboard() {
); -} \ No newline at end of file +} diff --git a/apps/v1/client/src/pages/DebugClaude.tsx b/apps/v1/client/src/pages/DebugClaude.tsx index bc6e5d86..f5307bdf 100644 --- a/apps/v1/client/src/pages/DebugClaude.tsx +++ b/apps/v1/client/src/pages/DebugClaude.tsx @@ -101,45 +101,39 @@ export function DebugClaude() { } const data = await response.json(); - + // Update the response with actual data debugResponse.response = data; debugResponse.duration = Date.now() - startTime; - + // Update the responses array - setResponses(current => [ - { ...debugResponse }, - ...current.slice(1) - ]); - + setResponses((current) => [{ ...debugResponse }, ...current.slice(1)]); + // Switch to response tab if successful if (!data.error) { setActiveTab('response'); } - + setQuery(''); } catch (error) { console.error('Debug request failed:', error); - + // Update with error - debugResponse.response = { - error: error instanceof Error - ? `${error.message}. Make sure the server is running on http://localhost:3000` - : 'Unknown error' + debugResponse.response = { + error: + error instanceof Error + ? `${error.message}. Make sure the server is running on http://localhost:3000` + : 'Unknown error', }; debugResponse.duration = Date.now() - startTime; - + // Update the responses array - setResponses(current => [ - { ...debugResponse }, - ...current.slice(1) - ]); + setResponses((current) => [{ ...debugResponse }, ...current.slice(1)]); } finally { setLoading(false); } }; - return (
{/* Query Form */} @@ -147,18 +141,20 @@ export function DebugClaude() {

Claude Debug Interface

- + {mockMode ? 'Mock Mode' : 'Live Mode'} -
+
- +
- + +
+
- .btn-primary:hover { - background: var(--accent-hover); - } + +
+

Checkbox

+ +
+
+
+ + + +
+ Unchecked +
- .btn-secondary { - background: var(--bg-secondary); - color: var(--text-secondary); - border: 1px solid var(--border-default); - } +
+
+ + + +
+ Checked +
+
+
- .btn-secondary:hover { - background: var(--border-default); - } + +
+

Toggle

- .validation-demo { - margin-top: 20px; - } +
+
+
+
+
+ Off +
- @media (max-width: 768px) { - .container { - grid-template-columns: 1fr; - gap: 20px; - } - - .form-row { - flex-direction: column; - gap: 15px; - } - } - - - -
-

Input and Form Components

-
- 🌙 - Toggle Theme - ☀️ +
+
+
+
+ On +
+
-
-
- -
-

Interactive Demo

- - -
-

Text Input

- -
- -
- -
- - -
- -
- - -
Password must be at least 8 characters
-
- -
- -
+ +
+

Registration Form

+ +
+
+ + +
+
+ + +
- -
-

Textarea

- -
- -
+
+
+ + +
- -
-

Checkbox

- -
-
-
- - - -
- Unchecked -
- -
-
- - - -
- Checked -
-
+
+
+ + +
- -
-

Toggle

- -
-
-
-
-
- Off -
- -
-
-
-
- On -
-
+
+
+ + +
- -
-

Registration Form

- -
-
- - -
-
- - -
-
- -
-
- - -
-
- -
-
- - -
-
- -
-
- - -
-
- -
-
-
- - - -
- I agree to the terms and conditions -
-
- -
-
-
-
-
- Subscribe to newsletter -
-
- -
- - -
- +
+
+
+ + + +
+ I agree to the terms and conditions +
- -
-

Real-time Validation Demo

-
- - -
-
- -
- - -
+
+
+
+
+ Subscribe to newsletter +
+ +
+ + +
+
- -
-

Dark Theme Preview

- - -
-

Text Input

- -
- -
- -
- - -
- -
- - -
Password must be at least 8 characters
-
- -
- -
+ +
+

Real-time Validation Demo

+
+ + +
+
+ +
+ + +
+
+
+
+ + +
+

Dark Theme Preview

+ + +
+

Text Input

+ +
+ +
+ +
+ + +
+ +
+ + +
Password must be at least 8 characters
+
+ +
+ +
+
+ + +
+

Textarea

+ +
+ +
+
+ + +
+

Checkbox

+ +
+
+
+ + + +
+ Unchecked
- -
-

Textarea

- -
- -
+
+
+ + + +
+ Checked
+
+
- -
-

Checkbox

- -
-
-
- - - -
- Unchecked -
- -
-
- - - -
- Checked -
-
+ +
+

Toggle

+ +
+
+
+
+
+ Off
- -
-

Toggle

- -
-
-
-
-
- Off -
- -
-
-
-
- On -
-
+
+
+
+
+ On
+
+
- - \ No newline at end of file + + diff --git a/docs/plans/mockups/design-system/Modal.html b/docs/plans/mockups/design-system/Modal.html index cb8f86bc..62fa4e24 100644 --- a/docs/plans/mockups/design-system/Modal.html +++ b/docs/plans/mockups/design-system/Modal.html @@ -1,553 +1,556 @@ - + - - - + + + Modal and Dialog Components - - + +
-
-

Modal and Dialog Components

-
- 🌙 - Dark Mode -
-
- -
- - - - - - - - - - - +
+

Modal and Dialog Components

+
+ 🌙 + Dark Mode
+
+ +
+ + + + + + + + + + + +
@@ -555,263 +558,281 @@

Modal and Dialog Components