diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 55f90339..cc18c23a 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -142,6 +142,22 @@ npm run test:e2e:docker # Docker E2E (real backend) Stack: Vitest browser mode + MSW (`msw/browser`) + axe-core + Testing Library. CI: `ci-ui.yml` (path-filtered) + `ci-docker.yml` (always runs). +## Formatting & Linting + +```bash +cd ui +npm run format # Prettier — format all files +npm run format:check # Prettier — check without writing (used in CI) +npm run lint # ESLint — check for errors +npm run lint:fix # ESLint — auto-fix what's possible +``` + +- **Prettier**: tabs, single quotes, semicolons, Tailwind class sorting +- **ESLint 9** (flat config): TypeScript, React Hooks, import ordering, unused imports, jsx-a11y accessibility, `button-has-type`, `consistent-type-imports` +- **Husky + lint-staged**: pre-commit hook formats and lints staged files automatically +- **`@/` imports**: all cross-directory imports use `@/` (maps to `src/`). Enforced via `no-restricted-imports` rule. +- Config files: `ui/eslint.config.js`, `ui/prettier.config.js`, `ui/.editorconfig` + ## Data directory (all gitignored) - `data/jentic-mini.db` — SQLite database - `data/vault.key` — Fernet encryption key (auto-generated) diff --git a/.github/workflows/ci-ui.yml b/.github/workflows/ci-ui.yml index 41027f16..12d9a806 100644 --- a/.github/workflows/ci-ui.yml +++ b/.github/workflows/ci-ui.yml @@ -55,6 +55,9 @@ jobs: if: steps.cache-playwright.outputs.cache-hit == 'true' run: npx playwright install-deps chromium + - name: Lint & format check + run: npm run lint + - name: TypeScript check run: npx tsc --noEmit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..61534f1a --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +cd ui && npx lint-staged diff --git a/ui/.editorconfig b/ui/.editorconfig new file mode 100644 index 00000000..d904d936 --- /dev/null +++ b/ui/.editorconfig @@ -0,0 +1,17 @@ +# EditorConfig — https://editorconfig.org +root = true + +[*] +indent_style = tab +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 diff --git a/ui/.prettierignore b/ui/.prettierignore new file mode 100644 index 00000000..64d84586 --- /dev/null +++ b/ui/.prettierignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +coverage/ +playwright-report/ +.vitest-attachments/ +src/api/generated/ diff --git a/ui/BUILD_REPORT.md b/ui/BUILD_REPORT.md index 27ce713e..53c5556c 100644 --- a/ui/BUILD_REPORT.md +++ b/ui/BUILD_REPORT.md @@ -5,52 +5,56 @@ ### 1. **New Pages Built** ✅ #### SearchPage (`/search`) + - Full-text search with BM25 over local operations, workflows, and public catalog - Debounced search input (400ms) - Result cards with: - - Type badge (operation/workflow) - - Source badge (local/catalog) with icons - - HTTP method badge (for operations) - - Relevance score (percentage) - - Capability ID with copy button + - Type badge (operation/workflow) + - Source badge (local/catalog) with icons + - HTTP method badge (for operations) + - Relevance score (percentage) + - Capability ID with copy button - Expandable inline detail panel per result: - - Full parameter schema (name, type, required, description) - - Authentication requirements - - Links to API docs and trace history + - Full parameter schema (name, type, required, description) + - Authentication requirements + - Links to API docs and trace history - Example query chips for empty state - Load more pagination (10/20/50 results) - Clean empty state with link to catalog #### CatalogPage (`/catalog`) + **Two tabs:** + 1. **Your APIs (registered)**: - - Lists all locally registered APIs - - Expandable operation list per API (first 50, with truncation notice) - - Operation cards show method badge, summary, path - - Link to search for each API - - Pagination (20 per page) - - Filter by name/ID + - Lists all locally registered APIs + - Expandable operation list per API (first 50, with truncation notice) + - Operation cards show method badge, summary, path + - Link to search for each API + - Pagination (20 per page) + - Filter by name/ID 2. **Public Catalog**: - - Browse Jentic public API catalog (jentic/jentic-public-apis) - - Filter: All | Registered | Unregistered - - Import button for unregistered APIs (routes to credential form) - - Refresh button (pulls fresh manifest from GitHub) - - Manifest age display - - Empty state with sync button - - GitHub links for each entry + - Browse Jentic public API catalog (jentic/jentic-public-apis) + - Filter: All | Registered | Unregistered + - Import button for unregistered APIs (routes to credential form) + - Refresh button (pulls fresh manifest from GitHub) + - Manifest age display + - Empty state with sync button + - GitHub links for each entry #### WorkflowDetailPage (`/workflows/:slug`) + - Workflow name, description, slug - Badge for step count - Involved APIs as badges - Inputs section: name, type, required, description - Steps section: ordered list with: - - Step number badge - - Step ID, description - - Operation ID or nested workflow ID - - Parameters display (first 5) - - Arrow between steps + - Step number badge + - Step ID, description + - Operation ID or nested workflow ID + - Parameters display (first 5) + - Arrow between steps - Fallback to raw JSON if structure missing --- @@ -58,34 +62,39 @@ ### 2. **Major Page Fixes** ✅ #### ToolkitDetailPage — Comprehensive Rebuild + **Fixed:** + - **Keys query bug** — `toolkit.keys` doesn't come from `GET /toolkits/{id}`; now fetches separately from `GET /toolkits/{id}/keys` - **Keys count** — now uses actual keys array length from separate query (was always 0) - **Credential count** — already correct (credentials DO come from detail endpoint) **Added:** + - **Permission management per credential**: - - Expandable editor for each bound credential - - Uses `PermissionRuleEditor` component - - Loads agent rules (filters out system safety rules for display) - - Save button → `setPermissions` API call - - Rule count display on each credential card + - Expandable editor for each bound credential + - Uses `PermissionRuleEditor` component + - Loads agent rules (filters out system safety rules for display) + - Save button → `setPermissions` API call + - Rule count display on each credential card - **Unbind credential button**: - - `ConfirmInline` wrapper for safety - - Calls `api.unbindCredential(toolkitId, credentialId)` + - `ConfirmInline` wrapper for safety + - Calls `api.unbindCredential(toolkitId, credentialId)` - **Request Access dialog**: - - Button at top: "Request Access" - - Modal with: - - Request type selector (grant | modify_permissions) - - Credential dropdown (from `/credentials`) - - Permission rule editor - - Reason textarea - - Submit → creates access request via `api.createAccessRequest` - - Alert with `approve_url` on success + - Button at top: "Request Access" + - Modal with: + - Request type selector (grant | modify_permissions) + - Credential dropdown (from `/credentials`) + - Permission rule editor + - Reason textarea + - Submit → creates access request via `api.createAccessRequest` + - Alert with `approve_url` on success - **Fixed pending requests display** — now shows type badge (grant vs modify) #### ToolkitsPage + **Fixed:** + - **Pending count** — now uses `usePendingRequests()` hook, groups by `toolkit_id` - **Credential count** — improved fallback logic (`credential_count` || `credentials.length` || '—') - **Key count** — shows `key_count` or '—' (list endpoint doesn't return this) @@ -95,6 +104,7 @@ ### 3. **Routes Added** ✅ Added to `App.tsx`: + ``` /credentials/new → CredentialFormPage /credentials/:id/edit → CredentialFormPage @@ -110,6 +120,7 @@ All imports added correctly. ### 4. **API Client Methods Added** ✅ Added to `api/client.ts`: + ``` createAccessRequest(toolkitId, body) // POST /toolkits/{id}/access-requests patchKey(toolkitId, keyId, body) // PATCH /toolkits/{id}/keys/{key_id} @@ -125,21 +136,22 @@ Import for `InspectService` added. **Three entry points:** 1. **From toolkit detail page** (`/toolkits/:id`): - - "Request Access" button at top-right - - Opens modal dialog - - Submit → creates request → shows alert with approval URL + - "Request Access" button at top-right + - Opens modal dialog + - Submit → creates request → shows alert with approval URL 2. **Pending requests banner** (DashboardPage + ToolkitDetailPage): - - Shows pending count with warning styling - - "Review" button → navigates to `/approve/:toolkit_id/:req_id` + - Shows pending count with warning styling + - "Review" button → navigates to `/approve/:toolkit_id/:req_id` 3. **Direct approval URL** (`/approve/:toolkit_id/:req_id`): - - Standalone page (outside main Layout chrome) - - Shows request details: type, reason, rules - - Approve/Deny buttons - - Success → redirects to `/toolkits` after 2.5s + - Standalone page (outside main Layout chrome) + - Shows request details: type, reason, rules + - Approve/Deny buttons + - Success → redirects to `/toolkits` after 2.5s **URL pattern:** `/approve/:toolkit_id/:req_id` + - Clean, shareable - Backend generates as full URL in `approve_url` field - Easy to copy/paste for human approval @@ -149,6 +161,7 @@ Import for `InspectService` added. ## 🔍 Code Audit Results ### Static vs Dynamic Text — All Fixed ✅ + - **DashboardPage**: All counts dynamic (`total`, `length`, etc.) - **CredentialsPage**: All dynamic (count, dates, labels) - **WorkflowsPage**: All dynamic (step count, involved APIs) @@ -157,6 +170,7 @@ Import for `InspectService` added. - **ToolkitsPage**: Pending count fixed ✅, credential count improved ✅ ### Missing Functionality — All Added ✅ + - ✅ Search results → inspect panel - ✅ Catalog → import flow - ✅ Workflows → detail page @@ -175,14 +189,18 @@ Import for `InspectService` added. ✓ Vite build succeeded ✓ TailwindCSS 4 via @tailwindcss/vite plugin (no PostCSS) ✓ Zero hardcoded colors, zero emoji icons +✓ Prettier: all files formatted (tabs, single quotes, Tailwind class sorting) +✓ ESLint 9: 0 errors (143 warnings — no-explicit-any, non-blocking) +✓ Husky + lint-staged: pre-commit hook auto-formats and lints staged files ✓ 143 unit + integration tests passing (Vitest browser mode, 19 test files) ✓ 35 Playwright mocked E2E specs ✓ 3 Docker E2E specs (true end-to-end against real backend) ✓ Automated a11y checks via axe-core on all pages -✓ CI: ci-ui.yml (path-filtered) + ci-docker.yml (always runs, Docker layer caching) +✓ CI: ci-ui.yml (format + lint + tsc + tests) + ci-docker.yml (Docker E2E) ``` **Fixed issues:** + - React Query v5 `onSuccess` → `useEffect` pattern - Credentials query `queryFn` call signature - TailwindCSS 3 → 4 migration: `outline-none` → `outline-hidden` (10 files) @@ -193,6 +211,7 @@ Import for `InspectService` added. ## 📋 UI Coverage vs API ### Fully Covered ✅ + - Search (`/search`) - Catalog browsing (`/catalog` + `/catalog/{api_id}`) - Workflows list + detail (`/workflows`, `/workflows/:slug`) @@ -204,6 +223,7 @@ Import for `InspectService` added. - Access request approval flow ### Gaps (if any) + - **Overlays** (`/apis/{id}/overlays`) — no UI page yet (low priority, admin feature) - **Notes** (`/notes`) — no UI page yet (low priority, internal metadata) - **OAuth brokers** — no UI (intentional, handled server-side) @@ -215,46 +235,47 @@ Both gaps are expected — overlays and notes are advanced admin features, not c ## 🎨 UI/UX Highlights 1. **Design token system** (TailwindCSS 4): - - Single-file theme architecture (`src/index.css`) using shadcn/TW4-native pattern - - `@theme inline` maps CSS custom properties to Tailwind utility classes - - Full HSL color palette in `:root` matching `@jentic/frontend-theme` - - Semantic token names throughout: `bg-primary`, `text-foreground`, `border-border`, etc. - - Zero hardcoded Tailwind default colors (no `red-500`, `gray-300`, etc.) - - No separate `tailwind.config.js` or `styles.css` — everything in `index.css` + - Single-file theme architecture (`src/index.css`) using shadcn/TW4-native pattern + - `@theme inline` maps CSS custom properties to Tailwind utility classes + - Full HSL color palette in `:root` matching `@jentic/frontend-theme` + - Semantic token names throughout: `bg-primary`, `text-foreground`, `border-border`, etc. + - Zero hardcoded Tailwind default colors (no `red-500`, `gray-300`, etc.) + - No separate `tailwind.config.js` or `styles.css` — everything in `index.css` 2. **Lucide React icons**: - - All icons are SVG components from `lucide-react` - - Zero emoji characters used as icons anywhere in the codebase + - All icons are SVG components from `lucide-react` + - Zero emoji characters used as icons anywhere in the codebase 3. **Consistent design language**: - - Badge variants for status (success/warning/danger) - - Method badges (GET/POST/etc.) with color coding - - Source badges (local/catalog) with icons - - ConfirmInline for destructive actions + - Badge variants for status (success/warning/danger) + - Method badges (GET/POST/etc.) with color coding + - Source badges (local/catalog) with icons + - ConfirmInline for destructive actions 4. **Smart loading states**: - - Skeleton text ("Loading...") - - Empty states with helpful CTAs - - Inline spinners for mutations + - Skeleton text ("Loading...") + - Empty states with helpful CTAs + - Inline spinners for mutations 5. **Search & filter**: - - Debounced search inputs - - Filter chips with clear buttons - - Pagination controls + - Debounced search inputs + - Filter chips with clear buttons + - Pagination controls 6. **Keyboard-friendly**: - - Autofocus on search inputs - - Enter to submit forms + - Autofocus on search inputs + - Enter to submit forms 7. **Mobile-responsive**: - - Grid layouts adapt (1/2/4 columns) - - Overflow-x-auto on tables + - Grid layouts adapt (1/2/4 columns) + - Overflow-x-auto on tables --- ## 🚀 Ready for Review All requested features complete: + - ✅ SearchPage and CatalogPage fully built - ✅ All static → dynamic text issues fixed - ✅ Permission request dialogs working with easy URLs diff --git a/ui/TESTING.md b/ui/TESTING.md index 7209d9f7..11d16b18 100644 --- a/ui/TESTING.md +++ b/ui/TESTING.md @@ -26,13 +26,13 @@ npm run test:e2e:docker # requires Docker running ## Test Layers -| Layer | Tool | What to test | -|-------|------|-------------| -| Static | TypeScript + ESLint | Types, imports, syntax | -| Unit | Vitest + Testing Library | Pure logic, UI primitives | -| Integration | Vitest + MSW | Full pages with network mocking | -| E2E (mocked) | Playwright | Critical user journeys with mocked API | -| E2E (Docker) | Playwright | Critical paths against real backend | +| Layer | Tool | What to test | +| ------------ | ------------------------ | -------------------------------------- | +| Static | TypeScript + ESLint | Types, imports, syntax | +| Unit | Vitest + Testing Library | Pure logic, UI primitives | +| Integration | Vitest + MSW | Full pages with network mocking | +| E2E (mocked) | Playwright | Critical user journeys with mocked API | +| E2E (Docker) | Playwright | Critical paths against real backend | **Integration tests are the core.** They render real components with real React Query, real Router, and real DOM — mocking only the network layer via MSW. @@ -61,46 +61,40 @@ e2e/docker/ # Playwright Docker E2E tests (real backend) 4. Test four states: **loading**, **empty**, **populated**, **error** ```tsx -import { screen, renderWithProviders, userEvent } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse } from 'msw' -import MyPage from '../../pages/MyPage' +import { screen, renderWithProviders, userEvent } from '../test-utils'; +import { worker } from '../mocks/browser'; +import { http, HttpResponse } from 'msw'; +import MyPage from '../../pages/MyPage'; describe('MyPage', () => { - it('renders with populated data', async () => { - worker.use( - http.get('/my-endpoint', () => - HttpResponse.json([{ id: '1', name: 'Item' }]), - ), - ) - renderWithProviders() - expect(await screen.findByText('Item')).toBeInTheDocument() - }) - - it('handles error gracefully', async () => { - worker.use( - http.get('/my-endpoint', () => HttpResponse.error()), - ) - renderWithProviders() - expect(await screen.findByRole('heading')).toBeInTheDocument() - }) - - it('completes a mutation round-trip', async () => { - const user = userEvent.setup() - let mutationCalled = false - - worker.use( - http.post('/my-endpoint', () => { - mutationCalled = true - return HttpResponse.json({ id: 'new', name: 'Created' }) - }), - ) - - renderWithProviders() - await user.click(screen.getByRole('button', { name: /create/i })) - // Verify the mutation was called and UI updated - }) -}) + it('renders with populated data', async () => { + worker.use(http.get('/my-endpoint', () => HttpResponse.json([{ id: '1', name: 'Item' }]))); + renderWithProviders(); + expect(await screen.findByText('Item')).toBeInTheDocument(); + }); + + it('handles error gracefully', async () => { + worker.use(http.get('/my-endpoint', () => HttpResponse.error())); + renderWithProviders(); + expect(await screen.findByRole('heading')).toBeInTheDocument(); + }); + + it('completes a mutation round-trip', async () => { + const user = userEvent.setup(); + let mutationCalled = false; + + worker.use( + http.post('/my-endpoint', () => { + mutationCalled = true; + return HttpResponse.json({ id: 'new', name: 'Created' }); + }), + ); + + renderWithProviders(); + await user.click(screen.getByRole('button', { name: /create/i })); + // Verify the mutation was called and UI updated + }); +}); ``` ## Adding MSW Handlers @@ -115,14 +109,15 @@ For pages that use `useParams()`: ```tsx renderWithProviders(, { - route: '/toolkits/tk-1', - path: '/toolkits/:id', -}) + route: '/toolkits/tk-1', + path: '/toolkits/:id', +}); ``` ## Test Isolation Each test gets: + - A fresh `QueryClient` with `retry: false` and `gcTime: 0` (no cache leakage) - MSW handlers reset to defaults via `worker.resetHandlers()` - `localStorage` and `sessionStorage` cleared diff --git a/ui/e2e/approval.spec.ts b/ui/e2e/approval.spec.ts index 6bf20ed7..abe0ddfa 100644 --- a/ui/e2e/approval.spec.ts +++ b/ui/e2e/approval.spec.ts @@ -1,47 +1,59 @@ -import { test, expect } from '@playwright/test' -import { captureConsoleErrors, mockAuthenticatedUser, mockApproval, mockToolkits, navigateTo } from './fixtures' +import { test, expect } from '@playwright/test'; +import { + captureConsoleErrors, + mockAuthenticatedUser, + mockApproval, + mockToolkits, + navigateTo, +} from './fixtures'; test.describe('Approval page', () => { - test('renders access request details', async ({ page }) => { - const errors = captureConsoleErrors(page) - await mockAuthenticatedUser(page) - await mockApproval(page, 'tk-1', 'req-1') - await mockToolkits(page) - - await page.goto('/') - await navigateTo(page, '/approve/tk-1/req-1') - await expect(page.getByText(/access request/i)).toBeVisible() - - expect(errors).toHaveLength(0) - }) - - test('shows approve and deny buttons', async ({ page }) => { - await mockAuthenticatedUser(page) - await mockApproval(page, 'tk-1', 'req-1') - await mockToolkits(page) - - await page.goto('/') - await navigateTo(page, '/approve/tk-1/req-1') - await expect(page.getByRole('button', { name: /approve/i })).toBeVisible() - await expect(page.getByRole('button', { name: /deny/i })).toBeVisible() - }) - - test('redirects to login when not authenticated', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.route('**/health', (route) => { - if (route.request().resourceType() !== 'fetch' && route.request().resourceType() !== 'xhr') - return route.continue() - return route.fulfill({ json: { status: 'ok' } }) - }) - await page.route('**/user/me', (route) => { - if (route.request().resourceType() !== 'fetch' && route.request().resourceType() !== 'xhr') - return route.continue() - return route.fulfill({ json: { logged_in: false } }) - }) - - await page.goto('/') - await page.waitForURL('**/login**') - - expect(errors).toHaveLength(0) - }) -}) + test('renders access request details', async ({ page }) => { + const errors = captureConsoleErrors(page); + await mockAuthenticatedUser(page); + await mockApproval(page, 'tk-1', 'req-1'); + await mockToolkits(page); + + await page.goto('/'); + await navigateTo(page, '/approve/tk-1/req-1'); + await expect(page.getByText(/access request/i)).toBeVisible(); + + expect(errors).toHaveLength(0); + }); + + test('shows approve and deny buttons', async ({ page }) => { + await mockAuthenticatedUser(page); + await mockApproval(page, 'tk-1', 'req-1'); + await mockToolkits(page); + + await page.goto('/'); + await navigateTo(page, '/approve/tk-1/req-1'); + await expect(page.getByRole('button', { name: /approve/i })).toBeVisible(); + await expect(page.getByRole('button', { name: /deny/i })).toBeVisible(); + }); + + test('redirects to login when not authenticated', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.route('**/health', (route) => { + if ( + route.request().resourceType() !== 'fetch' && + route.request().resourceType() !== 'xhr' + ) + return route.continue(); + return route.fulfill({ json: { status: 'ok' } }); + }); + await page.route('**/user/me', (route) => { + if ( + route.request().resourceType() !== 'fetch' && + route.request().resourceType() !== 'xhr' + ) + return route.continue(); + return route.fulfill({ json: { logged_in: false } }); + }); + + await page.goto('/'); + await page.waitForURL('**/login**'); + + expect(errors).toHaveLength(0); + }); +}); diff --git a/ui/e2e/auth.spec.ts b/ui/e2e/auth.spec.ts index a349a7e4..8e0ff234 100644 --- a/ui/e2e/auth.spec.ts +++ b/ui/e2e/auth.spec.ts @@ -1,75 +1,77 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from '@playwright/test'; import { - captureConsoleErrors, - mockNotLoggedIn, - mockSetupRequired, - mockAccountRequired, - mockAuthenticatedUser, - mockDashboard, -} from './fixtures' + captureConsoleErrors, + mockNotLoggedIn, + mockSetupRequired, + mockAccountRequired, + mockAuthenticatedUser, + mockDashboard, +} from './fixtures'; test.describe('Auth — Login page', () => { - test('renders login form when not authenticated', async ({ page }) => { - const errors = captureConsoleErrors(page) - await mockNotLoggedIn(page) - - await page.goto('/login') - await expect(page.getByRole('button', { name: /log in/i })).toBeVisible() - await expect(page.locator('input[type="text"]')).toBeVisible() - await expect(page.locator('input[type="password"]')).toBeVisible() - - expect(errors).toHaveLength(0) - }) - - test('redirects to login when unauthenticated user visits protected route', async ({ page }) => { - await mockNotLoggedIn(page) - - await page.goto('/') - await page.waitForURL('**/login**') - await expect(page.getByRole('button', { name: /log in/i })).toBeVisible() - }) - - test('redirects logged-in user away from login to dashboard', async ({ page }) => { - await mockAuthenticatedUser(page) - await mockDashboard(page) - - await page.goto('/login') - await page.waitForURL('/') - await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible() - }) -}) + test('renders login form when not authenticated', async ({ page }) => { + const errors = captureConsoleErrors(page); + await mockNotLoggedIn(page); + + await page.goto('/login'); + await expect(page.getByRole('button', { name: /log in/i })).toBeVisible(); + await expect(page.locator('input[type="text"]')).toBeVisible(); + await expect(page.locator('input[type="password"]')).toBeVisible(); + + expect(errors).toHaveLength(0); + }); + + test('redirects to login when unauthenticated user visits protected route', async ({ + page, + }) => { + await mockNotLoggedIn(page); + + await page.goto('/'); + await page.waitForURL('**/login**'); + await expect(page.getByRole('button', { name: /log in/i })).toBeVisible(); + }); + + test('redirects logged-in user away from login to dashboard', async ({ page }) => { + await mockAuthenticatedUser(page); + await mockDashboard(page); + + await page.goto('/login'); + await page.waitForURL('/'); + await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible(); + }); +}); test.describe('Auth — Setup page', () => { - test('renders setup page when setup required', async ({ page }) => { - const errors = captureConsoleErrors(page) - await mockSetupRequired(page) + test('renders setup page when setup required', async ({ page }) => { + const errors = captureConsoleErrors(page); + await mockSetupRequired(page); - await page.goto('/setup') - await expect(page.getByRole('heading', { name: /welcome to jentic mini/i })).toBeVisible() + await page.goto('/setup'); + await expect(page.getByRole('heading', { name: /welcome to jentic mini/i })).toBeVisible(); - expect(errors).toHaveLength(0) - }) + expect(errors).toHaveLength(0); + }); - test('redirects to setup when health returns setup_required', async ({ page }) => { - await mockSetupRequired(page) + test('redirects to setup when health returns setup_required', async ({ page }) => { + await mockSetupRequired(page); - await page.goto('/') - await page.waitForURL('**/setup') - await expect(page.getByRole('heading', { name: /welcome to jentic mini/i })).toBeVisible() - }) + await page.goto('/'); + await page.waitForURL('**/setup'); + await expect(page.getByRole('heading', { name: /welcome to jentic mini/i })).toBeVisible(); + }); - test('redirects to setup when health returns account_required', async ({ page }) => { - await mockAccountRequired(page) + test('redirects to setup when health returns account_required', async ({ page }) => { + await mockAccountRequired(page); - await page.goto('/') - await page.waitForURL('**/setup') - }) + await page.goto('/'); + await page.waitForURL('**/setup'); + }); - test('redirects logged-in user away from setup to dashboard', async ({ page }) => { - await mockAuthenticatedUser(page) - await mockDashboard(page) + test('redirects logged-in user away from setup to dashboard', async ({ page }) => { + await mockAuthenticatedUser(page); + await mockDashboard(page); - await page.goto('/setup') - await page.waitForURL('/') - }) -}) + await page.goto('/setup'); + await page.waitForURL('/'); + }); +}); diff --git a/ui/e2e/catalog.spec.ts b/ui/e2e/catalog.spec.ts index 8ee96cb8..927eec12 100644 --- a/ui/e2e/catalog.spec.ts +++ b/ui/e2e/catalog.spec.ts @@ -1,26 +1,32 @@ -import { test, expect } from '@playwright/test' -import { captureConsoleErrors, mockAuthenticatedUser, mockCatalog, mockToolkits, navigateTo } from './fixtures' +import { test, expect } from '@playwright/test'; +import { + captureConsoleErrors, + mockAuthenticatedUser, + mockCatalog, + mockToolkits, + navigateTo, +} from './fixtures'; test.describe('API Catalog page', () => { - test.beforeEach(async ({ page }) => { - await mockAuthenticatedUser(page) - await mockCatalog(page) - await mockToolkits(page) - }) + test.beforeEach(async ({ page }) => { + await mockAuthenticatedUser(page); + await mockCatalog(page); + await mockToolkits(page); + }); - test('renders without errors', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.goto('/') - await navigateTo(page, '/catalog') - await expect(page.getByRole('heading', { name: /api catalog/i })).toBeVisible() - expect(errors).toHaveLength(0) - }) + test('renders without errors', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.goto('/'); + await navigateTo(page, '/catalog'); + await expect(page.getByRole('heading', { name: /api catalog/i })).toBeVisible(); + expect(errors).toHaveLength(0); + }); - test('shows tabs and filter input', async ({ page }) => { - await page.goto('/') - await navigateTo(page, '/catalog') - await expect(page.getByRole('button', { name: 'Your APIs' })).toBeVisible() - await expect(page.getByRole('button', { name: 'Public Catalog' })).toBeVisible() - await expect(page.getByPlaceholder(/filter/i)).toBeVisible() - }) -}) + test('shows tabs and filter input', async ({ page }) => { + await page.goto('/'); + await navigateTo(page, '/catalog'); + await expect(page.getByRole('button', { name: 'Your APIs' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'Public Catalog' })).toBeVisible(); + await expect(page.getByPlaceholder(/filter/i)).toBeVisible(); + }); +}); diff --git a/ui/e2e/credentials.spec.ts b/ui/e2e/credentials.spec.ts index 18ee43f5..5bac4056 100644 --- a/ui/e2e/credentials.spec.ts +++ b/ui/e2e/credentials.spec.ts @@ -1,46 +1,46 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from '@playwright/test'; import { - captureConsoleErrors, - mockAuthenticatedUser, - mockCredentials, - mockCredentialForm, - mockToolkits, - navigateTo, -} from './fixtures' + captureConsoleErrors, + mockAuthenticatedUser, + mockCredentials, + mockCredentialForm, + mockToolkits, + navigateTo, +} from './fixtures'; test.describe('Credentials page', () => { - test.beforeEach(async ({ page }) => { - await mockAuthenticatedUser(page) - await mockCredentials(page) - await mockToolkits(page) - }) + test.beforeEach(async ({ page }) => { + await mockAuthenticatedUser(page); + await mockCredentials(page); + await mockToolkits(page); + }); - test('renders without errors', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.goto('/') - await navigateTo(page, '/credentials') - await expect(page.getByRole('heading', { name: /credentials vault/i })).toBeVisible() - expect(errors).toHaveLength(0) - }) + test('renders without errors', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.goto('/'); + await navigateTo(page, '/credentials'); + await expect(page.getByRole('heading', { name: /credentials vault/i })).toBeVisible(); + expect(errors).toHaveLength(0); + }); - test('shows add credential button', async ({ page }) => { - await page.goto('/') - await navigateTo(page, '/credentials') - await expect(page.getByText(/add credential/i).first()).toBeVisible() - }) -}) + test('shows add credential button', async ({ page }) => { + await page.goto('/'); + await navigateTo(page, '/credentials'); + await expect(page.getByText(/add credential/i).first()).toBeVisible(); + }); +}); test.describe('Credential form page', () => { - test('renders new credential form', async ({ page }) => { - const errors = captureConsoleErrors(page) - await mockAuthenticatedUser(page) - await mockCredentialForm(page) - await mockToolkits(page) + test('renders new credential form', async ({ page }) => { + const errors = captureConsoleErrors(page); + await mockAuthenticatedUser(page); + await mockCredentialForm(page); + await mockToolkits(page); - await page.goto('/') - await navigateTo(page, '/credentials/new') - await expect(page.getByRole('heading', { name: /add credential/i })).toBeVisible() + await page.goto('/'); + await navigateTo(page, '/credentials/new'); + await expect(page.getByRole('heading', { name: /add credential/i })).toBeVisible(); - expect(errors).toHaveLength(0) - }) -}) + expect(errors).toHaveLength(0); + }); +}); diff --git a/ui/e2e/dashboard.spec.ts b/ui/e2e/dashboard.spec.ts index ecabd1cd..4afc97e5 100644 --- a/ui/e2e/dashboard.spec.ts +++ b/ui/e2e/dashboard.spec.ts @@ -1,27 +1,27 @@ -import { test, expect } from '@playwright/test' -import { captureConsoleErrors, mockAuthenticatedUser, mockDashboard } from './fixtures' +import { test, expect } from '@playwright/test'; +import { captureConsoleErrors, mockAuthenticatedUser, mockDashboard } from './fixtures'; test.describe('Dashboard page', () => { - test.beforeEach(async ({ page }) => { - await mockAuthenticatedUser(page) - await mockDashboard(page) - }) + test.beforeEach(async ({ page }) => { + await mockAuthenticatedUser(page); + await mockDashboard(page); + }); - test('renders without errors', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.goto('/') - await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible() - expect(errors).toHaveLength(0) - }) + test('renders without errors', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.goto('/'); + await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible(); + expect(errors).toHaveLength(0); + }); - test('shows stat cards and quick actions', async ({ page }) => { - await page.goto('/') - await expect(page.getByText(/apis registered/i)).toBeVisible() - await expect(page.getByText(/quick actions/i)).toBeVisible() - }) + test('shows stat cards and quick actions', async ({ page }) => { + await page.goto('/'); + await expect(page.getByText(/apis registered/i)).toBeVisible(); + await expect(page.getByText(/quick actions/i)).toBeVisible(); + }); - test('recent executions section visible', async ({ page }) => { - await page.goto('/') - await expect(page.getByText(/recent executions/i)).toBeVisible() - }) -}) + test('recent executions section visible', async ({ page }) => { + await page.goto('/'); + await expect(page.getByText(/recent executions/i)).toBeVisible(); + }); +}); diff --git a/ui/e2e/docker/auth-and-search.spec.ts b/ui/e2e/docker/auth-and-search.spec.ts index 8de73768..96eeff53 100644 --- a/ui/e2e/docker/auth-and-search.spec.ts +++ b/ui/e2e/docker/auth-and-search.spec.ts @@ -1,46 +1,51 @@ -import { test, expect } from '@playwright/test' -import * as fs from 'fs' -import { fileURLToPath } from 'url' -import { dirname, join } from 'path' +import * as fs from 'fs'; +import { fileURLToPath } from 'url'; +import { dirname, join } from 'path'; +import { test, expect } from '@playwright/test'; -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename) -const SHARED_STATE_PATH = join(__dirname, '.docker-e2e-state.json') +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const SHARED_STATE_PATH = join(__dirname, '.docker-e2e-state.json'); function loadSharedState(): { apiKey?: string } { - try { - return JSON.parse(fs.readFileSync(SHARED_STATE_PATH, 'utf-8')) - } catch { - return {} - } + try { + return JSON.parse(fs.readFileSync(SHARED_STATE_PATH, 'utf-8')); + } catch { + return {}; + } } test.describe('Auth cycle', () => { - test('logs in via UI and navigates to dashboard', async ({ page }) => { - await page.goto('/') + test('logs in via UI and navigates to dashboard', async ({ page }) => { + await page.goto('/'); - const loginButton = page.getByRole('button', { name: /log in/i }) - await loginButton.waitFor({ state: 'visible', timeout: 15_000 }) + const loginButton = page.getByRole('button', { name: /log in/i }); + await loginButton.waitFor({ state: 'visible', timeout: 15_000 }); - await page.getByLabel('Username').fill('admin') - await page.getByLabel('Password').fill('admin123') - await loginButton.click() + await page.getByLabel('Username').fill('admin'); + await page.getByLabel('Password').fill('admin123'); + await loginButton.click(); - await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible({ timeout: 15_000 }) - }) -}) + await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible({ + timeout: 15_000, + }); + }); +}); test.describe('Search API', () => { - test('searches using the key generated during setup', async ({ request }) => { - const { apiKey } = loadSharedState() - expect(apiKey, 'Shared state file missing or has no apiKey — setup spec must run first').toBeTruthy() - - const searchRes = await request.get('/search?q=test', { - headers: { 'X-Jentic-API-Key': apiKey! }, - }) - expect(searchRes.ok()).toBeTruthy() - - const results = await searchRes.json() - expect(Array.isArray(results)).toBe(true) - }) -}) + test('searches using the key generated during setup', async ({ request }) => { + const { apiKey } = loadSharedState(); + expect( + apiKey, + 'Shared state file missing or has no apiKey — setup spec must run first', + ).toBeTruthy(); + + const searchRes = await request.get('/search?q=test', { + headers: { 'X-Jentic-API-Key': apiKey! }, + }); + expect(searchRes.ok()).toBeTruthy(); + + const results = await searchRes.json(); + expect(Array.isArray(results)).toBe(true); + }); +}); diff --git a/ui/e2e/docker/setup.spec.ts b/ui/e2e/docker/setup.spec.ts index 940ca644..db31ec42 100644 --- a/ui/e2e/docker/setup.spec.ts +++ b/ui/e2e/docker/setup.spec.ts @@ -1,50 +1,50 @@ -import { test, expect } from '@playwright/test' -import * as fs from 'fs' -import { fileURLToPath } from 'url' -import { dirname, join } from 'path' +import * as fs from 'fs'; +import { fileURLToPath } from 'url'; +import { dirname, join } from 'path'; +import { test, expect } from '@playwright/test'; -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename) -export const SHARED_STATE_PATH = join(__dirname, '.docker-e2e-state.json') +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +export const SHARED_STATE_PATH = join(__dirname, '.docker-e2e-state.json'); test.describe('Setup flow', () => { - test('creates admin account and generates API key', async ({ page, request }) => { - const healthRes = await request.get('/health') - const health = await healthRes.json() - - if (health.status === 'ok') { - const keyRes = await request.post('/default-api-key/generate') - if (keyRes.ok()) { - const body = await keyRes.json() - if (body.key) { - fs.writeFileSync(SHARED_STATE_PATH, JSON.stringify({ apiKey: body.key })) - } - } - test.skip(true, 'Setup already completed — ensured shared state if key available') - return - } - - expect(health.status).toMatch(/setup_required|account_required/) - - await page.goto('/') - await expect(page.getByText(/create admin account/i)).toBeVisible({ timeout: 15_000 }) - - await page.getByLabel('Username').fill('admin') - await page.getByLabel('Password').fill('admin123') - await page.getByRole('button', { name: /create account/i }).click() - - await expect(page.getByText(/admin account created/i)).toBeVisible({ timeout: 15_000 }) - - await page.getByRole('button', { name: /generate agent api key/i }).click() - await expect(page.getByText(/will not be shown again/i)).toBeVisible({ timeout: 15_000 }) - - const keyText = await page.evaluate(() => { - const all = document.body.innerText - const match = all.match(/tk_[a-zA-Z0-9_-]+/) - return match ? match[0] : null - }) - - expect(keyText, 'Expected to find generated API key (tk_...) in page text').toBeTruthy() - fs.writeFileSync(SHARED_STATE_PATH, JSON.stringify({ apiKey: keyText })) - }) -}) + test('creates admin account and generates API key', async ({ page, request }) => { + const healthRes = await request.get('/health'); + const health = await healthRes.json(); + + if (health.status === 'ok') { + const keyRes = await request.post('/default-api-key/generate'); + if (keyRes.ok()) { + const body = await keyRes.json(); + if (body.key) { + fs.writeFileSync(SHARED_STATE_PATH, JSON.stringify({ apiKey: body.key })); + } + } + test.skip(true, 'Setup already completed — ensured shared state if key available'); + return; + } + + expect(health.status).toMatch(/setup_required|account_required/); + + await page.goto('/'); + await expect(page.getByText(/create admin account/i)).toBeVisible({ timeout: 15_000 }); + + await page.getByLabel('Username').fill('admin'); + await page.getByLabel('Password').fill('admin123'); + await page.getByRole('button', { name: /create account/i }).click(); + + await expect(page.getByText(/admin account created/i)).toBeVisible({ timeout: 15_000 }); + + await page.getByRole('button', { name: /generate agent api key/i }).click(); + await expect(page.getByText(/will not be shown again/i)).toBeVisible({ timeout: 15_000 }); + + const keyText = await page.evaluate(() => { + const all = document.body.innerText; + const match = all.match(/tk_[a-zA-Z0-9_-]+/); + return match ? match[0] : null; + }); + + expect(keyText, 'Expected to find generated API key (tk_...) in page text').toBeTruthy(); + fs.writeFileSync(SHARED_STATE_PATH, JSON.stringify({ apiKey: keyText })); + }); +}); diff --git a/ui/e2e/fixtures.ts b/ui/e2e/fixtures.ts index 95791771..d4324178 100644 --- a/ui/e2e/fixtures.ts +++ b/ui/e2e/fixtures.ts @@ -1,4 +1,4 @@ -import { type Page, type Route } from '@playwright/test' +import { type Page, type Route } from '@playwright/test'; // --------------------------------------------------------------------------- // Strict local fixture types — no index signatures, no Partial<>. @@ -6,56 +6,56 @@ import { type Page, type Route } from '@playwright/test' // --------------------------------------------------------------------------- interface FixtureToolkit { - id: string - name: string - description: string - disabled: boolean - simulate: boolean - keys: { id: string; prefix: string; created_at: number }[] - credentials: { credential_id: string; label: string; api_id: string }[] + id: string; + name: string; + description: string; + disabled: boolean; + simulate: boolean; + keys: { id: string; prefix: string; created_at: number }[]; + credentials: { credential_id: string; label: string; api_id: string }[]; } interface FixtureTrace { - id: string - toolkit_id: string - operation_id: string | null - workflow_id: string | null - status: string - http_status: number - duration_ms: number - created_at: number + id: string; + toolkit_id: string; + operation_id: string | null; + workflow_id: string | null; + status: string; + http_status: number; + duration_ms: number; + created_at: number; } interface FixtureWorkflow { - slug: string - name: string - description: string - steps: { id: string; operation: string; description: string }[] - inputs: Record - involved_apis: string[] + slug: string; + name: string; + description: string; + steps: { id: string; operation: string; description: string }[]; + inputs: Record; + involved_apis: string[]; } interface FixtureJob { - id: string - kind: string - status: string - toolkit_id: string - created_at: number - result: unknown + id: string; + kind: string; + status: string; + toolkit_id: string; + created_at: number; + result: unknown; } interface FixtureAccessRequest { - id: string - toolkit_id: string - type: string - status: string - reason: string - created_at: number - payload: { - credential_id?: string - api_id?: string - rules?: { effect: string; methods?: string[]; path?: string }[] - } + id: string; + toolkit_id: string; + type: string; + status: string; + reason: string; + created_at: number; + payload: { + credential_id?: string; + api_id?: string; + rules?: { effect: string; methods?: string[]; path?: string }[]; + }; } // --------------------------------------------------------------------------- @@ -63,16 +63,16 @@ interface FixtureAccessRequest { // --------------------------------------------------------------------------- export function captureConsoleErrors(page: Page) { - const errors: string[] = [] - page.on('console', (msg) => { - if (msg.type() === 'error') { - const text = msg.text() - if (text.includes('Failed to load resource') && text.includes('500')) return - if (text.includes('net::ERR_')) return - errors.push(text) - } - }) - return errors + const errors: string[] = []; + page.on('console', (msg) => { + if (msg.type() === 'error') { + const text = msg.text(); + if (text.includes('Failed to load resource') && text.includes('500')) return; + if (text.includes('net::ERR_')) return; + errors.push(text); + } + }); + return errors; } // --------------------------------------------------------------------------- @@ -80,7 +80,7 @@ export function captureConsoleErrors(page: Page) { // --------------------------------------------------------------------------- function isApiRequest(route: Route): boolean { - return route.request().resourceType() === 'fetch' || route.request().resourceType() === 'xhr' + return route.request().resourceType() === 'fetch' || route.request().resourceType() === 'xhr'; } // --------------------------------------------------------------------------- @@ -90,15 +90,18 @@ function isApiRequest(route: Route): boolean { // --------------------------------------------------------------------------- export async function navigateTo(page: Page, path: string) { - const current = new URL(page.url()) - if (current.pathname === path) return - - await page.evaluate((p) => { - window.history.pushState({}, '', p) - window.dispatchEvent(new PopStateEvent('popstate')) - }, path) - await page.getByRole('heading').first().waitFor({ timeout: 5000 }) - .catch(() => page.waitForLoadState('domcontentloaded')) + const current = new URL(page.url()); + if (current.pathname === path) return; + + await page.evaluate((p) => { + window.history.pushState({}, '', p); + window.dispatchEvent(new PopStateEvent('popstate')); + }, path); + await page + .getByRole('heading') + .first() + .waitFor({ timeout: 5000 }) + .catch(() => page.waitForLoadState('domcontentloaded')); } // --------------------------------------------------------------------------- @@ -106,45 +109,45 @@ export async function navigateTo(page: Page, path: string) { // --------------------------------------------------------------------------- export async function mockAuthenticatedUser(page: Page) { - await page.route('**/health', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { status: 'ok' } }) - }) - await page.route('**/user/me', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ - json: { logged_in: true, username: 'admin', role: 'admin' }, - }) - }) - await page.route('**/version', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { version: '0.2.0-test' } }) - }) + await page.route('**/health', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { status: 'ok' } }); + }); + await page.route('**/user/me', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ + json: { logged_in: true, username: 'admin', role: 'admin' }, + }); + }); + await page.route('**/version', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { version: '0.2.0-test' } }); + }); } export async function mockSetupRequired(page: Page) { - await page.route('**/health', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { status: 'setup_required' } }) - }) + await page.route('**/health', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { status: 'setup_required' } }); + }); } export async function mockAccountRequired(page: Page) { - await page.route('**/health', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { status: 'account_required' } }) - }) + await page.route('**/health', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { status: 'account_required' } }); + }); } export async function mockNotLoggedIn(page: Page) { - await page.route('**/health', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { status: 'ok' } }) - }) - await page.route('**/user/me', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { logged_in: false } }) - }) + await page.route('**/health', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { status: 'ok' } }); + }); + await page.route('**/user/me', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { logged_in: false } }); + }); } // --------------------------------------------------------------------------- @@ -152,207 +155,207 @@ export async function mockNotLoggedIn(page: Page) { // --------------------------------------------------------------------------- export async function mockDashboard(page: Page) { - await page.route('**/apis?*', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { data: [], total: 0, page: 1 } }) - }) - await page.route('**/toolkits', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) - await page.route('**/workflows', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) - await page.route('**/traces?*', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { traces: [], total: 0 } }) - }) + await page.route('**/apis?*', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { data: [], total: 0, page: 1 } }); + }); + await page.route('**/toolkits', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); + await page.route('**/workflows', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); + await page.route('**/traces?*', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { traces: [], total: 0 } }); + }); } export async function mockSearch(page: Page) { - await page.route('**/search?*', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) + await page.route('**/search?*', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); } export async function mockCatalog(page: Page) { - await page.route('**/apis?*', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { data: [], total: 0, page: 1 } }) - }) - await page.route('**/catalog?*', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) - await page.route('**/catalog', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) + await page.route('**/apis?*', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { data: [], total: 0, page: 1 } }); + }); + await page.route('**/catalog?*', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); + await page.route('**/catalog', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); } export async function mockToolkits(page: Page) { - await page.route('**/toolkits', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) + await page.route('**/toolkits', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); } export async function mockToolkitDetail(page: Page, id = 'test-tk') { - await page.route(`**/toolkits/${id}`, (route) => { - if (!isApiRequest(route)) return route.continue() - const data: FixtureToolkit = { - id, - name: 'Test Toolkit', - description: 'A test toolkit', - disabled: false, - simulate: false, - keys: [], - credentials: [], - } - return route.fulfill({ json: data }) - }) - await page.route(`**/toolkits/${id}/keys`, (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { keys: [] } }) - }) - await page.route(`**/toolkits/${id}/access-requests*`, (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) - await page.route(`**/toolkits/${id}/credentials`, (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) + await page.route(`**/toolkits/${id}`, (route) => { + if (!isApiRequest(route)) return route.continue(); + const data: FixtureToolkit = { + id, + name: 'Test Toolkit', + description: 'A test toolkit', + disabled: false, + simulate: false, + keys: [], + credentials: [], + }; + return route.fulfill({ json: data }); + }); + await page.route(`**/toolkits/${id}/keys`, (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { keys: [] } }); + }); + await page.route(`**/toolkits/${id}/access-requests*`, (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); + await page.route(`**/toolkits/${id}/credentials`, (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); } export async function mockCredentials(page: Page) { - await page.route('**/credentials', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { data: [], total: 0 } }) - }) - await page.route('**/credentials?*', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { data: [], total: 0 } }) - }) + await page.route('**/credentials', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { data: [], total: 0 } }); + }); + await page.route('**/credentials?*', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { data: [], total: 0 } }); + }); } export async function mockCredentialForm(page: Page) { - await page.route('**/apis?*', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { data: [], total: 0, page: 1 } }) - }) + await page.route('**/apis?*', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { data: [], total: 0, page: 1 } }); + }); } export async function mockOAuthBrokers(page: Page) { - await page.route('**/oauth-brokers', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) + await page.route('**/oauth-brokers', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); } export async function mockTraces(page: Page) { - await page.route('**/traces?*', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { traces: [], total: 0 } }) - }) - await page.route('**/traces', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { traces: [], total: 0 } }) - }) + await page.route('**/traces?*', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { traces: [], total: 0 } }); + }); + await page.route('**/traces', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { traces: [], total: 0 } }); + }); } export async function mockTraceDetail(page: Page, id = 'trace-1') { - await page.route(`**/traces/${id}`, (route) => { - if (!isApiRequest(route)) return route.continue() - const data: FixtureTrace = { - id, - toolkit_id: 'test-tk', - operation_id: 'listUsers', - workflow_id: null, - status: 'ok', - http_status: 200, - duration_ms: 120, - created_at: Math.floor(Date.now() / 1000) - 60, - } - return route.fulfill({ json: data }) - }) + await page.route(`**/traces/${id}`, (route) => { + if (!isApiRequest(route)) return route.continue(); + const data: FixtureTrace = { + id, + toolkit_id: 'test-tk', + operation_id: 'listUsers', + workflow_id: null, + status: 'ok', + http_status: 200, + duration_ms: 120, + created_at: Math.floor(Date.now() / 1000) - 60, + }; + return route.fulfill({ json: data }); + }); } export async function mockWorkflows(page: Page) { - await page.route('**/workflows', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: [] }) - }) + await page.route('**/workflows', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: [] }); + }); } export async function mockWorkflowDetail(page: Page, slug = 'test-workflow') { - await page.route(`**/workflows/${slug}`, (route) => { - if (!isApiRequest(route)) return route.continue() - const data: FixtureWorkflow = { - slug, - name: 'Test Workflow', - description: 'A test workflow', - steps: [ - { id: 'step-1', operation: 'doSomething', description: 'First step' }, - { id: 'step-2', operation: 'doMore', description: 'Second step' }, - ], - inputs: { input1: { type: 'string', required: true } }, - involved_apis: ['test-api'], - } - return route.fulfill({ json: data }) - }) + await page.route(`**/workflows/${slug}`, (route) => { + if (!isApiRequest(route)) return route.continue(); + const data: FixtureWorkflow = { + slug, + name: 'Test Workflow', + description: 'A test workflow', + steps: [ + { id: 'step-1', operation: 'doSomething', description: 'First step' }, + { id: 'step-2', operation: 'doMore', description: 'Second step' }, + ], + inputs: { input1: { type: 'string', required: true } }, + involved_apis: ['test-api'], + }; + return route.fulfill({ json: data }); + }); } export async function mockJobs(page: Page) { - await page.route('**/jobs?*', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { items: [], total: 0 } }) - }) - await page.route('**/jobs', (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ json: { items: [], total: 0 } }) - }) + await page.route('**/jobs?*', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { items: [], total: 0 } }); + }); + await page.route('**/jobs', (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ json: { items: [], total: 0 } }); + }); } export async function mockJobDetail(page: Page, id = 'job-1') { - await page.route(`**/jobs/${id}`, (route) => { - if (!isApiRequest(route)) return route.continue() - const data: FixtureJob = { - id, - kind: 'execute', - status: 'complete', - toolkit_id: 'test-tk', - created_at: Math.floor(Date.now() / 1000) - 300, - result: { success: true }, - } - return route.fulfill({ json: data }) - }) + await page.route(`**/jobs/${id}`, (route) => { + if (!isApiRequest(route)) return route.continue(); + const data: FixtureJob = { + id, + kind: 'execute', + status: 'complete', + toolkit_id: 'test-tk', + created_at: Math.floor(Date.now() / 1000) - 300, + result: { success: true }, + }; + return route.fulfill({ json: data }); + }); } export async function mockApproval(page: Page, toolkitId = 'tk-1', reqId = 'req-1') { - await page.route(`**/toolkits/${toolkitId}`, (route) => { - if (!isApiRequest(route)) return route.continue() - return route.fulfill({ - json: { id: toolkitId, name: 'Test Toolkit' }, - }) - }) - await page.route(`**/toolkits/${toolkitId}/access-requests/${reqId}`, (route) => { - if (!isApiRequest(route)) return route.continue() - const data: FixtureAccessRequest = { - id: reqId, - toolkit_id: toolkitId, - type: 'grant', - status: 'pending', - reason: 'Need access for testing', - created_at: Math.floor(Date.now() / 1000) - 120, - payload: { - credential_id: 'cred-1', - api_id: 'github.com', - rules: [], - }, - } - return route.fulfill({ json: data }) - }) + await page.route(`**/toolkits/${toolkitId}`, (route) => { + if (!isApiRequest(route)) return route.continue(); + return route.fulfill({ + json: { id: toolkitId, name: 'Test Toolkit' }, + }); + }); + await page.route(`**/toolkits/${toolkitId}/access-requests/${reqId}`, (route) => { + if (!isApiRequest(route)) return route.continue(); + const data: FixtureAccessRequest = { + id: reqId, + toolkit_id: toolkitId, + type: 'grant', + status: 'pending', + reason: 'Need access for testing', + created_at: Math.floor(Date.now() / 1000) - 120, + payload: { + credential_id: 'cred-1', + api_id: 'github.com', + rules: [], + }, + }; + return route.fulfill({ json: data }); + }); } diff --git a/ui/e2e/jobs.spec.ts b/ui/e2e/jobs.spec.ts index 33261652..81cd806b 100644 --- a/ui/e2e/jobs.spec.ts +++ b/ui/e2e/jobs.spec.ts @@ -1,56 +1,56 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from '@playwright/test'; import { - captureConsoleErrors, - mockAuthenticatedUser, - mockJobs, - mockJobDetail, - mockToolkits, - navigateTo, -} from './fixtures' + captureConsoleErrors, + mockAuthenticatedUser, + mockJobs, + mockJobDetail, + mockToolkits, + navigateTo, +} from './fixtures'; test.describe('Jobs page', () => { - test.beforeEach(async ({ page }) => { - await mockAuthenticatedUser(page) - await mockJobs(page) - await mockToolkits(page) - }) + test.beforeEach(async ({ page }) => { + await mockAuthenticatedUser(page); + await mockJobs(page); + await mockToolkits(page); + }); - test('renders without errors', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.goto('/') - await navigateTo(page, '/jobs') - await expect(page.getByRole('heading', { name: /background jobs/i })).toBeVisible() - expect(errors).toHaveLength(0) - }) + test('renders without errors', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.goto('/'); + await navigateTo(page, '/jobs'); + await expect(page.getByRole('heading', { name: /background jobs/i })).toBeVisible(); + expect(errors).toHaveLength(0); + }); - test('shows status filter pills', async ({ page }) => { - await page.goto('/') - await navigateTo(page, '/jobs') - await expect(page.getByRole('button', { name: 'all' })).toBeVisible() - await expect(page.getByRole('button', { name: 'pending' })).toBeVisible() - await expect(page.getByRole('button', { name: 'running' })).toBeVisible() - }) + test('shows status filter pills', async ({ page }) => { + await page.goto('/'); + await navigateTo(page, '/jobs'); + await expect(page.getByRole('button', { name: 'all' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'pending' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'running' })).toBeVisible(); + }); - test('shows empty state when no jobs', async ({ page }) => { - await page.goto('/') - await navigateTo(page, '/jobs') - await expect(page.getByText(/no jobs found/i)).toBeVisible() - }) -}) + test('shows empty state when no jobs', async ({ page }) => { + await page.goto('/'); + await navigateTo(page, '/jobs'); + await expect(page.getByText(/no jobs found/i)).toBeVisible(); + }); +}); test.describe('Job detail page', () => { - test('renders job detail', async ({ page }) => { - const errors = captureConsoleErrors(page) - await mockAuthenticatedUser(page) - await mockJobDetail(page, 'job-1') - await mockToolkits(page) + test('renders job detail', async ({ page }) => { + const errors = captureConsoleErrors(page); + await mockAuthenticatedUser(page); + await mockJobDetail(page, 'job-1'); + await mockToolkits(page); - await page.goto('/') - await navigateTo(page, '/jobs/job-1') - await expect(page.getByText('job-1')).toBeVisible() - await expect(page.getByText(/back to jobs/i)).toBeVisible() - await expect(page.getByText(/summary/i).first()).toBeVisible() + await page.goto('/'); + await navigateTo(page, '/jobs/job-1'); + await expect(page.getByText('job-1')).toBeVisible(); + await expect(page.getByText(/back to jobs/i)).toBeVisible(); + await expect(page.getByText(/summary/i).first()).toBeVisible(); - expect(errors).toHaveLength(0) - }) -}) + expect(errors).toHaveLength(0); + }); +}); diff --git a/ui/e2e/oauth-brokers.spec.ts b/ui/e2e/oauth-brokers.spec.ts index 79e8fd86..f22ab0e7 100644 --- a/ui/e2e/oauth-brokers.spec.ts +++ b/ui/e2e/oauth-brokers.spec.ts @@ -1,24 +1,30 @@ -import { test, expect } from '@playwright/test' -import { captureConsoleErrors, mockAuthenticatedUser, mockOAuthBrokers, mockToolkits, navigateTo } from './fixtures' +import { test, expect } from '@playwright/test'; +import { + captureConsoleErrors, + mockAuthenticatedUser, + mockOAuthBrokers, + mockToolkits, + navigateTo, +} from './fixtures'; test.describe('OAuth Brokers page', () => { - test.beforeEach(async ({ page }) => { - await mockAuthenticatedUser(page) - await mockOAuthBrokers(page) - await mockToolkits(page) - }) + test.beforeEach(async ({ page }) => { + await mockAuthenticatedUser(page); + await mockOAuthBrokers(page); + await mockToolkits(page); + }); - test('renders without errors', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.goto('/') - await navigateTo(page, '/oauth-brokers') - await expect(page.getByRole('heading', { name: /oauth brokers/i })).toBeVisible() - expect(errors).toHaveLength(0) - }) + test('renders without errors', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.goto('/'); + await navigateTo(page, '/oauth-brokers'); + await expect(page.getByRole('heading', { name: /oauth brokers/i })).toBeVisible(); + expect(errors).toHaveLength(0); + }); - test('shows add broker button', async ({ page }) => { - await page.goto('/') - await navigateTo(page, '/oauth-brokers') - await expect(page.getByRole('button', { name: /add broker/i }).first()).toBeVisible() - }) -}) + test('shows add broker button', async ({ page }) => { + await page.goto('/'); + await navigateTo(page, '/oauth-brokers'); + await expect(page.getByRole('button', { name: /add broker/i }).first()).toBeVisible(); + }); +}); diff --git a/ui/e2e/search.spec.ts b/ui/e2e/search.spec.ts index e1369563..2b293ccb 100644 --- a/ui/e2e/search.spec.ts +++ b/ui/e2e/search.spec.ts @@ -1,24 +1,30 @@ -import { test, expect } from '@playwright/test' -import { captureConsoleErrors, mockAuthenticatedUser, mockSearch, mockToolkits, navigateTo } from './fixtures' +import { test, expect } from '@playwright/test'; +import { + captureConsoleErrors, + mockAuthenticatedUser, + mockSearch, + mockToolkits, + navigateTo, +} from './fixtures'; test.describe('Search page', () => { - test.beforeEach(async ({ page }) => { - await mockAuthenticatedUser(page) - await mockSearch(page) - await mockToolkits(page) - }) + test.beforeEach(async ({ page }) => { + await mockAuthenticatedUser(page); + await mockSearch(page); + await mockToolkits(page); + }); - test('renders without errors', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.goto('/') - await navigateTo(page, '/search') - await expect(page.getByRole('heading', { name: /search/i })).toBeVisible() - expect(errors).toHaveLength(0) - }) + test('renders without errors', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.goto('/'); + await navigateTo(page, '/search'); + await expect(page.getByRole('heading', { name: /search/i })).toBeVisible(); + expect(errors).toHaveLength(0); + }); - test('shows search input and example queries', async ({ page }) => { - await page.goto('/') - await navigateTo(page, '/search') - await expect(page.getByPlaceholder(/send an email/i)).toBeVisible() - }) -}) + test('shows search input and example queries', async ({ page }) => { + await page.goto('/'); + await navigateTo(page, '/search'); + await expect(page.getByPlaceholder(/send an email/i)).toBeVisible(); + }); +}); diff --git a/ui/e2e/toolkits.spec.ts b/ui/e2e/toolkits.spec.ts index 8e1b2584..08eb537b 100644 --- a/ui/e2e/toolkits.spec.ts +++ b/ui/e2e/toolkits.spec.ts @@ -1,45 +1,45 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from '@playwright/test'; import { - captureConsoleErrors, - mockAuthenticatedUser, - mockToolkits, - mockToolkitDetail, - navigateTo, -} from './fixtures' + captureConsoleErrors, + mockAuthenticatedUser, + mockToolkits, + mockToolkitDetail, + navigateTo, +} from './fixtures'; test.describe('Toolkits page', () => { - test.beforeEach(async ({ page }) => { - await mockAuthenticatedUser(page) - await mockToolkits(page) - }) + test.beforeEach(async ({ page }) => { + await mockAuthenticatedUser(page); + await mockToolkits(page); + }); - test('renders without errors', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.goto('/') - await navigateTo(page, '/toolkits') - await expect(page.getByRole('heading', { name: /toolkits/i })).toBeVisible() - expect(errors).toHaveLength(0) - }) + test('renders without errors', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.goto('/'); + await navigateTo(page, '/toolkits'); + await expect(page.getByRole('heading', { name: /toolkits/i })).toBeVisible(); + expect(errors).toHaveLength(0); + }); - test('shows create toolkit button', async ({ page }) => { - await page.goto('/') - await navigateTo(page, '/toolkits') - await expect(page.getByRole('button', { name: /create toolkit/i }).first()).toBeVisible() - }) -}) + test('shows create toolkit button', async ({ page }) => { + await page.goto('/'); + await navigateTo(page, '/toolkits'); + await expect(page.getByRole('button', { name: /create toolkit/i }).first()).toBeVisible(); + }); +}); test.describe('Toolkit detail page', () => { - test('renders toolkit detail', async ({ page }) => { - const errors = captureConsoleErrors(page) - await mockAuthenticatedUser(page) - await mockToolkitDetail(page, 'test-tk') - await mockToolkits(page) + test('renders toolkit detail', async ({ page }) => { + const errors = captureConsoleErrors(page); + await mockAuthenticatedUser(page); + await mockToolkitDetail(page, 'test-tk'); + await mockToolkits(page); - await page.goto('/') - await navigateTo(page, '/toolkits/test-tk') - await expect(page.getByRole('heading', { name: 'Test Toolkit' })).toBeVisible() - await expect(page.getByText(/back to toolkits/i)).toBeVisible() + await page.goto('/'); + await navigateTo(page, '/toolkits/test-tk'); + await expect(page.getByRole('heading', { name: 'Test Toolkit' })).toBeVisible(); + await expect(page.getByText(/back to toolkits/i)).toBeVisible(); - expect(errors).toHaveLength(0) - }) -}) + expect(errors).toHaveLength(0); + }); +}); diff --git a/ui/e2e/traces.spec.ts b/ui/e2e/traces.spec.ts index 4bb1dba1..82c4404c 100644 --- a/ui/e2e/traces.spec.ts +++ b/ui/e2e/traces.spec.ts @@ -1,47 +1,47 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from '@playwright/test'; import { - captureConsoleErrors, - mockAuthenticatedUser, - mockTraces, - mockTraceDetail, - mockToolkits, - navigateTo, -} from './fixtures' + captureConsoleErrors, + mockAuthenticatedUser, + mockTraces, + mockTraceDetail, + mockToolkits, + navigateTo, +} from './fixtures'; test.describe('Traces page', () => { - test.beforeEach(async ({ page }) => { - await mockAuthenticatedUser(page) - await mockTraces(page) - await mockToolkits(page) - }) + test.beforeEach(async ({ page }) => { + await mockAuthenticatedUser(page); + await mockTraces(page); + await mockToolkits(page); + }); - test('renders without errors', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.goto('/') - await navigateTo(page, '/traces') - await expect(page.getByRole('heading', { name: /execution traces/i })).toBeVisible() - expect(errors).toHaveLength(0) - }) + test('renders without errors', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.goto('/'); + await navigateTo(page, '/traces'); + await expect(page.getByRole('heading', { name: /execution traces/i })).toBeVisible(); + expect(errors).toHaveLength(0); + }); - test('shows empty state when no traces', async ({ page }) => { - await page.goto('/') - await navigateTo(page, '/traces') - await expect(page.getByText(/no traces found/i)).toBeVisible() - }) -}) + test('shows empty state when no traces', async ({ page }) => { + await page.goto('/'); + await navigateTo(page, '/traces'); + await expect(page.getByText(/no traces found/i)).toBeVisible(); + }); +}); test.describe('Trace detail page', () => { - test('renders trace detail', async ({ page }) => { - const errors = captureConsoleErrors(page) - await mockAuthenticatedUser(page) - await mockTraceDetail(page, 'trace-1') - await mockToolkits(page) + test('renders trace detail', async ({ page }) => { + const errors = captureConsoleErrors(page); + await mockAuthenticatedUser(page); + await mockTraceDetail(page, 'trace-1'); + await mockToolkits(page); - await page.goto('/') - await navigateTo(page, '/traces/trace-1') - await expect(page.getByText('trace-1')).toBeVisible() - await expect(page.getByText(/back to traces/i)).toBeVisible() + await page.goto('/'); + await navigateTo(page, '/traces/trace-1'); + await expect(page.getByText('trace-1')).toBeVisible(); + await expect(page.getByText(/back to traces/i)).toBeVisible(); - expect(errors).toHaveLength(0) - }) -}) + expect(errors).toHaveLength(0); + }); +}); diff --git a/ui/e2e/workflows.spec.ts b/ui/e2e/workflows.spec.ts index b63d3376..12251a56 100644 --- a/ui/e2e/workflows.spec.ts +++ b/ui/e2e/workflows.spec.ts @@ -1,49 +1,49 @@ -import { test, expect } from '@playwright/test' +import { test, expect } from '@playwright/test'; import { - captureConsoleErrors, - mockAuthenticatedUser, - mockWorkflows, - mockWorkflowDetail, - mockToolkits, - navigateTo, -} from './fixtures' + captureConsoleErrors, + mockAuthenticatedUser, + mockWorkflows, + mockWorkflowDetail, + mockToolkits, + navigateTo, +} from './fixtures'; test.describe('Workflows page', () => { - test.beforeEach(async ({ page }) => { - await mockAuthenticatedUser(page) - await mockWorkflows(page) - await mockToolkits(page) - }) + test.beforeEach(async ({ page }) => { + await mockAuthenticatedUser(page); + await mockWorkflows(page); + await mockToolkits(page); + }); - test('renders without errors', async ({ page }) => { - const errors = captureConsoleErrors(page) - await page.goto('/') - await navigateTo(page, '/workflows') - await expect(page.getByRole('heading', { name: /workflows/i })).toBeVisible() - expect(errors).toHaveLength(0) - }) + test('renders without errors', async ({ page }) => { + const errors = captureConsoleErrors(page); + await page.goto('/'); + await navigateTo(page, '/workflows'); + await expect(page.getByRole('heading', { name: /workflows/i })).toBeVisible(); + expect(errors).toHaveLength(0); + }); - test('shows empty state when no workflows', async ({ page }) => { - await page.goto('/') - await navigateTo(page, '/workflows') - await expect(page.getByText(/no workflows registered/i)).toBeVisible() - }) -}) + test('shows empty state when no workflows', async ({ page }) => { + await page.goto('/'); + await navigateTo(page, '/workflows'); + await expect(page.getByText(/no workflows registered/i)).toBeVisible(); + }); +}); test.describe('Workflow detail page', () => { - test('renders workflow detail with steps', async ({ page }) => { - const errors = captureConsoleErrors(page) - await mockAuthenticatedUser(page) - await mockWorkflowDetail(page, 'test-workflow') - await mockWorkflows(page) - await mockToolkits(page) + test('renders workflow detail with steps', async ({ page }) => { + const errors = captureConsoleErrors(page); + await mockAuthenticatedUser(page); + await mockWorkflowDetail(page, 'test-workflow'); + await mockWorkflows(page); + await mockToolkits(page); - await page.goto('/') - await navigateTo(page, '/workflows/test-workflow') - await expect(page.getByRole('heading', { name: 'Test Workflow' })).toBeVisible() - await expect(page.getByText(/back to workflows/i)).toBeVisible() - await expect(page.getByText(/2 steps/i)).toBeVisible() + await page.goto('/'); + await navigateTo(page, '/workflows/test-workflow'); + await expect(page.getByRole('heading', { name: 'Test Workflow' })).toBeVisible(); + await expect(page.getByText(/back to workflows/i)).toBeVisible(); + await expect(page.getByText(/2 steps/i)).toBeVisible(); - expect(errors).toHaveLength(0) - }) -}) + expect(errors).toHaveLength(0); + }); +}); diff --git a/ui/eslint.config.js b/ui/eslint.config.js new file mode 100644 index 00000000..93166751 --- /dev/null +++ b/ui/eslint.config.js @@ -0,0 +1,174 @@ +import { defineConfig, globalIgnores } from 'eslint/config'; +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import pluginReact from 'eslint-plugin-react'; +import pluginReactHooks from 'eslint-plugin-react-hooks'; +import pluginImportX from 'eslint-plugin-import-x'; +import pluginUnusedImports from 'eslint-plugin-unused-imports'; +import pluginJsxA11y from 'eslint-plugin-jsx-a11y'; +import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; +import globals from 'globals'; + +export default defineConfig( + js.configs.recommended, + tseslint.configs.recommended, + + // ─── Main source rules ─────────────────────────────────────────────── + { + files: ['**/*.{ts,tsx}'], + plugins: { + react: pluginReact, + 'react-hooks': pluginReactHooks, + 'import-x': pluginImportX, + 'unused-imports': pluginUnusedImports, + 'jsx-a11y': pluginJsxA11y, + }, + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { + ...globals.browser, + }, + parserOptions: { + ecmaFeatures: { jsx: true }, + }, + }, + settings: { + react: { version: 'detect' }, + }, + rules: { + // ── Import hygiene ────────────────────────────────────────── + 'import-x/no-duplicates': 'error', + 'import-x/order': [ + 'error', + { + groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], + 'newlines-between': 'never', + }, + ], + 'import-x/no-cycle': ['error', { ignoreExternal: true }], + 'import-x/no-self-import': 'error', + 'import-x/no-restricted-paths': [ + 'error', + { + zones: [{ target: './src/components/**', from: './src/pages/**' }], + }, + ], + 'unused-imports/no-unused-imports': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['../*'], + message: 'Use @/ absolute imports instead of relative parent paths.', + }, + ], + }, + ], + + // ── React ─────────────────────────────────────────────────── + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + 'react/jsx-pascal-case': 'error', + 'react/jsx-key': 'error', + 'react/jsx-no-target-blank': 'warn', + 'react/jsx-no-useless-fragment': 'warn', + 'react/jsx-curly-brace-presence': ['warn', { props: 'never', children: 'never' }], + 'react/no-children-prop': 'error', + 'react/no-danger-with-children': 'error', + 'react/no-danger': 'error', + 'react/no-array-index-key': 'warn', + 'react/button-has-type': 'error', + 'react/self-closing-comp': 'warn', + 'react/function-component-definition': [ + 'error', + { + namedComponents: 'function-declaration', + unnamedComponents: 'function-expression', + }, + ], + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + + 'no-restricted-syntax': [ + 'warn', + { + selector: + "JSXOpeningElement[name.name='a'][attributes] JSXAttribute[name.name='href'][value.value=/^\\/[^/]/]", + message: + 'Use from react-router-dom for internal navigation instead of .', + }, + ], + + // ── Accessibility ─────────────────────────────────────────── + 'jsx-a11y/alt-text': 'error', + 'jsx-a11y/anchor-has-content': 'error', + 'jsx-a11y/anchor-is-valid': 'error', + 'jsx-a11y/click-events-have-key-events': 'warn', + 'jsx-a11y/no-static-element-interactions': 'warn', + 'jsx-a11y/label-has-associated-control': ['error', { depth: 3 }], + + // ── TypeScript ────────────────────────────────────────────── + '@typescript-eslint/no-unused-vars': [ + 'warn', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, + ], + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-non-null-assertion': 'warn', + '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }], + + // ── General ───────────────────────────────────────────────── + 'no-console': ['warn', { allow: ['warn', 'error'] }], + 'no-unused-vars': 'off', + 'max-depth': ['warn', 4], + }, + }, + + // ─── Test files — relaxed rules ────────────────────────────────────── + { + files: ['**/__tests__/**', '**/*.test.{ts,tsx}', '**/*.spec.{ts,tsx}'], + rules: { + 'no-console': 'off', + 'no-restricted-imports': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/consistent-type-imports': 'off', + 'react/function-component-definition': 'off', + 'react/button-has-type': 'off', + 'jsx-a11y/click-events-have-key-events': 'off', + 'jsx-a11y/no-static-element-interactions': 'off', + }, + }, + + // ─── E2E tests — lint checked but relaxed ──────────────────────────── + { + files: ['e2e/**/*.{ts,tsx}'], + rules: { + 'no-console': 'off', + 'no-restricted-imports': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/consistent-type-imports': 'off', + }, + }, + + // Prettier must be last to override formatting rules + eslintPluginPrettierRecommended, + + // ─── Global ignores ────────────────────────────────────────────────── + globalIgnores([ + 'dist/', + 'node_modules/', + 'coverage/', + 'playwright-report/', + '.vitest-attachments/', + 'src/api/generated/', + 'eslint.config.js', + 'vite.config.ts', + 'vitest.config.ts', + 'prettier.config.js', + 'playwright.config.ts', + 'playwright.docker.config.ts', + ]), +); diff --git a/ui/index.html b/ui/index.html index a43c2742..2d6778ac 100644 --- a/ui/index.html +++ b/ui/index.html @@ -1,16 +1,19 @@ - + - - - - - - - - Jentic Mini - - -
- - + + + + + + + + Jentic Mini + + +
+ + diff --git a/ui/openapi.json b/ui/openapi.json index 0c048543..f797e617 100644 --- a/ui/openapi.json +++ b/ui/openapi.json @@ -1 +1,3156 @@ -{"openapi":"3.1.0","info":{"title":"Jentic Mini","description":"**Jentic Mini** is the open-source, self-hosted implementation of the Jentic API — fully API-compatible with the [Jentic hosted and VPC editions](https://jentic.com).\n\n## What is Jentic Mini?\nJentic Mini gives any agent a local execution layer: search a catalog of registered APIs, broker authenticated requests without exposing credentials to the agent, enforce access policies, and observe every execution. It is designed to be dropped in as a self-hosted alternative to the Jentic cloud service.\n\n## Hosted vs Self-hosted\nThe **Jentic hosted and VPC editions** offer deeper implementations across three areas:\n\n| Capability | Jentic Mini (this) | Jentic hosted / VPC |\n|------------|-------------------|---------------------|\n| **Search** | BM25 full-text search | Advanced semantic search (~64% accuracy improvement over BM25) |\n| **Request brokering** | In-process credential injection | Scalable AWS Lambda-based broker with encryption at rest and in-transit, SOC 2-grade security, and 3rd-party credential vault integrations (HashiCorp Vault, AWS Secrets Manager, etc.) |\n| **Simulation** | Basic simulate mode | Full sandbox for simulating API calls and toolkit behaviour (enterprise-only) |\n| **Catalog** | Local registry only | Central catalog — aggregates the collective know-how of agents across API definitions and Arazzo workflows |\n\n## Authentication\n**Agents** — provide `X-Jentic-API-Key: tk_xxx` header.\n**Humans** — [log in here](/login) for a session cookie (required for admin operations).\nFirst time? Call `POST /default-api-key/generate` from a trusted subnet to get your agent key.\n\n## Tag groups\n| Tag | Who uses it | Purpose |\n|-----|-------------|----------|\n| **search** | Agents | Full-text search — the main entrypoint |\n| **inspect** | Agents | Inspect capabilities, list APIs and operations |\n| **execute** | Agents | Transparent request broker — runs API operations and Arazzo workflows. Credential injection, policy enforcement, and simulate mode built-in. |\n| **toolkits** | Agents/Humans | Toolkits, access keys, permissions, access requests |\n| **observe** | Agents | Read execution traces |\n| **catalog** | Humans/admin | Register APIs, upload specs, overlays, notes |\n| **credentials** | Humans only | Manage the credentials vault |\n\nAgents with a toolkit key need: **search**, **inspect**, **execute**, **toolkits** (read), **observe**.","version":"0.2.0"},"paths":{"/inspect/{capability_id}":{"get":{"tags":["inspect"],"summary":"Inspect a capability — get full schema, auth, and parameters before calling","description":"Returns everything needed to call an operation or workflow: resolved parameter schema\n(all $refs inlined), response schema, auth translated to concrete header instructions,\nAPI context (name, description, tag descriptions), and HATEOAS _links (execute, upstream).\n\nCapability id format: METHOD/host/path — e.g. GET/api.stripe.com/v1/customers\nor POST/{jentic_hostname}/workflows/summarise-latest-topics.\nPass ?toolkit_id=... to check whether credentials are configured for that toolkit.\nAccept: text/markdown returns a compact LLM-friendly format.\nAccept: application/openapi+yaml returns the raw OpenAPI operation snippet.","operationId":"get_capability_inspect__capability_id__get","parameters":[{"name":"capability_id","in":"path","required":true,"schema":{"type":"string","title":"Capability Id"}},{"name":"toolkit_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass to include credential status for this toolkit","title":"Toolkit Id"},"description":"Pass to include credential status for this toolkit"}],"responses":{"200":{"description":"Full capability detail — format controlled by Accept header.","content":{"application/json":{"schema":{"type":"object","description":"Structured JSON with resolved schemas"}},"text/markdown":{"schema":{"type":"string","description":"LLM-friendly prose description"}},"application/openapi+yaml":{"schema":{"type":"string","description":"Filtered, dereferenced OpenAPI fragment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows":{"get":{"tags":["catalog"],"summary":"List workflows — browse available multi-step Arazzo workflows","description":"Returns all registered workflows with slug, name, description, step count, and involved APIs. Use GET /inspect/{id} or GET /workflows/{slug} for full detail.","operationId":"list_workflows_workflows_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WorkflowOut"},"type":"array","title":"Response List Workflows Workflows Get"}}}}},"security":[]}},"/workflows/{slug}":{"get":{"tags":["catalog"],"summary":"Get workflow definition — Arazzo spec and input schema","description":"Returns the workflow definition with content negotiation:\n- application/json (default): Arazzo document\n- text/markdown: compact LLM-friendly summary with input schema and steps\n- text/html: human-readable summary\n- application/arazzo+json: same as application/json\nExecute via broker: POST /{jentic_host}/workflows/{slug}","operationId":"get_workflow_workflows__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Workflow definition — format controlled by Accept header.","content":{"application/json":{"schema":{"type":"object","description":"Arazzo document as JSON"}},"application/yaml":{"schema":{"type":"string","description":"Arazzo document as YAML"}},"text/markdown":{"schema":{"type":"string","description":"LLM-friendly prose summary"}},"text/html":{"schema":{"type":"string","description":"Human-readable HTML visualiser"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/import":{"post":{"tags":["catalog"],"summary":"Import an API spec or workflow — add to the searchable catalog","description":"Registers an OpenAPI spec or Arazzo workflow into the catalog and BM25 index.\nSource types: url (fetch from URL), upload (multipart file), inline (JSON body).\nFor OpenAPI specs: parses operations, computes capability IDs, indexes descriptions.\nFor Arazzo workflows: stores definition, extracts input schema and involved APIs.\nReturns the registered API or workflow with its canonical id.","operationId":"import_sources_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/catalog":{"get":{"tags":["catalog","catalog"],"summary":"Browse the Jentic public API catalog","description":"Browse and search the public Jentic API catalog (jentic/jentic-public-apis).\n\nReturns individual APIs including expanded sub-APIs for umbrella vendors\n(e.g. googleapis.com/gmail, googleapis.com/calendar, atlassian.com/jira).\nResults show `registered: true/false` to distinguish APIs already in your local\nregistry from those available to use.\n\nTo use a catalog API: call `POST /credentials` with its `api_id` — the spec\nis imported automatically. Manifest is auto-refreshed daily; force a refresh\nvia `POST /catalog/refresh`.","operationId":"list_catalog_catalog_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by API name/domain, e.g. \"stripe\" or \"slack\"","title":"Q"},"description":"Filter by API name/domain, e.g. \"stripe\" or \"slack\""},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Max results","default":50,"title":"Limit"},"description":"Max results"},{"name":"registered_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only show APIs already imported into your registry","default":false,"title":"Registered Only"},"description":"Only show APIs already imported into your registry"},{"name":"unregistered_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only show APIs not yet in your registry","default":false,"title":"Unregistered Only"},"description":"Only show APIs not yet in your registry"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/catalog/refresh":{"post":{"tags":["catalog","catalog"],"summary":"Refresh the catalog manifest from GitHub","description":"Fetches the full recursive git tree from jentic/jentic-public-apis and builds\na detailed manifest that correctly identifies individual APIs within umbrella vendors\n(e.g. googleapis.com expands to googleapis.com/gmail, googleapis.com/calendar, etc.).\n\nTakes ~2-5 seconds (two unauthenticated GitHub API calls). Safe to call repeatedly.\nFalls back to a shallow top-level listing if the tree response is truncated.","operationId":"refresh_catalog_catalog_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/catalog/{api_id}":{"get":{"tags":["catalog","catalog"],"summary":"Inspect a catalog entry","description":"Inspect a single catalog API entry. Shows registration status, GitHub link,\nand available spec files (fetched live from GitHub).\n\nNote: this makes a live GitHub API call to list the directory contents.","operationId":"get_catalog_entry_catalog__api_id__get","parameters":[{"name":"api_id","in":"path","required":true,"schema":{"type":"string","title":"Api Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs":{"get":{"tags":["observe"],"summary":"List async jobs — paginated handles for outstanding and completed async calls","description":"Returns async jobs only — calls that could not complete synchronously. Sync calls produce traces but no jobs. Filter by `status` (pending|running|complete|failed|upstream_async). Poll `GET /jobs/{id}` for individual job status.","operationId":"list_jobs_jobs_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobListPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}":{"get":{"tags":["observe"],"summary":"Poll async job — check status and retrieve result when complete","description":"Poll this endpoint after receiving a 202. The job_id comes from the `Location` response header (RFC 7240) or the `X-Jentic-Job-Id` header. Returns `status: pending|running` while in progress. Returns `status: complete` with `result` when done. Returns `status: upstream_async` when the upstream API itself returned 202 — check `upstream_job_url` to follow the upstream job. Returns `status: failed` with `error` and `http_status` on failure.","operationId":"get_job_route_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["observe"],"summary":"Cancel async job — best-effort cancellation of an outstanding job","description":"Requests cancellation of a pending or running async job. Best-effort: cancellation fires at the next async checkpoint; an in-flight upstream HTTP request will complete before the job stops. The job record is retained (marked failed, error='Cancelled by client'). Has no effect on already-completed jobs.","operationId":"cancel_job_jobs__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/traces":{"get":{"tags":["observe"],"summary":"List execution traces — audit recent broker and workflow calls","description":"Returns recent execution traces with status, capability id, toolkit, timestamp, and HTTP status. Use GET /traces/{trace_id} for step-level detail.","operationId":"list_traces_traces_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TraceListPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/traces/{trace_id}":{"get":{"tags":["observe"],"summary":"Get trace detail — step-by-step execution log","description":"Returns the full execution trace with all steps: capability called, inputs, outputs, HTTP status, and timing. Useful for debugging failed workflow steps.","operationId":"get_trace_traces__trace_id__get","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TraceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apis/{api_id}/scheme":{"post":{"tags":["catalog"],"summary":"Declare auth scheme — teach Jentic how to authenticate with this API","description":"Registers a security scheme for an API that has missing or incorrect auth in its spec.\nGenerates an OpenAPI overlay stored as pending; auto-confirmed when broker gets a 2xx.\nSupports: apiKey (header/query/cookie), bearer token, HTTP basic, OAuth2 client credentials, multiple headers.\nReturns generated_overlay, scheme_names, and next_steps for credential registration.\nUse this when the broker returns 'no security scheme found' for an API.","operationId":"submit_scheme_apis__api_id__scheme_post","parameters":[{"name":"api_id","in":"path","required":true,"schema":{"type":"string","title":"Api Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SchemeInput"},{"type":"array","items":{"$ref":"#/components/schemas/SchemeInput"}}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apis/{api_id}/overlays":{"post":{"tags":["catalog"],"summary":"Submit raw OpenAPI overlay — patch the spec directly","description":"Submit a raw OpenAPI overlay JSON to patch the stored spec for this API. Stored as pending; auto-confirmed on first successful broker call. Prefer POST /apis/{api_id}/scheme for structured auth registration.","operationId":"submit_overlay_apis__api_id__overlays_post","parameters":[{"name":"api_id","in":"path","required":true,"schema":{"type":"string","title":"Api Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverlaySubmit"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["catalog"],"summary":"List overlays for an API","description":"List all overlays for an API.","operationId":"list_overlays_apis__api_id__overlays_get","parameters":[{"name":"api_id","in":"path","required":true,"schema":{"type":"string","title":"Api Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/apis/{api_id}/overlays/{overlay_id}":{"get":{"tags":["catalog"],"summary":"Get Overlay","description":"Get a specific overlay including its full document.","operationId":"get_overlay_apis__api_id__overlays__overlay_id__get","parameters":[{"name":"api_id","in":"path","required":true,"schema":{"type":"string","title":"Api Id"}},{"name":"overlay_id","in":"path","required":true,"schema":{"type":"string","title":"Overlay Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/apis":{"get":{"tags":["catalog"],"summary":"List APIs — browse all available API providers (local and catalog)","description":"Returns paginated list of API providers — both locally registered and from the Jentic public catalog.\n\nEvery entry has:\n- `source: \"local\"` — spec is indexed locally, operations are searchable and executable\n- `source: \"catalog\"` — available from the Jentic public catalog; add credentials to use\n- `has_credentials: bool` — whether credentials have been configured for this API\n\nUse `?source=local` or `?source=catalog` to filter. Default returns all.\nTo use a catalog API: call `POST /credentials` with `api_id` set — the spec is imported automatically.","operationId":"list_apis_apis_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page","default":20,"title":"Limit"},"description":"Results per page"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by source: `local` (locally registered) or `catalog` (public catalog, not yet configured). Default: all.","title":"Source"},"description":"Filter by source: `local` (locally registered) or `catalog` (public catalog, not yet configured). Default: all."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring filter on API id/name","title":"Q"},"description":"Substring filter on API id/name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiListPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/apis/{api_id}/operations":{"get":{"tags":["catalog"],"summary":"List operations for an API — enumerate all available actions","description":"Returns paginated list of operations for the given API. Each item has capability id, summary, and description. Use GET /inspect/{id} for full schema.","operationId":"list_api_operations_apis__api_id__operations_get","parameters":[{"name":"api_id","in":"path","required":true,"schema":{"type":"string","title":"Api Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Results per page","default":50,"title":"Limit"},"description":"Results per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationListPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apis/{api_id}":{"get":{"tags":["catalog"],"summary":"Get API summary — name, version, description, and stats","description":"Returns API metadata: title, version, description, base URL, vendor, and total operation count. Use GET /apis/{api_id}/operations to enumerate operations.","operationId":"get_api_apis__api_id__get","parameters":[{"name":"api_id","in":"path","required":true,"schema":{"type":"string","title":"Api Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/search":{"get":{"tags":["search"],"summary":"Search the catalog — find operations and workflows by natural language intent","description":"BM25 search over all registered API operations, Arazzo workflows, and the Jentic public API catalog.\n\nReturns id, summary, description (≤3 sentences), type, score, and _links.\n- `source: \"local\"` — operation or workflow in your local registry\n- `source: \"catalog\"` — API available from the Jentic public catalog; add credentials to use\n\n_links.inspect → GET /inspect/{id} for full schema and auth detail.\n_links.execute → broker URL to call directly once ready.\nTypical flow: search → inspect → execute.","operationId":"search_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"Search query, e.g. \"send an email\" or \"create payment\"","title":"Q"},"description":"Search query, e.g. \"send an email\" or \"create payment\""},{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of results to return","default":10,"title":"N"},"description":"Number of results to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SearchResult"},"title":"Response Search Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/credentials":{"post":{"tags":["credentials"],"summary":"Store an upstream API credential — add a secret to the vault for broker injection","operationId":"create_credentials_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["credentials"],"summary":"List upstream API credentials — labels and API bindings only, no secret values","description":"List stored upstream API credentials. Values are never returned.\n\nAll authenticated callers (agent keys and human sessions) can see all credential\nlabels and IDs — this is intentional. Labels are not secrets, and agents need\nto discover credential IDs in order to file targeted `grant` access requests\n(e.g. \"bind Work Gmail\" vs \"bind Personal Gmail\").\n\nUse `GET /credentials/{id}` to retrieve a specific credential by ID.\nFilter with `?api_id=api.github.com` to list all credentials for a given API.","operationId":"list_credentials_credentials_get","parameters":[{"name":"api_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CredentialOut"},"title":"Response List Credentials Credentials Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/credentials/{cid}":{"get":{"tags":["credentials"],"summary":"Get an upstream API credential by ID","description":"Retrieve metadata for a single credential. Value is never returned.","operationId":"get_credential_credentials__cid__get","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["credentials"],"summary":"Update an upstream API credential — rotate a secret or fix its API binding","operationId":"patch_credentials__cid__patch","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["credentials"],"summary":"Delete an upstream API credential","operationId":"delete_credentials__cid__delete","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits":{"get":{"tags":["toolkits"],"summary":"List toolkits","description":"List all toolkits.","operationId":"list_toolkits_toolkits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ToolkitOut"},"type":"array","title":"Response List Toolkits Toolkits Get"}}}}}},"post":{"tags":["toolkits"],"summary":"Create a toolkit — scoped bundle of upstream API credentials with a client API key","description":"Creates a toolkit: a named bundle of upstream API credentials with a scoped client API key for the agent.\nReturns a toolkit API key (col_xxx) — shown once, not recoverable.\nBind credentials via POST /toolkits/{id}/credentials.\nSet access policy via PUT /toolkits/{id}/permissions.\nAgents use toolkit keys to call the broker; only bound credentials are injected.","operationId":"create_toolkit_toolkits_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolkitCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolkitOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}":{"get":{"tags":["toolkits"],"summary":"Get toolkit — metadata, bound upstream API credentials, client API keys, and policy summary","description":"Get toolkit with all inline context: metadata, bound upstream API credentials, client API key count, and policy summary.\nThe default toolkit implicitly contains ALL upstream API credentials — no explicit binding needed.","operationId":"get_toolkit_toolkits__toolkit_id__get","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolkitOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["toolkits"],"summary":"Update toolkit — rename or update description","operationId":"patch_toolkit_toolkits__toolkit_id__patch","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolkitPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolkitOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["toolkits"],"summary":"Delete toolkit and revoke all its client API keys","operationId":"delete_toolkit_toolkits__toolkit_id__delete","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}/keys":{"post":{"tags":["toolkits"],"summary":"Issue a new client API key for this toolkit","description":"Issues an additional client API key (tk_xxx) for this toolkit. Hand this key to the agent. Optionally restrict by IP (CIDR list). Returned once — not recoverable.","operationId":"create_toolkit_key_toolkits__toolkit_id__keys_post","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolkitKeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["toolkits"],"summary":"List client API keys for this toolkit — metadata only, no secret values","description":"List all access keys for this toolkit.\n\nActive and revoked keys are shown (revoked keys have `revoked_at` set).\nThe `api_key` value is never returned — only the key ID and metadata.","operationId":"list_toolkit_keys_toolkits__toolkit_id__keys_get","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ToolkitKeyOut"},"title":"Response List Toolkit Keys Toolkits Toolkit Id Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}/keys/{key_id}":{"patch":{"tags":["toolkits"],"summary":"Update a client API key — rename or change IP restrictions","description":"Update label or IP restrictions on a client API key. Cannot change the key value itself.","operationId":"patch_toolkit_key_toolkits__toolkit_id__keys__key_id__patch","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolkitKeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["toolkits"],"summary":"Revoke a client API key","description":"Revoke a single access key.\n\nOther keys for this toolkit remain active. The revoked key immediately\nstops working — any agent using it will receive 401 on their next request.","operationId":"revoke_toolkit_key_toolkits__toolkit_id__keys__key_id__delete","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}/credentials":{"post":{"tags":["toolkits"],"summary":"Bind an upstream API credential to this toolkit — enable broker injection","description":"Enrolls an existing upstream API credential in this toolkit. The broker automatically injects it into outbound calls for the API it's bound to, when the agent calls using this toolkit's client API key.","operationId":"add_credential_to_toolkit_toolkits__toolkit_id__credentials_post","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolkitCredentialAdd"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialBindingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["toolkits"],"summary":"List upstream API credentials bound to this toolkit","description":"List upstream API credentials bound to this toolkit. Admin key only.","operationId":"list_toolkit_credentials_toolkits__toolkit_id__credentials_get","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CredentialBindingOut"},"title":"Response List Toolkit Credentials Toolkits Toolkit Id Credentials Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}/credentials/{credential_id}":{"delete":{"tags":["toolkits"],"summary":"Unbind an upstream API credential from this toolkit","operationId":"remove_credential_from_toolkit_toolkits__toolkit_id__credentials__credential_id__delete","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}/credentials/{cred_id}/permissions":{"get":{"tags":["toolkits","toolkits"],"summary":"Get the permission rules for a specific credential in this toolkit","description":"Returns all rules in evaluation order for this credential: agent-defined rules first,\nthen the immutable system safety rules appended by the server. First match wins.\n\nSince rules are scoped to a single credential (which is bound to a specific API),\npath and operation patterns apply only to calls made using this credential.\nSystem rules are tagged `_system: true` — they cannot be removed.","operationId":"get_credential_permissions_toolkits__toolkit_id__credentials__cred_id__permissions_get","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"cred_id","in":"path","required":true,"schema":{"type":"string","title":"Cred Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PermissionRule"},"title":"Response Get Credential Permissions Toolkits Toolkit Id Credentials Cred Id Permissions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["toolkits","toolkits"],"summary":"Replace permission rules for a specific credential","description":"Replaces the entire agent rule list for this credential.\nSystem safety rules are always appended server-side and cannot be removed.\nUse `PATCH` to add or remove individual rules without replacing the full list.","operationId":"set_credential_permissions_toolkits__toolkit_id__credentials__cred_id__permissions_put","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"cred_id","in":"path","required":true,"schema":{"type":"string","title":"Cred Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PermissionRule"},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PermissionRule"},"title":"Response Set Credential Permissions Toolkits Toolkit Id Credentials Cred Id Permissions Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["toolkits","toolkits"],"summary":"Add or remove individual permission rules for a specific credential","description":"Incrementally update rules for this credential without replacing the full list.\n\n- `add`: rules appended (deduplicated)\n- `remove`: rules removed by exact match\n\nExample — unlock TTS writes for this credential:\n```json\n{\"add\": [{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}]}\n```","operationId":"patch_credential_permissions_toolkits__toolkit_id__credentials__cred_id__permissions_patch","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"cred_id","in":"path","required":true,"schema":{"type":"string","title":"Cred Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionsPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PermissionRule"},"title":"Response Patch Credential Permissions Toolkits Toolkit Id Credentials Cred Id Permissions Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}/access-requests":{"post":{"tags":["toolkits","toolkits"],"summary":"Request access — ask a human to grant a credential or adjust permissions","description":"Agent submits an access request. A human approves or denies it at the `approve_url`.\n\n**Workflow:**\n1. `GET /credentials?api_id=` — find the `credential_id` you need\n2. `POST` this endpoint with `type`, `credential_id`, `rules`, and optional `reason`\n3. Return the `approve_url` to your user and poll `status` until `approved` or `denied`\n\nThe toolkit ID in the URL must match the caller's own toolkit.\nAdmin/human sessions may file requests on behalf of any toolkit.","operationId":"create_access_request_toolkits__toolkit_id__access_requests_post","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequestBody"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["toolkits","toolkits"],"summary":"List access requests for this toolkit","description":"List access requests for a toolkit, newest first.\n\nEach item includes the full `payload` (credential ID, rules, etc.) and current `status`.\nFilter by `status=pending` to find outstanding requests awaiting approval.\n\n**`type` values:**\n- `grant` — agent is requesting a new credential be bound; `payload` contains `credential_id` and optional `rules`\n- `modify_permissions` — agent is requesting a rule change on an existing credential; `payload` contains `credential_id` and `rules`\n\nAgent keys see only their own toolkit's requests. Admin/human sessions may view any toolkit.","operationId":"list_access_requests_toolkits__toolkit_id__access_requests_get","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccessRequestOut"},"title":"Response List Access Requests Toolkits Toolkit Id Access Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}/access-requests/{req_id}":{"get":{"tags":["toolkits","toolkits"],"summary":"Poll an access request — check approval status","description":"Poll the status of a specific access request.\n\nPoll this endpoint after directing the user to `approve_url`. Status transitions:\n`pending` → `approved` | `denied`\n\nOn approval, the `payload` contains the exact data that was applied (credential bound,\nrules set, etc.). For programmatic polling, check `status` field only — `approved`\nmeans the side effects have already been applied and the toolkit is ready to use.","operationId":"get_access_request_toolkits__toolkit_id__access_requests__req_id__get","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"req_id","in":"path","required":true,"schema":{"type":"string","title":"Req Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}/access-requests/{req_id}/approve":{"post":{"tags":["toolkits","toolkits"],"summary":"Approve an access request (human session only)","description":"Approve a pending access request (human or admin action — agent keys cannot do this).\n\nFor `grant` requests: the upstream API credential is automatically bound to the toolkit.\nFor `modify_permissions` requests: the new permission rules are applied immediately.","operationId":"approve_access_request_toolkits__toolkit_id__access_requests__req_id__approve_post","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"req_id","in":"path","required":true,"schema":{"type":"string","title":"Req Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/toolkits/{toolkit_id}/access-requests/{req_id}/deny":{"post":{"tags":["toolkits","toolkits"],"summary":"Deny an access request (human session only)","description":"Deny a pending access request.","operationId":"deny_access_request_toolkits__toolkit_id__access_requests__req_id__deny_post","parameters":[{"name":"toolkit_id","in":"path","required":true,"schema":{"type":"string","title":"Toolkit Id"}},{"name":"req_id","in":"path","required":true,"schema":{"type":"string","title":"Req Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notes":{"post":{"tags":["catalog"],"summary":"Add a note — annotate a capability with feedback or a correction","description":"Attaches a note to any capability (operation, workflow, or API). Use to report auth corrections, schema errors, or updated Arazzo workflows. Notes feed back into the catalog improvement loop.","operationId":"create_note_notes_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["catalog"],"summary":"List notes for a resource","operationId":"list_notes_notes_get","parameters":[{"name":"resource","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notes/{note_id}":{"delete":{"tags":["catalog"],"summary":"Delete a note","operationId":"delete_note_notes__note_id__delete","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/create":{"post":{"tags":["user"],"summary":"Create the root admin account (one-time setup)","description":"Create the single root account for this instance.\n\nThis endpoint is available **once only**. After the first call it returns\n`410 Gone`. There is no multi-user system — one human owns this instance.\n\nRequires `bcrypt` installed (bundled in Docker image).","operationId":"create_user_user_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/user/login":{"post":{"tags":["user"],"summary":"Log in and receive a session cookie","description":"Authenticate with username and password.\n\nAccepts JSON body (`{\"username\": ..., \"password\": ...}`) or HTML form data.\nReturns an httpOnly JWT session cookie valid for 30 days (sliding window).\n\nPass `?redirect_to=/docs` to redirect after a successful browser form login.","operationId":"login_user_login_post","parameters":[{"name":"redirect_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"type":"string","example":"admin"},"password":{"type":"string","format":"password"}}}}}},"security":[]}},"/user/token":{"post":{"tags":["user"],"summary":"OAuth2 password grant — returns Bearer JWT","description":"OAuth2 password grant endpoint.\n\nSwagger UI's **Authorize** dialog uses this automatically when you fill in\nthe *HumanLogin* username + password fields. Returns a Bearer JWT that\nSwagger UI injects as `Authorization: Bearer ...` on all subsequent calls.\n\nThis is functionally equivalent to `POST /user/login` but returns the token\nin the response body rather than as a cookie — the standard OAuth2 pattern\nexpected by Swagger UI.","operationId":"token_user_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_user_token_post"}}},"required":true},"responses":{"200":{"description":"Access token for use in Authorization: Bearer header","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/user/logout":{"post":{"tags":["user"],"summary":"Log out — clear the session cookie","description":"Terminate the current human session.\n\nClears the `jentic_session` httpOnly cookie if present. If you authenticated\nvia Bearer token (Swagger UI OAuth2 flow), discard the token on your end —\nthere is no server-side token store to invalidate.","operationId":"logout_user_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/user/me":{"get":{"tags":["user"],"summary":"Check current session status","description":"Returns current session info. Useful for UI to check if logged in.","operationId":"me_user_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}}}}},"/default-api-key/generate":{"post":{"tags":["user"],"summary":"Generate (or regenerate) the default agent API key","description":"Issue the default `tk_xxx` agent key bound to the default toolkit.\n\n**First call** — unauthenticated, subnet-restricted:\n- Available only before the key has been claimed\n- Only accessible from trusted subnets (RFC 1918 + loopback by default;\n configure via `JENTIC_TRUSTED_SUBNETS` env var)\n- Returns the key **once only** — it is not recoverable after this response\n- After this call, the endpoint requires a human session\n\n**Subsequent calls** — human session required:\n- Revokes the current default key\n- Issues and returns a fresh key\n\nThe key works immediately — you do not need to wait for the admin account\nto be created before using it.","operationId":"generate_default_key_default_api_key_generate_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/health":{"get":{"tags":["meta"],"summary":"Health","description":"Returns current setup state with explicit instructions for agents.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/{target}":{"get":{"tags":["execute","execute"],"summary":"Broker — proxy a call to any registered API with automatic credential injection","description":"Routes any HTTP request to the upstream API, injecting credentials automatically.\n\nURL shape: `/{upstream_host}/{path}` — e.g. `/api.stripe.com/v1/customers`\n\nAll HTTP methods supported; Swagger UI shows GET as representative.\n\n**Headers:**\n- `X-Jentic-Simulate: true` — validate and preview the call without sending it\n- `X-Jentic-Credential: {alias}` — select a specific credential when multiple exist for an API\n- `X-Jentic-Dry-Run: true` — alias for Simulate (deprecated)\n\nReturns upstream response verbatim plus `X-Jentic-Execution-Id` for trace correlation.","operationId":"broker_get","parameters":[{"name":"target","in":"path","required":true,"schema":{"type":"string","title":"Target"}}],"responses":{"200":{"description":"Upstream response proxied verbatim. Content-Type matches upstream.","content":{"application/json":{"schema":{}},"text/html":{},"text/plain":{}}},"202":{"description":"Async job created (RFC 7240). Poll via Location header or GET /jobs/{job_id}"},"400":{"description":"Bad request (upstream or Jentic validation)"},"401":{"description":"Missing or rejected credential"},"403":{"description":"Policy denied or upstream forbidden"},"404":{"description":"Upstream resource not found"},"502":{"description":"Upstream unreachable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccessRequestBody":{"properties":{"type":{"type":"string","enum":["grant","modify_permissions"],"title":"Type","description":"`grant` — bind an upstream API credential to this toolkit. Requires `credential_id`; `rules` is optional (defaults to system safety rules only). `modify_permissions` — update permission rules on a credential already bound to this toolkit. Requires both `credential_id` and `rules`."},"credential_id":{"type":"string","title":"Credential Id","description":"The upstream API credential to act on. Discover available IDs and labels via `GET /credentials` or `GET /credentials?api_id=`."},"rules":{"items":{"$ref":"#/components/schemas/PermissionRule"},"type":"array","title":"Rules","description":"Ordered list of permission rules. For `grant`, applied atomically when approved. For `modify_permissions`, replaces the current agent rules entirely. System safety rules (deny writes, deny sensitive paths) are always appended after these and cannot be removed.\n\nEach `PermissionRule` object — all fields except `effect` are optional and AND-combined:\n- `effect` *(required)*: `\"allow\"` or `\"deny\"`\n- `methods`: list of HTTP verbs to match, e.g. `[\"GET\", \"POST\"]` — omit to match all\n- `path`: Python regex, `re.search()` substring match, case-insensitive. `|` is OR. E.g. `\"text-to-speech\"` matches any path containing that string; `\"admin|billing\"` blocks both.\n- `operations`: list of regexes matched against the operation ID\n\n**Examples:**\n```json\n[{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}]\n[{\"effect\": \"deny\", \"path\": \"admin|billing|pay\"}]\n[{\"effect\": \"allow\", \"operations\": [\"^get_voices$\", \"^tts\"]}]\n```","default":[]},"api_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Id","description":"Optional. Shown in the human approval UI. Usually inferred automatically from the credential."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Explain to the human why access is needed. Shown in the approval UI."}},"type":"object","required":["type","credential_id"],"title":"AccessRequestBody","description":"Body for POST /toolkits/{id}/access-requests.\n\n**`type=grant`** — bind an upstream API credential to this toolkit:\n```json\n{\n \"type\": \"grant\",\n \"credential_id\": \"api.elevenlabs.io\",\n \"rules\": [{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}],\n \"reason\": \"I need to generate audio\"\n}\n```\n\n**`type=modify_permissions`** — update rules on a credential already bound to this toolkit:\n```json\n{\n \"type\": \"modify_permissions\",\n \"credential_id\": \"api.elevenlabs.io\",\n \"rules\": [{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}],\n \"reason\": \"I need write access to TTS only\"\n}\n```","examples":[{"credential_id":"api.elevenlabs.io","reason":"I need to generate audio narration","rules":[{"effect":"allow","methods":["POST"],"path":"text-to-speech"}],"type":"grant"},{"credential_id":"api.elevenlabs.io","reason":"Requesting read access plus TTS writes","rules":[{"effect":"allow","methods":["GET"]},{"effect":"allow","methods":["POST"],"path":"text-to-speech"}],"type":"modify_permissions"}]},"AccessRequestOut":{"properties":{"id":{"type":"string","title":"Id","description":"Unique request ID (areq_xxxxxxxx)"},"toolkit_id":{"type":"string","title":"Toolkit Id","description":"The toolkit this request belongs to"},"type":{"type":"string","enum":["grant","modify_permissions"],"title":"Type","description":"`grant` — bind a new upstream API credential to this toolkit (and optionally set permission rules). `modify_permissions` — update the permission rules on a credential already bound to this toolkit."},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Request-type-specific data. For `grant`: `{credential_id, rules?, api_id?}`. For `modify_permissions`: `{credential_id, rules}`."},"status":{"type":"string","enum":["pending","approved","denied"],"title":"Status","description":"Current approval state. Poll until `approved` or `denied`."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Human-readable explanation from the agent"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Auto-generated summary of what the agent is requesting"},"approve_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approve Url","description":"URL for the human to review and approve/deny"},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when filed"},"resolved_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resolved At","description":"Unix timestamp when approved or denied"},"applied_effects":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Applied Effects","description":"Side-effects applied on approval (credential bound, rules set, etc.)"}},"additionalProperties":true,"type":"object","required":["id","toolkit_id","type","status"],"title":"AccessRequestOut","description":"An access request filed by an agent and awaiting human approval.\n\nThe `payload` shape depends on `type`:\n\n**`grant`** — bind a new upstream credential to this toolkit (optionally with rules):\n```json\n{ \"type\": \"grant\", \"payload\": { \"credential_id\": \"api.github.com\", \"rules\": [...] }, \"reason\": \"...\" }\n```\n\n**`modify_permissions`** — update permission rules on an already-bound credential:\n```json\n{ \"type\": \"modify_permissions\", \"payload\": { \"credential_id\": \"api.github.com\", \"rules\": [...] }, \"reason\": \"...\" }\n```"},"ApiListPage":{"properties":{"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"total":{"type":"integer","title":"Total"},"total_pages":{"type":"integer","title":"Total Pages"},"has_more":{"type":"boolean","title":"Has More"},"data":{"items":{"$ref":"#/components/schemas/ApiOut"},"type":"array","title":"Data"}},"additionalProperties":true,"type":"object","required":["page","limit","total","total_pages","has_more","data"],"title":"ApiListPage"},"ApiOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"vendor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"spec_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spec Path"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At"}},"additionalProperties":true,"type":"object","required":["id"],"title":"ApiOut"},"Body_token_user_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type","default":"password"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"scope":{"type":"string","title":"Scope","default":""}},"type":"object","required":["username","password"],"title":"Body_token_user_token_post"},"CredentialBindingOut":{"properties":{"credential_id":{"type":"string","title":"Credential Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"api_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Id"},"scheme_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheme Name"}},"additionalProperties":true,"type":"object","required":["credential_id"],"title":"CredentialBindingOut"},"CredentialCreate":{"properties":{"label":{"type":"string","title":"Label"},"env_var":{"type":"string","title":"Env Var"},"value":{"type":"string","title":"Value"},"api_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Id"},"scheme_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheme Name"}},"type":"object","required":["label","env_var","value"],"title":"CredentialCreate"},"CredentialOut":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"api_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Id"},"scheme_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheme Name"},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":true,"type":"object","required":["id","label"],"title":"CredentialOut"},"CredentialPatch":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"api_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Id"},"scheme_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheme Name"}},"type":"object","title":"CredentialPatch"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportOut":{"properties":{"status":{"type":"string","title":"Status"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"operations_indexed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Operations Indexed"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},"additionalProperties":true,"type":"object","required":["status"],"title":"ImportOut"},"ImportRequest":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/ImportSource"},"type":"array","title":"Sources"}},"type":"object","required":["sources"],"title":"ImportRequest"},"ImportSource":{"properties":{"type":{"type":"string","title":"Type"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"type":"object","required":["type"],"title":"ImportSource"},"JobListPage":{"properties":{"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"total":{"type":"integer","title":"Total"},"total_pages":{"type":"integer","title":"Total Pages"},"has_more":{"type":"boolean","title":"Has More"},"data":{"items":{"$ref":"#/components/schemas/JobOut"},"type":"array","title":"Data"}},"additionalProperties":true,"type":"object","required":["page","limit","total","total_pages","has_more","data"],"title":"JobListPage"},"JobOut":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"slug_or_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug Or Id"},"toolkit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Toolkit Id"},"status":{"type":"string","title":"Status"},"result":{"title":"Result"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status"},"upstream_async":{"type":"boolean","title":"Upstream Async","default":false},"upstream_job_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upstream Job Url"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At"},"completed_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Completed At"}},"additionalProperties":true,"type":"object","required":["id","status"],"title":"JobOut"},"KeyCreate":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Human-readable label, e.g. 'Agent A', 'Staging bot'"},"allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Ips","description":"IP allowlist for this key only. NULL = unrestricted."}},"type":"object","title":"KeyCreate"},"NoteCreate":{"properties":{"resource":{"type":"string","title":"Resource"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"note":{"type":"string","title":"Note"},"execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Id"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","required":["resource","note"],"title":"NoteCreate","description":"Create a note on any Jentic resource.\n\nresource: the resource identifier (operation_id, api_id, workflow slug)\ntype: categorize the note for filtering and analysis\nnote: the content — be specific and actionable\nexecution_id: link to a specific execution (optional)\nconfidence: how certain are you?\nsource: where did you observe this?"},"OperationListPage":{"properties":{"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"total":{"type":"integer","title":"Total"},"total_pages":{"type":"integer","title":"Total Pages"},"has_more":{"type":"boolean","title":"Has More"},"data":{"items":{"$ref":"#/components/schemas/OperationOut"},"type":"array","title":"Data"}},"additionalProperties":true,"type":"object","required":["page","limit","total","total_pages","has_more","data"],"title":"OperationListPage"},"OperationOut":{"properties":{"id":{"type":"string","title":"Id"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"additionalProperties":true,"type":"object","required":["id"],"title":"OperationOut","description":"A single API operation. id encodes method/host/path (capability ID format)."},"OverlaySubmit":{"properties":{"overlay":{"additionalProperties":true,"type":"object","title":"Overlay"},"contributed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contributed By"}},"type":"object","required":["overlay"],"title":"OverlaySubmit"},"PermissionRule":{"properties":{"effect":{"type":"string","enum":["allow","deny"],"title":"Effect","description":"`\"allow\"` or `\"deny\"`"},"methods":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Methods","description":"HTTP methods to match, e.g. `[\"GET\", \"POST\"]`. Omit to match all methods."},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path","description":"Python regex matched with `re.search()` (substring, case-insensitive) against the upstream path. `|` is OR. Use `^`/`$` to anchor. Example: `\"text-to-speech\"` matches any path containing that string."},"operations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Operations","description":"List of regexes matched against the operation ID. E.g. `[\"tts\", \"speech\"]`."}},"additionalProperties":true,"type":"object","required":["effect"],"title":"PermissionRule","description":"A single access control rule. All fields are optional; conditions are AND-combined.\nFirst matching rule wins. Agent rules are evaluated before system safety rules.\n\n**`effect`** — `\"allow\"` or `\"deny\"` (required)\n\n**`methods`** — list of HTTP methods to match, e.g. `[\"GET\", \"POST\"]`.\nOmit to match all methods.\n\n**`path`** — Python regex matched with `re.search()` against the upstream request path.\nThis is a **substring match** — `\"admin|pay\"` matches any path *containing* those words.\nCase-insensitive. Use `^`/`$` to anchor. `|` is regex OR.\n\nExamples:\n- `\"admin|billing|pay\"` — matches `/v1/admin/users`, `/billing/invoice`, `/pay`\n- `\"^/v1/voices$\"` — matches only exactly `/v1/voices`\n- `\"text-to-speech\"` — matches any path containing that substring\n\n**`operations`** — list of regexes matched against the operation ID via `re.search()`.\nE.g. `[\"tts\", \"speech\"]` matches any operation whose ID contains \"tts\" or \"speech\".\n\nSystem safety rules (always active, cannot be removed) are marked `_system: true` in\n`GET .../permissions` responses. They deny sensitive paths and write methods by default.\n\n**Examples:**\n```json\n{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}\n{\"effect\": \"deny\", \"path\": \"admin|billing|pay\"}\n{\"effect\": \"allow\", \"operations\": [\"^github_get_repo$\"]}\n```","examples":[{"effect":"allow","methods":["POST"],"path":"text-to-speech"},{"effect":"deny","path":"admin|billing|pay"},{"effect":"allow","operations":["^github_get_repo$"]}]},"PermissionsPatch":{"properties":{"add":{"items":{"$ref":"#/components/schemas/PermissionRule"},"type":"array","title":"Add","description":"Rules to append (deduplicated by exact match)"},"remove":{"items":{"$ref":"#/components/schemas/PermissionRule"},"type":"array","title":"Remove","description":"Rules to remove by exact match"}},"type":"object","title":"PermissionsPatch","description":"Body for PATCH .../permissions — incremental rule updates."},"SchemeInput":{"properties":{"type":{"type":"string","enum":["apiKey","bearer","basic","oauth2_client_credentials","openIdConnect"],"title":"Type"},"in":{"anyOf":[{"type":"string","enum":["header","query","cookie"]},{"type":"null"}],"title":"In"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"token_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Url"},"openid_connect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openid Connect Url"},"scheme_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheme Name"},"contributed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contributed By"}},"type":"object","required":["type"],"title":"SchemeInput","description":"Structured description of an API's authentication scheme.\n\nJentic generates the OpenAPI overlay from this; no need to write overlay YAML.\nMultiple entries can be submitted in one call for APIs requiring more than\none header (e.g. Discourse needs Api-Key + Api-Username)."},"SearchResult":{"properties":{"type":{"type":"string","title":"Type"},"id":{"type":"string","title":"Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"score":{"type":"number","title":"Score"},"involved_apis":{"items":{"type":"string"},"type":"array","title":"Involved Apis"}},"additionalProperties":true,"type":"object","required":["type","id","score"],"title":"SearchResult"},"ToolkitCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"simulate":{"type":"boolean","title":"Simulate","default":false},"initial_key_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initial Key Label","description":"Label for the first key created with this toolkit (e.g. 'Agent A')"},"initial_key_allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Initial Key Allowed Ips","description":"IP allowlist for the first key. NULL = unrestricted."}},"type":"object","required":["name"],"title":"ToolkitCreate"},"ToolkitCredentialAdd":{"properties":{"credential_id":{"type":"string","title":"Credential Id"}},"type":"object","required":["credential_id"],"title":"ToolkitCredentialAdd"},"ToolkitKeyCreated":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefix"},"allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Ips"},"revoked":{"type":"boolean","title":"Revoked","default":false},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At"},"key":{"type":"string","title":"Key"}},"additionalProperties":true,"type":"object","required":["id","key"],"title":"ToolkitKeyCreated","description":"Returned only at key creation — includes the full key value (never returned again)."},"ToolkitKeyOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefix"},"allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Ips"},"revoked":{"type":"boolean","title":"Revoked","default":false},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At"}},"additionalProperties":true,"type":"object","required":["id"],"title":"ToolkitKeyOut"},"ToolkitOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At"},"keys":{"items":{"$ref":"#/components/schemas/ToolkitKeyOut"},"type":"array","title":"Keys"},"credentials":{"items":{"$ref":"#/components/schemas/CredentialBindingOut"},"type":"array","title":"Credentials"},"permissions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Permissions"}},"additionalProperties":true,"type":"object","required":["id","name"],"title":"ToolkitOut"},"ToolkitPatch":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"simulate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Simulate"}},"type":"object","title":"ToolkitPatch"},"TraceListPage":{"properties":{"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"traces":{"items":{"$ref":"#/components/schemas/TraceOut"},"type":"array","title":"Traces"}},"type":"object","required":["total","limit","offset","traces"],"title":"TraceListPage"},"TraceOut":{"properties":{"id":{"type":"string","title":"Id"},"toolkit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Toolkit Id"},"operation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation Id"},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id"},"spec_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spec Path"},"status":{"type":"string","title":"Status"},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At"},"completed_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Completed At"},"steps":{"items":{"$ref":"#/components/schemas/TraceStepOut"},"type":"array","title":"Steps"}},"additionalProperties":true,"type":"object","required":["id","status"],"title":"TraceOut"},"TraceStepOut":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Id"},"operation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status"},"output":{"title":"Output"},"detail":{"title":"Detail"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"started_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Completed At"}},"additionalProperties":true,"type":"object","title":"TraceStepOut"},"UserCreate":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"UserCreate"},"UserOut":{"properties":{"logged_in":{"type":"boolean","title":"Logged In","default":false},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"is_admin":{"type":"boolean","title":"Is Admin","default":false},"toolkit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Toolkit Id"},"trusted_subnet":{"type":"boolean","title":"Trusted Subnet","default":false}},"additionalProperties":true,"type":"object","title":"UserOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowOut":{"properties":{"id":{"type":"string","title":"Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"slug":{"type":"string","title":"Slug"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"steps_count":{"type":"integer","title":"Steps Count","default":0},"involved_apis":{"items":{"type":"string"},"type":"array","title":"Involved Apis"},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At"}},"additionalProperties":true,"type":"object","required":["id","slug"],"title":"WorkflowOut"}},"securitySchemes":{"JenticApiKey":{"type":"apiKey","in":"header","name":"X-Jentic-API-Key","description":"Agent toolkit key (`tk_xxx`). Issue via `POST /default-api-key/generate`."},"HumanLogin":{"type":"oauth2","description":"Human admin session. Fill in username + password to get a Bearer JWT.","flows":{"password":{"tokenUrl":"/user/token","scopes":{}}}}}},"tags":[{"name":"search","description":"**Start here.** Full-text and semantic search across all registered APIs and operations."},{"name":"inspect","description":"Inspect capability details, list APIs and operations."},{"name":"execute","description":"Transparent request broker — runs API operations and Arazzo workflows. Prefix any registered host to route through the broker: `POST /api.stripe.com/v1/payment_intents`. Credential injection, policy enforcement, and simulate mode built-in."},{"name":"observe","description":"Read async job handles and execution traces."},{"name":"toolkits","description":"Manage toolkits: scoped credential bundles with access keys, permissions, and access requests."},{"name":"credentials","description":"Manage upstream API credentials in the vault (humans/admin only). Values are write-only — never returned after creation."},{"name":"user","description":"Human account management: create account, login, logout, and agent key generation."},{"name":"catalog","description":"Register APIs, upload specs, manage overlays and notes."}],"security":[{"JenticApiKey":[]},{"HumanLogin":[]}]} \ No newline at end of file +{ + "openapi": "3.1.0", + "info": { + "title": "Jentic Mini", + "description": "**Jentic Mini** is the open-source, self-hosted implementation of the Jentic API — fully API-compatible with the [Jentic hosted and VPC editions](https://jentic.com).\n\n## What is Jentic Mini?\nJentic Mini gives any agent a local execution layer: search a catalog of registered APIs, broker authenticated requests without exposing credentials to the agent, enforce access policies, and observe every execution. It is designed to be dropped in as a self-hosted alternative to the Jentic cloud service.\n\n## Hosted vs Self-hosted\nThe **Jentic hosted and VPC editions** offer deeper implementations across three areas:\n\n| Capability | Jentic Mini (this) | Jentic hosted / VPC |\n|------------|-------------------|---------------------|\n| **Search** | BM25 full-text search | Advanced semantic search (~64% accuracy improvement over BM25) |\n| **Request brokering** | In-process credential injection | Scalable AWS Lambda-based broker with encryption at rest and in-transit, SOC 2-grade security, and 3rd-party credential vault integrations (HashiCorp Vault, AWS Secrets Manager, etc.) |\n| **Simulation** | Basic simulate mode | Full sandbox for simulating API calls and toolkit behaviour (enterprise-only) |\n| **Catalog** | Local registry only | Central catalog — aggregates the collective know-how of agents across API definitions and Arazzo workflows |\n\n## Authentication\n**Agents** — provide `X-Jentic-API-Key: tk_xxx` header.\n**Humans** — [log in here](/login) for a session cookie (required for admin operations).\nFirst time? Call `POST /default-api-key/generate` from a trusted subnet to get your agent key.\n\n## Tag groups\n| Tag | Who uses it | Purpose |\n|-----|-------------|----------|\n| **search** | Agents | Full-text search — the main entrypoint |\n| **inspect** | Agents | Inspect capabilities, list APIs and operations |\n| **execute** | Agents | Transparent request broker — runs API operations and Arazzo workflows. Credential injection, policy enforcement, and simulate mode built-in. |\n| **toolkits** | Agents/Humans | Toolkits, access keys, permissions, access requests |\n| **observe** | Agents | Read execution traces |\n| **catalog** | Humans/admin | Register APIs, upload specs, overlays, notes |\n| **credentials** | Humans only | Manage the credentials vault |\n\nAgents with a toolkit key need: **search**, **inspect**, **execute**, **toolkits** (read), **observe**.", + "version": "0.2.0" + }, + "paths": { + "/inspect/{capability_id}": { + "get": { + "tags": ["inspect"], + "summary": "Inspect a capability — get full schema, auth, and parameters before calling", + "description": "Returns everything needed to call an operation or workflow: resolved parameter schema\n(all $refs inlined), response schema, auth translated to concrete header instructions,\nAPI context (name, description, tag descriptions), and HATEOAS _links (execute, upstream).\n\nCapability id format: METHOD/host/path — e.g. GET/api.stripe.com/v1/customers\nor POST/{jentic_hostname}/workflows/summarise-latest-topics.\nPass ?toolkit_id=... to check whether credentials are configured for that toolkit.\nAccept: text/markdown returns a compact LLM-friendly format.\nAccept: application/openapi+yaml returns the raw OpenAPI operation snippet.", + "operationId": "get_capability_inspect__capability_id__get", + "parameters": [ + { + "name": "capability_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Capability Id" } + }, + { + "name": "toolkit_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "Pass to include credential status for this toolkit", + "title": "Toolkit Id" + }, + "description": "Pass to include credential status for this toolkit" + } + ], + "responses": { + "200": { + "description": "Full capability detail — format controlled by Accept header.", + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "Structured JSON with resolved schemas" + } + }, + "text/markdown": { + "schema": { + "type": "string", + "description": "LLM-friendly prose description" + } + }, + "application/openapi+yaml": { + "schema": { + "type": "string", + "description": "Filtered, dereferenced OpenAPI fragment" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/workflows": { + "get": { + "tags": ["catalog"], + "summary": "List workflows — browse available multi-step Arazzo workflows", + "description": "Returns all registered workflows with slug, name, description, step count, and involved APIs. Use GET /inspect/{id} or GET /workflows/{slug} for full detail.", + "operationId": "list_workflows_workflows_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { "$ref": "#/components/schemas/WorkflowOut" }, + "type": "array", + "title": "Response List Workflows Workflows Get" + } + } + } + } + }, + "security": [] + } + }, + "/workflows/{slug}": { + "get": { + "tags": ["catalog"], + "summary": "Get workflow definition — Arazzo spec and input schema", + "description": "Returns the workflow definition with content negotiation:\n- application/json (default): Arazzo document\n- text/markdown: compact LLM-friendly summary with input schema and steps\n- text/html: human-readable summary\n- application/arazzo+json: same as application/json\nExecute via broker: POST /{jentic_host}/workflows/{slug}", + "operationId": "get_workflow_workflows__slug__get", + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Slug" } + } + ], + "responses": { + "200": { + "description": "Workflow definition — format controlled by Accept header.", + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "Arazzo document as JSON" + } + }, + "application/yaml": { + "schema": { + "type": "string", + "description": "Arazzo document as YAML" + } + }, + "text/markdown": { + "schema": { + "type": "string", + "description": "LLM-friendly prose summary" + } + }, + "text/html": { + "schema": { + "type": "string", + "description": "Human-readable HTML visualiser" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [] + } + }, + "/import": { + "post": { + "tags": ["catalog"], + "summary": "Import an API spec or workflow — add to the searchable catalog", + "description": "Registers an OpenAPI spec or Arazzo workflow into the catalog and BM25 index.\nSource types: url (fetch from URL), upload (multipart file), inline (JSON body).\nFor OpenAPI specs: parses operations, computes capability IDs, indexes descriptions.\nFor Arazzo workflows: stores definition, extracts input schema and involved APIs.\nReturns the registered API or workflow with its canonical id.", + "operationId": "import_sources_import_post", + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ImportRequest" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ImportOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/catalog": { + "get": { + "tags": ["catalog", "catalog"], + "summary": "Browse the Jentic public API catalog", + "description": "Browse and search the public Jentic API catalog (jentic/jentic-public-apis).\n\nReturns individual APIs including expanded sub-APIs for umbrella vendors\n(e.g. googleapis.com/gmail, googleapis.com/calendar, atlassian.com/jira).\nResults show `registered: true/false` to distinguish APIs already in your local\nregistry from those available to use.\n\nTo use a catalog API: call `POST /credentials` with its `api_id` — the spec\nis imported automatically. Manifest is auto-refreshed daily; force a refresh\nvia `POST /catalog/refresh`.", + "operationId": "list_catalog_catalog_get", + "parameters": [ + { + "name": "q", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "Filter by API name/domain, e.g. \"stripe\" or \"slack\"", + "title": "Q" + }, + "description": "Filter by API name/domain, e.g. \"stripe\" or \"slack\"" + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 500, + "minimum": 1, + "description": "Max results", + "default": 50, + "title": "Limit" + }, + "description": "Max results" + }, + { + "name": "registered_only", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Only show APIs already imported into your registry", + "default": false, + "title": "Registered Only" + }, + "description": "Only show APIs already imported into your registry" + }, + { + "name": "unregistered_only", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Only show APIs not yet in your registry", + "default": false, + "title": "Unregistered Only" + }, + "description": "Only show APIs not yet in your registry" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/catalog/refresh": { + "post": { + "tags": ["catalog", "catalog"], + "summary": "Refresh the catalog manifest from GitHub", + "description": "Fetches the full recursive git tree from jentic/jentic-public-apis and builds\na detailed manifest that correctly identifies individual APIs within umbrella vendors\n(e.g. googleapis.com expands to googleapis.com/gmail, googleapis.com/calendar, etc.).\n\nTakes ~2-5 seconds (two unauthenticated GitHub API calls). Safe to call repeatedly.\nFalls back to a shallow top-level listing if the tree response is truncated.", + "operationId": "refresh_catalog_catalog_refresh_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + } + } + } + }, + "/catalog/{api_id}": { + "get": { + "tags": ["catalog", "catalog"], + "summary": "Inspect a catalog entry", + "description": "Inspect a single catalog API entry. Shows registration status, GitHub link,\nand available spec files (fetched live from GitHub).\n\nNote: this makes a live GitHub API call to list the directory contents.", + "operationId": "get_catalog_entry_catalog__api_id__get", + "parameters": [ + { + "name": "api_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Api Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/jobs": { + "get": { + "tags": ["observe"], + "summary": "List async jobs — paginated handles for outstanding and completed async calls", + "description": "Returns async jobs only — calls that could not complete synchronously. Sync calls produce traces but no jobs. Filter by `status` (pending|running|complete|failed|upstream_async). Poll `GET /jobs/{id}` for individual job status.", + "operationId": "list_jobs_jobs_get", + "parameters": [ + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "Filter by status", + "title": "Status" + }, + "description": "Filter by status" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { "type": "integer", "minimum": 1, "default": 1, "title": "Page" } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 20, + "title": "Limit" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/JobListPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/jobs/{job_id}": { + "get": { + "tags": ["observe"], + "summary": "Poll async job — check status and retrieve result when complete", + "description": "Poll this endpoint after receiving a 202. The job_id comes from the `Location` response header (RFC 7240) or the `X-Jentic-Job-Id` header. Returns `status: pending|running` while in progress. Returns `status: complete` with `result` when done. Returns `status: upstream_async` when the upstream API itself returned 202 — check `upstream_job_url` to follow the upstream job. Returns `status: failed` with `error` and `http_status` on failure.", + "operationId": "get_job_route_jobs__job_id__get", + "parameters": [ + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Job Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/JobOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["observe"], + "summary": "Cancel async job — best-effort cancellation of an outstanding job", + "description": "Requests cancellation of a pending or running async job. Best-effort: cancellation fires at the next async checkpoint; an in-flight upstream HTTP request will complete before the job stops. The job record is retained (marked failed, error='Cancelled by client'). Has no effect on already-completed jobs.", + "operationId": "cancel_job_jobs__job_id__delete", + "parameters": [ + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Job Id" } + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/traces": { + "get": { + "tags": ["observe"], + "summary": "List execution traces — audit recent broker and workflow calls", + "description": "Returns recent execution traces with status, capability id, toolkit, timestamp, and HTTP status. Use GET /traces/{trace_id} for step-level detail.", + "operationId": "list_traces_traces_get", + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 200, + "minimum": 1, + "default": 20, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/TraceListPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/traces/{trace_id}": { + "get": { + "tags": ["observe"], + "summary": "Get trace detail — step-by-step execution log", + "description": "Returns the full execution trace with all steps: capability called, inputs, outputs, HTTP status, and timing. Useful for debugging failed workflow steps.", + "operationId": "get_trace_traces__trace_id__get", + "parameters": [ + { + "name": "trace_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Trace Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/TraceOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/apis/{api_id}/scheme": { + "post": { + "tags": ["catalog"], + "summary": "Declare auth scheme — teach Jentic how to authenticate with this API", + "description": "Registers a security scheme for an API that has missing or incorrect auth in its spec.\nGenerates an OpenAPI overlay stored as pending; auto-confirmed when broker gets a 2xx.\nSupports: apiKey (header/query/cookie), bearer token, HTTP basic, OAuth2 client credentials, multiple headers.\nReturns generated_overlay, scheme_names, and next_steps for credential registration.\nUse this when the broker returns 'no security scheme found' for an API.", + "operationId": "submit_scheme_apis__api_id__scheme_post", + "parameters": [ + { + "name": "api_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Api Id" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "anyOf": [ + { "$ref": "#/components/schemas/SchemeInput" }, + { + "type": "array", + "items": { "$ref": "#/components/schemas/SchemeInput" } + } + ], + "title": "Body" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/apis/{api_id}/overlays": { + "post": { + "tags": ["catalog"], + "summary": "Submit raw OpenAPI overlay — patch the spec directly", + "description": "Submit a raw OpenAPI overlay JSON to patch the stored spec for this API. Stored as pending; auto-confirmed on first successful broker call. Prefer POST /apis/{api_id}/scheme for structured auth registration.", + "operationId": "submit_overlay_apis__api_id__overlays_post", + "parameters": [ + { + "name": "api_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Api Id" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/OverlaySubmit" } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["catalog"], + "summary": "List overlays for an API", + "description": "List all overlays for an API.", + "operationId": "list_overlays_apis__api_id__overlays_get", + "parameters": [ + { + "name": "api_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Api Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [] + } + }, + "/apis/{api_id}/overlays/{overlay_id}": { + "get": { + "tags": ["catalog"], + "summary": "Get Overlay", + "description": "Get a specific overlay including its full document.", + "operationId": "get_overlay_apis__api_id__overlays__overlay_id__get", + "parameters": [ + { + "name": "api_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Api Id" } + }, + { + "name": "overlay_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Overlay Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [] + } + }, + "/apis": { + "get": { + "tags": ["catalog"], + "summary": "List APIs — browse all available API providers (local and catalog)", + "description": "Returns paginated list of API providers — both locally registered and from the Jentic public catalog.\n\nEvery entry has:\n- `source: \"local\"` — spec is indexed locally, operations are searchable and executable\n- `source: \"catalog\"` — available from the Jentic public catalog; add credentials to use\n- `has_credentials: bool` — whether credentials have been configured for this API\n\nUse `?source=local` or `?source=catalog` to filter. Default returns all.\nTo use a catalog API: call `POST /credentials` with `api_id` set — the spec is imported automatically.", + "operationId": "list_apis_apis_get", + "parameters": [ + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number (1-indexed)", + "default": 1, + "title": "Page" + }, + "description": "Page number (1-indexed)" + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Results per page", + "default": 20, + "title": "Limit" + }, + "description": "Results per page" + }, + { + "name": "source", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "Filter by source: `local` (locally registered) or `catalog` (public catalog, not yet configured). Default: all.", + "title": "Source" + }, + "description": "Filter by source: `local` (locally registered) or `catalog` (public catalog, not yet configured). Default: all." + }, + { + "name": "q", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "description": "Substring filter on API id/name", + "title": "Q" + }, + "description": "Substring filter on API id/name" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiListPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [] + } + }, + "/apis/{api_id}/operations": { + "get": { + "tags": ["catalog"], + "summary": "List operations for an API — enumerate all available actions", + "description": "Returns paginated list of operations for the given API. Each item has capability id, summary, and description. Use GET /inspect/{id} for full schema.", + "operationId": "list_api_operations_apis__api_id__operations_get", + "parameters": [ + { + "name": "api_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Api Id" } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "description": "Page number (1-indexed)", + "default": 1, + "title": "Page" + }, + "description": "Page number (1-indexed)" + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 200, + "minimum": 1, + "description": "Results per page", + "default": 50, + "title": "Limit" + }, + "description": "Results per page" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/OperationListPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/apis/{api_id}": { + "get": { + "tags": ["catalog"], + "summary": "Get API summary — name, version, description, and stats", + "description": "Returns API metadata: title, version, description, base URL, vendor, and total operation count. Use GET /apis/{api_id}/operations to enumerate operations.", + "operationId": "get_api_apis__api_id__get", + "parameters": [ + { + "name": "api_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Api Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [] + } + }, + "/search": { + "get": { + "tags": ["search"], + "summary": "Search the catalog — find operations and workflows by natural language intent", + "description": "BM25 search over all registered API operations, Arazzo workflows, and the Jentic public API catalog.\n\nReturns id, summary, description (≤3 sentences), type, score, and _links.\n- `source: \"local\"` — operation or workflow in your local registry\n- `source: \"catalog\"` — API available from the Jentic public catalog; add credentials to use\n\n_links.inspect → GET /inspect/{id} for full schema and auth detail.\n_links.execute → broker URL to call directly once ready.\nTypical flow: search → inspect → execute.", + "operationId": "search_search_get", + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Search query, e.g. \"send an email\" or \"create payment\"", + "title": "Q" + }, + "description": "Search query, e.g. \"send an email\" or \"create payment\"" + }, + { + "name": "n", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "description": "Number of results to return", + "default": 10, + "title": "N" + }, + "description": "Number of results to return" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/SearchResult" }, + "title": "Response Search Search Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [] + } + }, + "/credentials": { + "post": { + "tags": ["credentials"], + "summary": "Store an upstream API credential — add a secret to the vault for broker injection", + "operationId": "create_credentials_post", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/CredentialCreate" } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/CredentialOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["credentials"], + "summary": "List upstream API credentials — labels and API bindings only, no secret values", + "description": "List stored upstream API credentials. Values are never returned.\n\nAll authenticated callers (agent keys and human sessions) can see all credential\nlabels and IDs — this is intentional. Labels are not secrets, and agents need\nto discover credential IDs in order to file targeted `grant` access requests\n(e.g. \"bind Work Gmail\" vs \"bind Personal Gmail\").\n\nUse `GET /credentials/{id}` to retrieve a specific credential by ID.\nFilter with `?api_id=api.github.com` to list all credentials for a given API.", + "operationId": "list_credentials_credentials_get", + "parameters": [ + { + "name": "api_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/CredentialOut" }, + "title": "Response List Credentials Credentials Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/credentials/{cid}": { + "get": { + "tags": ["credentials"], + "summary": "Get an upstream API credential by ID", + "description": "Retrieve metadata for a single credential. Value is never returned.", + "operationId": "get_credential_credentials__cid__get", + "parameters": [ + { + "name": "cid", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Cid" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/CredentialOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "patch": { + "tags": ["credentials"], + "summary": "Update an upstream API credential — rotate a secret or fix its API binding", + "operationId": "patch_credentials__cid__patch", + "parameters": [ + { + "name": "cid", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Cid" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/CredentialPatch" } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/CredentialOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["credentials"], + "summary": "Delete an upstream API credential", + "operationId": "delete_credentials__cid__delete", + "parameters": [ + { + "name": "cid", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Cid" } + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits": { + "get": { + "tags": ["toolkits"], + "summary": "List toolkits", + "description": "List all toolkits.", + "operationId": "list_toolkits_toolkits_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { "$ref": "#/components/schemas/ToolkitOut" }, + "type": "array", + "title": "Response List Toolkits Toolkits Get" + } + } + } + } + } + }, + "post": { + "tags": ["toolkits"], + "summary": "Create a toolkit — scoped bundle of upstream API credentials with a client API key", + "description": "Creates a toolkit: a named bundle of upstream API credentials with a scoped client API key for the agent.\nReturns a toolkit API key (col_xxx) — shown once, not recoverable.\nBind credentials via POST /toolkits/{id}/credentials.\nSet access policy via PUT /toolkits/{id}/permissions.\nAgents use toolkit keys to call the broker; only bound credentials are injected.", + "operationId": "create_toolkit_toolkits_post", + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ToolkitCreate" } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ToolkitOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}": { + "get": { + "tags": ["toolkits"], + "summary": "Get toolkit — metadata, bound upstream API credentials, client API keys, and policy summary", + "description": "Get toolkit with all inline context: metadata, bound upstream API credentials, client API key count, and policy summary.\nThe default toolkit implicitly contains ALL upstream API credentials — no explicit binding needed.", + "operationId": "get_toolkit_toolkits__toolkit_id__get", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ToolkitOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "patch": { + "tags": ["toolkits"], + "summary": "Update toolkit — rename or update description", + "operationId": "patch_toolkit_toolkits__toolkit_id__patch", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ToolkitPatch" } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ToolkitOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["toolkits"], + "summary": "Delete toolkit and revoke all its client API keys", + "operationId": "delete_toolkit_toolkits__toolkit_id__delete", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}/keys": { + "post": { + "tags": ["toolkits"], + "summary": "Issue a new client API key for this toolkit", + "description": "Issues an additional client API key (tk_xxx) for this toolkit. Hand this key to the agent. Optionally restrict by IP (CIDR list). Returned once — not recoverable.", + "operationId": "create_toolkit_key_toolkits__toolkit_id__keys_post", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/KeyCreate" } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ToolkitKeyCreated" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["toolkits"], + "summary": "List client API keys for this toolkit — metadata only, no secret values", + "description": "List all access keys for this toolkit.\n\nActive and revoked keys are shown (revoked keys have `revoked_at` set).\nThe `api_key` value is never returned — only the key ID and metadata.", + "operationId": "list_toolkit_keys_toolkits__toolkit_id__keys_get", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/ToolkitKeyOut" }, + "title": "Response List Toolkit Keys Toolkits Toolkit Id Keys Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}/keys/{key_id}": { + "patch": { + "tags": ["toolkits"], + "summary": "Update a client API key — rename or change IP restrictions", + "description": "Update label or IP restrictions on a client API key. Cannot change the key value itself.", + "operationId": "patch_toolkit_key_toolkits__toolkit_id__keys__key_id__patch", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "key_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Key Id" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/KeyCreate" } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ToolkitKeyOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "delete": { + "tags": ["toolkits"], + "summary": "Revoke a client API key", + "description": "Revoke a single access key.\n\nOther keys for this toolkit remain active. The revoked key immediately\nstops working — any agent using it will receive 401 on their next request.", + "operationId": "revoke_toolkit_key_toolkits__toolkit_id__keys__key_id__delete", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "key_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Key Id" } + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}/credentials": { + "post": { + "tags": ["toolkits"], + "summary": "Bind an upstream API credential to this toolkit — enable broker injection", + "description": "Enrolls an existing upstream API credential in this toolkit. The broker automatically injects it into outbound calls for the API it's bound to, when the agent calls using this toolkit's client API key.", + "operationId": "add_credential_to_toolkit_toolkits__toolkit_id__credentials_post", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ToolkitCredentialAdd" } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/CredentialBindingOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["toolkits"], + "summary": "List upstream API credentials bound to this toolkit", + "description": "List upstream API credentials bound to this toolkit. Admin key only.", + "operationId": "list_toolkit_credentials_toolkits__toolkit_id__credentials_get", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialBindingOut" + }, + "title": "Response List Toolkit Credentials Toolkits Toolkit Id Credentials Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}/credentials/{credential_id}": { + "delete": { + "tags": ["toolkits"], + "summary": "Unbind an upstream API credential from this toolkit", + "operationId": "remove_credential_from_toolkit_toolkits__toolkit_id__credentials__credential_id__delete", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "credential_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Credential Id" } + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}/credentials/{cred_id}/permissions": { + "get": { + "tags": ["toolkits", "toolkits"], + "summary": "Get the permission rules for a specific credential in this toolkit", + "description": "Returns all rules in evaluation order for this credential: agent-defined rules first,\nthen the immutable system safety rules appended by the server. First match wins.\n\nSince rules are scoped to a single credential (which is bound to a specific API),\npath and operation patterns apply only to calls made using this credential.\nSystem rules are tagged `_system: true` — they cannot be removed.", + "operationId": "get_credential_permissions_toolkits__toolkit_id__credentials__cred_id__permissions_get", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "cred_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Cred Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/PermissionRule" }, + "title": "Response Get Credential Permissions Toolkits Toolkit Id Credentials Cred Id Permissions Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "put": { + "tags": ["toolkits", "toolkits"], + "summary": "Replace permission rules for a specific credential", + "description": "Replaces the entire agent rule list for this credential.\nSystem safety rules are always appended server-side and cannot be removed.\nUse `PATCH` to add or remove individual rules without replacing the full list.", + "operationId": "set_credential_permissions_toolkits__toolkit_id__credentials__cred_id__permissions_put", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "cred_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Cred Id" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/PermissionRule" }, + "title": "Body" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/PermissionRule" }, + "title": "Response Set Credential Permissions Toolkits Toolkit Id Credentials Cred Id Permissions Put" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "patch": { + "tags": ["toolkits", "toolkits"], + "summary": "Add or remove individual permission rules for a specific credential", + "description": "Incrementally update rules for this credential without replacing the full list.\n\n- `add`: rules appended (deduplicated)\n- `remove`: rules removed by exact match\n\nExample — unlock TTS writes for this credential:\n```json\n{\"add\": [{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}]}\n```", + "operationId": "patch_credential_permissions_toolkits__toolkit_id__credentials__cred_id__permissions_patch", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "cred_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Cred Id" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PermissionsPatch" } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/PermissionRule" }, + "title": "Response Patch Credential Permissions Toolkits Toolkit Id Credentials Cred Id Permissions Patch" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}/access-requests": { + "post": { + "tags": ["toolkits", "toolkits"], + "summary": "Request access — ask a human to grant a credential or adjust permissions", + "description": "Agent submits an access request. A human approves or denies it at the `approve_url`.\n\n**Workflow:**\n1. `GET /credentials?api_id=` — find the `credential_id` you need\n2. `POST` this endpoint with `type`, `credential_id`, `rules`, and optional `reason`\n3. Return the `approve_url` to your user and poll `status` until `approved` or `denied`\n\nThe toolkit ID in the URL must match the caller's own toolkit.\nAdmin/human sessions may file requests on behalf of any toolkit.", + "operationId": "create_access_request_toolkits__toolkit_id__access_requests_post", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AccessRequestBody" } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AccessRequestOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["toolkits", "toolkits"], + "summary": "List access requests for this toolkit", + "description": "List access requests for a toolkit, newest first.\n\nEach item includes the full `payload` (credential ID, rules, etc.) and current `status`.\nFilter by `status=pending` to find outstanding requests awaiting approval.\n\n**`type` values:**\n- `grant` — agent is requesting a new credential be bound; `payload` contains `credential_id` and optional `rules`\n- `modify_permissions` — agent is requesting a rule change on an existing credential; `payload` contains `credential_id` and `rules`\n\nAgent keys see only their own toolkit's requests. Admin/human sessions may view any toolkit.", + "operationId": "list_access_requests_toolkits__toolkit_id__access_requests_get", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Status" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/AccessRequestOut" }, + "title": "Response List Access Requests Toolkits Toolkit Id Access Requests Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}/access-requests/{req_id}": { + "get": { + "tags": ["toolkits", "toolkits"], + "summary": "Poll an access request — check approval status", + "description": "Poll the status of a specific access request.\n\nPoll this endpoint after directing the user to `approve_url`. Status transitions:\n`pending` → `approved` | `denied`\n\nOn approval, the `payload` contains the exact data that was applied (credential bound,\nrules set, etc.). For programmatic polling, check `status` field only — `approved`\nmeans the side effects have already been applied and the toolkit is ready to use.", + "operationId": "get_access_request_toolkits__toolkit_id__access_requests__req_id__get", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "req_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Req Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AccessRequestOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}/access-requests/{req_id}/approve": { + "post": { + "tags": ["toolkits", "toolkits"], + "summary": "Approve an access request (human session only)", + "description": "Approve a pending access request (human or admin action — agent keys cannot do this).\n\nFor `grant` requests: the upstream API credential is automatically bound to the toolkit.\nFor `modify_permissions` requests: the new permission rules are applied immediately.", + "operationId": "approve_access_request_toolkits__toolkit_id__access_requests__req_id__approve_post", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "req_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Req Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AccessRequestOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/toolkits/{toolkit_id}/access-requests/{req_id}/deny": { + "post": { + "tags": ["toolkits", "toolkits"], + "summary": "Deny an access request (human session only)", + "description": "Deny a pending access request.", + "operationId": "deny_access_request_toolkits__toolkit_id__access_requests__req_id__deny_post", + "parameters": [ + { + "name": "toolkit_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Toolkit Id" } + }, + { + "name": "req_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Req Id" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AccessRequestOut" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/notes": { + "post": { + "tags": ["catalog"], + "summary": "Add a note — annotate a capability with feedback or a correction", + "description": "Attaches a note to any capability (operation, workflow, or API). Use to report auth corrections, schema errors, or updated Arazzo workflows. Notes feed back into the catalog improvement loop.", + "operationId": "create_note_notes_post", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/NoteCreate" } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, + "get": { + "tags": ["catalog"], + "summary": "List notes for a resource", + "operationId": "list_notes_notes_get", + "parameters": [ + { + "name": "resource", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Resource" + } + }, + { + "name": "type", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Type" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 50, "title": "Limit" } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/notes/{note_id}": { + "delete": { + "tags": ["catalog"], + "summary": "Delete a note", + "operationId": "delete_note_notes__note_id__delete", + "parameters": [ + { + "name": "note_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Note Id" } + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + }, + "/user/create": { + "post": { + "tags": ["user"], + "summary": "Create the root admin account (one-time setup)", + "description": "Create the single root account for this instance.\n\nThis endpoint is available **once only**. After the first call it returns\n`410 Gone`. There is no multi-user system — one human owns this instance.\n\nRequires `bcrypt` installed (bundled in Docker image).", + "operationId": "create_user_user_create_post", + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UserCreate" } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [] + } + }, + "/user/login": { + "post": { + "tags": ["user"], + "summary": "Log in and receive a session cookie", + "description": "Authenticate with username and password.\n\nAccepts JSON body (`{\"username\": ..., \"password\": ...}`) or HTML form data.\nReturns an httpOnly JWT session cookie valid for 30 days (sliding window).\n\nPass `?redirect_to=/docs` to redirect after a successful browser form login.", + "operationId": "login_user_login_post", + "parameters": [ + { + "name": "redirect_to", + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Redirect To" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["username", "password"], + "properties": { + "username": { "type": "string", "example": "admin" }, + "password": { "type": "string", "format": "password" } + } + } + } + } + }, + "security": [] + } + }, + "/user/token": { + "post": { + "tags": ["user"], + "summary": "OAuth2 password grant — returns Bearer JWT", + "description": "OAuth2 password grant endpoint.\n\nSwagger UI's **Authorize** dialog uses this automatically when you fill in\nthe *HumanLogin* username + password fields. Returns a Bearer JWT that\nSwagger UI injects as `Authorization: Bearer ...` on all subsequent calls.\n\nThis is functionally equivalent to `POST /user/login` but returns the token\nin the response body rather than as a cookie — the standard OAuth2 pattern\nexpected by Swagger UI.", + "operationId": "token_user_token_post", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { "$ref": "#/components/schemas/Body_token_user_token_post" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Access token for use in Authorization: Bearer header", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [] + } + }, + "/user/logout": { + "post": { + "tags": ["user"], + "summary": "Log out — clear the session cookie", + "description": "Terminate the current human session.\n\nClears the `jentic_session` httpOnly cookie if present. If you authenticated\nvia Bearer token (Swagger UI OAuth2 flow), discard the token on your end —\nthere is no server-side token store to invalidate.", + "operationId": "logout_user_logout_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + } + } + } + }, + "/user/me": { + "get": { + "tags": ["user"], + "summary": "Check current session status", + "description": "Returns current session info. Useful for UI to check if logged in.", + "operationId": "me_user_me_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UserOut" } + } + } + } + } + } + }, + "/default-api-key/generate": { + "post": { + "tags": ["user"], + "summary": "Generate (or regenerate) the default agent API key", + "description": "Issue the default `tk_xxx` agent key bound to the default toolkit.\n\n**First call** — unauthenticated, subnet-restricted:\n- Available only before the key has been claimed\n- Only accessible from trusted subnets (RFC 1918 + loopback by default;\n configure via `JENTIC_TRUSTED_SUBNETS` env var)\n- Returns the key **once only** — it is not recoverable after this response\n- After this call, the endpoint requires a human session\n\n**Subsequent calls** — human session required:\n- Revokes the current default key\n- Issues and returns a fresh key\n\nThe key works immediately — you do not need to wait for the admin account\nto be created before using it.", + "operationId": "generate_default_key_default_api_key_generate_post", + "responses": { + "201": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + } + }, + "security": [] + } + }, + "/health": { + "get": { + "tags": ["meta"], + "summary": "Health", + "description": "Returns current setup state with explicit instructions for agents.", + "operationId": "health_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + } + }, + "security": [] + } + }, + "/{target}": { + "get": { + "tags": ["execute", "execute"], + "summary": "Broker — proxy a call to any registered API with automatic credential injection", + "description": "Routes any HTTP request to the upstream API, injecting credentials automatically.\n\nURL shape: `/{upstream_host}/{path}` — e.g. `/api.stripe.com/v1/customers`\n\nAll HTTP methods supported; Swagger UI shows GET as representative.\n\n**Headers:**\n- `X-Jentic-Simulate: true` — validate and preview the call without sending it\n- `X-Jentic-Credential: {alias}` — select a specific credential when multiple exist for an API\n- `X-Jentic-Dry-Run: true` — alias for Simulate (deprecated)\n\nReturns upstream response verbatim plus `X-Jentic-Execution-Id` for trace correlation.", + "operationId": "broker_get", + "parameters": [ + { + "name": "target", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Target" } + } + ], + "responses": { + "200": { + "description": "Upstream response proxied verbatim. Content-Type matches upstream.", + "content": { + "application/json": { "schema": {} }, + "text/html": {}, + "text/plain": {} + } + }, + "202": { + "description": "Async job created (RFC 7240). Poll via Location header or GET /jobs/{job_id}" + }, + "400": { "description": "Bad request (upstream or Jentic validation)" }, + "401": { "description": "Missing or rejected credential" }, + "403": { "description": "Policy denied or upstream forbidden" }, + "404": { "description": "Upstream resource not found" }, + "502": { "description": "Upstream unreachable" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AccessRequestBody": { + "properties": { + "type": { + "type": "string", + "enum": ["grant", "modify_permissions"], + "title": "Type", + "description": "`grant` — bind an upstream API credential to this toolkit. Requires `credential_id`; `rules` is optional (defaults to system safety rules only). `modify_permissions` — update permission rules on a credential already bound to this toolkit. Requires both `credential_id` and `rules`." + }, + "credential_id": { + "type": "string", + "title": "Credential Id", + "description": "The upstream API credential to act on. Discover available IDs and labels via `GET /credentials` or `GET /credentials?api_id=`." + }, + "rules": { + "items": { "$ref": "#/components/schemas/PermissionRule" }, + "type": "array", + "title": "Rules", + "description": "Ordered list of permission rules. For `grant`, applied atomically when approved. For `modify_permissions`, replaces the current agent rules entirely. System safety rules (deny writes, deny sensitive paths) are always appended after these and cannot be removed.\n\nEach `PermissionRule` object — all fields except `effect` are optional and AND-combined:\n- `effect` *(required)*: `\"allow\"` or `\"deny\"`\n- `methods`: list of HTTP verbs to match, e.g. `[\"GET\", \"POST\"]` — omit to match all\n- `path`: Python regex, `re.search()` substring match, case-insensitive. `|` is OR. E.g. `\"text-to-speech\"` matches any path containing that string; `\"admin|billing\"` blocks both.\n- `operations`: list of regexes matched against the operation ID\n\n**Examples:**\n```json\n[{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}]\n[{\"effect\": \"deny\", \"path\": \"admin|billing|pay\"}]\n[{\"effect\": \"allow\", \"operations\": [\"^get_voices$\", \"^tts\"]}]\n```", + "default": [] + }, + "api_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Id", + "description": "Optional. Shown in the human approval UI. Usually inferred automatically from the credential." + }, + "reason": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Reason", + "description": "Explain to the human why access is needed. Shown in the approval UI." + } + }, + "type": "object", + "required": ["type", "credential_id"], + "title": "AccessRequestBody", + "description": "Body for POST /toolkits/{id}/access-requests.\n\n**`type=grant`** — bind an upstream API credential to this toolkit:\n```json\n{\n \"type\": \"grant\",\n \"credential_id\": \"api.elevenlabs.io\",\n \"rules\": [{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}],\n \"reason\": \"I need to generate audio\"\n}\n```\n\n**`type=modify_permissions`** — update rules on a credential already bound to this toolkit:\n```json\n{\n \"type\": \"modify_permissions\",\n \"credential_id\": \"api.elevenlabs.io\",\n \"rules\": [{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}],\n \"reason\": \"I need write access to TTS only\"\n}\n```", + "examples": [ + { + "credential_id": "api.elevenlabs.io", + "reason": "I need to generate audio narration", + "rules": [ + { "effect": "allow", "methods": ["POST"], "path": "text-to-speech" } + ], + "type": "grant" + }, + { + "credential_id": "api.elevenlabs.io", + "reason": "Requesting read access plus TTS writes", + "rules": [ + { "effect": "allow", "methods": ["GET"] }, + { "effect": "allow", "methods": ["POST"], "path": "text-to-speech" } + ], + "type": "modify_permissions" + } + ] + }, + "AccessRequestOut": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique request ID (areq_xxxxxxxx)" + }, + "toolkit_id": { + "type": "string", + "title": "Toolkit Id", + "description": "The toolkit this request belongs to" + }, + "type": { + "type": "string", + "enum": ["grant", "modify_permissions"], + "title": "Type", + "description": "`grant` — bind a new upstream API credential to this toolkit (and optionally set permission rules). `modify_permissions` — update the permission rules on a credential already bound to this toolkit." + }, + "payload": { + "additionalProperties": true, + "type": "object", + "title": "Payload", + "description": "Request-type-specific data. For `grant`: `{credential_id, rules?, api_id?}`. For `modify_permissions`: `{credential_id, rules}`." + }, + "status": { + "type": "string", + "enum": ["pending", "approved", "denied"], + "title": "Status", + "description": "Current approval state. Poll until `approved` or `denied`." + }, + "reason": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Reason", + "description": "Human-readable explanation from the agent" + }, + "description": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Description", + "description": "Auto-generated summary of what the agent is requesting" + }, + "approve_url": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Approve Url", + "description": "URL for the human to review and approve/deny" + }, + "created_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Created At", + "description": "Unix timestamp when filed" + }, + "resolved_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Resolved At", + "description": "Unix timestamp when approved or denied" + }, + "applied_effects": { + "anyOf": [ + { "items": { "type": "string" }, "type": "array" }, + { "type": "null" } + ], + "title": "Applied Effects", + "description": "Side-effects applied on approval (credential bound, rules set, etc.)" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["id", "toolkit_id", "type", "status"], + "title": "AccessRequestOut", + "description": "An access request filed by an agent and awaiting human approval.\n\nThe `payload` shape depends on `type`:\n\n**`grant`** — bind a new upstream credential to this toolkit (optionally with rules):\n```json\n{ \"type\": \"grant\", \"payload\": { \"credential_id\": \"api.github.com\", \"rules\": [...] }, \"reason\": \"...\" }\n```\n\n**`modify_permissions`** — update permission rules on an already-bound credential:\n```json\n{ \"type\": \"modify_permissions\", \"payload\": { \"credential_id\": \"api.github.com\", \"rules\": [...] }, \"reason\": \"...\" }\n```" + }, + "ApiListPage": { + "properties": { + "page": { "type": "integer", "title": "Page" }, + "limit": { "type": "integer", "title": "Limit" }, + "total": { "type": "integer", "title": "Total" }, + "total_pages": { "type": "integer", "title": "Total Pages" }, + "has_more": { "type": "boolean", "title": "Has More" }, + "data": { + "items": { "$ref": "#/components/schemas/ApiOut" }, + "type": "array", + "title": "Data" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["page", "limit", "total", "total_pages", "has_more", "data"], + "title": "ApiListPage" + }, + "ApiOut": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, + "vendor": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Vendor" + }, + "description": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Description" + }, + "spec_path": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Spec Path" + }, + "base_url": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Base Url" + }, + "created_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Created At" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["id"], + "title": "ApiOut" + }, + "Body_token_user_token_post": { + "properties": { + "grant_type": { + "type": "string", + "title": "Grant Type", + "default": "password" + }, + "username": { "type": "string", "title": "Username" }, + "password": { "type": "string", "title": "Password" }, + "scope": { "type": "string", "title": "Scope", "default": "" } + }, + "type": "object", + "required": ["username", "password"], + "title": "Body_token_user_token_post" + }, + "CredentialBindingOut": { + "properties": { + "credential_id": { "type": "string", "title": "Credential Id" }, + "label": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Label" + }, + "api_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Id" + }, + "scheme_name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Scheme Name" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["credential_id"], + "title": "CredentialBindingOut" + }, + "CredentialCreate": { + "properties": { + "label": { "type": "string", "title": "Label" }, + "env_var": { "type": "string", "title": "Env Var" }, + "value": { "type": "string", "title": "Value" }, + "api_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Id" + }, + "scheme_name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Scheme Name" + } + }, + "type": "object", + "required": ["label", "env_var", "value"], + "title": "CredentialCreate" + }, + "CredentialOut": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "label": { "type": "string", "title": "Label" }, + "api_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Id" + }, + "scheme_name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Scheme Name" + }, + "created_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Created At" + }, + "updated_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Updated At" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["id", "label"], + "title": "CredentialOut" + }, + "CredentialPatch": { + "properties": { + "label": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Label" + }, + "value": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Value" + }, + "api_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Id" + }, + "scheme_name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Scheme Name" + } + }, + "type": "object", + "title": "CredentialPatch" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { "$ref": "#/components/schemas/ValidationError" }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "ImportOut": { + "properties": { + "status": { "type": "string", "title": "Status" }, + "id": { "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Id" }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, + "operations_indexed": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Operations Indexed" + }, + "type": { "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Type" } + }, + "additionalProperties": true, + "type": "object", + "required": ["status"], + "title": "ImportOut" + }, + "ImportRequest": { + "properties": { + "sources": { + "items": { "$ref": "#/components/schemas/ImportSource" }, + "type": "array", + "title": "Sources" + } + }, + "type": "object", + "required": ["sources"], + "title": "ImportRequest" + }, + "ImportSource": { + "properties": { + "type": { "type": "string", "title": "Type" }, + "path": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Path" + }, + "url": { "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Url" }, + "filename": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Filename" + }, + "content": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Content" + } + }, + "type": "object", + "required": ["type"], + "title": "ImportSource" + }, + "JobListPage": { + "properties": { + "page": { "type": "integer", "title": "Page" }, + "limit": { "type": "integer", "title": "Limit" }, + "total": { "type": "integer", "title": "Total" }, + "total_pages": { "type": "integer", "title": "Total Pages" }, + "has_more": { "type": "boolean", "title": "Has More" }, + "data": { + "items": { "$ref": "#/components/schemas/JobOut" }, + "type": "array", + "title": "Data" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["page", "limit", "total", "total_pages", "has_more", "data"], + "title": "JobListPage" + }, + "JobOut": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "kind": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Kind" + }, + "slug_or_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Slug Or Id" + }, + "toolkit_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Toolkit Id" + }, + "status": { "type": "string", "title": "Status" }, + "result": { "title": "Result" }, + "error": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Error" + }, + "http_status": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Http Status" + }, + "upstream_async": { + "type": "boolean", + "title": "Upstream Async", + "default": false + }, + "upstream_job_url": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Upstream Job Url" + }, + "trace_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Trace Id" + }, + "created_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Created At" + }, + "completed_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Completed At" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["id", "status"], + "title": "JobOut" + }, + "KeyCreate": { + "properties": { + "label": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Label", + "description": "Human-readable label, e.g. 'Agent A', 'Staging bot'" + }, + "allowed_ips": { + "anyOf": [ + { "items": { "type": "string" }, "type": "array" }, + { "type": "null" } + ], + "title": "Allowed Ips", + "description": "IP allowlist for this key only. NULL = unrestricted." + } + }, + "type": "object", + "title": "KeyCreate" + }, + "NoteCreate": { + "properties": { + "resource": { "type": "string", "title": "Resource" }, + "type": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Type" + }, + "note": { "type": "string", "title": "Note" }, + "execution_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Execution Id" + }, + "confidence": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Confidence" + }, + "source": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Source" + } + }, + "type": "object", + "required": ["resource", "note"], + "title": "NoteCreate", + "description": "Create a note on any Jentic resource.\n\nresource: the resource identifier (operation_id, api_id, workflow slug)\ntype: categorize the note for filtering and analysis\nnote: the content — be specific and actionable\nexecution_id: link to a specific execution (optional)\nconfidence: how certain are you?\nsource: where did you observe this?" + }, + "OperationListPage": { + "properties": { + "page": { "type": "integer", "title": "Page" }, + "limit": { "type": "integer", "title": "Limit" }, + "total": { "type": "integer", "title": "Total" }, + "total_pages": { "type": "integer", "title": "Total Pages" }, + "has_more": { "type": "boolean", "title": "Has More" }, + "data": { + "items": { "$ref": "#/components/schemas/OperationOut" }, + "type": "array", + "title": "Data" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["page", "limit", "total", "total_pages", "has_more", "data"], + "title": "OperationListPage" + }, + "OperationOut": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "summary": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Summary" + }, + "description": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Description" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["id"], + "title": "OperationOut", + "description": "A single API operation. id encodes method/host/path (capability ID format)." + }, + "OverlaySubmit": { + "properties": { + "overlay": { + "additionalProperties": true, + "type": "object", + "title": "Overlay" + }, + "contributed_by": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Contributed By" + } + }, + "type": "object", + "required": ["overlay"], + "title": "OverlaySubmit" + }, + "PermissionRule": { + "properties": { + "effect": { + "type": "string", + "enum": ["allow", "deny"], + "title": "Effect", + "description": "`\"allow\"` or `\"deny\"`" + }, + "methods": { + "anyOf": [ + { "items": { "type": "string" }, "type": "array" }, + { "type": "null" } + ], + "title": "Methods", + "description": "HTTP methods to match, e.g. `[\"GET\", \"POST\"]`. Omit to match all methods." + }, + "path": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Path", + "description": "Python regex matched with `re.search()` (substring, case-insensitive) against the upstream path. `|` is OR. Use `^`/`$` to anchor. Example: `\"text-to-speech\"` matches any path containing that string." + }, + "operations": { + "anyOf": [ + { "items": { "type": "string" }, "type": "array" }, + { "type": "null" } + ], + "title": "Operations", + "description": "List of regexes matched against the operation ID. E.g. `[\"tts\", \"speech\"]`." + } + }, + "additionalProperties": true, + "type": "object", + "required": ["effect"], + "title": "PermissionRule", + "description": "A single access control rule. All fields are optional; conditions are AND-combined.\nFirst matching rule wins. Agent rules are evaluated before system safety rules.\n\n**`effect`** — `\"allow\"` or `\"deny\"` (required)\n\n**`methods`** — list of HTTP methods to match, e.g. `[\"GET\", \"POST\"]`.\nOmit to match all methods.\n\n**`path`** — Python regex matched with `re.search()` against the upstream request path.\nThis is a **substring match** — `\"admin|pay\"` matches any path *containing* those words.\nCase-insensitive. Use `^`/`$` to anchor. `|` is regex OR.\n\nExamples:\n- `\"admin|billing|pay\"` — matches `/v1/admin/users`, `/billing/invoice`, `/pay`\n- `\"^/v1/voices$\"` — matches only exactly `/v1/voices`\n- `\"text-to-speech\"` — matches any path containing that substring\n\n**`operations`** — list of regexes matched against the operation ID via `re.search()`.\nE.g. `[\"tts\", \"speech\"]` matches any operation whose ID contains \"tts\" or \"speech\".\n\nSystem safety rules (always active, cannot be removed) are marked `_system: true` in\n`GET .../permissions` responses. They deny sensitive paths and write methods by default.\n\n**Examples:**\n```json\n{\"effect\": \"allow\", \"methods\": [\"POST\"], \"path\": \"text-to-speech\"}\n{\"effect\": \"deny\", \"path\": \"admin|billing|pay\"}\n{\"effect\": \"allow\", \"operations\": [\"^github_get_repo$\"]}\n```", + "examples": [ + { "effect": "allow", "methods": ["POST"], "path": "text-to-speech" }, + { "effect": "deny", "path": "admin|billing|pay" }, + { "effect": "allow", "operations": ["^github_get_repo$"] } + ] + }, + "PermissionsPatch": { + "properties": { + "add": { + "items": { "$ref": "#/components/schemas/PermissionRule" }, + "type": "array", + "title": "Add", + "description": "Rules to append (deduplicated by exact match)" + }, + "remove": { + "items": { "$ref": "#/components/schemas/PermissionRule" }, + "type": "array", + "title": "Remove", + "description": "Rules to remove by exact match" + } + }, + "type": "object", + "title": "PermissionsPatch", + "description": "Body for PATCH .../permissions — incremental rule updates." + }, + "SchemeInput": { + "properties": { + "type": { + "type": "string", + "enum": [ + "apiKey", + "bearer", + "basic", + "oauth2_client_credentials", + "openIdConnect" + ], + "title": "Type" + }, + "in": { + "anyOf": [ + { "type": "string", "enum": ["header", "query", "cookie"] }, + { "type": "null" } + ], + "title": "In" + }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, + "token_url": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Token Url" + }, + "openid_connect_url": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Openid Connect Url" + }, + "scheme_name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Scheme Name" + }, + "contributed_by": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Contributed By" + } + }, + "type": "object", + "required": ["type"], + "title": "SchemeInput", + "description": "Structured description of an API's authentication scheme.\n\nJentic generates the OpenAPI overlay from this; no need to write overlay YAML.\nMultiple entries can be submitted in one call for APIs requiring more than\none header (e.g. Discourse needs Api-Key + Api-Username)." + }, + "SearchResult": { + "properties": { + "type": { "type": "string", "title": "Type" }, + "id": { "type": "string", "title": "Id" }, + "slug": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Slug" + }, + "summary": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Summary" + }, + "description": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Description" + }, + "score": { "type": "number", "title": "Score" }, + "involved_apis": { + "items": { "type": "string" }, + "type": "array", + "title": "Involved Apis" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["type", "id", "score"], + "title": "SearchResult" + }, + "ToolkitCreate": { + "properties": { + "name": { "type": "string", "title": "Name" }, + "description": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Description" + }, + "simulate": { "type": "boolean", "title": "Simulate", "default": false }, + "initial_key_label": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Initial Key Label", + "description": "Label for the first key created with this toolkit (e.g. 'Agent A')" + }, + "initial_key_allowed_ips": { + "anyOf": [ + { "items": { "type": "string" }, "type": "array" }, + { "type": "null" } + ], + "title": "Initial Key Allowed Ips", + "description": "IP allowlist for the first key. NULL = unrestricted." + } + }, + "type": "object", + "required": ["name"], + "title": "ToolkitCreate" + }, + "ToolkitCredentialAdd": { + "properties": { "credential_id": { "type": "string", "title": "Credential Id" } }, + "type": "object", + "required": ["credential_id"], + "title": "ToolkitCredentialAdd" + }, + "ToolkitKeyCreated": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, + "prefix": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Prefix" + }, + "allowed_ips": { + "anyOf": [ + { "items": { "type": "string" }, "type": "array" }, + { "type": "null" } + ], + "title": "Allowed Ips" + }, + "revoked": { "type": "boolean", "title": "Revoked", "default": false }, + "created_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Created At" + }, + "key": { "type": "string", "title": "Key" } + }, + "additionalProperties": true, + "type": "object", + "required": ["id", "key"], + "title": "ToolkitKeyCreated", + "description": "Returned only at key creation — includes the full key value (never returned again)." + }, + "ToolkitKeyOut": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, + "prefix": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Prefix" + }, + "allowed_ips": { + "anyOf": [ + { "items": { "type": "string" }, "type": "array" }, + { "type": "null" } + ], + "title": "Allowed Ips" + }, + "revoked": { "type": "boolean", "title": "Revoked", "default": false }, + "created_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Created At" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["id"], + "title": "ToolkitKeyOut" + }, + "ToolkitOut": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "name": { "type": "string", "title": "Name" }, + "description": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Description" + }, + "created_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Created At" + }, + "keys": { + "items": { "$ref": "#/components/schemas/ToolkitKeyOut" }, + "type": "array", + "title": "Keys" + }, + "credentials": { + "items": { "$ref": "#/components/schemas/CredentialBindingOut" }, + "type": "array", + "title": "Credentials" + }, + "permissions": { + "items": { "additionalProperties": true, "type": "object" }, + "type": "array", + "title": "Permissions" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["id", "name"], + "title": "ToolkitOut" + }, + "ToolkitPatch": { + "properties": { + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, + "description": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Description" + }, + "simulate": { + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "title": "Simulate" + } + }, + "type": "object", + "title": "ToolkitPatch" + }, + "TraceListPage": { + "properties": { + "total": { "type": "integer", "title": "Total" }, + "limit": { "type": "integer", "title": "Limit" }, + "offset": { "type": "integer", "title": "Offset" }, + "traces": { + "items": { "$ref": "#/components/schemas/TraceOut" }, + "type": "array", + "title": "Traces" + } + }, + "type": "object", + "required": ["total", "limit", "offset", "traces"], + "title": "TraceListPage" + }, + "TraceOut": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "toolkit_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Toolkit Id" + }, + "operation_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Operation Id" + }, + "workflow_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Workflow Id" + }, + "spec_path": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Spec Path" + }, + "status": { "type": "string", "title": "Status" }, + "http_status": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Http Status" + }, + "duration_ms": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Duration Ms" + }, + "error": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Error" + }, + "created_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Created At" + }, + "completed_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Completed At" + }, + "steps": { + "items": { "$ref": "#/components/schemas/TraceStepOut" }, + "type": "array", + "title": "Steps" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["id", "status"], + "title": "TraceOut" + }, + "TraceStepOut": { + "properties": { + "id": { "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Id" }, + "step_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Step Id" + }, + "operation": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Operation" + }, + "status": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Status" + }, + "http_status": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Http Status" + }, + "output": { "title": "Output" }, + "detail": { "title": "Detail" }, + "error": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Error" + }, + "started_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Started At" + }, + "completed_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Completed At" + } + }, + "additionalProperties": true, + "type": "object", + "title": "TraceStepOut" + }, + "UserCreate": { + "properties": { + "username": { "type": "string", "title": "Username" }, + "password": { "type": "string", "title": "Password" } + }, + "type": "object", + "required": ["username", "password"], + "title": "UserCreate" + }, + "UserOut": { + "properties": { + "logged_in": { "type": "boolean", "title": "Logged In", "default": false }, + "username": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Username" + }, + "is_admin": { "type": "boolean", "title": "Is Admin", "default": false }, + "toolkit_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Toolkit Id" + }, + "trusted_subnet": { + "type": "boolean", + "title": "Trusted Subnet", + "default": false + } + }, + "additionalProperties": true, + "type": "object", + "title": "UserOut" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { "anyOf": [{ "type": "string" }, { "type": "integer" }] }, + "type": "array", + "title": "Location" + }, + "msg": { "type": "string", "title": "Message" }, + "type": { "type": "string", "title": "Error Type" } + }, + "type": "object", + "required": ["loc", "msg", "type"], + "title": "ValidationError" + }, + "WorkflowOut": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "url": { "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Url" }, + "slug": { "type": "string", "title": "Slug" }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, + "description": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Description" + }, + "steps_count": { "type": "integer", "title": "Steps Count", "default": 0 }, + "involved_apis": { + "items": { "type": "string" }, + "type": "array", + "title": "Involved Apis" + }, + "created_at": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Created At" + } + }, + "additionalProperties": true, + "type": "object", + "required": ["id", "slug"], + "title": "WorkflowOut" + } + }, + "securitySchemes": { + "JenticApiKey": { + "type": "apiKey", + "in": "header", + "name": "X-Jentic-API-Key", + "description": "Agent toolkit key (`tk_xxx`). Issue via `POST /default-api-key/generate`." + }, + "HumanLogin": { + "type": "oauth2", + "description": "Human admin session. Fill in username + password to get a Bearer JWT.", + "flows": { "password": { "tokenUrl": "/user/token", "scopes": {} } } + } + } + }, + "tags": [ + { + "name": "search", + "description": "**Start here.** Full-text and semantic search across all registered APIs and operations." + }, + { + "name": "inspect", + "description": "Inspect capability details, list APIs and operations." + }, + { + "name": "execute", + "description": "Transparent request broker — runs API operations and Arazzo workflows. Prefix any registered host to route through the broker: `POST /api.stripe.com/v1/payment_intents`. Credential injection, policy enforcement, and simulate mode built-in." + }, + { "name": "observe", "description": "Read async job handles and execution traces." }, + { + "name": "toolkits", + "description": "Manage toolkits: scoped credential bundles with access keys, permissions, and access requests." + }, + { + "name": "credentials", + "description": "Manage upstream API credentials in the vault (humans/admin only). Values are write-only — never returned after creation." + }, + { + "name": "user", + "description": "Human account management: create account, login, logout, and agent key generation." + }, + { + "name": "catalog", + "description": "Register APIs, upload specs, manage overlays and notes." + } + ], + "security": [{ "JenticApiKey": [] }, { "HumanLogin": [] }] +} diff --git a/ui/package-lock.json b/ui/package-lock.json index 3ed90833..c78822b7 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,11272 +1,15855 @@ { - "name": "jentic-mini-ui", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "jentic-mini-ui", - "version": "0.1.0", - "license": "ISC", - "dependencies": { - "@jentic/arazzo-ui": "^1.0.0-alpha.29", - "@tanstack/react-query": "^5.90.21", - "clsx": "^2.1.1", - "lucide-react": "^0.363.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-router-dom": "^6.30.3", - "tailwind-merge": "^3.5.0" - }, - "devDependencies": { - "@playwright/test": "^1.58.2", - "@tailwindcss/vite": "^4.1.0", - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.2", - "@testing-library/user-event": "^14.6.1", - "@types/node": "^25.5.0", - "@types/react": "^18.3.28", - "@types/react-dom": "^18.3.7", - "@vitejs/plugin-react": "^4.7.0", - "@vitest/browser": "^4.1.2", - "@vitest/browser-playwright": "^4.1.2", - "@vitest/coverage-istanbul": "^4.1.2", - "axe-core": "^4.11.1", - "msw": "^2.12.14", - "redoc": "^2.5.2", - "swagger-ui-dist": "^5.32.1", - "tailwindcss": "^4.1.0", - "typescript": "^5.9.3", - "vite": "^5.4.21", - "vitest": "^4.1.2" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", - "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "license": "MIT", - "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "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.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@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-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "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.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "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.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "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.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", - "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.48.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@blazediff/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", - "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", - "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", - "license": "MIT" - }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.2.tgz", - "integrity": "sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/gast": "11.1.2", - "@chevrotain/types": "11.1.2", - "lodash-es": "4.17.23" - } - }, - "node_modules/@chevrotain/gast": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.2.tgz", - "integrity": "sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/types": "11.1.2", - "lodash-es": "4.17.23" - } - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.2.tgz", - "integrity": "sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", - "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/utils": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.2.tgz", - "integrity": "sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==", - "license": "Apache-2.0" - }, - "node_modules/@emnapi/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", - "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", - "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", - "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", - "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", - "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", - "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@exodus/schemasafe": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", - "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.1.0", - "@iconify/types": "^2.0.0", - "mlly": "^1.8.0" - } - }, - "node_modules/@inquirer/ansi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.21", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jentic/arazzo-parser": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@jentic/arazzo-parser/-/arazzo-parser-1.0.0-alpha.29.tgz", - "integrity": "sha512-Kbggm5d7oyJhnSv9wENCMeuv3nWy3eJu87LBxxASpAbxSzIm8w5Gisgd4i3cM4uOUmFNxuxZCPq8dqr7Nv06tA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-datamodel": "^4.2.0", - "@speclynx/apidom-error": "^4.2.0", - "@speclynx/apidom-ns-arazzo-1": "^4.2.0", - "@speclynx/apidom-parser-adapter-arazzo-json-1": "^4.2.0", - "@speclynx/apidom-parser-adapter-arazzo-yaml-1": "^4.2.0", - "@speclynx/apidom-parser-adapter-openapi-json-2": "^4.2.0", - "@speclynx/apidom-parser-adapter-openapi-json-3-0": "^4.2.0", - "@speclynx/apidom-parser-adapter-openapi-json-3-1": "^4.2.0", - "@speclynx/apidom-parser-adapter-openapi-yaml-2": "^4.2.0", - "@speclynx/apidom-parser-adapter-openapi-yaml-3-0": "^4.2.0", - "@speclynx/apidom-parser-adapter-openapi-yaml-3-1": "^4.2.0", - "@speclynx/apidom-reference": "^4.2.0", - "ramda-adjunct": "^6.0.0", - "type-fest": "^5.4.4" - } - }, - "node_modules/@jentic/arazzo-resolver": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@jentic/arazzo-resolver/-/arazzo-resolver-1.0.0-alpha.29.tgz", - "integrity": "sha512-12fLJTzA/vIRBWMfVIlZIH+4yXwup5qFog5XWcUSiiMoZU85t3pQlJFl7UHHllReOBoGAFPNFSbi7w3bYlcjWQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@jentic/arazzo-parser": "1.0.0-alpha.29", - "@speclynx/apidom-datamodel": "^4.2.0", - "@speclynx/apidom-error": "^4.2.0", - "@speclynx/apidom-ns-arazzo-1": "^4.2.0", - "@speclynx/apidom-ns-openapi-2": "^4.2.0", - "@speclynx/apidom-ns-openapi-3-0": "^4.2.0", - "@speclynx/apidom-ns-openapi-3-1": "^4.2.0", - "@speclynx/apidom-reference": "^4.2.0", - "type-fest": "^5.4.4" - } - }, - "node_modules/@jentic/arazzo-ui": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@jentic/arazzo-ui/-/arazzo-ui-1.0.0-alpha.29.tgz", - "integrity": "sha512-HL1IZpWlVrDgFcgsKbL+hB9a0Pb0gBcMAW51XhbrNWsYVmDclXFOidZqrg8S9qGadLm6KpdUuiKXKy4D5TgozQ==", - "license": "Apache-2.0", - "dependencies": { - "@jentic/arazzo-parser": "1.0.0-alpha.29", - "@jentic/arazzo-resolver": "1.0.0-alpha.29", - "@speclynx/apidom-core": "^4.2.0", - "mermaid": "^11.12.2", - "react-markdown": "^10.1.0", - "reactflow": "^11.10.4", - "rehype-highlight": "^7.0.2", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1" - }, - "bin": { - "arazzo-ui": "bin/arazzo-ui.mjs" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mermaid-js/parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.1.tgz", - "integrity": "sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ==", - "license": "MIT", - "dependencies": { - "langium": "^4.0.0" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.41.3", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", - "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", - "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@oxc-project/types": { - "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@playwright/test": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", - "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.58.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@reactflow/background": { - "version": "11.3.14", - "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.14.tgz", - "integrity": "sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/controls": { - "version": "11.2.14", - "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.14.tgz", - "integrity": "sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/core": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.4.tgz", - "integrity": "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==", - "license": "MIT", - "dependencies": { - "@types/d3": "^7.4.0", - "@types/d3-drag": "^3.0.1", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/minimap": { - "version": "11.7.14", - "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.14.tgz", - "integrity": "sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-resizer": { - "version": "2.2.14", - "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz", - "integrity": "sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "classcat": "^5.0.4", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-toolbar": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz", - "integrity": "sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@redocly/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js-replace": "^1.0.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@redocly/config": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.0.tgz", - "integrity": "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@redocly/openapi-core": { - "version": "1.34.11", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.11.tgz", - "integrity": "sha512-V09ayfnb5GyysmvARbt+voFZAjGcf7hSYxOYxSkCc4fbH/DTfq5YWoec8cflvmHHqyIFbqvmGKmYFzqhr9zxDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@redocly/ajv": "8.11.2", - "@redocly/config": "0.22.0", - "colorette": "1.4.0", - "https-proxy-agent": "7.0.6", - "js-levenshtein": "1.1.6", - "js-yaml": "4.1.1", - "minimatch": "5.1.9", - "pluralize": "8.0.0", - "yaml-ast-parser": "0.0.43" - }, - "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" - } - }, - "node_modules/@remix-run/router": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", - "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", - "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", - "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", - "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", - "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", - "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", - "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", - "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", - "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", - "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", - "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", - "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", - "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", - "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", - "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", - "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", - "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", - "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", - "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", - "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", - "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", - "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", - "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", - "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", - "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", - "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", - "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", - "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", - "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", - "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", - "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", - "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", - "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", - "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@scarf/scarf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", - "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0" - }, - "node_modules/@speclynx/apidom-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-core/-/apidom-core-4.2.0.tgz", - "integrity": "sha512-RT9gfKrKhbW0CIgcvQJgZ2c2IBy+jto3T1hCZ2QgyEu5h8m4bFcPZvnVkTWsRupQ9zEVO+3X8keVEhQiqsrOBQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "short-unique-id": "^5.3.2", - "ts-mixer": "^6.0.4", - "yaml": "^2.8.2" - } - }, - "node_modules/@speclynx/apidom-datamodel": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-datamodel/-/apidom-datamodel-4.2.0.tgz", - "integrity": "sha512-8/CFRGoDmeyJ8RxgHRSPRMaLA7VWOvG7EbXhSmBWeOZasozJuzY9J7qvM9OTtkAHDJA9yWnllCTs5RdaINacVw==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-error": "4.2.0", - "ramda": "~0.32.0" - } - }, - "node_modules/@speclynx/apidom-error": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-error/-/apidom-error-4.2.0.tgz", - "integrity": "sha512-imqu1ZJG8F8pN7ivcP5zB7DZg1TD2QviDG4aA9plUeglV3xGgR3SfxoYSOXoWaMDbO+vYWfcTvM781E/tJC/zg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4" - } - }, - "node_modules/@speclynx/apidom-json-path": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-json-path/-/apidom-json-path-4.2.0.tgz", - "integrity": "sha512-bgnebLyE9qKvD+RTInOKIpLKT3Hbr0DAO1x7+pYyv0Yg6tjyhdCUqJ1tXXUFT8HGZaXPvNUgbRAIiHorxkVDcw==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@swaggerexpert/jsonpath": "^4.0.3" - } - }, - "node_modules/@speclynx/apidom-json-pointer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-json-pointer/-/apidom-json-pointer-4.2.0.tgz", - "integrity": "sha512-EuA6DxFPPsDJcvhEkXFm5h1rnLFD97PgkOpg1z4BU8n2Ye1eSpMj9WWKGDbOR+GMtEqMfmiEiGFL1OFRCsgmaw==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@swaggerexpert/json-pointer": "^3.0.1" - } - }, - "node_modules/@speclynx/apidom-ns-arazzo-1": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-4.2.0.tgz", - "integrity": "sha512-Tq6anyue84M3zS+LFrMjxge2/S0ZaGJj1/Hg8pD7wSK1v/8s8Wj4A8MGJjBzHjB64UUfHOU/xMpY9aUIArelqw==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-json-schema-2020-12": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-ns-asyncapi-2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-4.2.0.tgz", - "integrity": "sha512-YFg2hi3FZ8MKQvAtTNPlK2HFMrhOqHNxFh/kdIQdQyZLSzVlPU11kymTXxTwmJyS003PCccvOGuwg9727EwokA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-json-schema-draft-7": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-ns-json-schema-2019-09": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-4.2.0.tgz", - "integrity": "sha512-ETbV4cBVQleAbCtBzTW4CetG6hQNtcdEKeq/nWCgd9ROHUJkQIYt+t3ZoQUi1Wg1yD0tcZvghZQb+dLnHDGG9g==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@speclynx/apidom-ns-json-schema-draft-6": "4.2.0", - "@speclynx/apidom-ns-json-schema-draft-7": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-ns-json-schema-2020-12": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-4.2.0.tgz", - "integrity": "sha512-w781db0AkLZNlTnxJ1hhCibTKVRmkCiQdpRLyTbGr45KfbyfDLEA5jIDNCwnB2M6lO+2OfuPk/BwpkevtAV6Eg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@speclynx/apidom-ns-json-schema-2019-09": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-ns-json-schema-draft-4": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-4.2.0.tgz", - "integrity": "sha512-mwbpfJEQXTL3TO+vov3JJPCaw6OnSWGG+U1he6GWzHwfYgIZ18TFALorfQK4QQhkEaiYTQp6TnwHHu1lPU9CaA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-ns-json-schema-draft-6": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-4.2.0.tgz", - "integrity": "sha512-8QrUb1bNeyLEVR/auU0uovWoVPYCHhJCoFSczqHJm5MaP+RArohus1R9XNZYV7kAhxDeUbDETZsA2idyMhPJ5g==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@speclynx/apidom-ns-json-schema-draft-4": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-ns-json-schema-draft-7": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-4.2.0.tgz", - "integrity": "sha512-9Q7wJsKUji342aEHGPMidh3TlOarMaC1rjxQjg34A8JP95FCZK1RITOiM68WDbmXMByZKN8DPF9lv7kJekEwxQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@speclynx/apidom-ns-json-schema-draft-6": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-ns-openapi-2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-openapi-2/-/apidom-ns-openapi-2-4.2.0.tgz", - "integrity": "sha512-F2MfH515aJ4B1+BYL18KyKSMReF8vSpXmMNRaKhv1xh3bpxW+gUa7AFh9Y72w3t9UojEdmgQ53OZcvnJf795vw==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@speclynx/apidom-json-pointer": "4.2.0", - "@speclynx/apidom-ns-json-schema-draft-4": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-ns-openapi-3-0": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-4.2.0.tgz", - "integrity": "sha512-eMiSCXB32h3FO3M2fs+FRAh/AjURgVPS4LxZ2uSBinKp6N/AW0/Vj/TeBaJO27Mm79qUQvrn8D2EZIj1yb8kEA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@speclynx/apidom-json-pointer": "4.2.0", - "@speclynx/apidom-ns-json-schema-draft-4": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-ns-openapi-3-1": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-4.2.0.tgz", - "integrity": "sha512-EdhtXVIgiKd+nuhI1kPHMA9nz0/hGsxLpQzLOikIqUqrKU2I201GtYaGjXoMwSxgixugntQafhdZLcEO19Dp0g==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-json-pointer": "4.2.0", - "@speclynx/apidom-ns-json-schema-2020-12": "4.2.0", - "@speclynx/apidom-ns-openapi-3-0": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "ts-mixer": "^6.0.4" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-arazzo-json-1": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-4.2.0.tgz", - "integrity": "sha512-VZyJsqVrzUYmmXn1BS2xc82NtMbDVhvPHVYBOPLbyZ9IvliMziAxC4dldQRNxxPZdQYWlxW/TGJX4plN5raBCw==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-arazzo-1": "4.2.0", - "@speclynx/apidom-parser-adapter-json": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-arazzo-yaml-1": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-4.2.0.tgz", - "integrity": "sha512-Qxz0FbQo91SDXWsOfma44Y1YH72QSN4d9GrgXgahjRYDTVVcAEL8PAMXIuL+RVSl7ZXH3HYCCY01/1elqc9xQA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-arazzo-1": "4.2.0", - "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-asyncapi-json-2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-4.2.0.tgz", - "integrity": "sha512-UBknXA0cpbWBAY3c3xBBk0MBhUsZTXz1TxsDxlES3y7Bmt0lDQIqD65JHtDyp0n5ymBckGWPWZivHpkiQpSMPg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-asyncapi-2": "4.2.0", - "@speclynx/apidom-parser-adapter-json": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-4.2.0.tgz", - "integrity": "sha512-GaJUGKIHxlkjhNG4RjZfZJlntueHKPxMQxWmnBG2IOt6HXMT/oABrwVfZ7lkfRLEh3OlQ7EHF41bQEE/lOt+6A==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-asyncapi-2": "4.2.0", - "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-json": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-json/-/apidom-parser-adapter-json-4.2.0.tgz", - "integrity": "sha512-XcDn+o/FuvmXwSOpZRckpNWDLMDR907sep4Bezlrmm31oL6bSSGHmheelIGZbCoKJOgXYrwxJUhaQl0k343phA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "web-tree-sitter": "=0.26.7" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-openapi-json-2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-4.2.0.tgz", - "integrity": "sha512-owYFENwV2l++DnGSgFAtH8xS3Fqz8rRiXdPH5ugdPzFpz3B5Xywzu4eMtOf32nQJiQ9Ii7/bsz8ib7kgA4De7g==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-openapi-2": "4.2.0", - "@speclynx/apidom-parser-adapter-json": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-openapi-json-3-0": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-4.2.0.tgz", - "integrity": "sha512-siumXJl0gbL2x47yvxKijIdlGUO3ZCk2JLqcB2YFNyYW2Tph81zW6Sj2CQvrQD5xRqki7vgkXz9R8QN+TVrz2g==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-openapi-3-0": "4.2.0", - "@speclynx/apidom-parser-adapter-json": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-openapi-json-3-1": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-4.2.0.tgz", - "integrity": "sha512-Cpx9XqLV69dtdf30W08/8T2XYAcEMTRIfqq93fqHeIr8NX+hdjst38X8eCAroIP7usUvklBCiAuFk/buL22GZQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-openapi-3-1": "4.2.0", - "@speclynx/apidom-parser-adapter-json": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-openapi-yaml-2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-4.2.0.tgz", - "integrity": "sha512-K/Ol/srv/AkAGw8Eyn+jfEuz4rkHkWuXE6WN7mQ2chExNEclrRy9CDyYtd3vVRrWdiCPIlphRrBmJ+5nSQZunQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-openapi-2": "4.2.0", - "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-4.2.0.tgz", - "integrity": "sha512-P17qEHVSlJmFA5FMDgpWeEg8gm0HhqK74jZHGIXOC/vNexLf//V0qFA+9glmgglAbtvnRwFbUftUnTZS/9yIiQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-openapi-3-0": "4.2.0", - "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-4.2.0.tgz", - "integrity": "sha512-AsK43UevGQ8s/fivQIuOt+fWkFdj3sa/M5VuBzBWYfCYsJe1Rbuw8+PKrOPuP6gNng+T4pqOY7Ed2rqYGlFJ4Q==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-ns-openapi-3-1": "4.2.0", - "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-parser-adapter-yaml-1-2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-4.2.0.tgz", - "integrity": "sha512-DNjwtMYyjHBDxJQ5Snw2ZJfJTcuTSTtdnMTLOYbOj5B3PV52s0ZyIuNkvbDuwBxzyHmWGanoJXLH3IL4sEBO4Q==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0", - "unraw": "^3.0.0", - "web-tree-sitter": "=0.26.7", - "yaml": "^2.8.2" - } - }, - "node_modules/@speclynx/apidom-reference": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-reference/-/apidom-reference-4.2.0.tgz", - "integrity": "sha512-6Dir6WJ+C0eOvWGxKBHNmb0aPjPl7DKq4XdL8qH5ZrVqFV6yJklOKs+4VE6jTSBn1u742xNwrVShz63CT/D+3g==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-core": "4.2.0", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@speclynx/apidom-json-pointer": "4.2.0", - "@speclynx/apidom-ns-arazzo-1": "4.2.0", - "@speclynx/apidom-ns-asyncapi-2": "4.2.0", - "@speclynx/apidom-ns-json-schema-2020-12": "4.2.0", - "@speclynx/apidom-ns-openapi-2": "4.2.0", - "@speclynx/apidom-ns-openapi-3-0": "4.2.0", - "@speclynx/apidom-ns-openapi-3-1": "4.2.0", - "@speclynx/apidom-parser-adapter-arazzo-json-1": "4.2.0", - "@speclynx/apidom-parser-adapter-arazzo-yaml-1": "4.2.0", - "@speclynx/apidom-parser-adapter-asyncapi-json-2": "4.2.0", - "@speclynx/apidom-parser-adapter-asyncapi-yaml-2": "4.2.0", - "@speclynx/apidom-parser-adapter-json": "4.2.0", - "@speclynx/apidom-parser-adapter-openapi-json-2": "4.2.0", - "@speclynx/apidom-parser-adapter-openapi-json-3-0": "4.2.0", - "@speclynx/apidom-parser-adapter-openapi-json-3-1": "4.2.0", - "@speclynx/apidom-parser-adapter-openapi-yaml-2": "4.2.0", - "@speclynx/apidom-parser-adapter-openapi-yaml-3-0": "4.2.0", - "@speclynx/apidom-parser-adapter-openapi-yaml-3-1": "4.2.0", - "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", - "@speclynx/apidom-traverse": "4.2.0", - "@swaggerexpert/arazzo-runtime-expression": "^2.0.3", - "axios": "^1.13.5", - "picomatch": "^4.0.3", - "process": "^0.11.10", - "ramda": "~0.32.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@speclynx/apidom-traverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@speclynx/apidom-traverse/-/apidom-traverse-4.2.0.tgz", - "integrity": "sha512-7H2TnpwO17BuMyKs4fHVX06E/4/NX+BV3xT5ZXoj4DC0yBvleMYs/e+IWGX4c31hSM2FoCTPyUH2fVrzQzf+Lg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "^7.28.4", - "@speclynx/apidom-datamodel": "4.2.0", - "@speclynx/apidom-error": "4.2.0", - "@speclynx/apidom-json-path": "4.2.0", - "@speclynx/apidom-json-pointer": "4.2.0", - "ramda-adjunct": "^6.0.0" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@swaggerexpert/arazzo-runtime-expression": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@swaggerexpert/arazzo-runtime-expression/-/arazzo-runtime-expression-2.0.3.tgz", - "integrity": "sha512-iGzCT3a6edX/LyQFhaR5l1JEyGtCQArGVjKDk8T7biaz24TE3CgDUMyeWzhGq9x7GBDj6KsxkI1WKEdERiDT5A==", - "license": "Apache-2.0", - "dependencies": { - "apg-lite": "^1.0.5" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/@swaggerexpert/json-pointer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@swaggerexpert/json-pointer/-/json-pointer-3.0.1.tgz", - "integrity": "sha512-ujx/rESoBo+/ytYh+kqP2pY3+M0WkbISfoR9N6/CazQMHkRrFqK/nmzO9tFg4DfdHmwEFcJEAhTtDDF1d0H9Hg==", - "license": "Apache-2.0", - "dependencies": { - "apg-lite": "^1.0.5" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/@swaggerexpert/jsonpath": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@swaggerexpert/jsonpath/-/jsonpath-4.0.3.tgz", - "integrity": "sha512-ttXX1KATYGCdQbvXOAq7WN9WQ5Dx2Wshgj2M1dG4oARyPH5puxCVsAzB5qsz/2K08cJ6kNY6iOk6AlSj5zK/8g==", - "license": "Apache-2.0", - "dependencies": { - "apg-lite": "^1.0.5" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", - "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.19.0", - "jiti": "^2.6.1", - "lightningcss": "1.32.0", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.2.2" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", - "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-x64": "4.2.2", - "@tailwindcss/oxide-freebsd-x64": "4.2.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-x64-musl": "4.2.2", - "@tailwindcss/oxide-wasm32-wasi": "4.2.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", - "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", - "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", - "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", - "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", - "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", - "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", - "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", - "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", - "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", - "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.8.1", - "@emnapi/runtime": "^1.8.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.1", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", - "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", - "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", - "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.2.2", - "@tailwindcss/oxide": "4.2.2", - "tailwindcss": "4.2.2" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7 || ^8" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.96.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.96.0.tgz", - "integrity": "sha512-sfO3uQeol1BU7cRP6NYY7nAiX3GiNY20lI/dtSbKLwcIkYw/X+w/tEsQAkc544AfIhBX/IvH/QYtPHrPhyAKGw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.96.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.96.0.tgz", - "integrity": "sha512-6qbjdm1K5kizVKv9TNqhIN3doq2anRhdF2XaFMFSn4m8L22S69RV+FilvlyVT4RoJyMxtPU5rs4RpdFa/PEC7A==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.96.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "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 - } - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT" - }, - "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.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "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/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, - "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/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": "25.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", - "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "undici-types": "~7.18.0" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/statuses": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", - "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/stylis": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.7.tgz", - "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, - "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/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@upsetjs/venn.js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", - "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", - "license": "MIT", - "optionalDependencies": { - "d3-selection": "^3.0.0", - "d3-transition": "^3.0.1" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@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" - } - }, - "node_modules/@vitest/browser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.2.tgz", - "integrity": "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@blazediff/core": "1.9.1", - "@vitest/mocker": "4.1.2", - "@vitest/utils": "4.1.2", - "magic-string": "^0.30.21", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.1.0", - "ws": "^8.19.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.2" - } - }, - "node_modules/@vitest/browser-playwright": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.2.tgz", - "integrity": "sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/browser": "4.1.2", - "@vitest/mocker": "4.1.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "4.1.2" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": false - } - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", - "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", - "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", - "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", - "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", - "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/darwin-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", - "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", - "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", - "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", - "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", - "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", - "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-loong64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", - "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", - "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", - "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", - "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-s390x": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", - "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", - "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", - "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", - "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/sunos-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", - "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", - "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", - "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", - "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", - "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.2", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/browser-playwright/node_modules/esbuild": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", - "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.4", - "@esbuild/android-arm": "0.27.4", - "@esbuild/android-arm64": "0.27.4", - "@esbuild/android-x64": "0.27.4", - "@esbuild/darwin-arm64": "0.27.4", - "@esbuild/darwin-x64": "0.27.4", - "@esbuild/freebsd-arm64": "0.27.4", - "@esbuild/freebsd-x64": "0.27.4", - "@esbuild/linux-arm": "0.27.4", - "@esbuild/linux-arm64": "0.27.4", - "@esbuild/linux-ia32": "0.27.4", - "@esbuild/linux-loong64": "0.27.4", - "@esbuild/linux-mips64el": "0.27.4", - "@esbuild/linux-ppc64": "0.27.4", - "@esbuild/linux-riscv64": "0.27.4", - "@esbuild/linux-s390x": "0.27.4", - "@esbuild/linux-x64": "0.27.4", - "@esbuild/netbsd-arm64": "0.27.4", - "@esbuild/netbsd-x64": "0.27.4", - "@esbuild/openbsd-arm64": "0.27.4", - "@esbuild/openbsd-x64": "0.27.4", - "@esbuild/openharmony-arm64": "0.27.4", - "@esbuild/sunos-x64": "0.27.4", - "@esbuild/win32-arm64": "0.27.4", - "@esbuild/win32-ia32": "0.27.4", - "@esbuild/win32-x64": "0.27.4" - } - }, - "node_modules/@vitest/browser-playwright/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/@vitest/browser-playwright/node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, - "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", - "optional": true, - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/vite": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", - "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.12", - "tinyglobby": "^0.2.15" - }, - "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", - "@vitejs/devtools": "^0.1.0", - "esbuild": "^0.27.0", - "jiti": ">=1.21.0", - "less": "^4.0.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 - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "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/@vitest/browser/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", - "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/android-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", - "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/android-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", - "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/android-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", - "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", - "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/darwin-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", - "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", - "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", - "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", - "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", - "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", - "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-loong64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", - "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", - "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", - "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", - "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-s390x": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", - "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", - "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", - "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", - "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/sunos-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", - "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/win32-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", - "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/win32-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", - "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/win32-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", - "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@vitest/mocker": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", - "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.2", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/browser/node_modules/esbuild": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", - "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.4", - "@esbuild/android-arm": "0.27.4", - "@esbuild/android-arm64": "0.27.4", - "@esbuild/android-x64": "0.27.4", - "@esbuild/darwin-arm64": "0.27.4", - "@esbuild/darwin-x64": "0.27.4", - "@esbuild/freebsd-arm64": "0.27.4", - "@esbuild/freebsd-x64": "0.27.4", - "@esbuild/linux-arm": "0.27.4", - "@esbuild/linux-arm64": "0.27.4", - "@esbuild/linux-ia32": "0.27.4", - "@esbuild/linux-loong64": "0.27.4", - "@esbuild/linux-mips64el": "0.27.4", - "@esbuild/linux-ppc64": "0.27.4", - "@esbuild/linux-riscv64": "0.27.4", - "@esbuild/linux-s390x": "0.27.4", - "@esbuild/linux-x64": "0.27.4", - "@esbuild/netbsd-arm64": "0.27.4", - "@esbuild/netbsd-x64": "0.27.4", - "@esbuild/openbsd-arm64": "0.27.4", - "@esbuild/openbsd-x64": "0.27.4", - "@esbuild/openharmony-arm64": "0.27.4", - "@esbuild/sunos-x64": "0.27.4", - "@esbuild/win32-arm64": "0.27.4", - "@esbuild/win32-ia32": "0.27.4", - "@esbuild/win32-x64": "0.27.4" - } - }, - "node_modules/@vitest/browser/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/@vitest/browser/node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, - "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", - "optional": true, - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@vitest/browser/node_modules/vite": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", - "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.12", - "tinyglobby": "^0.2.15" - }, - "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", - "@vitejs/devtools": "^0.1.0", - "esbuild": "^0.27.0", - "jiti": ">=1.21.0", - "less": "^4.0.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 - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "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/@vitest/coverage-istanbul": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-4.1.2.tgz", - "integrity": "sha512-WSz7+4a7PcMtMNvIP7AXUMffsq4JrWeJaguC8lg6fSQyGxSfaT4Rf81idqwxTT6qX5kjjZw2t9rAnCRRQobSqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.29.0", - "@istanbuljs/schema": "^0.1.3", - "@jridgewell/gen-mapping": "^0.3.13", - "@jridgewell/trace-mapping": "0.3.31", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.2" - } - }, - "node_modules/@vitest/expect": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", - "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.2", - "@vitest/utils": "4.1.2", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", - "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", - "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.2", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", - "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.2", - "@vitest/utils": "4.1.2", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", - "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", - "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.2", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/apg-lite": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/apg-lite/-/apg-lite-1.0.5.tgz", - "integrity": "sha512-SlI+nLMQDzCZfS39ihzjGp3JNBQfJXyMi6cg9tkLOCPVErgFsUIAEdO9IezR7kbP5Xd0ozcPNQBkf9TO5cHgWw==", - "license": "BSD-2-Clause" - }, - "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==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axe-core": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.2.tgz", - "integrity": "sha512-byD6KPdvo72y/wj2T/4zGEvvlis+PsZsn/yPS3pEO+sFpcrqRpX/TJCxvVaEsNeMrfQbCr7w163YqoD9IYwHXw==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", - "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.12", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.12.tgz", - "integrity": "sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "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", - "peer": true, - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001782", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001782.tgz", - "integrity": "sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==", - "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/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "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/chevrotain": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.2.tgz", - "integrity": "sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@chevrotain/cst-dts-gen": "11.1.2", - "@chevrotain/gast": "11.1.2", - "@chevrotain/regexp-to-ast": "11.1.2", - "@chevrotain/types": "11.1.2", - "@chevrotain/utils": "11.1.2", - "lodash-es": "4.17.23" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21" - }, - "peerDependencies": { - "chevrotain": "^11.0.0" - } - }, - "node_modules/classcat": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "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/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "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.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/core-js": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", - "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.49.0.tgz", - "integrity": "sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/cytoscape": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", - "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", - "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", - "license": "MIT", - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, - "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decko": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", - "integrity": "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==", - "dev": true - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/delaunator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", - "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "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.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "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/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/dompurify": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", - "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.329", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.329.tgz", - "integrity": "sha512-/4t+AS1l4S3ZC0Ja7PHFIWeBIxGA3QGqV8/yKsP36v7NcyUCl+bIcmw6s5zVuMIECWwBrAK/6QLzTmbJChBboQ==", - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "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" - } - }, - "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-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/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-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "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-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-xml-builder": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", - "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.1.3" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.5.9", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", - "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.2.0", - "strnum": "^2.2.2" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "dev": true, - "license": "MIT" - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "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-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/graphql": { - "version": "16.13.2", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz", - "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "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/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/headers-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/highlight.js": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/http2-client": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", - "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", - "dev": true, - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "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-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-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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "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-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "foreach": "^2.0.4" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "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/katex": { - "version": "0.16.44", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.44.tgz", - "integrity": "sha512-EkxoDTk8ufHqHlf9QxGwcxeLkWRR3iOuYfRpfORgYfqc8s13bgb+YtRY59NK5ZpRaCwq1kqA6a5lpX8C/eLphQ==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, - "node_modules/langium": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz", - "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==", - "license": "MIT", - "dependencies": { - "chevrotain": "~11.1.1", - "chevrotain-allstar": "~0.3.1", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.1.0" - }, - "engines": { - "node": ">=20.10.0", - "npm": ">=10.2.3" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "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-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "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-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "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-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "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-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "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.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "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-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lodash-es": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", - "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/lowlight": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", - "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.0.0", - "highlight.js": "~11.11.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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/lucide-react": { - "version": "0.363.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.363.0.tgz", - "integrity": "sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/magicast": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", - "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "source-map-js": "^1.2.1" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "dev": true, - "license": "MIT" - }, - "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.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.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/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", - "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-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "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-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "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-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-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^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/mermaid": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.13.0.tgz", - "integrity": "sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==", - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.2", - "@mermaid-js/parser": "^1.0.1", - "@types/d3": "^7.4.3", - "@upsetjs/venn.js": "^2.0.0", - "cytoscape": "^3.33.1", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.14", - "dayjs": "^1.11.19", - "dompurify": "^3.3.1", - "katex": "^0.16.25", - "khroma": "^2.1.0", - "lodash-es": "^4.17.23", - "marked": "^16.3.0", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" - } - }, - "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-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.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-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^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-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^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-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "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-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-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-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/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, - "node_modules/mobx": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.15.0.tgz", - "integrity": "sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==", - "dev": true, - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - } - }, - "node_modules/mobx-react": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.2.0.tgz", - "integrity": "sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mobx-react-lite": "^4.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.9.0", - "react": "^16.8.0 || ^17 || ^18 || ^19" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/mobx-react-lite": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.1.1.tgz", - "integrity": "sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.9.0", - "react": "^16.8.0 || ^17 || ^18 || ^19" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "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/msw": { - "version": "2.12.14", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.14.tgz", - "integrity": "sha512-4KXa4nVBIBjbDbd7vfQNuQ25eFxug0aropCQFoI0JdOBuJWamkT1yLVIWReFI8SiTRc+H1hKzaNk+cLk2N9rtQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/confirm": "^5.0.0", - "@mswjs/interceptors": "^0.41.2", - "@open-draft/deferred-promise": "^2.2.0", - "@types/statuses": "^2.0.6", - "cookie": "^1.0.2", - "graphql": "^16.12.0", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "path-to-regexp": "^6.3.0", - "picocolors": "^1.1.1", - "rettime": "^0.10.1", - "statuses": "^2.0.2", - "strict-event-emitter": "^0.5.1", - "tough-cookie": "^6.0.0", - "type-fest": "^5.2.0", - "until-async": "^3.0.2", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.8.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.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==", - "dev": true, - "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/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch-h2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", - "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", - "dev": true, - "license": "MIT", - "dependencies": { - "http2-client": "^1.2.5" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-readfiles": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", - "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es6-promise": "^3.2.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/oas-kit-common": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", - "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "fast-safe-stringify": "^2.0.7" - } - }, - "node_modules/oas-linter": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", - "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@exodus/schemasafe": "^1.0.0-rc.2", - "should": "^13.2.1", - "yaml": "^1.10.0" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/oas-linter/node_modules/yaml": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", - "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/oas-resolver": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", - "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "node-fetch-h2": "^2.3.0", - "oas-kit-common": "^1.0.8", - "reftools": "^1.1.9", - "yaml": "^1.10.0", - "yargs": "^17.0.1" - }, - "bin": { - "resolve": "resolve.js" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/oas-resolver/node_modules/yaml": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", - "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/oas-schema-walker": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", - "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", - "dev": true, - "license": "BSD-3-Clause", - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/oas-validator": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", - "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "call-me-maybe": "^1.0.1", - "oas-kit-common": "^1.0.8", - "oas-linter": "^3.2.2", - "oas-resolver": "^2.5.6", - "oas-schema-walker": "^1.1.5", - "reftools": "^1.1.9", - "should": "^13.2.1", - "yaml": "^1.10.0" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/oas-validator/node_modules/yaml": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", - "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/openapi-sampler": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.2.tgz", - "integrity": "sha512-OKytvqB5XIaTgA9xtw8W8UTar+uymW2xPVpFN0NihMtuHPdPTGxBEhGnfFnJW5g/gOSIvkP+H0Xh3XhVI9/n7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.7", - "fast-xml-parser": "^5.5.1", - "json-pointer": "0.6.2" - } - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true, - "license": "MIT" - }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", - "license": "MIT" - }, - "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/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "license": "MIT" - }, - "node_modules/path-expression-matcher": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", - "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, - "node_modules/perfect-scrollbar": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz", - "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/playwright": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", - "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "playwright-core": "1.58.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", - "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.19.0" - } - }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, - "node_modules/polished": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", - "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "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.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ramda": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.32.0.tgz", - "integrity": "sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, - "node_modules/ramda-adjunct": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-6.0.0.tgz", - "integrity": "sha512-mdGCk0Gj3nQQ7lJ2XfuOFsc3GtfAn5jJWcQ/FuEPvP8E+gaXQ+z+3y/HtKGoYkrOWgE645VCdK54GNvKkXYQlw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda-adjunct" - }, - "peerDependencies": { - "ramda": ">= 0.32.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "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-router": { - "version": "6.30.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", - "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.23.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.30.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", - "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.23.2", - "react-router": "6.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-tabs": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.1.1.tgz", - "integrity": "sha512-CPiuKoMFf89B7QlbFfdBD9XmUWiE3qudQputMVZB8GQvPJZRX/gqjDaDWOPDwGinEfpJKEuBCkGt83Tt4efeyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "prop-types": "^15.5.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/reactflow": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.4.tgz", - "integrity": "sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==", - "license": "MIT", - "dependencies": { - "@reactflow/background": "11.3.14", - "@reactflow/controls": "11.2.14", - "@reactflow/core": "11.11.4", - "@reactflow/minimap": "11.7.14", - "@reactflow/node-resizer": "2.2.14", - "@reactflow/node-toolbar": "1.3.14" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redoc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.5.2.tgz", - "integrity": "sha512-sTJfItvRkcDTojB6wdLN4M+Ua6mlZwElV21Tf8Mn7IbQF/1Os6GvgQpZyLWPGZZHbhy7GC1Or1hTMHfz1vKh5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@redocly/openapi-core": "^1.4.0", - "classnames": "^2.3.2", - "decko": "^1.2.0", - "dompurify": "^3.2.4", - "eventemitter3": "^5.0.1", - "json-pointer": "^0.6.2", - "lunr": "^2.3.9", - "mark.js": "^8.11.1", - "marked": "^4.3.0", - "mobx-react": "9.2.0", - "openapi-sampler": "^1.6.2", - "path-browserify": "^1.0.1", - "perfect-scrollbar": "^1.5.5", - "polished": "^4.2.2", - "prismjs": "^1.29.0", - "prop-types": "^15.8.1", - "react-tabs": "^6.0.2", - "slugify": "~1.4.7", - "stickyfill": "^1.1.1", - "swagger2openapi": "^7.0.8", - "url-template": "^2.0.8" - }, - "engines": { - "node": ">=6.9", - "npm": ">=3.0.0" - }, - "peerDependencies": { - "core-js": "^3.1.4", - "mobx": "^6.0.4", - "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "styled-components": "^4.1.1 || ^5.1.1 || ^6.0.5" - } - }, - "node_modules/redoc/node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/reftools": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", - "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", - "dev": true, - "license": "BSD-3-Clause", - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/rehype-highlight": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.2.tgz", - "integrity": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-text": "^4.0.0", - "lowlight": "^3.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rettime": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", - "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", - "dev": true, - "license": "MIT" - }, - "node_modules/robust-predicates": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", - "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", - "license": "Unlicense" - }, - "node_modules/rolldown": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", - "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.122.0", - "@rolldown/pluginutils": "1.0.0-rc.12" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.12", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", - "@rolldown/binding-darwin-x64": "1.0.0-rc.12", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" - } - }, - "node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", - "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", - "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", - "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.60.1", - "@rollup/rollup-android-arm64": "4.60.1", - "@rollup/rollup-darwin-arm64": "4.60.1", - "@rollup/rollup-darwin-x64": "4.60.1", - "@rollup/rollup-freebsd-arm64": "4.60.1", - "@rollup/rollup-freebsd-x64": "4.60.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", - "@rollup/rollup-linux-arm-musleabihf": "4.60.1", - "@rollup/rollup-linux-arm64-gnu": "4.60.1", - "@rollup/rollup-linux-arm64-musl": "4.60.1", - "@rollup/rollup-linux-loong64-gnu": "4.60.1", - "@rollup/rollup-linux-loong64-musl": "4.60.1", - "@rollup/rollup-linux-ppc64-gnu": "4.60.1", - "@rollup/rollup-linux-ppc64-musl": "4.60.1", - "@rollup/rollup-linux-riscv64-gnu": "4.60.1", - "@rollup/rollup-linux-riscv64-musl": "4.60.1", - "@rollup/rollup-linux-s390x-gnu": "4.60.1", - "@rollup/rollup-linux-x64-gnu": "4.60.1", - "@rollup/rollup-linux-x64-musl": "4.60.1", - "@rollup/rollup-openbsd-x64": "4.60.1", - "@rollup/rollup-openharmony-arm64": "4.60.1", - "@rollup/rollup-win32-arm64-msvc": "4.60.1", - "@rollup/rollup-win32-ia32-msvc": "4.60.1", - "@rollup/rollup-win32-x64-gnu": "4.60.1", - "@rollup/rollup-win32-x64-msvc": "4.60.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "license": "MIT", - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "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/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/short-unique-id": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.3.2.tgz", - "integrity": "sha512-KRT/hufMSxXKEDSQujfVE0Faa/kZ51ihUcZQAcmP04t00DvPj7Ox5anHke1sJYUtzSuiT/Y5uyzg/W7bBEGhCg==", - "license": "Apache-2.0", - "bin": { - "short-unique-id": "bin/short-unique-id", - "suid": "bin/short-unique-id" - } - }, - "node_modules/should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "node_modules/should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "should-type": "^1.4.0" - } - }, - "node_modules/should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "node_modules/should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "node_modules/should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "dev": true, - "license": "MIT" - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "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==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/slugify": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", - "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "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==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", - "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/stickyfill": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", - "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==", - "dev": true - }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "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/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strnum": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", - "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/styled-components": { - "version": "6.3.12", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.3.12.tgz", - "integrity": "sha512-hFR6xsVkVYbsdcUlzPYFvFfoc6o2KlV0VvgRIQwSYMtdThM7SCxnjX9efh/cWce2kTq16I/Kl3xM98xiLptsXA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@emotion/is-prop-valid": "1.4.0", - "@emotion/unitless": "0.10.0", - "@types/stylis": "4.2.7", - "css-to-react-native": "3.2.0", - "csstype": "3.2.3", - "postcss": "8.4.49", - "shallowequal": "1.1.0", - "stylis": "4.3.6", - "tslib": "2.8.1" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "license": "MIT" - }, - "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/swagger-ui-dist": { - "version": "5.32.1", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.32.1.tgz", - "integrity": "sha512-6HQoo7+j8PA2QqP5kgAb9dl1uxUjvR0SAoL/WUp1sTEvm0F6D5npgU2OGCLwl++bIInqGlEUQ2mpuZRZYtyCzQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@scarf/scarf": "=1.4.0" - } - }, - "node_modules/swagger2openapi": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", - "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "call-me-maybe": "^1.0.1", - "node-fetch": "^2.6.1", - "node-fetch-h2": "^2.3.0", - "node-readfiles": "^0.2.0", - "oas-kit-common": "^1.0.8", - "oas-resolver": "^2.5.6", - "oas-schema-walker": "^1.1.5", - "oas-validator": "^5.0.8", - "reftools": "^1.1.9", - "yaml": "^1.10.0", - "yargs": "^17.0.1" - }, - "bin": { - "boast": "boast.js", - "oas-validate": "oas-validate.js", - "swagger2openapi": "swagger2openapi.js" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" - } - }, - "node_modules/swagger2openapi/node_modules/yaml": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", - "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tailwind-merge": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", - "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", - "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", - "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", - "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.0.27" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", - "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", - "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/ts-mixer": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", - "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", - "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", - "license": "(MIT OR CC0-1.0)", - "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "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.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "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.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unraw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", - "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", - "license": "MIT" - }, - "node_modules/until-async": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", - "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/kettanaito" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "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-replace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", - "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", - "dev": true, - "license": "BSD" - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "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": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "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": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "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 - } - } - }, - "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/vitest": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", - "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vitest/expect": "4.1.2", - "@vitest/mocker": "4.1.2", - "@vitest/pretty-format": "4.1.2", - "@vitest/runner": "4.1.2", - "@vitest/snapshot": "4.1.2", - "@vitest/spy": "4.1.2", - "@vitest/utils": "4.1.2", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.2", - "@vitest/browser-preview": "4.1.2", - "@vitest/browser-webdriverio": "4.1.2", - "@vitest/ui": "4.1.2", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", - "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", - "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", - "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", - "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", - "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", - "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", - "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", - "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", - "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", - "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", - "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", - "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", - "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", - "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", - "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", - "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", - "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", - "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", - "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", - "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", - "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", - "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", - "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@vitest/mocker": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", - "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.2", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/esbuild": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", - "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.4", - "@esbuild/android-arm": "0.27.4", - "@esbuild/android-arm64": "0.27.4", - "@esbuild/android-x64": "0.27.4", - "@esbuild/darwin-arm64": "0.27.4", - "@esbuild/darwin-x64": "0.27.4", - "@esbuild/freebsd-arm64": "0.27.4", - "@esbuild/freebsd-x64": "0.27.4", - "@esbuild/linux-arm": "0.27.4", - "@esbuild/linux-arm64": "0.27.4", - "@esbuild/linux-ia32": "0.27.4", - "@esbuild/linux-loong64": "0.27.4", - "@esbuild/linux-mips64el": "0.27.4", - "@esbuild/linux-ppc64": "0.27.4", - "@esbuild/linux-riscv64": "0.27.4", - "@esbuild/linux-s390x": "0.27.4", - "@esbuild/linux-x64": "0.27.4", - "@esbuild/netbsd-arm64": "0.27.4", - "@esbuild/netbsd-x64": "0.27.4", - "@esbuild/openbsd-arm64": "0.27.4", - "@esbuild/openbsd-x64": "0.27.4", - "@esbuild/openharmony-arm64": "0.27.4", - "@esbuild/sunos-x64": "0.27.4", - "@esbuild/win32-arm64": "0.27.4", - "@esbuild/win32-ia32": "0.27.4", - "@esbuild/win32-x64": "0.27.4" - } - }, - "node_modules/vitest/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/vitest/node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, - "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/vitest/node_modules/vite": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", - "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.12", - "tinyglobby": "^0.2.15" - }, - "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", - "@vitejs/devtools": "^0.1.0", - "esbuild": "^0.27.0", - "jiti": ">=1.21.0", - "less": "^4.0.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 - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "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/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "license": "MIT" - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/web-tree-sitter": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.7.tgz", - "integrity": "sha512-KiZhelTvBA/ziUHEO7Emb75cGVAq8iGZNabYaZm53Zpy50NsXyOW+xSHlwHt5CVg/TRPZBfeVLTTobF0LjFJ1w==", - "license": "MIT" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ws": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", - "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", - "dev": true, - "license": "MIT", - "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 - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "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/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zustand": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "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" - } - } - } + "name": "jentic-mini-ui", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "jentic-mini-ui", + "version": "0.1.0", + "license": "ISC", + "dependencies": { + "@jentic/arazzo-ui": "^1.0.0-alpha.29", + "@tanstack/react-query": "^5.90.21", + "clsx": "^2.1.1", + "lucide-react": "^0.363.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.30.3", + "tailwind-merge": "^3.5.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@playwright/test": "^1.58.2", + "@tailwindcss/vite": "^4.1.0", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/node": "^25.5.0", + "@types/react": "^18.3.28", + "@types/react-dom": "^18.3.7", + "@vitejs/plugin-react": "^4.7.0", + "@vitest/browser": "^4.1.2", + "@vitest/browser-playwright": "^4.1.2", + "@vitest/coverage-istanbul": "^4.1.2", + "axe-core": "^4.11.1", + "eslint": "^9.39.4", + "eslint-plugin-import-x": "^4.16.2", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-prettier": "^5.5.5", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-unused-imports": "^4.4.1", + "globals": "^17.4.0", + "husky": "^9.1.7", + "lint-staged": "^16.4.0", + "msw": "^2.12.14", + "prettier": "^3.8.1", + "prettier-plugin-tailwindcss": "^0.7.2", + "redoc": "^2.5.2", + "swagger-ui-dist": "^5.32.1", + "tailwindcss": "^4.1.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.58.0", + "vite": "^5.4.21", + "vitest": "^4.1.2" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "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.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@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-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "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.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "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.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "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.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", + "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.48.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@blazediff/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", + "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.2.tgz", + "integrity": "sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.1.2", + "@chevrotain/types": "11.1.2", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.2.tgz", + "integrity": "sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.1.2", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.2.tgz", + "integrity": "sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.2.tgz", + "integrity": "sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==", + "license": "Apache-2.0" + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "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.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "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.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "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.1", + "minimatch": "^3.1.5", + "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/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "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.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "dev": true, + "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.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "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/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "mlly": "^1.8.0" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jentic/arazzo-parser": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/@jentic/arazzo-parser/-/arazzo-parser-1.0.0-alpha.29.tgz", + "integrity": "sha512-Kbggm5d7oyJhnSv9wENCMeuv3nWy3eJu87LBxxASpAbxSzIm8w5Gisgd4i3cM4uOUmFNxuxZCPq8dqr7Nv06tA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-datamodel": "^4.2.0", + "@speclynx/apidom-error": "^4.2.0", + "@speclynx/apidom-ns-arazzo-1": "^4.2.0", + "@speclynx/apidom-parser-adapter-arazzo-json-1": "^4.2.0", + "@speclynx/apidom-parser-adapter-arazzo-yaml-1": "^4.2.0", + "@speclynx/apidom-parser-adapter-openapi-json-2": "^4.2.0", + "@speclynx/apidom-parser-adapter-openapi-json-3-0": "^4.2.0", + "@speclynx/apidom-parser-adapter-openapi-json-3-1": "^4.2.0", + "@speclynx/apidom-parser-adapter-openapi-yaml-2": "^4.2.0", + "@speclynx/apidom-parser-adapter-openapi-yaml-3-0": "^4.2.0", + "@speclynx/apidom-parser-adapter-openapi-yaml-3-1": "^4.2.0", + "@speclynx/apidom-reference": "^4.2.0", + "ramda-adjunct": "^6.0.0", + "type-fest": "^5.4.4" + } + }, + "node_modules/@jentic/arazzo-resolver": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/@jentic/arazzo-resolver/-/arazzo-resolver-1.0.0-alpha.29.tgz", + "integrity": "sha512-12fLJTzA/vIRBWMfVIlZIH+4yXwup5qFog5XWcUSiiMoZU85t3pQlJFl7UHHllReOBoGAFPNFSbi7w3bYlcjWQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@jentic/arazzo-parser": "1.0.0-alpha.29", + "@speclynx/apidom-datamodel": "^4.2.0", + "@speclynx/apidom-error": "^4.2.0", + "@speclynx/apidom-ns-arazzo-1": "^4.2.0", + "@speclynx/apidom-ns-openapi-2": "^4.2.0", + "@speclynx/apidom-ns-openapi-3-0": "^4.2.0", + "@speclynx/apidom-ns-openapi-3-1": "^4.2.0", + "@speclynx/apidom-reference": "^4.2.0", + "type-fest": "^5.4.4" + } + }, + "node_modules/@jentic/arazzo-ui": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/@jentic/arazzo-ui/-/arazzo-ui-1.0.0-alpha.29.tgz", + "integrity": "sha512-HL1IZpWlVrDgFcgsKbL+hB9a0Pb0gBcMAW51XhbrNWsYVmDclXFOidZqrg8S9qGadLm6KpdUuiKXKy4D5TgozQ==", + "license": "Apache-2.0", + "dependencies": { + "@jentic/arazzo-parser": "1.0.0-alpha.29", + "@jentic/arazzo-resolver": "1.0.0-alpha.29", + "@speclynx/apidom-core": "^4.2.0", + "mermaid": "^11.12.2", + "react-markdown": "^10.1.0", + "reactflow": "^11.10.4", + "rehype-highlight": "^7.0.2", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1" + }, + "bin": { + "arazzo-ui": "bin/arazzo-ui.mjs" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.1.tgz", + "integrity": "sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ==", + "license": "MIT", + "dependencies": { + "langium": "^4.0.0" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", + "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", + "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@package-json/types": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@package-json/types/-/types-0.0.12.tgz", + "integrity": "sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@reactflow/background": { + "version": "11.3.14", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.14.tgz", + "integrity": "sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/controls": { + "version": "11.2.14", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.14.tgz", + "integrity": "sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/core": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.4.tgz", + "integrity": "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==", + "license": "MIT", + "dependencies": { + "@types/d3": "^7.4.0", + "@types/d3-drag": "^3.0.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/minimap": { + "version": "11.7.14", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.14.tgz", + "integrity": "sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-resizer": { + "version": "2.2.14", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz", + "integrity": "sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "classcat": "^5.0.4", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-toolbar": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz", + "integrity": "sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@redocly/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/config": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.0.tgz", + "integrity": "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.34.11", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.11.tgz", + "integrity": "sha512-V09ayfnb5GyysmvARbt+voFZAjGcf7hSYxOYxSkCc4fbH/DTfq5YWoec8cflvmHHqyIFbqvmGKmYFzqhr9zxDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/ajv": "8.11.2", + "@redocly/config": "0.22.0", + "colorette": "1.4.0", + "https-proxy-agent": "7.0.6", + "js-levenshtein": "1.1.6", + "js-yaml": "4.1.1", + "minimatch": "5.1.9", + "pluralize": "8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0" + }, + "node_modules/@speclynx/apidom-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-core/-/apidom-core-4.2.0.tgz", + "integrity": "sha512-RT9gfKrKhbW0CIgcvQJgZ2c2IBy+jto3T1hCZ2QgyEu5h8m4bFcPZvnVkTWsRupQ9zEVO+3X8keVEhQiqsrOBQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "short-unique-id": "^5.3.2", + "ts-mixer": "^6.0.4", + "yaml": "^2.8.2" + } + }, + "node_modules/@speclynx/apidom-datamodel": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-datamodel/-/apidom-datamodel-4.2.0.tgz", + "integrity": "sha512-8/CFRGoDmeyJ8RxgHRSPRMaLA7VWOvG7EbXhSmBWeOZasozJuzY9J7qvM9OTtkAHDJA9yWnllCTs5RdaINacVw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-error": "4.2.0", + "ramda": "~0.32.0" + } + }, + "node_modules/@speclynx/apidom-error": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-error/-/apidom-error-4.2.0.tgz", + "integrity": "sha512-imqu1ZJG8F8pN7ivcP5zB7DZg1TD2QviDG4aA9plUeglV3xGgR3SfxoYSOXoWaMDbO+vYWfcTvM781E/tJC/zg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4" + } + }, + "node_modules/@speclynx/apidom-json-path": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-json-path/-/apidom-json-path-4.2.0.tgz", + "integrity": "sha512-bgnebLyE9qKvD+RTInOKIpLKT3Hbr0DAO1x7+pYyv0Yg6tjyhdCUqJ1tXXUFT8HGZaXPvNUgbRAIiHorxkVDcw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@swaggerexpert/jsonpath": "^4.0.3" + } + }, + "node_modules/@speclynx/apidom-json-pointer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-json-pointer/-/apidom-json-pointer-4.2.0.tgz", + "integrity": "sha512-EuA6DxFPPsDJcvhEkXFm5h1rnLFD97PgkOpg1z4BU8n2Ye1eSpMj9WWKGDbOR+GMtEqMfmiEiGFL1OFRCsgmaw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@swaggerexpert/json-pointer": "^3.0.1" + } + }, + "node_modules/@speclynx/apidom-ns-arazzo-1": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-4.2.0.tgz", + "integrity": "sha512-Tq6anyue84M3zS+LFrMjxge2/S0ZaGJj1/Hg8pD7wSK1v/8s8Wj4A8MGJjBzHjB64UUfHOU/xMpY9aUIArelqw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-json-schema-2020-12": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-ns-asyncapi-2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-4.2.0.tgz", + "integrity": "sha512-YFg2hi3FZ8MKQvAtTNPlK2HFMrhOqHNxFh/kdIQdQyZLSzVlPU11kymTXxTwmJyS003PCccvOGuwg9727EwokA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-json-schema-draft-7": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-ns-json-schema-2019-09": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-4.2.0.tgz", + "integrity": "sha512-ETbV4cBVQleAbCtBzTW4CetG6hQNtcdEKeq/nWCgd9ROHUJkQIYt+t3ZoQUi1Wg1yD0tcZvghZQb+dLnHDGG9g==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@speclynx/apidom-ns-json-schema-draft-6": "4.2.0", + "@speclynx/apidom-ns-json-schema-draft-7": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-ns-json-schema-2020-12": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-4.2.0.tgz", + "integrity": "sha512-w781db0AkLZNlTnxJ1hhCibTKVRmkCiQdpRLyTbGr45KfbyfDLEA5jIDNCwnB2M6lO+2OfuPk/BwpkevtAV6Eg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@speclynx/apidom-ns-json-schema-2019-09": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-ns-json-schema-draft-4": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-4.2.0.tgz", + "integrity": "sha512-mwbpfJEQXTL3TO+vov3JJPCaw6OnSWGG+U1he6GWzHwfYgIZ18TFALorfQK4QQhkEaiYTQp6TnwHHu1lPU9CaA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-ns-json-schema-draft-6": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-4.2.0.tgz", + "integrity": "sha512-8QrUb1bNeyLEVR/auU0uovWoVPYCHhJCoFSczqHJm5MaP+RArohus1R9XNZYV7kAhxDeUbDETZsA2idyMhPJ5g==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@speclynx/apidom-ns-json-schema-draft-4": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-ns-json-schema-draft-7": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-4.2.0.tgz", + "integrity": "sha512-9Q7wJsKUji342aEHGPMidh3TlOarMaC1rjxQjg34A8JP95FCZK1RITOiM68WDbmXMByZKN8DPF9lv7kJekEwxQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@speclynx/apidom-ns-json-schema-draft-6": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-ns-openapi-2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-openapi-2/-/apidom-ns-openapi-2-4.2.0.tgz", + "integrity": "sha512-F2MfH515aJ4B1+BYL18KyKSMReF8vSpXmMNRaKhv1xh3bpxW+gUa7AFh9Y72w3t9UojEdmgQ53OZcvnJf795vw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@speclynx/apidom-json-pointer": "4.2.0", + "@speclynx/apidom-ns-json-schema-draft-4": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-ns-openapi-3-0": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-4.2.0.tgz", + "integrity": "sha512-eMiSCXB32h3FO3M2fs+FRAh/AjURgVPS4LxZ2uSBinKp6N/AW0/Vj/TeBaJO27Mm79qUQvrn8D2EZIj1yb8kEA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@speclynx/apidom-json-pointer": "4.2.0", + "@speclynx/apidom-ns-json-schema-draft-4": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-ns-openapi-3-1": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-4.2.0.tgz", + "integrity": "sha512-EdhtXVIgiKd+nuhI1kPHMA9nz0/hGsxLpQzLOikIqUqrKU2I201GtYaGjXoMwSxgixugntQafhdZLcEO19Dp0g==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-json-pointer": "4.2.0", + "@speclynx/apidom-ns-json-schema-2020-12": "4.2.0", + "@speclynx/apidom-ns-openapi-3-0": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-arazzo-json-1": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-4.2.0.tgz", + "integrity": "sha512-VZyJsqVrzUYmmXn1BS2xc82NtMbDVhvPHVYBOPLbyZ9IvliMziAxC4dldQRNxxPZdQYWlxW/TGJX4plN5raBCw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-arazzo-1": "4.2.0", + "@speclynx/apidom-parser-adapter-json": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-arazzo-yaml-1": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-4.2.0.tgz", + "integrity": "sha512-Qxz0FbQo91SDXWsOfma44Y1YH72QSN4d9GrgXgahjRYDTVVcAEL8PAMXIuL+RVSl7ZXH3HYCCY01/1elqc9xQA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-arazzo-1": "4.2.0", + "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-asyncapi-json-2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-4.2.0.tgz", + "integrity": "sha512-UBknXA0cpbWBAY3c3xBBk0MBhUsZTXz1TxsDxlES3y7Bmt0lDQIqD65JHtDyp0n5ymBckGWPWZivHpkiQpSMPg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-asyncapi-2": "4.2.0", + "@speclynx/apidom-parser-adapter-json": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-asyncapi-yaml-2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-4.2.0.tgz", + "integrity": "sha512-GaJUGKIHxlkjhNG4RjZfZJlntueHKPxMQxWmnBG2IOt6HXMT/oABrwVfZ7lkfRLEh3OlQ7EHF41bQEE/lOt+6A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-asyncapi-2": "4.2.0", + "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-json": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-json/-/apidom-parser-adapter-json-4.2.0.tgz", + "integrity": "sha512-XcDn+o/FuvmXwSOpZRckpNWDLMDR907sep4Bezlrmm31oL6bSSGHmheelIGZbCoKJOgXYrwxJUhaQl0k343phA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "web-tree-sitter": "=0.26.7" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-openapi-json-2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-4.2.0.tgz", + "integrity": "sha512-owYFENwV2l++DnGSgFAtH8xS3Fqz8rRiXdPH5ugdPzFpz3B5Xywzu4eMtOf32nQJiQ9Ii7/bsz8ib7kgA4De7g==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-openapi-2": "4.2.0", + "@speclynx/apidom-parser-adapter-json": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-openapi-json-3-0": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-4.2.0.tgz", + "integrity": "sha512-siumXJl0gbL2x47yvxKijIdlGUO3ZCk2JLqcB2YFNyYW2Tph81zW6Sj2CQvrQD5xRqki7vgkXz9R8QN+TVrz2g==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-openapi-3-0": "4.2.0", + "@speclynx/apidom-parser-adapter-json": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-openapi-json-3-1": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-4.2.0.tgz", + "integrity": "sha512-Cpx9XqLV69dtdf30W08/8T2XYAcEMTRIfqq93fqHeIr8NX+hdjst38X8eCAroIP7usUvklBCiAuFk/buL22GZQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-openapi-3-1": "4.2.0", + "@speclynx/apidom-parser-adapter-json": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-openapi-yaml-2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-4.2.0.tgz", + "integrity": "sha512-K/Ol/srv/AkAGw8Eyn+jfEuz4rkHkWuXE6WN7mQ2chExNEclrRy9CDyYtd3vVRrWdiCPIlphRrBmJ+5nSQZunQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-openapi-2": "4.2.0", + "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-openapi-yaml-3-0": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-4.2.0.tgz", + "integrity": "sha512-P17qEHVSlJmFA5FMDgpWeEg8gm0HhqK74jZHGIXOC/vNexLf//V0qFA+9glmgglAbtvnRwFbUftUnTZS/9yIiQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-openapi-3-0": "4.2.0", + "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-openapi-yaml-3-1": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-4.2.0.tgz", + "integrity": "sha512-AsK43UevGQ8s/fivQIuOt+fWkFdj3sa/M5VuBzBWYfCYsJe1Rbuw8+PKrOPuP6gNng+T4pqOY7Ed2rqYGlFJ4Q==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-ns-openapi-3-1": "4.2.0", + "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-parser-adapter-yaml-1-2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-4.2.0.tgz", + "integrity": "sha512-DNjwtMYyjHBDxJQ5Snw2ZJfJTcuTSTtdnMTLOYbOj5B3PV52s0ZyIuNkvbDuwBxzyHmWGanoJXLH3IL4sEBO4Q==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0", + "unraw": "^3.0.0", + "web-tree-sitter": "=0.26.7", + "yaml": "^2.8.2" + } + }, + "node_modules/@speclynx/apidom-reference": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-reference/-/apidom-reference-4.2.0.tgz", + "integrity": "sha512-6Dir6WJ+C0eOvWGxKBHNmb0aPjPl7DKq4XdL8qH5ZrVqFV6yJklOKs+4VE6jTSBn1u742xNwrVShz63CT/D+3g==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-core": "4.2.0", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@speclynx/apidom-json-pointer": "4.2.0", + "@speclynx/apidom-ns-arazzo-1": "4.2.0", + "@speclynx/apidom-ns-asyncapi-2": "4.2.0", + "@speclynx/apidom-ns-json-schema-2020-12": "4.2.0", + "@speclynx/apidom-ns-openapi-2": "4.2.0", + "@speclynx/apidom-ns-openapi-3-0": "4.2.0", + "@speclynx/apidom-ns-openapi-3-1": "4.2.0", + "@speclynx/apidom-parser-adapter-arazzo-json-1": "4.2.0", + "@speclynx/apidom-parser-adapter-arazzo-yaml-1": "4.2.0", + "@speclynx/apidom-parser-adapter-asyncapi-json-2": "4.2.0", + "@speclynx/apidom-parser-adapter-asyncapi-yaml-2": "4.2.0", + "@speclynx/apidom-parser-adapter-json": "4.2.0", + "@speclynx/apidom-parser-adapter-openapi-json-2": "4.2.0", + "@speclynx/apidom-parser-adapter-openapi-json-3-0": "4.2.0", + "@speclynx/apidom-parser-adapter-openapi-json-3-1": "4.2.0", + "@speclynx/apidom-parser-adapter-openapi-yaml-2": "4.2.0", + "@speclynx/apidom-parser-adapter-openapi-yaml-3-0": "4.2.0", + "@speclynx/apidom-parser-adapter-openapi-yaml-3-1": "4.2.0", + "@speclynx/apidom-parser-adapter-yaml-1-2": "4.2.0", + "@speclynx/apidom-traverse": "4.2.0", + "@swaggerexpert/arazzo-runtime-expression": "^2.0.3", + "axios": "^1.13.5", + "picomatch": "^4.0.3", + "process": "^0.11.10", + "ramda": "~0.32.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@speclynx/apidom-traverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@speclynx/apidom-traverse/-/apidom-traverse-4.2.0.tgz", + "integrity": "sha512-7H2TnpwO17BuMyKs4fHVX06E/4/NX+BV3xT5ZXoj4DC0yBvleMYs/e+IWGX4c31hSM2FoCTPyUH2fVrzQzf+Lg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.28.4", + "@speclynx/apidom-datamodel": "4.2.0", + "@speclynx/apidom-error": "4.2.0", + "@speclynx/apidom-json-path": "4.2.0", + "@speclynx/apidom-json-pointer": "4.2.0", + "ramda-adjunct": "^6.0.0" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swaggerexpert/arazzo-runtime-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@swaggerexpert/arazzo-runtime-expression/-/arazzo-runtime-expression-2.0.3.tgz", + "integrity": "sha512-iGzCT3a6edX/LyQFhaR5l1JEyGtCQArGVjKDk8T7biaz24TE3CgDUMyeWzhGq9x7GBDj6KsxkI1WKEdERiDT5A==", + "license": "Apache-2.0", + "dependencies": { + "apg-lite": "^1.0.5" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/@swaggerexpert/json-pointer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@swaggerexpert/json-pointer/-/json-pointer-3.0.1.tgz", + "integrity": "sha512-ujx/rESoBo+/ytYh+kqP2pY3+M0WkbISfoR9N6/CazQMHkRrFqK/nmzO9tFg4DfdHmwEFcJEAhTtDDF1d0H9Hg==", + "license": "Apache-2.0", + "dependencies": { + "apg-lite": "^1.0.5" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@swaggerexpert/jsonpath": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@swaggerexpert/jsonpath/-/jsonpath-4.0.3.tgz", + "integrity": "sha512-ttXX1KATYGCdQbvXOAq7WN9WQ5Dx2Wshgj2M1dG4oARyPH5puxCVsAzB5qsz/2K08cJ6kNY6iOk6AlSj5zK/8g==", + "license": "Apache-2.0", + "dependencies": { + "apg-lite": "^1.0.5" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.96.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.96.0.tgz", + "integrity": "sha512-sfO3uQeol1BU7cRP6NYY7nAiX3GiNY20lI/dtSbKLwcIkYw/X+w/tEsQAkc544AfIhBX/IvH/QYtPHrPhyAKGw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.96.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.96.0.tgz", + "integrity": "sha512-6qbjdm1K5kizVKv9TNqhIN3doq2anRhdF2XaFMFSn4m8L22S69RV+FilvlyVT4RoJyMxtPU5rs4RpdFa/PEC7A==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.96.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "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 + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "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/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "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/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": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stylis": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.7.tgz", + "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "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/@typescript-eslint/eslint-plugin": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz", + "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.58.0", + "@typescript-eslint/type-utils": "8.58.0", + "@typescript-eslint/utils": "8.58.0", + "@typescript-eslint/visitor-keys": "8.58.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.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.58.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.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.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz", + "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.58.0", + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/typescript-estree": "8.58.0", + "@typescript-eslint/visitor-keys": "8.58.0", + "debug": "^4.4.3" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz", + "integrity": "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.58.0", + "@typescript-eslint/types": "^8.58.0", + "debug": "^4.4.3" + }, + "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 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz", + "integrity": "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/visitor-keys": "8.58.0" + }, + "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.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz", + "integrity": "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==", + "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 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz", + "integrity": "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/typescript-estree": "8.58.0", + "@typescript-eslint/utils": "8.58.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz", + "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==", + "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.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz", + "integrity": "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.58.0", + "@typescript-eslint/tsconfig-utils": "8.58.0", + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/visitor-keys": "8.58.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.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 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz", + "integrity": "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.58.0", + "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/typescript-estree": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz", + "integrity": "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@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" + } + }, + "node_modules/@vitest/browser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.2.tgz", + "integrity": "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@blazediff/core": "1.9.1", + "@vitest/mocker": "4.1.2", + "@vitest/utils": "4.1.2", + "magic-string": "^0.30.21", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.1.0", + "ws": "^8.19.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.2" + } + }, + "node_modules/@vitest/browser-playwright": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.2.tgz", + "integrity": "sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/browser": "4.1.2", + "@vitest/mocker": "4.1.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "4.1.2" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": false + } + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", + "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/browser-playwright/node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/@vitest/browser-playwright/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" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "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", + "optional": true, + "peer": true, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@vitest/browser-playwright/node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "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", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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/@vitest/browser/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/browser/node_modules/@vitest/mocker": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", + "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/browser/node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/@vitest/browser/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" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@vitest/browser/node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "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", + "optional": true, + "peer": true, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@vitest/browser/node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "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", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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/@vitest/coverage-istanbul": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-4.1.2.tgz", + "integrity": "sha512-WSz7+4a7PcMtMNvIP7AXUMffsq4JrWeJaguC8lg6fSQyGxSfaT4Rf81idqwxTT6qX5kjjZw2t9rAnCRRQobSqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@istanbuljs/schema": "^0.1.3", + "@jridgewell/gen-mapping": "^0.3.13", + "@jridgewell/trace-mapping": "0.3.31", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.2" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", + "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", + "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", + "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.2", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", + "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.2", + "@vitest/utils": "4.1.2", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", + "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", + "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.2", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "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==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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/ajv/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/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/apg-lite": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/apg-lite/-/apg-lite-1.0.5.tgz", + "integrity": "sha512-SlI+nLMQDzCZfS39ihzjGp3JNBQfJXyMi6cg9tkLOCPVErgFsUIAEdO9IezR7kbP5Xd0ozcPNQBkf9TO5cHgWw==", + "license": "BSD-2-Clause" + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.2.tgz", + "integrity": "sha512-byD6KPdvo72y/wj2T/4zGEvvlis+PsZsn/yPS3pEO+sFpcrqRpX/TJCxvVaEsNeMrfQbCr7w163YqoD9IYwHXw==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", + "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.12.tgz", + "integrity": "sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "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": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true, + "license": "MIT" + }, + "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/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001782", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001782.tgz", + "integrity": "sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==", + "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/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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/chalk/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?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/chevrotain": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.2.tgz", + "integrity": "sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.1.2", + "@chevrotain/gast": "11.1.2", + "@chevrotain/regexp-to-ast": "11.1.2", + "@chevrotain/types": "11.1.2", + "@chevrotain/utils": "11.1.2", + "lodash-es": "4.17.23" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "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/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/comment-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz", + "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "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/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "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.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.49.0.tgz", + "integrity": "sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decko": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", + "integrity": "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==", + "dev": true + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "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/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "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.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/dompurify": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", + "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.329", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.329.tgz", + "integrity": "sha512-/4t+AS1l4S3ZC0Ja7PHFIWeBIxGA3QGqV8/yKsP36v7NcyUCl+bIcmw6s5zVuMIECWwBrAK/6QLzTmbJChBboQ==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", + "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "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", + "math-intrinsics": "^1.1.0", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "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" + } + }, + "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-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/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "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.5", + "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-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.2.tgz", + "integrity": "sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@package-json/types": "^0.0.12", + "@typescript-eslint/types": "^8.56.0", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.9", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.1.2", + "semver": "^7.7.2", + "stable-hash-x": "^0.2.0", + "unrs-resolver": "^1.9.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "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", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "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" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "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/node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.4.1.tgz", + "integrity": "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "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/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/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/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "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-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "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/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "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-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.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/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-xml-builder": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", + "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.1.4", + "path-expression-matcher": "^1.2.0", + "strnum": "^2.2.2" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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/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.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "dev": true, + "license": "MIT" + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "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/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.7", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", + "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/graphql": { + "version": "16.13.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz", + "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "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-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "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-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "foreach": "^2.0.4" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "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/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/katex": { + "version": "0.16.44", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.44.tgz", + "integrity": "sha512-EkxoDTk8ufHqHlf9QxGwcxeLkWRR3iOuYfRpfORgYfqc8s13bgb+YtRY59NK5ZpRaCwq1kqA6a5lpX8C/eLphQ==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "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/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/langium": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz", + "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.1.1", + "chevrotain-allstar": "~0.3.1", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.1.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "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/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "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-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "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-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "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-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "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-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "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-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lint-staged": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz", + "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.3", + "listr2": "^9.0.5", + "picomatch": "^4.0.3", + "string-argv": "^0.3.2", + "tinyexec": "^1.0.4", + "yaml": "^2.8.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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/lowlight": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", + "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "highlight.js": "~11.11.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/lucide-react": { + "version": "0.363.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.363.0.tgz", + "integrity": "sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "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.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.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/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "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-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "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-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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-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-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^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/mermaid": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.13.0.tgz", + "integrity": "sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.0.1", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.33.1", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.19", + "dompurify": "^3.3.1", + "katex": "^0.16.25", + "khroma": "^2.1.0", + "lodash-es": "^4.17.23", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "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-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.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-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^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-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^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-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "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-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-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-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/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mobx": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.15.0.tgz", + "integrity": "sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + } + }, + "node_modules/mobx-react": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.2.0.tgz", + "integrity": "sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mobx-react-lite": "^4.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.9.0", + "react": "^16.8.0 || ^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mobx-react-lite": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.1.1.tgz", + "integrity": "sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.9.0", + "react": "^16.8.0 || ^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/msw": { + "version": "2.12.14", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.14.tgz", + "integrity": "sha512-4KXa4nVBIBjbDbd7vfQNuQ25eFxug0aropCQFoI0JdOBuJWamkT1yLVIWReFI8SiTRc+H1hKzaNk+cLk2N9rtQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.41.2", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.10.1", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.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==", + "dev": true, + "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/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "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/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-linter/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "dev": true, + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-sampler": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.2.tgz", + "integrity": "sha512-OKytvqB5XIaTgA9xtw8W8UTar+uymW2xPVpFN0NihMtuHPdPTGxBEhGnfFnJW5g/gOSIvkP+H0Xh3XhVI9/n7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.7", + "fast-xml-parser": "^5.5.1", + "json-pointer": "0.6.2" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "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/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "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-expression-matcher": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", + "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-scrollbar": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz", + "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "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.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.7.2.tgz", + "integrity": "sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/ramda": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.32.0.tgz", + "integrity": "sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/ramda-adjunct": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-6.0.0.tgz", + "integrity": "sha512-mdGCk0Gj3nQQ7lJ2XfuOFsc3GtfAn5jJWcQ/FuEPvP8E+gaXQ+z+3y/HtKGoYkrOWgE645VCdK54GNvKkXYQlw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda-adjunct" + }, + "peerDependencies": { + "ramda": ">= 0.32.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "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-router": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-tabs": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.1.1.tgz", + "integrity": "sha512-CPiuKoMFf89B7QlbFfdBD9XmUWiE3qudQputMVZB8GQvPJZRX/gqjDaDWOPDwGinEfpJKEuBCkGt83Tt4efeyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/reactflow": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.4.tgz", + "integrity": "sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==", + "license": "MIT", + "dependencies": { + "@reactflow/background": "11.3.14", + "@reactflow/controls": "11.2.14", + "@reactflow/core": "11.11.4", + "@reactflow/minimap": "11.7.14", + "@reactflow/node-resizer": "2.2.14", + "@reactflow/node-toolbar": "1.3.14" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redoc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.5.2.tgz", + "integrity": "sha512-sTJfItvRkcDTojB6wdLN4M+Ua6mlZwElV21Tf8Mn7IbQF/1Os6GvgQpZyLWPGZZHbhy7GC1Or1hTMHfz1vKh5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/openapi-core": "^1.4.0", + "classnames": "^2.3.2", + "decko": "^1.2.0", + "dompurify": "^3.2.4", + "eventemitter3": "^5.0.1", + "json-pointer": "^0.6.2", + "lunr": "^2.3.9", + "mark.js": "^8.11.1", + "marked": "^4.3.0", + "mobx-react": "9.2.0", + "openapi-sampler": "^1.6.2", + "path-browserify": "^1.0.1", + "perfect-scrollbar": "^1.5.5", + "polished": "^4.2.2", + "prismjs": "^1.29.0", + "prop-types": "^15.8.1", + "react-tabs": "^6.0.2", + "slugify": "~1.4.7", + "stickyfill": "^1.1.1", + "swagger2openapi": "^7.0.8", + "url-template": "^2.0.8" + }, + "engines": { + "node": ">=6.9", + "npm": ">=3.0.0" + }, + "peerDependencies": { + "core-js": "^3.1.4", + "mobx": "^6.0.4", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "styled-components": "^4.1.1 || ^5.1.1 || ^6.0.5" + } + }, + "node_modules/redoc/node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "dev": true, + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rehype-highlight": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.2.tgz", + "integrity": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-text": "^4.0.0", + "lowlight": "^3.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "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/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rettime": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", + "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", + "dev": true, + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "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.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "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-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/short-unique-id": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.3.2.tgz", + "integrity": "sha512-KRT/hufMSxXKEDSQujfVE0Faa/kZ51ihUcZQAcmP04t00DvPj7Ox5anHke1sJYUtzSuiT/Y5uyzg/W7bBEGhCg==", + "license": "Apache-2.0", + "bin": { + "short-unique-id": "bin/short-unique-id", + "suid": "bin/short-unique-id" + } + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slugify": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", + "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/stickyfill": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", + "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==", + "dev": true + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "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==", + "dev": true, + "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.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "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/strnum": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", + "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/styled-components": { + "version": "6.3.12", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.3.12.tgz", + "integrity": "sha512-hFR6xsVkVYbsdcUlzPYFvFfoc6o2KlV0VvgRIQwSYMtdThM7SCxnjX9efh/cWce2kTq16I/Kl3xM98xiLptsXA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "@emotion/unitless": "0.10.0", + "@types/stylis": "4.2.7", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.6", + "tslib": "2.8.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.32.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.32.1.tgz", + "integrity": "sha512-6HQoo7+j8PA2QqP5kgAb9dl1uxUjvR0SAoL/WUp1sTEvm0F6D5npgU2OGCLwl++bIInqGlEUQ2mpuZRZYtyCzQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/swagger2openapi/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", + "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.27" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", + "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "0BSD" + }, + "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/type-fest": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", + "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.0.tgz", + "integrity": "sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.58.0", + "@typescript-eslint/parser": "8.58.0", + "@typescript-eslint/typescript-estree": "8.58.0", + "@typescript-eslint/utils": "8.58.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "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.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "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.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unraw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", + "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "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" + } + }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "dev": true, + "license": "BSD" + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "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": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "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": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "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 + } + } + }, + "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/vitest": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", + "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.2", + "@vitest/mocker": "4.1.2", + "@vitest/pretty-format": "4.1.2", + "@vitest/runner": "4.1.2", + "@vitest/snapshot": "4.1.2", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.2", + "@vitest/browser-preview": "4.1.2", + "@vitest/browser-webdriverio": "4.1.2", + "@vitest/ui": "4.1.2", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", + "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/vitest/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/vitest/node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "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/vitest/node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "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", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-tree-sitter": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.7.tgz", + "integrity": "sha512-KiZhelTvBA/ziUHEO7Emb75cGVAq8iGZNabYaZm53Zpy50NsXyOW+xSHlwHt5CVg/TRPZBfeVLTTobF0LjFJ1w==", + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "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": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "dev": true, + "license": "MIT", + "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 + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "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/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "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/ui/package.json b/ui/package.json index 3709bf71..c6073461 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,55 +1,79 @@ { - "name": "jentic-mini-ui", - "version": "0.1.0", - "private": true, - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "lint": "eslint . --ext ts,tsx", - "test": "vitest", - "test:run": "vitest run", - "test:coverage": "vitest run --coverage", - "test:e2e": "playwright test", - "test:e2e:ui": "playwright test --ui", - "test:e2e:docker": "playwright test --config=playwright.docker.config.ts" - }, - "dependencies": { - "@jentic/arazzo-ui": "^1.0.0-alpha.29", - "@tanstack/react-query": "^5.90.21", - "clsx": "^2.1.1", - "lucide-react": "^0.363.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-router-dom": "^6.30.3", - "tailwind-merge": "^3.5.0" - }, - "devDependencies": { - "@playwright/test": "^1.58.2", - "@tailwindcss/vite": "^4.1.0", - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.2", - "@testing-library/user-event": "^14.6.1", - "@types/node": "^25.5.0", - "@types/react": "^18.3.28", - "@types/react-dom": "^18.3.7", - "@vitejs/plugin-react": "^4.7.0", - "@vitest/browser": "^4.1.2", - "@vitest/browser-playwright": "^4.1.2", - "@vitest/coverage-istanbul": "^4.1.2", - "axe-core": "^4.11.1", - "msw": "^2.12.14", - "redoc": "^2.5.2", - "swagger-ui-dist": "^5.32.1", - "tailwindcss": "^4.1.0", - "typescript": "^5.9.3", - "vite": "^5.4.21", - "vitest": "^4.1.2" - }, - "description": "", - "main": "vite.config.ts", - "keywords": [], - "author": "", - "license": "ISC" + "name": "jentic-mini-ui", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "test": "vitest", + "test:run": "vitest run", + "test:coverage": "vitest run --coverage", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", + "test:e2e:docker": "playwright test --config=playwright.docker.config.ts", + "prepare": "cd .. && husky || true" + }, + "dependencies": { + "@jentic/arazzo-ui": "^1.0.0-alpha.29", + "@tanstack/react-query": "^5.90.21", + "clsx": "^2.1.1", + "lucide-react": "^0.363.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.30.3", + "tailwind-merge": "^3.5.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@playwright/test": "^1.58.2", + "@tailwindcss/vite": "^4.1.0", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/node": "^25.5.0", + "@types/react": "^18.3.28", + "@types/react-dom": "^18.3.7", + "@vitejs/plugin-react": "^4.7.0", + "@vitest/browser": "^4.1.2", + "@vitest/browser-playwright": "^4.1.2", + "@vitest/coverage-istanbul": "^4.1.2", + "axe-core": "^4.11.1", + "eslint": "^9.39.4", + "eslint-plugin-import-x": "^4.16.2", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-prettier": "^5.5.5", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-unused-imports": "^4.4.1", + "globals": "^17.4.0", + "husky": "^9.1.7", + "lint-staged": "^16.4.0", + "msw": "^2.12.14", + "prettier": "^3.8.1", + "prettier-plugin-tailwindcss": "^0.7.2", + "redoc": "^2.5.2", + "swagger-ui-dist": "^5.32.1", + "tailwindcss": "^4.1.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.58.0", + "vite": "^5.4.21", + "vitest": "^4.1.2" + }, + "description": "", + "main": "vite.config.ts", + "keywords": [], + "author": "", + "license": "ISC", + "lint-staged": { + "*.{ts,tsx}": [ + "eslint --fix" + ], + "*.{json,css,md}": [ + "prettier --write" + ] + } } diff --git a/ui/playwright.config.ts b/ui/playwright.config.ts index 5abf46bb..e1b9a1d5 100644 --- a/ui/playwright.config.ts +++ b/ui/playwright.config.ts @@ -1,21 +1,21 @@ -import { defineConfig } from '@playwright/test' +import { defineConfig } from '@playwright/test'; export default defineConfig({ - testDir: './e2e', - testIgnore: '**/docker/**', - fullyParallel: true, - retries: process.env.CI ? 2 : 0, - workers: process.env.CI ? 1 : '50%', - reporter: [['html', { open: 'never' }]], - use: { - baseURL: process.env.E2E_BASE_URL || 'http://localhost:5173', - trace: 'on-first-retry', - screenshot: 'only-on-failure', - }, - webServer: { - command: 'npm run dev', - url: 'http://localhost:5173', - reuseExistingServer: !process.env.CI, - timeout: 30000, - }, -}) + testDir: './e2e', + testIgnore: '**/docker/**', + fullyParallel: true, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : '50%', + reporter: [['html', { open: 'never' }]], + use: { + baseURL: process.env.E2E_BASE_URL || 'http://localhost:5173', + trace: 'on-first-retry', + screenshot: 'only-on-failure', + }, + webServer: { + command: 'npm run dev', + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + timeout: 30000, + }, +}); diff --git a/ui/playwright.docker.config.ts b/ui/playwright.docker.config.ts index 229e2c90..9c599464 100644 --- a/ui/playwright.docker.config.ts +++ b/ui/playwright.docker.config.ts @@ -1,17 +1,22 @@ -import { defineConfig } from '@playwright/test' +import { defineConfig } from '@playwright/test'; export default defineConfig({ - testDir: './e2e/docker', - timeout: 30_000, - retries: 1, - workers: 1, - use: { - baseURL: 'http://localhost:8900', - trace: 'on-first-retry', - }, - projects: [ - { name: 'setup', testMatch: 'setup.spec.ts' }, - { name: 'e2e', testMatch: '*.spec.ts', testIgnore: 'setup.spec.ts', dependencies: ['setup'] }, - ], - reporter: [['html', { open: 'never' }]], -}) + testDir: './e2e/docker', + timeout: 30_000, + retries: 1, + workers: 1, + use: { + baseURL: 'http://localhost:8900', + trace: 'on-first-retry', + }, + projects: [ + { name: 'setup', testMatch: 'setup.spec.ts' }, + { + name: 'e2e', + testMatch: '*.spec.ts', + testIgnore: 'setup.spec.ts', + dependencies: ['setup'], + }, + ], + reporter: [['html', { open: 'never' }]], +}); diff --git a/ui/prettier.config.js b/ui/prettier.config.js new file mode 100644 index 00000000..c1b8595a --- /dev/null +++ b/ui/prettier.config.js @@ -0,0 +1,11 @@ +/** @type {import('prettier').Options} */ +export default { + useTabs: true, + tabWidth: 4, + singleQuote: true, + semi: true, + trailingComma: 'all', + printWidth: 100, + plugins: ['prettier-plugin-tailwindcss'], + tailwindFunctions: ['clsx'], +}; diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 3def1dbc..c8c9cbc3 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -1,57 +1,57 @@ -import { createBrowserRouter, RouterProvider } from 'react-router-dom' -import { Layout } from './components/layout/Layout' -import { AuthGuard } from './components/AuthGuard' -import SetupPage from './pages/SetupPage' -import LoginPage from './pages/LoginPage' -import DashboardPage from './pages/DashboardPage' -import SearchPage from './pages/SearchPage' -import CatalogPage from './pages/CatalogPage' -import ToolkitsPage from './pages/ToolkitsPage' -import ToolkitDetailPage from './pages/ToolkitDetailPage' -import CredentialsPage from './pages/CredentialsPage' -import OAuthBrokersPage from './pages/OAuthBrokersPage' -import CredentialFormPage from './pages/CredentialFormPage' -import WorkflowsPage from './pages/WorkflowsPage' -import WorkflowDetailPage from './pages/WorkflowDetailPage' -import TracesPage from './pages/TracesPage' -import JobsPage from './pages/JobsPage' -import JobDetailPage from './pages/JobDetailPage' -import TraceDetailPage from './pages/TraceDetailPage' -import ApprovalPage from './pages/ApprovalPage' +import { createBrowserRouter, RouterProvider } from 'react-router-dom'; +import { Layout } from '@/components/layout/Layout'; +import { AuthGuard } from '@/components/AuthGuard'; +import SetupPage from '@/pages/SetupPage'; +import LoginPage from '@/pages/LoginPage'; +import DashboardPage from '@/pages/DashboardPage'; +import SearchPage from '@/pages/SearchPage'; +import CatalogPage from '@/pages/CatalogPage'; +import ToolkitsPage from '@/pages/ToolkitsPage'; +import ToolkitDetailPage from '@/pages/ToolkitDetailPage'; +import CredentialsPage from '@/pages/CredentialsPage'; +import OAuthBrokersPage from '@/pages/OAuthBrokersPage'; +import CredentialFormPage from '@/pages/CredentialFormPage'; +import WorkflowsPage from '@/pages/WorkflowsPage'; +import WorkflowDetailPage from '@/pages/WorkflowDetailPage'; +import TracesPage from '@/pages/TracesPage'; +import JobsPage from '@/pages/JobsPage'; +import JobDetailPage from '@/pages/JobDetailPage'; +import TraceDetailPage from '@/pages/TraceDetailPage'; +import ApprovalPage from '@/pages/ApprovalPage'; const router = createBrowserRouter([ - { - element: , - children: [ - { path: '/setup', element: }, - { path: '/login', element: }, - // Approval page has minimal chrome — outside Layout - { path: '/approve/:toolkit_id/:req_id', element: }, - { - element: , - children: [ - { path: '/', element: }, - { path: '/search', element: }, - { path: '/catalog', element: }, - { path: '/workflows', element: }, - { path: '/workflows/:slug', element: }, - { path: '/toolkits', element: }, - { path: '/toolkits/new', element: }, - { path: '/toolkits/:id', element: }, - { path: '/credentials', element: }, - { path: '/credentials/new', element: }, - { path: '/credentials/:id/edit', element: }, - { path: '/oauth-brokers', element: }, - { path: '/traces', element: }, - { path: '/traces/:id', element: }, - { path: '/jobs', element: }, - { path: '/jobs/:id', element: }, - ] - } - ] - } -]) + { + element: , + children: [ + { path: '/setup', element: }, + { path: '/login', element: }, + // Approval page has minimal chrome — outside Layout + { path: '/approve/:toolkit_id/:req_id', element: }, + { + element: , + children: [ + { path: '/', element: }, + { path: '/search', element: }, + { path: '/catalog', element: }, + { path: '/workflows', element: }, + { path: '/workflows/:slug', element: }, + { path: '/toolkits', element: }, + { path: '/toolkits/new', element: }, + { path: '/toolkits/:id', element: }, + { path: '/credentials', element: }, + { path: '/credentials/new', element: }, + { path: '/credentials/:id/edit', element: }, + { path: '/oauth-brokers', element: }, + { path: '/traces', element: }, + { path: '/traces/:id', element: }, + { path: '/jobs', element: }, + { path: '/jobs/:id', element: }, + ], + }, + ], + }, +]); export default function App() { - return + return ; } diff --git a/ui/src/__tests__/components/AuthGuard.test.tsx b/ui/src/__tests__/components/AuthGuard.test.tsx index 539c859f..02180de9 100644 --- a/ui/src/__tests__/components/AuthGuard.test.tsx +++ b/ui/src/__tests__/components/AuthGuard.test.tsx @@ -1,111 +1,87 @@ -import { screen, renderWithProviders } from '../test-utils' -import { worker } from '../mocks/browser' -import { delay, http, HttpResponse } from 'msw' -import { AuthGuard } from '../../components/AuthGuard' -import { Routes, Route } from 'react-router-dom' +import { delay, http, HttpResponse } from 'msw'; +import { Routes, Route } from 'react-router-dom'; +import { screen, renderWithProviders } from '../test-utils'; +import { worker } from '../mocks/browser'; +import { AuthGuard } from '@/components/AuthGuard'; function renderWithAuth(initialRoute: string) { - return renderWithProviders( - - }> - Setup Page} /> - Login Page} /> - Dashboard} /> - Toolkits} /> - - , - { route: initialRoute, path: undefined }, - ) + return renderWithProviders( + + }> + Setup Page} /> + Login Page} /> + Dashboard} /> + Toolkits} /> + + , + { route: initialRoute, path: undefined }, + ); } describe('AuthGuard', () => { - it('shows loading state while checking auth', () => { - worker.use( - http.get('/health', async () => { - await delay('infinite') - return HttpResponse.json({ status: 'ok' }) - }), - ) + it('shows loading state while checking auth', () => { + worker.use( + http.get('/health', async () => { + await delay('infinite'); + return HttpResponse.json({ status: 'ok' }); + }), + ); - renderWithAuth('/') - expect(screen.getByText('Loading...')).toBeInTheDocument() - }) + renderWithAuth('/'); + expect(screen.getByText('Loading...')).toBeInTheDocument(); + }); - it('redirects to /setup when setup is required', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'setup_required' }), - ), - ) + it('redirects to /setup when setup is required', async () => { + worker.use(http.get('/health', () => HttpResponse.json({ status: 'setup_required' }))); - renderWithAuth('/toolkits') - expect(await screen.findByText('Setup Page')).toBeInTheDocument() - }) + renderWithAuth('/toolkits'); + expect(await screen.findByText('Setup Page')).toBeInTheDocument(); + }); - it('renders setup page when already on /setup', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'setup_required' }), - ), - ) + it('renders setup page when already on /setup', async () => { + worker.use(http.get('/health', () => HttpResponse.json({ status: 'setup_required' }))); - renderWithAuth('/setup') - expect(await screen.findByText('Setup Page')).toBeInTheDocument() - }) + renderWithAuth('/setup'); + expect(await screen.findByText('Setup Page')).toBeInTheDocument(); + }); - it('redirects to /login when not authenticated', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'ok' }), - ), - http.get('/user/me', () => - HttpResponse.json({ logged_in: false }), - ), - ) + it('redirects to /login when not authenticated', async () => { + worker.use( + http.get('/health', () => HttpResponse.json({ status: 'ok' })), + http.get('/user/me', () => HttpResponse.json({ logged_in: false })), + ); - renderWithAuth('/toolkits') - expect(await screen.findByText('Login Page')).toBeInTheDocument() - }) + renderWithAuth('/toolkits'); + expect(await screen.findByText('Login Page')).toBeInTheDocument(); + }); - it('renders protected page when authenticated', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'ok' }), - ), - http.get('/user/me', () => - HttpResponse.json({ logged_in: true, username: 'admin' }), - ), - ) + it('renders protected page when authenticated', async () => { + worker.use( + http.get('/health', () => HttpResponse.json({ status: 'ok' })), + http.get('/user/me', () => HttpResponse.json({ logged_in: true, username: 'admin' })), + ); - renderWithAuth('/toolkits') - expect(await screen.findByText('Toolkits')).toBeInTheDocument() - }) + renderWithAuth('/toolkits'); + expect(await screen.findByText('Toolkits')).toBeInTheDocument(); + }); - it('redirects authenticated user away from /login to /', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'ok' }), - ), - http.get('/user/me', () => - HttpResponse.json({ logged_in: true, username: 'admin' }), - ), - ) + it('redirects authenticated user away from /login to /', async () => { + worker.use( + http.get('/health', () => HttpResponse.json({ status: 'ok' })), + http.get('/user/me', () => HttpResponse.json({ logged_in: true, username: 'admin' })), + ); - renderWithAuth('/login') - expect(await screen.findByText('Dashboard')).toBeInTheDocument() - }) + renderWithAuth('/login'); + expect(await screen.findByText('Dashboard')).toBeInTheDocument(); + }); - it('redirects authenticated user away from /setup to /', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'ok' }), - ), - http.get('/user/me', () => - HttpResponse.json({ logged_in: true, username: 'admin' }), - ), - ) + it('redirects authenticated user away from /setup to /', async () => { + worker.use( + http.get('/health', () => HttpResponse.json({ status: 'ok' })), + http.get('/user/me', () => HttpResponse.json({ logged_in: true, username: 'admin' })), + ); - renderWithAuth('/setup') - expect(await screen.findByText('Dashboard')).toBeInTheDocument() - }) -}) + renderWithAuth('/setup'); + expect(await screen.findByText('Dashboard')).toBeInTheDocument(); + }); +}); diff --git a/ui/src/__tests__/components/Badge.test.tsx b/ui/src/__tests__/components/Badge.test.tsx index 944aa952..57932886 100644 --- a/ui/src/__tests__/components/Badge.test.tsx +++ b/ui/src/__tests__/components/Badge.test.tsx @@ -1,52 +1,52 @@ -import { render, screen } from '@testing-library/react' -import { Badge, MethodBadge, StatusBadge } from '../../components/ui/Badge' +import { render, screen } from '@testing-library/react'; +import { Badge, MethodBadge, StatusBadge } from '@/components/ui/Badge'; describe('Badge', () => { - it('renders children text', () => { - render(active) - expect(screen.getByText('active')).toBeInTheDocument() - }) - - it('renders with each variant without crashing', () => { - const variants = ['default', 'success', 'warning', 'danger', 'pending'] as const - for (const variant of variants) { - const { unmount } = render({variant}) - expect(screen.getByText(variant)).toBeInTheDocument() - unmount() - } - }) -}) + it('renders children text', () => { + render(active); + expect(screen.getByText('active')).toBeInTheDocument(); + }); + + it('renders with each variant without crashing', () => { + const variants = ['default', 'success', 'warning', 'danger', 'pending'] as const; + for (const variant of variants) { + const { unmount } = render({variant}); + expect(screen.getByText(variant)).toBeInTheDocument(); + unmount(); + } + }); +}); describe('MethodBadge', () => { - it('renders the HTTP method in uppercase', () => { - render() - expect(screen.getByText('GET')).toBeInTheDocument() - }) - - it('shows "?" when method is null', () => { - render() - expect(screen.getByText('?')).toBeInTheDocument() - }) - - it('shows "?" when method is undefined', () => { - render() - expect(screen.getByText('?')).toBeInTheDocument() - }) -}) + it('renders the HTTP method in uppercase', () => { + render(); + expect(screen.getByText('GET')).toBeInTheDocument(); + }); + + it('shows "?" when method is null', () => { + render(); + expect(screen.getByText('?')).toBeInTheDocument(); + }); + + it('shows "?" when method is undefined', () => { + render(); + expect(screen.getByText('?')).toBeInTheDocument(); + }); +}); describe('StatusBadge', () => { - it('renders the status code', () => { - render() - expect(screen.getByText('200')).toBeInTheDocument() - }) - - it('returns null for falsy status', () => { - const { container } = render() - expect(container).toBeEmptyDOMElement() - }) - - it('returns null for zero status', () => { - const { container } = render() - expect(container).toBeEmptyDOMElement() - }) -}) + it('renders the status code', () => { + render(); + expect(screen.getByText('200')).toBeInTheDocument(); + }); + + it('returns null for falsy status', () => { + const { container } = render(); + expect(container).toBeEmptyDOMElement(); + }); + + it('returns null for zero status', () => { + const { container } = render(); + expect(container).toBeEmptyDOMElement(); + }); +}); diff --git a/ui/src/__tests__/components/Button.test.tsx b/ui/src/__tests__/components/Button.test.tsx index a8c13d55..4635f4b5 100644 --- a/ui/src/__tests__/components/Button.test.tsx +++ b/ui/src/__tests__/components/Button.test.tsx @@ -1,38 +1,42 @@ -import { render, screen, fireEvent } from '@testing-library/react' -import { Button } from '../../components/ui/Button' +import { render, screen, fireEvent } from '@testing-library/react'; +import { Button } from '@/components/ui/Button'; describe('Button', () => { - it('renders children text', () => { - render() - expect(screen.getByRole('button', { name: 'Save' })).toBeInTheDocument() - }) + it('renders children text', () => { + render(); + expect(screen.getByRole('button', { name: 'Save' })).toBeInTheDocument(); + }); - it('fires onClick when clicked', () => { - const onClick = vi.fn() - render() - fireEvent.click(screen.getByRole('button')) - expect(onClick).toHaveBeenCalledOnce() - }) + it('fires onClick when clicked', () => { + const onClick = vi.fn(); + render(); + fireEvent.click(screen.getByRole('button')); + expect(onClick).toHaveBeenCalledOnce(); + }); - it('is disabled when disabled prop is true', () => { - render() - expect(screen.getByRole('button')).toBeDisabled() - }) + it('is disabled when disabled prop is true', () => { + render(); + expect(screen.getByRole('button')).toBeDisabled(); + }); - it('is disabled when loading prop is true', () => { - render() - expect(screen.getByRole('button')).toBeDisabled() - }) + it('is disabled when loading prop is true', () => { + render(); + expect(screen.getByRole('button')).toBeDisabled(); + }); - it('shows a spinner when loading', () => { - render() - const button = screen.getByRole('button') - expect(button.querySelector('svg')).toBeTruthy() - }) + it('shows a spinner when loading', () => { + render(); + const button = screen.getByRole('button'); + expect(button.querySelector('svg')).toBeTruthy(); + }); - it('forwards additional HTML attributes', () => { - render() - const button = screen.getByTestId('submit-btn') - expect(button).toHaveAttribute('type', 'submit') - }) -}) + it('forwards additional HTML attributes', () => { + render( + , + ); + const button = screen.getByTestId('submit-btn'); + expect(button).toHaveAttribute('type', 'submit'); + }); +}); diff --git a/ui/src/__tests__/components/Card.test.tsx b/ui/src/__tests__/components/Card.test.tsx index 679a9b4d..876dc859 100644 --- a/ui/src/__tests__/components/Card.test.tsx +++ b/ui/src/__tests__/components/Card.test.tsx @@ -1,37 +1,37 @@ -import { render, screen, fireEvent } from '@testing-library/react' -import { Card, CardHeader, CardBody, CardTitle } from '../../components/ui/Card' +import { render, screen, fireEvent } from '@testing-library/react'; +import { Card, CardHeader, CardBody, CardTitle } from '@/components/ui/Card'; describe('Card', () => { - it('renders children', () => { - render(Card content) - expect(screen.getByText('Card content')).toBeInTheDocument() - }) + it('renders children', () => { + render(Card content); + expect(screen.getByText('Card content')).toBeInTheDocument(); + }); - it('calls onClick when clicked', () => { - const onClick = vi.fn() - render(Clickable) - fireEvent.click(screen.getByText('Clickable')) - expect(onClick).toHaveBeenCalledOnce() - }) -}) + it('calls onClick when clicked', () => { + const onClick = vi.fn(); + render(Clickable); + fireEvent.click(screen.getByText('Clickable')); + expect(onClick).toHaveBeenCalledOnce(); + }); +}); describe('CardHeader', () => { - it('renders children', () => { - render(Header) - expect(screen.getByText('Header')).toBeInTheDocument() - }) -}) + it('renders children', () => { + render(Header); + expect(screen.getByText('Header')).toBeInTheDocument(); + }); +}); describe('CardBody', () => { - it('renders children', () => { - render(Body) - expect(screen.getByText('Body')).toBeInTheDocument() - }) -}) + it('renders children', () => { + render(Body); + expect(screen.getByText('Body')).toBeInTheDocument(); + }); +}); describe('CardTitle', () => { - it('renders as an h3 heading', () => { - render(My Title) - expect(screen.getByRole('heading', { level: 3, name: 'My Title' })).toBeInTheDocument() - }) -}) + it('renders as an h3 heading', () => { + render(My Title); + expect(screen.getByRole('heading', { level: 3, name: 'My Title' })).toBeInTheDocument(); + }); +}); diff --git a/ui/src/__tests__/components/ConfirmInline.test.tsx b/ui/src/__tests__/components/ConfirmInline.test.tsx index 83211ab6..f42840c8 100644 --- a/ui/src/__tests__/components/ConfirmInline.test.tsx +++ b/ui/src/__tests__/components/ConfirmInline.test.tsx @@ -1,73 +1,73 @@ -import { render, screen, fireEvent } from '@testing-library/react' -import { ConfirmInline } from '../../components/ui/ConfirmInline' +import { render, screen, fireEvent } from '@testing-library/react'; +import { ConfirmInline } from '@/components/ui/ConfirmInline'; describe('ConfirmInline', () => { - it('renders the trigger element initially', () => { - render( - {}} message="Are you sure?"> - - - ) - expect(screen.getByRole('button', { name: 'Delete' })).toBeInTheDocument() - expect(screen.queryByText('Are you sure?')).not.toBeInTheDocument() - }) + it('renders the trigger element initially', () => { + render( + {}} message="Are you sure?"> + + , + ); + expect(screen.getByRole('button', { name: 'Delete' })).toBeInTheDocument(); + expect(screen.queryByText('Are you sure?')).not.toBeInTheDocument(); + }); - it('shows confirmation message and buttons on trigger click', () => { - render( - {}} message="Are you sure?"> - - - ) - fireEvent.click(screen.getByRole('button', { name: 'Delete' })) - expect(screen.getByText('Are you sure?')).toBeInTheDocument() - expect(screen.getByRole('button', { name: 'Confirm' })).toBeInTheDocument() - expect(screen.getByRole('button', { name: 'Cancel' })).toBeInTheDocument() - }) + it('shows confirmation message and buttons on trigger click', () => { + render( + {}} message="Are you sure?"> + + , + ); + fireEvent.click(screen.getByRole('button', { name: 'Delete' })); + expect(screen.getByText('Are you sure?')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Confirm' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Cancel' })).toBeInTheDocument(); + }); - it('calls onConfirm when confirm is clicked', () => { - const onConfirm = vi.fn() - render( - - - - ) - fireEvent.click(screen.getByRole('button', { name: 'Delete' })) - fireEvent.click(screen.getByRole('button', { name: 'Confirm' })) - expect(onConfirm).toHaveBeenCalledOnce() - }) + it('calls onConfirm when confirm is clicked', () => { + const onConfirm = vi.fn(); + render( + + + , + ); + fireEvent.click(screen.getByRole('button', { name: 'Delete' })); + fireEvent.click(screen.getByRole('button', { name: 'Confirm' })); + expect(onConfirm).toHaveBeenCalledOnce(); + }); - it('reverts to trigger when cancel is clicked', () => { - render( - {}} message="Delete this?"> - - - ) - fireEvent.click(screen.getByRole('button', { name: 'Delete' })) - fireEvent.click(screen.getByRole('button', { name: 'Cancel' })) - expect(screen.getByRole('button', { name: 'Delete' })).toBeInTheDocument() - expect(screen.queryByText('Delete this?')).not.toBeInTheDocument() - }) + it('reverts to trigger when cancel is clicked', () => { + render( + {}} message="Delete this?"> + + , + ); + fireEvent.click(screen.getByRole('button', { name: 'Delete' })); + fireEvent.click(screen.getByRole('button', { name: 'Cancel' })); + expect(screen.getByRole('button', { name: 'Delete' })).toBeInTheDocument(); + expect(screen.queryByText('Delete this?')).not.toBeInTheDocument(); + }); - it('uses custom confirm label', () => { - render( - {}} message="Really?" confirmLabel="Yes, delete"> - - - ) - fireEvent.click(screen.getByRole('button', { name: 'Remove' })) - expect(screen.getByRole('button', { name: 'Yes, delete' })).toBeInTheDocument() - }) + it('uses custom confirm label', () => { + render( + {}} message="Really?" confirmLabel="Yes, delete"> + + , + ); + fireEvent.click(screen.getByRole('button', { name: 'Remove' })); + expect(screen.getByRole('button', { name: 'Yes, delete' })).toBeInTheDocument(); + }); - it('stops event propagation on trigger click', () => { - const outerClick = vi.fn() - render( -
- {}} message="Sure?"> - - -
- ) - fireEvent.click(screen.getByRole('button', { name: 'Delete' })) - expect(outerClick).not.toHaveBeenCalled() - }) -}) + it('stops event propagation on trigger click', () => { + const outerClick = vi.fn(); + render( +
+ {}} message="Sure?"> + + +
, + ); + fireEvent.click(screen.getByRole('button', { name: 'Delete' })); + expect(outerClick).not.toHaveBeenCalled(); + }); +}); diff --git a/ui/src/__tests__/hooks/useUpdateCheck.test.ts b/ui/src/__tests__/hooks/useUpdateCheck.test.ts index 053cbfed..99ee3148 100644 --- a/ui/src/__tests__/hooks/useUpdateCheck.test.ts +++ b/ui/src/__tests__/hooks/useUpdateCheck.test.ts @@ -5,82 +5,85 @@ */ function parseSemver(v: string): number[] { - return v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0) + return v + .replace(/^v/, '') + .split('.') + .map((n) => parseInt(n, 10) || 0); } function isSemver(v: string): boolean { - return /^\d+\.\d+\.\d+/.test(v.replace(/^v/, '')) + return /^\d+\.\d+\.\d+/.test(v.replace(/^v/, '')); } function isNewer(latest: string, current: string): boolean { - if (!isSemver(latest) || !isSemver(current)) return false - const l = parseSemver(latest) - const c = parseSemver(current) - for (let i = 0; i < 3; i++) { - if ((l[i] ?? 0) > (c[i] ?? 0)) return true - if ((l[i] ?? 0) < (c[i] ?? 0)) return false - } - return false + if (!isSemver(latest) || !isSemver(current)) return false; + const l = parseSemver(latest); + const c = parseSemver(current); + for (let i = 0; i < 3; i++) { + if ((l[i] ?? 0) > (c[i] ?? 0)) return true; + if ((l[i] ?? 0) < (c[i] ?? 0)) return false; + } + return false; } describe('parseSemver', () => { - it('parses "1.2.3" into [1, 2, 3]', () => { - expect(parseSemver('1.2.3')).toEqual([1, 2, 3]) - }) + it('parses "1.2.3" into [1, 2, 3]', () => { + expect(parseSemver('1.2.3')).toEqual([1, 2, 3]); + }); - it('strips leading "v"', () => { - expect(parseSemver('v1.0.0')).toEqual([1, 0, 0]) - }) + it('strips leading "v"', () => { + expect(parseSemver('v1.0.0')).toEqual([1, 0, 0]); + }); - it('handles non-numeric segments as 0', () => { - expect(parseSemver('1.2.beta')).toEqual([1, 2, 0]) - }) -}) + it('handles non-numeric segments as 0', () => { + expect(parseSemver('1.2.beta')).toEqual([1, 2, 0]); + }); +}); describe('isSemver', () => { - it('returns true for valid semver', () => { - expect(isSemver('1.0.0')).toBe(true) - expect(isSemver('0.3.1')).toBe(true) - }) - - it('returns true for v-prefixed semver', () => { - expect(isSemver('v1.2.3')).toBe(true) - }) - - it('returns true for semver with suffix (prefix match)', () => { - expect(isSemver('1.2.3-beta')).toBe(true) - }) - - it('returns false for non-semver strings', () => { - expect(isSemver('unknown')).toBe(false) - expect(isSemver('')).toBe(false) - expect(isSemver('latest')).toBe(false) - }) -}) + it('returns true for valid semver', () => { + expect(isSemver('1.0.0')).toBe(true); + expect(isSemver('0.3.1')).toBe(true); + }); + + it('returns true for v-prefixed semver', () => { + expect(isSemver('v1.2.3')).toBe(true); + }); + + it('returns true for semver with suffix (prefix match)', () => { + expect(isSemver('1.2.3-beta')).toBe(true); + }); + + it('returns false for non-semver strings', () => { + expect(isSemver('unknown')).toBe(false); + expect(isSemver('')).toBe(false); + expect(isSemver('latest')).toBe(false); + }); +}); describe('isNewer', () => { - it('returns true when latest > current (patch)', () => { - expect(isNewer('1.0.1', '1.0.0')).toBe(true) - }) - - it('returns true when latest > current (minor)', () => { - expect(isNewer('1.1.0', '1.0.0')).toBe(true) - }) - - it('returns true when latest > current (major)', () => { - expect(isNewer('2.0.0', '1.9.9')).toBe(true) - }) - - it('returns false when versions are equal', () => { - expect(isNewer('1.0.0', '1.0.0')).toBe(false) - }) - - it('returns false when latest < current', () => { - expect(isNewer('0.9.0', '1.0.0')).toBe(false) - }) - - it('returns false for non-semver input', () => { - expect(isNewer('unknown', '1.0.0')).toBe(false) - expect(isNewer('1.0.0', 'unknown')).toBe(false) - }) -}) + it('returns true when latest > current (patch)', () => { + expect(isNewer('1.0.1', '1.0.0')).toBe(true); + }); + + it('returns true when latest > current (minor)', () => { + expect(isNewer('1.1.0', '1.0.0')).toBe(true); + }); + + it('returns true when latest > current (major)', () => { + expect(isNewer('2.0.0', '1.9.9')).toBe(true); + }); + + it('returns false when versions are equal', () => { + expect(isNewer('1.0.0', '1.0.0')).toBe(false); + }); + + it('returns false when latest < current', () => { + expect(isNewer('0.9.0', '1.0.0')).toBe(false); + }); + + it('returns false for non-semver input', () => { + expect(isNewer('unknown', '1.0.0')).toBe(false); + expect(isNewer('1.0.0', 'unknown')).toBe(false); + }); +}); diff --git a/ui/src/__tests__/mocks/browser.ts b/ui/src/__tests__/mocks/browser.ts index 4dd03f09..0a564278 100644 --- a/ui/src/__tests__/mocks/browser.ts +++ b/ui/src/__tests__/mocks/browser.ts @@ -1,4 +1,4 @@ -import { setupWorker } from 'msw/browser' -import { handlers } from './handlers' +import { setupWorker } from 'msw/browser'; +import { handlers } from './handlers'; -export const worker = setupWorker(...handlers) +export const worker = setupWorker(...handlers); diff --git a/ui/src/__tests__/mocks/handlers.ts b/ui/src/__tests__/mocks/handlers.ts index 2d97aac2..162741e0 100644 --- a/ui/src/__tests__/mocks/handlers.ts +++ b/ui/src/__tests__/mocks/handlers.ts @@ -1,4 +1,4 @@ -import { http, HttpResponse } from 'msw' +import { http, HttpResponse } from 'msw'; /** * Default "happy path" MSW handlers. @@ -8,204 +8,187 @@ import { http, HttpResponse } from 'msw' * If BASE is ever set to an absolute URL, update these to match. */ export const handlers = [ - // ── Auth & health ─────────────────────────────────────────────── - http.get('/health', () => - HttpResponse.json({ status: 'ok' }), - ), - - http.get('/user/me', () => - HttpResponse.json({ logged_in: true, username: 'admin', role: 'admin' }), - ), - - http.post('/user/login', () => - HttpResponse.json({ logged_in: true, username: 'admin' }), - ), - - http.post('/user/logout', () => - HttpResponse.json({ logged_out: true }), - ), - - http.get('/version', () => - HttpResponse.json({ current: '0.3.0', latest: '0.3.0' }), - ), - - // ── Dashboard data ────────────────────────────────────────────── - http.get('/apis', () => - HttpResponse.json({ data: [], total: 0, page: 1 }), - ), - - http.get('/toolkits', () => HttpResponse.json([])), - - http.get('/workflows', () => HttpResponse.json([])), - - http.get('/traces', () => - HttpResponse.json({ traces: [], total: 0 }), - ), - - // ── Toolkit detail ────────────────────────────────────────────── - http.get('/toolkits/:id', ({ params }) => - HttpResponse.json({ - id: params.id, - name: 'Test Toolkit', - description: 'A test toolkit', - simulate: false, - disabled: false, - keys: [], - credentials: [], - }), - ), - - http.get('/toolkits/:id/keys', () => - HttpResponse.json({ keys: [] }), - ), - - http.get('/toolkits/:id/access-requests', () => - HttpResponse.json([]), - ), - - http.get('/toolkits/:id/credentials', () => - HttpResponse.json([]), - ), - - // ── Toolkit mutations ─────────────────────────────────────────── - http.post('/toolkits', () => - HttpResponse.json({ id: 'new-tk', name: 'New Toolkit', description: '', credentials: [] }), - ), - - http.patch('/toolkits/:id', ({ params }) => - HttpResponse.json({ id: params.id, name: 'Updated Toolkit', description: 'Updated', disabled: false, credentials: [] }), - ), - - http.delete('/toolkits/:id', () => - new HttpResponse(null, { status: 204 }), - ), - - http.post('/toolkits/:id/keys', () => - HttpResponse.json({ id: 'new-key', key: 'jntc_test_generated_key_123', prefix: 'jntc_test', label: null, created_at: Math.floor(Date.now() / 1000) }), - ), - - http.delete('/toolkits/:id/keys/:keyId', () => - new HttpResponse(null, { status: 204 }), - ), - - http.post('/toolkits/:id/access-requests', () => - HttpResponse.json({ id: 'req-new', status: 'pending', approve_url: '/approve/test-tk/req-new' }), - ), - - http.get('/toolkits/:id/credentials/:credId/permissions', () => - HttpResponse.json([]), - ), - - http.put('/toolkits/:id/credentials/:credId/permissions', () => - HttpResponse.json({ ok: true }), - ), - - http.delete('/toolkits/:id/credentials/:credId', () => - new HttpResponse(null, { status: 204 }), - ), - - // ── Credentials ───────────────────────────────────────────────── - http.get('/credentials', () => - HttpResponse.json({ data: [], total: 0 }), - ), - - http.get('/credentials/:id', ({ params }) => - HttpResponse.json({ - id: params.id, - label: 'Test Credential', - api_id: 'test-api', - auth_type: 'bearer', - }), - ), - - http.post('/credentials', async ({ request }) => { - const body = await request.json() as Record - return HttpResponse.json({ id: 'cred-new', ...body }) - }), - - http.patch('/credentials/:id', async ({ params, request }) => { - const body = await request.json() as Record - return HttpResponse.json({ id: params.id, ...body }) - }), - - http.delete('/credentials/:id', () => - new HttpResponse(null, { status: 204 }), - ), - - // ── API detail (for credential form) ──────────────────────────── - http.get('/apis/:id', ({ params }) => - HttpResponse.json({ - id: params.id, - name: 'Test API', - source: 'local', - security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, - }), - ), - - // ── Search & inspect ────────────────────────────────────────── - http.get('/search', () => HttpResponse.json([])), - http.get('/inspect/:id', () => - HttpResponse.json({ capability_id: 'test-cap', method: 'GET', path: '/test', summary: 'Test operation' }), - ), - - // ── Catalog ───────────────────────────────────────────────────── - http.get('/catalog', () => HttpResponse.json([])), - http.get('/catalog/:id', () => - HttpResponse.json({ id: 'test-api', name: 'Test API', spec_url: 'https://example.com/openapi.json' }), - ), - http.post('/catalog/refresh', () => - HttpResponse.json({ status: 'ok' }), - ), - http.post('/import', () => - HttpResponse.json({ id: 'import-1', status: 'ok' }), - ), - - // ── Approval ────────────────────────────────────────────────── - http.get('/toolkits/:id/access-requests/:reqId', ({ params }) => - HttpResponse.json({ - id: params.reqId, - toolkit_id: params.id, - type: 'grant', - status: 'pending', - reason: 'Need access', - created_at: Math.floor(Date.now() / 1000), - payload: { credential_id: 'cred-1', api_id: 'test-api', rules: [] }, - }), - ), - http.post('/toolkits/:id/access-requests/:reqId/approve', () => - HttpResponse.json({ status: 'approved' }), - ), - http.post('/toolkits/:id/access-requests/:reqId/deny', () => - HttpResponse.json({ status: 'denied' }), - ), - - // ── Jobs ────────────────────────────────────────────────────── - http.get('/jobs', () => - HttpResponse.json({ items: [], total: 0 }), - ), - http.delete('/jobs/:id', () => - new HttpResponse(null, { status: 204 }), - ), - - // ── OAuth brokers ───────────────────────────────────────────── - http.get('/oauth-brokers', () => HttpResponse.json([])), - http.post('/oauth-brokers', async ({ request }) => { - const body = await request.json() as Record - return HttpResponse.json({ id: 'broker-new', ...body }) - }), - - // ── API operations ──────────────────────────────────────────── - http.get('/apis/:id/operations', () => - HttpResponse.json({ items: [], total: 0 }), - ), - - // ── Default API key ───────────────────────────────────────────── - http.post('/default-api-key/generate', () => - HttpResponse.json({ key: 'jntc_test_key_abc123' }), - ), - - // ── User creation ─────────────────────────────────────────────── - http.post('/user/create', () => - HttpResponse.json({ username: 'admin' }), - ), -] + // ── Auth & health ─────────────────────────────────────────────── + http.get('/health', () => HttpResponse.json({ status: 'ok' })), + + http.get('/user/me', () => + HttpResponse.json({ logged_in: true, username: 'admin', role: 'admin' }), + ), + + http.post('/user/login', () => HttpResponse.json({ logged_in: true, username: 'admin' })), + + http.post('/user/logout', () => HttpResponse.json({ logged_out: true })), + + http.get('/version', () => HttpResponse.json({ current: '0.3.0', latest: '0.3.0' })), + + // ── Dashboard data ────────────────────────────────────────────── + http.get('/apis', () => HttpResponse.json({ data: [], total: 0, page: 1 })), + + http.get('/toolkits', () => HttpResponse.json([])), + + http.get('/workflows', () => HttpResponse.json([])), + + http.get('/traces', () => HttpResponse.json({ traces: [], total: 0 })), + + // ── Toolkit detail ────────────────────────────────────────────── + http.get('/toolkits/:id', ({ params }) => + HttpResponse.json({ + id: params.id, + name: 'Test Toolkit', + description: 'A test toolkit', + simulate: false, + disabled: false, + keys: [], + credentials: [], + }), + ), + + http.get('/toolkits/:id/keys', () => HttpResponse.json({ keys: [] })), + + http.get('/toolkits/:id/access-requests', () => HttpResponse.json([])), + + http.get('/toolkits/:id/credentials', () => HttpResponse.json([])), + + // ── Toolkit mutations ─────────────────────────────────────────── + http.post('/toolkits', () => + HttpResponse.json({ id: 'new-tk', name: 'New Toolkit', description: '', credentials: [] }), + ), + + http.patch('/toolkits/:id', ({ params }) => + HttpResponse.json({ + id: params.id, + name: 'Updated Toolkit', + description: 'Updated', + disabled: false, + credentials: [], + }), + ), + + http.delete('/toolkits/:id', () => new HttpResponse(null, { status: 204 })), + + http.post('/toolkits/:id/keys', () => + HttpResponse.json({ + id: 'new-key', + key: 'jntc_test_generated_key_123', + prefix: 'jntc_test', + label: null, + created_at: Math.floor(Date.now() / 1000), + }), + ), + + http.delete('/toolkits/:id/keys/:keyId', () => new HttpResponse(null, { status: 204 })), + + http.post('/toolkits/:id/access-requests', () => + HttpResponse.json({ + id: 'req-new', + status: 'pending', + approve_url: '/approve/test-tk/req-new', + }), + ), + + http.get('/toolkits/:id/credentials/:credId/permissions', () => HttpResponse.json([])), + + http.put('/toolkits/:id/credentials/:credId/permissions', () => + HttpResponse.json({ ok: true }), + ), + + http.delete('/toolkits/:id/credentials/:credId', () => new HttpResponse(null, { status: 204 })), + + // ── Credentials ───────────────────────────────────────────────── + http.get('/credentials', () => HttpResponse.json({ data: [], total: 0 })), + + http.get('/credentials/:id', ({ params }) => + HttpResponse.json({ + id: params.id, + label: 'Test Credential', + api_id: 'test-api', + auth_type: 'bearer', + }), + ), + + http.post('/credentials', async ({ request }) => { + const body = (await request.json()) as Record; + return HttpResponse.json({ id: 'cred-new', ...body }); + }), + + http.patch('/credentials/:id', async ({ params, request }) => { + const body = (await request.json()) as Record; + return HttpResponse.json({ id: params.id, ...body }); + }), + + http.delete('/credentials/:id', () => new HttpResponse(null, { status: 204 })), + + // ── API detail (for credential form) ──────────────────────────── + http.get('/apis/:id', ({ params }) => + HttpResponse.json({ + id: params.id, + name: 'Test API', + source: 'local', + security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, + }), + ), + + // ── Search & inspect ────────────────────────────────────────── + http.get('/search', () => HttpResponse.json([])), + http.get('/inspect/:id', () => + HttpResponse.json({ + capability_id: 'test-cap', + method: 'GET', + path: '/test', + summary: 'Test operation', + }), + ), + + // ── Catalog ───────────────────────────────────────────────────── + http.get('/catalog', () => HttpResponse.json([])), + http.get('/catalog/:id', () => + HttpResponse.json({ + id: 'test-api', + name: 'Test API', + spec_url: 'https://example.com/openapi.json', + }), + ), + http.post('/catalog/refresh', () => HttpResponse.json({ status: 'ok' })), + http.post('/import', () => HttpResponse.json({ id: 'import-1', status: 'ok' })), + + // ── Approval ────────────────────────────────────────────────── + http.get('/toolkits/:id/access-requests/:reqId', ({ params }) => + HttpResponse.json({ + id: params.reqId, + toolkit_id: params.id, + type: 'grant', + status: 'pending', + reason: 'Need access', + created_at: Math.floor(Date.now() / 1000), + payload: { credential_id: 'cred-1', api_id: 'test-api', rules: [] }, + }), + ), + http.post('/toolkits/:id/access-requests/:reqId/approve', () => + HttpResponse.json({ status: 'approved' }), + ), + http.post('/toolkits/:id/access-requests/:reqId/deny', () => + HttpResponse.json({ status: 'denied' }), + ), + + // ── Jobs ────────────────────────────────────────────────────── + http.get('/jobs', () => HttpResponse.json({ items: [], total: 0 })), + http.delete('/jobs/:id', () => new HttpResponse(null, { status: 204 })), + + // ── OAuth brokers ───────────────────────────────────────────── + http.get('/oauth-brokers', () => HttpResponse.json([])), + http.post('/oauth-brokers', async ({ request }) => { + const body = (await request.json()) as Record; + return HttpResponse.json({ id: 'broker-new', ...body }); + }), + + // ── API operations ──────────────────────────────────────────── + http.get('/apis/:id/operations', () => HttpResponse.json({ items: [], total: 0 })), + + // ── Default API key ───────────────────────────────────────────── + http.post('/default-api-key/generate', () => + HttpResponse.json({ key: 'jntc_test_key_abc123' }), + ), + + // ── User creation ─────────────────────────────────────────────── + http.post('/user/create', () => HttpResponse.json({ username: 'admin' })), +]; diff --git a/ui/src/__tests__/pages/ApprovalPage.test.tsx b/ui/src/__tests__/pages/ApprovalPage.test.tsx index f983b0db..7793073b 100644 --- a/ui/src/__tests__/pages/ApprovalPage.test.tsx +++ b/ui/src/__tests__/pages/ApprovalPage.test.tsx @@ -1,147 +1,147 @@ -import { screen, waitFor, renderWithProviders, createErrorHandler } from '../test-utils' -import userEvent from '@testing-library/user-event' -import { worker } from '../mocks/browser' -import { http, HttpResponse, delay } from 'msw' -import axe from 'axe-core' -import ApprovalPage from '../../pages/ApprovalPage' +import userEvent from '@testing-library/user-event'; +import { http, HttpResponse, delay } from 'msw'; +import axe from 'axe-core'; +import { worker } from '../mocks/browser'; +import { screen, renderWithProviders, createErrorHandler } from '../test-utils'; +import ApprovalPage from '@/pages/ApprovalPage'; -const ROUTE = '/approve/tk-1/req-1' -const PATH = '/approve/:toolkit_id/:req_id' +const ROUTE = '/approve/tk-1/req-1'; +const PATH = '/approve/:toolkit_id/:req_id'; describe('ApprovalPage', () => { - it('renders pending request details', async () => { - worker.use( - http.get('/toolkits/:id', () => - HttpResponse.json({ - id: 'tk-1', - name: 'Stripe Toolkit', - simulate: false, - disabled: false, - keys: [], - credentials: [], - }), - ), - http.get('/toolkits/:id/access-requests/:reqId', () => - HttpResponse.json({ - id: 'req-1', - toolkit_id: 'tk-1', - type: 'grant', - status: 'pending', - reason: 'Need access to payments API', - description: 'Agent requires Stripe access', - created_at: Math.floor(Date.now() / 1000), - payload: { credential_id: 'cred-1', api_id: 'stripe-api', rules: [] }, - }), - ), - ) - - renderWithProviders(, { route: ROUTE, path: PATH }) - - expect(await screen.findByText('Stripe Toolkit')).toBeInTheDocument() - expect(screen.getByText(/Need access to payments API/)).toBeInTheDocument() - expect(screen.getByText(/Agent requires Stripe access/)).toBeInTheDocument() - expect(screen.getByText('Approve Request')).toBeInTheDocument() - expect(screen.getByText('Deny Request')).toBeInTheDocument() - }) - - it('shows loading state while fetching', async () => { - worker.use( - http.get('/user/me', async () => { - await delay(200) - return HttpResponse.json({ logged_in: true, username: 'admin', role: 'admin' }) - }), - ) - - renderWithProviders(, { route: ROUTE, path: PATH }) - - expect(screen.getByText('Loading...')).toBeInTheDocument() - }) - - it('approves request and shows success message', async () => { - const user = userEvent.setup({ advanceTimers: vi.advanceTimersByTime }) - - worker.use( - http.get('/toolkits/:id/access-requests/:reqId', () => - HttpResponse.json({ - id: 'req-1', - toolkit_id: 'tk-1', - type: 'grant', - status: 'pending', - reason: 'Need access', - created_at: Math.floor(Date.now() / 1000), - payload: {}, - }), - ), - http.post('/toolkits/:id/access-requests/:reqId/approve', () => - HttpResponse.json({ status: 'approved' }), - ), - ) - - vi.useFakeTimers({ shouldAdvanceTime: true }) - try { - renderWithProviders(, { route: ROUTE, path: PATH }) - - const approveBtn = await screen.findByText('Approve Request') - await user.click(approveBtn) - - expect(await screen.findByText('Request Approved')).toBeInTheDocument() - expect(screen.getByText(/Redirecting to toolkits/)).toBeInTheDocument() - } finally { - vi.useRealTimers() - } - }) - - it('denies request and shows denied message', async () => { - const user = userEvent.setup({ advanceTimers: vi.advanceTimersByTime }) - - worker.use( - http.get('/toolkits/:id/access-requests/:reqId', () => - HttpResponse.json({ - id: 'req-1', - toolkit_id: 'tk-1', - type: 'grant', - status: 'pending', - reason: 'Need access', - created_at: Math.floor(Date.now() / 1000), - payload: {}, - }), - ), - http.post('/toolkits/:id/access-requests/:reqId/deny', () => - HttpResponse.json({ status: 'denied' }), - ), - ) - - vi.useFakeTimers({ shouldAdvanceTime: true }) - try { - renderWithProviders(, { route: ROUTE, path: PATH }) - - const denyBtn = await screen.findByText('Deny Request') - await user.click(denyBtn) - - expect(await screen.findByText('Request Denied')).toBeInTheDocument() - expect(screen.getByText(/Redirecting to toolkits/)).toBeInTheDocument() - } finally { - vi.useRealTimers() - } - }) - - it('shows not-found state when request returns 404', async () => { - worker.use( - createErrorHandler('get', '/toolkits/:id/access-requests/:reqId', { - status: 404, - body: { detail: 'Not found' }, - }), - ) - - renderWithProviders(, { route: ROUTE, path: PATH }) - - expect(await screen.findByText('Request Not Found')).toBeInTheDocument() - }) - - it('has no accessibility violations', async () => { - const { container } = renderWithProviders(, { route: ROUTE, path: PATH }) - await screen.findByText('Approve Request') - const results = await axe.run(container) - expect(results.violations).toEqual([]) - }) -}) + it('renders pending request details', async () => { + worker.use( + http.get('/toolkits/:id', () => + HttpResponse.json({ + id: 'tk-1', + name: 'Stripe Toolkit', + simulate: false, + disabled: false, + keys: [], + credentials: [], + }), + ), + http.get('/toolkits/:id/access-requests/:reqId', () => + HttpResponse.json({ + id: 'req-1', + toolkit_id: 'tk-1', + type: 'grant', + status: 'pending', + reason: 'Need access to payments API', + description: 'Agent requires Stripe access', + created_at: Math.floor(Date.now() / 1000), + payload: { credential_id: 'cred-1', api_id: 'stripe-api', rules: [] }, + }), + ), + ); + + renderWithProviders(, { route: ROUTE, path: PATH }); + + expect(await screen.findByText('Stripe Toolkit')).toBeInTheDocument(); + expect(screen.getByText(/Need access to payments API/)).toBeInTheDocument(); + expect(screen.getByText(/Agent requires Stripe access/)).toBeInTheDocument(); + expect(screen.getByText('Approve Request')).toBeInTheDocument(); + expect(screen.getByText('Deny Request')).toBeInTheDocument(); + }); + + it('shows loading state while fetching', async () => { + worker.use( + http.get('/user/me', async () => { + await delay(200); + return HttpResponse.json({ logged_in: true, username: 'admin', role: 'admin' }); + }), + ); + + renderWithProviders(, { route: ROUTE, path: PATH }); + + expect(screen.getByText('Loading...')).toBeInTheDocument(); + }); + + it('approves request and shows success message', async () => { + const user = userEvent.setup({ advanceTimers: vi.advanceTimersByTime }); + + worker.use( + http.get('/toolkits/:id/access-requests/:reqId', () => + HttpResponse.json({ + id: 'req-1', + toolkit_id: 'tk-1', + type: 'grant', + status: 'pending', + reason: 'Need access', + created_at: Math.floor(Date.now() / 1000), + payload: {}, + }), + ), + http.post('/toolkits/:id/access-requests/:reqId/approve', () => + HttpResponse.json({ status: 'approved' }), + ), + ); + + vi.useFakeTimers({ shouldAdvanceTime: true }); + try { + renderWithProviders(, { route: ROUTE, path: PATH }); + + const approveBtn = await screen.findByText('Approve Request'); + await user.click(approveBtn); + + expect(await screen.findByText('Request Approved')).toBeInTheDocument(); + expect(screen.getByText(/Redirecting to toolkits/)).toBeInTheDocument(); + } finally { + vi.useRealTimers(); + } + }); + + it('denies request and shows denied message', async () => { + const user = userEvent.setup({ advanceTimers: vi.advanceTimersByTime }); + + worker.use( + http.get('/toolkits/:id/access-requests/:reqId', () => + HttpResponse.json({ + id: 'req-1', + toolkit_id: 'tk-1', + type: 'grant', + status: 'pending', + reason: 'Need access', + created_at: Math.floor(Date.now() / 1000), + payload: {}, + }), + ), + http.post('/toolkits/:id/access-requests/:reqId/deny', () => + HttpResponse.json({ status: 'denied' }), + ), + ); + + vi.useFakeTimers({ shouldAdvanceTime: true }); + try { + renderWithProviders(, { route: ROUTE, path: PATH }); + + const denyBtn = await screen.findByText('Deny Request'); + await user.click(denyBtn); + + expect(await screen.findByText('Request Denied')).toBeInTheDocument(); + expect(screen.getByText(/Redirecting to toolkits/)).toBeInTheDocument(); + } finally { + vi.useRealTimers(); + } + }); + + it('shows not-found state when request returns 404', async () => { + worker.use( + createErrorHandler('get', '/toolkits/:id/access-requests/:reqId', { + status: 404, + body: { detail: 'Not found' }, + }), + ); + + renderWithProviders(, { route: ROUTE, path: PATH }); + + expect(await screen.findByText('Request Not Found')).toBeInTheDocument(); + }); + + it('has no accessibility violations', async () => { + const { container } = renderWithProviders(, { route: ROUTE, path: PATH }); + await screen.findByText('Approve Request'); + const results = await axe.run(container); + expect(results.violations).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/pages/CatalogPage.test.tsx b/ui/src/__tests__/pages/CatalogPage.test.tsx index 0892ed9a..c6df74e8 100644 --- a/ui/src/__tests__/pages/CatalogPage.test.tsx +++ b/ui/src/__tests__/pages/CatalogPage.test.tsx @@ -1,106 +1,120 @@ -import { screen, waitFor, renderWithProviders, userEvent, createErrorHandler } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse } from 'msw' -import axe from 'axe-core' -import CatalogPage from '../../pages/CatalogPage' +import { http, HttpResponse } from 'msw'; +import axe from 'axe-core'; +import { screen, renderWithProviders, userEvent, createErrorHandler } from '../test-utils'; +import { worker } from '../mocks/browser'; +import CatalogPage from '@/pages/CatalogPage'; describe('CatalogPage', () => { - it('renders both tabs visible', async () => { - renderWithProviders() - - expect(await screen.findByText('Your APIs')).toBeInTheDocument() - expect(screen.getByText('Public Catalog')).toBeInTheDocument() - }) - - it('shows Registered tab empty state by default', async () => { - renderWithProviders() - - expect(await screen.findByText(/no apis registered yet/i)).toBeInTheDocument() - expect(screen.getByText(/import apis from the public catalog/i)).toBeInTheDocument() - }) - - it('shows populated API cards on Registered tab', async () => { - worker.use( - http.get('/apis', ({ request }) => { - const url = new URL(request.url) - if (url.searchParams.get('source') === 'local') { - return HttpResponse.json({ - data: [ - { id: 'stripe-api', name: 'Stripe', source: 'local', description: 'Payment processing' }, - { id: 'github-api', name: 'GitHub', source: 'local', description: 'Code hosting' }, - ], - total: 2, - total_pages: 1, - page: 1, - }) - } - return HttpResponse.json({ data: [], total: 0, page: 1 }) - }), - ) - - renderWithProviders() - - expect(await screen.findByText('Stripe')).toBeInTheDocument() - expect(screen.getByText('GitHub')).toBeInTheDocument() - expect(screen.getByText('2 APIs registered')).toBeInTheDocument() - }) - - it('shows error state on Registered tab when /apis returns 500', async () => { - worker.use(createErrorHandler('get', '/apis', { status: 500 })) - - renderWithProviders() - - expect(await screen.findByText(/failed to load registered apis/i)).toBeInTheDocument() - expect(screen.getByText(/please try refreshing the page/i)).toBeInTheDocument() - }) - - it('shows Catalog tab empty state', async () => { - worker.use( - http.get('/catalog', () => - HttpResponse.json({ data: [], total: 0, catalog_total: 0, status: 'empty' }), - ), - ) - - const user = userEvent.setup() - renderWithProviders() - - await screen.findByText('Your APIs') - await user.click(screen.getByText('Public Catalog')) - - expect(await screen.findByText(/catalog not synced yet/i)).toBeInTheDocument() - expect(screen.getByRole('button', { name: /sync catalog/i })).toBeInTheDocument() - }) - - it('shows populated catalog entries after switching tab', async () => { - worker.use( - http.get('/catalog', () => - HttpResponse.json({ - data: [ - { api_id: 'sendgrid-api', description: 'Email delivery', registered: false }, - { api_id: 'twilio-api', description: 'SMS and voice', registered: true }, - ], - total: 2, - catalog_total: 100, - manifest_age_seconds: 3600, - }), - ), - ) - - const user = userEvent.setup() - renderWithProviders() - - await screen.findByText('Your APIs') - await user.click(screen.getByText('Public Catalog')) - - expect(await screen.findByText('sendgrid-api')).toBeInTheDocument() - expect(screen.getByText('twilio-api')).toBeInTheDocument() - expect(screen.getByText(/2 of 100 APIs shown/)).toBeInTheDocument() - }) - - it('has no accessibility violations', async () => { - const { container } = renderWithProviders() - await screen.findByText(/no apis registered yet/i) - const results = await axe.run(container) - expect(results.violations).toEqual([]) - }) -}) + it('renders both tabs visible', async () => { + renderWithProviders(); + + expect(await screen.findByText('Your APIs')).toBeInTheDocument(); + expect(screen.getByText('Public Catalog')).toBeInTheDocument(); + }); + + it('shows Registered tab empty state by default', async () => { + renderWithProviders(); + + expect(await screen.findByText(/no apis registered yet/i)).toBeInTheDocument(); + expect(screen.getByText(/import apis from the public catalog/i)).toBeInTheDocument(); + }); + + it('shows populated API cards on Registered tab', async () => { + worker.use( + http.get('/apis', ({ request }) => { + const url = new URL(request.url); + if (url.searchParams.get('source') === 'local') { + return HttpResponse.json({ + data: [ + { + id: 'stripe-api', + name: 'Stripe', + source: 'local', + description: 'Payment processing', + }, + { + id: 'github-api', + name: 'GitHub', + source: 'local', + description: 'Code hosting', + }, + ], + total: 2, + total_pages: 1, + page: 1, + }); + } + return HttpResponse.json({ data: [], total: 0, page: 1 }); + }), + ); + + renderWithProviders(); + + expect(await screen.findByText('Stripe')).toBeInTheDocument(); + expect(screen.getByText('GitHub')).toBeInTheDocument(); + expect(screen.getByText('2 APIs registered')).toBeInTheDocument(); + }); + + it('shows error state on Registered tab when /apis returns 500', async () => { + worker.use(createErrorHandler('get', '/apis', { status: 500 })); + + renderWithProviders(); + + expect(await screen.findByText(/failed to load registered apis/i)).toBeInTheDocument(); + expect(screen.getByText(/please try refreshing the page/i)).toBeInTheDocument(); + }); + + it('shows Catalog tab empty state', async () => { + worker.use( + http.get('/catalog', () => + HttpResponse.json({ data: [], total: 0, catalog_total: 0, status: 'empty' }), + ), + ); + + const user = userEvent.setup(); + renderWithProviders(); + + await screen.findByText('Your APIs'); + await user.click(screen.getByText('Public Catalog')); + + expect(await screen.findByText(/catalog not synced yet/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /sync catalog/i })).toBeInTheDocument(); + }); + + it('shows populated catalog entries after switching tab', async () => { + worker.use( + http.get('/catalog', () => + HttpResponse.json({ + data: [ + { + api_id: 'sendgrid-api', + description: 'Email delivery', + registered: false, + }, + { api_id: 'twilio-api', description: 'SMS and voice', registered: true }, + ], + total: 2, + catalog_total: 100, + manifest_age_seconds: 3600, + }), + ), + ); + + const user = userEvent.setup(); + renderWithProviders(); + + await screen.findByText('Your APIs'); + await user.click(screen.getByText('Public Catalog')); + + expect(await screen.findByText('sendgrid-api')).toBeInTheDocument(); + expect(screen.getByText('twilio-api')).toBeInTheDocument(); + expect(screen.getByText(/2 of 100 APIs shown/)).toBeInTheDocument(); + }); + + it('has no accessibility violations', async () => { + const { container } = renderWithProviders(); + await screen.findByText(/no apis registered yet/i); + const results = await axe.run(container); + expect(results.violations).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/pages/CredentialFormPage.test.tsx b/ui/src/__tests__/pages/CredentialFormPage.test.tsx index ca5c374c..84724e15 100644 --- a/ui/src/__tests__/pages/CredentialFormPage.test.tsx +++ b/ui/src/__tests__/pages/CredentialFormPage.test.tsx @@ -1,222 +1,253 @@ -import { screen, waitFor, renderWithProviders, userEvent, createErrorHandler } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse } from 'msw' -import axe from 'axe-core' -import CredentialFormPage from '../../pages/CredentialFormPage' +import { http, HttpResponse } from 'msw'; +import axe from 'axe-core'; +import { screen, waitFor, renderWithProviders, userEvent, createErrorHandler } from '../test-utils'; +import { worker } from '../mocks/browser'; +import CredentialFormPage from '@/pages/CredentialFormPage'; describe('CredentialFormPage — create mode', () => { - it('renders the heading and API picker', async () => { - renderWithProviders() - - expect(await screen.findByRole('heading', { name: /add credential/i })).toBeInTheDocument() - expect(screen.getByPlaceholderText(/search apis/i)).toBeInTheDocument() - }) - - it('shows the empty state prompt', async () => { - renderWithProviders() - - expect(await screen.findByText(/start typing to search/i)).toBeInTheDocument() - }) - - it('shows search results when user types', async () => { - const user = userEvent.setup() - - worker.use( - http.get('/apis', ({ request }) => { - const url = new URL(request.url) - const q = url.searchParams.get('q') - if (q?.includes('stripe')) { - return HttpResponse.json({ - data: [{ id: 'stripe', name: 'Stripe', description: 'Payment processing', source: 'local' }], - total: 1, - page: 1, - }) - } - return HttpResponse.json({ data: [], total: 0, page: 1 }) - }), - ) - - renderWithProviders() - - const input = await screen.findByPlaceholderText(/search apis/i) - await user.type(input, 'stripe') - - expect(await screen.findByText('Stripe')).toBeInTheDocument() - }) - - it('shows "no APIs found" for empty search results', async () => { - const user = userEvent.setup() - - worker.use( - http.get('/apis', () => - HttpResponse.json({ data: [], total: 0, page: 1 }), - ), - ) - - renderWithProviders() - - const input = await screen.findByPlaceholderText(/search apis/i) - await user.type(input, 'nonexistent') - - expect(await screen.findByText(/no apis found/i)).toBeInTheDocument() - }) - - it('advances to credential form after selecting an API', async () => { - const user = userEvent.setup() - - worker.use( - http.get('/apis', ({ request }) => { - const url = new URL(request.url) - const q = url.searchParams.get('q') - if (q?.includes('stripe')) { - return HttpResponse.json({ - data: [{ id: 'stripe', name: 'Stripe', description: 'Payments', source: 'local' }], - total: 1, - page: 1, - }) - } - return HttpResponse.json({ data: [], total: 0, page: 1 }) - }), - http.get('/apis/:id', () => - HttpResponse.json({ - id: 'stripe', name: 'Stripe', source: 'local', - security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, - }), - ), - ) - - renderWithProviders() - - const input = await screen.findByPlaceholderText(/search apis/i) - await user.type(input, 'stripe') - - const apiRow = await screen.findByText('Stripe') - await user.click(apiRow) - - expect(await screen.findByText(/bearer token/i)).toBeInTheDocument() - }) - - it('has no accessibility violations', async () => { - const { container } = renderWithProviders() - await screen.findByRole('heading', { name: /add credential/i }) - const results = await axe.run(container) - expect(results.violations).toEqual([]) - }) -}) + it('renders the heading and API picker', async () => { + renderWithProviders(); + + expect(await screen.findByRole('heading', { name: /add credential/i })).toBeInTheDocument(); + expect(screen.getByPlaceholderText(/search apis/i)).toBeInTheDocument(); + }); + + it('shows the empty state prompt', async () => { + renderWithProviders(); + + expect(await screen.findByText(/start typing to search/i)).toBeInTheDocument(); + }); + + it('shows search results when user types', async () => { + const user = userEvent.setup(); + + worker.use( + http.get('/apis', ({ request }) => { + const url = new URL(request.url); + const q = url.searchParams.get('q'); + if (q?.includes('stripe')) { + return HttpResponse.json({ + data: [ + { + id: 'stripe', + name: 'Stripe', + description: 'Payment processing', + source: 'local', + }, + ], + total: 1, + page: 1, + }); + } + return HttpResponse.json({ data: [], total: 0, page: 1 }); + }), + ); + + renderWithProviders(); + + const input = await screen.findByPlaceholderText(/search apis/i); + await user.type(input, 'stripe'); + + expect(await screen.findByText('Stripe')).toBeInTheDocument(); + }); + + it('shows "no APIs found" for empty search results', async () => { + const user = userEvent.setup(); + + worker.use(http.get('/apis', () => HttpResponse.json({ data: [], total: 0, page: 1 }))); + + renderWithProviders(); + + const input = await screen.findByPlaceholderText(/search apis/i); + await user.type(input, 'nonexistent'); + + expect(await screen.findByText(/no apis found/i)).toBeInTheDocument(); + }); + + it('advances to credential form after selecting an API', async () => { + const user = userEvent.setup(); + + worker.use( + http.get('/apis', ({ request }) => { + const url = new URL(request.url); + const q = url.searchParams.get('q'); + if (q?.includes('stripe')) { + return HttpResponse.json({ + data: [ + { + id: 'stripe', + name: 'Stripe', + description: 'Payments', + source: 'local', + }, + ], + total: 1, + page: 1, + }); + } + return HttpResponse.json({ data: [], total: 0, page: 1 }); + }), + http.get('/apis/:id', () => + HttpResponse.json({ + id: 'stripe', + name: 'Stripe', + source: 'local', + security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, + }), + ), + ); + + renderWithProviders(); + + const input = await screen.findByPlaceholderText(/search apis/i); + await user.type(input, 'stripe'); + + const apiRow = await screen.findByText('Stripe'); + await user.click(apiRow); + + expect(await screen.findByText(/bearer token/i)).toBeInTheDocument(); + }); + + it('has no accessibility violations', async () => { + const { container } = renderWithProviders(); + await screen.findByRole('heading', { name: /add credential/i }); + const results = await axe.run(container); + expect(results.violations).toEqual([]); + }); +}); describe('CredentialFormPage — edit mode', () => { - it('renders "Edit Credential" heading in edit mode', async () => { - worker.use( - http.get('/credentials/:id', () => - HttpResponse.json({ - id: 'cred-1', label: 'My Token', api_id: 'stripe', auth_type: 'bearer', - }), - ), - http.get('/apis/stripe', () => - HttpResponse.json({ - id: 'stripe', name: 'Stripe', source: 'local', - security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, - }), - ), - ) - - renderWithProviders(, { - route: '/credentials/cred-1/edit', - path: '/credentials/:id/edit', - }) - - expect(await screen.findByRole('heading', { name: /edit credential/i })).toBeInTheDocument() - }) - - it('pre-fills the credential fields in edit mode', async () => { - worker.use( - http.get('/credentials/:id', () => - HttpResponse.json({ - id: 'cred-1', label: 'My Stripe Token', api_id: 'stripe', auth_type: 'bearer', - value: 'sk_test_xxxx', - }), - ), - http.get('/apis/stripe', () => - HttpResponse.json({ - id: 'stripe', name: 'Stripe', source: 'local', - security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, - }), - ), - ) - - renderWithProviders(, { - route: '/credentials/cred-1/edit', - path: '/credentials/:id/edit', - }) - - expect(await screen.findByRole('heading', { name: /edit credential/i })).toBeInTheDocument() - // The form should show the bearer token field - expect(await screen.findByText(/bearer token/i)).toBeInTheDocument() - }) -}) + it('renders "Edit Credential" heading in edit mode', async () => { + worker.use( + http.get('/credentials/:id', () => + HttpResponse.json({ + id: 'cred-1', + label: 'My Token', + api_id: 'stripe', + auth_type: 'bearer', + }), + ), + http.get('/apis/stripe', () => + HttpResponse.json({ + id: 'stripe', + name: 'Stripe', + source: 'local', + security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, + }), + ), + ); + + renderWithProviders(, { + route: '/credentials/cred-1/edit', + path: '/credentials/:id/edit', + }); + + expect( + await screen.findByRole('heading', { name: /edit credential/i }), + ).toBeInTheDocument(); + }); + + it('pre-fills the credential fields in edit mode', async () => { + worker.use( + http.get('/credentials/:id', () => + HttpResponse.json({ + id: 'cred-1', + label: 'My Stripe Token', + api_id: 'stripe', + auth_type: 'bearer', + value: 'sk_test_xxxx', + }), + ), + http.get('/apis/stripe', () => + HttpResponse.json({ + id: 'stripe', + name: 'Stripe', + source: 'local', + security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, + }), + ), + ); + + renderWithProviders(, { + route: '/credentials/cred-1/edit', + path: '/credentials/:id/edit', + }); + + expect( + await screen.findByRole('heading', { name: /edit credential/i }), + ).toBeInTheDocument(); + // The form should show the bearer token field + expect(await screen.findByText(/bearer token/i)).toBeInTheDocument(); + }); +}); describe('CredentialFormPage — mutation errors', () => { - async function fillAndSubmitCredential(user: ReturnType) { - worker.use( - http.get('/apis', ({ request }) => { - const url = new URL(request.url) - const q = url.searchParams.get('q') - if (q?.includes('stripe')) { - return HttpResponse.json({ - data: [{ id: 'stripe', name: 'Stripe', description: 'Payments', source: 'local' }], - total: 1, - page: 1, - }) - } - return HttpResponse.json({ data: [], total: 0, page: 1 }) - }), - http.get('/apis/:id', () => - HttpResponse.json({ - id: 'stripe', name: 'Stripe', source: 'local', - security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, - }), - ), - ) - - renderWithProviders() - - const input = await screen.findByPlaceholderText(/search apis/i) - await user.type(input, 'stripe') - await user.click(await screen.findByText('Stripe')) - - await screen.findByText(/bearer token/i) - - const tokenField = screen.getByPlaceholderText(/paste your token/i) - await user.type(tokenField, 'sk_test_123') - - await user.click(screen.getByRole('button', { name: /save credential/i })) - } - - it('shows error on network failure when creating a credential', async () => { - const user = userEvent.setup() - - worker.use( - createErrorHandler('post', '/credentials', { networkError: true }), - ) - - await fillAndSubmitCredential(user) - - await waitFor(() => { - expect(screen.getByRole('alert')).toBeInTheDocument() - }) - }) - - it('shows error on server 500 when creating a credential', async () => { - const user = userEvent.setup() - - worker.use( - createErrorHandler('post', '/credentials', { status: 500 }), - ) - - await fillAndSubmitCredential(user) - - await waitFor(() => { - expect(screen.getByRole('alert')).toBeInTheDocument() - }) - }) -}) + async function fillAndSubmitCredential(user: ReturnType) { + worker.use( + http.get('/apis', ({ request }) => { + const url = new URL(request.url); + const q = url.searchParams.get('q'); + if (q?.includes('stripe')) { + return HttpResponse.json({ + data: [ + { + id: 'stripe', + name: 'Stripe', + description: 'Payments', + source: 'local', + }, + ], + total: 1, + page: 1, + }); + } + return HttpResponse.json({ data: [], total: 0, page: 1 }); + }), + http.get('/apis/:id', () => + HttpResponse.json({ + id: 'stripe', + name: 'Stripe', + source: 'local', + security_schemes: { bearerAuth: { type: 'http', scheme: 'bearer' } }, + }), + ), + ); + + renderWithProviders(); + + const input = await screen.findByPlaceholderText(/search apis/i); + await user.type(input, 'stripe'); + await user.click(await screen.findByText('Stripe')); + + await screen.findByText(/bearer token/i); + + const tokenField = screen.getByPlaceholderText(/paste your token/i); + await user.type(tokenField, 'sk_test_123'); + + await user.click(screen.getByRole('button', { name: /save credential/i })); + } + + it('shows error on network failure when creating a credential', async () => { + const user = userEvent.setup(); + + worker.use(createErrorHandler('post', '/credentials', { networkError: true })); + + await fillAndSubmitCredential(user); + + await waitFor(() => { + expect(screen.getByRole('alert')).toBeInTheDocument(); + }); + }); + + it('shows error on server 500 when creating a credential', async () => { + const user = userEvent.setup(); + + worker.use(createErrorHandler('post', '/credentials', { status: 500 })); + + await fillAndSubmitCredential(user); + + await waitFor(() => { + expect(screen.getByRole('alert')).toBeInTheDocument(); + }); + }); +}); diff --git a/ui/src/__tests__/pages/DashboardPage.test.tsx b/ui/src/__tests__/pages/DashboardPage.test.tsx index 7279dfb8..8ea24d7c 100644 --- a/ui/src/__tests__/pages/DashboardPage.test.tsx +++ b/ui/src/__tests__/pages/DashboardPage.test.tsx @@ -1,110 +1,107 @@ -import { screen, waitFor, renderWithProviders } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse, delay } from 'msw' -import axe from 'axe-core' -import DashboardPage from '../../pages/DashboardPage' +import { http, HttpResponse, delay } from 'msw'; +import axe from 'axe-core'; +import { screen, waitFor, renderWithProviders } from '../test-utils'; +import { worker } from '../mocks/browser'; +import DashboardPage from '@/pages/DashboardPage'; describe('DashboardPage', () => { - it('renders the dashboard heading', async () => { - renderWithProviders() - expect(await screen.findByRole('heading', { name: /dashboard/i })).toBeInTheDocument() - }) - - it('shows stat values with populated data', async () => { - worker.use( - http.get('/apis', () => - HttpResponse.json({ data: [{ id: 'a1' }], total: 5, page: 1 }), - ), - http.get('/toolkits', () => - HttpResponse.json([{ id: 'tk1', name: 'Stripe' }, { id: 'tk2', name: 'GitHub' }]), - ), - http.get('/workflows', () => - HttpResponse.json([{ slug: 'w1' }]), - ), - http.get('/traces', () => - HttpResponse.json({ traces: [], total: 42 }), - ), - ) - - renderWithProviders() - - await waitFor(() => { - expect(screen.getByText('5')).toBeInTheDocument() - expect(screen.getByText('2')).toBeInTheDocument() - }) - }) - - it('shows empty state message when no traces', async () => { - renderWithProviders() - - expect(await screen.findByText(/no executions yet/i)).toBeInTheDocument() - }) - - it('renders recent trace data in the table', async () => { - worker.use( - http.get('/traces', () => - HttpResponse.json({ - traces: [{ - id: 't1', - toolkit_id: 'stripe-tk', - operation_id: 'createPayment', - http_status: 200, - duration_ms: 150, - created_at: Math.floor(Date.now() / 1000) - 30, - }], - total: 1, - }), - ), - ) - - renderWithProviders() - - expect(await screen.findByText('stripe-tk')).toBeInTheDocument() - expect(screen.getByText('createPayment')).toBeInTheDocument() - expect(screen.getByText('200')).toBeInTheDocument() - expect(screen.getByText('150ms')).toBeInTheDocument() - }) - - it('shows loading dashes before data arrives', async () => { - worker.use( - http.get('/apis', async () => { - await delay(300) - return HttpResponse.json({ data: [], total: 3, page: 1 }) - }), - ) - - renderWithProviders() - - expect(screen.getAllByText('—').length).toBeGreaterThan(0) - - await waitFor(() => { - expect(screen.getByText('3')).toBeInTheDocument() - }) - }) - - it('handles API error gracefully (does not crash)', async () => { - worker.use( - http.get('/apis', () => HttpResponse.error()), - ) - - renderWithProviders() - expect(await screen.findByRole('heading', { name: /dashboard/i })).toBeInTheDocument() - }) - - it('renders quick action links', async () => { - renderWithProviders() - await screen.findByRole('heading', { name: /dashboard/i }) - - expect(screen.getByText('Search Catalog')).toBeInTheDocument() - expect(screen.getByText('Add Credential')).toBeInTheDocument() - expect(screen.getByText('Create Toolkit')).toBeInTheDocument() - expect(screen.getByText('Import an API')).toBeInTheDocument() - }) - - it('has no accessibility violations', async () => { - const { container } = renderWithProviders() - await screen.findByRole('heading', { name: /dashboard/i }) - const results = await axe.run(container) - expect(results.violations).toEqual([]) - }) -}) + it('renders the dashboard heading', async () => { + renderWithProviders(); + expect(await screen.findByRole('heading', { name: /dashboard/i })).toBeInTheDocument(); + }); + + it('shows stat values with populated data', async () => { + worker.use( + http.get('/apis', () => HttpResponse.json({ data: [{ id: 'a1' }], total: 5, page: 1 })), + http.get('/toolkits', () => + HttpResponse.json([ + { id: 'tk1', name: 'Stripe' }, + { id: 'tk2', name: 'GitHub' }, + ]), + ), + http.get('/workflows', () => HttpResponse.json([{ slug: 'w1' }])), + http.get('/traces', () => HttpResponse.json({ traces: [], total: 42 })), + ); + + renderWithProviders(); + + await waitFor(() => { + expect(screen.getByText('5')).toBeInTheDocument(); + expect(screen.getByText('2')).toBeInTheDocument(); + }); + }); + + it('shows empty state message when no traces', async () => { + renderWithProviders(); + + expect(await screen.findByText(/no executions yet/i)).toBeInTheDocument(); + }); + + it('renders recent trace data in the table', async () => { + worker.use( + http.get('/traces', () => + HttpResponse.json({ + traces: [ + { + id: 't1', + toolkit_id: 'stripe-tk', + operation_id: 'createPayment', + http_status: 200, + duration_ms: 150, + created_at: Math.floor(Date.now() / 1000) - 30, + }, + ], + total: 1, + }), + ), + ); + + renderWithProviders(); + + expect(await screen.findByText('stripe-tk')).toBeInTheDocument(); + expect(screen.getByText('createPayment')).toBeInTheDocument(); + expect(screen.getByText('200')).toBeInTheDocument(); + expect(screen.getByText('150ms')).toBeInTheDocument(); + }); + + it('shows loading dashes before data arrives', async () => { + worker.use( + http.get('/apis', async () => { + await delay(300); + return HttpResponse.json({ data: [], total: 3, page: 1 }); + }), + ); + + renderWithProviders(); + + expect(screen.getAllByText('—').length).toBeGreaterThan(0); + + await waitFor(() => { + expect(screen.getByText('3')).toBeInTheDocument(); + }); + }); + + it('handles API error gracefully (does not crash)', async () => { + worker.use(http.get('/apis', () => HttpResponse.error())); + + renderWithProviders(); + expect(await screen.findByRole('heading', { name: /dashboard/i })).toBeInTheDocument(); + }); + + it('renders quick action links', async () => { + renderWithProviders(); + await screen.findByRole('heading', { name: /dashboard/i }); + + expect(screen.getByText('Search Catalog')).toBeInTheDocument(); + expect(screen.getByText('Add Credential')).toBeInTheDocument(); + expect(screen.getByText('Create Toolkit')).toBeInTheDocument(); + expect(screen.getByText('Import an API')).toBeInTheDocument(); + }); + + it('has no accessibility violations', async () => { + const { container } = renderWithProviders(); + await screen.findByRole('heading', { name: /dashboard/i }); + const results = await axe.run(container); + expect(results.violations).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/pages/JobsPage.test.tsx b/ui/src/__tests__/pages/JobsPage.test.tsx index c03b69cf..a5edc47d 100644 --- a/ui/src/__tests__/pages/JobsPage.test.tsx +++ b/ui/src/__tests__/pages/JobsPage.test.tsx @@ -1,56 +1,70 @@ -import { screen, waitFor, renderWithProviders, createErrorHandler } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse } from 'msw' -import axe from 'axe-core' -import JobsPage from '../../pages/JobsPage' +import { http, HttpResponse } from 'msw'; +import axe from 'axe-core'; +import { screen, renderWithProviders, createErrorHandler } from '../test-utils'; +import { worker } from '../mocks/browser'; +import JobsPage from '@/pages/JobsPage'; describe('JobsPage', () => { - it('renders the heading', async () => { - renderWithProviders() - expect(await screen.findByRole('heading', { name: /background jobs/i })).toBeInTheDocument() - }) - - it('shows empty state when no jobs exist', async () => { - renderWithProviders() - expect(await screen.findByText(/no jobs found/i)).toBeInTheDocument() - }) - - it('renders job table with populated data', async () => { - worker.use( - http.get('/jobs', () => - HttpResponse.json({ - items: [ - { id: 'job-1', kind: 'execute', status: 'complete', toolkit_id: 'tk-1', created_at: Math.floor(Date.now() / 1000) }, - { id: 'job-2', kind: 'workflow', status: 'running', toolkit_id: 'tk-2', created_at: Math.floor(Date.now() / 1000) - 120 }, - ], - total: 2, - }), - ), - ) - - renderWithProviders() - - expect(await screen.findByText('job-1')).toBeInTheDocument() - expect(screen.getByText('job-2')).toBeInTheDocument() - const rows = screen.getAllByRole('row') - expect(rows.length).toBeGreaterThanOrEqual(3) - }) - - it('shows error state when API fails', async () => { - worker.use( - createErrorHandler('get', '/jobs', { status: 500 }), - ) - - renderWithProviders() - - expect(await screen.findByText(/failed to load jobs/i)).toBeInTheDocument() - }) - - it('has no critical accessibility violations', async () => { - const { container } = renderWithProviders() - await screen.findByRole('heading', { name: /background jobs/i }) - const results = await axe.run(container) - const serious = results.violations.filter(v => v.impact === 'critical' || v.impact === 'serious') - expect(serious).toEqual([]) - }) -}) + it('renders the heading', async () => { + renderWithProviders(); + expect( + await screen.findByRole('heading', { name: /background jobs/i }), + ).toBeInTheDocument(); + }); + + it('shows empty state when no jobs exist', async () => { + renderWithProviders(); + expect(await screen.findByText(/no jobs found/i)).toBeInTheDocument(); + }); + + it('renders job table with populated data', async () => { + worker.use( + http.get('/jobs', () => + HttpResponse.json({ + items: [ + { + id: 'job-1', + kind: 'execute', + status: 'complete', + toolkit_id: 'tk-1', + created_at: Math.floor(Date.now() / 1000), + }, + { + id: 'job-2', + kind: 'workflow', + status: 'running', + toolkit_id: 'tk-2', + created_at: Math.floor(Date.now() / 1000) - 120, + }, + ], + total: 2, + }), + ), + ); + + renderWithProviders(); + + expect(await screen.findByText('job-1')).toBeInTheDocument(); + expect(screen.getByText('job-2')).toBeInTheDocument(); + const rows = screen.getAllByRole('row'); + expect(rows.length).toBeGreaterThanOrEqual(3); + }); + + it('shows error state when API fails', async () => { + worker.use(createErrorHandler('get', '/jobs', { status: 500 })); + + renderWithProviders(); + + expect(await screen.findByText(/failed to load jobs/i)).toBeInTheDocument(); + }); + + it('has no critical accessibility violations', async () => { + const { container } = renderWithProviders(); + await screen.findByRole('heading', { name: /background jobs/i }); + const results = await axe.run(container); + const serious = results.violations.filter( + (v) => v.impact === 'critical' || v.impact === 'serious', + ); + expect(serious).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/pages/LoginPage.test.tsx b/ui/src/__tests__/pages/LoginPage.test.tsx index 145ad9a3..0c83d66b 100644 --- a/ui/src/__tests__/pages/LoginPage.test.tsx +++ b/ui/src/__tests__/pages/LoginPage.test.tsx @@ -1,98 +1,100 @@ -import { screen, renderWithProviders, userEvent } from '../test-utils' -import { worker } from '../mocks/browser' -import { delay, http, HttpResponse } from 'msw' -import axe from 'axe-core' -import LoginPage from '../../pages/LoginPage' +import { delay, http, HttpResponse } from 'msw'; +import axe from 'axe-core'; +import { screen, renderWithProviders, userEvent } from '../test-utils'; +import { worker } from '../mocks/browser'; +import LoginPage from '@/pages/LoginPage'; describe('LoginPage', () => { - it('renders the login form', () => { - renderWithProviders() - expect(screen.getByLabelText('Username')).toBeInTheDocument() - expect(screen.getByLabelText('Password')).toBeInTheDocument() - expect(screen.getByRole('button', { name: /log in/i })).toBeInTheDocument() - }) - - it('shows "Logging in..." while submitting', async () => { - const user = userEvent.setup() - - worker.use( - http.post('/user/login', async () => { - await delay('infinite') - return HttpResponse.json({ logged_in: true }) - }), - ) - - renderWithProviders() - - await user.type(screen.getByLabelText('Username'), 'admin') - await user.type(screen.getByLabelText('Password'), 'password') - await user.click(screen.getByRole('button', { name: /log in/i })) - - expect(await screen.findByRole('button', { name: /logging in/i })).toBeDisabled() - }) - - it('shows error message on failed login (401)', async () => { - const user = userEvent.setup() - - worker.use( - http.post('/user/login', () => - HttpResponse.json({ error: 'bad credentials' }, { status: 401 }), - ), - ) - - renderWithProviders() - - await user.type(screen.getByLabelText('Username'), 'admin') - await user.type(screen.getByLabelText('Password'), 'wrong') - await user.click(screen.getByRole('button', { name: /log in/i })) - - expect(await screen.findByText(/invalid username or password/i)).toBeInTheDocument() - }) - - it('shows error message on network error (non-401)', async () => { - const user = userEvent.setup() - - worker.use( - http.post('/user/login', () => - HttpResponse.json({ detail: 'internal error' }, { status: 500 }), - ), - ) - - renderWithProviders() - - await user.type(screen.getByLabelText('Username'), 'admin') - await user.type(screen.getByLabelText('Password'), 'password') - await user.click(screen.getByRole('button', { name: /log in/i })) - - expect(await screen.findByText(/invalid username or password/i)).toBeInTheDocument() - }) - - it('calls the login API on form submission and enters pending state', async () => { - const user = userEvent.setup() - - let loginCalled = false - worker.use( - http.post('/user/login', async () => { - loginCalled = true - await delay('infinite') - return HttpResponse.json({ logged_in: true, username: 'admin' }) - }), - ) - - renderWithProviders() - - await user.type(screen.getByLabelText('Username'), 'admin') - await user.type(screen.getByLabelText('Password'), 'password') - await user.click(screen.getByRole('button', { name: /log in/i })) - - expect(await screen.findByRole('button', { name: /logging in/i })).toBeDisabled() - expect(loginCalled).toBe(true) - }) - - it('has no critical accessibility violations', async () => { - const { container } = renderWithProviders() - const results = await axe.run(container) - const critical = results.violations.filter(v => v.impact === 'critical' || v.impact === 'serious') - expect(critical).toEqual([]) - }) -}) + it('renders the login form', () => { + renderWithProviders(); + expect(screen.getByLabelText('Username')).toBeInTheDocument(); + expect(screen.getByLabelText('Password')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /log in/i })).toBeInTheDocument(); + }); + + it('shows "Logging in..." while submitting', async () => { + const user = userEvent.setup(); + + worker.use( + http.post('/user/login', async () => { + await delay('infinite'); + return HttpResponse.json({ logged_in: true }); + }), + ); + + renderWithProviders(); + + await user.type(screen.getByLabelText('Username'), 'admin'); + await user.type(screen.getByLabelText('Password'), 'password'); + await user.click(screen.getByRole('button', { name: /log in/i })); + + expect(await screen.findByRole('button', { name: /logging in/i })).toBeDisabled(); + }); + + it('shows error message on failed login (401)', async () => { + const user = userEvent.setup(); + + worker.use( + http.post('/user/login', () => + HttpResponse.json({ error: 'bad credentials' }, { status: 401 }), + ), + ); + + renderWithProviders(); + + await user.type(screen.getByLabelText('Username'), 'admin'); + await user.type(screen.getByLabelText('Password'), 'wrong'); + await user.click(screen.getByRole('button', { name: /log in/i })); + + expect(await screen.findByText(/invalid username or password/i)).toBeInTheDocument(); + }); + + it('shows error message on network error (non-401)', async () => { + const user = userEvent.setup(); + + worker.use( + http.post('/user/login', () => + HttpResponse.json({ detail: 'internal error' }, { status: 500 }), + ), + ); + + renderWithProviders(); + + await user.type(screen.getByLabelText('Username'), 'admin'); + await user.type(screen.getByLabelText('Password'), 'password'); + await user.click(screen.getByRole('button', { name: /log in/i })); + + expect(await screen.findByText(/invalid username or password/i)).toBeInTheDocument(); + }); + + it('calls the login API on form submission and enters pending state', async () => { + const user = userEvent.setup(); + + let loginCalled = false; + worker.use( + http.post('/user/login', async () => { + loginCalled = true; + await delay('infinite'); + return HttpResponse.json({ logged_in: true, username: 'admin' }); + }), + ); + + renderWithProviders(); + + await user.type(screen.getByLabelText('Username'), 'admin'); + await user.type(screen.getByLabelText('Password'), 'password'); + await user.click(screen.getByRole('button', { name: /log in/i })); + + expect(await screen.findByRole('button', { name: /logging in/i })).toBeDisabled(); + expect(loginCalled).toBe(true); + }); + + it('has no critical accessibility violations', async () => { + const { container } = renderWithProviders(); + const results = await axe.run(container); + const critical = results.violations.filter( + (v) => v.impact === 'critical' || v.impact === 'serious', + ); + expect(critical).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/pages/OAuthBrokersPage.test.tsx b/ui/src/__tests__/pages/OAuthBrokersPage.test.tsx index df16298c..44bfc1ab 100644 --- a/ui/src/__tests__/pages/OAuthBrokersPage.test.tsx +++ b/ui/src/__tests__/pages/OAuthBrokersPage.test.tsx @@ -1,96 +1,111 @@ -import { screen, waitFor, renderWithProviders, userEvent, createErrorHandler } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse } from 'msw' -import axe from 'axe-core' -import OAuthBrokersPage from '../../pages/OAuthBrokersPage' +import { http, HttpResponse } from 'msw'; +import axe from 'axe-core'; +import { screen, waitFor, renderWithProviders, userEvent, createErrorHandler } from '../test-utils'; +import { worker } from '../mocks/browser'; +import OAuthBrokersPage from '@/pages/OAuthBrokersPage'; describe('OAuthBrokersPage', () => { - it('renders the heading', async () => { - renderWithProviders() - expect(await screen.findByRole('heading', { name: /oauth brokers/i })).toBeInTheDocument() - }) - - it('shows empty state when no brokers configured', async () => { - renderWithProviders() - expect(await screen.findByText(/no oauth brokers configured/i)).toBeInTheDocument() - expect(screen.getByText(/add your first broker/i)).toBeInTheDocument() - }) - - it('renders broker cards with populated data', async () => { - worker.use( - http.get('/oauth-brokers', () => - HttpResponse.json([ - { id: 'pipedream-1', type: 'pipedream', config: { project_id: 'proj-abc', default_external_user_id: 'default' }, created_at: String(Math.floor(Date.now() / 1000)) }, - { id: 'pipedream-2', type: 'pipedream', config: { project_id: 'proj-xyz', default_external_user_id: 'agent-1' }, created_at: String(Math.floor(Date.now() / 1000)) }, - ]), - ), - ) - - renderWithProviders() - - expect(await screen.findByText('pipedream-1')).toBeInTheDocument() - expect(screen.getByText('pipedream-2')).toBeInTheDocument() - expect(screen.getByText('project: proj-abc')).toBeInTheDocument() - expect(screen.getByText('project: proj-xyz')).toBeInTheDocument() - }) - - it('opens add broker form on button click', async () => { - const user = userEvent.setup() - renderWithProviders() - - await screen.findByRole('heading', { name: /oauth brokers/i }) - await user.click(screen.getByRole('button', { name: /add broker/i })) - - expect(await screen.findByText(/add oauth broker/i)).toBeInTheDocument() - expect(screen.getByLabelText(/broker id/i)).toBeInTheDocument() - expect(screen.getByLabelText(/client id/i)).toBeInTheDocument() - }) - - it('submits add broker form successfully', async () => { - const user = userEvent.setup() - renderWithProviders() - - await screen.findByRole('heading', { name: /oauth brokers/i }) - await user.click(screen.getByRole('button', { name: /add broker/i })) - - await user.type(screen.getByLabelText(/broker id/i), 'my-broker') - await user.type(screen.getByLabelText(/client id/i), 'client-123') - await user.type(screen.getByLabelText(/client secret/i), 'secret-456') - await user.type(screen.getByLabelText(/project id/i), 'proj-789') - - await user.click(screen.getByRole('button', { name: /create broker/i })) - - await waitFor(() => { - expect(screen.queryByText(/add oauth broker/i)).not.toBeInTheDocument() - }) - }) - - it('shows error on failed broker creation', async () => { - worker.use( - createErrorHandler('post', '/oauth-brokers', { status: 500, body: { detail: 'Server error' } }), - ) - - const user = userEvent.setup() - renderWithProviders() - - await screen.findByRole('heading', { name: /oauth brokers/i }) - await user.click(screen.getByRole('button', { name: /add broker/i })) - - await user.type(screen.getByLabelText(/broker id/i), 'bad-broker') - await user.type(screen.getByLabelText(/client id/i), 'client-fail') - await user.type(screen.getByLabelText(/client secret/i), 'secret-fail') - await user.type(screen.getByLabelText(/project id/i), 'proj-fail') - - await user.click(screen.getByRole('button', { name: /create broker/i })) - - expect(await screen.findByRole('alert')).toBeInTheDocument() - }) - - it('has no critical accessibility violations', async () => { - const { container } = renderWithProviders() - await screen.findByRole('heading', { name: /oauth brokers/i }) - const results = await axe.run(container) - const serious = results.violations.filter(v => v.impact === 'critical' || v.impact === 'serious') - expect(serious).toEqual([]) - }) -}) + it('renders the heading', async () => { + renderWithProviders(); + expect(await screen.findByRole('heading', { name: /oauth brokers/i })).toBeInTheDocument(); + }); + + it('shows empty state when no brokers configured', async () => { + renderWithProviders(); + expect(await screen.findByText(/no oauth brokers configured/i)).toBeInTheDocument(); + expect(screen.getByText(/add your first broker/i)).toBeInTheDocument(); + }); + + it('renders broker cards with populated data', async () => { + worker.use( + http.get('/oauth-brokers', () => + HttpResponse.json([ + { + id: 'pipedream-1', + type: 'pipedream', + config: { project_id: 'proj-abc', default_external_user_id: 'default' }, + created_at: String(Math.floor(Date.now() / 1000)), + }, + { + id: 'pipedream-2', + type: 'pipedream', + config: { project_id: 'proj-xyz', default_external_user_id: 'agent-1' }, + created_at: String(Math.floor(Date.now() / 1000)), + }, + ]), + ), + ); + + renderWithProviders(); + + expect(await screen.findByText('pipedream-1')).toBeInTheDocument(); + expect(screen.getByText('pipedream-2')).toBeInTheDocument(); + expect(screen.getByText('project: proj-abc')).toBeInTheDocument(); + expect(screen.getByText('project: proj-xyz')).toBeInTheDocument(); + }); + + it('opens add broker form on button click', async () => { + const user = userEvent.setup(); + renderWithProviders(); + + await screen.findByRole('heading', { name: /oauth brokers/i }); + await user.click(screen.getByRole('button', { name: /add broker/i })); + + expect(await screen.findByText(/add oauth broker/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/broker id/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/client id/i)).toBeInTheDocument(); + }); + + it('submits add broker form successfully', async () => { + const user = userEvent.setup(); + renderWithProviders(); + + await screen.findByRole('heading', { name: /oauth brokers/i }); + await user.click(screen.getByRole('button', { name: /add broker/i })); + + await user.type(screen.getByLabelText(/broker id/i), 'my-broker'); + await user.type(screen.getByLabelText(/client id/i), 'client-123'); + await user.type(screen.getByLabelText(/client secret/i), 'secret-456'); + await user.type(screen.getByLabelText(/project id/i), 'proj-789'); + + await user.click(screen.getByRole('button', { name: /create broker/i })); + + await waitFor(() => { + expect(screen.queryByText(/add oauth broker/i)).not.toBeInTheDocument(); + }); + }); + + it('shows error on failed broker creation', async () => { + worker.use( + createErrorHandler('post', '/oauth-brokers', { + status: 500, + body: { detail: 'Server error' }, + }), + ); + + const user = userEvent.setup(); + renderWithProviders(); + + await screen.findByRole('heading', { name: /oauth brokers/i }); + await user.click(screen.getByRole('button', { name: /add broker/i })); + + await user.type(screen.getByLabelText(/broker id/i), 'bad-broker'); + await user.type(screen.getByLabelText(/client id/i), 'client-fail'); + await user.type(screen.getByLabelText(/client secret/i), 'secret-fail'); + await user.type(screen.getByLabelText(/project id/i), 'proj-fail'); + + await user.click(screen.getByRole('button', { name: /create broker/i })); + + expect(await screen.findByRole('alert')).toBeInTheDocument(); + }); + + it('has no critical accessibility violations', async () => { + const { container } = renderWithProviders(); + await screen.findByRole('heading', { name: /oauth brokers/i }); + const results = await axe.run(container); + const serious = results.violations.filter( + (v) => v.impact === 'critical' || v.impact === 'serious', + ); + expect(serious).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/pages/SearchPage.test.tsx b/ui/src/__tests__/pages/SearchPage.test.tsx index b888e3ef..52d62669 100644 --- a/ui/src/__tests__/pages/SearchPage.test.tsx +++ b/ui/src/__tests__/pages/SearchPage.test.tsx @@ -1,59 +1,71 @@ -import { screen, waitFor, renderWithProviders } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse } from 'msw' -import axe from 'axe-core' -import SearchPage from '../../pages/SearchPage' +import { http, HttpResponse } from 'msw'; +import axe from 'axe-core'; +import { screen, renderWithProviders } from '../test-utils'; +import { worker } from '../mocks/browser'; +import SearchPage from '@/pages/SearchPage'; describe('SearchPage', () => { - it('renders heading and search input', async () => { - renderWithProviders() - expect(await screen.findByRole('heading', { name: /search/i })).toBeInTheDocument() - expect(screen.getByLabelText(/search apis/i)).toBeInTheDocument() - }) - - it('shows example queries in initial state', async () => { - renderWithProviders() - await screen.findByRole('heading', { name: /search/i }) - expect(screen.getByText('send an email')).toBeInTheDocument() - expect(screen.getByText('post a Slack message')).toBeInTheDocument() - }) - - it('shows results when search query matches', async () => { - worker.use( - http.get('/search', ({ request }) => { - const url = new URL(request.url) - if (url.searchParams.get('q')) { - return HttpResponse.json([ - { id: 'POST/api.sendgrid.com/v3/mail/send', type: 'operation', source: 'local', summary: 'Send an email', score: 0.95 }, - { id: 'POST/api.mailgun.com/v3/messages', type: 'operation', source: 'catalog', summary: 'Send message', score: 0.8 }, - ]) - } - return HttpResponse.json([]) - }), - ) - - renderWithProviders(, { route: '/search?q=send+email' }) - - expect(await screen.findByText('Send an email')).toBeInTheDocument() - expect(screen.getByText('Send message')).toBeInTheDocument() - expect(screen.getByText(/2 results/)).toBeInTheDocument() - }) - - it('shows empty state for queries with no results', async () => { - worker.use( - http.get('/search', () => HttpResponse.json([])), - ) - - renderWithProviders(, { route: '/search?q=xyznonexistent' }) - - expect(await screen.findByText(/no results for/i)).toBeInTheDocument() - }) - - it('has no critical accessibility violations', async () => { - const { container } = renderWithProviders() - await screen.findByRole('heading', { name: /search/i }) - const results = await axe.run(container) - const serious = results.violations.filter(v => v.impact === 'critical' || v.impact === 'serious') - expect(serious).toEqual([]) - }) -}) + it('renders heading and search input', async () => { + renderWithProviders(); + expect(await screen.findByRole('heading', { name: /search/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/search apis/i)).toBeInTheDocument(); + }); + + it('shows example queries in initial state', async () => { + renderWithProviders(); + await screen.findByRole('heading', { name: /search/i }); + expect(screen.getByText('send an email')).toBeInTheDocument(); + expect(screen.getByText('post a Slack message')).toBeInTheDocument(); + }); + + it('shows results when search query matches', async () => { + worker.use( + http.get('/search', ({ request }) => { + const url = new URL(request.url); + if (url.searchParams.get('q')) { + return HttpResponse.json([ + { + id: 'POST/api.sendgrid.com/v3/mail/send', + type: 'operation', + source: 'local', + summary: 'Send an email', + score: 0.95, + }, + { + id: 'POST/api.mailgun.com/v3/messages', + type: 'operation', + source: 'catalog', + summary: 'Send message', + score: 0.8, + }, + ]); + } + return HttpResponse.json([]); + }), + ); + + renderWithProviders(, { route: '/search?q=send+email' }); + + expect(await screen.findByText('Send an email')).toBeInTheDocument(); + expect(screen.getByText('Send message')).toBeInTheDocument(); + expect(screen.getByText(/2 results/)).toBeInTheDocument(); + }); + + it('shows empty state for queries with no results', async () => { + worker.use(http.get('/search', () => HttpResponse.json([]))); + + renderWithProviders(, { route: '/search?q=xyznonexistent' }); + + expect(await screen.findByText(/no results for/i)).toBeInTheDocument(); + }); + + it('has no critical accessibility violations', async () => { + const { container } = renderWithProviders(); + await screen.findByRole('heading', { name: /search/i }); + const results = await axe.run(container); + const serious = results.violations.filter( + (v) => v.impact === 'critical' || v.impact === 'serious', + ); + expect(serious).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/pages/SetupPage.test.tsx b/ui/src/__tests__/pages/SetupPage.test.tsx index caac8903..aa5d4aad 100644 --- a/ui/src/__tests__/pages/SetupPage.test.tsx +++ b/ui/src/__tests__/pages/SetupPage.test.tsx @@ -1,212 +1,184 @@ -import { screen, waitFor, renderWithProviders, userEvent } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse, delay } from 'msw' -import axe from 'axe-core' -import SetupPage from '../../pages/SetupPage' +import { http, HttpResponse, delay } from 'msw'; +import axe from 'axe-core'; +import { screen, renderWithProviders, userEvent } from '../test-utils'; +import { worker } from '../mocks/browser'; +import SetupPage from '@/pages/SetupPage'; describe('SetupPage — Step 1: Account creation', () => { - it('renders the account creation form when setup is required', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'setup_required' }), - ), - ) - - renderWithProviders() - - expect(await screen.findByText(/create admin account/i)).toBeInTheDocument() - expect(screen.getByText(/username/i)).toBeInTheDocument() - expect(screen.getByText(/password/i)).toBeInTheDocument() - expect(screen.getByRole('button', { name: /create account/i })).toBeInTheDocument() - }) - - it('shows "Setup complete" when health is ok', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'ok' }), - ), - ) - - renderWithProviders() - expect(await screen.findByText(/setup complete/i)).toBeInTheDocument() - expect(screen.getByRole('button', { name: /go to dashboard/i })).toBeInTheDocument() - }) - - it('advances to key step after account creation', async () => { - const user = userEvent.setup() - - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'setup_required' }), - ), - http.post('/user/create', () => - HttpResponse.json({ username: 'admin' }), - ), - http.post('/user/login', () => - HttpResponse.json({ logged_in: true }), - ), - ) - - renderWithProviders() - - await screen.findByText(/create admin account/i) - await user.type(screen.getByLabelText('Username'), 'admin') - await user.type(screen.getByLabelText('Password'), 'password123') - await user.click(screen.getByRole('button', { name: /create account/i })) - - expect(await screen.findByText(/admin account created/i)).toBeInTheDocument() - }) - - it('shows "Creating..." while submitting account', async () => { - const user = userEvent.setup() - - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'setup_required' }), - ), - http.post('/user/create', async () => { - await delay(500) - return HttpResponse.json({ username: 'admin' }) - }), - ) - - renderWithProviders() - - await screen.findByText(/create admin account/i) - await user.type(screen.getByLabelText('Username'), 'admin') - await user.type(screen.getByLabelText('Password'), 'password123') - await user.click(screen.getByRole('button', { name: /create account/i })) - - expect(await screen.findByRole('button', { name: /creating/i })).toBeDisabled() - }) - - it('shows warning when account already exists (409)', async () => { - const user = userEvent.setup() - - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'account_required' }), - ), - http.post('/user/create', () => - HttpResponse.json({ detail: 'already exists' }, { status: 409 }), - ), - ) - - renderWithProviders() - - await screen.findByText(/create admin account/i) - await user.type(screen.getByLabelText('Username'), 'admin') - await user.type(screen.getByLabelText('Password'), 'pass') - await user.click(screen.getByRole('button', { name: /create account/i })) - - expect(await screen.findByText(/already exists/i)).toBeInTheDocument() - }) - - it('shows generic error for non-409 failure', async () => { - const user = userEvent.setup() - - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'setup_required' }), - ), - http.post('/user/create', () => - HttpResponse.json({ detail: 'internal error' }, { status: 500 }), - ), - ) - - renderWithProviders() - - await screen.findByText(/create admin account/i) - await user.type(screen.getByLabelText('Username'), 'admin') - await user.type(screen.getByLabelText('Password'), 'pass') - await user.click(screen.getByRole('button', { name: /create account/i })) - - expect(await screen.findByText(/something went wrong/i)).toBeInTheDocument() - }) - - it('has no critical accessibility violations', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'setup_required' }), - ), - ) - - const { container } = renderWithProviders() - await screen.findByText(/create admin account/i) - const results = await axe.run(container) - const critical = results.violations.filter(v => v.impact === 'critical' || v.impact === 'serious') - expect(critical).toEqual([]) - }) -}) + it('renders the account creation form when setup is required', async () => { + worker.use(http.get('/health', () => HttpResponse.json({ status: 'setup_required' }))); + + renderWithProviders(); + + expect(await screen.findByText(/create admin account/i)).toBeInTheDocument(); + expect(screen.getByText(/username/i)).toBeInTheDocument(); + expect(screen.getByText(/password/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /create account/i })).toBeInTheDocument(); + }); + + it('shows "Setup complete" when health is ok', async () => { + worker.use(http.get('/health', () => HttpResponse.json({ status: 'ok' }))); + + renderWithProviders(); + expect(await screen.findByText(/setup complete/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /go to dashboard/i })).toBeInTheDocument(); + }); + + it('advances to key step after account creation', async () => { + const user = userEvent.setup(); + + worker.use( + http.get('/health', () => HttpResponse.json({ status: 'setup_required' })), + http.post('/user/create', () => HttpResponse.json({ username: 'admin' })), + http.post('/user/login', () => HttpResponse.json({ logged_in: true })), + ); + + renderWithProviders(); + + await screen.findByText(/create admin account/i); + await user.type(screen.getByLabelText('Username'), 'admin'); + await user.type(screen.getByLabelText('Password'), 'password123'); + await user.click(screen.getByRole('button', { name: /create account/i })); + + expect(await screen.findByText(/admin account created/i)).toBeInTheDocument(); + }); + + it('shows "Creating..." while submitting account', async () => { + const user = userEvent.setup(); + + worker.use( + http.get('/health', () => HttpResponse.json({ status: 'setup_required' })), + http.post('/user/create', async () => { + await delay(500); + return HttpResponse.json({ username: 'admin' }); + }), + ); + + renderWithProviders(); + + await screen.findByText(/create admin account/i); + await user.type(screen.getByLabelText('Username'), 'admin'); + await user.type(screen.getByLabelText('Password'), 'password123'); + await user.click(screen.getByRole('button', { name: /create account/i })); + + expect(await screen.findByRole('button', { name: /creating/i })).toBeDisabled(); + }); + + it('shows warning when account already exists (409)', async () => { + const user = userEvent.setup(); + + worker.use( + http.get('/health', () => HttpResponse.json({ status: 'account_required' })), + http.post('/user/create', () => + HttpResponse.json({ detail: 'already exists' }, { status: 409 }), + ), + ); + + renderWithProviders(); + + await screen.findByText(/create admin account/i); + await user.type(screen.getByLabelText('Username'), 'admin'); + await user.type(screen.getByLabelText('Password'), 'pass'); + await user.click(screen.getByRole('button', { name: /create account/i })); + + expect(await screen.findByText(/already exists/i)).toBeInTheDocument(); + }); + + it('shows generic error for non-409 failure', async () => { + const user = userEvent.setup(); + + worker.use( + http.get('/health', () => HttpResponse.json({ status: 'setup_required' })), + http.post('/user/create', () => + HttpResponse.json({ detail: 'internal error' }, { status: 500 }), + ), + ); + + renderWithProviders(); + + await screen.findByText(/create admin account/i); + await user.type(screen.getByLabelText('Username'), 'admin'); + await user.type(screen.getByLabelText('Password'), 'pass'); + await user.click(screen.getByRole('button', { name: /create account/i })); + + expect(await screen.findByText(/something went wrong/i)).toBeInTheDocument(); + }); + + it('has no critical accessibility violations', async () => { + worker.use(http.get('/health', () => HttpResponse.json({ status: 'setup_required' }))); + + const { container } = renderWithProviders(); + await screen.findByText(/create admin account/i); + const results = await axe.run(container); + const critical = results.violations.filter( + (v) => v.impact === 'critical' || v.impact === 'serious', + ); + expect(critical).toEqual([]); + }); +}); describe('SetupPage — Step 2: Key generation', () => { - async function advanceToKeyStep() { - const user = userEvent.setup() - - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'setup_required' }), - ), - http.post('/user/create', () => - HttpResponse.json({ username: 'admin' }), - ), - http.post('/user/login', () => - HttpResponse.json({ logged_in: true }), - ), - ) - - const result = renderWithProviders() - - await screen.findByText(/create admin account/i) - await user.type(screen.getByLabelText('Username'), 'admin') - await user.type(screen.getByLabelText('Password'), 'password123') - await user.click(screen.getByRole('button', { name: /create account/i })) - - await screen.findByText(/admin account created/i) - return { user, ...result } - } - - it('shows "Generate Agent API Key" button on key step', async () => { - await advanceToKeyStep() - - expect(screen.getByRole('button', { name: /generate agent api key/i })).toBeInTheDocument() - }) - - it('shows "Generating..." while key is being created', async () => { - worker.use( - http.post('/default-api-key/generate', async () => { - await delay(500) - return HttpResponse.json({ key: 'jntc_test_key_abc123' }) - }), - ) - - const { user } = await advanceToKeyStep() - - await user.click(screen.getByRole('button', { name: /generate agent api key/i })) - - expect(await screen.findByRole('button', { name: /generating/i })).toBeDisabled() - }) - - it('displays the generated key and "Copy Key" button', async () => { - const { user } = await advanceToKeyStep() - - await user.click(screen.getByRole('button', { name: /generate agent api key/i })) - - expect(await screen.findByText('jntc_test_key_abc123')).toBeInTheDocument() - expect(screen.getByText(/will not be shown again/i)).toBeInTheDocument() - expect(screen.getByRole('button', { name: /copy key/i })).toBeInTheDocument() - }) - - it('auto-advances when health shows account_created', async () => { - worker.use( - http.get('/health', () => - HttpResponse.json({ status: 'setup_required', account_created: true }), - ), - ) - - renderWithProviders() - - expect(await screen.findByText(/admin account created/i)).toBeInTheDocument() - expect(screen.getByRole('button', { name: /generate agent api key/i })).toBeInTheDocument() - }) -}) + async function advanceToKeyStep() { + const user = userEvent.setup(); + + worker.use( + http.get('/health', () => HttpResponse.json({ status: 'setup_required' })), + http.post('/user/create', () => HttpResponse.json({ username: 'admin' })), + http.post('/user/login', () => HttpResponse.json({ logged_in: true })), + ); + + const result = renderWithProviders(); + + await screen.findByText(/create admin account/i); + await user.type(screen.getByLabelText('Username'), 'admin'); + await user.type(screen.getByLabelText('Password'), 'password123'); + await user.click(screen.getByRole('button', { name: /create account/i })); + + await screen.findByText(/admin account created/i); + return { user, ...result }; + } + + it('shows "Generate Agent API Key" button on key step', async () => { + await advanceToKeyStep(); + + expect(screen.getByRole('button', { name: /generate agent api key/i })).toBeInTheDocument(); + }); + + it('shows "Generating..." while key is being created', async () => { + worker.use( + http.post('/default-api-key/generate', async () => { + await delay(500); + return HttpResponse.json({ key: 'jntc_test_key_abc123' }); + }), + ); + + const { user } = await advanceToKeyStep(); + + await user.click(screen.getByRole('button', { name: /generate agent api key/i })); + + expect(await screen.findByRole('button', { name: /generating/i })).toBeDisabled(); + }); + + it('displays the generated key and "Copy Key" button', async () => { + const { user } = await advanceToKeyStep(); + + await user.click(screen.getByRole('button', { name: /generate agent api key/i })); + + expect(await screen.findByText('jntc_test_key_abc123')).toBeInTheDocument(); + expect(screen.getByText(/will not be shown again/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /copy key/i })).toBeInTheDocument(); + }); + + it('auto-advances when health shows account_created', async () => { + worker.use( + http.get('/health', () => + HttpResponse.json({ status: 'setup_required', account_created: true }), + ), + ); + + renderWithProviders(); + + expect(await screen.findByText(/admin account created/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /generate agent api key/i })).toBeInTheDocument(); + }); +}); diff --git a/ui/src/__tests__/pages/ToolkitDetailPage.test.tsx b/ui/src/__tests__/pages/ToolkitDetailPage.test.tsx index 75cb9091..6a5b465b 100644 --- a/ui/src/__tests__/pages/ToolkitDetailPage.test.tsx +++ b/ui/src/__tests__/pages/ToolkitDetailPage.test.tsx @@ -1,333 +1,350 @@ -import { screen, waitFor, renderWithProviders, userEvent, createErrorHandler } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse, delay } from 'msw' -import axe from 'axe-core' -import ToolkitDetailPage from '../../pages/ToolkitDetailPage' +import { http, HttpResponse, delay } from 'msw'; +import axe from 'axe-core'; +import { screen, waitFor, renderWithProviders, userEvent, createErrorHandler } from '../test-utils'; +import { worker } from '../mocks/browser'; +import ToolkitDetailPage from '@/pages/ToolkitDetailPage'; function renderToolkit(id = 'test-tk') { - return renderWithProviders(, { - route: `/toolkits/${id}`, - path: '/toolkits/:id', - }) + return renderWithProviders(, { + route: `/toolkits/${id}`, + path: '/toolkits/:id', + }); } describe('ToolkitDetailPage — read states', () => { - it('renders toolkit name and description', async () => { - renderToolkit() - - expect(await screen.findByText('Test Toolkit')).toBeInTheDocument() - expect(screen.getByText('A test toolkit')).toBeInTheDocument() - }) - - it('shows loading state before data arrives', async () => { - worker.use( - http.get('/toolkits/:id', async () => { - await delay(300) - return HttpResponse.json({ - id: 'test-tk', name: 'Test Toolkit', description: 'A test toolkit', - disabled: false, credentials: [], - }) - }), - ) - - renderToolkit() - expect(screen.getByText(/loading toolkit/i)).toBeInTheDocument() - expect(await screen.findByText('Test Toolkit')).toBeInTheDocument() - }) - - it('shows "Toolkit not found" when API returns 404', async () => { - worker.use( - http.get('/toolkits/:id', () => - HttpResponse.json(null, { status: 404 }), - ), - ) - - renderToolkit() - expect(await screen.findByText(/toolkit not found/i)).toBeInTheDocument() - expect(screen.getByRole('button', { name: /back/i })).toBeInTheDocument() - }) - - it('shows empty keys message when no keys exist', async () => { - renderToolkit() - - await screen.findByText('Test Toolkit') - expect(screen.getByText(/no keys yet/i)).toBeInTheDocument() - }) - - it('renders keys when they exist', async () => { - worker.use( - http.get('/toolkits/:id/keys', () => - HttpResponse.json({ - keys: [ - { id: 'k1', label: 'Production Key', prefix: 'jntc_abc', created_at: 1700000000 }, - ], - }), - ), - ) - - renderToolkit() - expect(await screen.findByText('Production Key')).toBeInTheDocument() - expect(screen.getByText('jntc_abc...')).toBeInTheDocument() - }) - - it('renders credentials section', async () => { - worker.use( - http.get('/toolkits/:id', () => - HttpResponse.json({ - id: 'test-tk', name: 'Test Toolkit', description: 'desc', - disabled: false, - credentials: [ - { credential_id: 'c1', label: 'Stripe Token', api_id: 'stripe.com' }, - ], - }), - ), - ) - - renderToolkit() - expect(await screen.findByText('Stripe Token')).toBeInTheDocument() - expect(screen.getByText('stripe.com')).toBeInTheDocument() - }) - - it('shows pending requests badge', async () => { - worker.use( - http.get('/toolkits/:id/access-requests', () => - HttpResponse.json([ - { id: 'req1', status: 'pending', type: 'grant', reason: 'Need access' }, - ]), - ), - ) - - renderToolkit() - expect(await screen.findByText(/pending access request/i)).toBeInTheDocument() - }) - - it('handles API error gracefully', async () => { - worker.use( - http.get('/toolkits/:id', () => HttpResponse.error()), - ) - - renderToolkit() - expect(await screen.findByText(/toolkit not found/i)).toBeInTheDocument() - }) - - it('hides Settings button for the default toolkit', async () => { - worker.use( - http.get('/toolkits/:id', () => - HttpResponse.json({ - id: 'default', name: 'Default Toolkit', description: 'The default', - disabled: false, credentials: [], - }), - ), - ) - - renderToolkit('default') - await screen.findByText('Default Toolkit') - expect(screen.queryByRole('button', { name: /settings/i })).not.toBeInTheDocument() - }) - - it('has no critical accessibility violations', async () => { - const { container } = renderToolkit() - await screen.findByText('Test Toolkit') - const results = await axe.run(container) - const critical = results.violations.filter(v => v.impact === 'critical' || v.impact === 'serious') - expect(critical).toEqual([]) - }) -}) + it('renders toolkit name and description', async () => { + renderToolkit(); + + expect(await screen.findByText('Test Toolkit')).toBeInTheDocument(); + expect(screen.getByText('A test toolkit')).toBeInTheDocument(); + }); + + it('shows loading state before data arrives', async () => { + worker.use( + http.get('/toolkits/:id', async () => { + await delay(300); + return HttpResponse.json({ + id: 'test-tk', + name: 'Test Toolkit', + description: 'A test toolkit', + disabled: false, + credentials: [], + }); + }), + ); + + renderToolkit(); + expect(screen.getByText(/loading toolkit/i)).toBeInTheDocument(); + expect(await screen.findByText('Test Toolkit')).toBeInTheDocument(); + }); + + it('shows "Toolkit not found" when API returns 404', async () => { + worker.use(http.get('/toolkits/:id', () => HttpResponse.json(null, { status: 404 }))); + + renderToolkit(); + expect(await screen.findByText(/toolkit not found/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /back/i })).toBeInTheDocument(); + }); + + it('shows empty keys message when no keys exist', async () => { + renderToolkit(); + + await screen.findByText('Test Toolkit'); + expect(screen.getByText(/no keys yet/i)).toBeInTheDocument(); + }); + + it('renders keys when they exist', async () => { + worker.use( + http.get('/toolkits/:id/keys', () => + HttpResponse.json({ + keys: [ + { + id: 'k1', + label: 'Production Key', + prefix: 'jntc_abc', + created_at: 1700000000, + }, + ], + }), + ), + ); + + renderToolkit(); + expect(await screen.findByText('Production Key')).toBeInTheDocument(); + expect(screen.getByText('jntc_abc...')).toBeInTheDocument(); + }); + + it('renders credentials section', async () => { + worker.use( + http.get('/toolkits/:id', () => + HttpResponse.json({ + id: 'test-tk', + name: 'Test Toolkit', + description: 'desc', + disabled: false, + credentials: [ + { credential_id: 'c1', label: 'Stripe Token', api_id: 'stripe.com' }, + ], + }), + ), + ); + + renderToolkit(); + expect(await screen.findByText('Stripe Token')).toBeInTheDocument(); + expect(screen.getByText('stripe.com')).toBeInTheDocument(); + }); + + it('shows pending requests badge', async () => { + worker.use( + http.get('/toolkits/:id/access-requests', () => + HttpResponse.json([ + { id: 'req1', status: 'pending', type: 'grant', reason: 'Need access' }, + ]), + ), + ); + + renderToolkit(); + expect(await screen.findByText(/pending access request/i)).toBeInTheDocument(); + }); + + it('handles API error gracefully', async () => { + worker.use(http.get('/toolkits/:id', () => HttpResponse.error())); + + renderToolkit(); + expect(await screen.findByText(/toolkit not found/i)).toBeInTheDocument(); + }); + + it('hides Settings button for the default toolkit', async () => { + worker.use( + http.get('/toolkits/:id', () => + HttpResponse.json({ + id: 'default', + name: 'Default Toolkit', + description: 'The default', + disabled: false, + credentials: [], + }), + ), + ); + + renderToolkit('default'); + await screen.findByText('Default Toolkit'); + expect(screen.queryByRole('button', { name: /settings/i })).not.toBeInTheDocument(); + }); + + it('has no critical accessibility violations', async () => { + const { container } = renderToolkit(); + await screen.findByText('Test Toolkit'); + const results = await axe.run(container); + const critical = results.violations.filter( + (v) => v.impact === 'critical' || v.impact === 'serious', + ); + expect(critical).toEqual([]); + }); +}); describe('ToolkitDetailPage — create key flow', () => { - it('opens key creation form and generates a key', async () => { - const user = userEvent.setup() + it('opens key creation form and generates a key', async () => { + const user = userEvent.setup(); - renderToolkit() - await screen.findByText('Test Toolkit') + renderToolkit(); + await screen.findByText('Test Toolkit'); - await user.click(screen.getByRole('button', { name: /create key/i })) - expect(screen.getByText(/create api key/i)).toBeInTheDocument() + await user.click(screen.getByRole('button', { name: /create key/i })); + expect(screen.getByText(/create api key/i)).toBeInTheDocument(); - const input = screen.getByPlaceholderText(/key name/i) - await user.type(input, 'My Key') - await user.click(screen.getByRole('button', { name: /generate/i })) + const input = screen.getByPlaceholderText(/key name/i); + await user.type(input, 'My Key'); + await user.click(screen.getByRole('button', { name: /generate/i })); - expect(await screen.findByText(/new api key created/i)).toBeInTheDocument() - }) + expect(await screen.findByText(/new api key created/i)).toBeInTheDocument(); + }); - it('shows "Generating..." while key is being created', async () => { - const user = userEvent.setup() + it('shows "Generating..." while key is being created', async () => { + const user = userEvent.setup(); - worker.use( - http.post('/toolkits/:id/keys', async () => { - await delay(500) - return HttpResponse.json({ id: 'k-new', key: 'jntc_new', prefix: 'jntc_', label: 'Test' }) - }), - ) + worker.use( + http.post('/toolkits/:id/keys', async () => { + await delay(500); + return HttpResponse.json({ + id: 'k-new', + key: 'jntc_new', + prefix: 'jntc_', + label: 'Test', + }); + }), + ); - renderToolkit() - await screen.findByText('Test Toolkit') + renderToolkit(); + await screen.findByText('Test Toolkit'); - await user.click(screen.getByRole('button', { name: /create key/i })) - await user.click(screen.getByRole('button', { name: /generate/i })) + await user.click(screen.getByRole('button', { name: /create key/i })); + await user.click(screen.getByRole('button', { name: /generate/i })); - expect(await screen.findByRole('button', { name: /generating/i })).toBeDisabled() - }) -}) + expect(await screen.findByRole('button', { name: /generating/i })).toBeDisabled(); + }); +}); describe('ToolkitDetailPage — revoke key flow', () => { - it('shows revoke confirmation and revokes the key', async () => { - const user = userEvent.setup() - - worker.use( - http.get('/toolkits/:id/keys', () => - HttpResponse.json({ - keys: [{ id: 'k1', label: 'Old Key', prefix: 'jntc_old', created_at: 1700000000 }], - }), - ), - ) - - renderToolkit() - expect(await screen.findByText('Old Key')).toBeInTheDocument() - - const revokeButton = screen.getByRole('button', { name: /^revoke$/i }) - await user.click(revokeButton) - - expect(screen.getByText(/revoke this key/i)).toBeInTheDocument() - - const confirmButton = screen.getAllByRole('button', { name: /revoke/i }).find( - btn => btn.textContent?.trim() === 'Revoke' - )! - await user.click(confirmButton) - - await waitFor(() => { - expect(screen.queryByText(/revoke this key/i)).not.toBeInTheDocument() - }) - }) -}) + it('shows revoke confirmation and revokes the key', async () => { + const user = userEvent.setup(); + + worker.use( + http.get('/toolkits/:id/keys', () => + HttpResponse.json({ + keys: [ + { id: 'k1', label: 'Old Key', prefix: 'jntc_old', created_at: 1700000000 }, + ], + }), + ), + ); + + renderToolkit(); + expect(await screen.findByText('Old Key')).toBeInTheDocument(); + + const revokeButton = screen.getByRole('button', { name: /^revoke$/i }); + await user.click(revokeButton); + + expect(screen.getByText(/revoke this key/i)).toBeInTheDocument(); + + const confirmButton = screen + .getAllByRole('button', { name: /revoke/i }) + .find((btn) => btn.textContent?.trim() === 'Revoke')!; + await user.click(confirmButton); + + await waitFor(() => { + expect(screen.queryByText(/revoke this key/i)).not.toBeInTheDocument(); + }); + }); +}); describe('ToolkitDetailPage — kill switch', () => { - it('shows kill switch confirmation and suspends the toolkit', async () => { - const user = userEvent.setup() - let patched = false - - worker.use( - http.patch('/toolkits/:id', async ({ request }) => { - const body = await request.json() as Record - patched = true - return HttpResponse.json({ - id: 'test-tk', name: 'Test Toolkit', description: 'A test toolkit', - disabled: body.disabled, credentials: [], - }) - }), - ) - - renderToolkit() - await screen.findByText('Test Toolkit') - - await user.click(screen.getByRole('button', { name: /kill switch/i })) - expect(screen.getByText(/block all api access/i)).toBeInTheDocument() - - await user.click(screen.getByRole('button', { name: /kill access/i })) - - await waitFor(() => expect(patched).toBe(true)) - }) -}) + it('shows kill switch confirmation and suspends the toolkit', async () => { + const user = userEvent.setup(); + let patched = false; + + worker.use( + http.patch('/toolkits/:id', async ({ request }) => { + const body = (await request.json()) as Record; + patched = true; + return HttpResponse.json({ + id: 'test-tk', + name: 'Test Toolkit', + description: 'A test toolkit', + disabled: body.disabled, + credentials: [], + }); + }), + ); + + renderToolkit(); + await screen.findByText('Test Toolkit'); + + await user.click(screen.getByRole('button', { name: /kill switch/i })); + expect(screen.getByText(/block all api access/i)).toBeInTheDocument(); + + await user.click(screen.getByRole('button', { name: /kill access/i })); + + await waitFor(() => expect(patched).toBe(true)); + }); +}); describe('ToolkitDetailPage — unbind credential', () => { - it('unbinds a credential via ConfirmInline', async () => { - const user = userEvent.setup() - let unbound = false - - worker.use( - http.get('/toolkits/:id', () => - HttpResponse.json({ - id: 'test-tk', name: 'Test Toolkit', description: 'desc', - disabled: false, - credentials: [{ credential_id: 'c1', label: 'Stripe Token', api_id: 'stripe.com' }], - }), - ), - http.delete('/toolkits/:id/credentials/:credId', () => { - unbound = true - return new HttpResponse(null, { status: 204 }) - }), - ) - - renderToolkit() - expect(await screen.findByText('Stripe Token')).toBeInTheDocument() - - await user.click(screen.getByRole('button', { name: /unbind/i })) - expect(screen.getByText(/unbind this credential/i)).toBeInTheDocument() - - const confirmBtn = screen.getAllByRole('button', { name: /unbind/i }).find( - btn => btn.textContent?.trim() === 'Unbind' - )! - await user.click(confirmBtn) - - await waitFor(() => expect(unbound).toBe(true)) - }) -}) + it('unbinds a credential via ConfirmInline', async () => { + const user = userEvent.setup(); + let unbound = false; + + worker.use( + http.get('/toolkits/:id', () => + HttpResponse.json({ + id: 'test-tk', + name: 'Test Toolkit', + description: 'desc', + disabled: false, + credentials: [ + { credential_id: 'c1', label: 'Stripe Token', api_id: 'stripe.com' }, + ], + }), + ), + http.delete('/toolkits/:id/credentials/:credId', () => { + unbound = true; + return new HttpResponse(null, { status: 204 }); + }), + ); + + renderToolkit(); + expect(await screen.findByText('Stripe Token')).toBeInTheDocument(); + + await user.click(screen.getByRole('button', { name: /unbind/i })); + expect(screen.getByText(/unbind this credential/i)).toBeInTheDocument(); + + const confirmBtn = screen + .getAllByRole('button', { name: /unbind/i }) + .find((btn) => btn.textContent?.trim() === 'Unbind')!; + await user.click(confirmBtn); + + await waitFor(() => expect(unbound).toBe(true)); + }); +}); describe('ToolkitDetailPage — mutation errors', () => { - it('reverts kill switch toggle on server error', async () => { - const user = userEvent.setup() + it('reverts kill switch toggle on server error', async () => { + const user = userEvent.setup(); - worker.use( - createErrorHandler('patch', '/toolkits/:id', { status: 500 }), - ) + worker.use(createErrorHandler('patch', '/toolkits/:id', { status: 500 })); - renderToolkit() - await screen.findByText('Test Toolkit') + renderToolkit(); + await screen.findByText('Test Toolkit'); - await user.click(screen.getByRole('button', { name: /kill switch/i })) - expect(screen.getByText(/block all api access/i)).toBeInTheDocument() + await user.click(screen.getByRole('button', { name: /kill switch/i })); + expect(screen.getByText(/block all api access/i)).toBeInTheDocument(); - await user.click(screen.getByRole('button', { name: /kill access/i })) + await user.click(screen.getByRole('button', { name: /kill access/i })); - await waitFor(() => { - expect(screen.queryByText(/toolkit suspended/i)).not.toBeInTheDocument() - }) - }) + await waitFor(() => { + expect(screen.queryByText(/toolkit suspended/i)).not.toBeInTheDocument(); + }); + }); - it('shows error when creating a key fails with 500', async () => { - const user = userEvent.setup() + it('shows error when creating a key fails with 500', async () => { + const user = userEvent.setup(); - worker.use( - createErrorHandler('post', '/toolkits/:id/keys', { status: 500 }), - ) + worker.use(createErrorHandler('post', '/toolkits/:id/keys', { status: 500 })); - renderToolkit() - await screen.findByText('Test Toolkit') + renderToolkit(); + await screen.findByText('Test Toolkit'); - await user.click(screen.getByRole('button', { name: /create key/i })) - expect(screen.getByText(/create api key/i)).toBeInTheDocument() + await user.click(screen.getByRole('button', { name: /create key/i })); + expect(screen.getByText(/create api key/i)).toBeInTheDocument(); - await user.click(screen.getByRole('button', { name: /generate/i })) + await user.click(screen.getByRole('button', { name: /generate/i })); - await waitFor(() => { - expect(screen.queryByText(/new api key created/i)).not.toBeInTheDocument() - }) - }) + await waitFor(() => { + expect(screen.queryByText(/new api key created/i)).not.toBeInTheDocument(); + }); + }); - it('does not navigate away when deleting a toolkit fails with 500', async () => { - const user = userEvent.setup() + it('does not navigate away when deleting a toolkit fails with 500', async () => { + const user = userEvent.setup(); - worker.use( - createErrorHandler('delete', '/toolkits/:id', { status: 500 }), - ) + worker.use(createErrorHandler('delete', '/toolkits/:id', { status: 500 })); - renderToolkit() - await screen.findByText('Test Toolkit') + renderToolkit(); + await screen.findByText('Test Toolkit'); - await user.click(screen.getByRole('button', { name: /settings/i })) - expect(await screen.findByText(/toolkit settings/i)).toBeInTheDocument() + await user.click(screen.getByRole('button', { name: /settings/i })); + expect(await screen.findByText(/toolkit settings/i)).toBeInTheDocument(); - const deleteButton = screen.getByRole('button', { name: /delete toolkit/i }) - await user.click(deleteButton) + const deleteButton = screen.getByRole('button', { name: /delete toolkit/i }); + await user.click(deleteButton); - expect(screen.getByText(/permanently delete/i)).toBeInTheDocument() + expect(screen.getByText(/permanently delete/i)).toBeInTheDocument(); - const confirmButton = screen.getAllByRole('button', { name: /delete forever/i })[0] - await user.click(confirmButton) + const confirmButton = screen.getAllByRole('button', { name: /delete forever/i })[0]; + await user.click(confirmButton); - await waitFor(() => { - expect(screen.getByText('Test Toolkit')).toBeInTheDocument() - }) - }) -}) + await waitFor(() => { + expect(screen.getByText('Test Toolkit')).toBeInTheDocument(); + }); + }); +}); diff --git a/ui/src/__tests__/pages/ToolkitsPage.test.tsx b/ui/src/__tests__/pages/ToolkitsPage.test.tsx index f6c31f9d..80499927 100644 --- a/ui/src/__tests__/pages/ToolkitsPage.test.tsx +++ b/ui/src/__tests__/pages/ToolkitsPage.test.tsx @@ -1,55 +1,76 @@ -import { screen, waitFor, renderWithProviders, userEvent } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse } from 'msw' -import axe from 'axe-core' -import ToolkitsPage from '../../pages/ToolkitsPage' +import { http, HttpResponse } from 'msw'; +import axe from 'axe-core'; +import { screen, renderWithProviders, userEvent } from '../test-utils'; +import { worker } from '../mocks/browser'; +import ToolkitsPage from '@/pages/ToolkitsPage'; describe('ToolkitsPage', () => { - it('renders the heading', async () => { - renderWithProviders() - expect(await screen.findByRole('heading', { name: /toolkits/i })).toBeInTheDocument() - }) - - it('shows empty state when no toolkits exist', async () => { - renderWithProviders() - expect(await screen.findByText(/no toolkits yet/i)).toBeInTheDocument() - expect(screen.getByText(/create your first toolkit/i)).toBeInTheDocument() - }) - - it('renders toolkit cards with populated data', async () => { - worker.use( - http.get('/toolkits', () => - HttpResponse.json([ - { id: 'tk-1', name: 'My Toolkit', description: 'Test', disabled: false, keys: [], credentials: [], key_count: 2, credential_count: 1 }, - { id: 'tk-2', name: 'Second Toolkit', description: 'Another', disabled: true, keys: [], credentials: [], key_count: 0, credential_count: 0, simulate: true }, - ]), - ), - ) - - renderWithProviders() - - expect(await screen.findByText('My Toolkit')).toBeInTheDocument() - expect(screen.getByText('Second Toolkit')).toBeInTheDocument() - expect(screen.getByText('SUSPENDED')).toBeInTheDocument() - expect(screen.getByText('simulate')).toBeInTheDocument() - }) - - it('opens create modal on button click', async () => { - const user = userEvent.setup() - renderWithProviders() - - await screen.findByRole('heading', { name: /toolkits/i }) - await user.click(screen.getByRole('button', { name: /create toolkit/i })) - - expect(await screen.findByRole('heading', { name: /create toolkit/i })).toBeInTheDocument() - expect(screen.getByLabelText(/name/i)).toBeInTheDocument() - }) - - it('has no critical accessibility violations', async () => { - const { container } = renderWithProviders() - await screen.findByRole('heading', { name: /toolkits/i }) - const results = await axe.run(container) - const serious = results.violations.filter(v => v.impact === 'critical' || v.impact === 'serious') - expect(serious).toEqual([]) - }) -}) + it('renders the heading', async () => { + renderWithProviders(); + expect(await screen.findByRole('heading', { name: /toolkits/i })).toBeInTheDocument(); + }); + + it('shows empty state when no toolkits exist', async () => { + renderWithProviders(); + expect(await screen.findByText(/no toolkits yet/i)).toBeInTheDocument(); + expect(screen.getByText(/create your first toolkit/i)).toBeInTheDocument(); + }); + + it('renders toolkit cards with populated data', async () => { + worker.use( + http.get('/toolkits', () => + HttpResponse.json([ + { + id: 'tk-1', + name: 'My Toolkit', + description: 'Test', + disabled: false, + keys: [], + credentials: [], + key_count: 2, + credential_count: 1, + }, + { + id: 'tk-2', + name: 'Second Toolkit', + description: 'Another', + disabled: true, + keys: [], + credentials: [], + key_count: 0, + credential_count: 0, + simulate: true, + }, + ]), + ), + ); + + renderWithProviders(); + + expect(await screen.findByText('My Toolkit')).toBeInTheDocument(); + expect(screen.getByText('Second Toolkit')).toBeInTheDocument(); + expect(screen.getByText('SUSPENDED')).toBeInTheDocument(); + expect(screen.getByText('simulate')).toBeInTheDocument(); + }); + + it('opens create modal on button click', async () => { + const user = userEvent.setup(); + renderWithProviders(); + + await screen.findByRole('heading', { name: /toolkits/i }); + await user.click(screen.getByRole('button', { name: /create toolkit/i })); + + expect(await screen.findByRole('heading', { name: /create toolkit/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/name/i)).toBeInTheDocument(); + }); + + it('has no critical accessibility violations', async () => { + const { container } = renderWithProviders(); + await screen.findByRole('heading', { name: /toolkits/i }); + const results = await axe.run(container); + const serious = results.violations.filter( + (v) => v.impact === 'critical' || v.impact === 'serious', + ); + expect(serious).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/pages/TracesPage.test.tsx b/ui/src/__tests__/pages/TracesPage.test.tsx index f48e5bef..1c4aa7c3 100644 --- a/ui/src/__tests__/pages/TracesPage.test.tsx +++ b/ui/src/__tests__/pages/TracesPage.test.tsx @@ -1,116 +1,114 @@ -import { screen, waitFor, renderWithProviders, createErrorHandler } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse } from 'msw' -import axe from 'axe-core' -import TracesPage from '../../pages/TracesPage' +import { http, HttpResponse } from 'msw'; +import axe from 'axe-core'; +import { screen, renderWithProviders, createErrorHandler } from '../test-utils'; +import { worker } from '../mocks/browser'; +import TracesPage from '@/pages/TracesPage'; describe('TracesPage', () => { - it('renders the table with column headers', async () => { - worker.use( - http.get('/traces', () => - HttpResponse.json({ - traces: [{ - id: 't-1', - toolkit_id: 'tk-1', - operation_id: 'getUser', - http_status: 200, - duration_ms: 120, - created_at: Math.floor(Date.now() / 1000) - 60, - }], - total: 1, - }), - ), - ) + it('renders the table with column headers', async () => { + worker.use( + http.get('/traces', () => + HttpResponse.json({ + traces: [ + { + id: 't-1', + toolkit_id: 'tk-1', + operation_id: 'getUser', + http_status: 200, + duration_ms: 120, + created_at: Math.floor(Date.now() / 1000) - 60, + }, + ], + total: 1, + }), + ), + ); - renderWithProviders() + renderWithProviders(); - expect(await screen.findByText('Time')).toBeInTheDocument() - expect(screen.getByText('Toolkit')).toBeInTheDocument() - expect(screen.getByText('Operation / Workflow')).toBeInTheDocument() - expect(screen.getByText('Status')).toBeInTheDocument() - expect(screen.getByText('Duration')).toBeInTheDocument() - }) + expect(await screen.findByText('Time')).toBeInTheDocument(); + expect(screen.getByText('Toolkit')).toBeInTheDocument(); + expect(screen.getByText('Operation / Workflow')).toBeInTheDocument(); + expect(screen.getByText('Status')).toBeInTheDocument(); + expect(screen.getByText('Duration')).toBeInTheDocument(); + }); - it('shows empty state when no traces exist', async () => { - worker.use( - http.get('/traces', () => - HttpResponse.json({ traces: [], total: 0 }), - ), - ) + it('shows empty state when no traces exist', async () => { + worker.use(http.get('/traces', () => HttpResponse.json({ traces: [], total: 0 }))); - renderWithProviders() + renderWithProviders(); - expect(await screen.findByText('No traces found')).toBeInTheDocument() - expect(screen.getByText(/Traces appear here when agents call the broker/)).toBeInTheDocument() - }) + expect(await screen.findByText('No traces found')).toBeInTheDocument(); + expect( + screen.getByText(/Traces appear here when agents call the broker/), + ).toBeInTheDocument(); + }); - it('renders populated trace rows with different statuses', async () => { - worker.use( - http.get('/traces', () => - HttpResponse.json({ - traces: [ - { - id: 't-1', - toolkit_id: 'stripe-tk', - operation_id: 'createCharge', - http_status: 200, - duration_ms: 95, - created_at: Math.floor(Date.now() / 1000) - 30, - }, - { - id: 't-2', - toolkit_id: 'github-tk', - operation_id: 'listRepos', - http_status: 404, - duration_ms: 45, - created_at: Math.floor(Date.now() / 1000) - 600, - }, - { - id: 't-3', - toolkit_id: 'slack-tk', - operation_id: null, - workflow_id: 'send-notification', - status: 'error', - http_status: null, - duration_ms: 3200, - created_at: Math.floor(Date.now() / 1000) - 7200, - }, - ], - total: 3, - }), - ), - ) + it('renders populated trace rows with different statuses', async () => { + worker.use( + http.get('/traces', () => + HttpResponse.json({ + traces: [ + { + id: 't-1', + toolkit_id: 'stripe-tk', + operation_id: 'createCharge', + http_status: 200, + duration_ms: 95, + created_at: Math.floor(Date.now() / 1000) - 30, + }, + { + id: 't-2', + toolkit_id: 'github-tk', + operation_id: 'listRepos', + http_status: 404, + duration_ms: 45, + created_at: Math.floor(Date.now() / 1000) - 600, + }, + { + id: 't-3', + toolkit_id: 'slack-tk', + operation_id: null, + workflow_id: 'send-notification', + status: 'error', + http_status: null, + duration_ms: 3200, + created_at: Math.floor(Date.now() / 1000) - 7200, + }, + ], + total: 3, + }), + ), + ); - renderWithProviders() + renderWithProviders(); - expect(await screen.findByText('stripe-tk')).toBeInTheDocument() - expect(screen.getByText('createCharge')).toBeInTheDocument() - expect(screen.getByText('95ms')).toBeInTheDocument() + expect(await screen.findByText('stripe-tk')).toBeInTheDocument(); + expect(screen.getByText('createCharge')).toBeInTheDocument(); + expect(screen.getByText('95ms')).toBeInTheDocument(); - expect(screen.getByText('github-tk')).toBeInTheDocument() - expect(screen.getByText('listRepos')).toBeInTheDocument() - expect(screen.getByText('45ms')).toBeInTheDocument() + expect(screen.getByText('github-tk')).toBeInTheDocument(); + expect(screen.getByText('listRepos')).toBeInTheDocument(); + expect(screen.getByText('45ms')).toBeInTheDocument(); - expect(screen.getByText('slack-tk')).toBeInTheDocument() - expect(screen.getByText('send-notification')).toBeInTheDocument() - expect(screen.getByText('3200ms')).toBeInTheDocument() - }) + expect(screen.getByText('slack-tk')).toBeInTheDocument(); + expect(screen.getByText('send-notification')).toBeInTheDocument(); + expect(screen.getByText('3200ms')).toBeInTheDocument(); + }); - it('shows error state when API returns 500', async () => { - worker.use( - createErrorHandler('get', '/traces', { status: 500 }), - ) + it('shows error state when API returns 500', async () => { + worker.use(createErrorHandler('get', '/traces', { status: 500 })); - renderWithProviders() + renderWithProviders(); - expect(await screen.findByText('Failed to load traces')).toBeInTheDocument() - expect(screen.getByText(/Please try refreshing the page/)).toBeInTheDocument() - }) + expect(await screen.findByText('Failed to load traces')).toBeInTheDocument(); + expect(screen.getByText(/Please try refreshing the page/)).toBeInTheDocument(); + }); - it('has no accessibility violations', async () => { - const { container } = renderWithProviders() - await screen.findByText('No traces found') - const results = await axe.run(container) - expect(results.violations).toEqual([]) - }) -}) + it('has no accessibility violations', async () => { + const { container } = renderWithProviders(); + await screen.findByText('No traces found'); + const results = await axe.run(container); + expect(results.violations).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/pages/WorkflowsPage.test.tsx b/ui/src/__tests__/pages/WorkflowsPage.test.tsx index 04c639b4..299ccc5d 100644 --- a/ui/src/__tests__/pages/WorkflowsPage.test.tsx +++ b/ui/src/__tests__/pages/WorkflowsPage.test.tsx @@ -1,53 +1,67 @@ -import { screen, waitFor, renderWithProviders, createErrorHandler } from '../test-utils' -import { worker } from '../mocks/browser' -import { http, HttpResponse } from 'msw' -import axe from 'axe-core' -import WorkflowsPage from '../../pages/WorkflowsPage' +import { http, HttpResponse } from 'msw'; +import axe from 'axe-core'; +import { screen, renderWithProviders, createErrorHandler } from '../test-utils'; +import { worker } from '../mocks/browser'; +import WorkflowsPage from '@/pages/WorkflowsPage'; describe('WorkflowsPage', () => { - it('renders the heading', async () => { - renderWithProviders() - expect(await screen.findByRole('heading', { name: /workflows/i })).toBeInTheDocument() - }) - - it('shows empty state when no workflows exist', async () => { - renderWithProviders() - expect(await screen.findByText(/no workflows registered/i)).toBeInTheDocument() - }) - - it('renders workflow list with populated data', async () => { - worker.use( - http.get('/workflows', () => - HttpResponse.json([ - { slug: 'summarise-discourse', name: 'Summarise Discourse Topics', description: 'Summarises recent topics', source: 'local', steps_count: 3, involved_apis: ['discourse-api'] }, - { slug: 'sync-contacts', name: 'Sync Contacts', description: 'Sync CRM contacts', source: 'catalog', steps_count: 5, involved_apis: ['salesforce', 'hubspot'] }, - ]), - ), - ) - - renderWithProviders() - - expect(await screen.findByText('Summarise Discourse Topics')).toBeInTheDocument() - expect(screen.getByText('Sync Contacts')).toBeInTheDocument() - expect(screen.getByText('3 steps')).toBeInTheDocument() - expect(screen.getByText('5 steps')).toBeInTheDocument() - }) - - it('shows error state when API fails', async () => { - worker.use( - createErrorHandler('get', '/workflows', { status: 500 }), - ) - - renderWithProviders() - - expect(await screen.findByText(/failed to load workflows/i)).toBeInTheDocument() - }) - - it('has no critical accessibility violations', async () => { - const { container } = renderWithProviders() - await screen.findByRole('heading', { name: /workflows/i }) - const results = await axe.run(container) - const serious = results.violations.filter(v => v.impact === 'critical' || v.impact === 'serious') - expect(serious).toEqual([]) - }) -}) + it('renders the heading', async () => { + renderWithProviders(); + expect(await screen.findByRole('heading', { name: /workflows/i })).toBeInTheDocument(); + }); + + it('shows empty state when no workflows exist', async () => { + renderWithProviders(); + expect(await screen.findByText(/no workflows registered/i)).toBeInTheDocument(); + }); + + it('renders workflow list with populated data', async () => { + worker.use( + http.get('/workflows', () => + HttpResponse.json([ + { + slug: 'summarise-discourse', + name: 'Summarise Discourse Topics', + description: 'Summarises recent topics', + source: 'local', + steps_count: 3, + involved_apis: ['discourse-api'], + }, + { + slug: 'sync-contacts', + name: 'Sync Contacts', + description: 'Sync CRM contacts', + source: 'catalog', + steps_count: 5, + involved_apis: ['salesforce', 'hubspot'], + }, + ]), + ), + ); + + renderWithProviders(); + + expect(await screen.findByText('Summarise Discourse Topics')).toBeInTheDocument(); + expect(screen.getByText('Sync Contacts')).toBeInTheDocument(); + expect(screen.getByText('3 steps')).toBeInTheDocument(); + expect(screen.getByText('5 steps')).toBeInTheDocument(); + }); + + it('shows error state when API fails', async () => { + worker.use(createErrorHandler('get', '/workflows', { status: 500 })); + + renderWithProviders(); + + expect(await screen.findByText(/failed to load workflows/i)).toBeInTheDocument(); + }); + + it('has no critical accessibility violations', async () => { + const { container } = renderWithProviders(); + await screen.findByRole('heading', { name: /workflows/i }); + const results = await axe.run(container); + const serious = results.violations.filter( + (v) => v.impact === 'critical' || v.impact === 'serious', + ); + expect(serious).toEqual([]); + }); +}); diff --git a/ui/src/__tests__/setup.ts b/ui/src/__tests__/setup.ts index 10911132..45ddbe43 100644 --- a/ui/src/__tests__/setup.ts +++ b/ui/src/__tests__/setup.ts @@ -1,16 +1,16 @@ -import '@testing-library/jest-dom/vitest' -import { worker } from './mocks/browser' +import '@testing-library/jest-dom/vitest'; +import { worker } from './mocks/browser'; beforeAll(async () => { - await worker.start({ onUnhandledRequest: 'warn' }) -}) + await worker.start({ onUnhandledRequest: 'warn' }); +}); afterEach(() => { - worker.resetHandlers() - window.localStorage.clear() - window.sessionStorage.clear() -}) + worker.resetHandlers(); + window.localStorage.clear(); + window.sessionStorage.clear(); +}); afterAll(() => { - worker.stop() -}) + worker.stop(); +}); diff --git a/ui/src/__tests__/test-utils.tsx b/ui/src/__tests__/test-utils.tsx index 2749dad3..e3a01517 100644 --- a/ui/src/__tests__/test-utils.tsx +++ b/ui/src/__tests__/test-utils.tsx @@ -1,60 +1,59 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { MemoryRouter, Routes, Route } from 'react-router-dom' -import { render, type RenderOptions } from '@testing-library/react' -import type { ReactElement } from 'react' +import type { ReactElement } from 'react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { MemoryRouter, Routes, Route } from 'react-router-dom'; +import { render, type RenderOptions } from '@testing-library/react'; +import { http, HttpResponse } from 'msw'; interface Options extends Omit { - route?: string - path?: string + route?: string; + path?: string; } export function renderWithProviders(ui: ReactElement, options: Options = {}) { - const { route = '/', path, ...renderOptions } = options - - const queryClient = new QueryClient({ - defaultOptions: { - queries: { retry: false, gcTime: 0 }, - mutations: { retry: false }, - }, - }) - - function Wrapper({ children }: { children: React.ReactNode }) { - return ( - - - {path ? ( - - - - ) : ( - children - )} - - - ) - } - - return { ...render(ui, { wrapper: Wrapper, ...renderOptions }), queryClient } + const { route = '/', path, ...renderOptions } = options; + + const queryClient = new QueryClient({ + defaultOptions: { + queries: { retry: false, gcTime: 0 }, + mutations: { retry: false }, + }, + }); + + function Wrapper({ children }: { children: React.ReactNode }) { + return ( + + + {path ? ( + + + + ) : ( + children + )} + + + ); + } + + return { ...render(ui, { wrapper: Wrapper, ...renderOptions }), queryClient }; } -export * from '@testing-library/react' -export { default as userEvent } from '@testing-library/user-event' +export * from '@testing-library/react'; +export { default as userEvent } from '@testing-library/user-event'; // --------------------------------------------------------------------------- // MSW error handler factory // --------------------------------------------------------------------------- -import { http, HttpResponse } from 'msw' - export function createErrorHandler( - method: 'get' | 'post' | 'patch' | 'put' | 'delete', - path: string, - options: { status?: number; body?: unknown; networkError?: boolean } = {} + method: 'get' | 'post' | 'patch' | 'put' | 'delete', + path: string, + options: { status?: number; body?: unknown; networkError?: boolean } = {}, ) { - const { status = 500, body, networkError = false } = options - return http[method](path, () => - networkError - ? HttpResponse.error() - : HttpResponse.json(body ?? { detail: 'Server error' }, { status }) - ) + const { status = 500, body, networkError = false } = options; + return http[method](path, () => + networkError + ? HttpResponse.error() + : HttpResponse.json(body ?? { detail: 'Server error' }, { status }), + ); } diff --git a/ui/src/api/client.ts b/ui/src/api/client.ts index a13c71f9..c2904b6c 100644 --- a/ui/src/api/client.ts +++ b/ui/src/api/client.ts @@ -1,147 +1,266 @@ -import { OpenAPI } from './generated' -import { CatalogService, ToolkitsService, UserService, SearchService, ObserveService, CredentialsService, InspectService } from './generated' +import { + OpenAPI, + CatalogService, + ToolkitsService, + UserService, + SearchService, + ObserveService, + InspectService, +} from './generated'; OpenAPI.WITH_CREDENTIALS = true; export const api = { - getMe: () => UserService.meUserMeGet(), - login: (username: string, password: string) => UserService.loginUserLoginPost({ requestBody: { username, password } }), - logout: () => UserService.logoutUserLogoutPost(), - createUser: (username: string, password: string) => UserService.createUserUserCreatePost({ requestBody: { username, password } }), - generateDefaultKey: () => UserService.generateDefaultKeyDefaultApiKeyGeneratePost(), - listApis: (page = 1, limit = 20, source?: string, q?: string) => { - const params = new URLSearchParams({ page: String(page), limit: String(limit) }) - if (source) params.set('source', source) - if (q) params.set('q', q) - return fetchJson(`/apis?${params}`) - }, - getApi: (apiId: string) => fetchJson(`/apis/${apiId}`), - getCatalogEntry: (apiId: string) => fetchJson(`/catalog/${apiId}`), - listOperations: (apiId: string, page = 1, limit = 50) => CatalogService.listApiOperationsApisApiIdOperationsGet({ apiId, page, limit }), - declareScheme: (apiId: string, body: any) => CatalogService.submitSchemeApisApiIdSchemePost({ apiId, requestBody: body }), - listOverlays: (apiId: string) => CatalogService.listOverlaysApisApiIdOverlaysGet({ apiId }), - submitOverlay: (apiId: string, overlay: any, contributedBy?: string) => CatalogService.submitOverlayApisApiIdOverlaysPost({ apiId, requestBody: { overlay, contributed_by: contributedBy } }), - importSpec: (sources: any[]) => CatalogService.importSourcesImportPost({ requestBody: { sources } }), - listCatalog: (q?: string, limit = 50, registeredOnly = false, unregisteredOnly = false) => CatalogService.listCatalogCatalogGet({ q: q ?? null, limit, registeredOnly, unregisteredOnly }), - refreshCatalog: () => CatalogService.refreshCatalogCatalogRefreshPost(), - importFromCatalog: (apiId: string) => CatalogService.getCatalogEntryCatalogApiIdGet({ apiId }), - listWorkflows: () => CatalogService.listWorkflowsWorkflowsGet(), - getWorkflow: (slug: string) => CatalogService.getWorkflowWorkflowsSlugGet({ slug }), - addNote: (resource: string, note: string, type?: string) => CatalogService.createNoteNotesPost({ requestBody: { resource, note, type: type ?? null } }), - listNotes: (resource?: string, type?: string, limit = 50) => CatalogService.listNotesNotesGet({ resource: resource ?? null, type: type ?? null, limit }), - listToolkits: () => ToolkitsService.listToolkitsToolkitsGet(), - getToolkit: (toolkitId: string) => ToolkitsService.getToolkitToolkitsToolkitIdGet({ toolkitId }), - createToolkit: (body: any) => ToolkitsService.createToolkitToolkitsPost({ requestBody: body }), - updateToolkit: (toolkitId: string, body: any) => ToolkitsService.patchToolkitToolkitsToolkitIdPatch({ toolkitId, requestBody: body }), - deleteToolkit: (toolkitId: string) => ToolkitsService.deleteToolkitToolkitsToolkitIdDelete({ toolkitId }), - listKeys: (toolkitId: string) => ToolkitsService.listToolkitKeysToolkitsToolkitIdKeysGet({ toolkitId }), - createKey: (toolkitId: string, body: any) => ToolkitsService.createToolkitKeyToolkitsToolkitIdKeysPost({ toolkitId, requestBody: body }), - revokeKey: (toolkitId: string, keyId: string) => ToolkitsService.revokeToolkitKeyToolkitsToolkitIdKeysKeyIdDelete({ toolkitId, keyId }), - patchKey: (toolkitId: string, keyId: string, body: any) => ToolkitsService.patchToolkitKeyToolkitsToolkitIdKeysKeyIdPatch({ toolkitId, keyId, requestBody: body }), - listToolkitCredentials: (toolkitId: string) => ToolkitsService.listToolkitCredentialsToolkitsToolkitIdCredentialsGet({ toolkitId }), - bindCredential: (toolkitId: string, credentialId: string) => ToolkitsService.addCredentialToToolkitToolkitsToolkitIdCredentialsPost({ toolkitId, requestBody: { credential_id: credentialId } }), - unbindCredential: (toolkitId: string, credentialId: string) => ToolkitsService.removeCredentialFromToolkitToolkitsToolkitIdCredentialsCredentialIdDelete({ toolkitId, credentialId }), - getPermissions: (toolkitId: string, credId: string) => ToolkitsService.getCredentialPermissionsToolkitsToolkitIdCredentialsCredIdPermissionsGet({ toolkitId, credId }), - setPermissions: (toolkitId: string, credId: string, rules: any[]) => ToolkitsService.setCredentialPermissionsToolkitsToolkitIdCredentialsCredIdPermissionsPut({ toolkitId, credId, requestBody: rules }), - patchPermissions: (toolkitId: string, credId: string, add: any[], remove: any[]) => ToolkitsService.patchCredentialPermissionsToolkitsToolkitIdCredentialsCredIdPermissionsPatch({ toolkitId, credId, requestBody: { add, remove } }), - listAccessRequests: (toolkitId: string, status?: string) => ToolkitsService.listAccessRequestsToolkitsToolkitIdAccessRequestsGet({ toolkitId, status: status ?? null }), - getAccessRequest: (toolkitId: string, reqId: string) => ToolkitsService.getAccessRequestToolkitsToolkitIdAccessRequestsReqIdGet({ toolkitId, reqId }), - createAccessRequest: (toolkitId: string, body: any) => ToolkitsService.createAccessRequestToolkitsToolkitIdAccessRequestsPost({ toolkitId, requestBody: body }), - approveAccessRequest: (toolkitId: string, reqId: string) => ToolkitsService.approveAccessRequestToolkitsToolkitIdAccessRequestsReqIdApprovePost({ toolkitId, reqId }), - denyAccessRequest: (toolkitId: string, reqId: string) => ToolkitsService.denyAccessRequestToolkitsToolkitIdAccessRequestsReqIdDenyPost({ toolkitId, reqId }), - listCredentials: (apiId?: string) => fetchJson(`/credentials${apiId ? `?api_id=${encodeURIComponent(apiId)}` : ''}`), - createCredential: (body: any) => fetchJson('/credentials', { method: 'POST', body: JSON.stringify(body), headers: { 'Content-Type': 'application/json' } }), - getCredential: (cid: string) => fetchJson(`/credentials/${cid}`), - updateCredential: (cid: string, body: any) => fetchJson(`/credentials/${cid}`, { method: 'PATCH', body: JSON.stringify(body), headers: { 'Content-Type': 'application/json' } }), - deleteCredential: (cid: string) => fetchJson(`/credentials/${cid}`, { method: 'DELETE' }), - search: (q: string, n = 10) => SearchService.searchSearchGet({ q, n }), - inspectCapability: (capabilityId: string, toolkitId?: string) => InspectService.getCapabilityInspectCapabilityIdGet({ capabilityId, toolkitId }), - listTraces: ({ limit = 20, offset = 0, page, toolkit: _toolkit, workflow: _workflow }: { limit?: number; offset?: number; page?: number; toolkit?: string; workflow?: string } = {}) => { - const effectiveOffset = page != null ? (page - 1) * (limit ?? 20) : (offset ?? 0) - return ObserveService.listTracesTracesGet({ limit, offset: effectiveOffset }) - }, - getTrace: (traceId: string) => ObserveService.getTraceTracesTraceIdGet({ traceId }), - listJobs: ({ status, page = 1, limit = 20 }: { status?: string; page?: number; limit?: number } = {}) => ObserveService.listJobsJobsGet({ status: status ?? null, page, limit }), - getJob: (jobId: string) => ObserveService.getJobRouteJobsJobIdGet({ jobId }), - cancelJob: (jobId: string) => ObserveService.cancelJobJobsJobIdDelete({ jobId }), -} + getMe: () => UserService.meUserMeGet(), + login: (username: string, password: string) => + UserService.loginUserLoginPost({ requestBody: { username, password } }), + logout: () => UserService.logoutUserLogoutPost(), + createUser: (username: string, password: string) => + UserService.createUserUserCreatePost({ requestBody: { username, password } }), + generateDefaultKey: () => UserService.generateDefaultKeyDefaultApiKeyGeneratePost(), + listApis: (page = 1, limit = 20, source?: string, q?: string) => { + const params = new URLSearchParams({ page: String(page), limit: String(limit) }); + if (source) params.set('source', source); + if (q) params.set('q', q); + return fetchJson(`/apis?${params}`); + }, + getApi: (apiId: string) => fetchJson(`/apis/${apiId}`), + getCatalogEntry: (apiId: string) => fetchJson(`/catalog/${apiId}`), + listOperations: (apiId: string, page = 1, limit = 50) => + CatalogService.listApiOperationsApisApiIdOperationsGet({ apiId, page, limit }), + declareScheme: (apiId: string, body: any) => + CatalogService.submitSchemeApisApiIdSchemePost({ apiId, requestBody: body }), + listOverlays: (apiId: string) => CatalogService.listOverlaysApisApiIdOverlaysGet({ apiId }), + submitOverlay: (apiId: string, overlay: any, contributedBy?: string) => + CatalogService.submitOverlayApisApiIdOverlaysPost({ + apiId, + requestBody: { overlay, contributed_by: contributedBy }, + }), + importSpec: (sources: any[]) => + CatalogService.importSourcesImportPost({ requestBody: { sources } }), + listCatalog: (q?: string, limit = 50, registeredOnly = false, unregisteredOnly = false) => + CatalogService.listCatalogCatalogGet({ + q: q ?? null, + limit, + registeredOnly, + unregisteredOnly, + }), + refreshCatalog: () => CatalogService.refreshCatalogCatalogRefreshPost(), + importFromCatalog: (apiId: string) => CatalogService.getCatalogEntryCatalogApiIdGet({ apiId }), + listWorkflows: () => CatalogService.listWorkflowsWorkflowsGet(), + getWorkflow: (slug: string) => CatalogService.getWorkflowWorkflowsSlugGet({ slug }), + addNote: (resource: string, note: string, type?: string) => + CatalogService.createNoteNotesPost({ requestBody: { resource, note, type: type ?? null } }), + listNotes: (resource?: string, type?: string, limit = 50) => + CatalogService.listNotesNotesGet({ resource: resource ?? null, type: type ?? null, limit }), + listToolkits: () => ToolkitsService.listToolkitsToolkitsGet(), + getToolkit: (toolkitId: string) => + ToolkitsService.getToolkitToolkitsToolkitIdGet({ toolkitId }), + createToolkit: (body: any) => ToolkitsService.createToolkitToolkitsPost({ requestBody: body }), + updateToolkit: (toolkitId: string, body: any) => + ToolkitsService.patchToolkitToolkitsToolkitIdPatch({ toolkitId, requestBody: body }), + deleteToolkit: (toolkitId: string) => + ToolkitsService.deleteToolkitToolkitsToolkitIdDelete({ toolkitId }), + listKeys: (toolkitId: string) => + ToolkitsService.listToolkitKeysToolkitsToolkitIdKeysGet({ toolkitId }), + createKey: (toolkitId: string, body: any) => + ToolkitsService.createToolkitKeyToolkitsToolkitIdKeysPost({ toolkitId, requestBody: body }), + revokeKey: (toolkitId: string, keyId: string) => + ToolkitsService.revokeToolkitKeyToolkitsToolkitIdKeysKeyIdDelete({ toolkitId, keyId }), + patchKey: (toolkitId: string, keyId: string, body: any) => + ToolkitsService.patchToolkitKeyToolkitsToolkitIdKeysKeyIdPatch({ + toolkitId, + keyId, + requestBody: body, + }), + listToolkitCredentials: (toolkitId: string) => + ToolkitsService.listToolkitCredentialsToolkitsToolkitIdCredentialsGet({ toolkitId }), + bindCredential: (toolkitId: string, credentialId: string) => + ToolkitsService.addCredentialToToolkitToolkitsToolkitIdCredentialsPost({ + toolkitId, + requestBody: { credential_id: credentialId }, + }), + unbindCredential: (toolkitId: string, credentialId: string) => + ToolkitsService.removeCredentialFromToolkitToolkitsToolkitIdCredentialsCredentialIdDelete({ + toolkitId, + credentialId, + }), + getPermissions: (toolkitId: string, credId: string) => + ToolkitsService.getCredentialPermissionsToolkitsToolkitIdCredentialsCredIdPermissionsGet({ + toolkitId, + credId, + }), + setPermissions: (toolkitId: string, credId: string, rules: any[]) => + ToolkitsService.setCredentialPermissionsToolkitsToolkitIdCredentialsCredIdPermissionsPut({ + toolkitId, + credId, + requestBody: rules, + }), + patchPermissions: (toolkitId: string, credId: string, add: any[], remove: any[]) => + ToolkitsService.patchCredentialPermissionsToolkitsToolkitIdCredentialsCredIdPermissionsPatch( + { toolkitId, credId, requestBody: { add, remove } }, + ), + listAccessRequests: (toolkitId: string, status?: string) => + ToolkitsService.listAccessRequestsToolkitsToolkitIdAccessRequestsGet({ + toolkitId, + status: status ?? null, + }), + getAccessRequest: (toolkitId: string, reqId: string) => + ToolkitsService.getAccessRequestToolkitsToolkitIdAccessRequestsReqIdGet({ + toolkitId, + reqId, + }), + createAccessRequest: (toolkitId: string, body: any) => + ToolkitsService.createAccessRequestToolkitsToolkitIdAccessRequestsPost({ + toolkitId, + requestBody: body, + }), + approveAccessRequest: (toolkitId: string, reqId: string) => + ToolkitsService.approveAccessRequestToolkitsToolkitIdAccessRequestsReqIdApprovePost({ + toolkitId, + reqId, + }), + denyAccessRequest: (toolkitId: string, reqId: string) => + ToolkitsService.denyAccessRequestToolkitsToolkitIdAccessRequestsReqIdDenyPost({ + toolkitId, + reqId, + }), + listCredentials: (apiId?: string) => + fetchJson(`/credentials${apiId ? `?api_id=${encodeURIComponent(apiId)}` : ''}`), + createCredential: (body: any) => + fetchJson('/credentials', { + method: 'POST', + body: JSON.stringify(body), + headers: { 'Content-Type': 'application/json' }, + }), + getCredential: (cid: string) => fetchJson(`/credentials/${cid}`), + updateCredential: (cid: string, body: any) => + fetchJson(`/credentials/${cid}`, { + method: 'PATCH', + body: JSON.stringify(body), + headers: { 'Content-Type': 'application/json' }, + }), + deleteCredential: (cid: string) => fetchJson(`/credentials/${cid}`, { method: 'DELETE' }), + search: (q: string, n = 10) => SearchService.searchSearchGet({ q, n }), + inspectCapability: (capabilityId: string, toolkitId?: string) => + InspectService.getCapabilityInspectCapabilityIdGet({ capabilityId, toolkitId }), + listTraces: ({ + limit = 20, + offset = 0, + page, + toolkit: _toolkit, + workflow: _workflow, + }: { + limit?: number; + offset?: number; + page?: number; + toolkit?: string; + workflow?: string; + } = {}) => { + const effectiveOffset = page != null ? (page - 1) * (limit ?? 20) : (offset ?? 0); + return ObserveService.listTracesTracesGet({ limit, offset: effectiveOffset }); + }, + getTrace: (traceId: string) => ObserveService.getTraceTracesTraceIdGet({ traceId }), + listJobs: ({ + status, + page = 1, + limit = 20, + }: { status?: string; page?: number; limit?: number } = {}) => + ObserveService.listJobsJobsGet({ status: status ?? null, page, limit }), + getJob: (jobId: string) => ObserveService.getJobRouteJobsJobIdGet({ jobId }), + cancelJob: (jobId: string) => ObserveService.cancelJobJobsJobIdDelete({ jobId }), +}; // --- OAuth Brokers (not in generated client — direct fetch) --- async function fetchJson(url: string, init?: RequestInit): Promise { - const res = await fetch(url, { credentials: 'include', ...init }) - if (!res.ok) { - const body = await res.text().catch(() => '') - throw new Error(`${res.status} ${res.statusText}: ${body}`) - } - const text = await res.text() - return text ? JSON.parse(text) : (undefined as unknown as T) + const res = await fetch(url, { credentials: 'include', ...init }); + if (!res.ok) { + const body = await res.text().catch(() => ''); + throw new Error(`${res.status} ${res.statusText}: ${body}`); + } + const text = await res.text(); + return text ? JSON.parse(text) : (undefined as unknown as T); } export interface OAuthBroker { - id: string - type: string - config: Record - created_at?: string + id: string; + type: string; + config: Record; + created_at?: string; } export interface OAuthAccount { - id: string - broker_id: string - external_user_id: string - api_host: string - app_slug: string - account_id: string - label: string - healthy: boolean - synced_at: string + id: string; + broker_id: string; + external_user_id: string; + api_host: string; + app_slug: string; + account_id: string; + label: string; + healthy: boolean; + synced_at: string; } export interface ConnectLinkResponse { - connect_link_url: string - token: string - expires_in: number + connect_link_url: string; + token: string; + expires_in: number; } export interface SyncResponse { - accounts_synced: number + accounts_synced: number; } export const oauthBrokers = { - list: () => fetchJson('/oauth-brokers'), - get: (id: string) => fetchJson(`/oauth-brokers/${encodeURIComponent(id)}`), - create: (body: { id: string; type: string; config: Record }) => - fetchJson('/oauth-brokers', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body), - }), - delete: (id: string) => - fetch(`/oauth-brokers/${encodeURIComponent(id)}`, { method: 'DELETE', credentials: 'include' }).then(r => { - if (!r.ok) throw new Error(`${r.status} ${r.statusText}`) - }), - accounts: (id: string, externalUserId = 'default') => - fetchJson(`/oauth-brokers/${encodeURIComponent(id)}/accounts?external_user_id=${encodeURIComponent(externalUserId)}`), - deleteAccount: (id: string, apiHost: string, externalUserId = 'default') => - fetch(`/oauth-brokers/${encodeURIComponent(id)}/accounts/${encodeURIComponent(apiHost)}?external_user_id=${encodeURIComponent(externalUserId)}`, { - method: 'DELETE', - credentials: 'include', - }).then(async r => { - if (!r.ok) { const e = await r.json().catch(() => ({})); throw new Error(e.detail || 'Failed to delete account') } - return r.json() - }), - sync: (id: string, externalUserId = 'default') => - fetchJson(`/oauth-brokers/${encodeURIComponent(id)}/sync`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ external_user_id: externalUserId }), - }), - connectLink: (id: string, body: { app: string; external_user_id?: string; label: string; api_id?: string }) => - fetchJson(`/oauth-brokers/${encodeURIComponent(id)}/connect-link`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body), - }), -} + list: () => fetchJson('/oauth-brokers'), + get: (id: string) => fetchJson(`/oauth-brokers/${encodeURIComponent(id)}`), + create: (body: { id: string; type: string; config: Record }) => + fetchJson('/oauth-brokers', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }), + delete: (id: string) => + fetch(`/oauth-brokers/${encodeURIComponent(id)}`, { + method: 'DELETE', + credentials: 'include', + }).then((r) => { + if (!r.ok) throw new Error(`${r.status} ${r.statusText}`); + }), + accounts: (id: string, externalUserId = 'default') => + fetchJson( + `/oauth-brokers/${encodeURIComponent(id)}/accounts?external_user_id=${encodeURIComponent(externalUserId)}`, + ), + deleteAccount: (id: string, apiHost: string, externalUserId = 'default') => + fetch( + `/oauth-brokers/${encodeURIComponent(id)}/accounts/${encodeURIComponent(apiHost)}?external_user_id=${encodeURIComponent(externalUserId)}`, + { + method: 'DELETE', + credentials: 'include', + }, + ).then(async (r) => { + if (!r.ok) { + const e = await r.json().catch(() => ({})); + throw new Error(e.detail || 'Failed to delete account'); + } + return r.json(); + }), + sync: (id: string, externalUserId = 'default') => + fetchJson(`/oauth-brokers/${encodeURIComponent(id)}/sync`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ external_user_id: externalUserId }), + }), + connectLink: ( + id: string, + body: { app: string; external_user_id?: string; label: string; api_id?: string }, + ) => + fetchJson(`/oauth-brokers/${encodeURIComponent(id)}/connect-link`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }), +}; -export * from './generated' +export * from './generated'; diff --git a/ui/src/api/types.ts b/ui/src/api/types.ts index f4c5ed5c..36b55110 100644 --- a/ui/src/api/types.ts +++ b/ui/src/api/types.ts @@ -1,304 +1,304 @@ // TypeScript types derived from OpenAPI spec export interface UserOut { - logged_in: boolean - username?: string | null - status?: string + logged_in: boolean; + username?: string | null; + status?: string; } export interface HealthOut { - status: string - default_key_claimed?: boolean - setup_url?: string | null - [key: string]: unknown + status: string; + default_key_claimed?: boolean; + setup_url?: string | null; + [key: string]: unknown; } export interface DefaultKeyOut { - key: string + key: string; } export interface ToolkitKeyOut { - id: string - name?: string | null - prefix?: string | null - allowed_ips?: string[] | null - revoked?: boolean - created_at?: number | null + id: string; + name?: string | null; + prefix?: string | null; + allowed_ips?: string[] | null; + revoked?: boolean; + created_at?: number | null; } export interface ToolkitKeyCreated extends ToolkitKeyOut { - key: string + key: string; } export interface KeyCreate { - name?: string | null - allowed_ips?: string[] | null + name?: string | null; + allowed_ips?: string[] | null; } export interface CredentialBindingOut { - credential_id: string - label?: string | null - api_id?: string | null - scheme_name?: string | null + credential_id: string; + label?: string | null; + api_id?: string | null; + scheme_name?: string | null; } export interface ToolkitOut { - id: string - name: string - description?: string | null - created_at?: number | null - simulate?: boolean - disabled?: boolean - keys: ToolkitKeyOut[] - credentials: CredentialBindingOut[] - permissions: Record[] - pending_requests?: number + id: string; + name: string; + description?: string | null; + created_at?: number | null; + simulate?: boolean; + disabled?: boolean; + keys: ToolkitKeyOut[]; + credentials: CredentialBindingOut[]; + permissions: Record[]; + pending_requests?: number; } export interface ToolkitCreate { - name: string - description?: string | null - simulate?: boolean - initial_key_label?: string | null + name: string; + description?: string | null; + simulate?: boolean; + initial_key_label?: string | null; } export interface ToolkitPatch { - name?: string | null - description?: string | null - simulate?: boolean | null - disabled?: boolean | null + name?: string | null; + description?: string | null; + simulate?: boolean | null; + disabled?: boolean | null; } export interface PermissionRule { - effect: 'allow' | 'deny' - methods?: string[] | null - path?: string | null - operations?: string[] | null - _system?: boolean + effect: 'allow' | 'deny'; + methods?: string[] | null; + path?: string | null; + operations?: string[] | null; + _system?: boolean; } export interface AccessRequestOut { - id: string - toolkit_id: string - type: 'grant' | 'modify_permissions' - payload: Record - status: 'pending' | 'approved' | 'denied' - reason?: string | null - description?: string | null - approve_url?: string | null - created_at?: number | null - resolved_at?: number | null - applied_effects?: string[] | null + id: string; + toolkit_id: string; + type: 'grant' | 'modify_permissions'; + payload: Record; + status: 'pending' | 'approved' | 'denied'; + reason?: string | null; + description?: string | null; + approve_url?: string | null; + created_at?: number | null; + resolved_at?: number | null; + applied_effects?: string[] | null; } export interface CredentialOut { - id: string - label: string - api_id?: string | null - scheme_name?: string | null - created_at?: number | null - updated_at?: number | null + id: string; + label: string; + api_id?: string | null; + scheme_name?: string | null; + created_at?: number | null; + updated_at?: number | null; } export interface CredentialCreate { - label: string - api_id?: string | null - auth_type?: 'bearer' | 'basic' | 'apiKey' | null - identity?: string | null - value: string + label: string; + api_id?: string | null; + auth_type?: 'bearer' | 'basic' | 'apiKey' | null; + identity?: string | null; + value: string; } export interface CredentialPatch { - label?: string | null - api_id?: string | null - auth_type?: 'bearer' | 'basic' | 'apiKey' | null - identity?: string | null - value?: string | null + label?: string | null; + api_id?: string | null; + auth_type?: 'bearer' | 'basic' | 'apiKey' | null; + identity?: string | null; + value?: string | null; } export interface ApiOut { - id: string - name?: string | null - description?: string | null - base_url?: string | null - version?: string | null - operation_count?: number | null - created_at?: number | null - [key: string]: unknown + id: string; + name?: string | null; + description?: string | null; + base_url?: string | null; + version?: string | null; + operation_count?: number | null; + created_at?: number | null; + [key: string]: unknown; } export interface ApiListPage { - items?: ApiOut[] - data?: ApiOut[] - total?: number | null - page?: number | null - size?: number | null + items?: ApiOut[]; + data?: ApiOut[]; + total?: number | null; + page?: number | null; + size?: number | null; } export interface OperationOut { - id?: string | null - capability_id?: string | null - method?: string | null - path?: string | null - summary?: string | null - description?: string | null - [key: string]: unknown + id?: string | null; + capability_id?: string | null; + method?: string | null; + path?: string | null; + summary?: string | null; + description?: string | null; + [key: string]: unknown; } export interface OperationListPage { - items: OperationOut[] - total?: number | null - page?: number | null - size?: number | null + items: OperationOut[]; + total?: number | null; + page?: number | null; + size?: number | null; } export interface SearchResult { - capability_id?: string | null - api_id?: string | null - api_name?: string | null - method?: string | null - path?: string | null - summary?: string | null - description?: string | null - score?: number | null - registered?: boolean - type?: 'operation' | 'workflow' - [key: string]: unknown + capability_id?: string | null; + api_id?: string | null; + api_name?: string | null; + method?: string | null; + path?: string | null; + summary?: string | null; + description?: string | null; + score?: number | null; + registered?: boolean; + type?: 'operation' | 'workflow'; + [key: string]: unknown; } export interface WorkflowOut { - slug: string - name?: string | null - description?: string | null - steps?: WorkflowStep[] - inputs?: Record - involved_apis?: string[] - [key: string]: unknown + slug: string; + name?: string | null; + description?: string | null; + steps?: WorkflowStep[]; + inputs?: Record; + involved_apis?: string[]; + [key: string]: unknown; } export interface WorkflowStep { - id: string - operation?: string | null - description?: string | null - [key: string]: unknown + id: string; + operation?: string | null; + description?: string | null; + [key: string]: unknown; } export interface TraceOut { - id: string - toolkit_id?: string | null - toolkit_name?: string | null - operation_id?: string | null - workflow_id?: string | null - capability_id?: string | null - workflow_slug?: string | null - spec_path?: string | null - status?: string | null - http_status?: number | null - duration_ms?: number | null - created_at?: number | null - steps?: TraceStepOut[] - request?: Record - response?: Record - error?: string | null - [key: string]: unknown + id: string; + toolkit_id?: string | null; + toolkit_name?: string | null; + operation_id?: string | null; + workflow_id?: string | null; + capability_id?: string | null; + workflow_slug?: string | null; + spec_path?: string | null; + status?: string | null; + http_status?: number | null; + duration_ms?: number | null; + created_at?: number | null; + steps?: TraceStepOut[]; + request?: Record; + response?: Record; + error?: string | null; + [key: string]: unknown; } export interface TraceStepOut { - step_id?: string | null - capability_id?: string | null - http_status?: number | null - duration_ms?: number | null - output?: unknown - error?: string | null - [key: string]: unknown + step_id?: string | null; + capability_id?: string | null; + http_status?: number | null; + duration_ms?: number | null; + output?: unknown; + error?: string | null; + [key: string]: unknown; } export interface TraceListPage { - traces: TraceOut[] - total?: number | null - page?: number | null - size?: number | null + traces: TraceOut[]; + total?: number | null; + page?: number | null; + size?: number | null; } export interface JobOut { - id: string - kind?: string | null - toolkit_id?: string | null - status?: 'pending' | 'running' | 'complete' | 'failed' | string - result?: unknown - error?: string | null - upstream_job_url?: string | null - created_at?: number | null - updated_at?: number | null - [key: string]: unknown + id: string; + kind?: string | null; + toolkit_id?: string | null; + status?: 'pending' | 'running' | 'complete' | 'failed' | string; + result?: unknown; + error?: string | null; + upstream_job_url?: string | null; + created_at?: number | null; + updated_at?: number | null; + [key: string]: unknown; } export interface JobListPage { - items: JobOut[] - total?: number | null - page?: number | null - size?: number | null + items: JobOut[]; + total?: number | null; + page?: number | null; + size?: number | null; } export interface ImportRequest { - source: string - type?: string | null - [key: string]: unknown + source: string; + type?: string | null; + [key: string]: unknown; } export interface ImportOut { - id?: string | null - status?: string | null - message?: string | null - [key: string]: unknown + id?: string | null; + status?: string | null; + message?: string | null; + [key: string]: unknown; } export interface NoteCreate { - resource: string - content: string + resource: string; + content: string; } export interface NoteOut { - id: string - resource: string - content: string - created_at?: number | null + id: string; + resource: string; + content: string; + created_at?: number | null; } export interface OverlaySubmit { - content: string - contributor?: string | null + content: string; + contributor?: string | null; } export interface OverlayOut { - id: string - status?: string | null - contributor?: string | null - created_at?: number | null - [key: string]: unknown + id: string; + status?: string | null; + contributor?: string | null; + created_at?: number | null; + [key: string]: unknown; } export interface SchemeInput { - scheme_name: string - scheme_type?: string | null - [key: string]: unknown + scheme_name: string; + scheme_type?: string | null; + [key: string]: unknown; } export interface CatalogEntry { - id: string - name?: string | null - domain?: string | null - description?: string | null - registered?: boolean - [key: string]: unknown + id: string; + name?: string | null; + domain?: string | null; + description?: string | null; + registered?: boolean; + [key: string]: unknown; } export interface PermissionsPatch { - add?: PermissionRule[] - remove?: PermissionRule[] + add?: PermissionRule[]; + remove?: PermissionRule[]; } export interface UserCreate { - username: string - password: string + username: string; + password: string; } diff --git a/ui/src/components/AuthGuard.tsx b/ui/src/components/AuthGuard.tsx index 701086ea..05bc0b3c 100644 --- a/ui/src/components/AuthGuard.tsx +++ b/ui/src/components/AuthGuard.tsx @@ -1,33 +1,33 @@ -import { Outlet, Navigate, useLocation } from 'react-router-dom' -import { useAuth } from '../hooks/useAuth' +import { Outlet, Navigate, useLocation } from 'react-router-dom'; +import { useAuth } from '@/hooks/useAuth'; export function AuthGuard() { - const { user, isLoading, isSetupOrAccountRequired } = useAuth() - const location = useLocation() + const { user, isLoading, isSetupOrAccountRequired } = useAuth(); + const location = useLocation(); - if (isLoading) { - return ( -
-
Loading...
-
- ) - } + if (isLoading) { + return ( +
+
Loading...
+
+ ); + } - if (isSetupOrAccountRequired) { - if (location.pathname !== '/setup') return - return - } + if (isSetupOrAccountRequired) { + if (location.pathname !== '/setup') return ; + return ; + } - if (!user?.logged_in) { - if (location.pathname !== '/login') { - return - } - return - } + if (!user?.logged_in) { + if (location.pathname !== '/login') { + return ; + } + return ; + } - if (location.pathname === '/login' || location.pathname === '/setup') { - return - } + if (location.pathname === '/login' || location.pathname === '/setup') { + return ; + } - return + return ; } diff --git a/ui/src/components/layout/Layout.tsx b/ui/src/components/layout/Layout.tsx index e5bdbe39..fa2bf650 100644 --- a/ui/src/components/layout/Layout.tsx +++ b/ui/src/components/layout/Layout.tsx @@ -1,205 +1,267 @@ -import { useState } from 'react' -import { Outlet, Link, useLocation } from 'react-router-dom' -import { JenticLogo } from '../ui/Logo' -import { BookOpen, ExternalLink, Menu, X, LayoutDashboard, Search, GitBranch, Shield, KeyRound, Link2, Activity, Cog } from 'lucide-react' -import { useAuth } from '../../hooks/useAuth' -import { usePendingRequests } from '../../hooks/usePendingRequests' -import { useUpdateCheck } from '../../hooks/useUpdateCheck' -import { useMutation, useQueryClient } from '@tanstack/react-query' -import { UserService } from '../../api/generated' +import { useState } from 'react'; +import { Outlet, Link, useLocation } from 'react-router-dom'; +import { + BookOpen, + ExternalLink, + Menu, + X, + LayoutDashboard, + Search, + GitBranch, + Shield, + KeyRound, + Link2, + Activity, + Cog, +} from 'lucide-react'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { JenticLogo } from '@/components/ui/Logo'; +import { useAuth } from '@/hooks/useAuth'; +import { usePendingRequests } from '@/hooks/usePendingRequests'; +import { useUpdateCheck } from '@/hooks/useUpdateCheck'; +import { UserService } from '@/api/generated'; function NavLink({ - to, - icon, - label, - exact = false, - onClick, + to, + icon, + label, + exact = false, + onClick, }: { - to: string - icon: React.ReactNode - label: string - exact?: boolean - onClick?: () => void + to: string; + icon: React.ReactNode; + label: string; + exact?: boolean; + onClick?: () => void; }) { - const loc = useLocation() - const active = exact ? loc.pathname === to : loc.pathname.startsWith(to) - return ( - - {icon} - {label} - - ) + const loc = useLocation(); + const active = exact ? loc.pathname === to : loc.pathname.startsWith(to); + return ( + + {icon} + {label} + + ); } function SidebarContents({ onClose }: { onClose?: () => void }) { - const { updateAvailable, latestVersion, releaseUrl } = useUpdateCheck() - return ( -
+ ); } export function Layout() { - const [sidebarOpen, setSidebarOpen] = useState(false) - const { user } = useAuth() - const { data: pendingRequests } = usePendingRequests() - const queryClient = useQueryClient() + const [sidebarOpen, setSidebarOpen] = useState(false); + const { user } = useAuth(); + const { data: pendingRequests } = usePendingRequests(); + const queryClient = useQueryClient(); - const logoutMutation = useMutation({ - mutationFn: () => UserService.logoutUserLogoutPost(), - onSuccess: () => { - queryClient.clear() - window.location.href = '/login' - }, - }) + const logoutMutation = useMutation({ + mutationFn: () => UserService.logoutUserLogoutPost(), + onSuccess: () => { + queryClient.clear(); + window.location.href = '/login'; + }, + }); - return ( -
- {/* Desktop sidebar — always visible on md+ */} -
- -
+ return ( +
+ {/* Desktop sidebar — always visible on md+ */} +
+ +
- {/* Mobile sidebar — slide-over drawer */} - {sidebarOpen && ( - <> - {/* Backdrop */} -
setSidebarOpen(false)} - aria-hidden="true" - /> - {/* Drawer */} -
- setSidebarOpen(false)} /> -
- - )} + {/* Mobile sidebar — slide-over drawer */} + {sidebarOpen && ( + <> + {/* Backdrop */} +
setSidebarOpen(false)} + aria-hidden="true" + /> + {/* Drawer */} +
+ setSidebarOpen(false)} /> +
+ + )} - {/* Main content */} -
-
-
- {/* Hamburger — mobile only */} - - {/* Logo in header — mobile only (desktop has it in sidebar) */} -
- -
-
+ {/* Main content */} +
+
+
+ {/* Hamburger — mobile only */} + + {/* Logo in header — mobile only (desktop has it in sidebar) */} +
+ +
+
-
- {pendingRequests && pendingRequests.length > 0 && ( - - - {pendingRequests.length} Pending{' '} - {pendingRequests.length === 1 ? 'Request' : 'Requests'} - - )} -
- {user?.username} -
- -
-
+
+ {pendingRequests && pendingRequests.length > 0 && ( + + + {pendingRequests.length} Pending{' '} + {pendingRequests.length === 1 ? 'Request' : 'Requests'} + + )} +
+ {user?.username} +
+ +
+
-
- -
-
-
- ) +
+ +
+ +
+ ); } diff --git a/ui/src/components/layout/TopBar.tsx b/ui/src/components/layout/TopBar.tsx index 0b32ef00..abea309e 100644 --- a/ui/src/components/layout/TopBar.tsx +++ b/ui/src/components/layout/TopBar.tsx @@ -1,103 +1,109 @@ -import React, { useState } from 'react' -import { useNavigate } from 'react-router-dom' -import { Search, Bell, LogOut, User, ChevronDown } from 'lucide-react' -import { JenticLogo } from '../ui/Logo' -import { useMutation, useQueryClient } from '@tanstack/react-query' -import { api } from '../../api/client' +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Search, Bell, LogOut, User, ChevronDown } from 'lucide-react'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { JenticLogo } from '@/components/ui/Logo'; +import { api } from '@/api/client'; interface TopBarProps { - username?: string - pendingCount?: number + username?: string; + pendingCount?: number; } export function TopBar({ username, pendingCount = 0 }: TopBarProps) { - const navigate = useNavigate() - const queryClient = useQueryClient() - const [search, setSearch] = useState('') - const [userMenuOpen, setUserMenuOpen] = useState(false) + const navigate = useNavigate(); + const queryClient = useQueryClient(); + const [search, setSearch] = useState(''); + const [userMenuOpen, setUserMenuOpen] = useState(false); - const logoutMutation = useMutation({ - mutationFn: api.logout, - onSuccess: () => { - queryClient.clear() - navigate('/login') - }, - }) + const logoutMutation = useMutation({ + mutationFn: api.logout, + onSuccess: () => { + queryClient.clear(); + navigate('/login'); + }, + }); - const handleSearch = (e: React.FormEvent) => { - e.preventDefault() - if (search.trim()) { - navigate(`/search?q=${encodeURIComponent(search.trim())}`) - setSearch('') - } - } + const handleSearch = (e: React.FormEvent) => { + e.preventDefault(); + if (search.trim()) { + navigate(`/search?q=${encodeURIComponent(search.trim())}`); + setSearch(''); + } + }; - return ( -
- {/* Logo */} - - - + return ( +
+ {/* Logo */} + + + - {/* Search */} -
-
- - setSearch(e.target.value)} - className="w-full bg-muted border border-border rounded-lg pl-9 pr-4 py-1.5 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary focus:outline-hidden transition-all" - /> -
-
+ {/* Search */} +
+
+ + setSearch(e.target.value)} + className="bg-muted border-border text-foreground placeholder:text-muted-foreground focus:border-primary w-full rounded-lg border py-1.5 pr-4 pl-9 text-sm transition-all focus:outline-hidden" + /> +
+
-
+
- {/* Pending requests badge */} - {pendingCount > 0 && ( - - )} + {/* Pending requests badge */} + {pendingCount > 0 && ( + + )} - {/* User menu */} -
- + {/* User menu */} +
+ - {userMenuOpen && ( - <> -
setUserMenuOpen(false)} /> -
- -
- - )} -
-
- ) + {userMenuOpen && ( + <> +
setUserMenuOpen(false)} + /> +
+ +
+ + )} +
+
+ ); } diff --git a/ui/src/components/ui/Badge.tsx b/ui/src/components/ui/Badge.tsx index 5040a94d..63ca39d8 100644 --- a/ui/src/components/ui/Badge.tsx +++ b/ui/src/components/ui/Badge.tsx @@ -1,52 +1,60 @@ -import React from 'react' +import React from 'react'; -type Variant = 'default' | 'success' | 'warning' | 'danger' | 'pending' +type Variant = 'default' | 'success' | 'warning' | 'danger' | 'pending'; const variantClasses: Record = { - default: 'bg-primary/10 text-primary border-primary/20', - success: 'bg-success/10 text-success border-success/20', - warning: 'bg-warning/10 text-warning border-warning/20', - danger: 'bg-danger/10 text-danger border-danger/20', - pending: 'bg-accent-orange/10 text-accent-orange border-accent-orange/20', -} + default: 'bg-primary/10 text-primary border-primary/20', + success: 'bg-success/10 text-success border-success/20', + warning: 'bg-warning/10 text-warning border-warning/20', + danger: 'bg-danger/10 text-danger border-danger/20', + pending: 'bg-accent-orange/10 text-accent-orange border-accent-orange/20', +}; interface BadgeProps { - variant?: Variant - children: React.ReactNode - className?: string + variant?: Variant; + children: React.ReactNode; + className?: string; } export function Badge({ variant = 'default', children, className = '' }: BadgeProps) { - return ( - - {children} - - ) + return ( + + {children} + + ); } const methodColors: Record = { - GET: 'bg-accent-teal/10 text-accent-teal border-accent-teal/30', - POST: 'bg-accent-blue/10 text-accent-blue border-accent-blue/30', - PUT: 'bg-accent-orange/10 text-accent-orange border-accent-orange/30', - PATCH: 'bg-accent-yellow/10 text-accent-yellow border-accent-yellow/30', - DELETE: 'bg-danger/10 text-danger border-danger/30', -} + GET: 'bg-accent-teal/10 text-accent-teal border-accent-teal/30', + POST: 'bg-accent-blue/10 text-accent-blue border-accent-blue/30', + PUT: 'bg-accent-orange/10 text-accent-orange border-accent-orange/30', + PATCH: 'bg-accent-yellow/10 text-accent-yellow border-accent-yellow/30', + DELETE: 'bg-danger/10 text-danger border-danger/30', +}; export function MethodBadge({ method }: { method?: string | null }) { - const m = method?.toUpperCase() ?? '?' - const colors = methodColors[m] ?? 'bg-muted text-muted-foreground border-border' - return ( - - {m} - - ) + const m = method?.toUpperCase() ?? '?'; + const colors = methodColors[m] ?? 'bg-muted text-muted-foreground border-border'; + return ( + + {m} + + ); } export function StatusBadge({ status }: { status?: number | null }) { - if (!status) return null - const variant: Variant = - status >= 500 ? 'danger' : - status >= 400 ? 'warning' : - status >= 200 && status < 300 ? 'success' : 'default' - return {status} + if (!status) return null; + const variant: Variant = + status >= 500 + ? 'danger' + : status >= 400 + ? 'warning' + : status >= 200 && status < 300 + ? 'success' + : 'default'; + return {status}; } diff --git a/ui/src/components/ui/Button.tsx b/ui/src/components/ui/Button.tsx index c4e0eec3..a8054ff6 100644 --- a/ui/src/components/ui/Button.tsx +++ b/ui/src/components/ui/Button.tsx @@ -1,50 +1,63 @@ -import React from 'react' +import React from 'react'; -type Variant = 'primary' | 'secondary' | 'danger' | 'ghost' -type Size = 'sm' | 'md' +type Variant = 'primary' | 'secondary' | 'danger' | 'ghost'; +type Size = 'sm' | 'md'; const variantClasses: Record = { - primary: 'bg-primary text-background hover:bg-primary/80 disabled:opacity-50', - secondary: 'bg-muted border border-border text-foreground hover:bg-muted/60 disabled:opacity-50', - danger: 'bg-danger/10 border border-danger/30 text-danger hover:bg-danger/20 disabled:opacity-50', - ghost: 'text-muted-foreground hover:text-foreground hover:bg-muted/60 disabled:opacity-50', -} + primary: 'bg-primary text-background hover:bg-primary/80 disabled:opacity-50', + secondary: + 'bg-muted border border-border text-foreground hover:bg-muted/60 disabled:opacity-50', + danger: 'bg-danger/10 border border-danger/30 text-danger hover:bg-danger/20 disabled:opacity-50', + ghost: 'text-muted-foreground hover:text-foreground hover:bg-muted/60 disabled:opacity-50', +}; const sizeClasses: Record = { - sm: 'px-3 py-1.5 text-sm gap-1.5', - md: 'px-4 py-2 text-sm gap-2', -} + sm: 'px-3 py-1.5 text-sm gap-1.5', + md: 'px-4 py-2 text-sm gap-2', +}; interface ButtonProps extends React.ButtonHTMLAttributes { - variant?: Variant - size?: Size - loading?: boolean - children?: React.ReactNode - className?: string + variant?: Variant; + size?: Size; + loading?: boolean; + children?: React.ReactNode; + className?: string; } export function Button({ - variant = 'primary', - size = 'md', - loading = false, - disabled, - children, - className = '', - ...props + variant = 'primary', + size = 'md', + loading = false, + disabled, + children, + className = '', + ...props }: ButtonProps) { - return ( - - ) + return ( + + ); } diff --git a/ui/src/components/ui/Card.tsx b/ui/src/components/ui/Card.tsx index 743efd4f..e1076b0f 100644 --- a/ui/src/components/ui/Card.tsx +++ b/ui/src/components/ui/Card.tsx @@ -1,45 +1,53 @@ -import React from 'react' +import React from 'react'; interface CardProps extends React.HTMLAttributes { - hoverable?: boolean - children?: React.ReactNode - className?: string + hoverable?: boolean; + children?: React.ReactNode; + className?: string; } export function Card({ hoverable, children, className = '', onClick, ...props }: CardProps) { - return ( -
- {children} -
- ) + return ( +
+ {children} +
+ ); } -export function CardHeader({ children, className = '' }: { children: React.ReactNode; className?: string }) { - return ( -
- {children} -
- ) +export function CardHeader({ + children, + className = '', +}: { + children: React.ReactNode; + className?: string; +}) { + return
{children}
; } -export function CardBody({ children, className = '' }: { children: React.ReactNode; className?: string }) { - return ( -
- {children} -
- ) +export function CardBody({ + children, + className = '', +}: { + children: React.ReactNode; + className?: string; +}) { + return
{children}
; } -export function CardTitle({ children, className = '' }: { children: React.ReactNode; className?: string }) { - return ( -

- {children} -

- ) +export function CardTitle({ + children, + className = '', +}: { + children: React.ReactNode; + className?: string; +}) { + return ( +

{children}

+ ); } diff --git a/ui/src/components/ui/ConfirmInline.tsx b/ui/src/components/ui/ConfirmInline.tsx index a3a78bc2..f4bf0bd3 100644 --- a/ui/src/components/ui/ConfirmInline.tsx +++ b/ui/src/components/ui/ConfirmInline.tsx @@ -1,45 +1,50 @@ -import React, { useState } from 'react' -import { Button } from './Button' +import React, { useState } from 'react'; +import { Button } from './Button'; -type Variant = 'danger' | 'default' +type Variant = 'danger' | 'default'; interface ConfirmInlineProps { - onConfirm: () => void - message: string - confirmLabel?: string - variant?: Variant - children: React.ReactElement + onConfirm: () => void; + message: string; + confirmLabel?: string; + variant?: Variant; + children: React.ReactElement; } -export function ConfirmInline({ onConfirm, message, confirmLabel = 'Confirm', variant = 'danger', children }: ConfirmInlineProps) { - const [pending, setPending] = useState(false) +export function ConfirmInline({ + onConfirm, + message, + confirmLabel = 'Confirm', + variant = 'danger', + children, +}: ConfirmInlineProps) { + const [pending, setPending] = useState(false); - if (!pending) { - return React.cloneElement(children, { - onClick: (e: React.MouseEvent) => { - e.stopPropagation() - setPending(true) - } - }) - } + if (!pending) { + return React.cloneElement(children, { + onClick: (e: React.MouseEvent) => { + e.stopPropagation(); + setPending(true); + }, + }); + } - return ( -
e.stopPropagation()}> - {message} - - -
- ) + return ( +
e.stopPropagation()}> + {message} + + +
+ ); } diff --git a/ui/src/components/ui/Logo.tsx b/ui/src/components/ui/Logo.tsx index 1900e11a..afd86353 100644 --- a/ui/src/components/ui/Logo.tsx +++ b/ui/src/components/ui/Logo.tsx @@ -1,23 +1,31 @@ - export function JenticLogo({ className = 'h-10' }: { className?: string }) { - return ( -
- - Mini -
- ) + return ( +
+ + + Mini + +
+ ); } diff --git a/ui/src/components/ui/OneTimeKeyDisplay.tsx b/ui/src/components/ui/OneTimeKeyDisplay.tsx index ac9d9477..a052ef13 100644 --- a/ui/src/components/ui/OneTimeKeyDisplay.tsx +++ b/ui/src/components/ui/OneTimeKeyDisplay.tsx @@ -1,70 +1,69 @@ -import { useState, useEffect, useRef, useCallback, useMemo } from 'react' -import { Copy, CheckCircle, AlertTriangle } from 'lucide-react' -import { Button } from './Button' +import { useState } from 'react'; +import { Copy, CheckCircle, AlertTriangle } from 'lucide-react'; +import { Button } from './Button'; interface OneTimeKeyDisplayProps { - keyValue: string - onConfirm: () => void - title?: string + keyValue: string; + onConfirm: () => void; + title?: string; } export function OneTimeKeyDisplay({ keyValue, onConfirm, title }: OneTimeKeyDisplayProps) { - const [copied, setCopied] = useState(false) - const [confirmed, setConfirmed] = useState(false) + const [copied, setCopied] = useState(false); + const [confirmed, setConfirmed] = useState(false); - const handleCopy = async () => { - await navigator.clipboard.writeText(keyValue) - setCopied(true) - setTimeout(() => setCopied(false), 2000) - } + const handleCopy = async () => { + await navigator.clipboard.writeText(keyValue); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; - return ( -
-
- -
-

{title ?? 'API Key Generated'}

-

- This key will never be shown again. - Copy it now and store it securely before dismissing. -

-
-
+ return ( +
+
+ +
+

{title ?? 'API Key Generated'}

+

+ This key will{' '} + never be shown again. Copy it + now and store it securely before dismissing. +

+
+
-
- - {keyValue} - - -
+
+ + {keyValue} + + +
- + - -
- ) + +
+ ); } diff --git a/ui/src/components/ui/PermissionRuleDisplay.tsx b/ui/src/components/ui/PermissionRuleDisplay.tsx index c2271cb8..b3888c3a 100644 --- a/ui/src/components/ui/PermissionRuleDisplay.tsx +++ b/ui/src/components/ui/PermissionRuleDisplay.tsx @@ -1,61 +1,68 @@ -import type { PermissionRule } from '../../api/types' -import { Lock, ShieldCheck, ShieldX } from 'lucide-react' +import { Lock, ShieldCheck, ShieldX } from 'lucide-react'; +import type { PermissionRule } from '@/api/types'; function describeRule(rule: PermissionRule): string { - const parts: string[] = [] - - if (rule._system) { - return 'System rule (managed automatically)' - } - - const effect = rule.effect === 'allow' ? 'Allow' : 'Deny' - - if (rule.operations && rule.operations.length > 0) { - parts.push(`${effect} operations: ${rule.operations.join(', ')}`) - } else if (rule.path) { - const methods = rule.methods && rule.methods.length > 0 - ? rule.methods.join(', ') - : 'any method' - parts.push(`${effect} ${methods} requests to ${rule.path}`) - } else { - parts.push(`${effect} all requests`) - } - - return parts.join(' — ') + const parts: string[] = []; + + if (rule._system) { + return 'System rule (managed automatically)'; + } + + const effect = rule.effect === 'allow' ? 'Allow' : 'Deny'; + + if (rule.operations && rule.operations.length > 0) { + parts.push(`${effect} operations: ${rule.operations.join(', ')}`); + } else if (rule.path) { + const methods = + rule.methods && rule.methods.length > 0 ? rule.methods.join(', ') : 'any method'; + parts.push(`${effect} ${methods} requests to ${rule.path}`); + } else { + parts.push(`${effect} all requests`); + } + + return parts.join(' — '); } interface PermissionRuleDisplayProps { - rules: PermissionRule[] + rules: PermissionRule[]; } export function PermissionRuleDisplay({ rules }: PermissionRuleDisplayProps) { - if (!rules || rules.length === 0) { - return

No permission rules configured.

- } - - return ( -
    - {rules.map((rule, i) => { - const isSystem = rule._system === true - const isAllow = rule.effect === 'allow' - return ( -
  • - - {isSystem ? : isAllow ? : } - - {describeRule(rule)} -
  • - ) - })} -
- ) + if (!rules || rules.length === 0) { + return ( +

No permission rules configured.

+ ); + } + + return ( +
    + {rules.map((rule, i) => { + const isSystem = rule._system === true; + const isAllow = rule.effect === 'allow'; + return ( +
  • + + {isSystem ? ( + + ) : isAllow ? ( + + ) : ( + + )} + + {describeRule(rule)} +
  • + ); + })} +
+ ); } diff --git a/ui/src/components/ui/PermissionRuleEditor.tsx b/ui/src/components/ui/PermissionRuleEditor.tsx index b4fd4e27..5df4bb4d 100644 --- a/ui/src/components/ui/PermissionRuleEditor.tsx +++ b/ui/src/components/ui/PermissionRuleEditor.tsx @@ -1,68 +1,81 @@ -import type { PermissionRule } from '../../api/types' -import { Button } from './Button' -import { Plus, Trash2 } from 'lucide-react' +import { Plus, Trash2 } from 'lucide-react'; +import { Button } from './Button'; +import type { PermissionRule } from '@/api/types'; interface PermissionRuleEditorProps { - rules: PermissionRule[] - onChange: (rules: PermissionRule[]) => void + rules: PermissionRule[]; + onChange: (rules: PermissionRule[]) => void; } -const emptyRule = (): PermissionRule => ({ effect: 'allow', path: '', methods: [] }) +const emptyRule = (): PermissionRule => ({ effect: 'allow', path: '', methods: [] }); export function PermissionRuleEditor({ rules, onChange }: PermissionRuleEditorProps) { - const addRule = () => onChange([...rules, emptyRule()]) - const removeRule = (i: number) => onChange(rules.filter((_, idx) => idx !== i)) - const updateRule = (i: number, patch: Partial) => { - const updated = rules.map((r, idx) => idx === i ? { ...r, ...patch } : r) - onChange(updated) - } + const addRule = () => onChange([...rules, emptyRule()]); + const removeRule = (i: number) => onChange(rules.filter((_, idx) => idx !== i)); + const updateRule = (i: number, patch: Partial) => { + const updated = rules.map((r, idx) => (idx === i ? { ...r, ...patch } : r)); + onChange(updated); + }; - return ( -
- {rules.map((rule, i) => ( -
- {/* Effect */} - + return ( +
+ {rules.map((rule, i) => ( +
+ {/* Effect */} + - {/* Path */} - updateRule(i, { path: e.target.value || null })} - placeholder="/path/prefix or *" - className="flex-1 bg-muted border border-border rounded px-2 py-1 text-sm text-foreground font-mono focus:border-primary focus:outline-hidden" - /> + {/* Path */} + updateRule(i, { path: e.target.value || null })} + placeholder="/path/prefix or *" + className="bg-muted border-border text-foreground focus:border-primary flex-1 rounded border px-2 py-1 font-mono text-sm focus:outline-hidden" + /> - {/* Methods */} - updateRule(i, { - methods: e.target.value ? e.target.value.split(',').map(s => s.trim().toUpperCase()).filter(Boolean) : null - })} - placeholder="GET, POST (blank=any)" - className="w-40 bg-muted border border-border rounded px-2 py-1 text-sm text-foreground font-mono focus:border-primary focus:outline-hidden" - /> + {/* Methods */} + + updateRule(i, { + methods: e.target.value + ? e.target.value + .split(',') + .map((s) => s.trim().toUpperCase()) + .filter(Boolean) + : null, + }) + } + placeholder="GET, POST (blank=any)" + className="bg-muted border-border text-foreground focus:border-primary w-40 rounded border px-2 py-1 font-mono text-sm focus:outline-hidden" + /> - -
- ))} + +
+ ))} - -
- ) + +
+ ); } diff --git a/ui/src/hooks/useAuth.ts b/ui/src/hooks/useAuth.ts index 5916813f..8a504b19 100644 --- a/ui/src/hooks/useAuth.ts +++ b/ui/src/hooks/useAuth.ts @@ -1,30 +1,32 @@ -import { useQuery } from '@tanstack/react-query' -import { UserService } from '../api/generated' +import { useQuery } from '@tanstack/react-query'; +import { UserService } from '@/api/generated'; export function useAuth() { - // Check system setup state first - const healthQuery = useQuery({ - queryKey: ['health'], - queryFn: () => fetch('/health').then(r => r.json()), - retry: false - }) + // Check system setup state first + const healthQuery = useQuery({ + queryKey: ['health'], + queryFn: () => fetch('/health').then((r) => r.json()), + retry: false, + }); - const isSetupComplete = healthQuery.data?.status === 'ok' - const isSetupOrAccountRequired = healthQuery.data?.status === 'account_required' || healthQuery.data?.status === 'setup_required' + const isSetupComplete = healthQuery.data?.status === 'ok'; + const isSetupOrAccountRequired = + healthQuery.data?.status === 'account_required' || + healthQuery.data?.status === 'setup_required'; - // Only check user session if setup is complete - const { data, isLoading, error, refetch } = useQuery({ - queryKey: ['user', 'me'], - queryFn: () => UserService.meUserMeGet(), - retry: false, - enabled: isSetupComplete // ← Only run after setup - }) + // Only check user session if setup is complete + const { data, isLoading, error, refetch } = useQuery({ + queryKey: ['user', 'me'], + queryFn: () => UserService.meUserMeGet(), + retry: false, + enabled: isSetupComplete, // ← Only run after setup + }); - return { - user: data, - isLoading: isLoading || healthQuery.isLoading, - error, - isSetupOrAccountRequired, - refetch - } + return { + user: data, + isLoading: isLoading || healthQuery.isLoading, + error, + isSetupOrAccountRequired, + refetch, + }; } diff --git a/ui/src/hooks/usePendingRequests.ts b/ui/src/hooks/usePendingRequests.ts index f1f311fc..404fced8 100644 --- a/ui/src/hooks/usePendingRequests.ts +++ b/ui/src/hooks/usePendingRequests.ts @@ -1,32 +1,32 @@ -import { useQuery } from '@tanstack/react-query' -import { api } from '../api/client' -import { useAuth } from './useAuth' +import { useQuery } from '@tanstack/react-query'; +import { useAuth } from './useAuth'; +import { api } from '@/api/client'; export function usePendingRequests() { - const { user } = useAuth() + const { user } = useAuth(); - return useQuery({ - queryKey: ['pending_requests'], - queryFn: async () => { - const toolkits = await api.listToolkits() - const results: Array & { toolkit_name: string }> = [] - for (const t of toolkits) { - try { - const reqs = await api.listAccessRequests(t.id, 'pending') - if (Array.isArray(reqs)) { - for (const r of reqs) { - if (r.status === 'pending') { - results.push({ ...r, toolkit_name: t.name }) - } - } - } - } catch { - // ignore per-toolkit errors - } - } - return results - }, - enabled: !!user?.logged_in, - refetchInterval: 30000, - }) + return useQuery({ + queryKey: ['pending_requests'], + queryFn: async () => { + const toolkits = await api.listToolkits(); + const results: Array & { toolkit_name: string }> = []; + for (const t of toolkits) { + try { + const reqs = await api.listAccessRequests(t.id, 'pending'); + if (Array.isArray(reqs)) { + for (const r of reqs) { + if (r.status === 'pending') { + results.push({ ...r, toolkit_name: t.name }); + } + } + } + } catch { + // ignore per-toolkit errors + } + } + return results; + }, + enabled: !!user?.logged_in, + refetchInterval: 30000, + }); } diff --git a/ui/src/hooks/useUpdateCheck.ts b/ui/src/hooks/useUpdateCheck.ts index 092763ac..f1e1ee9f 100644 --- a/ui/src/hooks/useUpdateCheck.ts +++ b/ui/src/hooks/useUpdateCheck.ts @@ -1,82 +1,89 @@ -import { useEffect, useState } from 'react' +import { useEffect, useState } from 'react'; interface UpdateStatus { - currentVersion: string | null - latestVersion: string | null - updateAvailable: boolean - releaseUrl: string | null + currentVersion: string | null; + latestVersion: string | null; + updateAvailable: boolean; + releaseUrl: string | null; } function parseSemver(v: string): number[] { - return v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0) + return v + .replace(/^v/, '') + .split('.') + .map((n) => parseInt(n, 10) || 0); } function isSemver(v: string): boolean { - return /^\d+\.\d+\.\d+/.test(v.replace(/^v/, '')) + return /^\d+\.\d+\.\d+/.test(v.replace(/^v/, '')); } function isNewer(latest: string, current: string): boolean { - if (!isSemver(latest) || !isSemver(current)) return false - const l = parseSemver(latest) - const c = parseSemver(current) - for (let i = 0; i < 3; i++) { - if ((l[i] ?? 0) > (c[i] ?? 0)) return true - if ((l[i] ?? 0) < (c[i] ?? 0)) return false - } - return false + if (!isSemver(latest) || !isSemver(current)) return false; + const l = parseSemver(latest); + const c = parseSemver(current); + for (let i = 0; i < 3; i++) { + if ((l[i] ?? 0) > (c[i] ?? 0)) return true; + if ((l[i] ?? 0) < (c[i] ?? 0)) return false; + } + return false; } export function useUpdateCheck(): UpdateStatus { - const [status, setStatus] = useState({ - currentVersion: null, - latestVersion: null, - updateAvailable: false, - releaseUrl: null, - }) + const [status, setStatus] = useState({ + currentVersion: null, + latestVersion: null, + updateAvailable: false, + releaseUrl: null, + }); - useEffect(() => { - // Only check once per session - const cached = sessionStorage.getItem('jentic_update_check') - if (cached) { - try { - setStatus(JSON.parse(cached)) - return - } catch { - // ignore bad cache - } - } + useEffect(() => { + // Only check once per session + const cached = sessionStorage.getItem('jentic_update_check'); + if (cached) { + try { + setStatus(JSON.parse(cached)); + return; + } catch { + // ignore bad cache + } + } - async function check() { - try { - // Backend proxies the GitHub check with a 6h server-side cache — - // avoids browser hitting GitHub directly (rate limits, private repos) - const res = await fetch('/version') - if (!res.ok) return - const data = await res.json() + async function check() { + try { + // Backend proxies the GitHub check with a 6h server-side cache — + // avoids browser hitting GitHub directly (rate limits, private repos) + const res = await fetch('/version'); + if (!res.ok) return; + const data = await res.json(); - const currentVersion: string = data.current || 'unknown' - const latestVersion: string = data.latest || '' - const releaseUrl: string = data.release_url || '' + const currentVersion: string = data.current || 'unknown'; + const latestVersion: string = data.latest || ''; + const releaseUrl: string = data.release_url || ''; - if (!latestVersion) return + if (!latestVersion) return; - const updateAvailable = isNewer(latestVersion, currentVersion) - const result: UpdateStatus = { - currentVersion, - latestVersion, - updateAvailable, - releaseUrl, - } + const updateAvailable = isNewer(latestVersion, currentVersion); + const result: UpdateStatus = { + currentVersion, + latestVersion, + updateAvailable, + releaseUrl, + }; - try { sessionStorage.setItem('jentic_update_check', JSON.stringify(result)) } catch { /* private browsing */ } - setStatus(result) - } catch { - // Silently ignore — network errors, etc. - } - } + try { + sessionStorage.setItem('jentic_update_check', JSON.stringify(result)); + } catch { + /* private browsing */ + } + setStatus(result); + } catch { + // Silently ignore — network errors, etc. + } + } - check() - }, []) + check(); + }, []); - return status + return status; } diff --git a/ui/src/index.css b/ui/src/index.css index 5904d589..c7d7caee 100644 --- a/ui/src/index.css +++ b/ui/src/index.css @@ -1,4 +1,4 @@ -@import "tailwindcss"; +@import 'tailwindcss'; /* THEME — Tailwind utility class mappings. @@ -6,57 +6,57 @@ e.g. --color-primary: var(--primary) → bg-primary, text-primary, etc. */ @theme inline { - /* Surface colors */ - --color-background: var(--background); - --color-background-secondary: var(--background-secondary); - --color-foreground: var(--foreground); - --color-foreground-lighter: var(--foreground-lighter); - - /* Brand / Primary */ - --color-primary: var(--primary); - --color-primary-hover: var(--primary-hover); - --color-primary-foreground: var(--primary-foreground); - - /* Muted */ - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - - /* Card */ - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - - /* Borders */ - --color-border: var(--border); - --color-border-hover: var(--border-hover); - - /* Focus ring */ - --color-ring: var(--ring); - - /* Accent colors */ - --color-accent-orange: var(--accent-orange); - --color-accent-yellow: var(--accent-yellow); - --color-accent-green: var(--accent-green); - --color-accent-teal: var(--accent-green); /* alias — no distinct teal in the palette */ - --color-accent-pink: var(--accent-pink); - --color-accent-blue: var(--accent-blue); - - /* State colors */ - --color-success: var(--success); - --color-warning: var(--warning); - --color-danger: var(--danger); - --color-destructive: var(--destructive); - --color-destructive-foreground: var(--destructive-foreground); - - /* Fonts */ - --font-sans: "Sora", sans-serif; - --font-heading: "Nunito Sans", sans-serif; - --font-mono: "Geist Mono", monospace; - - /* Radius */ - --radius-sm: calc(var(--radius) - 8px); - --radius-md: calc(var(--radius) - 4px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) * 1.4); + /* Surface colors */ + --color-background: var(--background); + --color-background-secondary: var(--background-secondary); + --color-foreground: var(--foreground); + --color-foreground-lighter: var(--foreground-lighter); + + /* Brand / Primary */ + --color-primary: var(--primary); + --color-primary-hover: var(--primary-hover); + --color-primary-foreground: var(--primary-foreground); + + /* Muted */ + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + + /* Card */ + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + + /* Borders */ + --color-border: var(--border); + --color-border-hover: var(--border-hover); + + /* Focus ring */ + --color-ring: var(--ring); + + /* Accent colors */ + --color-accent-orange: var(--accent-orange); + --color-accent-yellow: var(--accent-yellow); + --color-accent-green: var(--accent-green); + --color-accent-teal: var(--accent-green); /* alias — no distinct teal in the palette */ + --color-accent-pink: var(--accent-pink); + --color-accent-blue: var(--accent-blue); + + /* State colors */ + --color-success: var(--success); + --color-warning: var(--warning); + --color-danger: var(--danger); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + + /* Fonts */ + --font-sans: 'Sora', sans-serif; + --font-heading: 'Nunito Sans', sans-serif; + --font-mono: 'Geist Mono', monospace; + + /* Radius */ + --radius-sm: calc(var(--radius) - 8px); + --radius-md: calc(var(--radius) - 4px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) * 1.4); } /* @@ -66,61 +66,66 @@ Values match @jentic/frontend-theme. */ :root { - /* Primary scale (lower = lighter, higher = darker — standard Tailwind convention). + /* Primary scale (lower = lighter, higher = darker — standard Tailwind convention). Intentionally sparse: only shades used by semantic tokens are defined. Intermediate stops (200, 400, 600, 800) can be added here if needed. */ - --primary-50: hsl(180 11% 96%); /* #F5F7F7 - Lightest */ - --primary-100: hsl(189 15% 91%); /* #E4EAEB */ - --primary-300: hsl(183 29% 72%); /* #A3CACC */ - --primary-500: hsl(185 18% 50%); /* #689296 */ - --primary-700: hsl(186 28% 26%); /* #305256 */ - --primary-850: hsl(192 38% 16%); /* #193238 */ - --primary-900: hsl(192 36% 13%); /* #162629 - Card background */ - --primary-950: hsl(192 35% 8%); /* #0E1A1D - Darkest */ - - /* Accent colors */ - --accent-orange: hsl(31 97% 73%); /* #FDBD79 */ - --accent-yellow: hsl(52 78% 75%); /* #F1E38B */ - --accent-green: hsl(162 66% 62%); /* #5EDEB9 */ - --accent-pink: hsl(358 64% 80%); /* #EDADAF */ - --accent-blue: hsl(203 78% 67%); /* #68BAEC */ - - /* Semantic mappings */ - --background: var(--primary-950); - --background-secondary: var(--primary-850); - --card: var(--primary-900); - --card-foreground: hsl(0 0% 100%); - --border: var(--primary-700); - --border-hover: var(--primary-500); - --foreground: hsl(0 0% 100%); - --foreground-lighter: var(--primary-100); - --muted: var(--primary-850); - --muted-foreground: var(--primary-100); - --primary: var(--primary-300); - --primary-hover: var(--primary-100); - --primary-foreground: var(--primary-950); - --success: hsl(162 66% 62%); - --warning: hsl(52 78% 75%); - --danger: hsl(358 64% 80%); - --destructive: hsl(13 87% 46%); /* #DB3B0F */ - --destructive-foreground: hsl(0 0% 100%); - --ring: var(--primary-300); - --radius: 0.75rem; + --primary-50: hsl(180 11% 96%); /* #F5F7F7 - Lightest */ + --primary-100: hsl(189 15% 91%); /* #E4EAEB */ + --primary-300: hsl(183 29% 72%); /* #A3CACC */ + --primary-500: hsl(185 18% 50%); /* #689296 */ + --primary-700: hsl(186 28% 26%); /* #305256 */ + --primary-850: hsl(192 38% 16%); /* #193238 */ + --primary-900: hsl(192 36% 13%); /* #162629 - Card background */ + --primary-950: hsl(192 35% 8%); /* #0E1A1D - Darkest */ + + /* Accent colors */ + --accent-orange: hsl(31 97% 73%); /* #FDBD79 */ + --accent-yellow: hsl(52 78% 75%); /* #F1E38B */ + --accent-green: hsl(162 66% 62%); /* #5EDEB9 */ + --accent-pink: hsl(358 64% 80%); /* #EDADAF */ + --accent-blue: hsl(203 78% 67%); /* #68BAEC */ + + /* Semantic mappings */ + --background: var(--primary-950); + --background-secondary: var(--primary-850); + --card: var(--primary-900); + --card-foreground: hsl(0 0% 100%); + --border: var(--primary-700); + --border-hover: var(--primary-500); + --foreground: hsl(0 0% 100%); + --foreground-lighter: var(--primary-100); + --muted: var(--primary-850); + --muted-foreground: var(--primary-100); + --primary: var(--primary-300); + --primary-hover: var(--primary-100); + --primary-foreground: var(--primary-950); + --success: hsl(162 66% 62%); + --warning: hsl(52 78% 75%); + --danger: hsl(358 64% 80%); + --destructive: hsl(13 87% 46%); /* #DB3B0F */ + --destructive-foreground: hsl(0 0% 100%); + --ring: var(--primary-300); + --radius: 0.75rem; } @layer base { - body { - @apply bg-background text-foreground; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - } - - h1, h2, h3, h4, h5, h6 { - @apply font-heading font-bold; - } - - button:not(:disabled), - [role="button"]:not(:disabled) { - cursor: pointer; - } + body { + @apply bg-background text-foreground; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + @apply font-heading font-bold; + } + + button:not(:disabled), + [role='button']:not(:disabled) { + cursor: pointer; + } } diff --git a/ui/src/main.tsx b/ui/src/main.tsx index 1ddf1f26..4723a8f1 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -1,18 +1,18 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import App from './App' -import './index.css' -import { OpenAPI } from './api/generated' +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import App from '@/App'; +import '@/index.css'; +import { OpenAPI } from '@/api/generated'; OpenAPI.WITH_CREDENTIALS = true; -const queryClient = new QueryClient() +const queryClient = new QueryClient(); ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - -) + + + + + , +); diff --git a/ui/src/pages/ApprovalPage.tsx b/ui/src/pages/ApprovalPage.tsx index 6c658225..c8aab944 100644 --- a/ui/src/pages/ApprovalPage.tsx +++ b/ui/src/pages/ApprovalPage.tsx @@ -1,312 +1,363 @@ -import { useState } from 'react' -import { useParams, useNavigate } from 'react-router-dom' -import { useQuery, useMutation } from '@tanstack/react-query' -import { api } from '../api/client' -import { JenticLogo } from '../components/ui/Logo' -import { Button } from '../components/ui/Button' -import { PermissionRuleDisplay } from '../components/ui/PermissionRuleDisplay' -import { Badge } from '../components/ui/Badge' -import type { PermissionRule } from '../api/types' -import { CheckCircle, XCircle, AlertTriangle, Clock, LogIn } from 'lucide-react' +import { useState } from 'react'; +import { useParams, useNavigate } from 'react-router-dom'; +import { useQuery, useMutation } from '@tanstack/react-query'; +import { CheckCircle, XCircle, AlertTriangle, Clock, LogIn } from 'lucide-react'; +import { api } from '@/api/client'; +import { JenticLogo } from '@/components/ui/Logo'; +import { Button } from '@/components/ui/Button'; +import { PermissionRuleDisplay } from '@/components/ui/PermissionRuleDisplay'; +import { Badge } from '@/components/ui/Badge'; +import type { PermissionRule } from '@/api/types'; function extractErrorMessage(err: unknown): string { - if (!err) return 'An unknown error occurred.' - const e = err as any - // ApiError: body.detail is FastAPI's standard error field - if (e?.body?.detail) { - const detail = e.body.detail - return typeof detail === 'string' ? detail : JSON.stringify(detail) - } - if (e?.status === 401) return 'Not authenticated — please log in first.' - if (e?.status === 403) return 'You do not have permission to perform this action.' - if (e?.status === 404) return 'Request not found — it may have already been resolved.' - if (e?.status === 409) return 'Conflict — the request may have already been acted on.' - if (e?.statusText) return `${e.status}: ${e.statusText}` - // Only use .message if it's a real string, not "[object Object]" - if (e?.message && typeof e.message === 'string' && !e.message.includes('[object')) return e.message - return `Unexpected error (HTTP ${e?.status ?? '?'})` + if (!err) return 'An unknown error occurred.'; + const e = err as any; + // ApiError: body.detail is FastAPI's standard error field + if (e?.body?.detail) { + const detail = e.body.detail; + return typeof detail === 'string' ? detail : JSON.stringify(detail); + } + if (e?.status === 401) return 'Not authenticated — please log in first.'; + if (e?.status === 403) return 'You do not have permission to perform this action.'; + if (e?.status === 404) return 'Request not found — it may have already been resolved.'; + if (e?.status === 409) return 'Conflict — the request may have already been acted on.'; + if (e?.statusText) return `${e.status}: ${e.statusText}`; + // Only use .message if it's a real string, not "[object Object]" + if (e?.message && typeof e.message === 'string' && !e.message.includes('[object')) + return e.message; + return `Unexpected error (HTTP ${e?.status ?? '?'})`; } export default function ApprovalPage() { - const { toolkit_id, req_id } = useParams<{ toolkit_id: string; req_id: string }>() - const navigate = useNavigate() - const [processing, setProcessing] = useState(false) - const [result, setResult] = useState<'approved' | 'denied' | null>(null) + const { toolkit_id, req_id } = useParams<{ toolkit_id: string; req_id: string }>(); + const navigate = useNavigate(); + const [processing, setProcessing] = useState(false); + const [result, setResult] = useState<'approved' | 'denied' | null>(null); - const { data: user, isLoading: userLoading } = useQuery({ - queryKey: ['user-me'], - queryFn: api.getMe, - retry: false, - }) + const { data: user, isLoading: userLoading } = useQuery({ + queryKey: ['user-me'], + queryFn: api.getMe, + retry: false, + }); - const isLoggedIn = user?.logged_in === true + const isLoggedIn = user?.logged_in === true; - const { data: request, isLoading: requestLoading, error: requestError } = useQuery({ - queryKey: ['access-request', toolkit_id, req_id], - queryFn: () => api.getAccessRequest(toolkit_id!, req_id!), - enabled: !!toolkit_id && !!req_id && isLoggedIn, - retry: false, - }) + const { + data: request, + isLoading: requestLoading, + error: requestError, + } = useQuery({ + queryKey: ['access-request', toolkit_id, req_id], + queryFn: () => api.getAccessRequest(toolkit_id!, req_id!), + enabled: !!toolkit_id && !!req_id && isLoggedIn, + retry: false, + }); - const { data: toolkit } = useQuery({ - queryKey: ['toolkit', toolkit_id], - queryFn: () => api.getToolkit(toolkit_id!), - enabled: !!toolkit_id && isLoggedIn, - retry: false, - }) + const { data: toolkit } = useQuery({ + queryKey: ['toolkit', toolkit_id], + queryFn: () => api.getToolkit(toolkit_id!), + enabled: !!toolkit_id && isLoggedIn, + retry: false, + }); - const approveMutation = useMutation({ - mutationFn: () => api.approveAccessRequest(toolkit_id!, req_id!), - onSuccess: () => { - setResult('approved') - setTimeout(() => navigate('/toolkits'), 2500) - }, - }) + const approveMutation = useMutation({ + mutationFn: () => api.approveAccessRequest(toolkit_id!, req_id!), + onSuccess: () => { + setResult('approved'); + setTimeout(() => navigate('/toolkits'), 2500); + }, + }); - const denyMutation = useMutation({ - mutationFn: () => api.denyAccessRequest(toolkit_id!, req_id!), - onSuccess: () => { - setResult('denied') - setTimeout(() => navigate('/toolkits'), 2500) - }, - }) + const denyMutation = useMutation({ + mutationFn: () => api.denyAccessRequest(toolkit_id!, req_id!), + onSuccess: () => { + setResult('denied'); + setTimeout(() => navigate('/toolkits'), 2500); + }, + }); - const actionError = approveMutation.error || denyMutation.error + const actionError = approveMutation.error || denyMutation.error; - // ── Loading user ────────────────────────────────────────────────────────── - if (userLoading) { - return ( -
-
Loading...
-
- ) - } + // ── Loading user ────────────────────────────────────────────────────────── + if (userLoading) { + return ( +
+
Loading...
+
+ ); + } - // ── Not logged in ───────────────────────────────────────────────────────── - if (!isLoggedIn) { - const loginUrl = `/login?next=${encodeURIComponent(window.location.pathname)}` - return ( -
-
- -
-
-
- -
-

Login Required

-

- You need to be logged in as an admin to approve or deny access requests. -

-
- -
-
-
- ) - } + // ── Not logged in ───────────────────────────────────────────────────────── + if (!isLoggedIn) { + const loginUrl = `/login?next=${encodeURIComponent(window.location.pathname)}`; + return ( +
+
+ +
+
+
+ +
+

+ Login Required +

+

+ You need to be logged in as an admin to approve or deny access + requests. +

+
+ +
+
+
+ ); + } - // ── Loading request ─────────────────────────────────────────────────────── - if (requestLoading) { - return ( -
-
Loading request...
-
- ) - } + // ── Loading request ─────────────────────────────────────────────────────── + if (requestLoading) { + return ( +
+
Loading request...
+
+ ); + } - // ── Request error or not found ──────────────────────────────────────────── - if (requestError || !request) { - return ( -
-
- -

Request Not Found

-

- {requestError - ? extractErrorMessage(requestError) - : "This access request doesn't exist or the link may have expired."} -

- -
-
- ) - } + // ── Request error or not found ──────────────────────────────────────────── + if (requestError || !request) { + return ( +
+
+ +

+ Request Not Found +

+

+ {requestError + ? extractErrorMessage(requestError) + : "This access request doesn't exist or the link may have expired."} +

+ +
+
+ ); + } - // ── Already resolved ────────────────────────────────────────────────────── - if (request.status !== 'pending') { - const isApproved = request.status === 'approved' - return ( -
-
- {isApproved - ? - : - } -

- Request Already {isApproved ? 'Approved' : 'Denied'} -

-

- This access request was already {request.status}. -

- -
-
- ) - } + // ── Already resolved ────────────────────────────────────────────────────── + if (request.status !== 'pending') { + const isApproved = request.status === 'approved'; + return ( +
+
+ {isApproved ? ( + + ) : ( + + )} +

+ Request Already {isApproved ? 'Approved' : 'Denied'} +

+

+ This access request was already {request.status}. +

+ +
+
+ ); + } - // ── After action success ────────────────────────────────────────────────── - if (result) { - return ( -
-
- {result === 'approved' - ? - : - } -

- Request {result === 'approved' ? 'Approved' : 'Denied'} -

-

Redirecting to toolkits...

-
-
- ) - } + // ── After action success ────────────────────────────────────────────────── + if (result) { + return ( +
+
+ {result === 'approved' ? ( + + ) : ( + + )} +

+ Request {result === 'approved' ? 'Approved' : 'Denied'} +

+

Redirecting to toolkits...

+
+
+ ); + } - const payload = request.payload as Record - const requestedCredId = payload?.credential_id as string | undefined - const requestedApiId = payload?.api_id as string | undefined - const requestedRules = payload?.rules as PermissionRule[] | undefined + const payload = request.payload as Record; + const requestedCredId = payload?.credential_id as string | undefined; + const requestedApiId = payload?.api_id as string | undefined; + const requestedRules = payload?.rules as PermissionRule[] | undefined; - return ( -
- {/* Minimal header */} -
- -
+ return ( +
+ {/* Minimal header */} +
+ +
-
-
- {/* Title */} -
-
- -

Access Request Pending

-
-

Review the details and approve or deny.

-
+
+
+ {/* Title */} +
+
+ +

+ Access Request Pending +

+
+

+ Review the details and approve or deny. +

+
- {/* Request card */} -
- {/* Toolkit */} -
-

Toolkit

-
- {toolkit?.name ?? toolkit_id} - {toolkit?.simulate && simulate} -
-
+ {/* Request card */} +
+ {/* Toolkit */} +
+

+ Toolkit +

+
+ + {toolkit?.name ?? toolkit_id} + + {toolkit?.simulate && simulate} +
+
- {/* Type */} -
-

Request Type

- - {request.type === 'grant' ? 'Credential Access' : 'Permission Modification'} - -
+ {/* Type */} +
+

+ Request Type +

+ + {request.type === 'grant' + ? 'Credential Access' + : 'Permission Modification'} + +
- {/* Reason */} - {request.reason && ( -
-

Agent says

-

- "{request.reason}" -

-
- )} + {/* Reason */} + {request.reason && ( +
+

+ Agent says +

+

+ "{request.reason}" +

+
+ )} - {/* Description */} - {request.description && ( -
-

Description

-

{request.description}

-
- )} + {/* Description */} + {request.description && ( +
+

+ Description +

+

{request.description}

+
+ )} - {/* Grant details */} - {request.type === 'grant' && (requestedCredId || requestedApiId) && ( -
-

Requesting Access To

-
- {requestedCredId && ( -

- Credential:{' '} - {requestedCredId} -

- )} - {requestedApiId && ( -

- API:{' '} - {requestedApiId} -

- )} -
-
- )} + {/* Grant details */} + {request.type === 'grant' && (requestedCredId || requestedApiId) && ( +
+

+ Requesting Access To +

+
+ {requestedCredId && ( +

+ + Credential: + {' '} + + {requestedCredId} + +

+ )} + {requestedApiId && ( +

+ API:{' '} + + {requestedApiId} + +

+ )} +
+
+ )} - {/* Permission changes */} - {request.type === 'modify_permissions' && requestedRules && requestedRules.length > 0 && ( -
-

Requested Permission Changes

-
- -
-
- )} + {/* Permission changes */} + {request.type === 'modify_permissions' && + requestedRules && + requestedRules.length > 0 && ( +
+

+ Requested Permission Changes +

+
+ +
+
+ )} - {request.created_at && ( -
- - Requested {new Date(request.created_at * 1000).toLocaleString()} -
- )} -
+ {request.created_at && ( +
+ + + Requested {new Date(request.created_at * 1000).toLocaleString()} + +
+ )} +
- {/* Action error — now with meaningful messages */} - {actionError && ( -
- - {extractErrorMessage(actionError)} -
- )} + {/* Action error — now with meaningful messages */} + {actionError && ( +
+ + {extractErrorMessage(actionError)} +
+ )} - {/* Action buttons */} -
- - -
-
-
-
- ) + {/* Action buttons */} +
+ + +
+
+
+
+ ); } diff --git a/ui/src/pages/CatalogPage.tsx b/ui/src/pages/CatalogPage.tsx index 1bfb952e..0a90c7ab 100644 --- a/ui/src/pages/CatalogPage.tsx +++ b/ui/src/pages/CatalogPage.tsx @@ -1,419 +1,579 @@ -import React, { useState } from 'react' -import { Link } from 'react-router-dom' -import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' -import { api } from '../api/client' -import { Badge, MethodBadge } from '../components/ui/Badge' -import { Database, RefreshCw, Plus, ChevronRight, ChevronDown, ExternalLink, Download, Search, AlertTriangle, Check, Loader2, Zap, Globe } from 'lucide-react' - -type Tab = 'registered' | 'catalog' +import React, { useState } from 'react'; +import { Link } from 'react-router-dom'; +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { + Database, + RefreshCw, + Plus, + ChevronRight, + ChevronDown, + ExternalLink, + Download, + Search, + AlertTriangle, + Loader2, + Zap, + Globe, +} from 'lucide-react'; +import { api } from '@/api/client'; +import { Badge, MethodBadge } from '@/components/ui/Badge'; + +type Tab = 'registered' | 'catalog'; // ── Registered APIs tab ─────────────────────────────────────────────────────── function OperationsPanel({ apiId }: { apiId: string }) { - const { data: opsPage, isLoading } = useQuery({ - queryKey: ['ops', apiId], - queryFn: () => api.listOperations(apiId, 1, 50), - staleTime: 60000, - }) - const ops = (opsPage as any)?.data ?? [] - const total = (opsPage as any)?.total ?? 0 - - if (isLoading) return ( -
- Loading operations... -
- ) - if (ops.length === 0) return ( -
No operations indexed for this API.
- ) - return ( -
-
- {total} operation{total !== 1 ? 's' : ''} -
-
- {ops.map((op: any) => ( -
- -
-

{op.summary ?? op.operation_id}

- {op.path ?? op.id} -
-
- ))} - {total > 50 && ( -
- + {total - 50} more — use Search to find specific operations -
- )} -
-
- ) + const { data: opsPage, isLoading } = useQuery({ + queryKey: ['ops', apiId], + queryFn: () => api.listOperations(apiId, 1, 50), + staleTime: 60000, + }); + const ops = (opsPage as any)?.data ?? []; + const total = (opsPage as any)?.total ?? 0; + + if (isLoading) + return ( +
+ Loading operations... +
+ ); + if (ops.length === 0) + return ( +
+ No operations indexed for this API. +
+ ); + return ( +
+
+ + {total} operation{total !== 1 ? 's' : ''} + +
+
+ {ops.map((op: any) => ( +
+ +
+

+ {op.summary ?? op.operation_id} +

+ + {op.path ?? op.id} + +
+
+ ))} + {total > 50 && ( +
+ + {total - 50} more — use Search to find specific operations +
+ )} +
+
+ ); } function ApiCard({ entry, defaultOpen = false }: { entry: any; defaultOpen?: boolean }) { - const [open, setOpen] = useState(defaultOpen) - const isLocal = entry.source === 'local' - - return ( -
- - {open && isLocal && } - {open && !isLocal && ( -
- This API is in the public catalog but not yet imported. Add a credential with this API ID to import it automatically. -
- - Add credential for {entry.id} - -
-
- )} -
- ) + const [open, setOpen] = useState(defaultOpen); + const isLocal = entry.source === 'local'; + + return ( +
+ + {open && isLocal && } + {open && !isLocal && ( +
+ This API is in the public catalog but not yet imported. Add a credential with + this API ID to import it automatically. +
+ + Add credential for {entry.id} + +
+
+ )} +
+ ); } function RegisteredTab({ q }: { q: string }) { - const [page, setPage] = useState(1) - const LIMIT = 20 - - const { data: apisPage, isLoading, isError } = useQuery({ - queryKey: ['apis', 'local', page, q], - queryFn: () => api.listApis(page, LIMIT, 'local', q || undefined), - staleTime: 30000, - }) - - const apis: any[] = (apisPage as any)?.data ?? [] - const total: number = (apisPage as any)?.total ?? 0 - const totalPages: number = (apisPage as any)?.total_pages ?? 1 - - if (isLoading) return
Loading APIs...
- - if (isError) return ( -
-

Failed to load registered APIs

-

Please try refreshing the page.

-
- ) - - if (apis.length === 0) return ( -
- -

No APIs registered yet

-

Import APIs from the public catalog, or add credentials with an API ID to auto-import them.

- - Add Credential - -
- ) - - return ( -
-

{total} API{total !== 1 ? 's' : ''} registered

-
- {apis.map((entry: any) => )} -
- {totalPages > 1 && ( -
- - Page {page} of {totalPages} - -
- )} -
- ) + const [page, setPage] = useState(1); + const LIMIT = 20; + + const { + data: apisPage, + isLoading, + isError, + } = useQuery({ + queryKey: ['apis', 'local', page, q], + queryFn: () => api.listApis(page, LIMIT, 'local', q || undefined), + staleTime: 30000, + }); + + const apis: any[] = (apisPage as any)?.data ?? []; + const total: number = (apisPage as any)?.total ?? 0; + const totalPages: number = (apisPage as any)?.total_pages ?? 1; + + if (isLoading) + return
Loading APIs...
; + + if (isError) + return ( +
+

Failed to load registered APIs

+

+ Please try refreshing the page. +

+
+ ); + + if (apis.length === 0) + return ( +
+ +

No APIs registered yet

+

+ Import APIs from the public catalog, or add credentials with an API ID to + auto-import them. +

+ + Add Credential + +
+ ); + + return ( +
+

+ {total} API{total !== 1 ? 's' : ''} registered +

+
+ {apis.map((entry: any) => ( + + ))} +
+ {totalPages > 1 && ( +
+ + + Page {page} of {totalPages} + + +
+ )} +
+ ); } // ── Public Catalog tab ──────────────────────────────────────────────────────── -type CatalogFilter = 'all' | 'registered' | 'unregistered' +type CatalogFilter = 'all' | 'registered' | 'unregistered'; function CatalogTab({ q }: { q: string }) { - const queryClient = useQueryClient() - const [filter, setFilter] = useState('all') - const [importingId, setImportingId] = useState(null) - const [importedIds, setImportedIds] = useState>(new Set()) - - const { data: catalogData, isLoading, error } = useQuery({ - queryKey: ['catalog', q, filter], - queryFn: () => api.listCatalog( - q || undefined, - 100, - filter === 'registered', - filter === 'unregistered', - ), - staleTime: 60000, - }) - - const refreshMutation = useMutation({ - mutationFn: () => api.refreshCatalog(), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['catalog'] }) - queryClient.invalidateQueries({ queryKey: ['apis'] }) - }, - }) - - const handleImport = async (entry: any) => { - const apiId = entry.api_id - setImportingId(apiId) - try { - // Step 1: Get spec URL from catalog - const catalogRes = await fetch(`/catalog/${apiId}`, { credentials: 'include' }) - if (!catalogRes.ok) { - const body = await catalogRes.json().catch(() => ({})) - throw new Error(body.detail || `Catalog lookup failed (${catalogRes.status})`) - } - const catalogEntry = await catalogRes.json() - if (!catalogEntry.spec_url) { - throw new Error('No spec URL found for this API in the catalog') - } - - // Step 2: Import via POST /import - const importRes = await fetch('/import', { - method: 'POST', - credentials: 'include', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - sources: [{ - type: 'url', - url: catalogEntry.spec_url, - force_api_id: apiId, - }], - }), - }) - if (!importRes.ok) { - const body = await importRes.json().catch(() => ({})) - throw new Error(body.detail || `Import failed (${importRes.status})`) - } - const importResult = await importRes.json() - if (importResult.failed > 0) { - const err = importResult.results?.[0]?.error || 'Unknown error' - throw new Error(`Import failed: ${err}`) - } - setImportedIds(prev => new Set(prev).add(apiId)) - queryClient.invalidateQueries({ queryKey: ['catalog'] }) - queryClient.invalidateQueries({ queryKey: ['apis'] }) - } catch (e: any) { - alert(`Import failed: ${e.message}`) - } finally { - setImportingId(null) - } - } - - const catalogEntries: any[] = (catalogData as any)?.data ?? [] - const total: number = (catalogData as any)?.total ?? 0 - const catalogTotal: number = (catalogData as any)?.catalog_total ?? 0 - const manifestAge: number | null = (catalogData as any)?.manifest_age_seconds ?? null - const isEmpty = (catalogData as any)?.status === 'empty' - - const formatAge = (secs: number) => { - if (secs < 3600) return `${Math.round(secs / 60)}m ago` - if (secs < 86400) return `${Math.round(secs / 3600)}h ago` - return `${Math.round(secs / 86400)}d ago` - } - - if (isLoading) return
Loading catalog...
- - if (error) return ( -
- -

Failed to load catalog.

- -
- ) - - if (isEmpty) return ( -
- -
-

Catalog not synced yet

-

Pull the manifest from GitHub to browse available APIs.

-
- -
- ) - - return ( -
- {/* Header bar */} -
-
-

- {total} of {catalogTotal} APIs shown - {manifestAge != null && ( - · synced {formatAge(manifestAge)} - )} -

-
-
- {/* Filter */} -
- {(['all', 'registered', 'unregistered'] as CatalogFilter[]).map(f => ( - - ))} -
- -
-
- - {catalogEntries.length === 0 ? ( -
-

No APIs match your filter.

-
- ) : ( -
- {catalogEntries.map((entry: any) => { - const isRegistered = entry.registered || importedIds.has(entry.api_id) - return ( -
-
-
-

{entry.api_id}

- {isRegistered && registered} -
- {entry.description && ( -

{entry.description}

- )} -
-
- {entry._links?.github && ( - - - - )} - {isRegistered ? ( - - Search ops - - ) : ( - - )} -
-
- ) - })} -
- )} -
- ) + const queryClient = useQueryClient(); + const [filter, setFilter] = useState('all'); + const [importingId, setImportingId] = useState(null); + const [importedIds, setImportedIds] = useState>(new Set()); + + const { + data: catalogData, + isLoading, + error, + } = useQuery({ + queryKey: ['catalog', q, filter], + queryFn: () => + api.listCatalog( + q || undefined, + 100, + filter === 'registered', + filter === 'unregistered', + ), + staleTime: 60000, + }); + + const refreshMutation = useMutation({ + mutationFn: () => api.refreshCatalog(), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['catalog'] }); + queryClient.invalidateQueries({ queryKey: ['apis'] }); + }, + }); + + const handleImport = async (entry: any) => { + const apiId = entry.api_id; + setImportingId(apiId); + try { + // Step 1: Get spec URL from catalog + const catalogRes = await fetch(`/catalog/${apiId}`, { credentials: 'include' }); + if (!catalogRes.ok) { + const body = await catalogRes.json().catch(() => ({})); + throw new Error(body.detail || `Catalog lookup failed (${catalogRes.status})`); + } + const catalogEntry = await catalogRes.json(); + if (!catalogEntry.spec_url) { + throw new Error('No spec URL found for this API in the catalog'); + } + + // Step 2: Import via POST /import + const importRes = await fetch('/import', { + method: 'POST', + credentials: 'include', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + sources: [ + { + type: 'url', + url: catalogEntry.spec_url, + force_api_id: apiId, + }, + ], + }), + }); + if (!importRes.ok) { + const body = await importRes.json().catch(() => ({})); + throw new Error(body.detail || `Import failed (${importRes.status})`); + } + const importResult = await importRes.json(); + if (importResult.failed > 0) { + const err = importResult.results?.[0]?.error || 'Unknown error'; + throw new Error(`Import failed: ${err}`); + } + setImportedIds((prev) => new Set(prev).add(apiId)); + queryClient.invalidateQueries({ queryKey: ['catalog'] }); + queryClient.invalidateQueries({ queryKey: ['apis'] }); + } catch (e: any) { + alert(`Import failed: ${e.message}`); + } finally { + setImportingId(null); + } + }; + + const catalogEntries: any[] = (catalogData as any)?.data ?? []; + const total: number = (catalogData as any)?.total ?? 0; + const catalogTotal: number = (catalogData as any)?.catalog_total ?? 0; + const manifestAge: number | null = (catalogData as any)?.manifest_age_seconds ?? null; + const isEmpty = (catalogData as any)?.status === 'empty'; + + const formatAge = (secs: number) => { + if (secs < 3600) return `${Math.round(secs / 60)}m ago`; + if (secs < 86400) return `${Math.round(secs / 3600)}h ago`; + return `${Math.round(secs / 86400)}d ago`; + }; + + if (isLoading) + return
Loading catalog...
; + + if (error) + return ( +
+ +

Failed to load catalog.

+ +
+ ); + + if (isEmpty) + return ( +
+ +
+

Catalog not synced yet

+

+ Pull the manifest from GitHub to browse available APIs. +

+
+ +
+ ); + + return ( +
+ {/* Header bar */} +
+
+

+ {total} of {catalogTotal} APIs shown + {manifestAge != null && ( + + · synced {formatAge(manifestAge)} + + )} +

+
+
+ {/* Filter */} +
+ {(['all', 'registered', 'unregistered'] as CatalogFilter[]).map((f) => ( + + ))} +
+ +
+
+ + {catalogEntries.length === 0 ? ( +
+

No APIs match your filter.

+
+ ) : ( +
+ {catalogEntries.map((entry: any) => { + const isRegistered = entry.registered || importedIds.has(entry.api_id); + return ( +
+
+
+

+ {entry.api_id} +

+ {isRegistered && ( + + registered + + )} +
+ {entry.description && ( +

+ {entry.description} +

+ )} +
+
+ {entry._links?.github && ( + + + + )} + {isRegistered ? ( + + Search ops + + ) : ( + + )} +
+
+ ); + })} +
+ )} +
+ ); } // ── Main page ───────────────────────────────────────────────────────────────── export default function CatalogPage() { - const [tab, setTab] = useState('registered') - const [q, setQ] = useState('') - - return ( -
-
-
-

Discovery

-

API Catalog

-

- Browse your registered APIs and the Jentic public API catalog. -

-
- - Add Credential - -
- - {/* Tabs + Search */} -
-
- {([ - { key: 'registered', label: 'Your APIs' }, - { key: 'catalog', label: 'Public Catalog' }, - ] as { key: Tab; label: string }[]).map(t => ( - - ))} -
-
- - setQ(e.target.value)} - placeholder="Filter by name or API ID..." - aria-label="Filter APIs" - className="w-full bg-muted border border-border rounded-lg pl-8 pr-3 py-1.5 text-sm text-foreground placeholder:text-muted-foreground/60 focus:border-primary focus:outline-hidden" - /> -
-
- - {tab === 'registered' && } - {tab === 'catalog' && } -
- ) + const [tab, setTab] = useState('registered'); + const [q, setQ] = useState(''); + + return ( +
+
+
+

+ Discovery +

+

+ API Catalog +

+

+ Browse your registered APIs and the Jentic public API catalog. +

+
+ + Add Credential + +
+ + {/* Tabs + Search */} +
+
+ {( + [ + { key: 'registered', label: 'Your APIs' }, + { key: 'catalog', label: 'Public Catalog' }, + ] as { key: Tab; label: string }[] + ).map((t) => ( + + ))} +
+
+ + setQ(e.target.value)} + placeholder="Filter by name or API ID..." + aria-label="Filter APIs" + className="bg-muted border-border text-foreground placeholder:text-muted-foreground/60 focus:border-primary w-full rounded-lg border py-1.5 pr-3 pl-8 text-sm focus:outline-hidden" + /> +
+
+ + {tab === 'registered' && } + {tab === 'catalog' && } +
+ ); } diff --git a/ui/src/pages/CredentialFormPage.tsx b/ui/src/pages/CredentialFormPage.tsx index 4f10de72..5c4ab7c3 100644 --- a/ui/src/pages/CredentialFormPage.tsx +++ b/ui/src/pages/CredentialFormPage.tsx @@ -1,70 +1,74 @@ -import React, { useState, useEffect, useRef } from 'react' -import { useParams, useNavigate } from 'react-router-dom' -import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' -import { api } from '../api/client' -import type { CredentialCreate, CredentialPatch, ApiOut } from '../api/types' -import { ChevronLeft, AlertTriangle, Search, Check, ChevronRight, Loader2 } from 'lucide-react' +import React, { useState, useEffect, useRef } from 'react'; +import { useParams, useNavigate } from 'react-router-dom'; +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { ChevronLeft, AlertTriangle, Search, Check, ChevronRight, Loader2 } from 'lucide-react'; +import { api } from '@/api/client'; +import type { CredentialCreate, CredentialPatch, ApiOut } from '@/api/types'; // ── Helpers ──────────────────────────────────────────────────────────────── function useDebounce(value: T, ms: number): T { - const [debounced, setDebounced] = useState(value) - useEffect(() => { - const t = setTimeout(() => setDebounced(value), ms) - return () => clearTimeout(t) - }, [value, ms]) - return debounced + const [debounced, setDebounced] = useState(value); + useEffect(() => { + const t = setTimeout(() => setDebounced(value), ms); + return () => clearTimeout(t); + }, [value, ms]); + return debounced; } -type SchemeType = 'bearer' | 'basic' | 'apiKey' | 'oauth2' | 'unknown' +type SchemeType = 'bearer' | 'basic' | 'apiKey' | 'oauth2' | 'unknown'; -type RawSchemes = Record | null | undefined +type RawSchemes = Record | null | undefined; interface SchemeOption { - name: string // key from securitySchemes (e.g. "bearerAuth") - type: SchemeType - label: string // human label (e.g. "Bearer Token") + name: string; // key from securitySchemes (e.g. "bearerAuth") + type: SchemeType; + label: string; // human label (e.g. "Bearer Token") } -const SCHEME_TYPE_PRIORITY: SchemeType[] = ['bearer', 'apiKey', 'basic', 'oauth2', 'unknown'] +const SCHEME_TYPE_PRIORITY: SchemeType[] = ['bearer', 'apiKey', 'basic', 'oauth2', 'unknown']; const SCHEME_TYPE_LABELS: Record = { - bearer: 'Bearer Token', - apiKey: 'API Key', - basic: 'Basic Auth', - oauth2: 'OAuth 2.0', - unknown: 'Credential', -} + bearer: 'Bearer Token', + apiKey: 'API Key', + basic: 'Basic Auth', + oauth2: 'OAuth 2.0', + unknown: 'Credential', +}; function schemeTypeFromRaw(s: { type?: string; scheme?: string }): SchemeType { - if (s.type === 'oauth2') return 'oauth2' - if (s.type === 'http' && s.scheme?.toLowerCase() === 'bearer') return 'bearer' - if (s.type === 'http' && s.scheme?.toLowerCase() === 'basic') return 'basic' - if (s.type === 'apiKey') return 'apiKey' - return 'unknown' + if (s.type === 'oauth2') return 'oauth2'; + if (s.type === 'http' && s.scheme?.toLowerCase() === 'bearer') return 'bearer'; + if (s.type === 'http' && s.scheme?.toLowerCase() === 'basic') return 'basic'; + if (s.type === 'apiKey') return 'apiKey'; + return 'unknown'; } /** Returns all scheme options from a spec, sorted by priority. */ function parseSchemeOptions(schemes: RawSchemes): SchemeOption[] { - if (!schemes || Object.keys(schemes).length === 0) return [] - const options: SchemeOption[] = Object.entries(schemes).map(([name, s]) => { - const type = schemeTypeFromRaw(s) - return { name, type, label: SCHEME_TYPE_LABELS[type] } - }) - // Sort by priority, dedup labels (keep first of each type) - const seen = new Set() - return options - .sort((a, b) => SCHEME_TYPE_PRIORITY.indexOf(a.type) - SCHEME_TYPE_PRIORITY.indexOf(b.type)) - .filter(o => { if (seen.has(o.type)) return false; seen.add(o.type); return true }) + if (!schemes || Object.keys(schemes).length === 0) return []; + const options: SchemeOption[] = Object.entries(schemes).map(([name, s]) => { + const type = schemeTypeFromRaw(s); + return { name, type, label: SCHEME_TYPE_LABELS[type] }; + }); + // Sort by priority, dedup labels (keep first of each type) + const seen = new Set(); + return options + .sort((a, b) => SCHEME_TYPE_PRIORITY.indexOf(a.type) - SCHEME_TYPE_PRIORITY.indexOf(b.type)) + .filter((o) => { + if (seen.has(o.type)) return false; + seen.add(o.type); + return true; + }); } function inferSchemeTypeFromSchemes(schemes: RawSchemes): SchemeType { - const options = parseSchemeOptions(schemes) - return options[0]?.type ?? 'unknown' + const options = parseSchemeOptions(schemes); + return options[0]?.type ?? 'unknown'; } function firstSchemeNameFromSchemes(schemes: RawSchemes): string | null { - if (!schemes) return null - return Object.keys(schemes)[0] ?? null + if (!schemes) return null; + return Object.keys(schemes)[0] ?? null; } /** Fetch security schemes for a selected API. @@ -73,445 +77,583 @@ function firstSchemeNameFromSchemes(schemes: RawSchemes): string | null { * Returns { schemes, loading } */ function useApiSchemes(selectedApi: ApiOut | null): { schemes: RawSchemes; loading: boolean } { - const isCatalog = selectedApi?.source === 'catalog' - const isLocal = selectedApi?.source === 'local' || (!!selectedApi && !selectedApi.source) - - // Local: fetch full API detail - const { data: localDetail, isLoading: localLoading } = useQuery({ - queryKey: ['api-detail', selectedApi?.id], - queryFn: () => api.getApi(selectedApi!.id), - enabled: !!selectedApi && isLocal, - }) - - // Catalog step 1: get catalog entry to find spec_url - const { data: catalogEntry, isLoading: entryLoading } = useQuery({ - queryKey: ['catalog-entry', selectedApi?.id], - queryFn: () => api.getCatalogEntry(selectedApi!.id), - enabled: !!selectedApi && isCatalog, - }) - - const specUrl: string | null = (catalogEntry as any)?.spec_url ?? null - - // Catalog step 2: fetch the raw spec from GitHub (public, no auth) - const { data: spec, isLoading: specLoading } = useQuery({ - queryKey: ['spec', specUrl], - queryFn: async () => { - const res = await fetch(specUrl!) - if (!res.ok) throw new Error(`Failed to fetch spec: ${res.status}`) - return res.json() - }, - enabled: !!specUrl, - staleTime: 5 * 60 * 1000, // cache for 5 min - }) - - if (isLocal) { - const schemes = (localDetail as any)?.security_schemes as RawSchemes - return { schemes, loading: localLoading } - } - - if (isCatalog) { - const schemes = (spec as any)?.components?.securitySchemes as RawSchemes - return { schemes, loading: entryLoading || specLoading } - } - - return { schemes: null, loading: false } + const isCatalog = selectedApi?.source === 'catalog'; + const isLocal = selectedApi?.source === 'local' || (!!selectedApi && !selectedApi.source); + + // Local: fetch full API detail + const { data: localDetail, isLoading: localLoading } = useQuery({ + queryKey: ['api-detail', selectedApi?.id], + queryFn: () => api.getApi(selectedApi!.id), + enabled: !!selectedApi && isLocal, + }); + + // Catalog step 1: get catalog entry to find spec_url + const { data: catalogEntry, isLoading: entryLoading } = useQuery({ + queryKey: ['catalog-entry', selectedApi?.id], + queryFn: () => api.getCatalogEntry(selectedApi!.id), + enabled: !!selectedApi && isCatalog, + }); + + const specUrl: string | null = (catalogEntry as any)?.spec_url ?? null; + + // Catalog step 2: fetch the raw spec from GitHub (public, no auth) + const { data: spec, isLoading: specLoading } = useQuery({ + queryKey: ['spec', specUrl], + queryFn: async () => { + const res = await fetch(specUrl!); + if (!res.ok) throw new Error(`Failed to fetch spec: ${res.status}`); + return res.json(); + }, + enabled: !!specUrl, + staleTime: 5 * 60 * 1000, // cache for 5 min + }); + + if (isLocal) { + const schemes = (localDetail as any)?.security_schemes as RawSchemes; + return { schemes, loading: localLoading }; + } + + if (isCatalog) { + const schemes = (spec as any)?.components?.securitySchemes as RawSchemes; + return { schemes, loading: entryLoading || specLoading }; + } + + return { schemes: null, loading: false }; } // ── Step 1 — API Picker ──────────────────────────────────────────────────── function ApiPicker({ onSelect }: { onSelect: (api: ApiOut) => void }) { - const [query, setQuery] = useState('') - const debouncedQuery = useDebounce(query, 250) - const inputRef = useRef(null) - - useEffect(() => { inputRef.current?.focus() }, []) - - const { data, isLoading } = useQuery({ - queryKey: ['apis-search', debouncedQuery], - queryFn: () => api.listApis(1, 30, undefined, debouncedQuery), - enabled: debouncedQuery.length > 0, - placeholderData: prev => prev, - }) - - const items = (data?.items ?? (data as any)?.data ?? []) as ApiOut[] - const local = items.filter((a: ApiOut) => a.source === 'local') - const catalog = items.filter((a: ApiOut) => a.source === 'catalog') - - return ( -
-
- - setQuery(e.target.value)} - placeholder="Search APIs (GitHub, Gmail, Stripe…)" - aria-label="Search APIs" - className="w-full bg-background border border-border rounded-lg pl-9 pr-3 py-2.5 text-foreground focus:border-primary focus:outline-hidden" - /> - {isLoading && } -
- - {items.length === 0 && !isLoading && debouncedQuery && ( -

No APIs found for "{debouncedQuery}"

- )} - - {local.length > 0 && ( -
-

Available locally

-
- {local.map((a: ApiOut) => )} -
-
- )} - - {catalog.length > 0 && ( -
-

From public catalog

-
- {catalog.map((a: ApiOut) => )} -
-
- )} - - {!debouncedQuery && items.length === 0 && !isLoading && ( -

Start typing to search 10,000+ APIs

- )} -
- ) + const [query, setQuery] = useState(''); + const debouncedQuery = useDebounce(query, 250); + const inputRef = useRef(null); + + useEffect(() => { + inputRef.current?.focus(); + }, []); + + const { data, isLoading } = useQuery({ + queryKey: ['apis-search', debouncedQuery], + queryFn: () => api.listApis(1, 30, undefined, debouncedQuery), + enabled: debouncedQuery.length > 0, + placeholderData: (prev) => prev, + }); + + const items = (data?.items ?? (data as any)?.data ?? []) as ApiOut[]; + const local = items.filter((a: ApiOut) => a.source === 'local'); + const catalog = items.filter((a: ApiOut) => a.source === 'catalog'); + + return ( +
+
+ + setQuery(e.target.value)} + placeholder="Search APIs (GitHub, Gmail, Stripe…)" + aria-label="Search APIs" + className="bg-background border-border text-foreground focus:border-primary w-full rounded-lg border py-2.5 pr-3 pl-9 focus:outline-hidden" + /> + {isLoading && ( + + )} +
+ + {items.length === 0 && !isLoading && debouncedQuery && ( +

+ No APIs found for "{debouncedQuery}" +

+ )} + + {local.length > 0 && ( +
+

+ Available locally +

+
+ {local.map((a: ApiOut) => ( + + ))} +
+
+ )} + + {catalog.length > 0 && ( +
+

+ From public catalog +

+
+ {catalog.map((a: ApiOut) => ( + + ))} +
+
+ )} + + {!debouncedQuery && items.length === 0 && !isLoading && ( +

+ Start typing to search 10,000+ APIs +

+ )} +
+ ); } function ApiRow({ api: a, onSelect }: { api: ApiOut; onSelect: (api: ApiOut) => void }) { - const hasCreds = !!a.has_credentials - return ( - - ) + const hasCreds = !!a.has_credentials; + return ( + + ); } // ── Step 2 — Credential Fields ───────────────────────────────────────────── interface CredFieldsProps { - selectedApi: ApiOut - onBack: () => void - onSaved: () => void - editId?: string - existing?: any + selectedApi: ApiOut; + onBack: () => void; + onSaved: () => void; + editId?: string; + existing?: any; } function CredentialFields({ selectedApi, onBack, onSaved, editId, existing }: CredFieldsProps) { - const queryClient = useQueryClient() - const isEdit = !!editId - - // Fetch security schemes from spec (local: API detail, catalog: raw spec via GitHub) - const { schemes, loading: schemesLoading } = useApiSchemes(selectedApi) - const schemeOptions = parseSchemeOptions(schemes) - const defaultScheme = schemeOptions[0] ?? null - const [selectedScheme, setSelectedScheme] = useState(null) - - // Reset scheme selection and fields when API changes - useEffect(() => { - setSelectedScheme(null) - setLabel(selectedApi.name ?? selectedApi.id) - setValue('') - setIdentity('') - setError(null) - }, [selectedApi.id]) - - // Prefill from existing credential in edit mode - useEffect(() => { - if (existing) { - setLabel(existing.label ?? '') - setIdentity(existing.identity ?? '') - // value is write-only — leave blank - } - }, [existing]) - - const activeScheme = selectedScheme ?? defaultScheme - const schemeType = activeScheme?.type ?? 'unknown' - const schemeName = activeScheme?.name ?? firstSchemeNameFromSchemes(schemes) - - const [label, setLabel] = useState(existing?.label ?? selectedApi.name ?? selectedApi.id) - const [value, setValue] = useState('') - const [identity, setIdentity] = useState(existing?.identity ?? '') - const [error, setError] = useState(null) - - // For OAuth, show a different CTA - const hasOAuthBroker = !!(selectedApi.oauth_broker_id as string | undefined) - - const createMutation = useMutation({ - mutationFn: (d: CredentialCreate) => api.createCredential(d), - onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['credentials'] }); onSaved() }, - onError: (e: Error) => setError(e.message), - }) - - const updateMutation = useMutation({ - mutationFn: (d: CredentialPatch) => api.updateCredential(editId!, d), - onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['credentials'] }); onSaved() }, - onError: (e: Error) => setError(e.message), - }) - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault() - if (schemeType === 'oauth2') return - setError(null) - - // Derive auth_type from scheme - const authTypeMap: Record = { - bearer: 'bearer', - apiKey: 'apiKey', - basic: 'basic', - oauth2: undefined, - unknown: undefined, - } - - if (isEdit) { - updateMutation.mutate({ - label: label || null, - api_id: selectedApi.id, - auth_type: authTypeMap[schemeType], - value: value || null, - identity: identity || null, - }) - } else { - if (!value) { setError('Credential value is required'); return } - createMutation.mutate({ - label, - api_id: selectedApi.id, - auth_type: authTypeMap[schemeType], - value, - identity: identity || undefined, - }) - } - } - - const isLoading = createMutation.isPending || updateMutation.isPending - - if (schemesLoading) { - return ( -
- - Reading API spec… -
- ) - } - - return ( -
- {/* Selected API summary */} -
-
-

{selectedApi.name ?? selectedApi.id}

-

{selectedApi.id}

-
- -
- - {/* Scheme picker — only shown when multiple auth types available */} - {schemeOptions.length > 1 && ( -
- -
- {schemeOptions.map(opt => ( - - ))} -
-
- )} - - {/* Label */} -
- - setLabel(e.target.value)} required - className="w-full bg-background border border-border rounded-lg px-3 py-2 text-foreground focus:border-primary focus:outline-hidden" /> -
- - {/* OAuth flow */} - {schemeType === 'oauth2' && (() => { - const apiName = selectedApi.name ?? selectedApi.id - const prompt = `Please set up OAuth access for ${apiName} (api_id: "${selectedApi.id}") on my Jentic Mini instance at ${window.location.host}, so I can use it in my workflows.` - return ( -
-

OAuth required

-

- {apiName} uses OAuth 2.0. Ask your agent to set this up — copy the prompt below and send it: -

-
-
{prompt}
- -
- {hasOAuthBroker && ( - - OAuth broker already configured — connect here → - - )} -
- ) - })()} - - {/* Basic auth: username + password */} - {schemeType === 'basic' && ( - <> -
- - setIdentity(e.target.value)} - placeholder="Your username" - className="w-full bg-background border border-border rounded-lg px-3 py-2 text-foreground focus:border-primary focus:outline-hidden" /> -
-
- - setValue(e.target.value)} required={!isEdit} - placeholder={isEdit ? 'Leave blank to keep existing' : 'Your password'} - className="w-full bg-background border border-border rounded-lg px-3 py-2 text-foreground focus:border-primary focus:outline-hidden" /> -
- - )} - - {/* Bearer / apiKey / unknown: single token field */} - {(schemeType === 'bearer' || schemeType === 'apiKey' || schemeType === 'unknown') && ( -
- -