From bc23782d0bd87b57f6854b51914eb99818c4f14a Mon Sep 17 00:00:00 2001 From: Ali Waseem Date: Mon, 16 Mar 2026 14:39:56 -0600 Subject: [PATCH 001/169] fix: update project unpause to not show undefined (#43820) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? When un-pausing the dashboard, the project home page on platform shows undefined rather than the default state of "URL not available" ## Ways to test You can pause and then unpause a project to see if this works correctly --- apps/studio/data/config/project-endpoint-query.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/studio/data/config/project-endpoint-query.ts b/apps/studio/data/config/project-endpoint-query.ts index d1a7c1bd028..9311f7f5ff8 100644 --- a/apps/studio/data/config/project-endpoint-query.ts +++ b/apps/studio/data/config/project-endpoint-query.ts @@ -34,7 +34,8 @@ export const useProjectApiUrl = ( const protocol = settings?.app_config?.protocol ?? 'https' const endpoint = settings?.app_config?.endpoint - const hostEndpoint = isSuccessProjectSettings ? `${protocol}://${endpoint}` : undefined + const hostEndpoint = + isSuccessProjectSettings && endpoint ? `${protocol}://${endpoint}` : undefined const resolvedEndpoint = isCustomDomainsActive ? customEndpoint : hostEndpoint const storageEndpoint = settings?.app_config?.storage_endpoint ? `${IS_PLATFORM ? 'https' : protocol}://${settings?.app_config?.storage_endpoint}` From db14762aa60246da77d05b23667e6c4fd3d58a2c Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:14:44 +0100 Subject: [PATCH 002/169] feat: Add table and column menus in schema visualiser (#43693) ## Problem - The schema visualiser lacks editing capabilities which leads to a lot of navigation (ediing tables, columns) - ReactFlow prevents users from selecting table and column names (to copy them). Diasbling drag and pan on those texts would make moving items cumbersome - Long table and column names are hidden and even hide other elements ## Solution - Add menus for both tables and columns - Truncate long names with ellipsis and add a tooltip - Hide menus when exporting to png/svg [Screen Recording 2026-03-12 at 10.10.08.webm](https://github.com/user-attachments/assets/b2780266-e874-41d1-ac82-7c2c4ba5abf2) --- .../Database/Schemas/ColumnEditionContext.tsx | 22 --- .../Database/Schemas/SchemaGraph.tsx | 29 ++- .../Database/Schemas/SchemaGraphContext.tsx | 24 +++ .../Database/Schemas/SchemaTableNode.tsx | 182 +++++++++++++----- .../TableEditor/TableEditor.tsx | 8 +- e2e/studio/features/database.spec.ts | 94 +++++++-- 6 files changed, 268 insertions(+), 91 deletions(-) delete mode 100644 apps/studio/components/interfaces/Database/Schemas/ColumnEditionContext.tsx create mode 100644 apps/studio/components/interfaces/Database/Schemas/SchemaGraphContext.tsx diff --git a/apps/studio/components/interfaces/Database/Schemas/ColumnEditionContext.tsx b/apps/studio/components/interfaces/Database/Schemas/ColumnEditionContext.tsx deleted file mode 100644 index 447e018bfcd..00000000000 --- a/apps/studio/components/interfaces/Database/Schemas/ColumnEditionContext.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { createContext, useContext, type ReactNode } from 'react' - -export type ColumnEditionContextType = { - onEditColumn: (tableId: number, columnId: string) => void -} - -export const ColumnEditionContext = createContext(null) - -export const ColumnEditionContextProvider = ({ - children, - value, -}: { - children: ReactNode - value: ColumnEditionContextType -}) => {children} - -export const useColumnEditionContext = () => { - const context = useContext(ColumnEditionContext) - if (!context) - throw new Error('useColumnEditionContext must be used inside a ') - return context -} diff --git a/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx b/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx index 2f3d3ae9113..16bb938e281 100644 --- a/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx +++ b/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx @@ -34,7 +34,7 @@ import { import { Admonition } from 'ui-patterns/admonition' import { SidePanelEditor } from '../../TableGridEditor/SidePanelEditor/SidePanelEditor' -import { ColumnEditionContextProvider, ColumnEditionContextType } from './ColumnEditionContext' +import { SchemaGraphContextProvider, SchemaGraphContextType } from './SchemaGraphContext' import { SchemaGraphLegend } from './SchemaGraphLegend' import { getGraphDataFromTables, getLayoutedElementsViaDagre } from './Schemas.utils' import { TableNode } from './SchemaTableNode' @@ -210,10 +210,20 @@ export const SchemaGraph = () => { } }) } - }, [isSuccessTables, isSuccessSchemas, tables, resolvedTheme]) + }, [ + isSuccessTables, + isSuccessSchemas, + tables, + reactFlowInstance, + ref, + resolvedTheme, + schemas, + selectedSchema, + ]) - const columnEditionContext = useMemo( + const schemaGraphPanelEditorContext = useMemo( () => ({ + isDownloading, onEditColumn: (tableId, columnId) => { const table = tables.find((table) => table.id === tableId) if (!table || table.columns == null) return @@ -224,8 +234,15 @@ export const SchemaGraph = () => { setSelectedTable(table) snap.onEditColumn(column) }, + onEditTable: (tableId) => { + const table = tables.find((table) => table.id === tableId) + if (!table || table.columns == null) return + + setSelectedTable(table) + snap.onEditTable() + }, }), - [tables, snap] + [tables, snap, isDownloading] ) return ( @@ -349,7 +366,7 @@ export const SchemaGraph = () => { ) : ( - +
{
-
+ )} )} diff --git a/apps/studio/components/interfaces/Database/Schemas/SchemaGraphContext.tsx b/apps/studio/components/interfaces/Database/Schemas/SchemaGraphContext.tsx new file mode 100644 index 00000000000..514168908b8 --- /dev/null +++ b/apps/studio/components/interfaces/Database/Schemas/SchemaGraphContext.tsx @@ -0,0 +1,24 @@ +import { createContext, useContext, type ReactNode } from 'react' + +export type SchemaGraphContextType = { + isDownloading: boolean + onEditColumn: (tableId: number, columnId: string) => void + onEditTable: (tableId: number) => void +} + +export const SchemaGraphContext = createContext(null) + +export const SchemaGraphContextProvider = ({ + children, + value, +}: { + children: ReactNode + value: SchemaGraphContextType +}) => {children} + +export const useSchemaGraphContext = () => { + const context = useContext(SchemaGraphContext) + if (!context) + throw new Error('useSchemaGraphContext must be used inside a ') + return context +} diff --git a/apps/studio/components/interfaces/Database/Schemas/SchemaTableNode.tsx b/apps/studio/components/interfaces/Database/Schemas/SchemaTableNode.tsx index 769117f37f3..a771bb5829e 100644 --- a/apps/studio/components/interfaces/Database/Schemas/SchemaTableNode.tsx +++ b/apps/studio/components/interfaces/Database/Schemas/SchemaTableNode.tsx @@ -1,19 +1,35 @@ +import { PermissionAction } from '@supabase/shared-types/out/constants' import { buildTableEditorUrl } from 'components/grid/SupabaseGrid.utils' +import { TableEditor } from 'icons' import { + Copy, DiamondIcon, Edit, - ExternalLink, Fingerprint, Hash, InfoIcon, Key, + MoreVertical, Table2, } from 'lucide-react' -import Link from 'next/link' +import { useRouter } from 'next/router' import { Handle, NodeProps } from 'reactflow' -import { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { + Button, + cn, + copyToClipboard, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, + Tooltip, + TooltipContent, + TooltipTrigger, +} from 'ui' -import { useColumnEditionContext } from './ColumnEditionContext' +import { useSchemaGraphContext } from './SchemaGraphContext' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' // ReactFlow is scaling everything by the factor of 2 export const TABLE_NODE_WIDTH = 320 @@ -46,8 +62,13 @@ export const TableNode = ({ // Important styles is a nasty hack to use Handles (required for edges calculations), but do not show them in the UI. // ref: https://github.com/wbkd/react-flow/discussions/2698 const hiddenNodeConnector = '!h-px !w-px !min-w-0 !min-h-0 !cursor-grab !border-0 !opacity-0' - const columnEditionContext = useColumnEditionContext() - + const schemaGraphContext = useSchemaGraphContext() + const { data: project } = useSelectedProjectQuery() + const { can: canUpdateColumns } = useAsyncCheckPermissions( + PermissionAction.TENANT_SQL_ADMIN_WRITE, + 'columns' + ) + const router = useRouter() const itemHeight = 'h-[22px]' return ( @@ -71,38 +92,76 @@ export const TableNode = ({ >
-
+
- {data.name} + + {data.name} +
-
- {data.description && ( - - - - - {data.description} - - )} + { + // Hide the actions while downloading the schema as png/svg + !schemaGraphContext.isDownloading ? ( +
+ {data.description && ( + + + + + {data.description} + + )} - {!placeholder && ( - - )} -
+ {!placeholder && ( + + + + + + schemaGraphContext.onEditTable(data.id)} + > + +

Edit table

+
+ { + e.stopPropagation() + copyToClipboard(data.name) + }} + > + + Copy name + + + router.push( + buildTableEditorUrl({ + projectRef: project?.ref, + tableId: data.id, + schema: data.schema, + }) + ) + } + > + +

View in Table Editor

+
+
+
+ )} +
+ ) : null + }
{data.columns.map((column) => ( @@ -117,6 +176,7 @@ export const TableNode = ({ 'pr-1', itemHeight )} + data-testid={`${data.name}/${column.name}`} key={column.id} >
)}
-
- +
+ {column.name} - + {column.format}
@@ -178,23 +241,50 @@ export const TableNode = ({ className={cn(hiddenNodeConnector, '!right-0')} /> )} - - + + - - Edit column - + + + + + schemaGraphContext.onEditColumn(data.id, column.id)} + className="space-x-2" + > + +

Edit column

+
+
+ {!canUpdateColumns && ( + + Additional permissions required to edit column + + )} +
+ + { + e.stopPropagation() + copyToClipboard(column.name) + }} + > + + Copy name + +
+
))} diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx index 9ff0aa34781..8758cb878b3 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx @@ -1,5 +1,4 @@ import type { PostgresTable } from '@supabase/postgres-meta' -import type { GeneratedPolicy } from 'components/interfaces/Auth/Policies/Policies.utils' import { DocsButton } from 'components/ui/DocsButton' import { useDatabasePublicationsQuery } from 'data/database-publications/database-publications-query' import { CONSTRAINT_TYPE, useTableConstraintsQuery } from 'data/database/constraints-query' @@ -329,11 +328,6 @@ export const TableEditor = ({ if (!tableFields) return null - const isExposed = isApiGrantTogglesEnabled - ? !!apiAccessToggleHandler.data?.schemaExposed && - checkDataApiPrivilegesNonEmpty(apiAccessToggleHandler.data.privileges) - : undefined - return ( { await expect(page.getByText('users', { exact: true })).toBeVisible() await expect(page.getByText('sso_providers', { exact: true })).toBeVisible() await expect(page.getByText('saml_providers', { exact: true })).toBeVisible() + }) - // navigate to table editor when icon is clicked - const samlProvidersHeader = await page.getByText('saml_providers', { exact: true }) - await samlProvidersHeader.locator('..').getByRole('link').click() + test('table actions work as expected', async ({ page, ref }) => { + const databaseTableName = 'pw_database_schema_table_actions' + const databaseColumnName = 'pw_database_schema_column_table_actions' + await using _ = await withSetupCleanup( + async () => { + await createTable(databaseTableName, databaseColumnName) + }, + async () => { + await dropTable(databaseTableName) + } + ) + const wait = createApiResponseWaiter( + page, + 'pg-meta', + ref, + 'tables?include_columns=true&included_schemas=public' + ) + await page.goto(toUrl(`/project/${env.PROJECT_REF}/database/schemas?schema=public`)) + await wait + + // validates table and column exists + await expect(page.getByText(databaseTableName, { exact: true })).toBeVisible() + // test we can edit the column + await page.getByText(`${databaseTableName} actions`).click() + + await page.getByText(`${databaseTableName} actions`).click() + await expect(page.getByRole('menuitem', { name: 'Edit table' })).toBeVisible() + await page.getByRole('menuitem', { name: 'Edit table' }).click({ force: true }) + const dialog = page.getByRole('dialog') + await expect(dialog).toBeVisible() + await expect(dialog.getByText('timestamptz')).toBeVisible() + await page.getByLabel('Description').fill('Bazinga') + await page.getByRole('button', { name: 'Save' }).click() + await expect(page.getByText(`Successfully updated ${databaseTableName}!`)).toBeVisible() + await expect(page.getByRole('dialog')).not.toBeVisible() + + // test the schema view has been refreshed + await page.getByText(`${databaseTableName} actions`).click() + await expect(page.getByRole('menuitem', { name: 'Edit table' })).toBeVisible() + await page.getByRole('menuitem', { name: 'Edit table' }).click() + await expect(page.getByRole('dialog')).toBeVisible() + // FIXME: For some reason, the dialog is not stable and rerenders, sometimes preventing the description to be filled + await page.waitForTimeout(500) + await expect(page.getByLabel('Description')).toHaveValue('Bazinga') + await page.getByRole('button', { name: 'Cancel' }).click() + await expect(page.getByRole('dialog')).not.toBeVisible() + + await page.getByText(`${databaseTableName} actions`).click() + await expect(page.getByRole('menuitem', { name: 'Copy name' })).toBeVisible() + await page.getByRole('menuitem', { name: 'Copy name' }).click() + await page.waitForTimeout(500) + const copiedTableResult = await page.evaluateHandle(() => navigator.clipboard.readText()) + expect(await copiedTableResult.jsonValue()).toBe(databaseTableName) + + await page.getByText(`${databaseTableName} actions`).click() + await expect(page.getByRole('menuitem', { name: 'View in Table Editor' })).toBeVisible() + await page.getByRole('menuitem', { name: 'View in Table Editor' }).click() await page.waitForURL(/.*\/editor\/\d+/) - await page.getByRole('button', { name: 'View saml_providers', exact: true }).click() + await expect(page.getByRole('tab', { name: databaseTableName })).toBeVisible() }) test('columns actions work as expected', async ({ page, ref }) => { @@ -93,8 +148,11 @@ test.describe('Database', () => { await expect(page.getByText(databaseTableName, { exact: true })).toBeVisible() await expect(page.getByText(databaseColumnName, { exact: true })).toBeVisible() // test we can edit the column - await page.getByText(databaseColumnName, { exact: true }).hover() - await page.getByText(`Edit ${databaseTableName} ${databaseColumnName} column`).click() + await page + .getByText(`${databaseTableName} ${databaseColumnName} actions`) + .click({ force: true }) + await expect(page.getByRole('menuitem', { name: 'Edit column' })).toBeVisible() + await page.getByRole('menuitem', { name: 'Edit column' }).click() await page.getByLabel('Description').fill('Bazinga') await page.getByRole('button', { name: 'Save' }).click() await expect( @@ -103,9 +161,23 @@ test.describe('Database', () => { await expect(page.getByRole('dialog')).not.toBeVisible() // test the schema view has been refreshed - await page.getByText(databaseColumnName, { exact: true }).hover() - await page.getByText(`Edit ${databaseTableName} ${databaseColumnName} column`).click() + await page + .getByText(`${databaseTableName} ${databaseColumnName} actions`) + .click({ force: true }) + await expect(page.getByRole('menuitem', { name: 'Edit column' })).toBeVisible() + await page.getByRole('menuitem', { name: 'Edit column' }).click() await expect(page.getByLabel('Description')).toHaveValue('Bazinga') + await page.getByRole('button', { name: 'Cancel' }).click() + await expect(page.getByRole('dialog')).not.toBeVisible() + + await page + .getByText(`${databaseTableName} ${databaseColumnName} actions`) + .click({ force: true }) + await expect(page.getByRole('menuitem', { name: 'Copy name' })).toBeVisible() + await page.getByRole('menuitem', { name: 'Copy name' }).click() + await page.waitForTimeout(500) + const copiedTableResult = await page.evaluateHandle(() => navigator.clipboard.readText()) + expect(await copiedTableResult.jsonValue()).toBe(databaseColumnName) }) }) @@ -186,7 +258,7 @@ test.describe('Database', () => { // create a new table await page.getByRole('button', { name: 'New table' }).click() - await page.getByTestId('table-name-input').fill(databaseTableNameNew) + await page.getByLabel('Name').fill(databaseTableNameNew) const createTableWait = createApiResponseWaiter( page, 'pg-meta', @@ -224,8 +296,8 @@ test.describe('Database', () => { .last() .click() await page.getByRole('menuitem', { name: 'Duplicate Table' }).click() - await page.getByTestId('table-name-input').fill(databaseTableNameDuplicate) - await page.getByRole('textbox', { name: 'Optional' }).fill('') + await page.getByLabel('Name').fill(databaseTableNameDuplicate) + await page.getByLabel('Description').fill('') const duplicateTableWait = createApiResponseWaiter(page, 'pg-meta', ref, 'query?key=') await page.getByRole('button', { name: 'Save' }).click() From 07a40185b1c955a4ca471e6715bda09bd446676b Mon Sep 17 00:00:00 2001 From: Ignacio Dobronich Date: Mon, 16 Mar 2026 18:26:58 -0300 Subject: [PATCH 003/169] chore: change tax id banner copy (#43835) `should` -> `must` in the Tax ID banner --- .../components/layouts/AppLayout/TaxIdBanner.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/studio/components/layouts/AppLayout/TaxIdBanner.tsx b/apps/studio/components/layouts/AppLayout/TaxIdBanner.tsx index a025743c5cc..14a0b9dd39d 100644 --- a/apps/studio/components/layouts/AppLayout/TaxIdBanner.tsx +++ b/apps/studio/components/layouts/AppLayout/TaxIdBanner.tsx @@ -20,13 +20,13 @@ export const TaxIdBanner = () => { false ) - const shouldFetch = + const shouldFetch = Boolean( !!slug && - org?.plan?.id !== 'free' && - isDismissLoaded && - !isDismissed && - !!org?.organization_missing_tax_id - + org?.plan?.id !== 'free' && + isDismissLoaded && + !isDismissed && + !!org?.organization_missing_tax_id + ) const { data: customerProfile } = useOrganizationCustomerProfileQuery( { slug }, { enabled: shouldFetch, staleTime: 1000 * 60 * 30 } @@ -53,7 +53,7 @@ export const TaxIdBanner = () => { title="Missing tax ID" description={ <> - Registered businesses should{' '} + Registered businesses must{' '} add a tax ID to their billing details From dc04437fde165379126164be20d5c88e54aa0a88 Mon Sep 17 00:00:00 2001 From: Ana <30495040+ana1337x@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:47:30 -0400 Subject: [PATCH 004/169] fix(www): correct feature statuses, MCP Server copy, and self-hosted flags (#43223) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? A content/data fix: correcting stale feature metadata on the marketing features page and docs feature status table. ## What is the current behavior? Several features in features.tsx (supabase.com/features) have incorrect stage or self-hosted availability values that are out of sync with docs. ## What is the new behavior? branching - stage updated to Beta vault - stage updated to Public Alpha jwt-signing-keys - availableOnSelfHosted set to true persistent-storage - docs URL corrected to /guides/functions/ephemeral-storage - env var names corrected to S3FS_ACCESS_KEY_ID, S3FS_SECRET_ACCESS_KEY, S3FS_REGION, S3FS_ENDPOINT_URL features.mdx - PrivateLink row added to the Platform section (beta, N/A for self-hosted) mcp-server - removed "upcoming" from OAuth benefit (OAuth is now live), updated PAT FAQ (OAuth is now default, PAT only needed for CI/CD), updated self-hosted FAQ (self-hosted is supported via /guides/self-hosting/enable-mcp) ## Additional context N/A --------- Co-authored-by: Ana Mogul --- .../content/guides/getting-started/features.mdx | 1 + apps/www/data/features.tsx | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/docs/content/guides/getting-started/features.mdx b/apps/docs/content/guides/getting-started/features.mdx index 7eeb46858b1..55bab5ea349 100644 --- a/apps/docs/content/guides/getting-started/features.mdx +++ b/apps/docs/content/guides/getting-started/features.mdx @@ -218,6 +218,7 @@ In addition to the Beta requirements, features in GA are covered by the [uptime | Platform | Read Replicas | `GA` | N/A | | Platform | Log Drains | `public alpha` | ✅ | | Platform | MCP | `public alpha` | ✅ | +| Platform | PrivateLink | `beta` | N/A | | Studio | | `GA` | ✅ | | Studio | SSO | `GA` | ✅ | | Studio | Column Privileges | `public alpha` | ✅ | diff --git a/apps/www/data/features.tsx b/apps/www/data/features.tsx index 144cd8c0788..99e690c7fac 100644 --- a/apps/www/data/features.tsx +++ b/apps/www/data/features.tsx @@ -413,7 +413,7 @@ Supabase Branching allows you to create and test changes in separate, temporary docsUrl: 'https://supabase.com/docs/guides/platform/branching', slug: 'branching', status: { - stage: PRODUCT_STAGES.GA, + stage: PRODUCT_STAGES.BETA, availableOnSelfHosted: false, }, }, @@ -683,7 +683,7 @@ This feature is particularly useful for teams looking to enhance their security docsUrl: 'https://supabase.com/docs/guides/database/vault', slug: 'vault', status: { - stage: PRODUCT_STAGES.PUBLIC_BETA, + stage: PRODUCT_STAGES.PUBLIC_ALPHA, availableOnSelfHosted: true, }, }, @@ -1236,7 +1236,7 @@ JWT Signing Keys provide modern, secure JWT management with the flexibility requ slug: 'jwt-signing-keys', status: { stage: PRODUCT_STAGES.GA, - availableOnSelfHosted: false, + availableOnSelfHosted: true, }, }, { @@ -1946,13 +1946,13 @@ Persistent Storage backed by S3 protocol survives invocations. Ephemeral Storage - Machine learning model storage ## Setup -Requires S3 credentials as environment variables: \`AWS_ACCESS_KEY_ID\`, \`AWS_SECRET_ACCESS_KEY\`, \`AWS_REGION\`, \`AWS_ENDPOINT_URL_S3\`. +Requires S3 credentials as environment variables: \`S3FS_ACCESS_KEY_ID\`, \`S3FS_SECRET_ACCESS_KEY\`, \`S3FS_REGION\`, \`S3FS_ENDPOINT_URL\`. Persistent Storage transforms Edge Functions into stateful, high-performance computing environments.`, icon: UploadCloud, products: [PRODUCT_SHORTNAMES.FUNCTIONS], heroImage: '', - docsUrl: 'https://supabase.com/docs/guides/storage', + docsUrl: 'https://supabase.com/docs/guides/functions/ephemeral-storage', slug: 'persistent-storage', status: { stage: PRODUCT_STAGES.GA, @@ -2881,7 +2881,7 @@ The MCP Server simplifies the integration of AI tools with Supabase, enabling a 2. Standardized tool ecosystem: MCP standardizes how tools interact with Supabase, enabling a plug-and-play experience for AI-powered workflows. 3. Streamlined workflows: Build faster by offloading repetitive tasks like schema design and configuration management to your AI assistant. 4. Extensive toolset: Access over 20 tools for database design, data querying, and project management. -5. Evolving capabilities: MCP continues to evolve, with upcoming support for native OAuth authentication, Edge Function deployment, and advanced schema discovery. +5. Evolving capabilities: MCP continues to evolve, with support for native OAuth authentication, Edge Function deployment, and advanced schema discovery. The MCP Server empowers developers to build AI-native applications, accelerating productivity and reducing the complexity of working across multiple tools. @@ -2916,11 +2916,11 @@ MCP is a standard that defines how AI tools and platforms communicate. It enable ### Do I need a personal access token (PAT) to use the MCP Server? -Yes, you'll need to create a PAT in your Supabase settings to authenticate the MCP Server. Future versions of MCP will support OAuth login flows for simpler authentication. +No, a PAT is no longer required. The MCP Server now uses OAuth by default via dynamic client registration, so your AI tool authenticates through a browser-based flow. A PAT is only needed for CI/CD or non-interactive scenarios. ### Can I use the MCP Server with self-hosted Supabase instances? -No, the official Supabase MCP Server connects directly to Supabase Cloud. For local instances, you can use the Postgres MCP Server instead. +Yes, self-hosted Supabase instances are supported. Follow the [self-hosted MCP guide](/docs/guides/self-hosting/enable-mcp) to configure secure access via SSH tunnel or VPN. ### Which AI tools are compatible with the MCP Server? From e8b5b565a9b45dc2480b1e892c552b24a9498c93 Mon Sep 17 00:00:00 2001 From: Danny White <3104761+dnywh@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:19:49 +1100 Subject: [PATCH 005/169] chore(design-system): centralise MCP client assets (#43730) ## What kind of change does this PR introduce? Chore ## What is the current behavior? - We use the MCP client connect dialog in two places: Studio and Docs - We duplicate image assets for each client in each of those two places ## What is the new behavior? - Centralised assets - Consolidation and simplification as a result of it all being a single source-of-truth now ## To test - [ ] Everything works as it did before across both Studio and [Docs](https://supabase.com/docs/guides/getting-started/mcp) - [ ] All MCP client images load as expected --- apps/docs/features/ui/McpConfigPanel.tsx | 1 - .../img/mcp-clients/antigravity-icon.svg | 98 ----------------- .../interfaces/Connect/McpTabContent.tsx | 2 - .../content/steps/mcp/cursor/content.tsx | 3 +- .../img/mcp-clients/antigravity-icon.svg | 98 ----------------- .../public/img/mcp-clients/claude-icon.svg | 3 - .../public/img/mcp-clients/cursor-icon.svg | 1 - .../img/mcp-clients/factory-icon-dark.svg | 8 -- .../public/img/mcp-clients/factory-icon.svg | 1 - .../img/mcp-clients/gemini-cli-icon.svg | 100 ------------------ .../img/mcp-clients/goose-icon-dark.svg | 1 - .../public/img/mcp-clients/goose-icon.svg | 1 - .../public/img/mcp-clients/kiro-icon.svg | 11 -- .../img/mcp-clients/openai-icon-dark.svg | 3 - .../public/img/mcp-clients/openai-icon.svg | 3 - .../img/mcp-clients/opencode-icon-dark.svg | 1 - .../public/img/mcp-clients/opencode-icon.svg | 1 - .../public/img/mcp-clients/vscode-icon.svg | 41 ------- .../img/mcp-clients/windsurf-icon-dark.svg | 3 - .../public/img/mcp-clients/windsurf-icon.svg | 3 - .../src/McpUrlBuilder/McpConfigPanel.tsx | 4 - .../McpUrlBuilder/assets/antigravity-icon.svg | 1 + .../src/McpUrlBuilder/assets}/claude-icon.svg | 0 .../src/McpUrlBuilder/assets}/cursor-icon.svg | 0 .../assets}/factory-icon-dark.svg | 0 .../McpUrlBuilder/assets}/factory-icon.svg | 0 .../McpUrlBuilder/assets}/gemini-cli-icon.svg | 0 .../McpUrlBuilder/assets}/goose-icon-dark.svg | 0 .../src/McpUrlBuilder/assets}/goose-icon.svg | 0 .../src/McpUrlBuilder/assets}/kiro-icon.svg | 0 .../assets}/openai-icon-dark.svg | 0 .../src/McpUrlBuilder/assets}/openai-icon.svg | 0 .../assets}/opencode-icon-dark.svg | 0 .../McpUrlBuilder/assets}/opencode-icon.svg | 0 .../src/McpUrlBuilder/assets}/vscode-icon.svg | 0 .../assets}/windsurf-icon-dark.svg | 0 .../McpUrlBuilder/assets}/windsurf-icon.svg | 0 .../components/ClientSelectDropdown.tsx | 6 -- .../components/ConnectionIcon.tsx | 6 -- .../components/McpConfigurationDisplay.tsx | 3 - .../McpUrlBuilder/utils/getMcpButtonData.ts | 4 - .../McpUrlBuilder/utils/getMcpIconSrc.test.ts | 50 +++++++++ .../src/McpUrlBuilder/utils/getMcpIconSrc.ts | 14 +-- .../src/McpUrlBuilder/utils/mcpIconAssets.ts | 52 +++++++++ packages/ui-patterns/src/types/assets.d.ts | 5 + 45 files changed, 114 insertions(+), 414 deletions(-) delete mode 100644 apps/docs/public/img/mcp-clients/antigravity-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/antigravity-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/claude-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/cursor-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/factory-icon-dark.svg delete mode 100644 apps/studio/public/img/mcp-clients/factory-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/gemini-cli-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/goose-icon-dark.svg delete mode 100644 apps/studio/public/img/mcp-clients/goose-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/kiro-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/openai-icon-dark.svg delete mode 100644 apps/studio/public/img/mcp-clients/openai-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/opencode-icon-dark.svg delete mode 100644 apps/studio/public/img/mcp-clients/opencode-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/vscode-icon.svg delete mode 100644 apps/studio/public/img/mcp-clients/windsurf-icon-dark.svg delete mode 100644 apps/studio/public/img/mcp-clients/windsurf-icon.svg create mode 100644 packages/ui-patterns/src/McpUrlBuilder/assets/antigravity-icon.svg rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/claude-icon.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/cursor-icon.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/factory-icon-dark.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/factory-icon.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/gemini-cli-icon.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/goose-icon-dark.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/goose-icon.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/kiro-icon.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/openai-icon-dark.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/openai-icon.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/opencode-icon-dark.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/opencode-icon.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/vscode-icon.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/windsurf-icon-dark.svg (100%) rename {apps/docs/public/img/mcp-clients => packages/ui-patterns/src/McpUrlBuilder/assets}/windsurf-icon.svg (100%) create mode 100644 packages/ui-patterns/src/McpUrlBuilder/utils/getMcpIconSrc.test.ts create mode 100644 packages/ui-patterns/src/McpUrlBuilder/utils/mcpIconAssets.ts diff --git a/apps/docs/features/ui/McpConfigPanel.tsx b/apps/docs/features/ui/McpConfigPanel.tsx index 3376cd953e3..e3d29032384 100644 --- a/apps/docs/features/ui/McpConfigPanel.tsx +++ b/apps/docs/features/ui/McpConfigPanel.tsx @@ -322,7 +322,6 @@ export function McpConfigPanel() { : 'Project selection is only available for the hosted platform.'}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/studio/components/interfaces/Connect/McpTabContent.tsx b/apps/studio/components/interfaces/Connect/McpTabContent.tsx index b41b54e03c2..f5b0fdd28e1 100644 --- a/apps/studio/components/interfaces/Connect/McpTabContent.tsx +++ b/apps/studio/components/interfaces/Connect/McpTabContent.tsx @@ -1,6 +1,5 @@ import { IS_PLATFORM, useParams } from 'common' import Panel from 'components/ui/Panel' -import { BASE_PATH } from 'lib/constants' import { useTrack } from 'lib/telemetry/track' import { useTheme } from 'next-themes' import { useMemo, useState } from 'react' @@ -64,7 +63,6 @@ const McpTabContentInnerLoaded = ({ return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/studio/public/img/mcp-clients/claude-icon.svg b/apps/studio/public/img/mcp-clients/claude-icon.svg deleted file mode 100644 index 7b9c0252ed7..00000000000 --- a/apps/studio/public/img/mcp-clients/claude-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/studio/public/img/mcp-clients/cursor-icon.svg b/apps/studio/public/img/mcp-clients/cursor-icon.svg deleted file mode 100644 index 48f85eb4d5a..00000000000 --- a/apps/studio/public/img/mcp-clients/cursor-icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/studio/public/img/mcp-clients/factory-icon-dark.svg b/apps/studio/public/img/mcp-clients/factory-icon-dark.svg deleted file mode 100644 index 16b99b68b64..00000000000 --- a/apps/studio/public/img/mcp-clients/factory-icon-dark.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/apps/studio/public/img/mcp-clients/factory-icon.svg b/apps/studio/public/img/mcp-clients/factory-icon.svg deleted file mode 100644 index 445aa4518c9..00000000000 --- a/apps/studio/public/img/mcp-clients/factory-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/studio/public/img/mcp-clients/gemini-cli-icon.svg b/apps/studio/public/img/mcp-clients/gemini-cli-icon.svg deleted file mode 100644 index 7e457a00a77..00000000000 --- a/apps/studio/public/img/mcp-clients/gemini-cli-icon.svg +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/studio/public/img/mcp-clients/goose-icon-dark.svg b/apps/studio/public/img/mcp-clients/goose-icon-dark.svg deleted file mode 100644 index e37b75328ed..00000000000 --- a/apps/studio/public/img/mcp-clients/goose-icon-dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/studio/public/img/mcp-clients/goose-icon.svg b/apps/studio/public/img/mcp-clients/goose-icon.svg deleted file mode 100644 index 1808de11575..00000000000 --- a/apps/studio/public/img/mcp-clients/goose-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/studio/public/img/mcp-clients/kiro-icon.svg b/apps/studio/public/img/mcp-clients/kiro-icon.svg deleted file mode 100644 index ef4abd2d85d..00000000000 --- a/apps/studio/public/img/mcp-clients/kiro-icon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/apps/studio/public/img/mcp-clients/openai-icon-dark.svg b/apps/studio/public/img/mcp-clients/openai-icon-dark.svg deleted file mode 100644 index 73c2f3fc76d..00000000000 --- a/apps/studio/public/img/mcp-clients/openai-icon-dark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/studio/public/img/mcp-clients/openai-icon.svg b/apps/studio/public/img/mcp-clients/openai-icon.svg deleted file mode 100644 index 316440a338d..00000000000 --- a/apps/studio/public/img/mcp-clients/openai-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/studio/public/img/mcp-clients/opencode-icon-dark.svg b/apps/studio/public/img/mcp-clients/opencode-icon-dark.svg deleted file mode 100644 index b79c7332e20..00000000000 --- a/apps/studio/public/img/mcp-clients/opencode-icon-dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/studio/public/img/mcp-clients/opencode-icon.svg b/apps/studio/public/img/mcp-clients/opencode-icon.svg deleted file mode 100644 index b79140a5070..00000000000 --- a/apps/studio/public/img/mcp-clients/opencode-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/studio/public/img/mcp-clients/vscode-icon.svg b/apps/studio/public/img/mcp-clients/vscode-icon.svg deleted file mode 100644 index c453e633f34..00000000000 --- a/apps/studio/public/img/mcp-clients/vscode-icon.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/studio/public/img/mcp-clients/windsurf-icon-dark.svg b/apps/studio/public/img/mcp-clients/windsurf-icon-dark.svg deleted file mode 100644 index 2e4e4e4921d..00000000000 --- a/apps/studio/public/img/mcp-clients/windsurf-icon-dark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/studio/public/img/mcp-clients/windsurf-icon.svg b/apps/studio/public/img/mcp-clients/windsurf-icon.svg deleted file mode 100644 index 386f8c035dc..00000000000 --- a/apps/studio/public/img/mcp-clients/windsurf-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx b/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx index 7ae5e4767aa..ed0c2193ba9 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx +++ b/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx @@ -12,7 +12,6 @@ import type { McpClient, McpOnCopyCallback } from './types' import { getMcpUrl } from './utils/getMcpUrl' export interface McpConfigPanelProps { - basePath: string baseUrl?: string projectRef?: string initialSelectedClient?: McpClient @@ -26,7 +25,6 @@ export interface McpConfigPanelProps { } export function McpConfigPanel({ - basePath, projectRef, initialSelectedClient, onClientSelect, @@ -109,7 +107,6 @@ export function McpConfigPanel({ clients={MCP_CLIENTS} selectedClient={selectedClient} onClientChange={handleClientChange} - basePath={basePath} theme={theme} />

@@ -124,7 +121,6 @@ export function McpConfigPanel({ diff --git a/apps/docs/public/img/mcp-clients/claude-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/claude-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/claude-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/claude-icon.svg diff --git a/apps/docs/public/img/mcp-clients/cursor-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/cursor-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/cursor-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/cursor-icon.svg diff --git a/apps/docs/public/img/mcp-clients/factory-icon-dark.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/factory-icon-dark.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/factory-icon-dark.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/factory-icon-dark.svg diff --git a/apps/docs/public/img/mcp-clients/factory-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/factory-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/factory-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/factory-icon.svg diff --git a/apps/docs/public/img/mcp-clients/gemini-cli-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/gemini-cli-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/gemini-cli-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/gemini-cli-icon.svg diff --git a/apps/docs/public/img/mcp-clients/goose-icon-dark.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/goose-icon-dark.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/goose-icon-dark.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/goose-icon-dark.svg diff --git a/apps/docs/public/img/mcp-clients/goose-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/goose-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/goose-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/goose-icon.svg diff --git a/apps/docs/public/img/mcp-clients/kiro-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/kiro-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/kiro-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/kiro-icon.svg diff --git a/apps/docs/public/img/mcp-clients/openai-icon-dark.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/openai-icon-dark.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/openai-icon-dark.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/openai-icon-dark.svg diff --git a/apps/docs/public/img/mcp-clients/openai-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/openai-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/openai-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/openai-icon.svg diff --git a/apps/docs/public/img/mcp-clients/opencode-icon-dark.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/opencode-icon-dark.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/opencode-icon-dark.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/opencode-icon-dark.svg diff --git a/apps/docs/public/img/mcp-clients/opencode-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/opencode-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/opencode-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/opencode-icon.svg diff --git a/apps/docs/public/img/mcp-clients/vscode-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/vscode-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/vscode-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/vscode-icon.svg diff --git a/apps/docs/public/img/mcp-clients/windsurf-icon-dark.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/windsurf-icon-dark.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/windsurf-icon-dark.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/windsurf-icon-dark.svg diff --git a/apps/docs/public/img/mcp-clients/windsurf-icon.svg b/packages/ui-patterns/src/McpUrlBuilder/assets/windsurf-icon.svg similarity index 100% rename from apps/docs/public/img/mcp-clients/windsurf-icon.svg rename to packages/ui-patterns/src/McpUrlBuilder/assets/windsurf-icon.svg diff --git a/packages/ui-patterns/src/McpUrlBuilder/components/ClientSelectDropdown.tsx b/packages/ui-patterns/src/McpUrlBuilder/components/ClientSelectDropdown.tsx index e4978036472..f11e0beaff1 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/components/ClientSelectDropdown.tsx +++ b/packages/ui-patterns/src/McpUrlBuilder/components/ClientSelectDropdown.tsx @@ -20,7 +20,6 @@ import type { McpClient } from '../types' import { ConnectionIcon } from './ConnectionIcon' interface ClientSelectDropdownProps { - basePath: string theme?: 'light' | 'dark' label?: string clients: McpClient[] @@ -29,7 +28,6 @@ interface ClientSelectDropdownProps { } export const ClientSelectDropdown = ({ - basePath, theme = 'light', label = 'Client', clients, @@ -64,8 +62,6 @@ export const ClientSelectDropdown = ({

{selectedClient?.icon ? ( {client.icon ? ( { const src = getMcpClientIconSrc({ - basePath, - iconFolder, icon: connection, useDarkVariant: theme === 'dark', hasDistinctDarkIcon, diff --git a/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx b/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx index 13aef8b1f79..7ef4e4bc0c5 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx +++ b/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx @@ -15,7 +15,6 @@ interface McpConfigurationDisplayProps { clientConfig: McpClientConfig className?: string theme?: 'light' | 'dark' - basePath: string onCopyCallback: (type?: McpOnCopyCallback) => void onInstallCallback?: () => void isPlatform?: boolean @@ -28,13 +27,11 @@ export function McpConfigurationDisplay({ clientConfig, className, theme = 'dark', - basePath, onCopyCallback, onInstallCallback, isPlatform, }: McpConfigurationDisplayProps) { const mcpButtonData = getMcpButtonData({ - basePath, theme, client: selectedClient, clientConfig, diff --git a/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpButtonData.ts b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpButtonData.ts index 415ccd23de2..b3e386c2883 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpButtonData.ts +++ b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpButtonData.ts @@ -2,7 +2,6 @@ import type { McpClient, McpClientConfig } from '../types' import { getMcpClientIconSrc } from './getMcpIconSrc' interface GetMcpButtonDataOptions { - basePath: string theme?: 'light' | 'dark' client: McpClient clientConfig: McpClientConfig @@ -10,7 +9,6 @@ interface GetMcpButtonDataOptions { } export function getMcpButtonData({ - basePath, theme, client, clientConfig, @@ -22,8 +20,6 @@ export function getMcpButtonData({ // If the theme is dark, the button background will be light and vice-versa const imageSrc = getMcpClientIconSrc({ - basePath, - iconFolder: 'mcp-clients', icon: client.icon!, useDarkVariant: theme === 'light', hasDistinctDarkIcon: client.hasDistinctDarkIcon, diff --git a/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpIconSrc.test.ts b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpIconSrc.test.ts new file mode 100644 index 00000000000..d5b2c9fbff7 --- /dev/null +++ b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpIconSrc.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from 'vitest' + +import { getMcpClientIconSrc } from './getMcpIconSrc' + +describe('getMcpClientIconSrc', () => { + it('returns the default icon when only one asset variant exists', () => { + const lightSrc = getMcpClientIconSrc({ + icon: 'cursor', + useDarkVariant: false, + }) + const darkSrc = getMcpClientIconSrc({ + icon: 'cursor', + useDarkVariant: true, + }) + + expect(lightSrc).toBeTruthy() + expect(darkSrc).toBe(lightSrc) + }) + + it('returns the dark icon when a distinct dark variant exists', () => { + const lightSrc = getMcpClientIconSrc({ + icon: 'openai', + useDarkVariant: false, + hasDistinctDarkIcon: true, + }) + const darkSrc = getMcpClientIconSrc({ + icon: 'openai', + useDarkVariant: true, + hasDistinctDarkIcon: true, + }) + + expect(darkSrc).toBeTruthy() + expect(darkSrc).not.toBe(lightSrc) + }) + + it('falls back to the default icon when no distinct dark variant should be used', () => { + const lightSrc = getMcpClientIconSrc({ + icon: 'factory', + useDarkVariant: false, + hasDistinctDarkIcon: true, + }) + const src = getMcpClientIconSrc({ + icon: 'factory', + useDarkVariant: true, + hasDistinctDarkIcon: false, + }) + + expect(src).toBe(lightSrc) + }) +}) diff --git a/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpIconSrc.ts b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpIconSrc.ts index bac98a6a6c1..45012cbcd52 100644 --- a/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpIconSrc.ts +++ b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpIconSrc.ts @@ -1,21 +1,17 @@ +import { getMcpClientIconAssetUrl } from './mcpIconAssets' + /** - * Returns the path to an MCP client icon. - * Light: {icon}-icon.svg, dark (when hasDistinctDarkIcon): {icon}-icon-dark.svg. - * Only uses the dark variant when useDarkVariant is true AND hasDistinctDarkIcon is set. + * Returns the URL to an imported MCP client icon asset. + * Dark variants are only used when the client has a distinct dark asset. */ export function getMcpClientIconSrc({ - basePath, - iconFolder, icon, useDarkVariant, hasDistinctDarkIcon, }: { - basePath: string - iconFolder: string icon: string useDarkVariant: boolean hasDistinctDarkIcon?: boolean }): string { - const suffix = useDarkVariant && hasDistinctDarkIcon ? '-dark' : '' - return `${basePath}/img/${iconFolder}/${icon.toLowerCase()}-icon${suffix}.svg` + return getMcpClientIconAssetUrl(icon, useDarkVariant && Boolean(hasDistinctDarkIcon)) } diff --git a/packages/ui-patterns/src/McpUrlBuilder/utils/mcpIconAssets.ts b/packages/ui-patterns/src/McpUrlBuilder/utils/mcpIconAssets.ts new file mode 100644 index 00000000000..9641d13370b --- /dev/null +++ b/packages/ui-patterns/src/McpUrlBuilder/utils/mcpIconAssets.ts @@ -0,0 +1,52 @@ +/// + +import antigravityIcon from '../assets/antigravity-icon.svg' +import claudeIcon from '../assets/claude-icon.svg' +import cursorIcon from '../assets/cursor-icon.svg' +import factoryDarkIcon from '../assets/factory-icon-dark.svg' +import factoryIcon from '../assets/factory-icon.svg' +import geminiCliIcon from '../assets/gemini-cli-icon.svg' +import gooseDarkIcon from '../assets/goose-icon-dark.svg' +import gooseIcon from '../assets/goose-icon.svg' +import kiroIcon from '../assets/kiro-icon.svg' +import openaiDarkIcon from '../assets/openai-icon-dark.svg' +import openaiIcon from '../assets/openai-icon.svg' +import opencodeDarkIcon from '../assets/opencode-icon-dark.svg' +import opencodeIcon from '../assets/opencode-icon.svg' +import vscodeIcon from '../assets/vscode-icon.svg' +import windsurfDarkIcon from '../assets/windsurf-icon-dark.svg' +import windsurfIcon from '../assets/windsurf-icon.svg' + +type ImportedAssetModule = string | { src: string } + +type McpClientIconAsset = { + light: ImportedAssetModule + dark: ImportedAssetModule +} + +const MCP_CLIENT_ICON_ASSETS = { + antigravity: { light: antigravityIcon, dark: antigravityIcon }, + claude: { light: claudeIcon, dark: claudeIcon }, + cursor: { light: cursorIcon, dark: cursorIcon }, + factory: { light: factoryIcon, dark: factoryDarkIcon }, + 'gemini-cli': { light: geminiCliIcon, dark: geminiCliIcon }, + goose: { light: gooseIcon, dark: gooseDarkIcon }, + kiro: { light: kiroIcon, dark: kiroIcon }, + openai: { light: openaiIcon, dark: openaiDarkIcon }, + opencode: { light: opencodeIcon, dark: opencodeDarkIcon }, + vscode: { light: vscodeIcon, dark: vscodeIcon }, + windsurf: { light: windsurfIcon, dark: windsurfDarkIcon }, +} satisfies Record + +export type McpClientIconName = keyof typeof MCP_CLIENT_ICON_ASSETS + +function normalizeAssetUrl(asset: ImportedAssetModule): string { + return typeof asset === 'string' ? asset : asset.src +} + +export function getMcpClientIconAssetUrl(icon: string, useDarkVariant: boolean): string { + const iconAssets = MCP_CLIENT_ICON_ASSETS[icon.toLowerCase() as McpClientIconName] + if (!iconAssets) return '' + + return normalizeAssetUrl(useDarkVariant ? iconAssets.dark : iconAssets.light) +} diff --git a/packages/ui-patterns/src/types/assets.d.ts b/packages/ui-patterns/src/types/assets.d.ts index a4a9b8157f7..adb1bc31dbb 100644 --- a/packages/ui-patterns/src/types/assets.d.ts +++ b/packages/ui-patterns/src/types/assets.d.ts @@ -2,3 +2,8 @@ declare module '*.css' { export const styles: Record export default styles } + +declare module '*.svg' { + const content: any + export default content +} From 7d1b38f80466108998a6ae9d50d7499976158265 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 17 Mar 2026 08:55:39 +0700 Subject: [PATCH 006/169] Float up error code from status page into incident-status endpoint (#43737) ## Context Just a nit change to float the status code from status page API into incident-status endpoint so its clearer what the error is from the network tab --------- Co-authored-by: Charis Lam <26616127+charislam@users.noreply.github.com> --- .../data/platform/incident-status-query.ts | 34 ++++++++++++++----- apps/studio/lib/api/incident-status.ts | 2 ++ apps/studio/pages/api/incident-status.ts | 18 +++++----- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/apps/studio/data/platform/incident-status-query.ts b/apps/studio/data/platform/incident-status-query.ts index 60cec0fd8d6..3c5ce76b8dd 100644 --- a/apps/studio/data/platform/incident-status-query.ts +++ b/apps/studio/data/platform/incident-status-query.ts @@ -2,7 +2,7 @@ import { useQuery } from '@tanstack/react-query' import type { IncidentInfo } from 'lib/api/incident-status' import { BASE_PATH, IS_PLATFORM, IS_TEST_ENV } from 'lib/constants' import { partition } from 'lodash' -import { UseCustomQueryOptions } from 'types' +import { ResponseError, UseCustomQueryOptions } from 'types' import { platformKeys } from './keys' @@ -21,7 +21,20 @@ export async function getIncidentStatus( if (!response.ok) { const errorText = await response.text() console.error('[getIncidentStatus] Failed:', response.status, errorText) - throw new Error(`Failed to fetch incident status: ${response.statusText}`) + + let retryAfter: number | undefined + const retryAfterHeader = response.headers.get('Retry-After') + if (retryAfterHeader !== null) { + const parsed = Number(retryAfterHeader) + if (Number.isFinite(parsed) && parsed > 0) retryAfter = parsed + } + + throw new ResponseError( + `Failed to fetch incident status: ${response.statusText}`, + response.status, + undefined, + retryAfter + ) } const data = await response.json() @@ -37,16 +50,21 @@ export type IncidentStatusError = unknown export const useIncidentStatusQuery = ( options: UseCustomQueryOptions = {} -) => - useQuery({ +) => { + return useQuery({ queryKey: platformKeys.incidentStatus(), queryFn: ({ signal }) => getIncidentStatus(signal), refetchOnWindowFocus: false, - // exponential backoff retry starting at 4s, 16s, 64s, 256s etc. Hard capped at 5 minutes to prevent excessively - // long retry delays. - retryDelay: (attemptIndex) => Math.min(1000 * 4 ** attemptIndex, 1000 * 60 * 5), - staleTime: 1000 * 60 * 5, // 5 minutes to match API cache + // Use longer exponential backoff than the QueryClient default (base 4, cap 5 min vs base 2, cap 30s). + // The retryAfter header case is also handled here for consistency with query-client.ts. + retryDelay: (attemptIndex, error) => { + if (error instanceof ResponseError && error.retryAfter) { + return error.retryAfter * 1000 + } + return Math.min(1000 * 4 ** attemptIndex, 1000 * 60 * 5) + }, ...options, // Enable in platform mode, or in test environment for E2E testing enabled: (IS_PLATFORM || IS_TEST_ENV) && (options.enabled ?? true), }) +} diff --git a/apps/studio/lib/api/incident-status.ts b/apps/studio/lib/api/incident-status.ts index f1c3192e1e9..0ea751dcae9 100644 --- a/apps/studio/lib/api/incident-status.ts +++ b/apps/studio/lib/api/incident-status.ts @@ -87,9 +87,11 @@ export async function getActiveIncidents(): Promise { const responseText = await response.text() if (!response.ok) { + const retryAfter = response.headers.get('Retry-After') ?? undefined throw new InternalServerError(`StatusPage API responded with ${response.status}`, { status: response.status, body: responseText, + ...(retryAfter !== undefined && { retryAfter }), }) } diff --git a/apps/studio/pages/api/incident-status.ts b/apps/studio/pages/api/incident-status.ts index 43b38a9e280..ded8eb02d98 100644 --- a/apps/studio/pages/api/incident-status.ts +++ b/apps/studio/pages/api/incident-status.ts @@ -2,19 +2,14 @@ import { IS_PLATFORM } from 'common' import { NextApiRequest, NextApiResponse } from 'next' import { InternalServerError } from '@/lib/api/apiHelpers' -import { - getActiveIncidents, - type IncidentCache, - type IncidentInfo, -} from '@/lib/api/incident-status' +import { getActiveIncidents, type IncidentCache } from '@/lib/api/incident-status' import { createAdminClient } from '@/lib/api/supabase-admin' /** - * Cache on browser for 5 minutes * Cache on CDN for 5 minutes * Allow serving stale content for 1 minute while revalidating */ -const CACHE_CONTROL_SETTINGS = 'public, max-age=300, s-maxage=300, stale-while-revalidate=60' +const CACHE_CONTROL_SETTINGS = 'public, s-maxage=300, stale-while-revalidate=60' async function fetchIncidentCache(incidentIds: Array): Promise> { const cacheMap = new Map() @@ -84,7 +79,14 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { return res.status(200).json(enrichedIncidents) } catch (error) { + let errorCode = 500 + if (error instanceof InternalServerError) { + if (typeof error.details?.status === 'number') errorCode = error.details.status + if (errorCode === 420) errorCode = 429 + if (errorCode === 429 && typeof error.details?.retryAfter === 'string') { + res.setHeader('Retry-After', error.details.retryAfter) + } console.error('Failed to fetch active StatusPage incidents: %O', { message: error.message, details: error.details, @@ -93,7 +95,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { console.error('Unexpected error fetching active StatusPage incidents: %O', error) } - return res.status(500).json({ error: 'Unable to fetch incidents at this time' }) + return res.status(errorCode).json({ error: 'Unable to fetch incidents at this time' }) } } From d49da8951737f7447a977b9e2d3585d30ff09f25 Mon Sep 17 00:00:00 2001 From: Stephen Morgan Date: Tue, 17 Mar 2026 19:34:40 +1300 Subject: [PATCH 007/169] feat: update to DPA Q1 2026 (#43843) Only one change to this DPA in the addition of Braintrust as a sub-processor Fixes SEC-757 --- .../interfaces/Organization/Documents/DPA.tsx | 2 +- apps/www/pages/legal/dpa.tsx | 2 +- .../downloads/docs/Supabase+DPA+260317.pdf | Bin 0 -> 288601 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 apps/www/public/downloads/docs/Supabase+DPA+260317.pdf diff --git a/apps/studio/components/interfaces/Organization/Documents/DPA.tsx b/apps/studio/components/interfaces/Organization/Documents/DPA.tsx index 0f103df312e..48819de15bb 100644 --- a/apps/studio/components/interfaces/Organization/Documents/DPA.tsx +++ b/apps/studio/components/interfaces/Organization/Documents/DPA.tsx @@ -48,7 +48,7 @@ export const DPA = () => {

You can review a static PDF version of our latest DPA document{' '} sendEvent({ action: 'dpa_pdf_opened', diff --git a/apps/www/pages/legal/dpa.tsx b/apps/www/pages/legal/dpa.tsx index 68e6a2466ce..0898360591f 100644 --- a/apps/www/pages/legal/dpa.tsx +++ b/apps/www/pages/legal/dpa.tsx @@ -19,7 +19,7 @@ const DPA = () => { part of this commitment, we have prepared a Data Processing Addendum ("DPA"). You can review a static PDF version of our latest DPA document{' '} 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

B!>-e+#cb$&I@cpylTI;!bCiU;rU| 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 AhyVZp literal 0 HcmV?d00001 From 89895a7286c08f4a2bd1fe552396d3c7d0bf77cb Mon Sep 17 00:00:00 2001 From: Danny White <3104761+dnywh@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:47:25 +1100 Subject: [PATCH 008/169] chore(studio): file explorer rows (#43845) ## What kind of change does this PR introduce? UI touch-up ## What is the current behavior? Explorer rows in file storage is a bit rough around the edges. ## What is the new behavior? - Consistent loaders - Consistent icons Also includes: - Fix to `stroke-width` on files-bucket.svg as documented in icons.mdx | Before | After | | --- | --- | | Buckets Storage AWS Healthy
Toolshed Supabase | Buckets Storage AWS Healthy
Toolshed Supabase | --- apps/design-system/content/docs/icons.mdx | 6 +- .../StorageExplorer/FileExplorerHeader.tsx | 6 +- .../StorageExplorer/FileExplorerRow.tsx | 76 +++++++++---------- .../Storage/StorageExplorer/PreviewPane.tsx | 10 +-- apps/studio/public/img/bucket-filled.svg | 15 ---- apps/studio/public/img/folder-filled.svg | 12 --- packages/icons/__registry__/index.tsx | 4 +- packages/icons/src/icons/files-bucket.ts | 10 +-- packages/icons/src/raw-icons/files-bucket.svg | 6 +- 9 files changed, 56 insertions(+), 89 deletions(-) delete mode 100644 apps/studio/public/img/bucket-filled.svg delete mode 100644 apps/studio/public/img/folder-filled.svg diff --git a/apps/design-system/content/docs/icons.mdx b/apps/design-system/content/docs/icons.mdx index f50082c5255..eefdbb97749 100644 --- a/apps/design-system/content/docs/icons.mdx +++ b/apps/design-system/content/docs/icons.mdx @@ -45,7 +45,7 @@ function app() { } ``` -**Default props**: All icons default to `size={24}`. Stroke and fill defaults come from the source SVG's root attributes (e.g. `stroke-width="1"` in the source becomes the component's default `strokeWidth`). Override these props as needed for your use case. +**Default props**: All icons default to `size={24}`. Stroke and fill defaults come from the source SVG's root attributes (e.g. `stroke-width="1"` on the root `` becomes the component's default `strokeWidth`). You can override those defaults at the call site, but any `stroke`, `fill`, or `stroke-width` set on individual child paths will still win. ### Adding new custom icons @@ -63,7 +63,7 @@ Follow these steps to add a new custom icon to the Supabase icon library. For **fill-only icons** (e.g. logos that use shapes instead of strokes), add `stroke="none"` to the root `` element. The build will propagate this so the component never renders an unwanted stroke. -Leave attributes like `stroke-width` as they are. The root SVG's `fill`, `stroke`, `stroke-width`, `stroke-linecap`, and `stroke-linejoin` attributes are automatically propagated as the component's defaults by the build process. The conversion to camel-case for React compatibility (e.g. `strokeWidth`) is also handled automatically. +Prefer putting shared styling like `fill`, `stroke`, `stroke-width`, `stroke-linecap`, and `stroke-linejoin` on the root ``. The build propagates those root attributes as the component's defaults, and also converts them to camel-case for React compatibility (e.g. `strokeWidth`). If you put those attributes on individual child paths instead, they become fixed path-level styling and will override props passed to the component. 2. **Build the component**: Run `npm run build:icons` from inside the `packages/icons` directory @@ -133,4 +133,4 @@ Note `stroke="none"` on the root to prevent unwanted strokes, and `fill="current ### Troubleshooting -If your SVG specifies `stroke-width` attributes, they will override the component's `strokeWidth` prop. Remove stroke attributes from individual paths to let the component control them. +If your SVG specifies `stroke-width` attributes on individual child paths, they will override the component's `strokeWidth` prop. Keep shared stroke attributes on the root `` and remove them from individual paths if you want consumers to control stroke weight. diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx index cca26003006..f8d5cce061b 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx @@ -12,7 +12,7 @@ import { Edit2, FolderPlus, List, - Loader, + LoaderCircle, RefreshCw, Search, Upload, @@ -61,7 +61,7 @@ const HeaderPathEdit = ({ loading, isSearching, breadcrumbs, togglePathEdit }: a > {loading.isLoading ? (
- +

{loading.message}

) : ( @@ -113,7 +113,7 @@ const HeaderBreadcrumbs = ({ return loading.isLoading ? (
- +

{loading.message}

) : ( diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx index a65afc9403b..79e9362c414 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx @@ -1,4 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' +import { FilesBucket as FilesBucketIcon } from 'icons' +import { formatBytes } from 'lib/helpers' import { find, isEmpty, isEqual } from 'lodash' import { AlertCircle, @@ -7,20 +10,16 @@ import { Edit, File, Film, + FolderOpen, Image, - Loader, + LoaderCircle, MoreVertical, Move, Music, Trash2, } from 'lucide-react' -import { useContextMenu } from 'react-contexify' -import SVG from 'react-inlinesvg' - -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { BASE_PATH } from 'lib/constants' -import { formatBytes } from 'lib/helpers' import type { CSSProperties } from 'react' +import { useContextMenu } from 'react-contexify' import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { Checkbox, @@ -38,6 +37,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' + import { CONTEXT_MENU_KEYS, STORAGE_ROW_STATUS, @@ -54,47 +54,42 @@ export const RowIcon = ({ view, status, fileType, + isOpened = false, mimeType, }: { view: STORAGE_VIEWS status: STORAGE_ROW_STATUS fileType: string + isOpened?: boolean mimeType: string | undefined }) => { if (view === STORAGE_VIEWS.LIST && status === STORAGE_ROW_STATUS.LOADING) { - return + return ( + + ) } - if (fileType === STORAGE_ROW_TYPES.BUCKET || fileType === STORAGE_ROW_TYPES.FOLDER) { - const iconSrc = - fileType === STORAGE_ROW_TYPES.BUCKET - ? `${BASE_PATH}/img/bucket-filled.svg` - : fileType === STORAGE_ROW_TYPES.FOLDER - ? `${BASE_PATH}/img/folder-filled.svg` - : `${BASE_PATH}/img/file-filled.svg` - return ( - - code.replace(/svg/, 'svg class="w-4 h-4 text-color-inherit opacity-75"') - } - /> + if (fileType === STORAGE_ROW_TYPES.FOLDER) { + return isOpened ? ( + + ) : ( + ) } if (mimeType?.includes('image')) { - return + return } if (mimeType?.includes('audio')) { - return + return } if (mimeType?.includes('video')) { - return + return } - return + return } interface FileExplorerRowProps { @@ -173,19 +168,19 @@ export const FileExplorerRow = ({ ? [ { name: 'Rename', - icon: , + icon: , onClick: () => setSelectedItemToRename(itemWithColumnIndex), }, ] : []), { name: 'Download', - icon: , + icon: , onClick: () => downloadFolder(itemWithColumnIndex), }, { name: 'Copy path to folder', - icon: , + icon: , onClick: () => copyPathToFolder(openedFolders, itemWithColumnIndex), }, ...(canUpdateFiles @@ -193,7 +188,7 @@ export const FileExplorerRow = ({ { name: 'Separator', icon: undefined, onClick: undefined }, { name: 'Delete', - icon: , + icon: , onClick: () => setSelectedItemsToDelete([itemWithColumnIndex]), }, ] @@ -206,14 +201,14 @@ export const FileExplorerRow = ({ ? [ { name: 'Get URL', - icon: , + icon: , onClick: () => onCopyUrl(itemWithColumnIndex.name), }, ] : [ { name: 'Get URL', - icon: , + icon: , children: [ { name: 'Expire in 1 week', @@ -239,19 +234,19 @@ export const FileExplorerRow = ({ ]), { name: 'Download', - icon: , + icon: , onClick: () => downloadFile(itemWithColumnIndex), }, ...(canUpdateFiles ? [ { name: 'Rename', - icon: , + icon: , onClick: () => setSelectedItemToRename(itemWithColumnIndex), }, { name: 'Move', - icon: , + icon: , onClick: () => setSelectedItemsToMove([itemWithColumnIndex]), }, { name: 'Separator', icon: undefined, onClick: undefined }, @@ -263,7 +258,7 @@ export const FileExplorerRow = ({ ? [ { name: 'Delete', - icon: , + icon: , onClick: () => setSelectedItemsToDelete([itemWithColumnIndex]), }, ] @@ -324,7 +319,7 @@ export const FileExplorerRow = ({ event.stopPropagation() event.preventDefault() if (item.status !== STORAGE_ROW_STATUS.LOADING && !isOpened && !isPreviewed) { - item.type === STORAGE_ROW_TYPES.FOLDER || item.type === STORAGE_ROW_TYPES.BUCKET + item.type === STORAGE_ROW_TYPES.FOLDER ? openFolder(columnIndex, item) : onSelectFile(columnIndex) } @@ -348,6 +343,7 @@ export const FileExplorerRow = ({ view={view} status={item.status} fileType={item.type} + isOpened={isOpened} mimeType={item.metadata?.mimetype} />
@@ -398,9 +394,9 @@ export const FileExplorerRow = ({ } > {item.status === STORAGE_ROW_STATUS.LOADING ? ( - ) : ( diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx index a57c4562384..68176cc020b 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx @@ -1,13 +1,12 @@ import { Transition } from '@headlessui/react' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { isEmpty } from 'lodash' -import { AlertCircle, ChevronDown, Copy, Download, Loader, Trash2, X } from 'lucide-react' -import SVG from 'react-inlinesvg' - import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { BASE_PATH } from 'lib/constants' import { formatBytes } from 'lib/helpers' +import { isEmpty } from 'lodash' +import { AlertCircle, ChevronDown, Copy, Download, LoaderCircle, Trash2, X } from 'lucide-react' +import SVG from 'react-inlinesvg' import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { Button, @@ -16,6 +15,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from 'ui' + import { URL_EXPIRY_DURATION } from '../Storage.constants' import { StorageItem } from '../Storage.types' import { useCopyUrl } from './useCopyUrl' @@ -41,7 +41,7 @@ const PreviewFile = ({ item }: { item: StorageItem }) => { if (isLoading) { return (
- +
) } diff --git a/apps/studio/public/img/bucket-filled.svg b/apps/studio/public/img/bucket-filled.svg deleted file mode 100644 index abf6ea5e043..00000000000 --- a/apps/studio/public/img/bucket-filled.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - Group 6 - Created with Sketch. - - - - - - - - - - \ No newline at end of file diff --git a/apps/studio/public/img/folder-filled.svg b/apps/studio/public/img/folder-filled.svg deleted file mode 100644 index e179aebbd01..00000000000 --- a/apps/studio/public/img/folder-filled.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - Group 5 - Created with Sketch. - - - - - - - \ No newline at end of file diff --git a/packages/icons/__registry__/index.tsx b/packages/icons/__registry__/index.tsx index a64698d95c3..6a1b1713733 100644 --- a/packages/icons/__registry__/index.tsx +++ b/packages/icons/__registry__/index.tsx @@ -148,10 +148,10 @@ export const Index: Record = [ name: "files-bucket", componentName: "FilesBucket", deprecated: false, - raw: "import createSupabaseIcon from '../createSupabaseIcon';\n\n/**\n * @component @name FilesBucket\n * @description Supabase SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMy45OTk4OCAyMEgxOS45OTk5QzIwLjUzMDMgMjAgMjEuMDM5IDE5Ljc4OTMgMjEuNDE0MSAxOS40MTQyQzIxLjc4OTIgMTkuMDM5MSAyMS45OTk5IDE4LjUzMDQgMjEuOTk5OSAxOFY4QzIxLjk5OTkgNy40Njk1NyAyMS43ODkyIDYuOTYwODYgMjEuNDE0MSA2LjU4NTc5QzIxLjAzOSA2LjIxMDcxIDIwLjUzMDMgNiAxOS45OTk5IDZIMTIuMDY5OUMxMS43NDA1IDUuOTk4MyAxMS40MTY2IDUuOTE1MjUgMTEuMTI3IDUuNzU4MjRDMTAuODM3NCA1LjYwMTIzIDEwLjU5MTEgNS4zNzUxMiAxMC40MDk5IDUuMUw5LjU4OTg4IDMuOUM5LjQwODcgMy42MjQ4OCA5LjE2MjM3IDMuMzk4NzcgOC44NzI3OCAzLjI0MTc2QzguNTgzMTkgMy4wODQ3NSA4LjI1OTI5IDMuMDAxNyA3LjkyOTg4IDNIMy45OTk4OEMzLjQ2OTQ0IDMgMi45NjA3NCAzLjIxMDcxIDIuNTg1NjYgMy41ODU3OUMyLjIxMDU5IDMuOTYwODYgMS45OTk4OCA0LjQ2OTU3IDEuOTk5ODggNVYxOEMxLjk5OTg4IDE5LjEgMi44OTk4OCAyMCAzLjk5OTg4IDIwWiIgc3Ryb2tlPSIjMDAwIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogMnB4IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik01IDEwLjVIMTkiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo=)\n *\n * @param {Object} props - Supabase icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FilesBucket = createSupabaseIcon(\n 'FilesBucket',\n [\n [\n 'path',\n {\n d: 'M3.99988 20H19.9999C20.5303 20 21.039 19.7893 21.4141 19.4142C21.7892 19.0391 21.9999 18.5304 21.9999 18V8C21.9999 7.46957 21.7892 6.96086 21.4141 6.58579C21.039 6.21071 20.5303 6 19.9999 6H12.0699C11.7405 5.9983 11.4166 5.91525 11.127 5.75824C10.8374 5.60123 10.5911 5.37512 10.4099 5.1L9.58988 3.9C9.4087 3.62488 9.16237 3.39877 8.87278 3.24176C8.58319 3.08475 8.25929 3.0017 7.92988 3H3.99988C3.46944 3 2.96074 3.21071 2.58566 3.58579C2.21059 3.96086 1.99988 4.46957 1.99988 5V18C1.99988 19.1 2.89988 20 3.99988 20Z',\n stroke: 'currentColor',\n 'stroke-width': '1.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n key: 'o4u44y',\n },\n ],\n [\n 'path',\n {\n d: 'M5 10.5H19',\n stroke: 'currentColor',\n 'stroke-width': '1.5',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n key: 'cf9ou5',\n },\n ],\n ],\n { fill: 'none' },\n);\n\nexport default FilesBucket;\n", + raw: "import createSupabaseIcon from '../createSupabaseIcon';\n\n/**\n * @component @name FilesBucket\n * @description Supabase SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTMuOTk5ODggMjBIMTkuOTk5OUMyMC41MzAzIDIwIDIxLjAzOSAxOS43ODkzIDIxLjQxNDEgMTkuNDE0MkMyMS43ODkyIDE5LjAzOTEgMjEuOTk5OSAxOC41MzA0IDIxLjk5OTkgMThWOEMyMS45OTk5IDcuNDY5NTcgMjEuNzg5MiA2Ljk2MDg2IDIxLjQxNDEgNi41ODU3OUMyMS4wMzkgNi4yMTA3MSAyMC41MzAzIDYgMTkuOTk5OSA2SDEyLjA2OTlDMTEuNzQwNSA1Ljk5ODMgMTEuNDE2NiA1LjkxNTI1IDExLjEyNyA1Ljc1ODI0QzEwLjgzNzQgNS42MDEyMyAxMC41OTExIDUuMzc1MTIgMTAuNDA5OSA1LjFMOS41ODk4OCAzLjlDOS40MDg3IDMuNjI0ODggOS4xNjIzNyAzLjM5ODc3IDguODcyNzggMy4yNDE3NkM4LjU4MzE5IDMuMDg0NzUgOC4yNTkyOSAzLjAwMTcgNy45Mjk4OCAzSDMuOTk5ODhDMy40Njk0NCAzIDIuOTYwNzQgMy4yMTA3MSAyLjU4NTY2IDMuNTg1NzlDMi4yMTA1OSAzLjk2MDg2IDEuOTk5ODggNC40Njk1NyAxLjk5OTg4IDVWMThDMS45OTk4OCAxOS4xIDIuODk5ODggMjAgMy45OTk4OCAyMFoiIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik01IDEwLjVIMTkiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+Cg==)\n *\n * @param {Object} props - Supabase icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FilesBucket = createSupabaseIcon(\n 'FilesBucket',\n [\n [\n 'path',\n {\n d: 'M3.99988 20H19.9999C20.5303 20 21.039 19.7893 21.4141 19.4142C21.7892 19.0391 21.9999 18.5304 21.9999 18V8C21.9999 7.46957 21.7892 6.96086 21.4141 6.58579C21.039 6.21071 20.5303 6 19.9999 6H12.0699C11.7405 5.9983 11.4166 5.91525 11.127 5.75824C10.8374 5.60123 10.5911 5.37512 10.4099 5.1L9.58988 3.9C9.4087 3.62488 9.16237 3.39877 8.87278 3.24176C8.58319 3.08475 8.25929 3.0017 7.92988 3H3.99988C3.46944 3 2.96074 3.21071 2.58566 3.58579C2.21059 3.96086 1.99988 4.46957 1.99988 5V18C1.99988 19.1 2.89988 20 3.99988 20Z',\n stroke: 'currentColor',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n key: '1i7att',\n },\n ],\n [\n 'path',\n {\n d: 'M5 10.5H19',\n stroke: 'currentColor',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n key: 'ys6uda',\n },\n ],\n ],\n { fill: 'none', strokeWidth: '1.5' },\n);\n\nexport default FilesBucket;\n", component: React.lazy(() => import('icons/src/icons/files-bucket')), import: "import { FilesBucket } from 'icons'", - svg: "\n\n\n\n", + svg: "\n\n\n\n", jsx: "import { FilesBucket } from \"icons\"\n \n " }, { diff --git a/packages/icons/src/icons/files-bucket.ts b/packages/icons/src/icons/files-bucket.ts index dcfc647247f..2d352e4a450 100644 --- a/packages/icons/src/icons/files-bucket.ts +++ b/packages/icons/src/icons/files-bucket.ts @@ -4,7 +4,7 @@ import createSupabaseIcon from '../createSupabaseIcon'; * @component @name FilesBucket * @description Supabase SVG icon component, renders SVG Element with children. * - * @preview ![img](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMy45OTk4OCAyMEgxOS45OTk5QzIwLjUzMDMgMjAgMjEuMDM5IDE5Ljc4OTMgMjEuNDE0MSAxOS40MTQyQzIxLjc4OTIgMTkuMDM5MSAyMS45OTk5IDE4LjUzMDQgMjEuOTk5OSAxOFY4QzIxLjk5OTkgNy40Njk1NyAyMS43ODkyIDYuOTYwODYgMjEuNDE0MSA2LjU4NTc5QzIxLjAzOSA2LjIxMDcxIDIwLjUzMDMgNiAxOS45OTk5IDZIMTIuMDY5OUMxMS43NDA1IDUuOTk4MyAxMS40MTY2IDUuOTE1MjUgMTEuMTI3IDUuNzU4MjRDMTAuODM3NCA1LjYwMTIzIDEwLjU5MTEgNS4zNzUxMiAxMC40MDk5IDUuMUw5LjU4OTg4IDMuOUM5LjQwODcgMy42MjQ4OCA5LjE2MjM3IDMuMzk4NzcgOC44NzI3OCAzLjI0MTc2QzguNTgzMTkgMy4wODQ3NSA4LjI1OTI5IDMuMDAxNyA3LjkyOTg4IDNIMy45OTk4OEMzLjQ2OTQ0IDMgMi45NjA3NCAzLjIxMDcxIDIuNTg1NjYgMy41ODU3OUMyLjIxMDU5IDMuOTYwODYgMS45OTk4OCA0LjQ2OTU3IDEuOTk5ODggNVYxOEMxLjk5OTg4IDE5LjEgMi44OTk4OCAyMCAzLjk5OTg4IDIwWiIgc3Ryb2tlPSIjMDAwIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogMnB4IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik01IDEwLjVIMTkiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo=) + * @preview ![img](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTMuOTk5ODggMjBIMTkuOTk5OUMyMC41MzAzIDIwIDIxLjAzOSAxOS43ODkzIDIxLjQxNDEgMTkuNDE0MkMyMS43ODkyIDE5LjAzOTEgMjEuOTk5OSAxOC41MzA0IDIxLjk5OTkgMThWOEMyMS45OTk5IDcuNDY5NTcgMjEuNzg5MiA2Ljk2MDg2IDIxLjQxNDEgNi41ODU3OUMyMS4wMzkgNi4yMTA3MSAyMC41MzAzIDYgMTkuOTk5OSA2SDEyLjA2OTlDMTEuNzQwNSA1Ljk5ODMgMTEuNDE2NiA1LjkxNTI1IDExLjEyNyA1Ljc1ODI0QzEwLjgzNzQgNS42MDEyMyAxMC41OTExIDUuMzc1MTIgMTAuNDA5OSA1LjFMOS41ODk4OCAzLjlDOS40MDg3IDMuNjI0ODggOS4xNjIzNyAzLjM5ODc3IDguODcyNzggMy4yNDE3NkM4LjU4MzE5IDMuMDg0NzUgOC4yNTkyOSAzLjAwMTcgNy45Mjk4OCAzSDMuOTk5ODhDMy40Njk0NCAzIDIuOTYwNzQgMy4yMTA3MSAyLjU4NTY2IDMuNTg1NzlDMi4yMTA1OSAzLjk2MDg2IDEuOTk5ODggNC40Njk1NyAxLjk5OTg4IDVWMThDMS45OTk4OCAxOS4xIDIuODk5ODggMjAgMy45OTk4OCAyMFoiIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik01IDEwLjVIMTkiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+Cg==) * * @param {Object} props - Supabase icons props and any valid SVG attribute * @returns {JSX.Element} JSX Element @@ -18,10 +18,9 @@ const FilesBucket = createSupabaseIcon( { d: 'M3.99988 20H19.9999C20.5303 20 21.039 19.7893 21.4141 19.4142C21.7892 19.0391 21.9999 18.5304 21.9999 18V8C21.9999 7.46957 21.7892 6.96086 21.4141 6.58579C21.039 6.21071 20.5303 6 19.9999 6H12.0699C11.7405 5.9983 11.4166 5.91525 11.127 5.75824C10.8374 5.60123 10.5911 5.37512 10.4099 5.1L9.58988 3.9C9.4087 3.62488 9.16237 3.39877 8.87278 3.24176C8.58319 3.08475 8.25929 3.0017 7.92988 3H3.99988C3.46944 3 2.96074 3.21071 2.58566 3.58579C2.21059 3.96086 1.99988 4.46957 1.99988 5V18C1.99988 19.1 2.89988 20 3.99988 20Z', stroke: 'currentColor', - 'stroke-width': '1.5', 'stroke-linecap': 'round', 'stroke-linejoin': 'round', - key: 'o4u44y', + key: '1i7att', }, ], [ @@ -29,14 +28,13 @@ const FilesBucket = createSupabaseIcon( { d: 'M5 10.5H19', stroke: 'currentColor', - 'stroke-width': '1.5', 'stroke-linecap': 'round', 'stroke-linejoin': 'round', - key: 'cf9ou5', + key: 'ys6uda', }, ], ], - { fill: 'none' }, + { fill: 'none', strokeWidth: '1.5' }, ); export default FilesBucket; diff --git a/packages/icons/src/raw-icons/files-bucket.svg b/packages/icons/src/raw-icons/files-bucket.svg index 2014992f8eb..909f237781f 100644 --- a/packages/icons/src/raw-icons/files-bucket.svg +++ b/packages/icons/src/raw-icons/files-bucket.svg @@ -1,4 +1,4 @@ - - - + + + From 62426253c3fa1dc80951e78ee030270e9dec5000 Mon Sep 17 00:00:00 2001 From: Pedro Rodrigues <44656907+Rodriguespn@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:48:34 +0000 Subject: [PATCH 009/169] fix: pass exposedSchemas to getLints in MCP advisor operations (#43790) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - MCP `getSecurityAdvisors` and `getPerformanceAdvisors` now pass `exposedSchemas` to `getLints`, fixing empty advisor results in local/self-hosted environments - Extracts `DEFAULT_EXPOSED_SCHEMAS` constant shared between the MCP handler and the `run-lints` API route (cc @joshenlim related https://github.com/supabase/supabase/pull/40043) - Adds unit tests for `enrichLintsQuery` and the MCP advisor operations ## The bug The MCP advisor tools (`get_advisors`) return empty arrays (`[]`) for **all** scenarios when running locally via `supabase start`. No security or performance advisors are surfaced, even when the database has clear issues (e.g., tables with no RLS). ### Root cause In `lib/api/self-hosted/mcp.ts`, both `getSecurityAdvisors` and `getPerformanceAdvisors` call `getLints({ headers })` **without passing `exposedSchemas`**: ```typescript // Before (mcp.ts:131) const { data, error } = await getLints({ headers }) ``` When `exposedSchemas` is `undefined`, `enrichLintsQuery` in `lints.ts` skips the `SET LOCAL pgrst.db_schemas = '...'` SQL statement: ```typescript // lints.ts:23 ${!!exposedSchemas ? `set local pgrst.db_schemas = '${exposedSchemas}';` : ''} ``` Without this GUC being set, the splinter SQL queries filter results using `current_setting('pgrst.db_schemas', 't')` — which returns an empty string in local environments. Every schema-filtered lint matches no schemas and returns zero rows. ### Why this only affects local/self-hosted environments In **hosted Supabase**, PostgREST sets the `pgrst.db_schemas` GUC on its own database connections based on the project's API configuration. The Studio MCP server in production reads the same project configuration, so the GUC is already available. **Locally**, PostgREST runs in a separate Docker container and only sets this GUC on _its own_ connections. Studio connects directly to PostgreSQL (bypassing PostgREST), so `current_setting('pgrst.db_schemas', 't')` returns `''`. The HTTP API endpoint (`/api/platform/.../run-lints`) already worked because `run-lints.ts` passes `exposedSchemas: 'public, storage'` — this parameter was simply never added to the MCP code path. ## How we verified the fix ### 1. Tests written to fail against the previous code We wrote two test files that target the exact bug: **`tests/unit/lints/enrichLintsQuery.test.ts`** — validates the SQL generation: - Confirms `SET LOCAL pgrst.db_schemas` is included when `exposedSchemas` is provided - Confirms it's omitted when `undefined` or empty (documenting current behavior) **`tests/unit/lints/mcp-advisors.test.ts`** — validates the MCP operations: - Asserts `getSecurityAdvisors` passes `exposedSchemas` to `getLints` - Asserts `getPerformanceAdvisors` passes `exposedSchemas` to `getLints` - Asserts the value matches `DEFAULT_EXPOSED_SCHEMAS` - Verifies SECURITY/PERFORMANCE category filtering still works Before the fix, the two `exposedSchemas` assertions failed: ``` FAIL getSecurityAdvisors should pass exposedSchemas to getLints → expected { Object (headers) } to have property "exposedSchemas" FAIL getPerformanceAdvisors should pass exposedSchemas to getLints → expected { Object (headers) } to have property "exposedSchemas" ``` ### 2. Fix applied, all tests pass After adding `exposedSchemas: DEFAULT_EXPOSED_SCHEMAS` to both MCP operations, all 14 tests pass (9 new + 5 existing MCP tests). ## Test plan run `supabase start`, create a table without RLS, call `get_advisors` via MCP — should return `rls_disabled_in_public` lint --------- Co-authored-by: Claude Opus 4.6 --- apps/studio/lib/api/self-hosted/constants.ts | 5 + apps/studio/lib/api/self-hosted/lints.ts | 8 +- apps/studio/lib/api/self-hosted/mcp.ts | 11 +- .../api/platform/projects/[ref]/run-lints.ts | 12 +-- .../tests/unit/lints/enrichLintsQuery.test.ts | 26 +++++ .../tests/unit/lints/mcp-advisors.test.ts | 102 ++++++++++++++++++ 6 files changed, 151 insertions(+), 13 deletions(-) create mode 100644 apps/studio/tests/unit/lints/enrichLintsQuery.test.ts create mode 100644 apps/studio/tests/unit/lints/mcp-advisors.test.ts diff --git a/apps/studio/lib/api/self-hosted/constants.ts b/apps/studio/lib/api/self-hosted/constants.ts index 0727ec3b0a3..d12f7ab9748 100644 --- a/apps/studio/lib/api/self-hosted/constants.ts +++ b/apps/studio/lib/api/self-hosted/constants.ts @@ -1,5 +1,10 @@ // Constants specific to self-hosted environments +// Schemas exposed via PostgREST Data API, read from the PGRST_DB_SCHEMAS env var +// that is passed to the Studio container via docker-compose / CLI. +export const DEFAULT_EXPOSED_SCHEMAS = + process.env.PGRST_DB_SCHEMAS ?? 'public,storage,graphql_public' + export const ENCRYPTION_KEY = process.env.PG_META_CRYPTO_KEY || 'SAMPLE_KEY' export const POSTGRES_PORT = parseInt(process.env.POSTGRES_PORT || '5432', 10) export const POSTGRES_HOST = process.env.POSTGRES_HOST || 'db' diff --git a/apps/studio/lib/api/self-hosted/lints.ts b/apps/studio/lib/api/self-hosted/lints.ts index 5b62974c09b..b650c3d3f35 100644 --- a/apps/studio/lib/api/self-hosted/lints.ts +++ b/apps/studio/lib/api/self-hosted/lints.ts @@ -19,7 +19,13 @@ export type ResponseData = export const enrichLintsQuery = (query: string, exposedSchemas?: string) => { return ` -set pg_stat_statements.track = none; +do $$ +begin + set pg_stat_statements.track = none; +exception when others then + -- not a superuser or extension not installed, skip silently +end +$$; ${!!exposedSchemas ? `set local pgrst.db_schemas = '${exposedSchemas}';` : ''} -- source: dashboard -- user: ${'self host'} diff --git a/apps/studio/lib/api/self-hosted/mcp.ts b/apps/studio/lib/api/self-hosted/mcp.ts index 41140208e3d..6828abc6fb7 100644 --- a/apps/studio/lib/api/self-hosted/mcp.ts +++ b/apps/studio/lib/api/self-hosted/mcp.ts @@ -9,6 +9,7 @@ import { GetLogsOptions, } from '@supabase/mcp-server-supabase/platform' import { ResponseError } from 'types' +import { DEFAULT_EXPOSED_SCHEMAS } from './constants' import { generateTypescriptTypes } from './generate-types' import { getLints } from './lints' import { getLogQuery, retrieveAnalyticsData } from './logs' @@ -128,7 +129,10 @@ export function getDebuggingOperations({ return data }, async getSecurityAdvisors(_projectRef) { - const { data, error } = await getLints({ headers }) + const { data, error } = await getLints({ + headers, + exposedSchemas: DEFAULT_EXPOSED_SCHEMAS, + }) if (error) { throw error @@ -137,7 +141,10 @@ export function getDebuggingOperations({ return data.filter((lint) => lint.categories.includes('SECURITY')) }, async getPerformanceAdvisors(_projectRef) { - const { data, error } = await getLints({ headers }) + const { data, error } = await getLints({ + headers, + exposedSchemas: DEFAULT_EXPOSED_SCHEMAS, + }) if (error) { throw error diff --git a/apps/studio/pages/api/platform/projects/[ref]/run-lints.ts b/apps/studio/pages/api/platform/projects/[ref]/run-lints.ts index 51fe4a29c31..08f5b6dab45 100644 --- a/apps/studio/pages/api/platform/projects/[ref]/run-lints.ts +++ b/apps/studio/pages/api/platform/projects/[ref]/run-lints.ts @@ -2,6 +2,7 @@ import { NextApiRequest, NextApiResponse } from 'next' import { constructHeaders } from 'lib/api/apiHelpers' import apiWrapper from 'lib/api/apiWrapper' +import { DEFAULT_EXPOSED_SCHEMAS } from 'lib/api/self-hosted/constants' import { getLints } from 'lib/api/self-hosted/lints' export default (req: NextApiRequest, res: NextApiResponse) => apiWrapper(req, res, handler) @@ -11,18 +12,9 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { switch (method) { case 'GET': - /** - * [Joshen] JFYI technically the exposed schemas is being set here via docker-compose.yml - * https://github.com/supabase/supabase/blob/master/docker/docker-compose.yml#L183 - * https://github.com/supabase/supabase/blob/474a78721e510301d15ca9dbd41f05ce10fa29e5/docker/.env.example#L55 - * - * But i noticed that the local API route on config/postgrest.ts has currently hardcoded db_schema to `public, storage` - * As such, this is only just a temporary patch here that we're hardcoding the exposed schemas but we will need to figure - * out how to get the dashboard to retrieve the values from docker-compose - */ const { data, error } = await getLints({ headers: constructHeaders(req.headers), - exposedSchemas: 'public, storage', + exposedSchemas: DEFAULT_EXPOSED_SCHEMAS, }) if (error) { diff --git a/apps/studio/tests/unit/lints/enrichLintsQuery.test.ts b/apps/studio/tests/unit/lints/enrichLintsQuery.test.ts new file mode 100644 index 00000000000..09558c2154a --- /dev/null +++ b/apps/studio/tests/unit/lints/enrichLintsQuery.test.ts @@ -0,0 +1,26 @@ +import { describe, it, expect } from 'vitest' +import { enrichLintsQuery } from 'lib/api/self-hosted/lints' + +describe('enrichLintsQuery', () => { + const dummyQuery = 'SELECT 1' + + it('should include SET LOCAL pgrst.db_schemas when exposedSchemas is provided', () => { + const result = enrichLintsQuery(dummyQuery, 'public, storage') + expect(result).toContain("set local pgrst.db_schemas = 'public, storage';") + }) + + it('should NOT include SET LOCAL pgrst.db_schemas when exposedSchemas is undefined', () => { + const result = enrichLintsQuery(dummyQuery, undefined) + expect(result).not.toContain('pgrst.db_schemas') + }) + + it('should NOT include SET LOCAL pgrst.db_schemas when exposedSchemas is empty string', () => { + const result = enrichLintsQuery(dummyQuery, '') + expect(result).not.toContain('pgrst.db_schemas') + }) + + it('should always include the query', () => { + const result = enrichLintsQuery(dummyQuery) + expect(result).toContain(dummyQuery) + }) +}) diff --git a/apps/studio/tests/unit/lints/mcp-advisors.test.ts b/apps/studio/tests/unit/lints/mcp-advisors.test.ts new file mode 100644 index 00000000000..3e822f7ea3e --- /dev/null +++ b/apps/studio/tests/unit/lints/mcp-advisors.test.ts @@ -0,0 +1,102 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { DEFAULT_EXPOSED_SCHEMAS } from 'lib/api/self-hosted/constants' + +// Mock getLints to capture what arguments the MCP operations pass +const mockGetLints = vi.fn() +vi.mock('lib/api/self-hosted/lints', () => ({ + getLints: (...args: unknown[]) => mockGetLints(...args), +})) + +// Mock getProjectSettings to avoid assertSelfHosted() check +vi.mock('lib/api/self-hosted/settings', () => ({ + getProjectSettings: () => ({ + app_config: { + db_schema: 'public', + endpoint: 'localhost', + protocol: 'http', + }, + service_api_keys: [{ api_key: 'test', name: 'anon key', tags: 'anon' }], + }), +})) + +// Must import after mock setup +import { getDebuggingOperations } from 'lib/api/self-hosted/mcp' + +describe('MCP advisor operations pass exposedSchemas to getLints', () => { + const headers = { Authorization: 'Bearer test' } + + beforeEach(() => { + vi.clearAllMocks() + mockGetLints.mockResolvedValue({ + data: [ + { + name: 'rls_disabled_in_public', + title: 'RLS Disabled in Public', + level: 'ERROR', + categories: ['SECURITY'], + description: 'test', + detail: 'test', + remediation: 'test', + metadata: {}, + cache_key: 'test', + }, + { + name: 'unindexed_foreign_keys', + title: 'Unindexed foreign keys', + level: 'INFO', + categories: ['PERFORMANCE'], + description: 'test', + detail: 'test', + remediation: 'test', + metadata: {}, + cache_key: 'test', + }, + ], + error: undefined, + }) + }) + + it('getSecurityAdvisors should pass exposedSchemas to getLints', async () => { + const ops = getDebuggingOperations({ headers }) + await ops.getSecurityAdvisors('test-project') + + expect(mockGetLints).toHaveBeenCalledOnce() + const callArgs = mockGetLints.mock.calls[0][0] + expect(callArgs).toHaveProperty('exposedSchemas') + expect(callArgs.exposedSchemas).toBeTruthy() + }) + + it('getPerformanceAdvisors should pass exposedSchemas to getLints', async () => { + const ops = getDebuggingOperations({ headers }) + await ops.getPerformanceAdvisors('test-project') + + expect(mockGetLints).toHaveBeenCalledOnce() + const callArgs = mockGetLints.mock.calls[0][0] + expect(callArgs).toHaveProperty('exposedSchemas') + expect(callArgs.exposedSchemas).toBeTruthy() + }) + + it('should use DEFAULT_EXPOSED_SCHEMAS constant', async () => { + const ops = getDebuggingOperations({ headers }) + await ops.getSecurityAdvisors('test-project') + + const callArgs = mockGetLints.mock.calls[0][0] + expect(callArgs.exposedSchemas).toBe(DEFAULT_EXPOSED_SCHEMAS) + }) + + it('getSecurityAdvisors should filter to SECURITY category', async () => { + const ops = getDebuggingOperations({ headers }) + const result = await ops.getSecurityAdvisors('test-project') + + expect(result).toHaveLength(1) + expect((result as Array<{ name: string }>)[0].name).toBe('rls_disabled_in_public') + }) + + it('getPerformanceAdvisors should filter to PERFORMANCE category', async () => { + const ops = getDebuggingOperations({ headers }) + const result = await ops.getPerformanceAdvisors('test-project') + + expect(result).toHaveLength(1) + expect((result as Array<{ name: string }>)[0].name).toBe('unindexed_foreign_keys') + }) +}) From 9fa96977bea2451cf49335c8b2d6f56025541125 Mon Sep 17 00:00:00 2001 From: Ivan Vasilov Date: Tue, 17 Mar 2026 11:17:42 +0100 Subject: [PATCH 010/169] chore: Minor prettier fixes (#43849) This PR fixes some prettier issues: - Bump and unify all prettier versions to 3.7.3 across teh whole repo - Bump the SQL prettier plugin - When running `test:prettier`, check `mdx` files also - Run the new prettier format on all files --------- Co-authored-by: Joshen Lim --- .github/workflows/ui-tests.yml | 5 + .../content/docs/components/sheet.mdx | 2 - apps/design-system/content/docs/icons.mdx | 1 - .../content/docs/ui-patterns/forms.mdx | 1 - .../pricing/pricing_edge_functions.mdx | 4 +- .../billing/pricing/pricing_mau_sso.mdx | 4 +- .../pricing/pricing_mau_third_party.mdx | 4 +- .../billing/pricing/pricing_mfa_phone.mdx | 4 +- .../pricing/pricing_realtime_connections.mdx | 4 +- .../pricing/pricing_realtime_messages.mdx | 4 +- .../pricing_storage_image_transformations.mdx | 4 +- .../_partials/universal_links_apple.mdx | 1 - apps/docs/content/guides/ai/hybrid-search.mdx | 2 - .../guides/auth/general-configuration.mdx | 1 - apps/docs/content/guides/auth/rate-limits.mdx | 2 +- .../auth/social-login/auth-facebook.mdx | 3 - .../content/guides/database/import-data.mdx | 1 - .../replication/replication-setup.mdx | 6 - .../guides/deployment/going-into-prod.mdx | 2 - .../content/guides/functions/architecture.mdx | 7 - .../guides/functions/examples/og-image.mdx | 28 +- .../local-development/testing/overview.mdx | 3 - .../testing/pgtap-extended.mdx | 3 - .../guides/platform/access-control.mdx | 6 + .../aws-marketplace/getting-started.mdx | 3 + .../guides/platform/compute-and-disk.mdx | 2 + .../platform/migrating-to-supabase/auth0.mdx | 1 - .../read-replicas/getting-started.mdx | 3 - apps/docs/content/guides/queues.mdx | 6 +- .../self-hosting/self-hosted-auth-keys.mdx | 45 +- .../guides/storage/s3/compatibility.mdx | 2 +- ...peruser-to-terminate-superuser-process.mdx | 1 - ...o-delete-vercel-linked-projects-9d08aa.mdx | 4 - ...r-zgotmplz-in-magic-link-emails-433665.mdx | 1 - ...project-suspended-for-exceeding-quotas.mdx | 1 - ...-or-invalid-scram-server-final-message.mdx | 3 - .../docs/docs/ref/csharp/v0/release-notes.mdx | 1 - .../features/docs/Reference.introduction.tsx | 14 +- apps/docs/features/docs/Reference.ui.tsx | 2 +- apps/docs/layouts/MainSkeleton.tsx | 2 +- .../learn/components/side-navigation-item.tsx | 3 +- .../grid/components/editor/DateTimeEditor.tsx | 6 +- .../grid/components/editor/JsonEditor.tsx | 6 +- .../grid/components/editor/SelectEditor.tsx | 6 +- .../grid/components/editor/TimeEditor.tsx | 6 +- .../grid/utils/queueOperationUtils.ts | 6 +- .../App/CommandMenu/StorageSearchResults.tsx | 4 +- .../FeaturePreview/FeaturePreviewModal.tsx | 2 +- .../App/UpdateBillingAddressModal.tsx | 14 +- .../Auth/PerformanceSettingsForm.tsx | 2 +- .../Auth/Policies/PolicyEditorPanel/index.tsx | 2 +- .../interfaces/Auth/Users/UserOverview.tsx | 2 +- .../Connect/DatabaseConnectionString.tsx | 10 +- .../interfaces/ConnectSheet/useMcpUrl.ts | 2 +- .../Database/Extensions/ExtensionRow.tsx | 2 +- .../Database/Extensions/Extensions.tsx | 2 +- .../Database/Migrations/Migrations.tsx | 4 +- .../Database/Privileges/PrivilegesTable.tsx | 9 +- .../Database/Replication/Destinations.tsx | 2 +- .../Replication/UpdateVersionModal.tsx | 4 +- .../RestoreToNewProject.tsx | 4 +- .../interfaces/Database/Tables/ColumnList.tsx | 2 +- .../DiskManagement/fields/AutoScaleFields.tsx | 2 +- .../interfaces/Docs/Authentication.tsx | 4 +- .../EdgeFunctionSecrets.tsx | 6 +- .../Home/NewProjectPanel/APIKeys.tsx | 2 +- .../interfaces/Home/ServiceStatus.tsx | 2 +- .../CronJobs/CronJobTableCell.tsx | 3 +- .../Landing/Integrations.constants.tsx | 12 +- .../Landing/useAvailableIntegrations.tsx | 6 +- .../VercelGithub/ProjectLinker.tsx | 2 +- .../LogDrainDestinationSheetForm.tsx | 2 +- .../Subscription/PaymentMethodSelection.tsx | 4 +- .../Organization/NewOrg/NewOrgForm.tsx | 2 +- .../Organization/TeamSettings/MemberRow.tsx | 2 +- .../Webhooks/PlatformWebhooksPage.tsx | 4 +- .../ProjectAPIDocs/Content/Introduction.tsx | 2 +- .../ProjectAPIDocs/ProjectAPIDocs.tsx | 2 +- .../PostgresVersionSelector.tsx | 4 +- .../interfaces/ProjectHome/ActivityStats.tsx | 2 +- .../interfaces/ProjectHome/ServiceStatus.tsx | 2 +- .../hooks/useQueryInsightsTableColumns.tsx | 2 +- .../hooks/useSupamonitorIndexAdvisor.ts | 4 +- .../QueryPerformance/QueryPerformanceGrid.tsx | 2 +- .../RoleImpersonationSelector/index.tsx | 8 +- .../components/interfaces/SQLEditor/README.md | 5 - .../interfaces/SQLEditor/SQLEditor.tsx | 10 +- .../InstanceConfiguration.utils.ts | 2 +- .../VercelIntegrationConnectionForm.tsx | 2 +- .../interfaces/Settings/Logs/Logs.utils.ts | 2 +- .../interfaces/Storage/EditBucketModal.tsx | 2 +- .../interfaces/Support/ProjectAndPlanInfo.tsx | 2 +- .../DeleteConfirmationDialogs.tsx | 2 +- .../SidePanelEditor/SidePanelEditor.utils.tsx | 2 +- .../TableEditor/ApiAccessToggle.tsx | 6 +- .../UnifiedLogs/components/Columns.tsx | 4 +- .../layouts/AppLayout/AppLayoutDropdown.tsx | 3 +- .../layouts/AppLayout/BranchDropdown.tsx | 4 +- .../layouts/AppLayout/TaxIdBanner.tsx | 8 +- .../ProjectBranchSelector.utils.ts | 2 +- .../SQLEditorNavV2/SQLEditorTreeViewItem.tsx | 6 +- apps/studio/components/layouts/Tabs/Tabs.tsx | 2 +- .../AIAssistantPanel/DisplayBlockRenderer.tsx | 2 +- apps/studio/components/ui/CardButton.tsx | 6 +- .../components/ui/Charts/Charts.types.tsx | 21 +- .../ui/Charts/ComposedChart.utils.tsx | 4 +- .../ui/Charts/useChartHoverState.test.tsx | 10 +- apps/studio/components/ui/CopyButton.tsx | 2 +- .../ui/DataTable/DataTableSheetRowAction.tsx | 6 +- .../DataTable/providers/DataTableProvider.tsx | 3 +- .../EdgeFunctionBlock/EdgeFunctionBlock.tsx | 2 +- .../ErrorCodeTooltip.utils.ts | 4 +- .../ui/OrganizationProjectSelector.tsx | 2 +- apps/studio/components/ui/ProfileImage.tsx | 4 +- .../ui/ProjectSettings/DisplayApiSettings.tsx | 2 +- .../studio/components/ui/VirtualizedTable.tsx | 8 +- .../studio/hooks/misc/useCheckEntitlements.ts | 4 +- apps/studio/lib/ai/org-ai-details.test.ts | 5 +- apps/studio/package.json | 1 - apps/studio/pages/new/[slug].tsx | 6 +- .../project/[ref]/logs/explorer/index.tsx | 2 +- .../components/side-navigation-item.tsx | 3 +- .../components/avatar-stack.tsx | 3 +- .../registry/default/components/ui/badge.tsx | 3 +- .../registry/default/components/ui/button.tsx | 3 +- .../registry/default/components/ui/switch.tsx | 3 +- apps/www/_blog/2020-10-30-improved-dx.mdx | 1 + .../_blog/2021-07-01-roles-postgres-hooks.mdx | 1 + ...-supabase-hacktoberfest-hackathon-2021.mdx | 19 +- apps/www/_blog/2021-11-30-supabase-studio.mdx | 6 +- .../2021-12-02-supabase-acquires-logflare.mdx | 17 +- ...03-supabase-holiday-hackdays-hackathon.mdx | 16 +- ...-product-hunt-golden-kitty-awards-2021.mdx | 14 +- ...2022-01-20-supabase-beta-december-2021.mdx | 21 +- apps/www/_blog/2022-03-08-postgres-audit.mdx | 4 +- .../2022-04-01-hackathon-bring-the-func.mdx | 22 +- ...idate-slackbot-to-consolidate-messages.mdx | 3 +- ...2022-08-19-launch-week-5-community-day.mdx | 5 +- ...-11-08-authentication-in-ionic-angular.mdx | 6 +- ...onstellation-threejs-react-three-fiber.mdx | 8 +- .../2024-05-09-meetup-kahoot-alternative.mdx | 16 +- apps/www/_blog/2024-12-04-supabase-cron.mdx | 3 +- ...2-26-pgrouting-postgres-graph-database.mdx | 1 - ...2025-05-08-event-triggers-wo-superuser.mdx | 2 + apps/www/app/api-v2/ticket-og/route.tsx | 464 +++++++++--------- .../Carousels/ImageCarousel.module.css | 3 +- apps/www/components/Events/EventListItem.tsx | 4 +- apps/www/components/ImageModal.tsx | 3 +- .../7/LaunchSection/brick-wall.module.css | 3 +- .../LaunchWeek/7/lw7-bg-graphic.module.css | 12 +- .../Sections/TimedAccordionSection.tsx | 2 +- .../components/Solutions/PlatformSection.tsx | 4 +- apps/www/components/VideoWithHighlights.tsx | 2 +- apps/www/styles/customers.module.css | 4 +- .../supabase/functions/lw11-og/handler.tsx | 406 ++++++++------- .../www/supabase/functions/lwx-og/handler.tsx | 252 +++++----- .../functions/lwx-ticket-og/handler.tsx | 52 +- .../supabase/functions/lwx-ticket/handler.tsx | 220 ++++----- package.json | 15 +- packages/api-types/package.json | 2 +- packages/build-icons/package.json | 1 - packages/common/feature-flags.tsx | 2 +- .../src/sql/studio/auth/get-users-common.ts | 2 +- .../src/Chart/charts/chart-bar.tsx | 4 +- .../src/Chart/charts/chart-line.tsx | 4 +- .../src/CommandMenu/api/TextHighlighter.tsx | 5 +- .../AlertCollapsible/AlertCollapsible.tsx | 3 +- packages/ui/src/components/Button/Button.tsx | 3 +- packages/ui/src/components/Input/Input.tsx | 12 +- packages/ui/src/components/Modal/Modal.tsx | 7 +- packages/ui/src/components/NavMenu/index.tsx | 9 +- .../ui/src/components/SidePanel/SidePanel.tsx | 3 +- .../ui/src/components/shadcn/ui/badge.tsx | 3 +- .../ui/src/components/shadcn/ui/button.tsx | 3 +- .../ui/src/components/shadcn/ui/input.tsx | 3 +- .../components/shadcn/ui/navigation-menu.tsx | 5 +- .../ui/src/components/shadcn/ui/sheet.tsx | 6 +- .../ui/src/components/shadcn/ui/switch.tsx | 3 +- packages/ui/src/lib/MarkdownSample.md | 2 - pnpm-lock.yaml | 56 +-- prettier.config.mjs | 2 + 181 files changed, 1155 insertions(+), 1143 deletions(-) diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 0e8de49a0f3..e97bda26030 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -70,6 +70,11 @@ jobs: continue-on-error: true runs-on: blacksmith-4vcpu-ubuntu-2404 steps: + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + with: + sparse-checkout: | + packages/ui + patches - name: Download coverage artifact uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: diff --git a/apps/design-system/content/docs/components/sheet.mdx b/apps/design-system/content/docs/components/sheet.mdx index 75edbb53860..5ef059a69bf 100644 --- a/apps/design-system/content/docs/components/sheet.mdx +++ b/apps/design-system/content/docs/components/sheet.mdx @@ -13,13 +13,11 @@ source: 1. **Use for side panels** - - Forms with multiple fields - Settings panels - Detailed editors 2. **Consider screen size** - - Sheets work well on desktop - On mobile, consider full-screen or bottom sheet variants diff --git a/apps/design-system/content/docs/icons.mdx b/apps/design-system/content/docs/icons.mdx index eefdbb97749..e433bceab58 100644 --- a/apps/design-system/content/docs/icons.mdx +++ b/apps/design-system/content/docs/icons.mdx @@ -52,7 +52,6 @@ function app() { Follow these steps to add a new custom icon to the Supabase icon library. 1. **Create SVG file**: Add your SVG file to `packages/icons/src/raw-icons/` with a kebab-case name (e.g., `my-new-icon.svg`). Make sure it follows these requirements: - - Exported at 24×24px with `viewBox="0 0 24 24"` - Uses `stroke="currentColor"` for strokes (no hardcoded colors) - Uses `stroke-width="1.5"` (deviate based on optical weight if necessary) diff --git a/apps/design-system/content/docs/ui-patterns/forms.mdx b/apps/design-system/content/docs/ui-patterns/forms.mdx index eb71580c536..8c2794495f5 100644 --- a/apps/design-system/content/docs/ui-patterns/forms.mdx +++ b/apps/design-system/content/docs/ui-patterns/forms.mdx @@ -32,7 +32,6 @@ Forms in side panels (Sheets) use `FormItemLayout` with `layout="horizontal"` on 1. **Always use FormItemLayout**: Use `FormItemLayout` instead of manually composing `FormItem`, `FormLabel`, `FormMessage`, and `FormDescription`. 2. **Layout selection**: - - Use `layout="flex-row-reverse"` for page layouts (horizontal alignment) - Use `layout="horizontal"` for side panels with more width - Use `layout="vertical"` for side panels with limited width diff --git a/apps/docs/content/_partials/billing/pricing/pricing_edge_functions.mdx b/apps/docs/content/_partials/billing/pricing/pricing_edge_functions.mdx index 4a6e51cb3b6..cf0abdbf7b8 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_edge_functions.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_edge_functions.mdx @@ -1,5 +1,5 @@ - per 1 million invocations. You are only charged for usage exceeding your subscription -plan's quota. + per 1 million invocations. You are only charged for usage exceeding your +subscription plan's quota. | Plan | Quota | Over-Usage | | ---------- | --------- | --------------------------------------------- | diff --git a/apps/docs/content/_partials/billing/pricing/pricing_mau_sso.mdx b/apps/docs/content/_partials/billing/pricing/pricing_mau_sso.mdx index 8ba7741e9b9..7ff5176ad63 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_mau_sso.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_mau_sso.mdx @@ -1,6 +1,6 @@ ## Pricing - per SSO MAU. You are only charged for usage exceeding your subscription plan's -quota. + per SSO MAU. You are only charged for usage exceeding your subscription +plan's quota. For a detailed breakdown of how charges are calculated, refer to [Manage Monthly Active SSO Users usage](/docs/guides/platform/manage-your-usage/monthly-active-users-sso). diff --git a/apps/docs/content/_partials/billing/pricing/pricing_mau_third_party.mdx b/apps/docs/content/_partials/billing/pricing/pricing_mau_third_party.mdx index cbfccef3877..05f5adbca7e 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_mau_third_party.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_mau_third_party.mdx @@ -1,6 +1,6 @@ ## Pricing - per Third-Party MAU. You are only charged for usage exceeding your subscription -plan's quota. + per Third-Party MAU. You are only charged for usage exceeding your +subscription plan's quota. For a detailed breakdown of how charges are calculated, refer to [Manage Monthly Active Third-Party Users usage](/docs/guides/platform/manage-your-usage/monthly-active-users-third-party). diff --git a/apps/docs/content/_partials/billing/pricing/pricing_mfa_phone.mdx b/apps/docs/content/_partials/billing/pricing/pricing_mfa_phone.mdx index 6708ec7a9d0..8cc187a5a5e 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_mfa_phone.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_mfa_phone.mdx @@ -1,7 +1,7 @@ ## Pricing - per hour ( per month) for the first project. per -hour ( per month) for every additional project. + per hour ( per month) for the first project. + per hour ( per month) for every additional project. | Plan | Project 1 per month | Project 2 per month | Project 3 per month | | ---------- | -------------------- | -------------------- | -------------------- | diff --git a/apps/docs/content/_partials/billing/pricing/pricing_realtime_connections.mdx b/apps/docs/content/_partials/billing/pricing/pricing_realtime_connections.mdx index 5e8737d0af3..5f744d4d79f 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_realtime_connections.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_realtime_connections.mdx @@ -1,5 +1,5 @@ - per 1,000 peak connections. You are only charged for usage exceeding your subscription -plan's quota. + per 1,000 peak connections. You are only charged for usage exceeding your +subscription plan's quota. | Plan | Quota | Over-Usage | | ---------- | ------ | ----------------------------------------------- | diff --git a/apps/docs/content/_partials/billing/pricing/pricing_realtime_messages.mdx b/apps/docs/content/_partials/billing/pricing/pricing_realtime_messages.mdx index 3cbea00db4f..d6a1f8875f8 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_realtime_messages.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_realtime_messages.mdx @@ -1,5 +1,5 @@ - per 1 million messages. You are only charged for usage exceeding your subscription -plan's quota. + per 1 million messages. You are only charged for usage exceeding your +subscription plan's quota. | Plan | Quota | Over-Usage | | ---------- | --------- | --------------------------------------------- | diff --git a/apps/docs/content/_partials/billing/pricing/pricing_storage_image_transformations.mdx b/apps/docs/content/_partials/billing/pricing/pricing_storage_image_transformations.mdx index 3d05742e871..5ced3ca7023 100644 --- a/apps/docs/content/_partials/billing/pricing/pricing_storage_image_transformations.mdx +++ b/apps/docs/content/_partials/billing/pricing/pricing_storage_image_transformations.mdx @@ -1,5 +1,5 @@ - per 1,000 origin images. You are only charged for usage exceeding your subscription -plan's quota. + per 1,000 origin images. You are only charged for usage exceeding your +subscription plan's quota. diff --git a/apps/docs/content/_partials/universal_links_apple.mdx b/apps/docs/content/_partials/universal_links_apple.mdx index ef9ada6753b..a6016206bc0 100644 --- a/apps/docs/content/_partials/universal_links_apple.mdx +++ b/apps/docs/content/_partials/universal_links_apple.mdx @@ -5,7 +5,6 @@ For a better user experience, you can use **Universal Links** instead of custom To enable Universal Links, you need to: 1. **Configure Associated Domains** in your Xcode project: - - Add your domain to the Associated Domains capability - Format: `applinks:yourdomain.com` diff --git a/apps/docs/content/guides/ai/hybrid-search.mdx b/apps/docs/content/guides/ai/hybrid-search.mdx index 8664ee9e32e..69a6fafa9de 100644 --- a/apps/docs/content/guides/ai/hybrid-search.mdx +++ b/apps/docs/content/guides/ai/hybrid-search.mdx @@ -134,13 +134,11 @@ $$; Let's break this down: - **Parameters:** The function accepts quite a few parameters, but the main (required) ones are `query_text`, `query_embedding`, and `match_count`. - - `query_text` is the user's query text (more on this shortly) - `query_embedding` is the vector representation of the user's query produced by the embedding model. We chose 512 dimensions for this example, but adjust this to match the size of the embedding vectors generated from your preferred model. This must match the size of the `embedding` vector on the `documents` table (and use the same model). - `match_count` is the number of records returned in the `limit` clause. The other parameters are optional, but give more control over the fusion process. - - `full_text_weight` and `semantic_weight` decide how much weight each search method gets in the final score. These are both 1 by default which means they both equally contribute towards the final rank. A `full_text_weight` of 2 and `semantic_weight` of 1 would give full-text search twice as much weight as semantic search. - `rrf_k` is the `k` [smoothing constant](#smoothing-constant-k) added to the reciprocal rank. The default is 50. diff --git a/apps/docs/content/guides/auth/general-configuration.mdx b/apps/docs/content/guides/auth/general-configuration.mdx index 9a576119fab..0e79c0625c7 100644 --- a/apps/docs/content/guides/auth/general-configuration.mdx +++ b/apps/docs/content/guides/auth/general-configuration.mdx @@ -25,7 +25,6 @@ Supabase Auth provides these [general configuration options](/dashboard/project/ - **Allow new users to sign up**: Users will be able to sign up. If this config is disabled, only existing users can sign in. - **Confirm Email**: Users will need to confirm their email address before signing in for the first time. - - Having **Confirm Email** disabled assumes that the user's email does not need to be verified in order to login and implicitly confirms the user's email in the database. - This option can be found in the email provider under the provider-specific configuration. {/* - If you previously relied on this config to autoconfirm a user's email address, you can switch to use **Allow unverified email sign in** instead. This new option allows the user to sign in with an unverified email which you can keep track of through the user object. It provides more versatility if you require your users to verify their email address in the future since you can structure your RLS policies to check the user's `email_verified` field. */} diff --git a/apps/docs/content/guides/auth/rate-limits.mdx b/apps/docs/content/guides/auth/rate-limits.mdx index dc543045bdf..3b8a0a4d9a7 100644 --- a/apps/docs/content/guides/auth/rate-limits.mdx +++ b/apps/docs/content/guides/auth/rate-limits.mdx @@ -34,7 +34,7 @@ curl -X PATCH "https://api.supabase.com/v1/projects/$PROJECT_REF/config/auth" \ ## Rate limit behavior -Supabase Auth uses a token bucket algorithm for endpoint operations that are limited by IP address. +Supabase Auth uses a token bucket algorithm for endpoint operations that are limited by IP address. Each bucket has a maximum capacity of 30 requests. When the bucket is full, brief bursts of up to 30 requests can be allowed in a short period. Once the bucket empties, requests are rate limited until tokens refill. The rate limit defines the rate at which the bucket is refilled. diff --git a/apps/docs/content/guides/auth/social-login/auth-facebook.mdx b/apps/docs/content/guides/auth/social-login/auth-facebook.mdx index 555828dd3a4..fef53130348 100644 --- a/apps/docs/content/guides/auth/social-login/auth-facebook.mdx +++ b/apps/docs/content/guides/auth/social-login/auth-facebook.mdx @@ -357,19 +357,16 @@ Development mode is sufficient for local development and testing. You only need Before your app can be used by the general public, you need to complete Facebook's App Review process: 1. **Complete App Settings**: In your Facebook app's **Settings > Basic**, fill in all required fields including: - - App Icon - Privacy Policy URL - Terms of Service URL (if applicable) - App Domain 2. **Request Permissions**: Navigate to **App Review > Permissions and Features** and request the permissions you need: - - `public_profile` - Usually pre-approved - `email` - Requires verification that your app needs email access 3. **Submit for Review**: Click **Submit for Review** and provide: - - Detailed instructions for how Facebook reviewers should test your login flow - A screencast video demonstrating the Facebook Login feature - Explanation of how user data will be used diff --git a/apps/docs/content/guides/database/import-data.mdx b/apps/docs/content/guides/database/import-data.mdx index df2a6cc0b64..ca2e330b508 100644 --- a/apps/docs/content/guides/database/import-data.mdx +++ b/apps/docs/content/guides/database/import-data.mdx @@ -53,7 +53,6 @@ You can use it in conjunction with Supabase by following these steps: ``` Customize the source and Supabase database URL and options to fit your specific use case: - - `wal_buffers`: This parameter is set to '64MB' to allocate 64 megabytes of memory for write-ahead logging buffers. A larger value can help improve write performance by caching more data in memory before writing it to disk. This can be useful during data import operations to speed up the writing of transaction logs. - `max_wal_senders`: It is set to 0, to disable replication connections. This is done during the data import process to prevent replication-related conflicts and issues. - `statement_timeout`: The value is set to 0, which means it's disabled, allowing SQL statements to run without a time limit. diff --git a/apps/docs/content/guides/database/replication/replication-setup.mdx b/apps/docs/content/guides/database/replication/replication-setup.mdx index 6188318c9f2..659247e2e4c 100644 --- a/apps/docs/content/guides/database/replication/replication-setup.mdx +++ b/apps/docs/content/guides/database/replication/replication-setup.mdx @@ -136,21 +136,18 @@ Before configuring BigQuery as a destination, set up the following in Google Clo 1. **Google Cloud Platform (GCP) account**: [Sign up for GCP](https://cloud.google.com/gcp) if you don't have one 2. **BigQuery dataset**: Create a [BigQuery dataset](https://cloud.google.com/bigquery/docs/datasets-intro) in your GCP project - - Open the BigQuery console in GCP - Select your project - Click "Create Dataset" - Provide a dataset ID (e.g., `supabase_replication`) 3. **GCP service account key**: Create a [service account](https://cloud.google.com/iam/docs/keys-create-delete) with appropriate permissions: - - Go to IAM & Admin → Service Accounts - Click "Create Service Account" - Grant the **BigQuery Data Editor** role - Create and download the JSON key file Required permissions: - - `bigquery.datasets.get` - `bigquery.tables.create` - `bigquery.tables.get` @@ -171,13 +168,11 @@ Before configuring BigQuery as a destination, set up the following in Google Clo /> 3. Configure the general settings: - - **Destination name**: A name to identify this destination (e.g., "BigQuery Warehouse") - **Publication**: The publication to replicate data from (created in [Step 1](#step-1-create-a-postgres-publication)) - **Destination type**: Select **BigQuery** 4. Configure BigQuery-specific settings: - - **Project ID**: Your BigQuery project identifier (found in the GCP Console) - **Dataset ID**: The name of your BigQuery dataset (without the project ID) @@ -190,7 +185,6 @@ Before configuring BigQuery as a destination, set up the following in Google Clo - **Service Account Key**: Your GCP service account key in JSON format (from Step 1) 5. Configure **Advanced Settings** (optional): - - **Batch wait time (milliseconds)**: How long to wait for more changes before sending a batch. Default is recommended for optimal performance. 6. Click **Create and start** to begin replication diff --git a/apps/docs/content/guides/deployment/going-into-prod.mdx b/apps/docs/content/guides/deployment/going-into-prod.mdx index 1b23ede39a9..a44b3d0cc56 100644 --- a/apps/docs/content/guides/deployment/going-into-prod.mdx +++ b/apps/docs/content/guides/deployment/going-into-prod.mdx @@ -107,13 +107,11 @@ Stay informed about Supabase service status by subscribing to the [Status Page]( ### Setting up Slack notifications 1. Install the RSS app in Slack: - - Visit the [RSS app page](https://slack.com/marketplace/A0F81R7U7-rss) in the Slack marketplace - Click `Add to Slack` if not already installed - Otherwise you will get straight to next step, no need to reinstall the app 2. Configure the Supabase status feed: - - Create a channel (e.g., `#supabase-status-alerts`) for status updates - On the [RSS app page](https://slack.com/marketplace/A0F81R7U7-rss) go to _Add a Feed_ section and set Feed URL to `https://status.supabase.com/history.rss` - Select your designated channel and click "Subscribe to this feed" diff --git a/apps/docs/content/guides/functions/architecture.mdx b/apps/docs/content/guides/functions/architecture.mdx index d074e55b864..5bb5eb07f08 100644 --- a/apps/docs/content/guides/functions/architecture.mdx +++ b/apps/docs/content/guides/functions/architecture.mdx @@ -13,7 +13,6 @@ This guide explains the architecture and inner workings of Supabase Edge Functio To illustrate how edge functions operate, consider a photo-sharing app where users upload images and apply filters (e.g., grayscale or sepia) before saving them. - **Workflow Overview**: - - A user uploads an original image to Supabase Storage. - When the user selects a filter, the client-side app (using the Supabase JavaScript SDK) invokes an edge function named something like "apply-filter." - The edge function: @@ -34,7 +33,6 @@ This example highlights edge functions as lightweight, on-demand code snippets t Deploying an edge function is straightforward and automated, requiring no manual server setup. - **Steps to Deploy**: - 1. Write the function code in your local Supabase project (e.g., in `supabase/functions/apply-filter/index.ts`). 2. Run the command `supabase functions deploy apply-filter` via the Supabase CLI. 3. The CLI bundles the function and its dependencies into an **ESZip file**—a compact format created by Deno that includes a complete module graph for quick loading and execution. @@ -52,7 +50,6 @@ Once deployed, the function is ready for invocation from anywhere, with Supabase Edge functions leverage a distributed architecture to minimize latency by running code close to the user. - **Architecture Components**: - - **Global API Gateway**: Acts as the entry point for all requests. It uses the requester's IP address to determine geographic location and routes the request to the nearest edge location (e.g., routing a request from Amsterdam to Frankfurt). - **Edge Locations**: Supabase's network of data centers worldwide where functions are replicated. The ESZip bundle is automatically distributed to these locations upon deployment. - **Routing Logic**: Based on geolocation mapping, ensuring the function executes as close as possible to the user for optimal performance. @@ -68,20 +65,17 @@ This global edge network is what makes edge functions "edge-native," providing c The core of edge functions' efficiency lies in their execution environment, which prioritizes speed, isolation, and scalability. - **Request Handling**: - 1. A client sends an HTTP request (e.g., POST) to the function's URL, including parameters like auth headers, image ID, and filter type. 2. The global API gateway routes it to the nearest edge location. 3. At the edge, Supabase's **edge runtime** validates the request (e.g., checks authorization). - **Execution Environment**: - - A new **V8 isolate** is spun up for each invocation. V8 is the JavaScript engine used by Chrome and Node.js, providing a lightweight, sandboxed environment. - Each isolate has its own memory heap and execution thread, ensuring complete isolation—no interference between concurrent requests. - The ESZip bundle is loaded into the isolate, and the function code runs. - After execution, the response (e.g., filtered image path) is sent back to the client. - **Performance Optimizations**: - - **Cold Starts**: Even initial executions are fast (milliseconds) due to the compact ESZip format and minimal Deno runtime overhead. - **Warm Starts**: Isolates can remain active for a period (plan-dependent) to handle subsequent requests without restarting. - **Concurrency**: Multiple isolates can run simultaneously in the same edge location, supporting high traffic. @@ -95,7 +89,6 @@ Compared to traditional serverless or monolithic architectures, this setup offer ## Benefits and use cases - **Advantages**: - - **Low Latency**: Proximity to users reduces round-trip times. - **Scalability**: Handles variable loads without provisioning servers. - **Developer-Friendly**: Focus on code; Supabase manages the rest. diff --git a/apps/docs/content/guides/functions/examples/og-image.mdx b/apps/docs/content/guides/functions/examples/og-image.mdx index e47bc9fcec0..ec076c16b7c 100644 --- a/apps/docs/content/guides/functions/examples/og-image.mdx +++ b/apps/docs/content/guides/functions/examples/og-image.mdx @@ -26,21 +26,19 @@ import { ImageResponse } from 'https://deno.land/x/og_edge@0.0.4/mod.ts' export default function handler(req: Request) { return new ImageResponse( - ( -
- Hello OG Image! -
- ) +
+ Hello OG Image! +
) } ``` diff --git a/apps/docs/content/guides/local-development/testing/overview.mdx b/apps/docs/content/guides/local-development/testing/overview.mdx index eb212ec063e..1b17a3cfae3 100644 --- a/apps/docs/content/guides/local-development/testing/overview.mdx +++ b/apps/docs/content/guides/local-development/testing/overview.mdx @@ -281,13 +281,11 @@ jobs: ## Best practices 1. **Test Data Setup** - - Use begin and rollback to ensure test isolation - Create realistic test data that covers edge cases - Use different user roles and permissions in tests 2. **RLS Policy Testing** - - Test Create, Read, Update, Delete operations - Test with different user roles: anonymous and authenticated - Test edge cases and potential security bypasses @@ -310,7 +308,6 @@ For more complex, real-world examples of database testing, check out: Common issues and solutions: 1. **Test Failures Due to RLS** - - Ensure you've set the correct role `set local role authenticated;` - Verify JWT claims are set `set local "request.jwt.claims"` - Check policy definitions match your test assumptions diff --git a/apps/docs/content/guides/local-development/testing/pgtap-extended.mdx b/apps/docs/content/guides/local-development/testing/pgtap-extended.mdx index 1e4fbf57411..ac6e42168de 100644 --- a/apps/docs/content/guides/local-development/testing/pgtap-extended.mdx +++ b/apps/docs/content/guides/local-development/testing/pgtap-extended.mdx @@ -67,13 +67,11 @@ create extension if not exists "basejump-supabase_test_helpers" version '0.0.6'; The test helpers package provides several advantages over writing raw pgTAP tests: 1. **Simplified User Management** - - Create test users with `tests.create_supabase_user()` - Switch contexts with `tests.authenticate_as()` - Retrieve user IDs using `tests.get_supabase_uid()` 2. **Row Level Security (RLS) Testing Utilities** - - Verify RLS status with `tests.rls_enabled()` - Test policy enforcement - Simulate different user contexts @@ -262,7 +260,6 @@ This demo app implements: ### What makes this complex? 1. **Layered Permissions** - - Role hierarchies affect access rights - Plan types influence user capabilities - Content state (draft/published) affects permissions diff --git a/apps/docs/content/guides/platform/access-control.mdx b/apps/docs/content/guides/platform/access-control.mdx index fdb8f357949..5a8dca998dd 100644 --- a/apps/docs/content/guides/platform/access-control.mdx +++ b/apps/docs/content/guides/platform/access-control.mdx @@ -269,9 +269,15 @@ The table below shows the actions each role can take on the resources belonging | | Delete | | | | | [^1]: Available on the Team and Enterprise Plans. + [^2]: Sending anonymous data to OpenAI is opt in and can improve Studio AI Assistant's responses. + [^3]: Invites sent from a SSO account can only be accepted by another SSO account coming from the same identity provider. This is a security measure that prevents accidental invites to accounts not managed by your company's enterprise systems. + [^4]: Available on the Team and Enterprise Plans. + [^5]: Read-Only role is able to access secrets. + [^6]: Listed permissions are for the API and Dashboard. + [^7]: Limited to executing SELECT queries. SQL Query Snippets run by the Read-Only role are run against the database using the **supabase_read_only_user**. This role has the [predefined Postgres role pg_read_all_data](https://www.postgresql.org/docs/current/predefined-roles.html). diff --git a/apps/docs/content/guides/platform/aws-marketplace/getting-started.mdx b/apps/docs/content/guides/platform/aws-marketplace/getting-started.mdx index 858aa8081b5..30b23d54033 100644 --- a/apps/docs/content/guides/platform/aws-marketplace/getting-started.mdx +++ b/apps/docs/content/guides/platform/aws-marketplace/getting-started.mdx @@ -67,6 +67,7 @@ src="/docs/img/guides/platform/aws-marketplace-listing-subscribe.png" width={2270} height={632} /> + @@ -79,6 +80,7 @@ src="/docs/img/guides/platform/aws-marketplace-listing-success.png" width={1944} height={1254} /> + @@ -94,6 +96,7 @@ src={{ width={3048} height={1058} /> + diff --git a/apps/docs/content/guides/platform/compute-and-disk.mdx b/apps/docs/content/guides/platform/compute-and-disk.mdx index b0c5d466c40..caa6fc6a91e 100644 --- a/apps/docs/content/guides/platform/compute-and-disk.mdx +++ b/apps/docs/content/guides/platform/compute-and-disk.mdx @@ -32,7 +32,9 @@ In paid organizations, Nano Compute are billed at the same price as Micro Comput | >16XL | - | [Contact Us](/dashboard/support/new?category=sales&subject=Enquiry%20about%20larger%20instance%20sizes) | Custom | Custom | Custom | [^1]: Database max connections are recommended values and can be [customized via `max_connections`](/docs/guides/database/custom-postgres-config) depending on your use case. Be aware of [these considerations](/docs/guides/troubleshooting/how-to-change-max-database-connections-_BQ8P5) before modifying. + [^2]: Database size for each compute instance is the default recommendation but the actual performance of your database has many contributing factors, including resources available to it and the size of the data contained within it. See the [shared responsibility model](/docs/guides/platform/shared-responsibility-model) for more information. + [^3]: Compute resources on the Free plan are subject to change. Compute sizes can be changed by first selecting your project in the dashboard [here](/dashboard/project/_/settings/compute-and-disk) and the upgrade process will [incur downtime](/docs/guides/platform/compute-and-disk#upgrades). diff --git a/apps/docs/content/guides/platform/migrating-to-supabase/auth0.mdx b/apps/docs/content/guides/platform/migrating-to-supabase/auth0.mdx index 7ba4fc78a28..5bd2ffc10ce 100644 --- a/apps/docs/content/guides/platform/migrating-to-supabase/auth0.mdx +++ b/apps/docs/content/guides/platform/migrating-to-supabase/auth0.mdx @@ -112,7 +112,6 @@ Migrate existing users to Supabase Auth. This requires two main steps: first, ch 1. To sign in your migrated users, use the Supabase Auth [sign in methods](/docs/reference/javascript/auth-signinwithpassword). To check for edge cases where users aren't successfully migrated, use a fallback strategy. This ensures that users can continue to sign in seamlessly: - 1. Try to sign in the user with Supabase Auth. 1. If the signin fails, try to sign in with Auth0. 1. If Auth0 signin succeeds, call the admin create user method again to create the user in Supabase Auth. diff --git a/apps/docs/content/guides/platform/read-replicas/getting-started.mdx b/apps/docs/content/guides/platform/read-replicas/getting-started.mdx index 33e0193ff84..34dc491e36b 100644 --- a/apps/docs/content/guides/platform/read-replicas/getting-started.mdx +++ b/apps/docs/content/guides/platform/read-replicas/getting-started.mdx @@ -16,15 +16,12 @@ Projects must meet these requirements to use Read Replicas: 1. Running on AWS. 2. Running on at least a [Small compute add-on](/docs/guides/platform/compute-add-ons). - - Read Replicas are started on the same compute instance as the Primary to keep up with changes. 3. Running on Postgres 15+. - - For projects running on older versions of Postgres, you need to [upgrade to the latest platform version](/docs/guides/platform/migrating-and-upgrading-projects#pgupgrade). 4. Not using [legacy logical backups](/docs/guides/platform/backups#point-in-time-recovery) - - Physical backups are automatically enabled if using [Point in time recovery (PITR)](/docs/guides/platform/backups#point-in-time-recovery) ## Creating a Read Replica diff --git a/apps/docs/content/guides/queues.mdx b/apps/docs/content/guides/queues.mdx index 8130a357edc..2d69042c249 100644 --- a/apps/docs/content/guides/queues.mdx +++ b/apps/docs/content/guides/queues.mdx @@ -19,10 +19,12 @@ Queues couples the reliability of Postgres with the simplicity Supabase's platfo
A Message is delivered exactly once to a consumer within a customizable visibility window. - **Message Durability and Archival**
- Messages are stored in Postgres and you can choose to archive them for analytical or auditing purposes. + Messages are stored in Postgres and you can choose to archive them for analytical or auditing + purposes. - **Granular Authorization**
- Control client-side consumer access to Queues with API permissions and Row Level Security (RLS) policies. + Control client-side consumer access to Queues with API permissions and Row Level Security (RLS) + policies. - **Queue Management and Monitoring**
Create, manage, and monitor Queues and Messages in the Supabase Dashboard. diff --git a/apps/docs/content/guides/self-hosting/self-hosted-auth-keys.mdx b/apps/docs/content/guides/self-hosting/self-hosted-auth-keys.mdx index 955c0b00022..1cbdd4d4199 100644 --- a/apps/docs/content/guides/self-hosting/self-hosted-auth-keys.mdx +++ b/apps/docs/content/guides/self-hosting/self-hosted-auth-keys.mdx @@ -100,15 +100,15 @@ This should return the EC public key (the symmetric key is excluded). Third-part New variables default to empty values in `.env.example`. When empty, the API gateway and all services operate in legacy-only mode: `sb_publishable` and `sb_secret` API keys are not configured. -| Environment variable (existing and new) | Type | Description | -|---|---|---| -| `JWT_SECRET` | Symmetric secret | **Existing:** Shared secret for signing and verifying HS256 JWTs. Used by multiple services. | -| `ANON_KEY` | HS256 JWT | **Existing:** Legacy client-side API key. Embedded JWT with `role: "anon"`. | -| `SERVICE_ROLE_KEY` | HS256 JWT | **Existing:** Legacy server-side API key. Embedded JWT with `role: "service_role"`. | -| `SUPABASE_PUBLISHABLE_KEY` | Opaque | **New:** Short random key with checksum. Replaces `ANON_KEY` for **client-side** use. | -| `SUPABASE_SECRET_KEY` | Opaque | **New:** Short random key with checksum. Replaces `SERVICE_ROLE_KEY` for **server-side** use. | -| `JWT_KEYS` | JSON array | **New:** JSON array of signing JWKs containing the new asymmetric key pair and the legacy symmetric key. Used by Auth to sign tokens. | -| `JWT_JWKS` | JWKS (JSON) | **New:** Contains the new public key and the legacy symmetric key. Used by PostgREST, Realtime, and Storage to verify tokens. | +| Environment variable (existing and new) | Type | Description | +| --------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `JWT_SECRET` | Symmetric secret | **Existing:** Shared secret for signing and verifying HS256 JWTs. Used by multiple services. | +| `ANON_KEY` | HS256 JWT | **Existing:** Legacy client-side API key. Embedded JWT with `role: "anon"`. | +| `SERVICE_ROLE_KEY` | HS256 JWT | **Existing:** Legacy server-side API key. Embedded JWT with `role: "service_role"`. | +| `SUPABASE_PUBLISHABLE_KEY` | Opaque | **New:** Short random key with checksum. Replaces `ANON_KEY` for **client-side** use. | +| `SUPABASE_SECRET_KEY` | Opaque | **New:** Short random key with checksum. Replaces `SERVICE_ROLE_KEY` for **server-side** use. | +| `JWT_KEYS` | JSON array | **New:** JSON array of signing JWKs containing the new asymmetric key pair and the legacy symmetric key. Used by Auth to sign tokens. | +| `JWT_JWKS` | JWKS (JSON) | **New:** Contains the new public key and the legacy symmetric key. Used by PostgREST, Realtime, and Storage to verify tokens. | ### Differences from the Supabase platform @@ -186,7 +186,6 @@ For **Realtime WebSocket** connections, the API key is sent as a `?apikey=` quer **Storage** and **Edge Functions** accept requests without an API key. These services handle their own authentication. - ### API gateway routing Kong is configured with two consumers that each accept both the legacy and new API keys: @@ -195,27 +194,27 @@ Kong is configured with two consumers that each accept both the legacy and new A consumers: - username: anon keyauth_credentials: - - key: $SUPABASE_ANON_KEY # legacy HS256 JWT (ANON_KEY) - - key: $SUPABASE_PUBLISHABLE_KEY # new opaque key (omitted when not configured) + - key: $SUPABASE_ANON_KEY # legacy HS256 JWT (ANON_KEY) + - key: $SUPABASE_PUBLISHABLE_KEY # new opaque key (omitted when not configured) - username: service_role keyauth_credentials: - - key: $SUPABASE_SERVICE_KEY # legacy HS256 JWT (SERVICE_ROLE_KEY) - - key: $SUPABASE_SECRET_KEY # new opaque key (omitted when not configured) + - key: $SUPABASE_SERVICE_KEY # legacy HS256 JWT (SERVICE_ROLE_KEY) + - key: $SUPABASE_SECRET_KEY # new opaque key (omitted when not configured) ``` When new API keys have not been added yet, the `kong-entrypoint.sh` script removes the empty credential entries before Kong loads the config. To assist with the authorization flows a specialized configuration in `kong.yml` substitutes internal, gateway-level-only pre-signed JWTs for `sb_publishable` and `sb_secret` API keys. These pre-signed JWTs are also auto-configured in `.env` but **should not** be used in any application code. -| Route | Service | API key required | Header substitution | -|---|---|---|---| -| `/auth/v1/*` | Auth | Yes | `Authorization` | -| `/rest/v1/*` | PostgREST | Yes | `Authorization` | -| `/graphql/v1` | PostgREST | Yes | `Authorization` | -| `/realtime/v1/api/*` | Realtime (REST) | Yes | `Authorization` | -| `/realtime/v1/*` | Realtime (WebSocket) | Yes | `x-api-key` | -| `/storage/v1/*` | Storage | No | `Authorization` | -| `/functions/v1/*` | Edge Functions | No | - | +| Route | Service | API key required | Header substitution | +| -------------------- | -------------------- | ---------------- | ------------------- | +| `/auth/v1/*` | Auth | Yes | `Authorization` | +| `/rest/v1/*` | PostgREST | Yes | `Authorization` | +| `/graphql/v1` | PostgREST | Yes | `Authorization` | +| `/realtime/v1/api/*` | Realtime (REST) | Yes | `Authorization` | +| `/realtime/v1/*` | Realtime (WebSocket) | Yes | `x-api-key` | +| `/storage/v1/*` | Storage | No | `Authorization` | +| `/functions/v1/*` | Edge Functions | No | - | ### Request flows diff --git a/apps/docs/content/guides/storage/s3/compatibility.mdx b/apps/docs/content/guides/storage/s3/compatibility.mdx index 1e69c541a76..9127228a05e 100644 --- a/apps/docs/content/guides/storage/s3/compatibility.mdx +++ b/apps/docs/content/guides/storage/s3/compatibility.mdx @@ -55,7 +55,7 @@ The most commonly used endpoints are implemented, and more will be added. Implem | ✅ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) | System Metadata:
✅ Content-Type
✅ Cache-Control
✅ Content-Disposition
✅ Content-Encoding
✅ Content-Language
✅ Expires
❌ Content-MD5
❌ Object Lifecycle
❌ Website:
❌ x-amz-website-redirect-location
❌ SSE-C:
❌ x-amz-server-side-encryption
❌ x-amz-server-side-encryption-customer-algorithm
❌ x-amz-server-side-encryption-customer-key
❌ x-amz-server-side-encryption-customer-key-MD5
❌ x-amz-server-side-encryption-aws-kms-key-id
❌ x-amz-server-side-encryption-context
❌ x-amz-server-side-encryption-bucket-key-enabled
❌ Request Payer:
❌ x-amz-request-payer
❌ Tagging:
❌ x-amz-tagging
❌ Object Locking:
❌ x-amz-object-lock-mode
❌ x-amz-object-lock-retain-until-date
❌ x-amz-object-lock-legal-hold
❌ ACL:
❌ x-amz-acl
❌ x-amz-grant-full-control
❌ x-amz-grant-read
❌ x-amz-grant-read-acp
❌ x-amz-grant-write-acp
❌ Bucket Owner:
❌ x-amz-expected-bucket-owner | | ✅ [DeleteObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html) | ❌ Multi-factor authentication:
❌ x-amz-mfa
❌ Object Locking:
❌ x-amz-bypass-governance-retention
❌ Request Payer:
❌ x-amz-request-payer
❌ Bucket Owner:
❌ x-amz-expected-bucket-owner | | ✅ [DeleteObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html) | ❌ Multi-factor authentication:
❌ x-amz-mfa
❌ Object Locking:
❌ x-amz-bypass-governance-retention
❌ Request Payer:
❌ x-amz-request-payer
❌ Bucket Owner:
❌ x-amz-expected-bucket-owner | -| ✅ [ListMultipartUploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html) | ✅ Query Parameters:
✅ delimiter
✅ encoding-type
✅ key-marker
✅️ max-uploads
✅ prefix
✅ upload-id-marker | +| ✅ [ListMultipartUploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html) | ✅ Query Parameters:
✅ delimiter
✅ encoding-type
✅ key-marker
✅️ max-uploads
✅ prefix
✅ upload-id-marker | | ✅ [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) | ✅ System Metadata:
✅ Content-Type
✅ Cache-Control
✅ Content-Disposition
✅ Content-Encoding
✅ Content-Language
✅ Expires
❌ Content-MD5
❌ Website:
❌ x-amz-website-redirect-location
❌ SSE-C:
❌ x-amz-server-side-encryption
❌ x-amz-server-side-encryption-customer-algorithm
❌ x-amz-server-side-encryption-customer-key
❌ x-amz-server-side-encryption-customer-key-MD5
❌ x-amz-server-side-encryption-aws-kms-key-id
❌ x-amz-server-side-encryption-context
❌ x-amz-server-side-encryption-bucket-key-enabled
❌ Request Payer:
❌ x-amz-request-payer
❌ Tagging:
❌ x-amz-tagging
❌ Object Locking:
❌ x-amz-object-lock-mode
❌ x-amz-object-lock-retain-until-date
❌ x-amz-object-lock-legal-hold
❌ ACL:
❌ x-amz-acl
❌ x-amz-grant-full-control
❌ x-amz-grant-read
❌ x-amz-grant-read-acp
❌ x-amz-grant-write-acp
❌ Storage class:
❌ x-amz-storage-class
❌ Bucket Owner:
❌ x-amz-expected-bucket-owner | | ✅ [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) | ❌ Bucket Owner:
❌ x-amz-expected-bucket-owner
❌ Request Payer:
❌ x-amz-request-payer | | ✅ [AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html) | ❌ Request Payer:
❌ x-amz-request-payer | diff --git a/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx b/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx index 43a460c9e17..43c59abaa73 100644 --- a/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx +++ b/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx @@ -43,7 +43,6 @@ This situation often arises in large, high-write tables (e.g., `your_table`, whi Since the wraparound prevention autovacuum cannot be stopped, the best approach is to provide the database with sufficient resources to complete the operation as quickly and efficiently as possible. 1. **Upgrade your Database Compute Instance:** - - **Action:** Temporarily scale up your instance's CPU (e.g., from `m6g.4xlarge` to `m6g.8xlarge` or higher). - **Why it helps:** More CPU cores and processing power will help the autovacuum operation run faster, reducing the overall time it impacts your database. - **Considerations:** This usually causes a brief downtime (typically 1-2 minutes) as the instance restarts. However, the autovacuum process is designed to pause and resume automatically. diff --git a/apps/docs/content/troubleshooting/how-to-delete-vercel-linked-projects-9d08aa.mdx b/apps/docs/content/troubleshooting/how-to-delete-vercel-linked-projects-9d08aa.mdx index 90e8989f2a2..5265d41de50 100644 --- a/apps/docs/content/troubleshooting/how-to-delete-vercel-linked-projects-9d08aa.mdx +++ b/apps/docs/content/troubleshooting/how-to-delete-vercel-linked-projects-9d08aa.mdx @@ -24,17 +24,14 @@ This method requires two steps - first delete in Supabase, then clean up in Verc 2. **Clean up in Vercel** After deleting from Supabase, clean up in Vercel: - - Navigate to your [Vercel dashboard](https://vercel.com/dashboard) - Go to the **Storage** tab - Click on the Supabase project (it will show as "uninstalled") ![Uninstalled Supabase project in Vercel Storage](/docs/img/troubleshooting/cf450bca-aad3-4783-ae3b-5cc83e0afa54.png) - - Scroll down and find the **Settings** tab in the sidebar ![Vercel project settings navigation](/docs/img/troubleshooting/da70bc33-f123-4567-8901-abcdef123456.png) - - Click **Delete Database** to completely remove it ![Delete Database button in Vercel settings](/docs/img/troubleshooting/c4e7b193-4567-8901-abcd-ef1234567890.png) @@ -84,7 +81,6 @@ If you want to move a Vercel-linked project to a different organization: 2. **Clean up in Vercel** After transferring, the project will show as "uninstalled" in Vercel but still appear under Storage. You need to manually delete it: - - Navigate to your [Vercel dashboard](https://vercel.com/dashboard) - Go to the **Storage** tab - Click on the Supabase project (it will show as "uninstalled") diff --git a/apps/docs/content/troubleshooting/pkce-flow-errors-cannot-parse-response-or-zgotmplz-in-magic-link-emails-433665.mdx b/apps/docs/content/troubleshooting/pkce-flow-errors-cannot-parse-response-or-zgotmplz-in-magic-link-emails-433665.mdx index 4aad6fcfb37..fdd60cd2fbd 100644 --- a/apps/docs/content/troubleshooting/pkce-flow-errors-cannot-parse-response-or-zgotmplz-in-magic-link-emails-433665.mdx +++ b/apps/docs/content/troubleshooting/pkce-flow-errors-cannot-parse-response-or-zgotmplz-in-magic-link-emails-433665.mdx @@ -32,7 +32,6 @@ The email templating system often uses a language like Go, which has built-in se You may observe two distinct issues: 1. **The `#ZgotmplZ` Error**: - - **Cause**: This error occurs when you attempt to use a non-standard URL scheme (like `your-app-scheme://` for a mobile app deep link) directly within a template variable like `{{ .SiteURL }}` in your email templates. Go's security features sanitize this perceived "unsafe" URL, replacing it with the `#ZgotmplZ` placeholder. This prevents the link from being rendered correctly and thus from working. 2. **The 'Cannot Parse Response' Error**: diff --git a/apps/docs/content/troubleshooting/realtime-project-suspended-for-exceeding-quotas.mdx b/apps/docs/content/troubleshooting/realtime-project-suspended-for-exceeding-quotas.mdx index 8644c9f4650..dc2eddd2bb7 100644 --- a/apps/docs/content/troubleshooting/realtime-project-suspended-for-exceeding-quotas.mdx +++ b/apps/docs/content/troubleshooting/realtime-project-suspended-for-exceeding-quotas.mdx @@ -37,7 +37,6 @@ In most cases, quota overages are accidental rather than intentional: ## What to do if your project is suspended 1. **Open a support ticket**: [Contact support](/dashboard/support/new) and include: - - Your project reference ID - A description of your Realtime use case (what features use Broadcast, Presence, or Postgres Changes) - An estimate of your expected concurrent connections and message throughput diff --git a/apps/docs/content/troubleshooting/supabase-cli-failed-sasl-auth-or-invalid-scram-server-final-message.mdx b/apps/docs/content/troubleshooting/supabase-cli-failed-sasl-auth-or-invalid-scram-server-final-message.mdx index 2bb26125c04..61b57decaf4 100644 --- a/apps/docs/content/troubleshooting/supabase-cli-failed-sasl-auth-or-invalid-scram-server-final-message.mdx +++ b/apps/docs/content/troubleshooting/supabase-cli-failed-sasl-auth-or-invalid-scram-server-final-message.mdx @@ -13,12 +13,10 @@ This typically indicates an authentication failure where the database connection **To resolve this, consider one of the following solutions:** 1. **Check Network Bans:** - - Navigate to your project's [Database Settings](/dashboard/project/_/database/settings) page. - Review any listed IP addresses that are blocked. Remove any entries that correspond to your current connection and then try the CLI action again. 2. **Use the old Password-Based authentication flow instead:** - - Provide your database password directly through an environment variable when running the CLI command. ```bash @@ -26,7 +24,6 @@ This typically indicates an authentication failure where the database connection ``` 3. **Skip the Pooler and connect directly to the database with the Supabase CLI (Requires IPv6):** - - If your network supports IPv6, you can use the beta CLI version with the `--skip-pooler` flag to bypass the connection pooler to avoid this particular issue. ```bash diff --git a/apps/docs/docs/ref/csharp/v0/release-notes.mdx b/apps/docs/docs/ref/csharp/v0/release-notes.mdx index 2ce380a99fc..df2d78c8fdf 100644 --- a/apps/docs/docs/ref/csharp/v0/release-notes.mdx +++ b/apps/docs/docs/ref/csharp/v0/release-notes.mdx @@ -265,7 +265,6 @@ Thanks [@wiverson](https://github.com/wiverson) for the work in this release! ## 0.9.0 - 2023-04-12 - Update dependency: gotrue-csharp@3.1.0 - - [Minor] Implements PKCE auth flow. SignIn using a provider now returns an instance of `ProviderAuthState` rather than a `string`. diff --git a/apps/docs/features/docs/Reference.introduction.tsx b/apps/docs/features/docs/Reference.introduction.tsx index f799668bfe3..5ccb90e47c3 100644 --- a/apps/docs/features/docs/Reference.introduction.tsx +++ b/apps/docs/features/docs/Reference.introduction.tsx @@ -10,13 +10,13 @@ import commonClientLibSections from '~/spec/common-client-libs-sections.json' wi function hasIntro(sections: typeof commonClientLibSections, excludeName?: string) { return Boolean( sections[0]?.type === 'markdown' && - sections[0]?.slug === 'introduction' && - (!excludeName || - !( - 'excludes' in sections[0] && - Array.isArray(sections[0].excludes) && - sections[0].excludes?.includes(excludeName) - )) + sections[0]?.slug === 'introduction' && + (!excludeName || + !( + 'excludes' in sections[0] && + Array.isArray(sections[0].excludes) && + sections[0].excludes?.includes(excludeName) + )) ) } diff --git a/apps/docs/features/docs/Reference.ui.tsx b/apps/docs/features/docs/Reference.ui.tsx index f9d13bef8a2..30721abeaab 100644 --- a/apps/docs/features/docs/Reference.ui.tsx +++ b/apps/docs/features/docs/Reference.ui.tsx @@ -200,7 +200,7 @@ function ParamOrTypeDetails({ paramOrType }: { paramOrType: object }) { 'description' in paramOrType ? (paramOrType.description as string) : isFromTypespec(paramOrType) - ? paramOrType.comment?.shortText ?? '' + ? (paramOrType.comment?.shortText ?? '') : '' const subContent = diff --git a/apps/docs/layouts/MainSkeleton.tsx b/apps/docs/layouts/MainSkeleton.tsx index a2f0bf178e8..6f899c66cfb 100644 --- a/apps/docs/layouts/MainSkeleton.tsx +++ b/apps/docs/layouts/MainSkeleton.tsx @@ -236,7 +236,7 @@ const MobileHeader = memo(function MobileHeader(props: MobileHeaderProps) { {mobileMenuOpen ? 'Close' : 'menuId' in props - ? levelsData[props.menuId]?.name ?? levelsData['home'].name + ? (levelsData[props.menuId]?.name ?? levelsData['home'].name) : props.menuName} diff --git a/apps/learn/components/side-navigation-item.tsx b/apps/learn/components/side-navigation-item.tsx index 619f4ae6bb1..a652774dd06 100644 --- a/apps/learn/components/side-navigation-item.tsx +++ b/apps/learn/components/side-navigation-item.tsx @@ -14,8 +14,7 @@ import { Badge, cn } from 'ui' // 2. AnchorHTMLAttributes - for standard HTML anchor props (className, etc) // We omit href from both since we compute it internally from item.href interface NavigationItemProps - extends Omit, - Omit, 'href'> { + extends Omit, Omit, 'href'> { item: SidebarNavItem onClick?: (e: React.MouseEvent) => void level?: number diff --git a/apps/studio/components/grid/components/editor/DateTimeEditor.tsx b/apps/studio/components/grid/components/editor/DateTimeEditor.tsx index 129cf6440be..445e55e1af7 100644 --- a/apps/studio/components/grid/components/editor/DateTimeEditor.tsx +++ b/apps/studio/components/grid/components/editor/DateTimeEditor.tsx @@ -18,8 +18,10 @@ import { TimestampInfo, timestampLocalFormatter } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' import { BlockKeys } from '../common/BlockKeys' -interface BaseEditorProps - extends RenderEditCellProps { +interface BaseEditorProps extends RenderEditCellProps< + TRow, + TSummaryRow +> { type: 'date' | 'datetime' | 'datetimetz' isNullable: boolean } diff --git a/apps/studio/components/grid/components/editor/JsonEditor.tsx b/apps/studio/components/grid/components/editor/JsonEditor.tsx index 4922d306c7a..bc30143a74d 100644 --- a/apps/studio/components/grid/components/editor/JsonEditor.tsx +++ b/apps/studio/components/grid/components/editor/JsonEditor.tsx @@ -25,8 +25,10 @@ const verifyJSON = (value: string) => { } } -interface JsonEditorProps - extends RenderEditCellProps { +interface JsonEditorProps extends RenderEditCellProps< + TRow, + TSummaryRow +> { isEditable: boolean onExpandEditor: (column: string, row: TRow) => void } diff --git a/apps/studio/components/grid/components/editor/SelectEditor.tsx b/apps/studio/components/grid/components/editor/SelectEditor.tsx index f2922a4e5c5..f217efa7383 100644 --- a/apps/studio/components/grid/components/editor/SelectEditor.tsx +++ b/apps/studio/components/grid/components/editor/SelectEditor.tsx @@ -1,8 +1,10 @@ import type { RenderEditCellProps } from 'react-data-grid' import { Select } from 'ui' -interface SelectEditorProps - extends RenderEditCellProps { +interface SelectEditorProps extends RenderEditCellProps< + TRow, + TSummaryRow +> { isNullable?: boolean options: { label: string; _value: string }[] } diff --git a/apps/studio/components/grid/components/editor/TimeEditor.tsx b/apps/studio/components/grid/components/editor/TimeEditor.tsx index ca89fb895d8..a6e863d7d47 100644 --- a/apps/studio/components/grid/components/editor/TimeEditor.tsx +++ b/apps/studio/components/grid/components/editor/TimeEditor.tsx @@ -10,8 +10,10 @@ function autoFocusAndSelect(input: HTMLInputElement | null) { input?.select() } -interface TimeEditorProps - extends RenderEditCellProps { +interface TimeEditorProps extends RenderEditCellProps< + TRow, + TSummaryRow +> { format: string } diff --git a/apps/studio/components/grid/utils/queueOperationUtils.ts b/apps/studio/components/grid/utils/queueOperationUtils.ts index 02dc378e8cc..d9a0ffe401d 100644 --- a/apps/studio/components/grid/utils/queueOperationUtils.ts +++ b/apps/studio/components/grid/utils/queueOperationUtils.ts @@ -12,8 +12,10 @@ import { QueuedOperationType, } from '@/state/table-editor-operation-queue.types' -interface EditCellKeyOperation - extends Omit { +interface EditCellKeyOperation extends Omit< + EditCellContentOperation, + 'payload' | 'id' | 'timestamp' +> { type: QueuedOperationType.EDIT_CELL_CONTENT tableId: number payload: { diff --git a/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx b/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx index e65f1d37d94..2e7e5a1d7e0 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx @@ -235,8 +235,8 @@ export function StorageSearchResults({ query }: StorageSearchResultsProps) { const totalBucketsEstimate = useMemo(() => { const fileBucketCount = fileBucketsEstimate ?? 0 - const analyticsBucketCount = isAnalyticsBucketsEnabled ? analyticsBuckets?.length ?? 0 : 0 - const vectorBucketCount = isVectorBucketsEnabled ? vectorBuckets?.length ?? 0 : 0 + const analyticsBucketCount = isAnalyticsBucketsEnabled ? (analyticsBuckets?.length ?? 0) : 0 + const vectorBucketCount = isVectorBucketsEnabled ? (vectorBuckets?.length ?? 0) : 0 return fileBucketCount + analyticsBucketCount + vectorBucketCount }, [ diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx index 74fda3915a0..a7672b64b28 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx @@ -130,7 +130,7 @@ export const FeaturePreviewModal = () => { >
- {flags[selectedFeature.key] ?? false ? ( + {(flags[selectedFeature.key] ?? false) ? ( ) : ( diff --git a/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx b/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx index 4a7ae5ca50a..ac0177f63ca 100644 --- a/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx +++ b/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx @@ -47,13 +47,13 @@ export function UpdateBillingAddressModal() { const shouldShow = Boolean( IS_PLATFORM && - showMissingAddressModal && - org && - org.plan.id !== 'free' && - org.organization_missing_address && - !org.billing_partner && - permissionsLoaded && - canBillingWrite + showMissingAddressModal && + org && + org.plan.id !== 'free' && + org.organization_missing_address && + !org.billing_partner && + permissionsLoaded && + canBillingWrite ) const { diff --git a/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx b/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx index f2b3365e2eb..bc0399d6d17 100644 --- a/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx @@ -155,7 +155,7 @@ export const PerformanceSettingsForm = () => { if (!isUpdatingDatabaseForm) { databaseForm.reset({ DB_MAX_POOL_SIZE: - authConfig?.DB_MAX_POOL_SIZE !== null ? authConfig?.DB_MAX_POOL_SIZE ?? 10 : 10, + authConfig?.DB_MAX_POOL_SIZE !== null ? (authConfig?.DB_MAX_POOL_SIZE ?? 10) : 10, DB_MAX_POOL_SIZE_UNIT: authConfig?.DB_MAX_POOL_SIZE_UNIT !== null ? authConfig?.DB_MAX_POOL_SIZE_UNIT diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx index 511257ab827..13e51d0116b 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx @@ -197,7 +197,7 @@ export const PolicyEditorPanel = memo(function ({ command, roles: roles.length === 0 ? 'public' : roles, using: using ?? '', - check: command === 'insert' ? using ?? '' : check ?? '', + check: command === 'insert' ? (using ?? '') : (check ?? ''), }) setError(undefined) diff --git a/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx b/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx index 1a576248d7f..25b50eeefe1 100644 --- a/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx @@ -230,7 +230,7 @@ export const UserOverview = ({ user, onDeleteSuccess }: UserOverviewProps) => { const providerName = provider.name === 'email' ? provider.name.toLowerCase() - : providerMeta?.title ?? provider.name + : (providerMeta?.title ?? provider.name) const isActive = data?.[enabledProperty as keyof typeof data] ?? false return ( diff --git a/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx b/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx index 63f703d7325..df5da8a97f4 100644 --- a/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx +++ b/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx @@ -224,7 +224,7 @@ export const DatabaseConnectionString = () => { connectionInfo, poolingInfo: { connectionString: sharedPoolerConfig?.connection_string ?? '', - db_host: isReplicaSelected ? connectionInfo.db_host : sharedPoolerConfig?.db_host ?? '', + db_host: isReplicaSelected ? connectionInfo.db_host : (sharedPoolerConfig?.db_host ?? ''), db_name: sharedPoolerConfig?.db_name ?? '', db_port: sharedPoolerConfig?.db_port ?? 0, db_user: sharedPoolerConfig?.db_user ?? '', @@ -236,11 +236,11 @@ export const DatabaseConnectionString = () => { connectionInfo, poolingInfo: { connectionString: isReplicaSelected - ? poolingConfiguration?.connection_string.replace( + ? (poolingConfiguration?.connection_string.replace( poolingConfiguration?.db_host, connectionInfo.db_host - ) ?? '' - : poolingConfiguration?.connection_string ?? '', + ) ?? '') + : (poolingConfiguration?.connection_string ?? ''), db_host: isReplicaSelected ? connectionInfo.db_host : poolingConfiguration?.db_host, db_name: poolingConfiguration?.db_name ?? '', db_port: poolingConfiguration?.db_port ?? 0, @@ -469,7 +469,7 @@ export const DatabaseConnectionString = () => { ...CONNECTION_PARAMETERS.host, value: isReplicaSelected ? connectionInfo.db_host - : poolingConfiguration?.db_host ?? '', + : (poolingConfiguration?.db_host ?? ''), }, { ...CONNECTION_PARAMETERS.port, diff --git a/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts b/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts index 1843c93595f..7396d28ba29 100644 --- a/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts +++ b/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts @@ -9,7 +9,7 @@ export function useMcpUrl( projectKeys: StepContentProps['projectKeys'] ): string { const readonly = Boolean(state.mcpReadonly) - const baseUrl = IS_PLATFORM ? 'https://mcp.supabase.com' : projectKeys.apiUrl ?? '' + const baseUrl = IS_PLATFORM ? 'https://mcp.supabase.com' : (projectKeys.apiUrl ?? '') return useMemo(() => { const params = new URLSearchParams() diff --git a/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx b/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx index 56a7e863902..1dcff8f5b3a 100644 --- a/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx +++ b/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx @@ -39,7 +39,7 @@ export const ExtensionRow = ({ extension }: ExtensionRowProps) => { const extensionMeta = extensions.find((item) => item.name === extension.name) const docsUrl = extensionMeta?.link.startsWith('/guides') ? `${DOCS_URL}${extensionMeta?.link}` - : extensionMeta?.link ?? undefined + : (extensionMeta?.link ?? undefined) const { mutate: disableExtension, isPending: isDisabling } = useDatabaseExtensionDisableMutation({ onSuccess: () => { diff --git a/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx b/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx index f4dfd26a69e..0a11a6573e1 100644 --- a/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx +++ b/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx @@ -36,7 +36,7 @@ export const Extensions = () => { const extensions = filterString.length === 0 - ? data ?? [] + ? (data ?? []) : (data ?? []).filter((ext) => { const nameMatchesSearch = ext.name.toLowerCase().includes(filterString.toLowerCase()) const searchTermsMatchesSearch = (SEARCH_TERMS[ext.name] || []).some((x) => diff --git a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx index 8b5203f133e..abfbd2ca145 100644 --- a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx +++ b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx @@ -47,9 +47,9 @@ const Migrations = () => { const migrations = search.length === 0 ? data - : data.filter( + : (data.filter( (migration) => migration.version.includes(search) || migration.name?.includes(search) - ) ?? [] + ) ?? []) return ( <> diff --git a/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx b/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx index 2ecd97f29d3..d2e72f03bc9 100644 --- a/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx +++ b/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx @@ -8,11 +8,10 @@ import { } from './Privileges.constants' import { usePrivilegesState } from './Privileges.utils' -export interface PrivilegesTableProps - extends Pick< - ReturnType, - 'tableCheckedStates' | 'columnCheckedStates' | 'toggleTablePrivilege' | 'toggleColumnPrivilege' - > { +export interface PrivilegesTableProps extends Pick< + ReturnType, + 'tableCheckedStates' | 'columnCheckedStates' | 'toggleTablePrivilege' | 'toggleColumnPrivilege' +> { columnPrivileges: ColumnPrivilege[] disabled: boolean isApplyingChanges?: boolean diff --git a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx index 4179dda8497..14b67f4c9be 100644 --- a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx +++ b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx @@ -94,7 +94,7 @@ export const Destinations = () => { const hasDestinations = isDestinationsSuccess && destinationsData?.destinations.length > 0 const filteredDestinations = filterString.length === 0 - ? destinations ?? [] + ? (destinations ?? []) : (destinations ?? []).filter((destination) => destination.name.toLowerCase().includes(filterString.toLowerCase()) ) diff --git a/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx b/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx index 4cccaf04f92..bddb229e27e 100644 --- a/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx +++ b/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx @@ -126,13 +126,13 @@ export const UpdateVersionModal = ({

Current version:

{' '} - {isLoadingVersion ? 'Loading...' : currentVersionName ?? 'Unknown'} + {isLoadingVersion ? 'Loading...' : (currentVersionName ?? 'Unknown')}

New version:

{' '} - {isLoadingVersion ? 'Loading...' : newVersionName ?? 'Unknown'} + {isLoadingVersion ? 'Loading...' : (newVersionName ?? 'Unknown')}
diff --git a/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx b/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx index b73c6628a59..e6226e69e2e 100644 --- a/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx +++ b/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx @@ -294,7 +294,9 @@ export const RestoreToNewProject = () => {

Previous restorations

- {previousClones?.map((c) => )} + {previousClones?.map((c) => ( + + ))}
) : null} diff --git a/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx b/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx index 26fe813f5bc..8a836b701cc 100644 --- a/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx +++ b/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx @@ -61,7 +61,7 @@ export const ColumnList = ({ const columns = (filterString.length === 0 - ? selectedTable?.columns ?? [] + ? (selectedTable?.columns ?? []) : selectedTable?.columns?.filter((column) => column.name.includes(filterString))) ?? [] const { isSchemaLocked } = useIsProtectedSchema({ schema: selectedTable?.schema ?? '' }) diff --git a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx index ed7c4101113..d1fc6651aee 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx @@ -30,7 +30,7 @@ export const AutoScaleFields = ({ form }: AutoScaleFieldProps) => { const _minIncrementGb = minIncrementGb ?? DISK_AUTOSCALE_CONFIG_DEFAULTS.minIncrementSize const _maxSizeGb = errors.maxSizeGb ? DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb - : maxSizeGb ?? DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb + : (maxSizeGb ?? DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb) const growthSize = Math.floor(totalSize * (_growthPercent / 100)) const autoscaleGrowValue = Math.min( diff --git a/apps/studio/components/interfaces/Docs/Authentication.tsx b/apps/studio/components/interfaces/Docs/Authentication.tsx index aa4d72d1668..d38f2440fe8 100644 --- a/apps/studio/components/interfaces/Docs/Authentication.tsx +++ b/apps/studio/components/interfaces/Docs/Authentication.tsx @@ -28,11 +28,11 @@ const Authentication = ({ selectedLang, showApiKey }: AuthenticationProps) => { // [Joshen] ShowApiKey should really be a boolean, its confusing const defaultApiKey = showApiKey !== 'SUPABASE_KEY' - ? anonKey?.api_key ?? 'SUPABASE_CLIENT_API_KEY' + ? (anonKey?.api_key ?? 'SUPABASE_CLIENT_API_KEY') : 'SUPABASE_CLIENT_API_KEY' const serviceApiKey = showApiKey !== 'SUPABASE_KEY' - ? serviceKey?.api_key ?? 'SUPABASE_SERVICE_KEY' + ? (serviceKey?.api_key ?? 'SUPABASE_SERVICE_KEY') : 'SUPABASE_SERVICE_KEY' return ( diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx index e8c224d68e3..255741adb57 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx @@ -63,9 +63,9 @@ export const EdgeFunctionSecrets = () => { const secrets = searchString.length > 0 - ? data?.filter((secret) => secret.name.toLowerCase().includes(searchString.toLowerCase())) ?? - [] - : data ?? [] + ? (data?.filter((secret) => secret.name.toLowerCase().includes(searchString.toLowerCase())) ?? + []) + : (data ?? []) const headers = [ Name, diff --git a/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx b/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx index f014e3ec747..f2e38f6ddae 100644 --- a/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx +++ b/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx @@ -176,7 +176,7 @@ export const APIKeys = () => { ? 'JWT secret update failed, new API key may have issues' : jwtSecretUpdateStatus === JwtSecretUpdateStatus.Updating ? 'Updating JWT secret...' - : publishableKey?.api_key ?? anonKey?.api_key + : (publishableKey?.api_key ?? anonKey?.api_key) } /> diff --git a/apps/studio/components/interfaces/Home/ServiceStatus.tsx b/apps/studio/components/interfaces/Home/ServiceStatus.tsx index d6e0b9ccecd..0b1205906a6 100644 --- a/apps/studio/components/interfaces/Home/ServiceStatus.tsx +++ b/apps/studio/components/interfaces/Home/ServiceStatus.tsx @@ -195,7 +195,7 @@ export const ServiceStatus = () => { docsUrl: undefined, isLoading, // If PostgREST has an empty schema, it means it's been disabled - status: extractDbSchema(restStatus) === '' ? 'DISABLED' : restStatus?.status ?? 'UNHEALTHY', + status: extractDbSchema(restStatus) === '' ? 'DISABLED' : (restStatus?.status ?? 'UNHEALTHY'), logsUrl: '/logs/postgrest-logs', }, ...(authEnabled diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx index be8d0c1e921..7151241b9db 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx @@ -216,7 +216,8 @@ export const CronJobTableCell = ({

- Are you sure you want to {active ? 'disable' : 'enable'} the cron job "{jobname}"?{' '} + Are you sure you want to {active ? 'disable' : 'enable'} the cron job "{jobname} + "?{' '}

diff --git a/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx b/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx index 57fc0b77400..5cc6384f5bf 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx @@ -473,17 +473,17 @@ const TEMPLATE_INTEGRATIONS: Array = [ case 'overview': return dynamic( () => - import( - 'components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview' - ).then((mod) => mod.StripeSyncInstallationPage), + import('components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview').then( + (mod) => mod.StripeSyncInstallationPage + ), { loading: Loading } ) case 'settings': return dynamic( () => - import( - 'components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage' - ).then((mod) => mod.StripeSyncSettingsPage), + import('components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage').then( + (mod) => mod.StripeSyncSettingsPage + ), { loading: Loading } ) } diff --git a/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx b/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx index 7ac73ae4dfe..dd6aaa902f5 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx @@ -76,9 +76,9 @@ export const useAvailableIntegrations = () => { case 'overview': return dynamic( () => - import( - 'components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index' - ).then((mod) => mod.IntegrationOverviewTabV2), + import('components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index').then( + (mod) => mod.IntegrationOverviewTabV2 + ), { loading: Loading, } diff --git a/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx b/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx index ef6c0330bd1..8cfdf7bd1a5 100644 --- a/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx +++ b/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx @@ -310,7 +310,7 @@ const ProjectLinker = ({ icon={
{selectedForeignProject - ? getForeignProjectIcon?.(selectedForeignProject) ?? integrationIcon + ? (getForeignProjectIcon?.(selectedForeignProject) ?? integrationIcon) : integrationIcon}
} diff --git a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx index c77b2cebfaa..1bcb5bf50de 100644 --- a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx +++ b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx @@ -211,7 +211,7 @@ export function LogDrainDestinationSheetForm({ } const DEFAULT_HEADERS = mode === 'create' - ? CREATE_DEFAULT_HEADERS_BY_TYPE[defaultType] ?? {} + ? (CREATE_DEFAULT_HEADERS_BY_TYPE[defaultType] ?? {}) : defaultConfig?.headers || {} const sentryEnabled = useFlag('SentryLogDrain') diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx index 08bb17f6621..0bd9a8daa23 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx @@ -186,8 +186,8 @@ const PaymentMethodSelection = forwardRef(function PaymentMethodSelection( return { paymentMethod: { id: selectedPaymentMethod } as PaymentMethod, customerName: useAsDefaultBillingAddress ? customerProfile?.billing_name || '' : null, - address: useAsDefaultBillingAddress ? customerProfile?.address ?? null : null, - taxId: useAsDefaultBillingAddress ? taxId ?? null : null, + address: useAsDefaultBillingAddress ? (customerProfile?.address ?? null) : null, + taxId: useAsDefaultBillingAddress ? (taxId ?? null) : null, } } } diff --git a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx index b2fd21acacb..b8e4ccce9ff 100644 --- a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx +++ b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx @@ -290,7 +290,7 @@ export const NewOrgForm = ({ payment_method: paymentMethodId, billing_name: dbTier === 'FREE' ? undefined : customerData?.billing_name, address: dbTier === 'FREE' ? null : customerData?.address, - tax_id: dbTier === 'FREE' ? undefined : customerData?.tax_id ?? undefined, + tax_id: dbTier === 'FREE' ? undefined : (customerData?.tax_id ?? undefined), }) } diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx index 083253d99fc..04006fafd48 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx @@ -127,7 +127,7 @@ export const MemberRow = ({ member }: MemberRowProps) => { const roleName = (role?.name ?? '').split('_')[0] const projectsApplied = role?.projects.length === 0 - ? orgProjects?.map((p) => p.name) ?? [] + ? (orgProjects?.map((p) => p.name) ?? []) : (role?.projects ?? []) .map(({ ref }) => orgProjects?.find((p) => p.ref === ref)?.name ?? '') .filter((x) => x.length > 0) diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx index c8104faa3b5..256340eb27e 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx @@ -112,7 +112,7 @@ export const PlatformWebhooksPage = ({ scope, endpointId }: PlatformWebhooksPage ) const isEndpointView = !!selectedEndpoint const headerTitle = isEndpointView ? 'Endpoint' : scopeLabel - const headerDescription = isEndpointView ? selectedEndpoint?.url ?? '' : scopeDescription + const headerDescription = isEndpointView ? (selectedEndpoint?.url ?? '') : scopeDescription const endpointPendingDelete = useMemo( () => endpoints.find((endpoint) => endpoint.id === endpointIdPendingDelete) ?? null, @@ -380,7 +380,7 @@ export const PlatformWebhooksPage = ({ scope, endpointId }: PlatformWebhooksPage mode={panel === 'create' ? 'create' : 'edit'} scope={scope} orgSlug={scope === 'project' ? selectedOrganization?.slug : undefined} - endpoint={panel === 'edit' ? selectedEndpoint ?? undefined : undefined} + endpoint={panel === 'edit' ? (selectedEndpoint ?? undefined) : undefined} enabledOverride={panel === 'edit' ? editEnabledOverride : null} eventTypes={eventTypeOptions} onClose={() => { diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx index 5d0b0893384..8ea337222de 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx @@ -87,7 +87,7 @@ export const Introduction = ({ showKeys, language, apikey, endpoint }: ContentPr size="small" value={ showKeys - ? serviceApiKey ?? 'SUPABASE_CLIENT_SERVICE_KEY' + ? (serviceApiKey ?? 'SUPABASE_CLIENT_SERVICE_KEY') : 'Reveal API keys via dropdown in the header' } className="w-full" diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx index 6ab7cd4cfb6..a2ead023666 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx @@ -57,7 +57,7 @@ export const ProjectAPIDocs = () => { const { anonKey } = getKeys(apiKeys) const apikey = showKeys - ? anonKey?.api_key ?? 'SUPABASE_CLIENT_ANON_KEY' + ? (anonKey?.api_key ?? 'SUPABASE_CLIENT_ANON_KEY') : 'SUPABASE_CLIENT_ANON_KEY' return ( diff --git a/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx b/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx index 9c6b54b3ad0..01d41c55a13 100644 --- a/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx @@ -88,8 +88,8 @@ export const PostgresVersionSelector = ({ const versions = type === 'create' - ? createVersions?.available_versions ?? [] - : unpauseVersions?.available_versions ?? [] + ? (createVersions?.available_versions ?? []) + : (unpauseVersions?.available_versions ?? []) const availableVersions = versions.sort((a, b) => a.version.localeCompare(b.version)).reverse() const { postgresVersionSelection } = form.watch() diff --git a/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx b/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx index a9b3da46e77..4970b6440de 100644 --- a/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx +++ b/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx @@ -46,7 +46,7 @@ export const ActivityStats = () => { [migrationsData] ) const migrationLabelText = - migrationsData.length === 0 ? 'No migrations' : latestMigration?.name ?? 'Unknown' + migrationsData.length === 0 ? 'No migrations' : (latestMigration?.name ?? 'Unknown') const { data: backupsData, isPending: isLoadingBackups } = useBackupsQuery({ projectRef: project?.ref, diff --git a/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx b/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx index fbdf0c87c49..26f78ae7b07 100644 --- a/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx +++ b/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx @@ -131,7 +131,7 @@ export const ServiceStatus = () => { docsUrl: undefined, isLoading, // If PostgREST has an empty schema, it means it's been disabled - status: extractDbSchema(restStatus) === '' ? 'DISABLED' : restStatus?.status ?? 'UNHEALTHY', + status: extractDbSchema(restStatus) === '' ? 'DISABLED' : (restStatus?.status ?? 'UNHEALTHY'), logsUrl: '/logs/postgrest-logs', }, ...(authEnabled diff --git a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsTableColumns.tsx b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsTableColumns.tsx index 137e3b9b2d7..77ee666ff8d 100644 --- a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsTableColumns.tsx +++ b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsTableColumns.tsx @@ -71,7 +71,7 @@ export function useQueryInsightsTableColumns({ name: col.name, cellClass: `column-${col.id}`, resizable: true, - minWidth: col.id === 'prop_total_time' ? timeConsumedWidth : col.minWidth ?? 120, + minWidth: col.id === 'prop_total_time' ? timeConsumedWidth : (col.minWidth ?? 120), sortable: isSortable, headerCellClass: 'first:pl-6 cursor-pointer', renderHeaderCell: () => { diff --git a/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts b/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts index 59a635f358b..65128a13482 100644 --- a/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts +++ b/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts @@ -49,7 +49,7 @@ export function useSupamonitorIndexAdvisor(rows: QueryPerformanceRow[]): QueryPe // undefined/pending means data hasn't arrived yet — store undefined so // classifyQuery can defer slow classification and avoid flicker. const isReady = result?.status === 'success' || result?.status === 'error' - return [query, isReady ? result.data ?? null : undefined] + return [query, isReady ? (result.data ?? null) : undefined] }) ) @@ -57,6 +57,6 @@ export function useSupamonitorIndexAdvisor(rows: QueryPerformanceRow[]): QueryPe ...row, index_advisor_result: resultByQuery.has(row.query) ? resultByQuery.get(row.query) - : row.index_advisor_result ?? null, + : (row.index_advisor_result ?? null), })) } diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx index 21524688097..ca0a1306058 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx @@ -109,7 +109,7 @@ export const QueryPerformanceGrid = ({ minWidth: col.id === 'prop_total_time' ? calculateTimeConsumedWidth((aggregatedData as any) ?? []) - : col.minWidth ?? 120, + : (col.minWidth ?? 120), sortable: !nonSortableColumns.includes(col.id), headerCellClass: 'first:pl-6 cursor-pointer', renderHeaderCell: () => { diff --git a/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx b/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx index ddb07e9ba81..ec63ddb3a6b 100644 --- a/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx +++ b/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx @@ -33,10 +33,10 @@ export const RoleImpersonationSelector = ({ const isAuthenticatedOptionFullySelected = Boolean( selectedOption === 'authenticated' && - state.role?.type === 'postgrest' && - state.role.role === 'authenticated' && - (('user' in state.role && state.role.user) || - ('externalAuth' in state.role && state.role.externalAuth)) // Check for either auth type + state.role?.type === 'postgrest' && + state.role.role === 'authenticated' && + (('user' in state.role && state.role.user) || + ('externalAuth' in state.role && state.role.externalAuth)) // Check for either auth type ) function onSelectedChange(value: PostgrestRole) { diff --git a/apps/studio/components/interfaces/SQLEditor/README.md b/apps/studio/components/interfaces/SQLEditor/README.md index 1370eb5885f..57eba931f60 100644 --- a/apps/studio/components/interfaces/SQLEditor/README.md +++ b/apps/studio/components/interfaces/SQLEditor/README.md @@ -5,7 +5,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, ## UI structure - Folders and snippets (in the product menu) are rendered via `SQLEditorMenu` and `SQLEditorNav`, in which the data are all loaded from the API via React Query directly. (Refer to point 3 under "Data Structure" below) - - [`SQLEditorMenu`](https://github.com/supabase/supabase/blob/master/apps/studio/components/layouts/SQLEditorLayout/SQLEditorMenu.tsx): Wraps around `SQLEditorNav` + renders search input + View running queries button - [`SQLEditorNav`](https://github.com/supabase/supabase/blob/master/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx): Renders the 3 collapsible snippet sections @@ -26,7 +25,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, ## Data fetching - The endpoint to fetch snippets and folders are via [`useSQLSnippetFoldersQuery`](https://github.com/supabase/supabase/blob/master/apps/studio/data/content/sql-folders-query.ts) and [`useSqlSnippetsQuery`](https://github.com/supabase/supabase/blob/master/apps/studio/data/content/sql-snippets-query.ts), both of which are paginated (limit set at 100) - - [`useSQLSnippetFoldersQuery`](https://github.com/supabase/supabase/blob/master/apps/studio/data/content/sql-folders-query.ts): Specifically for fetching private snippets and folders - [`useSqlSnippetsQuery`](https://github.com/supabase/supabase/blob/master/apps/studio/data/content/sql-snippets-query.ts): For fetching shared and favorite snippets @@ -39,7 +37,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, - Snippets and folders are all initially loaded via React Query in [`SQLEditorNav`](https://github.com/supabase/supabase/blob/master/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx), which are then initialized into the Valtio store via [`snapV2.addSnippet`](https://github.com/supabase/supabase/blob/master/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx#L415) calls in the `useEffects` - On `/editor/sql` - - We'll redirect users to the last visited snippet if there's one (`/editor/sql/[id]`), otherwise will redirect to `/editor/sql/new` (within [`[id].tsx`](https://github.com/supabase/supabase/blob/master/apps/studio/pages/project/%5Bref%5D/sql/%5Bid%5D.tsx) ) - On `/editor/sql/[id]` @@ -48,7 +45,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, ### Writing a snippet - On `/editor/sql/new`: - - The first character input will [update the Valtio store](https://github.com/supabase/supabase/blob/master/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx#L192) with a snippet skeleton via `snapV2.addSnippet` and user will be redirected to `/editor/sql/[id]`, using the `id` from the skeleton - Note that `snapV2.addSnippet` only handles adding snippets to the store and does not queue the snippet for saving - Subsequent character inputs will follow below as per `/editor/sql/[id]` @@ -60,7 +56,6 @@ Quick run-through of the different building blocks that make up the SQL Editor, ### Running a snippet - There's several safeguards in place before we run the query - - [Check for destructive operations](https://github.com/supabase/supabase/blob/master/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx#L293): Will open a confirmation modal before running the query - [Check for update statements without where clause](https://github.com/supabase/supabase/blob/master/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx#L300): Will open a confirmation modal before running the query - [Append a preset limit to the query if it's a select](https://github.com/supabase/supabase/blob/master/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx#L333): To prevent accidentally running an expensive query on the database. Users can explicitly opt out of this to set "No limit" diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx b/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx index 7f8898d5a67..56c376be175 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx @@ -204,7 +204,7 @@ export const SQLEditor = () => { const editor = editorRef.current const monaco = monacoRef.current - const startLineNumber = hasSelection ? editor?.getSelection()?.startLineNumber ?? 0 : 0 + const startLineNumber = hasSelection ? (editor?.getSelection()?.startLineNumber ?? 0) : 0 const formattedError = error.formattedError ?? '' const lineError = formattedError.slice(formattedError.indexOf('LINE')) @@ -280,7 +280,7 @@ export const SQLEditor = () => { const selection = editor.getSelection() const selectedValue = selection ? editor.getModel()?.getValueInRange(selection) : undefined const sql = snippet - ? (selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql + ? ((selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql) : selectedValue || editorRef.current?.getValue() const formattedSql = formatSql(sql) @@ -318,7 +318,7 @@ export const SQLEditor = () => { const selectedValue = selection ? editor.getModel()?.getValueInRange(selection) : undefined const sql = snippet - ? (selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql + ? ((selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql) : selectedValue || editorRef.current?.getValue() const hasDestructiveOperations = checkDestructiveQuery(sql) @@ -418,7 +418,7 @@ export const SQLEditor = () => { const selectedValue = selection ? editor.getModel()?.getValueInRange(selection) : undefined const sql = snippet - ? (selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql + ? ((selectedValue || editorRef.current?.getValue()) ?? snippet.snippet.content?.sql) : selectedValue || editorRef.current?.getValue() // Check for multiple statements - EXPLAIN only works on a single statement @@ -881,7 +881,7 @@ export const SQLEditor = () => { snippetName={ urlId === 'new' ? generatedNewSnippetName - : snapV2.snippets[id]?.snippet.name ?? generatedNewSnippetName + : (snapV2.snippets[id]?.snippet.name ?? generatedNewSnippetName) } className={cn(isDiffOpen && 'hidden')} editorRef={editorRef} diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts index 0b36ab1e4b3..9845ca03f2b 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts @@ -80,7 +80,7 @@ export const generateNodes = ({ region: primary.cloud_provider === 'FLY' ? { name: 'Singapore (sin)', key: 'SOUTHEAST_ASIA' } - : primaryRegion ?? { name: primary.region }, + : (primaryRegion ?? { name: primary.region }), provider: primary.cloud_provider, inserted_at: primary.inserted_at, computeSize: primary.size, diff --git a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx index 243df5a923d..688cf480c36 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx @@ -41,7 +41,7 @@ const VercelIntegrationConnectionForm = ({ // but through a separate marketplace mechanism. It's not theoretically necessary, but we might have some stale data. const { data: org } = useSelectedOrganizationQuery() const envSyncTargets = - org?.managed_by === 'vercel-marketplace' ? [] : connection.env_sync_targets ?? [] + org?.managed_by === 'vercel-marketplace' ? [] : (connection.env_sync_targets ?? []) const FormSchema = z.object({ environmentVariablesProduction: z.boolean().default(envSyncTargets.includes('production')), diff --git a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts index 46d2e1c0032..5515dd4c94b 100644 --- a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts +++ b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts @@ -811,7 +811,7 @@ const LOG_TABLE_TO_SERVICE_LABEL: Record = { function extractServiceLabelFromSql(sql: string): string | null { const match = sql.match(/\bfrom\s+(\w+)/i) const tableName = match?.[1] - return tableName ? LOG_TABLE_TO_SERVICE_LABEL[tableName] ?? null : null + return tableName ? (LOG_TABLE_TO_SERVICE_LABEL[tableName] ?? null) : null } export function buildLogsPrompt(rows: LogData[], queryType?: string, sqlQuery?: string): string { diff --git a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx index ab73a2db457..62552e195b1 100644 --- a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx @@ -109,7 +109,7 @@ export const EditBucketModal = ({ visible, bucket, onClose }: EditBucketModalPro name: bucket?.name ?? '', public: bucket?.public, has_file_size_limit: Boolean(bucket?.file_size_limit), - formatted_size_limit: bucket?.file_size_limit ? fileSizeLimit ?? 0 : undefined, + formatted_size_limit: bucket?.file_size_limit ? (fileSizeLimit ?? 0) : undefined, allowed_mime_types: (bucket?.allowed_mime_types ?? []).join(', '), } diff --git a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx index 91f29c19f7c..6246d881d6e 100644 --- a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx +++ b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx @@ -108,7 +108,7 @@ function ProjectSelector({ form, orgSlug, projectRef }: ProjectSelectorProps) { ) : !field.value || field.value === NO_PROJECT_MARKER ? ( 'No specific project' ) : ( - project?.name ?? 'Unknown project' + (project?.name ?? 'Unknown project') )} ) diff --git a/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx b/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx index 37613bfa3e2..ea0b66407c7 100644 --- a/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx @@ -116,7 +116,7 @@ const DeleteConfirmationDialogs = ({ const numRows = snap.confirmationDialog?.type === 'row' ? snap.confirmationDialog.allRowsSelected - ? snap.confirmationDialog.numRows ?? 0 + ? (snap.confirmationDialog.numRows ?? 0) : snap.confirmationDialog.rows.length : 0 diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx index 8fd48e910d2..a828d212864 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx @@ -725,7 +725,7 @@ export const createTable = async ({ async (span) => { const rowCount = importContent.file ? importContent.rowCount - : importContent.rows?.length ?? 0 + : (importContent.rows?.length ?? 0) span.setAttribute('import.row_count', rowCount) span.setAttribute('import.method', importContent.file ? 'csv' : 'paste') diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx index 2172a604f16..b163ab1d651 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx @@ -126,9 +126,9 @@ const useTableApiAccessHandler = ( const canResolvePrivilegeParams = Boolean( shouldReadExistingGrants && - project?.ref && - permissionsTemplateSchema && - permissionsTemplateTable + project?.ref && + permissionsTemplateSchema && + permissionsTemplateTable ) const isPrivilegesQueryEnabled = enabled && canResolvePrivilegeParams const apiAccessStatus = useTableApiAccessQuery( diff --git a/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx b/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx index 64e0e756627..0757e887775 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx @@ -112,8 +112,8 @@ export function generateDynamicColumns(data: ColumnSchema[]): { const value = row.getValue('status') const label = value != null - ? STATUS_CODE_LABELS[String(value) as keyof typeof STATUS_CODE_LABELS] ?? - 'Unknown status' + ? (STATUS_CODE_LABELS[String(value) as keyof typeof STATUS_CODE_LABELS] ?? + 'Unknown status') : null return (
diff --git a/apps/studio/components/layouts/AppLayout/AppLayoutDropdown.tsx b/apps/studio/components/layouts/AppLayout/AppLayoutDropdown.tsx index dd603b84db3..958dd548ad2 100644 --- a/apps/studio/components/layouts/AppLayout/AppLayoutDropdown.tsx +++ b/apps/studio/components/layouts/AppLayout/AppLayoutDropdown.tsx @@ -16,8 +16,7 @@ export function AppLayoutDropdownError({ message }: AppLayoutDropdownErrorProps) ) } -interface AppLayoutDropdownTriggerButtonProps - extends React.ButtonHTMLAttributes { +interface AppLayoutDropdownTriggerButtonProps extends React.ButtonHTMLAttributes { className?: string } diff --git a/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx b/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx index 7588622b55a..1449d9e9b11 100644 --- a/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx +++ b/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx @@ -57,9 +57,9 @@ export const BranchDropdown = ({ branches && branches.length > 0 ? mainBranch ? [mainBranch].concat(restOfBranches ?? []) - : restOfBranches ?? [] + : (restOfBranches ?? []) : [defaultMainBranch] - const branchList = isBranchingEnabled ? sortedBranches ?? [] : [defaultMainBranch] + const branchList = isBranchingEnabled ? (sortedBranches ?? []) : [defaultMainBranch] const commandContent = ( { const shouldFetch = Boolean( !!slug && - org?.plan?.id !== 'free' && - isDismissLoaded && - !isDismissed && - !!org?.organization_missing_tax_id + org?.plan?.id !== 'free' && + isDismissLoaded && + !isDismissed && + !!org?.organization_missing_tax_id ) const { data: customerProfile } = useOrganizationCustomerProfileQuery( { slug }, diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts index 3aac3cf2469..fede88d68ac 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts +++ b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts @@ -17,7 +17,7 @@ export function getProjectBranchSelectorState(params: { const { selectedBranch, isBranchingEnabled, selectedOrganization } = params const isMainBranch = !isBranchingEnabled || selectedBranch?.is_default === true - const branchDisplayName = isBranchingEnabled ? selectedBranch?.name ?? 'main' : 'main' + const branchDisplayName = isBranchingEnabled ? (selectedBranch?.name ?? 'main') : 'main' const selectedOrgInitial = selectedOrganization?.name?.trim().charAt(0).toUpperCase() ?? 'O' const organizationHref = selectedOrganization?.slug ? `/org/${selectedOrganization.slug}` diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx index 46fabb5d205..ad7a3c22c87 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx @@ -38,8 +38,10 @@ import { cn, } from 'ui' -interface SQLEditorTreeViewItemProps - extends Omit, 'name' | 'xPadding'> { +interface SQLEditorTreeViewItemProps extends Omit< + ComponentProps, + 'name' | 'xPadding' +> { element: any isMultiSelected?: boolean status?: 'editing' | 'saving' | 'idle' diff --git a/apps/studio/components/layouts/Tabs/Tabs.tsx b/apps/studio/components/layouts/Tabs/Tabs.tsx index 842caec30d2..a84460da489 100644 --- a/apps/studio/components/layouts/Tabs/Tabs.tsx +++ b/apps/studio/components/layouts/Tabs/Tabs.tsx @@ -140,7 +140,7 @@ export const EditorTabs = () => { diff --git a/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx b/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx index 9ae8e9b16b4..6ca37f7c1f1 100644 --- a/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx @@ -151,7 +151,7 @@ export const DisplayBlockRenderer = ({ const connectionString = queryType === 'mutation' ? postgresConnectionString - : readOnlyConnectionString ?? postgresConnectionString + : (readOnlyConnectionString ?? postgresConnectionString) if (!connectionString) { const fallbackMessage = 'Unable to find a database connection to execute this query.' diff --git a/apps/studio/components/ui/CardButton.tsx b/apps/studio/components/ui/CardButton.tsx index 17581851322..7aadcfb3ca7 100644 --- a/apps/studio/components/ui/CardButton.tsx +++ b/apps/studio/components/ui/CardButton.tsx @@ -33,8 +33,10 @@ interface UrlContainerProps extends Omit, 'title'> {} -interface ButtonContainerProps - extends Omit, 'title'> {} +interface ButtonContainerProps extends Omit< + React.ButtonHTMLAttributes, + 'title' +> {} // Union of all container props type ContainerProps = diff --git a/apps/studio/components/ui/Charts/Charts.types.tsx b/apps/studio/components/ui/Charts/Charts.types.tsx index 1617c6813a8..94e878026d9 100644 --- a/apps/studio/components/ui/Charts/Charts.types.tsx +++ b/apps/studio/components/ui/Charts/Charts.types.tsx @@ -1,14 +1,13 @@ -export interface CommonChartProps - extends Pick< - HeaderType, - | 'highlightedValue' - | 'highlightedLabel' - | 'customDateFormat' - | 'data' - | 'format' - | 'minimalHeader' - | 'displayDateInUtc' - > { +export interface CommonChartProps extends Pick< + HeaderType, + | 'highlightedValue' + | 'highlightedLabel' + | 'customDateFormat' + | 'data' + | 'format' + | 'minimalHeader' + | 'displayDateInUtc' +> { title?: string className?: string valuePrecision?: number diff --git a/apps/studio/components/ui/Charts/ComposedChart.utils.tsx b/apps/studio/components/ui/Charts/ComposedChart.utils.tsx index a533099da76..057e3135da2 100644 --- a/apps/studio/components/ui/Charts/ComposedChart.utils.tsx +++ b/apps/studio/components/ui/Charts/ComposedChart.utils.tsx @@ -347,7 +347,9 @@ export const CustomLabel = ({
- {items?.map((entry, index) => )} + {items?.map((entry, index) => ( + + ))}
diff --git a/apps/studio/components/ui/Charts/useChartHoverState.test.tsx b/apps/studio/components/ui/Charts/useChartHoverState.test.tsx index 7d0d7b1f0fa..fd14a2300a6 100644 --- a/apps/studio/components/ui/Charts/useChartHoverState.test.tsx +++ b/apps/studio/components/ui/Charts/useChartHoverState.test.tsx @@ -55,9 +55,8 @@ describe('useChartHoverState', () => { localStorageMock.setItem('supabase-chart-tooltip-sync-enabled', 'true') vi.resetModules() - const { useChartHoverState: useChartHoverStateWithStorage } = await import( - './useChartHoverState' - ) + const { useChartHoverState: useChartHoverStateWithStorage } = + await import('./useChartHoverState') const { result } = renderHook(() => useChartHoverStateWithStorage('chart1')) @@ -70,9 +69,8 @@ describe('useChartHoverState', () => { localStorageMock.setItem('supabase-chart-tooltip-sync-enabled', 'invalid-json') vi.resetModules() - const { useChartHoverState: useChartHoverStateWithCorrupted } = await import( - './useChartHoverState' - ) + const { useChartHoverState: useChartHoverStateWithCorrupted } = + await import('./useChartHoverState') const { result } = renderHook(() => useChartHoverStateWithCorrupted('chart1')) diff --git a/apps/studio/components/ui/CopyButton.tsx b/apps/studio/components/ui/CopyButton.tsx index 33f1122f0fd..87fd9c183ca 100644 --- a/apps/studio/components/ui/CopyButton.tsx +++ b/apps/studio/components/ui/CopyButton.tsx @@ -56,7 +56,7 @@ const CopyButton = forwardRef( {...props} className={cn({ 'px-1': iconOnly }, props.className)} icon={ - showCopied ? : props.icon ?? + showCopied ? : (props.icon ?? ) } > {!iconOnly && <>{children ?? (showCopied ? copiedLabel : copyLabel)}} diff --git a/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx b/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx index fb161601636..235fbae746f 100644 --- a/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx +++ b/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx @@ -24,8 +24,10 @@ import { DropdownMenuTrigger, } from 'ui' -interface DataTableSheetRowActionProps> - extends ComponentPropsWithRef { +interface DataTableSheetRowActionProps< + TData, + TFields extends DataTableFilterField, +> extends ComponentPropsWithRef { fieldValue: TFields['value'] filterFields: TFields[] value: string | number diff --git a/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx b/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx index 7a49998c1a8..7495725d680 100644 --- a/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx +++ b/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx @@ -38,8 +38,7 @@ interface DataTableBaseContextType { } interface DataTableContextType - extends DataTableStateContextType, - DataTableBaseContextType {} + extends DataTableStateContextType, DataTableBaseContextType {} export const DataTableContext = createContext | null>(null) diff --git a/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx b/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx index f509d77a5ff..30af2a93c72 100644 --- a/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx +++ b/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx @@ -85,7 +85,7 @@ export const EdgeFunctionBlock = ({ onDragStart={onDragStart} actions={ hideDeployButton || !onDeploy ? ( - actions ?? null + (actions ?? null) ) : ( <> )} diff --git a/apps/studio/components/ui/ProfileImage.tsx b/apps/studio/components/ui/ProfileImage.tsx index 1eb710efb2d..c499e4a90e5 100644 --- a/apps/studio/components/ui/ProfileImage.tsx +++ b/apps/studio/components/ui/ProfileImage.tsx @@ -24,12 +24,12 @@ export const ProfileImage = ({ alt, src, placeholder, className }: ProfileImageP onError={() => setHasInvalidImg(true)} /> ) : ( - placeholder ?? ( + (placeholder ?? (
- ) + )) ) } diff --git a/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx b/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx index 01fa1bb35c2..bf97e459a8f 100644 --- a/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx +++ b/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx @@ -200,7 +200,7 @@ export const DisplayApiSettings = ({ ? 'JWT secret update failed, new API key may have issues' : jwtSecretUpdateStatus === JwtSecretUpdateStatus.Updating ? 'Updating JWT secret...' - : x?.api_key ?? 'You need additional permissions to view API keys' + : (x?.api_key ?? 'You need additional permissions to view API keys') } onChange={() => {}} /> diff --git a/apps/studio/components/ui/VirtualizedTable.tsx b/apps/studio/components/ui/VirtualizedTable.tsx index 25407b37114..13aec730a49 100644 --- a/apps/studio/components/ui/VirtualizedTable.tsx +++ b/apps/studio/components/ui/VirtualizedTable.tsx @@ -139,8 +139,10 @@ export const VirtualizedTable = ({ ) } -interface VirtualizedTableBodyProps - extends Omit, 'children'> { +interface VirtualizedTableBodyProps extends Omit< + React.ComponentProps, + 'children' +> { emptyContent?: ReactNode leadingContent?: ReactNode trailingContent?: ReactNode @@ -167,7 +169,7 @@ export const VirtualizedTableBody = ({ {leadingContent} {data.length === 0 ? ( - emptyContent ?? null + (emptyContent ?? null) ) : ( <> {paddingTop > 0 && ( diff --git a/apps/studio/hooks/misc/useCheckEntitlements.ts b/apps/studio/hooks/misc/useCheckEntitlements.ts index 12d258b8cdd..2c67d235243 100644 --- a/apps/studio/hooks/misc/useCheckEntitlements.ts +++ b/apps/studio/hooks/misc/useCheckEntitlements.ts @@ -75,7 +75,7 @@ export function useHasEntitlementAccess(organizationSlug?: string) { return useCallback( (key: string) => IS_PLATFORM - ? entitlementsData?.entitlements.find((e) => e.feature.key === key)?.hasAccess ?? false + ? (entitlementsData?.entitlements.find((e) => e.feature.key === key)?.hasAccess ?? false) : true, [entitlementsData] ) @@ -130,7 +130,7 @@ export function useCheckEntitlements( : isSuccessEntitlements return { - hasAccess: IS_PLATFORM ? entitlement?.hasAccess ?? false : true, + hasAccess: IS_PLATFORM ? (entitlement?.hasAccess ?? false) : true, isLoading: IS_PLATFORM ? isLoading : false, isSuccess: IS_PLATFORM ? isSuccess : true, getEntitlementNumericValue: () => getEntitlementNumericValue(entitlement), diff --git a/apps/studio/lib/ai/org-ai-details.test.ts b/apps/studio/lib/ai/org-ai-details.test.ts index d36c4168085..98e213ca829 100644 --- a/apps/studio/lib/ai/org-ai-details.test.ts +++ b/apps/studio/lib/ai/org-ai-details.test.ts @@ -47,9 +47,8 @@ describe('ai/org-ai-details', () => { const subscriptionQuery = await import('data/subscriptions/org-subscription-query') const settingsQuery = await import('data/config/project-settings-v2-query') const aiHook = await import('hooks/misc/useOrgOptedIntoAi') - const subscriptionUtils = await import( - 'components/interfaces/Billing/Subscription/Subscription.utils' - ) + const subscriptionUtils = + await import('components/interfaces/Billing/Subscription/Subscription.utils') const entitlementsQuery = await import('data/entitlements/entitlements-query') mockGetOrganizations = vi.mocked(orgsQuery.getOrganizations) diff --git a/apps/studio/package.json b/apps/studio/package.json index d52113e0134..caf3c5239d9 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -200,7 +200,6 @@ "next-router-mock": "^0.9.13", "node-mocks-http": "^1.17.2", "postcss": "^8.5.3", - "prettier": "3.2.4", "raw-loader": "^4.0.2", "require-in-the-middle": "^8.0.0", "tailwindcss": "catalog:", diff --git a/apps/studio/pages/new/[slug].tsx b/apps/studio/pages/new/[slug].tsx index ea2086166f9..a259737a578 100644 --- a/apps/studio/pages/new/[slug].tsx +++ b/apps/studio/pages/new/[slug].tsx @@ -141,7 +141,7 @@ const Wizard: NextPageWithLayout = () => { // an in-between render, but watchedInstanceSize is still undefined from the // form state carried over from the free plan. To avoid this, we set a // default instance size in this case. - const instanceSize = canChooseInstanceSize ? watchedInstanceSize ?? sizes[0] : undefined + const instanceSize = canChooseInstanceSize ? (watchedInstanceSize ?? sizes[0]) : undefined const { data: membersExceededLimit = [] } = useFreeProjectLimitCheckQuery( { slug }, @@ -227,7 +227,7 @@ const Wizard: NextPageWithLayout = () => { const availableOrioleVersion = useAvailableOrioleImageVersion( { cloudProvider: cloudProvider as CloudProvider, - dbRegion: smartRegionEnabled ? dbRegionExact : dbRegion ?? '', + dbRegion: smartRegionEnabled ? dbRegionExact : (dbRegion ?? ''), organizationSlug: organization, }, { enabled: currentOrg !== null } @@ -304,7 +304,7 @@ const Wizard: NextPageWithLayout = () => { const { smartGroup = [], specific = [] } = availableRegionsData?.all ?? {} const selectedRegion = smartRegionEnabled - ? smartGroup.find((x) => x.name === dbRegion) ?? specific.find((x) => x.name === dbRegion) + ? (smartGroup.find((x) => x.name === dbRegion) ?? specific.find((x) => x.name === dbRegion)) : undefined const data: ProjectCreateVariables = { diff --git a/apps/studio/pages/project/[ref]/logs/explorer/index.tsx b/apps/studio/pages/project/[ref]/logs/explorer/index.tsx index 8f6c10628d9..340f4609f1e 100644 --- a/apps/studio/pages/project/[ref]/logs/explorer/index.tsx +++ b/apps/studio/pages/project/[ref]/logs/explorer/index.tsx @@ -98,7 +98,7 @@ export const LogsExplorerPage: NextPageWithLayout = () => { const { logsDefaultQuery } = useCustomContent(['logs:default_query']) const PLACEHOLDER_QUERY = IS_PLATFORM - ? logsDefaultQuery ?? PLATFORM_PLACEHOLDER_QUERY + ? (logsDefaultQuery ?? PLATFORM_PLACEHOLDER_QUERY) : LOCAL_PLACEHOLDER_QUERY const [editorValue, setEditorValue] = useState(PLACEHOLDER_QUERY) diff --git a/apps/ui-library/components/side-navigation-item.tsx b/apps/ui-library/components/side-navigation-item.tsx index f1259c10886..b92af8bfe0a 100644 --- a/apps/ui-library/components/side-navigation-item.tsx +++ b/apps/ui-library/components/side-navigation-item.tsx @@ -14,8 +14,7 @@ import { SidebarNavItem } from '@/types/nav' // 2. AnchorHTMLAttributes - for standard HTML anchor props (className, etc) // We omit href from both since we compute it internally from item.href interface NavigationItemProps - extends Omit, - Omit, 'href'> { + extends Omit, Omit, 'href'> { item: SidebarNavItem onClick?: (e: React.MouseEvent) => void } diff --git a/apps/ui-library/registry/default/blocks/realtime-avatar-stack/components/avatar-stack.tsx b/apps/ui-library/registry/default/blocks/realtime-avatar-stack/components/avatar-stack.tsx index eeade1a42ad..48b88918e58 100644 --- a/apps/ui-library/registry/default/blocks/realtime-avatar-stack/components/avatar-stack.tsx +++ b/apps/ui-library/registry/default/blocks/realtime-avatar-stack/components/avatar-stack.tsx @@ -18,8 +18,7 @@ const avatarStackVariants = cva('flex -space-x-4 -space-y-4', { }) export interface AvatarStackProps - extends React.HTMLAttributes, - VariantProps { + extends React.HTMLAttributes, VariantProps { avatars: { name: string; image: string }[] maxAvatarsAmount?: number } diff --git a/apps/ui-library/registry/default/components/ui/badge.tsx b/apps/ui-library/registry/default/components/ui/badge.tsx index 32aa3294de5..3f10e53b172 100644 --- a/apps/ui-library/registry/default/components/ui/badge.tsx +++ b/apps/ui-library/registry/default/components/ui/badge.tsx @@ -23,8 +23,7 @@ const badgeVariants = cva( ) export interface BadgeProps - extends React.HTMLAttributes, - VariantProps {} + extends React.HTMLAttributes, VariantProps {} function Badge({ className, variant, ...props }: BadgeProps) { return
diff --git a/apps/ui-library/registry/default/components/ui/button.tsx b/apps/ui-library/registry/default/components/ui/button.tsx index f8dd6acec5d..1c2286b0deb 100644 --- a/apps/ui-library/registry/default/components/ui/button.tsx +++ b/apps/ui-library/registry/default/components/ui/button.tsx @@ -32,8 +32,7 @@ const buttonVariants = cva( ) export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { + extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean } diff --git a/apps/ui-library/registry/default/components/ui/switch.tsx b/apps/ui-library/registry/default/components/ui/switch.tsx index 66d67699b31..70bea9c68c2 100644 --- a/apps/ui-library/registry/default/components/ui/switch.tsx +++ b/apps/ui-library/registry/default/components/ui/switch.tsx @@ -37,7 +37,8 @@ const switchThumbVariants = cva( ) export interface SwitchProps - extends React.ComponentPropsWithoutRef, + extends + React.ComponentPropsWithoutRef, VariantProps {} const Switch = React.forwardRef, SwitchProps>( diff --git a/apps/www/_blog/2020-10-30-improved-dx.mdx b/apps/www/_blog/2020-10-30-improved-dx.mdx index 4d05c47cd61..7992694a657 100644 --- a/apps/www/_blog/2020-10-30-improved-dx.mdx +++ b/apps/www/_blog/2020-10-30-improved-dx.mdx @@ -118,4 +118,5 @@ To summarise the steps: - Become a [sponsor](https://github.com/sponsors/supabase) [^1]: Removed link on June 14 2022 for search optimization: page currently does not exist + [^2]: Removed link on June 14 2022 for search optimization: page currently does not exist diff --git a/apps/www/_blog/2021-07-01-roles-postgres-hooks.mdx b/apps/www/_blog/2021-07-01-roles-postgres-hooks.mdx index 9fed32e24d5..60f2e04eaa6 100644 --- a/apps/www/_blog/2021-07-01-roles-postgres-hooks.mdx +++ b/apps/www/_blog/2021-07-01-roles-postgres-hooks.mdx @@ -418,4 +418,5 @@ By the way, if you like working on PostgreSQL tooling and extensions: we are hir - [Realtime Postgres RLS on Supabase](https://supabase.com/blog/realtime-row-level-security-in-postgresql) [^1]: You can see the `ProcessUtility_hook` declaration [here](https://github.com/postgres/postgres/blob/11e9caff82bc7326e2bc9782937cb03875050cc4/src/backend/tcop/utility.c#L75-L76) and its usage [here](https://github.com/postgres/postgres/blob/11e9caff82bc7326e2bc9782937cb03875050cc4/src/backend/tcop/utility.c#L515-L527). + [^2]: This is also done on [pg_stat_statements](https://github.com/postgres/postgres/blob/6991e774e0304f5ef488cf1ae4fa79578b6ae3d5/contrib/pg_stat_statements/pg_stat_statements.c#L1130-L1137) and [sepgsql](https://github.com/postgres/postgres/blob/6991e774e0304f5ef488cf1ae4fa79578b6ae3d5/contrib/sepgsql/hooks.c#L381-L388). diff --git a/apps/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx b/apps/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx index cf86b2ef835..b2d2671dd7b 100644 --- a/apps/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx +++ b/apps/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx @@ -43,8 +43,12 @@ We were absolutely blown away by [all the amazing projects](/blog/hackathon-winn Who else deserves the Gold Supabase Tee? 👀 https://t.co/XPWw02kZad

- — Supabase (@supabase) September 22, 2021 - + — Supabase (@supabase){' '} + + September 22, 2021 + + + ### Prize categories @@ -93,10 +97,15 @@ We'll be contacting and announcing winners [on Twitter](https://twitter.com/supa + — Josh Cawthorne (@cawthornejosh){' '} + + August 10, 2021 + + + ### Rules diff --git a/apps/www/_blog/2021-11-30-supabase-studio.mdx b/apps/www/_blog/2021-11-30-supabase-studio.mdx index 42c259b3ddf..f52abeb8819 100644 --- a/apps/www/_blog/2021-11-30-supabase-studio.mdx +++ b/apps/www/_blog/2021-11-30-supabase-studio.mdx @@ -56,9 +56,9 @@ Eventually we decided to open source all the frontend code, a shared codebase fo Special shout out - Sentry do a fantastic job of - documenting their strategy - for managing a shared codebase and served as a great model for Supabase. + Sentry do a fantastic job of{' '} + documenting their strategy for + managing a shared codebase and served as a great model for Supabase. ## Build in public diff --git a/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx b/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx index 11463b4c083..f62219f8e1a 100644 --- a/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx +++ b/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx @@ -22,17 +22,20 @@ Back in May 2020, we [tweeted about](https://twitter.com/supabase/status/1265922

Really impressed with - @logflare_logs. We've been - on the front page of + @logflare_logs. We've + been on the front page of #hackernews - for 24 hours anticipating the HN hug of death. Looks like we made it through OK and Logflare has - been ingesting everything without breaking a sweat - https://t.co/RWKHIgmWh6 - pic.twitter.com/dQ2xqFTdco + for 24 hours anticipating the HN hug of death. Looks like we made it through OK and Logflare + has been ingesting everything without breaking a sweat{' '} + https://t.co/RWKHIgmWh6{' '} + pic.twitter.com/dQ2xqFTdco

- — Supabase (@supabase) May 28, 2020 + — Supabase (@supabase){' '} + + May 28, 2020 +
diff --git a/apps/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx b/apps/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx index a8c85b30816..72281e71045 100644 --- a/apps/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx +++ b/apps/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx @@ -39,8 +39,12 @@ The Supabase team will be participating as well, for example [Jon](https://twitt https://t.co/wgRBu92Bq4 pic.twitter.com/i1eD1pdA8I

- — Supabase (@supabase) November 24, 2021 - + — Supabase (@supabase){' '} + + November 24, 2021 + + + ### Prize categories @@ -89,8 +93,12 @@ We'll be contacting and announcing winners [on Twitter](https://twitter.com/supa @supabase hackathon! 🥳 https://t.co/rm5HBuju73

- — Josh Cawthorne (@cawthornejosh) August 10, 2021 - + — Josh Cawthorne (@cawthornejosh){' '} + + August 10, 2021 + + + ### Rules diff --git a/apps/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx b/apps/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx index a6af36a0d96..28db8e1c23a 100644 --- a/apps/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx +++ b/apps/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx @@ -19,13 +19,19 @@ Last week [Supabase UI](https://ui.supabase.com/), our open-source UI component + — Supabase (@supabase){' '} + + January 13, 2022 + + + Thanks to your contributions and upvotes, Supabase UI has made it to the finals, and to celebrate we'd like to invite you all to hang out with us on Discord (at least whoever manages to stay up) to watch the Awards Ceremony on Thursday Jan 27th at 9am PT (Thursday 5pm GMT, Friday 1am SG). diff --git a/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx b/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx index 27e1f94c084..81ceb8e57f2 100644 --- a/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx +++ b/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx @@ -114,15 +114,18 @@ Divjoy announced their [Supabase Integration](https://divjoy.com/?database=supab + — n8n.io (@n8n_io){' '} + + January 10, 2022 + + + ### Python Upgrades @@ -140,8 +143,12 @@ We're having a 24/7\*365 meme-fest on [Twitter](https://twitter.com/supabase)

invest in good relationships pic.twitter.com/bGiBE7FRFQ

- — Supabase (@supabase) December 28, 2021 - + — Supabase (@supabase){' '} + + December 28, 2021 + + + ### TikTok diff --git a/apps/www/_blog/2022-03-08-postgres-audit.mdx b/apps/www/_blog/2022-03-08-postgres-audit.mdx index 9cee58a0435..e36fe02037f 100644 --- a/apps/www/_blog/2022-03-08-postgres-audit.mdx +++ b/apps/www/_blog/2022-03-08-postgres-audit.mdx @@ -124,8 +124,8 @@ create table audit.record_version ( Postgres version compatibility

The table above uses PostgreSQL's built-in - uuid functionality, which is - available from version 14. For backwards compatibility you can use the uuid-ossp extension. + uuid functionality, which + is available from version 14. For backwards compatibility you can use the uuid-ossp extension.

create extension if not exists "uuid-ossp"; diff --git a/apps/www/_blog/2022-04-01-hackathon-bring-the-func.mdx b/apps/www/_blog/2022-04-01-hackathon-bring-the-func.mdx index d20f1b00a5a..3df6234f7f0 100644 --- a/apps/www/_blog/2022-04-01-hackathon-bring-the-func.mdx +++ b/apps/www/_blog/2022-04-01-hackathon-bring-the-func.mdx @@ -40,10 +40,15 @@ Finally, we're delighted to be partnering with [the Future Forest Company](https

+ — Supabase (@supabase){' '} + + November 24, 2021 + + + ### Prize categories @@ -92,10 +97,15 @@ We'll be contacting and announcing winners [on Twitter](https://twitter.com/supa + — Josh Cawthorne (@cawthornejosh){' '} + + August 10, 2021 + + + ### Rules diff --git a/apps/www/_blog/2022-08-09-slack-consolidate-slackbot-to-consolidate-messages.mdx b/apps/www/_blog/2022-08-09-slack-consolidate-slackbot-to-consolidate-messages.mdx index 44186213f2d..42fca0b38b1 100644 --- a/apps/www/_blog/2022-08-09-slack-consolidate-slackbot-to-consolidate-messages.mdx +++ b/apps/www/_blog/2022-08-09-slack-consolidate-slackbot-to-consolidate-messages.mdx @@ -161,7 +161,8 @@ Slack links have the following format: https://ORGANIZATION.slack.com/archives/ - channel_id/pmessage_id + channel_id/p + message_id
Organization: subdomain used in Slack diff --git a/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx b/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx index b8f7b380c16..c3c322a293c 100644 --- a/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx +++ b/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx @@ -40,7 +40,10 @@ This time, we're switching things around: Now I've just got to pry it away from Peanut 🥜 😂 pic.twitter.com/POBdVZrF5N

- — Daniel Cranney 🇬🇧 (@danielcranney) August 10, 2022 + — Daniel Cranney 🇬🇧 (@danielcranney){' '} + + August 10, 2022 + diff --git a/apps/www/_blog/2022-11-08-authentication-in-ionic-angular.mdx b/apps/www/_blog/2022-11-08-authentication-in-ionic-angular.mdx index c6fa7976886..a1e333b5e87 100644 --- a/apps/www/_blog/2022-11-08-authentication-in-ionic-angular.mdx +++ b/apps/www/_blog/2022-11-08-authentication-in-ionic-angular.mdx @@ -626,7 +626,8 @@ ion-content { --padding-top: 20%; --padding-start: 5%; --padding-end: 5%; - --background: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.7)), + --background: + linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.7)), url('https://images.unsplash.com/photo-1508964942454-1a56651d54ac?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1035&q=80') no-repeat; } @@ -792,7 +793,8 @@ ion-content { --padding-top: 20%; --padding-start: 5%; --padding-end: 5%; - --background: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.7)), + --background: + linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.7)), url('https://images.unsplash.com/photo-1508964942454-1a56651d54ac?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1035&q=80') no-repeat; } diff --git a/apps/www/_blog/2023-08-04-interactive-constellation-threejs-react-three-fiber.mdx b/apps/www/_blog/2023-08-04-interactive-constellation-threejs-react-three-fiber.mdx index 025984eabb5..6dab3b93107 100644 --- a/apps/www/_blog/2023-08-04-interactive-constellation-threejs-react-three-fiber.mdx +++ b/apps/www/_blog/2023-08-04-interactive-constellation-threejs-react-three-fiber.mdx @@ -38,12 +38,10 @@ If you want to dive a little deeper, here are a few good resources we found to g href="https://www.youtube.com/watch?v=DPl34H2ISsk" target="_blank" children="I wish I knew this before using React Three Fiber" - /> - from our very own -- - by + - from our very own +- - by + ## Setting up the scene diff --git a/apps/www/_blog/2024-05-09-meetup-kahoot-alternative.mdx b/apps/www/_blog/2024-05-09-meetup-kahoot-alternative.mdx index dfa9d446529..3d3d4f91658 100644 --- a/apps/www/_blog/2024-05-09-meetup-kahoot-alternative.mdx +++ b/apps/www/_blog/2024-05-09-meetup-kahoot-alternative.mdx @@ -119,8 +119,12 @@ Thanks to everyone who participated. I hope you enjoyed it, and a massive thank @KyleRummens.{' '} pic.twitter.com/Uzk4q3aJyy

- — Tristan Rhodes (@tristanbob) April 19, 2024 - + — Tristan Rhodes (@tristanbob){' '} + + April 19, 2024 + + + + — Dherrbie (@Debbyiecodes){' '} + + April 20, 2024 + + + ## Contributing to open source diff --git a/apps/www/_blog/2024-12-04-supabase-cron.mdx b/apps/www/_blog/2024-12-04-supabase-cron.mdx index d577acf6234..1c48baf94a6 100644 --- a/apps/www/_blog/2024-12-04-supabase-cron.mdx +++ b/apps/www/_blog/2024-12-04-supabase-cron.mdx @@ -121,7 +121,8 @@ Wondering why a Job failed? You can view the history of all Jobs and their logs alt="Observe and debug Jobs" src="/images/blog/launch-week-13/day-3-supabase-cron/history.jpg" /> -For a deeper dive, you can view Jobs in the [Logs Explorer](https://supabase.com/dashboard/project/_zvmkyvanngopzqaabmvx_/logs/pgcron-logs). +For a deeper dive, you can view Jobs in the [Logs +Explorer](https://supabase.com/dashboard/project/_zvmkyvanngopzqaabmvx_/logs/pgcron-logs). View cron logs ### Try Supabase Cron today diff --git a/apps/www/_blog/2025-02-26-pgrouting-postgres-graph-database.mdx b/apps/www/_blog/2025-02-26-pgrouting-postgres-graph-database.mdx index 842aa5a2436..9af6d5e33ba 100644 --- a/apps/www/_blog/2025-02-26-pgrouting-postgres-graph-database.mdx +++ b/apps/www/_blog/2025-02-26-pgrouting-postgres-graph-database.mdx @@ -273,7 +273,6 @@ values (1, 2, 'same_category', 5), -- "Intro to Graph Theory" and "Advanced Graph Algorithms" are in the same category (2, 3, 'watched_by_same_users', 3), -- "Advanced Graph Algorithms" and "Graph Neural Networks" are often watched together (4, 5, 'same_category', 5); -- "Beginner Python Tutorial - create table interactions ( user_id int references auth.users (id), video_id int references videos (id), diff --git a/apps/www/_blog/2025-05-08-event-triggers-wo-superuser.mdx b/apps/www/_blog/2025-05-08-event-triggers-wo-superuser.mdx index b7c8d089f08..657c2697d6c 100644 --- a/apps/www/_blog/2025-05-08-event-triggers-wo-superuser.mdx +++ b/apps/www/_blog/2025-05-08-event-triggers-wo-superuser.mdx @@ -135,5 +135,7 @@ Finally, we want to give a special shout out to the [Zero Sync](https://zero.roc --- [^1]: This is so the event trigger can be altered or dropped by end users. + [^2]: This is not true if you mark the event trigger function as `security definer`, then it will run with the privileges of the function owner. But this is not a usual practice on event triggers, as they usually want to preserve the context of the current user. + [^3]: These are configurable. You can read more about reserved roles [here](https://supabase.com/blog/roles-postgres-hooks). diff --git a/apps/www/app/api-v2/ticket-og/route.tsx b/apps/www/app/api-v2/ticket-og/route.tsx index 46b216f66f4..d3f62abbd6a 100644 --- a/apps/www/app/api-v2/ticket-og/route.tsx +++ b/apps/www/app/api-v2/ticket-og/route.tsx @@ -109,91 +109,90 @@ export async function GET(req: Request) { const TICKET_BOTTOM_TEXT_FONT_SIZE = 20 const generatedTicketImage = new ImageResponse( - ( - <> + <> +
+ {/* Background */} + + + {/* LINEAR GRADIENT */}
+ + {/* LEFT */} +
- {/* Background */} - - - {/* LINEAR GRADIENT */} -
- - {/* LEFT */} -
-
-

- Launch Week 15 -

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

- July 14—18 -

- -
- - {/* TICKET */}
+

+ July 14—18 +

+ +
+
+ + {/* TICKET */} +
+
-
+
+ +
- -
-
-
-

- LW -

-

- 15 -

-
+ LW +

+

+ 15 +

-
+
+

+ @{username} +

+

- @{username} + Company

-
-

- Company -

-

- {metadata.company ?? '—'} -

-
- {/*
+
+ {/*
*/} -
- - ), +
+ , { width: OG_WIDTH, height: OG_HEIGHT, diff --git a/apps/www/components/Carousels/ImageCarousel.module.css b/apps/www/components/Carousels/ImageCarousel.module.css index 5a8c40ab2af..de0465a8225 100644 --- a/apps/www/components/Carousels/ImageCarousel.module.css +++ b/apps/www/components/Carousels/ImageCarousel.module.css @@ -1,6 +1,7 @@ /* bright */ .gradient-bg { - background: linear-gradient(338.96deg, rgba(0, 0, 0, 0.2) -18.99%, rgba(0, 0, 0, 0) 25.34%), + background: + linear-gradient(338.96deg, rgba(0, 0, 0, 0.2) -18.99%, rgba(0, 0, 0, 0) 25.34%), linear-gradient(300.08deg, #53ffb1 7.6%, #3ecf8e 64.93%); /* transform: rotate(-89.79deg); */ } diff --git a/apps/www/components/Events/EventListItem.tsx b/apps/www/components/Events/EventListItem.tsx index 84765051721..ca2a802d8b3 100644 --- a/apps/www/components/Events/EventListItem.tsx +++ b/apps/www/components/Events/EventListItem.tsx @@ -34,8 +34,8 @@ const EventListItem = ({ event }: Props) => { return (
diff --git a/apps/www/components/ImageModal.tsx b/apps/www/components/ImageModal.tsx index fab5a4d8207..a2945ca7048 100644 --- a/apps/www/components/ImageModal.tsx +++ b/apps/www/components/ImageModal.tsx @@ -7,7 +7,8 @@ import styleHandler from 'ui/src/lib/theme/styleHandler' export type ImageModalProps = RadixProps & Props interface RadixProps - extends Dialog.DialogProps, + extends + Dialog.DialogProps, Pick< Dialog.DialogContentProps, | 'onOpenAutoFocus' diff --git a/apps/www/components/LaunchWeek/7/LaunchSection/brick-wall.module.css b/apps/www/components/LaunchWeek/7/LaunchSection/brick-wall.module.css index c81740ed399..aaab08cb7ca 100644 --- a/apps/www/components/LaunchWeek/7/LaunchSection/brick-wall.module.css +++ b/apps/www/components/LaunchWeek/7/LaunchSection/brick-wall.module.css @@ -1,6 +1,7 @@ /* mask overlay on left & right */ .brick-wall-mask--left, .brick-wall-mask--right { - background: linear-gradient(358.88deg, #1c1c1c 24.57%, #1c1c1c00 87.73%), + background: + linear-gradient(358.88deg, #1c1c1c 24.57%, #1c1c1c00 87.73%), linear-gradient(358.88deg, #1c1c1c 24.57%, #1c1c1c00 87.73%); } diff --git a/apps/www/components/LaunchWeek/7/lw7-bg-graphic.module.css b/apps/www/components/LaunchWeek/7/lw7-bg-graphic.module.css index 04776532987..ecfab8e8209 100644 --- a/apps/www/components/LaunchWeek/7/lw7-bg-graphic.module.css +++ b/apps/www/components/LaunchWeek/7/lw7-bg-graphic.module.css @@ -1,5 +1,13 @@ .gradient-overlay::before { - background: linear-gradient(0deg, #1c1c1c 0%, #1c1c1c20 60%, transparent 100%), - linear-gradient(0deg, #1c1c1c 0%, #1c1c1c80 20%, #1c1c1c60 40%, #1c1c1c05 75%, transparent 100%), + background: + linear-gradient(0deg, #1c1c1c 0%, #1c1c1c20 60%, transparent 100%), + linear-gradient( + 0deg, + #1c1c1c 0%, + #1c1c1c80 20%, + #1c1c1c60 40%, + #1c1c1c05 75%, + transparent 100% + ), linear-gradient(0deg, #1c1c1c 0%, #1c1c1c80 15%, #1c1c1c50 40%, #1c1c1c05 65%, transparent 100%); } diff --git a/apps/www/components/Sections/TimedAccordionSection.tsx b/apps/www/components/Sections/TimedAccordionSection.tsx index 178835e1a7b..850abc65d63 100644 --- a/apps/www/components/Sections/TimedAccordionSection.tsx +++ b/apps/www/components/Sections/TimedAccordionSection.tsx @@ -20,7 +20,7 @@ const Tab = ({ isActive, label, paragraph, onClick, progress, intervalDuration } const [height, setHeight] = useState('auto') useEffect(() => { if (!paragraphRef) return - setHeight(isActive ? paragraphRef.current?.clientHeight ?? 0 : 0) + setHeight(isActive ? (paragraphRef.current?.clientHeight ?? 0) : 0) }, [isActive]) return ( diff --git a/apps/www/components/Solutions/PlatformSection.tsx b/apps/www/components/Solutions/PlatformSection.tsx index ca30a873a17..8fc49403fd8 100644 --- a/apps/www/components/Solutions/PlatformSection.tsx +++ b/apps/www/components/Solutions/PlatformSection.tsx @@ -33,7 +33,9 @@ const PlatformSection = ({ title, subheading, features, id, className }: Platfor
- {features?.map((feature) => )} + {features?.map((feature) => ( + + ))}
) diff --git a/apps/www/components/VideoWithHighlights.tsx b/apps/www/components/VideoWithHighlights.tsx index 1cef1f2aa75..5b986f88b6b 100644 --- a/apps/www/components/VideoWithHighlights.tsx +++ b/apps/www/components/VideoWithHighlights.tsx @@ -38,7 +38,7 @@ const VideoWithHighlights = (props: Props) => { ))} diff --git a/apps/www/styles/customers.module.css b/apps/www/styles/customers.module.css index 5c85f6cd587..43f205e683c 100644 --- a/apps/www/styles/customers.module.css +++ b/apps/www/styles/customers.module.css @@ -5,8 +5,8 @@ radial-gradient(80% 100% at 50% 75%, #3ecf8e10 0%, #0d0e1200 100%), radial-gradient(40% 70% at 50% 80%, #3ecf8e20 0%, #3ecf8e00 100%), /* radial-gradient(100% 100% at 50% 80%, #1c1c1c50 0%, #3ecf8e00 100%), */ - /* Stars from left to right =================================== */ - radial-gradient(1px 1px at 5% 25%, #3ecf8e70 0%, #3ecf8e00 100%), + /* Stars from left to right =================================== */ + radial-gradient(1px 1px at 5% 25%, #3ecf8e70 0%, #3ecf8e00 100%), radial-gradient(1px 1px at 14% 15%, #3ecf8e 0%, #3ecf8e00 100%), radial-gradient(1px 1px at 19% 35%, #3ecf8e 0%, #3ecf8e00 100%), radial-gradient(1px 1px at 29% 10%, #3ecf8e 0%, #3ecf8e00 100%), diff --git a/apps/www/supabase/functions/lw11-og/handler.tsx b/apps/www/supabase/functions/lw11-og/handler.tsx index e036659fb0b..a55406a926c 100644 --- a/apps/www/supabase/functions/lw11-og/handler.tsx +++ b/apps/www/supabase/functions/lw11-og/handler.tsx @@ -142,235 +142,233 @@ export async function handler(req: Request) { } const generatedTicketImage = new ImageResponse( - ( - <> + <> +
+ {/* Background */} + + {/* Ticket */}
- {/* Background */} - {/* Ticket */} -
- + src={BACKGROUND[ticketType].BG} + /> - {/* Ticket No */} -

- {`NO ${prefix}${ticketNumber}`} -

- - {/* Name & username */} -
- {HAS_AVATAR && ( - - )} -

- {DISPLAY_NAME} -

- -
- {HAS_NO_META && username && `@${username}`} - {HAS_ROLE && `${metadata.role}`} - {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `} -
-
-
- -
+ {`NO ${prefix}${ticketNumber}`} +

+ + {/* Name & username */} +
+ {HAS_AVATAR && ( + + )} +

+ {DISPLAY_NAME} +

+
- -
- -

- - Join us for a - - - Special Announcement - -

-

- April 15-19 / 7AM PT -

+ {HAS_NO_META && username && `@${username}`} + {HAS_ROLE && `${metadata.role}`} + {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `} +
- - ), + +
+
+ +
+ +

+ + Join us for a + + + Special Announcement + +

+

+ April 15-19 / 7AM PT +

+
+
+ , { width: OG_WIDTH, height: OG_HEIGHT, diff --git a/apps/www/supabase/functions/lwx-og/handler.tsx b/apps/www/supabase/functions/lwx-og/handler.tsx index b4eea3fbcb1..bd34330ff3e 100644 --- a/apps/www/supabase/functions/lwx-og/handler.tsx +++ b/apps/www/supabase/functions/lwx-og/handler.tsx @@ -126,152 +126,150 @@ export async function handler(req: Request) { const OG_PADDING_Y = (OG_HEIGHT - TICKET_HEIGHT) / 2 const generatedTicketImage = new ImageResponse( - ( - <> + <> +
+ {/* Background */} + + {/* Ticket */} + + + {/* Name & username */}
- {/* Background */} - - {/* Ticket */} - - - {/* Name & username */} -
-

- {name ?? username} -

+ {name ?? username} +

-
- {HAS_NO_META && username && `@${username}`} - {HAS_ROLE && `${metadata.role}`} - {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `} -
-
-
- -
- {/* Ticket No */} -

- {`NO ${prefix}${ticketNumber}`} -

-

- Launch Week X -

-

- DEC 11-15 / 8AM PT -

+ {HAS_NO_META && username && `@${username}`} + {HAS_ROLE && `${metadata.role}`} + {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `}
- - ), +
+
+ +
+ {/* Ticket No */} +

+ {`NO ${prefix}${ticketNumber}`} +

+

+ Launch Week X +

+

+ DEC 11-15 / 8AM PT +

+
+
+ , { width: OG_WIDTH, height: OG_HEIGHT, diff --git a/apps/www/supabase/functions/lwx-ticket-og/handler.tsx b/apps/www/supabase/functions/lwx-ticket-og/handler.tsx index 207d7ac5495..3dbfce0e051 100644 --- a/apps/www/supabase/functions/lwx-ticket-og/handler.tsx +++ b/apps/www/supabase/functions/lwx-ticket-og/handler.tsx @@ -34,35 +34,33 @@ export async function handler(req: Request) { } const geneartedOGImage = new ImageResponse( - ( -
+ {/* Ticket */} + - {/* Ticket */} - -
- ), + /> +
, { width: 1200, height: 628, diff --git a/apps/www/supabase/functions/lwx-ticket/handler.tsx b/apps/www/supabase/functions/lwx-ticket/handler.tsx index 72bf3ff3fa6..004c4967d47 100644 --- a/apps/www/supabase/functions/lwx-ticket/handler.tsx +++ b/apps/www/supabase/functions/lwx-ticket/handler.tsx @@ -109,136 +109,134 @@ export async function handler(req: Request) { const HAS_NO_META = !HAS_ROLE && !HAS_COMPANY && !HAS_LOCATION const generatedTicketImage = new ImageResponse( - ( - <> + <> +
+ {/* Background */} + + + {/* Name & username */}
- {/* Background */} - - - {/* Name & username */} -
-

- {name ?? username} -

+ {name ?? username} +

- {/* Username */} -
- {HAS_NO_META && username && `@${username}`} - {HAS_ROLE && `${metadata.role}`} - {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `} -
-
+ {/* Username */}
-
- -
- {/* Ticket No */} -

- {`NO ${prefix}${ticketNumber}`} -

-

- Launch Week X -

-

- DEC 11-15 / 8AM PT -

+ {HAS_NO_META && username && `@${username}`} + {HAS_ROLE && `${metadata.role}`} + {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `}
- - ), +
+
+ +
+ {/* Ticket No */} +

+ {`NO ${prefix}${ticketNumber}`} +

+

+ Launch Week X +

+

+ DEC 11-15 / 8AM PT +

+
+
+ , { width: 1200, height: 628, diff --git a/package.json b/package.json index ce4526ea7ef..d50e829bd90 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dev:design-system": "turbo run dev --filter=design-system --parallel", "lint": "turbo run lint", "typecheck": "turbo --continue typecheck", - "test:prettier": "SORT_IMPORTS=false prettier --cache --check '{apps,packages,blocks}/**/*.{js,jsx,ts,tsx,css,md,json}'", + "test:prettier": "SORT_IMPORTS=false prettier --cache --check '{apps,packages,blocks}/**/*.{js,jsx,ts,tsx,css,md,mdx,json}'", "format": "SORT_IMPORTS=false prettier --cache --write '{apps,packages,blocks}/**/*.{js,jsx,ts,tsx,css,md,mdx,json}'", "test:docs": "turbo run test --filter=docs", "test:ui": "turbo run test --filter=ui", @@ -48,8 +48,8 @@ "@types/node": "catalog:", "eslint": "^9.0.0", "jsdom": "^28.1.0", - "prettier": "3.2.4", - "prettier-plugin-sql-cst": "^0.11.0", + "prettier": "3.7.3", + "prettier-plugin-sql-cst": "^0.18.0", "rimraf": "^6.0.0", "sass": "^1.72.0", "supabase": "^2.76.10", @@ -68,13 +68,6 @@ "pnpm": "10.24", "node": ">=22" }, - "keywords": [ - "postgres", - "firebase", - "storage", - "functions", - "database", - "auth" - ], + "keywords": ["postgres", "firebase", "storage", "functions", "database", "auth"], "packageManager": "pnpm@10.24.0" } diff --git a/packages/api-types/package.json b/packages/api-types/package.json index fc13f2be215..6674869602b 100644 --- a/packages/api-types/package.json +++ b/packages/api-types/package.json @@ -13,7 +13,7 @@ "license": "MIT", "devDependencies": { "openapi-typescript": "^7.4.3", - "prettier": "3.2.4", + "prettier": "*", "typescript": "catalog:" } } diff --git a/packages/build-icons/package.json b/packages/build-icons/package.json index d05f8af79de..7a789e0a0c1 100644 --- a/packages/build-icons/package.json +++ b/packages/build-icons/package.json @@ -20,7 +20,6 @@ "license": "ISC", "devDependencies": { "minimist": "^1.2.7", - "prettier": "3.2.4", "svgson": "^5.2.1" } } diff --git a/packages/common/feature-flags.tsx b/packages/common/feature-flags.tsx index 08382c3a507..fd8bfe9d7b9 100644 --- a/packages/common/feature-flags.tsx +++ b/packages/common/feature-flags.tsx @@ -210,7 +210,7 @@ export const FeatureFlagProvider = ({ flagValues.forEach((item) => { flagStore['configcat'][item.settingKey] = overridesCookieValue[item.settingKey] ?? - (item.settingValue === null ? null : item.settingValue ?? false) + (item.settingValue === null ? null : (item.settingValue ?? false)) }) } diff --git a/packages/pg-meta/src/sql/studio/auth/get-users-common.ts b/packages/pg-meta/src/sql/studio/auth/get-users-common.ts index c7255a77a67..3cae978ec11 100644 --- a/packages/pg-meta/src/sql/studio/auth/get-users-common.ts +++ b/packages/pg-meta/src/sql/studio/auth/get-users-common.ts @@ -1,7 +1,7 @@ export function prefixToUUID(prefix: string, max: boolean) { const mapped = '00000000-0000-0000-0000-000000000000' .split('') - .map((c, i) => (c === '-' ? c : prefix[i] ?? c)) + .map((c, i) => (c === '-' ? c : (prefix[i] ?? c))) if (prefix.length >= mapped.length) { return mapped.join('') diff --git a/packages/ui-patterns/src/Chart/charts/chart-bar.tsx b/packages/ui-patterns/src/Chart/charts/chart-bar.tsx index ccfd8485ade..b95666809cf 100644 --- a/packages/ui-patterns/src/Chart/charts/chart-bar.tsx +++ b/packages/ui-patterns/src/Chart/charts/chart-bar.tsx @@ -114,8 +114,8 @@ export const ChartBar = ({ const yAxisConfig = { tick: showYAxis, hide: !showYAxis, - tickMargin: showYAxis ? YAxisProps?.tickMargin ?? 4 : 0, - width: showYAxis ? YAxisProps?.width ?? undefined : 0, + tickMargin: showYAxis ? (YAxisProps?.tickMargin ?? 4) : 0, + width: showYAxis ? (YAxisProps?.width ?? undefined) : 0, axisLine: { stroke: CHART_COLORS.AXIS }, tickLine: { stroke: CHART_COLORS.AXIS }, ...YAxisProps, diff --git a/packages/ui-patterns/src/Chart/charts/chart-line.tsx b/packages/ui-patterns/src/Chart/charts/chart-line.tsx index da1f193cf6a..2fc044ab7fe 100644 --- a/packages/ui-patterns/src/Chart/charts/chart-line.tsx +++ b/packages/ui-patterns/src/Chart/charts/chart-line.tsx @@ -120,8 +120,8 @@ export const ChartLine = ({ const yAxisConfig = { tick: showYAxis, hide: !showYAxis, - tickMargin: showYAxis ? YAxisProps?.tickMargin ?? 4 : 0, - width: showYAxis ? YAxisProps?.width ?? undefined : 0, + tickMargin: showYAxis ? (YAxisProps?.tickMargin ?? 4) : 0, + width: showYAxis ? (YAxisProps?.width ?? undefined) : 0, axisLine: { stroke: CHART_COLORS.AXIS }, tickLine: { stroke: CHART_COLORS.AXIS }, ...YAxisProps, diff --git a/packages/ui-patterns/src/CommandMenu/api/TextHighlighter.tsx b/packages/ui-patterns/src/CommandMenu/api/TextHighlighter.tsx index aa8ecddd79d..9b2aeaa2bd6 100644 --- a/packages/ui-patterns/src/CommandMenu/api/TextHighlighter.tsx +++ b/packages/ui-patterns/src/CommandMenu/api/TextHighlighter.tsx @@ -9,8 +9,9 @@ import { import { useQuery } from './hooks/queryHooks' -interface TextHighlighterBaseProps - extends PropsWithChildren, HTMLSpanElement>> { +interface TextHighlighterBaseProps extends PropsWithChildren< + DetailedHTMLProps, HTMLSpanElement> +> { query: string text?: string } diff --git a/packages/ui/src/components/AlertCollapsible/AlertCollapsible.tsx b/packages/ui/src/components/AlertCollapsible/AlertCollapsible.tsx index c8aafb2f856..af2d06c8955 100644 --- a/packages/ui/src/components/AlertCollapsible/AlertCollapsible.tsx +++ b/packages/ui/src/components/AlertCollapsible/AlertCollapsible.tsx @@ -10,8 +10,7 @@ import { alertVariants } from '../shadcn/ui/alert' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../shadcn/ui/collapsible' export interface AlertCollapsibleProps - extends Omit, 'title'>, - VariantProps { + extends Omit, 'title'>, VariantProps { trigger: React.ReactNode defaultOpen?: boolean } diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index 05ad140b658..b97c71e9af2 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -208,7 +208,8 @@ const loadingVariants = cva('', { export interface ButtonProps // omit `type` as we use it to change type of button // replaced with `htmlType` - extends Omit, 'type'>, + extends + Omit, 'type'>, // omit 'disabled' as it is included in HTMLButtonElement Omit, Omit { diff --git a/packages/ui/src/components/Input/Input.tsx b/packages/ui/src/components/Input/Input.tsx index 70091f0e4b8..ec30cdcaf42 100644 --- a/packages/ui/src/components/Input/Input.tsx +++ b/packages/ui/src/components/Input/Input.tsx @@ -13,8 +13,10 @@ import { cn } from '../../lib/utils/cn' import { Button } from '../Button' import { useFormContext } from '../Form/FormContext' -export interface Props - extends Omit, 'size' | 'onCopy'> { +export interface Props extends Omit< + React.InputHTMLAttributes, + 'size' | 'onCopy' +> { inputClassName?: string iconContainerClassName?: string copy?: boolean @@ -196,8 +198,10 @@ function Input({ /** * @deprecated Use ./TextArea_Shadcn_ instead */ -export interface TextAreaProps - extends Omit, 'size' | 'onCopy'> { +export interface TextAreaProps extends Omit< + React.InputHTMLAttributes, + 'size' | 'onCopy' +> { textAreaClassName?: string descriptionText?: string | React.ReactNode | undefined error?: string diff --git a/packages/ui/src/components/Modal/Modal.tsx b/packages/ui/src/components/Modal/Modal.tsx index 0c1c0fe2574..f69afe220c2 100644 --- a/packages/ui/src/components/Modal/Modal.tsx +++ b/packages/ui/src/components/Modal/Modal.tsx @@ -55,10 +55,9 @@ export interface ModalProps extends React.ComponentProps { closable?: boolean } -interface ModalType - extends React.ForwardRefExoticComponent< - React.ComponentPropsWithoutRef & ModalProps - > { +interface ModalType extends React.ForwardRefExoticComponent< + React.ComponentPropsWithoutRef & ModalProps +> { Content: React.ComponentType<{ children: React.ReactNode; className?: string }> Separator: React.ComponentType } diff --git a/packages/ui/src/components/NavMenu/index.tsx b/packages/ui/src/components/NavMenu/index.tsx index d930eaa017c..8e31e46b764 100644 --- a/packages/ui/src/components/NavMenu/index.tsx +++ b/packages/ui/src/components/NavMenu/index.tsx @@ -21,11 +21,10 @@ export const NavMenu = forwardRef( } ) -interface NavMenuItemProps - extends PropsWithChildren<{ - className?: string - active: boolean - }> {} +interface NavMenuItemProps extends PropsWithChildren<{ + className?: string + active: boolean +}> {} export const NavMenuItem = forwardRef( ({ children, className, active, ...props }, ref) => ( diff --git a/packages/ui/src/components/SidePanel/SidePanel.tsx b/packages/ui/src/components/SidePanel/SidePanel.tsx index cde94fa4846..bdd82e5b41e 100644 --- a/packages/ui/src/components/SidePanel/SidePanel.tsx +++ b/packages/ui/src/components/SidePanel/SidePanel.tsx @@ -10,7 +10,8 @@ import styleHandler from '../../lib/theme/styleHandler' export type SidePanelProps = RadixProps & CustomProps interface RadixProps - extends Dialog.DialogProps, + extends + Dialog.DialogProps, Pick< Dialog.DialogContentProps, | 'onOpenAutoFocus' diff --git a/packages/ui/src/components/shadcn/ui/badge.tsx b/packages/ui/src/components/shadcn/ui/badge.tsx index 413ac13dbce..07372f921b7 100644 --- a/packages/ui/src/components/shadcn/ui/badge.tsx +++ b/packages/ui/src/components/shadcn/ui/badge.tsx @@ -25,8 +25,7 @@ const badgeVariants = cva( ) export interface BadgeProps - extends React.HTMLAttributes, - VariantProps {} + extends React.HTMLAttributes, VariantProps {} // Forward refs in order to allow tooltips to be applied to the badge const Badge = React.forwardRef( diff --git a/packages/ui/src/components/shadcn/ui/button.tsx b/packages/ui/src/components/shadcn/ui/button.tsx index 81e745911eb..3363e579196 100644 --- a/packages/ui/src/components/shadcn/ui/button.tsx +++ b/packages/ui/src/components/shadcn/ui/button.tsx @@ -33,8 +33,7 @@ const buttonVariants = cva( ) export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { + extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean } diff --git a/packages/ui/src/components/shadcn/ui/input.tsx b/packages/ui/src/components/shadcn/ui/input.tsx index 111e4edfb63..bb0630850da 100644 --- a/packages/ui/src/components/shadcn/ui/input.tsx +++ b/packages/ui/src/components/shadcn/ui/input.tsx @@ -5,7 +5,8 @@ import { SIZE_VARIANTS, SIZE_VARIANTS_DEFAULT } from '../../../lib/constants' import { cn } from '../../../lib/utils/cn' export interface InputProps - extends Omit, 'size'>, + extends + Omit, 'size'>, VariantProps {} export const InputVariants = cva( diff --git a/packages/ui/src/components/shadcn/ui/navigation-menu.tsx b/packages/ui/src/components/shadcn/ui/navigation-menu.tsx index 99e9b507821..35cb7bbd649 100644 --- a/packages/ui/src/components/shadcn/ui/navigation-menu.tsx +++ b/packages/ui/src/components/shadcn/ui/navigation-menu.tsx @@ -7,8 +7,9 @@ import * as React from 'react' import { cn } from '../../../lib/utils/cn' -interface NavigationMenuProps - extends React.ComponentPropsWithoutRef { +interface NavigationMenuProps extends React.ComponentPropsWithoutRef< + typeof NavigationMenuPrimitive.Root +> { viewportClassName?: string | undefined renderViewport?: boolean | undefined } diff --git a/packages/ui/src/components/shadcn/ui/sheet.tsx b/packages/ui/src/components/shadcn/ui/sheet.tsx index 7a1697cd853..c0f6fd70e7d 100644 --- a/packages/ui/src/components/shadcn/ui/sheet.tsx +++ b/packages/ui/src/components/shadcn/ui/sheet.tsx @@ -26,8 +26,7 @@ const portalVariants = cva('fixed inset-0 z-50 flex', { }) interface SheetPortalProps - extends SheetPrimitive.DialogPortalProps, - VariantProps {} + extends SheetPrimitive.DialogPortalProps, VariantProps {} const SheetPortal = ({ side, children, ...props }: SheetPortalProps) => ( {children} @@ -148,7 +147,8 @@ const sheetVariants = cva(classes, { }) export interface DialogContentProps - extends React.ComponentPropsWithoutRef, + extends + React.ComponentPropsWithoutRef, VariantProps { showClose?: boolean hasOverlay?: boolean diff --git a/packages/ui/src/components/shadcn/ui/switch.tsx b/packages/ui/src/components/shadcn/ui/switch.tsx index dd53352d908..b0c1d23a5bc 100644 --- a/packages/ui/src/components/shadcn/ui/switch.tsx +++ b/packages/ui/src/components/shadcn/ui/switch.tsx @@ -42,7 +42,8 @@ const switchThumbVariants = cva( ) export interface SwitchProps - extends React.ComponentPropsWithoutRef, + extends + React.ComponentPropsWithoutRef, VariantProps {} const Switch = React.forwardRef, SwitchProps>( diff --git a/packages/ui/src/lib/MarkdownSample.md b/packages/ui/src/lib/MarkdownSample.md index a37fd608d76..6756b7cc832 100644 --- a/packages/ui/src/lib/MarkdownSample.md +++ b/packages/ui/src/lib/MarkdownSample.md @@ -149,14 +149,12 @@ The most annoying thing about lists in Markdown is that `
  • ` elements aren't g - **For example, here's another nested list.** But this time with a second paragraph. - - These list items won't have `

    ` tags - Because they are only one line each - **But in this second top-level list item, they will.** This is especially annoying because of the spacing on this paragraph. - - As you can see here, because I've added a second line, this list item now has a `

    ` tag. This is the second line I'm talking about by the way. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aef97ed5057..f0e979d9d09 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,7 +95,7 @@ importers: version: 3.823.0 '@ianvs/prettier-plugin-sort-imports': specifier: ^4.7.0 - version: 4.7.0(@vue/compiler-sfc@3.5.21)(prettier@3.2.4)(supports-color@8.1.1) + version: 4.7.0(@vue/compiler-sfc@3.5.21)(prettier@3.7.3)(supports-color@8.1.1) '@types/node': specifier: 'catalog:' version: 22.13.14 @@ -106,11 +106,11 @@ importers: specifier: ^28.1.0 version: 28.1.0(@noble/hashes@1.8.0)(supports-color@8.1.1) prettier: - specifier: 3.2.4 - version: 3.2.4 + specifier: 3.7.3 + version: 3.7.3 prettier-plugin-sql-cst: - specifier: ^0.11.0 - version: 0.11.1 + specifier: ^0.18.0 + version: 0.18.0 rimraf: specifier: ^6.0.0 version: 6.0.1 @@ -1258,9 +1258,6 @@ importers: postcss: specifier: ^8.5.3 version: 8.5.3 - prettier: - specifier: 3.2.4 - version: 3.2.4 raw-loader: specifier: ^4.0.2 version: 4.0.2(webpack@5.94.0) @@ -2017,8 +2014,8 @@ importers: specifier: ^7.4.3 version: 7.5.2(encoding@0.1.13)(typescript@5.9.2) prettier: - specifier: 3.2.4 - version: 3.2.4 + specifier: '*' + version: 3.7.3 typescript: specifier: 'catalog:' version: 5.9.2 @@ -2028,9 +2025,6 @@ importers: minimist: specifier: ^1.2.7 version: 1.2.8 - prettier: - specifier: 3.2.4 - version: 3.2.4 svgson: specifier: ^5.2.1 version: 5.3.1 @@ -15695,8 +15689,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-sql-cst@0.11.1: - resolution: {integrity: sha512-MZ8058LfIlNyGILQBeKE15PUTKGbP/QgflKcjkIl+JKgT4jiN6vecgfEhpMnhZLvopxX0xjuDyKM+/4mE0j6Ug==} + prettier-plugin-sql-cst@0.18.0: + resolution: {integrity: sha512-IEbKtlZ+H94uWFHQt4iKWMiJJRIuzWYw8jeLz+RCzy4bDtsM3/07GIF1+EFCbT9d0gWibTPotZWx8o3hz+ITeA==} prettier-plugin-sql@0.13.0: resolution: {integrity: sha512-Ui9603tDD6PFyr7JvIEoE6cIFMQnJVDriG+oLyVThsGo/MIl5ek18JhH3xtox9ux8jvyww/FUFrJzxpZ7FIdvw==} @@ -15709,16 +15703,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.2.4: - resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} - engines: {node: '>=14'} - hasBin: true - - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - prettier@3.7.3: resolution: {integrity: sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==} engines: {node: '>=14'} @@ -16997,8 +16981,8 @@ packages: resolution: {integrity: sha512-5vmt2HlCAVozxsBZuXWkAki/KGawaK+b5GG5x+BtXOFVpN/8cqppblFUxHl4jxdA0cvo14lABhM+KBnrUapOlw==} hasBin: true - sql-parser-cst@0.24.0: - resolution: {integrity: sha512-38NNWamo0PKv80Zn8r1iXgatkWEB04CPhun8nEQhEJlYBMSIV4OOt4g3diynjVHJSunNSQqAjKcwmhM0EeLCtg==} + sql-parser-cst@0.38.2: + resolution: {integrity: sha512-4SR3cZYMxG4gsmvZQSQYYzzfk20OnbpsnwOVbU6Fw39ORLPpIHCMqoX5li0dz+ZWyF5HeR+mSgbgayKhN4JR9w==} sql-template-strings@2.2.2: resolution: {integrity: sha512-UXhXR2869FQaD+GMly8jAMCRZ94nU5KcrFetZfWEMd+LVVG6y0ExgHAhatEcKZ/wk8YcKPdi+hiD2wm75lq3/Q==} @@ -21018,13 +21002,13 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@ianvs/prettier-plugin-sort-imports@4.7.0(@vue/compiler-sfc@3.5.21)(prettier@3.2.4)(supports-color@8.1.1)': + '@ianvs/prettier-plugin-sort-imports@4.7.0(@vue/compiler-sfc@3.5.21)(prettier@3.7.3)(supports-color@8.1.1)': dependencies: '@babel/generator': 7.29.0 '@babel/parser': 7.29.0 '@babel/traverse': 7.29.0(supports-color@8.1.1) '@babel/types': 7.29.0 - prettier: 3.2.4 + prettier: 3.7.3 semver: 7.7.3 optionalDependencies: '@vue/compiler-sfc': 3.5.21 @@ -25699,7 +25683,7 @@ snapshots: dependencies: '@babel/parser': 7.29.0 libpg-query: 15.2.0(encoding@0.1.13)(supports-color@8.1.1) - prettier: 3.2.5 + prettier: 3.7.3 transitivePeerDependencies: - encoding - supports-color @@ -34704,10 +34688,10 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-sql-cst@0.11.1: + prettier-plugin-sql-cst@0.18.0: dependencies: - prettier: 3.2.5 - sql-parser-cst: 0.24.0 + prettier: 3.7.3 + sql-parser-cst: 0.38.2 prettier-plugin-sql@0.13.0(prettier@2.8.8): dependencies: @@ -34718,10 +34702,6 @@ snapshots: prettier@2.8.8: {} - prettier@3.2.4: {} - - prettier@3.2.5: {} - prettier@3.7.3: {} pretty-bytes@7.0.1: {} @@ -36381,7 +36361,7 @@ snapshots: get-stdin: 8.0.0 nearley: 2.20.1 - sql-parser-cst@0.24.0: {} + sql-parser-cst@0.38.2: {} sql-template-strings@2.2.2: {} diff --git a/prettier.config.mjs b/prettier.config.mjs index 26d1ac4e645..2c42fb52245 100644 --- a/prettier.config.mjs +++ b/prettier.config.mjs @@ -6,6 +6,8 @@ let options = { printWidth: 100, endOfLine: 'lf', sqlKeywordCase: 'lower', + sqlLiteralCase: 'lower', + sqlTypeCase: 'lower', plugins: ['prettier-plugin-sql-cst'], overrides: [ { From d6f10cae9f0faeea8417d27db0ba0e9e56b6ee08 Mon Sep 17 00:00:00 2001 From: "Andrey A." <56412611+aantti@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:17:59 +0100 Subject: [PATCH 011/169] fix: adjust proxy configs for new api keys and auth (#43837) --- docker/docker-compose.caddy.yml | 4 +++ docker/docker-compose.nginx.yml | 4 +++ docker/volumes/proxy/caddy/Caddyfile | 20 +---------- .../proxy/nginx/supabase-nginx.conf.tpl | 34 +++++-------------- 4 files changed, 17 insertions(+), 45 deletions(-) diff --git a/docker/docker-compose.caddy.yml b/docker/docker-compose.caddy.yml index b31ee8db586..3f12d3bf208 100644 --- a/docker/docker-compose.caddy.yml +++ b/docker/docker-compose.caddy.yml @@ -2,6 +2,8 @@ services: kong: ports: !reset [] + environment: + KONG_PORT_MAPS: "443:8000,443:8443" caddy: container_name: supabase-caddy @@ -14,6 +16,8 @@ services: depends_on: kong: condition: service_healthy + studio: + condition: service_healthy environment: PROXY_DOMAIN: ${PROXY_DOMAIN} PROXY_AUTH_USERNAME: ${DASHBOARD_USERNAME} diff --git a/docker/docker-compose.nginx.yml b/docker/docker-compose.nginx.yml index e693a86aee1..81d604b36ab 100644 --- a/docker/docker-compose.nginx.yml +++ b/docker/docker-compose.nginx.yml @@ -2,6 +2,8 @@ services: kong: ports: !reset [] + environment: + KONG_PORT_MAPS: "443:8000,443:8443" nginx: container_name: supabase-nginx @@ -13,6 +15,8 @@ services: depends_on: kong: condition: service_healthy + studio: + condition: service_healthy environment: PROXY_DOMAIN: ${PROXY_DOMAIN} CERTBOT_EMAIL: ${CERTBOT_EMAIL} diff --git a/docker/volumes/proxy/caddy/Caddyfile b/docker/volumes/proxy/caddy/Caddyfile index d76c3ed36f3..d6f4ba010f1 100644 --- a/docker/volumes/proxy/caddy/Caddyfile +++ b/docker/volumes/proxy/caddy/Caddyfile @@ -1,28 +1,10 @@ {$PROXY_DOMAIN} { - @supabase_api path /auth/v1/* /rest/v1/* /graphql/v1/* /realtime/v1/* /functions/v1/* /mcp + @supabase_api path /auth/v1/* /rest/v1/* /graphql/v1 /realtime/v1/* /storage/v1/* /functions/v1/* /mcp handle @supabase_api { reverse_proxy kong:8000 } - handle_path /storage/v1/* { - # CORS headers for Storage (bypasses Kong, which normally handles CORS) - @cors_preflight method OPTIONS - handle @cors_preflight { - header Access-Control-Allow-Origin * - header Access-Control-Allow-Methods "GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS" - header Access-Control-Allow-Headers * - respond 204 - } - - header Access-Control-Allow-Origin * - - reverse_proxy storage:5000 { - # Required for TUS resumable upload Location headers and S3 signature verification. - header_up X-Forwarded-Prefix /{http.request.orig_uri.path.0}/{http.request.orig_uri.path.1} - } - } - handle { basic_auth { # PROXY_AUTH_PASSWORD is overwritten with the bcrypt on startup diff --git a/docker/volumes/proxy/nginx/supabase-nginx.conf.tpl b/docker/volumes/proxy/nginx/supabase-nginx.conf.tpl index f50f23653c0..6e98d32bc9b 100644 --- a/docker/volumes/proxy/nginx/supabase-nginx.conf.tpl +++ b/docker/volumes/proxy/nginx/supabase-nginx.conf.tpl @@ -50,6 +50,10 @@ server { proxy_pass http://kong_upstream; } + location /graphql { + proxy_pass http://kong_upstream; + } + location /realtime/v1/ { proxy_pass http://kong_upstream; @@ -67,42 +71,20 @@ server { } location /storage/v1/ { - proxy_pass http://storage:5000/; + proxy_pass http://kong_upstream; + proxy_buffering off; + proxy_request_buffering off; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $remote_addr; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $http_host; - proxy_set_header X-Forwarded-Port $server_port; - - # Required for TUS resumable upload Location headers and S3 signature verification. - proxy_set_header X-Forwarded-Prefix /storage/v1; + chunked_transfer_encoding off; client_max_body_size 0; - - # CORS headers for Storage (bypasses Kong, which normally handles CORS) - if ($request_method = OPTIONS) { - add_header 'Access-Control-Allow-Origin' '*'; - add_header 'Access-Control-Allow-Methods' 'GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS'; - add_header 'Access-Control-Allow-Headers' '*'; - add_header 'Content-Length' 0; - add_header 'Content-Type' 'text/plain charset=UTF-8'; - return 204; - } - - add_header 'Access-Control-Allow-Origin' '*'; } location /functions { proxy_pass http://kong_upstream; } - location /graphql { - proxy_pass http://kong_upstream; - } - location /mcp { proxy_pass http://kong_upstream; } From 6ea650f999e0a3c574cf0485545f7ec07fdf8c7a Mon Sep 17 00:00:00 2001 From: "Andrey A." <56412611+aantti@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:32:42 +0100 Subject: [PATCH 012/169] fix: revise and update proxy how-to (#43853) --- .../self-hosting/self-hosted-proxy-https.mdx | 24 ++++--------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/apps/docs/content/guides/self-hosting/self-hosted-proxy-https.mdx b/apps/docs/content/guides/self-hosting/self-hosted-proxy-https.mdx index 25723468ba8..cb040b48ab4 100644 --- a/apps/docs/content/guides/self-hosting/self-hosted-proxy-https.mdx +++ b/apps/docs/content/guides/self-hosting/self-hosted-proxy-https.mdx @@ -31,21 +31,7 @@ If you already run [HAProxy](https://www.haproxy.com/), [Traefik](https://traefi -### Step 1: Remove public port bindings for API gateway - -Comment out Kong's host port mappings in `docker-compose.yml` so that it's not exposed to the Internet: - -```yaml -kong: - # ... - ports: - # - ${KONG_HTTP_PORT}:8000/tcp - # - ${KONG_HTTPS_PORT}:8443/tcp -``` - -Kong remains accessible to other containers on the internal Docker network. - -### Step 2: Update environment variables +### Step 1: Update environment variables Update the URL configuration in your `.env` file to use your HTTPS domain: @@ -62,7 +48,7 @@ PROXY_DOMAIN=your-domain.example.com CERTBOT_EMAIL=admin@your-domain.example.com ``` -### Step 3: Start the reverse proxy +### Step 2: Start the reverse proxy Pick one of the options below and use the corresponding Docker Compose overlay. @@ -102,7 +88,7 @@ HTTP-to-HTTPS redirects are handled automatically by the `jonasal/nginx-certbot` -### Step 4: Verify HTTPS connection +### Step 3: Verify HTTPS connection ```sh curl -I https:///auth/v1/ @@ -137,13 +123,13 @@ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ ### Step 2: Configure Kong for SSL -Comment out Kong's HTTP port mapping in `docker-compose.yml`: +Comment out Kong's **HTTP** port mapping in `docker-compose.yml`: ```yaml kong: # ... ports: - # - ${KONG_HTTP_PORT}:8000/tcp + #- ${KONG_HTTP_PORT}:8000/tcp ``` Uncomment the certificate volume mounts and SSL environment variables in `docker-compose.yml`: From 9dd19f1da578e4c9570d2289823671a4e555908a Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 17 Mar 2026 12:27:44 +0100 Subject: [PATCH 013/169] fix: prevent unnecessary dialog after saving a new edge function (#43854) ## Problem After deploying a new edge function where you actually modified the code from the initial template, a dialog appears about unsaved changes. ## Solution We must check that even though the files have changed from the initial ones, we actually saved them by deploying the function. However, because we trigger the navigation in the mutation `onSuccess` side effect, it happens before react can update the state that would prevent the dialog from appearing. --- .../pages/project/[ref]/functions/new.tsx | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/apps/studio/pages/project/[ref]/functions/new.tsx b/apps/studio/pages/project/[ref]/functions/new.tsx index 42d0b7bd125..0897ffd42a0 100644 --- a/apps/studio/pages/project/[ref]/functions/new.tsx +++ b/apps/studio/pages/project/[ref]/functions/new.tsx @@ -143,14 +143,22 @@ const NewFunctionPage = () => { }, }) - const { mutate: deployFunction, isPending: isDeploying } = useEdgeFunctionDeployMutation({ + const { + mutate: deployFunction, + isPending: isDeploying, + isSuccess: hasDeployed, + } = useEdgeFunctionDeployMutation({ // [Joshen] To investigate: For some reason, the invalidation for list of edge functions isn't triggering onSuccess: () => { toast.success('Successfully deployed edge function') const functionName = form.getValues('functionName') - if (ref && functionName) { - router.push(`/project/${ref}/functions/${functionName}/details`) - } + // Allow the mutation state (isSuccess) to propagate before navigating + // to prevent unnecessary dialog about unsaved changes + setTimeout(() => { + if (ref && functionName) { + router.push(`/project/${ref}/functions/${functionName}/details`) + } + }, 150) }, }) @@ -415,7 +423,7 @@ const NewFunctionPage = () => { - + ) } From bb1ced5e1076e3c2046e7560dfcaad155d11d48d Mon Sep 17 00:00:00 2001 From: Chris Chinchilla Date: Tue, 17 Mar 2026 13:07:43 +0100 Subject: [PATCH 014/169] docs: Update ionic vue example with more appropriate auth methods, code sample component, and language changes (#43817) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../tutorials/with-ionic-vue.mdx | 586 +- .../ionic-vue-user-management/.browserslistrc | 4 + .../ionic-vue-user-management/.eslintrc.js | 32 + .../ionic-vue-user-management/.gitignore | 31 + .../ionic-vue-user-management/.npmrc | 1 + .../ionic-vue-user-management/README.md | 133 + .../ionic-vue-user-management/babel.config.js | 5 + .../capacitor.config.ts | 10 + .../ionic-vue-user-management/cypress.json | 3 + .../ionic.config.json | 7 + .../ionic-vue-user-management/jest.config.js | 4 + .../package-lock.json | 21745 ++++++++++++++++ .../ionic-vue-user-management/package.json | 51 + .../public/assets/icon/favicon.png | Bin 0 -> 930 bytes .../public/assets/icon/icon.png | Bin 0 -> 23794 bytes .../public/assets/shapes.svg | 1 + .../public/index.html | 30 + .../ionic-vue-user-management/src/App.vue | 33 + .../src/components/Avatar.vue | 102 + .../ionic-vue-user-management/src/main.ts | 20 + .../src/router/index.ts | 23 + .../src/shims-vue.d.ts | 6 + .../src/store/index.ts | 6 + .../ionic-vue-user-management/src/supabase.ts | 18 + .../src/theme/variables.css | 236 + .../src/views/Account.vue | 153 + .../src/views/HomePage.vue | 56 + .../src/views/Login.vue | 74 + .../tests/e2e/.eslintrc.js | 12 + .../tests/e2e/plugins/index.js | 25 + .../tests/e2e/specs/test.js | 8 + .../tests/e2e/support/commands.js | 25 + .../tests/e2e/support/index.js | 20 + .../tests/unit/example.spec.ts | 9 + .../ionic-vue-user-management/tsconfig.json | 40 + 35 files changed, 22975 insertions(+), 534 deletions(-) create mode 100644 examples/user-management/ionic-vue-user-management/.browserslistrc create mode 100644 examples/user-management/ionic-vue-user-management/.eslintrc.js create mode 100644 examples/user-management/ionic-vue-user-management/.gitignore create mode 100644 examples/user-management/ionic-vue-user-management/.npmrc create mode 100644 examples/user-management/ionic-vue-user-management/README.md create mode 100644 examples/user-management/ionic-vue-user-management/babel.config.js create mode 100644 examples/user-management/ionic-vue-user-management/capacitor.config.ts create mode 100644 examples/user-management/ionic-vue-user-management/cypress.json create mode 100644 examples/user-management/ionic-vue-user-management/ionic.config.json create mode 100644 examples/user-management/ionic-vue-user-management/jest.config.js create mode 100644 examples/user-management/ionic-vue-user-management/package-lock.json create mode 100644 examples/user-management/ionic-vue-user-management/package.json create mode 100644 examples/user-management/ionic-vue-user-management/public/assets/icon/favicon.png create mode 100644 examples/user-management/ionic-vue-user-management/public/assets/icon/icon.png create mode 100644 examples/user-management/ionic-vue-user-management/public/assets/shapes.svg create mode 100644 examples/user-management/ionic-vue-user-management/public/index.html create mode 100644 examples/user-management/ionic-vue-user-management/src/App.vue create mode 100644 examples/user-management/ionic-vue-user-management/src/components/Avatar.vue create mode 100644 examples/user-management/ionic-vue-user-management/src/main.ts create mode 100644 examples/user-management/ionic-vue-user-management/src/router/index.ts create mode 100644 examples/user-management/ionic-vue-user-management/src/shims-vue.d.ts create mode 100644 examples/user-management/ionic-vue-user-management/src/store/index.ts create mode 100644 examples/user-management/ionic-vue-user-management/src/supabase.ts create mode 100644 examples/user-management/ionic-vue-user-management/src/theme/variables.css create mode 100644 examples/user-management/ionic-vue-user-management/src/views/Account.vue create mode 100644 examples/user-management/ionic-vue-user-management/src/views/HomePage.vue create mode 100644 examples/user-management/ionic-vue-user-management/src/views/Login.vue create mode 100644 examples/user-management/ionic-vue-user-management/tests/e2e/.eslintrc.js create mode 100644 examples/user-management/ionic-vue-user-management/tests/e2e/plugins/index.js create mode 100644 examples/user-management/ionic-vue-user-management/tests/e2e/specs/test.js create mode 100644 examples/user-management/ionic-vue-user-management/tests/e2e/support/commands.js create mode 100644 examples/user-management/ionic-vue-user-management/tests/e2e/support/index.js create mode 100644 examples/user-management/ionic-vue-user-management/tests/unit/example.spec.ts create mode 100644 examples/user-management/ionic-vue-user-management/tsconfig.json diff --git a/apps/docs/content/guides/getting-started/tutorials/with-ionic-vue.mdx b/apps/docs/content/guides/getting-started/tutorials/with-ionic-vue.mdx index ed80d020774..70c84bdae8d 100644 --- a/apps/docs/content/guides/getting-started/tutorials/with-ionic-vue.mdx +++ b/apps/docs/content/guides/getting-started/tutorials/with-ionic-vue.mdx @@ -9,7 +9,7 @@ description: 'Learn how to use Supabase in your Ionic Vue App.' -If you get stuck while working through this guide, refer to the [full example on GitHub](https://github.com/mhartington/supabase-ionic-vue). +If you get stuck while working through this guide, refer to the [full example on GitHub](https://github.com/supabase/supabase/tree/master/examples/user-management/ionic-vue-user-management). @@ -17,11 +17,11 @@ If you get stuck while working through this guide, refer to the [full example on ## Building the app -Let's start building the Vue app from scratch. +Start by building the Vue app from scratch. ### Initialize an Ionic Vue app -We can use the [Ionic CLI](https://ionicframework.com/docs/cli) to initialize an app called `supabase-ionic-vue`: +Use the [Ionic CLI](https://ionicframework.com/docs/cli) to initialize an app called `supabase-ionic-vue`: ```bash npm install -g @ionic/cli @@ -29,403 +29,66 @@ ionic start supabase-ionic-vue blank --type vue cd supabase-ionic-vue ``` -Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) +Install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) ```bash npm install @supabase/supabase-js ``` -And finally we want to save the environment variables in a `.env`. - -All we need are the API URL and the key that you copied [earlier](#get-api-details). +Save the environment variables in a `.env` file, including the API URL and key that you copied [earlier](#get-api-details). <$CodeTabs> ```bash name=.env -VITE_SUPABASE_URL=YOUR_SUPABASE_URL -VITE_SUPABASE_PUBLISHABLE_KEY=YOUR_SUPABASE_PUBLISHABLE_KEY +VUE_APP_SUPABASE_URL=YOUR_SUPABASE_URL +VUE_APP_SUPABASE_KEY=YOUR_SUPABASE_KEY ``` -Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. +With the API credentials in place, create a helper file to initialize the Supabase client. These variables will be exposed on the browser, and that's fine since Supabase enables [Row Level Security](/docs/guides/auth#row-level-security) on Databases by default. -<$CodeTabs> - -```js name=src/supabase.ts -import { createClient } from '@supabase/supabase-js'; - -const supabaseUrl = import.meta.env.VITE_SUPABASE_URL as string; -const supabasePublishableKey = import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY as string; - -export const supabase = createClient(supabaseUrl, supabasePublishableKey); -``` - - +<$CodeSample +path="/user-management/ionic-vue-user-management/src/supabase.ts" +lines={[[1, -1]]} +meta="name=src/supabase.ts" +/> ### Set up a login route -Let's set up a Vue component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. +Create a Vue component to manage logins and sign ups that uses Magic Links, so users can sign in with their email without using passwords. -<$CodeTabs> - -```html name=/src/views/Login.vue - - - -``` - - +<$CodeSample +path="/user-management/ionic-vue-user-management/src/views/Login.vue" +lines={[[1, -1]]} +meta="name=src/views/Login.vue" +/> ### Account page -After a user is signed in we can allow them to edit their profile details and manage their account. +After a user has signed in, let them edit their profile details and manage their account with a new component called `Account.vue`. -Let's create a new component for that called `Account.vue`. - -<$CodeTabs> - -```html name=src/views/Account.vue - - - -``` - - +<$CodeSample +path="/user-management/ionic-vue-user-management/src/views/Account.vue" +lines={[[1, -1]]} +meta="name=src/views/Account.vue" +/> ### Launch! -Now that we have all the components in place, let's update `App.vue` and our routes: +With all the components in place, update `App.vue` and the app routes: -<$CodeTabs> +<$CodeSample +path="/user-management/ionic-vue-user-management/src/router/index.ts" +lines={[[1, -1]]} +meta="name=src/router/index.ts" +/> -```ts name=src/router.index.ts -import { createRouter, createWebHistory } from '@ionic/vue-router' -import { RouteRecordRaw } from 'vue-router' -import LoginPage from '../views/Login.vue' -import AccountPage from '../views/Account.vue' -const routes: Array = [ - { - path: '/', - name: 'Login', - component: LoginPage, - }, - { - path: '/account', - name: 'Account', - component: AccountPage, - }, -] - -const router = createRouter({ - history: createWebHistory(import.meta.env.BASE_URL), - routes, -}) - -export default router -``` - -```html name=src/App.vue - - - -``` - - +<$CodeSample +path="/user-management/ionic-vue-user-management/src/App.vue" +lines={[[1, -1]]} +meta="name=src/App.vue" +/> Once that's done, run this in a terminal window: @@ -433,7 +96,7 @@ Once that's done, run this in a terminal window: ionic serve ``` -And then open the browser to [localhost:3000](http://localhost:3000) and you should see the completed app. +And then open the browser to [localhost:8100](http://localhost:8100) and you should see the completed app. ![Supabase Ionic Vue](/docs/img/ionic-demos/ionic-vue.png) @@ -443,179 +106,34 @@ Every Supabase project is configured with [Storage](/docs/guides/storage) for ma ### Create an upload widget -First install two packages in order to interact with the user's camera. +First install two packages to interact with the user's camera. ```bash npm install @ionic/pwa-elements @capacitor/camera ``` -[Capacitor](https://capacitorjs.com) is a cross-platform native runtime from Ionic that enables web apps to be deployed through the app store and provides access to native device API. +[Capacitor](https://capacitorjs.com) is a cross-platform native runtime from Ionic that enables you to deploy web apps to app stores and provides access to native device API. -Ionic PWA elements is a companion package that will polyfill certain browser APIs that provide no user interface with custom Ionic UI. +Ionic PWA elements is a companion package that polyfills certain browser APIs that provide no user interface with custom Ionic UI. -With those packages installed we can update our `main.ts` to include an additional bootstrapping call for the Ionic PWA Elements. +With those packages installed, update `main.ts` to include an additional bootstrapping call for the Ionic PWA Elements. -<$CodeTabs> - -```ts name=src/main.tsx -import { createApp } from 'vue' -import App from './App.vue' -import router from './router' - -import { IonicVue } from '@ionic/vue' -/* Core CSS required for Ionic components to work properly */ -import '@ionic/vue/css/ionic.bundle.css' - -/* Theme variables */ -import './theme/variables.css' - -import { defineCustomElements } from '@ionic/pwa-elements/loader' -defineCustomElements(window) -const app = createApp(App).use(IonicVue).use(router) - -router.isReady().then(() => { - app.mount('#app') -}) -``` - - +<$CodeSample +path="/user-management/ionic-vue-user-management/src/main.ts" +lines={[[1, -1]]} +meta="name=src/main.ts" +/> Then create an `AvatarComponent`. -<$CodeTabs> - -```html name=src/components/Avatar.vue - - - - -``` - - +<$CodeSample +path="/user-management/ionic-vue-user-management/src/components/Avatar.vue" +lines={[[1, -1]]} +meta="name=src/components/Avatar.vue" +/> ### Add the new widget -And then we can add the widget to the Account page: - -<$CodeTabs> - -```html name=src/views/Account.vue - - -``` - - +Add the widget to the Account page (already included in the Account.vue code above since the example includes the Avatar component by default). At this stage you have a fully functional application! diff --git a/examples/user-management/ionic-vue-user-management/.browserslistrc b/examples/user-management/ionic-vue-user-management/.browserslistrc new file mode 100644 index 00000000000..40bd99ce6ea --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/.browserslistrc @@ -0,0 +1,4 @@ +> 1% +last 2 versions +not dead +not ie 11 \ No newline at end of file diff --git a/examples/user-management/ionic-vue-user-management/.eslintrc.js b/examples/user-management/ionic-vue-user-management/.eslintrc.js new file mode 100644 index 00000000000..5456b51e1d7 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/.eslintrc.js @@ -0,0 +1,32 @@ +module.exports = { + root: true, + env: { + node: true + }, + 'extends': [ + 'plugin:vue/vue3-essential', + 'eslint:recommended', + '@vue/typescript/recommended' + ], + parserOptions: { + ecmaVersion: 2020 + }, + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'vue/no-deprecated-slot-attribute': 'off', + 'vue/multi-word-component-names': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, + overrides: [ + { + files: [ + '**/__tests__/*.{j,t}s?(x)', + '**/tests/unit/**/*.spec.{j,t}s?(x)' + ], + env: { + jest: true + } + } + ] +} diff --git a/examples/user-management/ionic-vue-user-management/.gitignore b/examples/user-management/ionic-vue-user-management/.gitignore new file mode 100644 index 00000000000..11b007482e4 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/.gitignore @@ -0,0 +1,31 @@ +# Specifies intentionally untracked files to ignore when using Git +# http://git-scm.com/docs/gitignore + +*~ +*.sw[mnpcod] +.tmp +*.tmp +*.tmp.* +*.sublime-project +*.sublime-workspace +.DS_Store +Thumbs.db +UserInterfaceState.xcuserstate +$RECYCLE.BIN/ +.env.local +*.log +log.txt +npm-debug.log* + +/.idea +/.ionic +/.sass-cache +/.sourcemaps +/.versions +/.vscode +/coverage +/dist +/node_modules +/platforms +/plugins +/www diff --git a/examples/user-management/ionic-vue-user-management/.npmrc b/examples/user-management/ionic-vue-user-management/.npmrc new file mode 100644 index 00000000000..521a9f7c077 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/examples/user-management/ionic-vue-user-management/README.md b/examples/user-management/ionic-vue-user-management/README.md new file mode 100644 index 00000000000..acaf8ad5915 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/README.md @@ -0,0 +1,133 @@ +# Supabase Ionic Vue User Management + +> This project is based on the Supabase Ionic Vue user management [Quickstart](https://supabase.io/docs/guides/with-ionic-vue) +> To keep it in sync with this Quickstart, architecture choices have been made to facilitate the comparison +> + +This example will set you up for a very common situation: users can sign up with a magic link and then update their account with profile information, including a profile image. + +This demonstrates how to use: + +- User signups using Supabase [Auth](https://supabase.io/auth). +- User avatar images using Supabase [Storage](https://supabase.io/storage). +- Frontend using [Vue](https://vuejs.org). + +## Technologies used + +- Frontend: + - [Ionic](https://ionicframework.com) + - [Capacitor](https://capacitorjs.com) + - [Vue](https://vuejs.org) + - [Supabase.js](https://supabase.io/docs/library/getting-started) for user management and realtime data syncing. +- Backend: + - [app.supabase.io](https://app.supabase.io/): hosted Postgres database with restful API for usage with Supabase.js. + +## Instant deploy + +The Vercel deployment will guide you through creating a Supabase account and project. After installation of the Supabase integration, all relevant environment variables will be set up so that the project is usable immediately after deployment 🚀. + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?project-name=supabase-ionic-vue&repo-name=supabase-ionic-vue&envDescription=Find%20the%20Supabase%20URL%20and%20key%20in%20the%20your%20auto-generated%20docs%20at%20app.supabase.io&repository-url=https%3A%2F%2Fgithub.com%2Fmhartington%2Fsupabase-ionic-vue%2Ftree%2Fmain&env=VUE_APP_SUPABASE_URL%2CVUE_APP_SUPABASE_KEY) + +## Build from scratch + +### 1. Create new project + +Sign up to Supabase - [https://app.supabase.io](https://app.supabase.io) and create a new project. Wait for your database to start. + +### 2. Run "User Management" Quickstart + +Once your database has started, run the "User Management Starter" quickstart. Inside of your project, enter the `SQL editor` tab and scroll down until you see `User Management Starter: Set up a Public Profiles table which you can access with your API`. + +### 3. Get the URL and Key + +Go to the Project Settings (the cog icon), open the API tab, and find your API URL and `anon` key, you'll need these in the next step. + +The `anon` key is your client-side API key. It allows "anonymous access" to your database, until the user has logged in. Once they have logged in, the keys will switch to the user's own login token. This enables row level security for your data. Read more about this [below](#postgres-row-level-security). + +![image](https://user-images.githubusercontent.com/10214025/88916245-528c2680-d298-11ea-8a71-708f93e1ce4f.png) + +**_NOTE_**: The `service_role` key has full access to your data, bypassing any security policies. These keys have to be kept secret and are meant to be used in server environments and never on a client or browser. + +### 4. Env vars + +Update your environment file `environment.ts` + +``` +export const environment = { + // ... + supabaseUrl: "YOUR_SUPABASE_URL", + supabaseKey: "YOUR_SUPABASE_KEY" +}; +``` + +Populate this file with your URL and Key. + +### 5. Run the application + +Run the application: `ionic serve` and the browser will open to `https://localhost:8100/` and you are ready to go 🚀. + +## Supabase details + +### Postgres Row level security + +This project uses very high-level Authorization using Postgres' Role Level Security. +When you start a Postgres database on Supabase, we populate it with an `auth` schema, and some helper functions. +When a user logs in, they are issued a JWT with the role `authenticated` and their UUID. +We can use these details to provide fine-grained control over what each user can and cannot do. + +This is a trimmed-down schema, with the policies: + +```sql +-- Create a table for Public Profiles +create table profiles ( + id uuid references auth.users not null, + updated_at timestamp with time zone, + username text unique, + avatar_url text, + website text, + + primary key (id), + unique(username), + constraint username_length check (char_length(username) >= 3) +); + +alter table profiles enable row level security; + +create policy "Public profiles are viewable by everyone." + on profiles for select + using ( true ); + +create policy "Users can insert their own profile." + on profiles for insert + with check ( auth.uid() = id ); + +create policy "Users can update own profile." + on profiles for update + using ( auth.uid() = id ); + +-- Set up Realtime! +begin; + drop publication if exists supabase_realtime; + create publication supabase_realtime; +commit; +alter publication supabase_realtime add table profiles; + +-- Set up Storage! +insert into storage.buckets (id, name) +values ('avatars', 'avatars'); + +create policy "Avatar images are publicly accessible." + on storage.objects for select + using ( bucket_id = 'avatars' ); + +create policy "Anyone can upload an avatar." + on storage.objects for insert + with check ( bucket_id = 'avatars' ); +``` + +## Authors + +- [Supabase](https://supabase.io) +- [Mike Hartington](https://github.com/mhartington) + +Supabase is open source. We'd love for you to follow along and get involved at https://github.com/supabase/supabase diff --git a/examples/user-management/ionic-vue-user-management/babel.config.js b/examples/user-management/ionic-vue-user-management/babel.config.js new file mode 100644 index 00000000000..e9558405fdc --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/examples/user-management/ionic-vue-user-management/capacitor.config.ts b/examples/user-management/ionic-vue-user-management/capacitor.config.ts new file mode 100644 index 00000000000..72ba8bde908 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/capacitor.config.ts @@ -0,0 +1,10 @@ +import { CapacitorConfig } from '@capacitor/cli'; + +const config: CapacitorConfig = { + appId: 'io.ionic.starter', + appName: 'supabase-ionic-vue', + webDir: 'dist', + bundledWebRuntime: false +}; + +export default config; diff --git a/examples/user-management/ionic-vue-user-management/cypress.json b/examples/user-management/ionic-vue-user-management/cypress.json new file mode 100644 index 00000000000..470c7201999 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/cypress.json @@ -0,0 +1,3 @@ +{ + "pluginsFile": "tests/e2e/plugins/index.js" +} diff --git a/examples/user-management/ionic-vue-user-management/ionic.config.json b/examples/user-management/ionic-vue-user-management/ionic.config.json new file mode 100644 index 00000000000..7dfe9689dc2 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/ionic.config.json @@ -0,0 +1,7 @@ +{ + "name": "supabase-ionic-vue", + "integrations": { + "capacitor": {} + }, + "type": "vue" +} diff --git a/examples/user-management/ionic-vue-user-management/jest.config.js b/examples/user-management/ionic-vue-user-management/jest.config.js new file mode 100644 index 00000000000..ed2bdd5c7fa --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/jest.config.js @@ -0,0 +1,4 @@ +module.exports = { + preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel', + transformIgnorePatterns: ['/node_modules/(?!@ionic/vue|@ionic/vue-router|@ionic/core|@stencil/core|ionicons)'] +} diff --git a/examples/user-management/ionic-vue-user-management/package-lock.json b/examples/user-management/ionic-vue-user-management/package-lock.json new file mode 100644 index 00000000000..87ca9eb8882 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/package-lock.json @@ -0,0 +1,21745 @@ +{ + "name": "supabase-ionic-vue", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "supabase-ionic-vue", + "version": "0.0.1", + "dependencies": { + "@capacitor/app": "8.0.1", + "@capacitor/camera": "^8.0.2", + "@capacitor/core": "8.2.0", + "@capacitor/haptics": "8.0.1", + "@capacitor/keyboard": "8.0.1", + "@capacitor/status-bar": "8.0.1", + "@ionic/pwa-elements": "^3.4.0", + "@ionic/vue": "^8.8.1", + "@ionic/vue-router": "^8.8.1", + "@supabase/supabase-js": "^2.99.1", + "core-js": "^3.48.0", + "vue": "^3.5.30", + "vue-router": "^5.0.3" + }, + "devDependencies": { + "@capacitor/cli": "8.2.0", + "@types/jest": "^29.5.14", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "@vue/cli-plugin-babel": "~5.0.9", + "@vue/cli-plugin-e2e-cypress": "~5.0.9", + "@vue/cli-plugin-eslint": "~5.0.9", + "@vue/cli-plugin-router": "~5.0.9", + "@vue/cli-plugin-typescript": "~5.0.9", + "@vue/cli-plugin-unit-jest": "~5.0.9", + "@vue/cli-service": "~5.0.9", + "@vue/eslint-config-typescript": "^11.0.3", + "@vue/test-utils": "^2.4.6", + "@vue/vue3-jest": "^29.2.6", + "babel-jest": "^29.7.0", + "cypress": "^15.12.0", + "eslint": "^8.57.0", + "eslint-plugin-vue": "^9.32.0", + "jest": "^29.7.0", + "ts-jest": "^29.4.6", + "typescript": "^5.9.3" + } + }, + "node_modules/@achrinza/node-ipc": { + "version": "9.2.10", + "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.10.tgz", + "integrity": "sha512-rCkw57K82y1XA9KwBmuMrupFQr9VOS4Rn77vW2UD2j0+HjlP/npSON9COkUIfocd95B4wv5EpfWMr6lGD4lN3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + }, + "engines": { + "node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19 || 20 || 21 || 22 || 23 || 24 || 25" + } + }, + "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/core/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/@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==", + "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-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "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-compilation-targets/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/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/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/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/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/@babel/helper-define-polyfill-provider": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.7.tgz", + "integrity": "sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.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-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "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-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.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-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "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==", + "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==", + "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/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "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-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "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-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "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-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "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-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "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-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "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-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "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-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "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-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "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-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "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-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "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-runtime": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/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/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "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-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "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-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "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-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "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-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "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-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz", + "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.1.tgz", + "integrity": "sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.7", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/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/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "dev": true, + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@capacitor/app": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-8.0.1.tgz", + "integrity": "sha512-yeG3yyA0ETKqvgqexwHMBlmVOF13A1hRXzv/km0Ptv5TrNIZvZJK4MTI3uiqvnbHrzoJGP5DwWAjEXEfi90v3Q==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, + "node_modules/@capacitor/camera": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@capacitor/camera/-/camera-8.0.2.tgz", + "integrity": "sha512-v2BsKFjJSg0dMl/UO7jEvrAvjChCGrzQG5jx4yN2t8LnC7eFDh0YkSg1t+AMNveSDSKCvAsTk/JUzzr5VAvzmg==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, + "node_modules/@capacitor/cli": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-8.2.0.tgz", + "integrity": "sha512-1cMEk0d/I6tl1U+v/lnJR5Oylpx8ZBIHrvQxD5zK0MkjYOUyQAAGJgh97rkhGJqjAUvrGpa8H4BmyhNQN9a17A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/cli-framework-output": "^2.2.8", + "@ionic/utils-subprocess": "^3.0.1", + "@ionic/utils-terminal": "^2.3.5", + "commander": "^12.1.0", + "debug": "^4.4.0", + "env-paths": "^2.2.0", + "fs-extra": "^11.2.0", + "kleur": "^4.1.5", + "native-run": "^2.0.3", + "open": "^8.4.0", + "plist": "^3.1.0", + "prompts": "^2.4.2", + "rimraf": "^6.0.1", + "semver": "^7.6.3", + "tar": "^7.5.3", + "tslib": "^2.8.1", + "xml2js": "^0.6.2" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@capacitor/core": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.2.0.tgz", + "integrity": "sha512-oKaoNeNtH2iIZMDFVrb1atoyRECDGHcfLMunJ5KWN8DtvpVBeeA4c41e20NTuhMxw1cSYbpq2PV2hb+/9CJxlQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@capacitor/haptics": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-8.0.1.tgz", + "integrity": "sha512-8v8rowLBMeb3CryqoQvXndwyUsoi4pPXf0qFw7IGA4D32Uk7+K6juN2SjRowqunoovkvvbFmU9TD7JIAz2zmFw==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, + "node_modules/@capacitor/keyboard": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-8.0.1.tgz", + "integrity": "sha512-HDf4qrvvhLRMsgBoqeqIld6hP8JMK/WPbCYMvz8ajhY6TaibYt6B+NQyky4oIPCOfHTz5OcVsuHkbb8fQvGDAg==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, + "node_modules/@capacitor/status-bar": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-8.0.1.tgz", + "integrity": "sha512-OR59dlbwvmrV5dKsC9lvwv48QaGbqcbSTBpk+9/WXWxXYSdXXdzJZU9p8oyNPAkuJhCdnSa3XmU43fZRPBJJ5w==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, + "node_modules/@cypress/request": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz", + "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~4.0.4", + "http-signature": "~1.4.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.14.1", + "safe-buffer": "^5.1.2", + "tough-cookie": "^5.0.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "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/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/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.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/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", + "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/core": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz", + "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==", + "license": "MIT", + "dependencies": { + "@stencil/core": "4.43.0", + "ionicons": "^8.0.13", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@ionic/pwa-elements": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@ionic/pwa-elements/-/pwa-elements-3.4.0.tgz", + "integrity": "sha512-WmL7An4NOsvJvct4V/A8hudr+yXgLBHYmxzqWGsetZmzN7C6suLRS/KIh2P1t8cSYCYL7HRrbv8NrIChPkh6Ow==", + "license": "MIT", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + } + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", + "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-object": "2.1.6", + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", + "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-subprocess": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", + "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-terminal": "2.3.5", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/vue": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.8.1.tgz", + "integrity": "sha512-tdNErYs6WrNiDJps1nRRY4UeyLffr2hbdkpawrMYFZxzzMd5yuExWsRAofrk5Uy6rSFObSZrfg7AgqyudDcJpQ==", + "license": "MIT", + "dependencies": { + "@ionic/core": "8.8.1", + "@stencil/vue-output-target": "0.10.7", + "ionicons": "^8.0.13" + } + }, + "node_modules/@ionic/vue-router": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@ionic/vue-router/-/vue-router-8.8.1.tgz", + "integrity": "sha512-ZtG5VNkUa2bWk9W2Ri98s5E7DuTxx43TMWhbyjgiDqk+YdkjDvwKw15rAkIgneoOUtiVQZYIdeyKuEJMcGSW9g==", + "license": "MIT", + "dependencies": { + "@ionic/vue": "8.8.1" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/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/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/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/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/fs-minipass/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/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/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/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/@jest/core/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/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/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/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/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/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/@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==", + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "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==", + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@node-ipc/js-queue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", + "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "easy-stack": "1.0.1" + }, + "engines": { + "node": ">=1.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "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/@rollup/rollup-darwin-arm64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@stencil/core": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.43.0.tgz", + "integrity": "sha512-6Uj2Z3lzLuufYAE7asZ6NLKgSwsB9uxl84Eh34PASnUjfj32GkrP4DtKK7fNeh1WFGGyffsTDka3gwtl+4reUg==", + "license": "MIT", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.10.0" + }, + "optionalDependencies": { + "@rollup/rollup-darwin-arm64": "4.34.9", + "@rollup/rollup-darwin-x64": "4.34.9", + "@rollup/rollup-linux-arm64-gnu": "4.34.9", + "@rollup/rollup-linux-arm64-musl": "4.34.9", + "@rollup/rollup-linux-x64-gnu": "4.34.9", + "@rollup/rollup-linux-x64-musl": "4.34.9", + "@rollup/rollup-win32-arm64-msvc": "4.34.9", + "@rollup/rollup-win32-x64-msvc": "4.34.9" + } + }, + "node_modules/@stencil/vue-output-target": { + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@stencil/vue-output-target/-/vue-output-target-0.10.7.tgz", + "integrity": "sha512-IYxDe+SLCkwhwsWRdynE31rTK1zN3hVwwojQ/V9lrN8Gnx4PTvrUQHiRno9jFo1dk+EaBZWX9gZSmXta0ZaZew==", + "license": "MIT", + "peerDependencies": { + "@stencil/core": ">=2.0.0 || >=3 || >= 4.0.0-beta.0 || >= 4.0.0", + "vue": "^3.4.38", + "vue-router": "^4.5.0" + }, + "peerDependenciesMeta": { + "@stencil/core": { + "optional": true + }, + "vue": { + "optional": false + }, + "vue-router": { + "optional": true + } + } + }, + "node_modules/@supabase/auth-js": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.99.1.tgz", + "integrity": "sha512-x7lKKTvKjABJt/FYcRSPiTT01Xhm2FF8RhfL8+RHMkmlwmRQ88/lREupIHKwFPW0W6pTCJqkZb7Yhpw/EZ+fNw==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.99.1.tgz", + "integrity": "sha512-WQE62W5geYImCO4jzFxCk/avnK7JmOdtqu2eiPz3zOaNiIJajNRSAwMMDgEGd2EMs+sUVYj1LfBjfmW3EzHgIA==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.99.1.tgz", + "integrity": "sha512-gtw2ibJrADvfqrpUWXGNlrYUvxttF4WVWfPpTFKOb2IRj7B6YRWMDgcrYqIuD4ZEabK4m6YKQCCGy6clgf1lPA==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.99.1.tgz", + "integrity": "sha512-9EDdy/5wOseGFqxW88ShV9JMRhm7f+9JGY5x+LqT8c7R0X1CTLwg5qie8FiBWcXTZ+68yYxVWunI+7W4FhkWOg==", + "license": "MIT", + "dependencies": { + "@types/phoenix": "^1.6.6", + "@types/ws": "^8.18.1", + "tslib": "2.8.1", + "ws": "^8.18.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.99.1.tgz", + "integrity": "sha512-mf7zPfqofI62SOoyQJeNUVxe72E4rQsbWim6lTDPeLu3lHija/cP5utlQADGrjeTgOUN6znx/rWn7SjrETP1dw==", + "license": "MIT", + "dependencies": { + "iceberg-js": "^0.8.1", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.99.1.tgz", + "integrity": "sha512-5MRoYD9ffXq8F6a036dm65YoSHisC3by/d22mauKE99Vrwf792KxYIIr/iqCX7E4hkuugbPZ5EGYHTB7MKy6Vg==", + "license": "MIT", + "dependencies": { + "@supabase/auth-js": "2.99.1", + "@supabase/functions-js": "2.99.1", + "@supabase/postgrest-js": "2.99.1", + "@supabase/realtime-js": "2.99.1", + "@supabase/storage-js": "2.99.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "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/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "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/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "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==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/phoenix": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz", + "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==", + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", + "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tmp": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/webpack-env": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", + "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-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==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue-macros/common": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz", + "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", + "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", + "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-preset-app": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.9.tgz", + "integrity": "sha512-0rKOF4s/AhaRMJLybxOCgXfwtYhO3pwDSL/q/W8wRs1LzmHAc77FyTXWlun6VyKiSKwSdtH7CvOiWqq+DfofdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/helper-compilation-targets": "^7.12.16", + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-proposal-class-properties": "^7.12.13", + "@babel/plugin-proposal-decorators": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/runtime": "^7.12.13", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.1.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.8.3", + "core-js-compat": "^3.8.3", + "semver": "^7.3.4" + }, + "peerDependencies": { + "@babel/core": "*", + "core-js": "^3", + "vue": "^2 || ^3.2.13" + }, + "peerDependenciesMeta": { + "core-js": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", + "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", + "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", + "@vue/babel-sugar-functional-vue": "^1.4.0", + "@vue/babel-sugar-inject-h": "^1.4.0", + "@vue/babel-sugar-v-model": "^1.4.0", + "@vue/babel-sugar-v-on": "^1.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "vue": "*" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", + "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", + "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", + "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", + "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", + "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", + "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/cli-overlay": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-5.0.9.tgz", + "integrity": "sha512-aBdZWrYKxLuFz1FDsk/muFD7GycrsW73Gi11yRc7R2W7Bm8mDRc9HKAI790gdg4NV+chkDFmfkegjg5iMDEpAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/cli-plugin-babel": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.9.tgz", + "integrity": "sha512-oDZt1Kfe4KGNtig3/3zFo2pIeDJij2uS0M6S+tAqQno4Zpla2D8Hk/AR5PrstUd/HmhHZYJoGyF78MOfj3SbWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.16", + "@vue/babel-preset-app": "^5.0.9", + "@vue/cli-shared-utils": "^5.0.9", + "babel-loader": "^8.2.2", + "thread-loader": "^3.0.0", + "webpack": "^5.54.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + } + }, + "node_modules/@vue/cli-plugin-e2e-cypress": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-e2e-cypress/-/cli-plugin-e2e-cypress-5.0.9.tgz", + "integrity": "sha512-G6GnQi+7M/ZrDr1HuPLvlqjMDFuYj+iMytjEFeeVOp0ms8O+nJUADpZ2WFPp/9zx68gNOEtmqWGH/Nzh+4xAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/cli-shared-utils": "^5.0.9", + "eslint-plugin-cypress": "^2.11.2" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0", + "cypress": "*" + } + }, + "node_modules/@vue/cli-plugin-eslint": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.9.tgz", + "integrity": "sha512-OfAa85qhP0dKSprI8+9qjbXW8BzOlOvEtXwdrTrAKlD6aN8oa/u6k4vbfJGdYbpsbpkj8FXYdCRkTgNG8KZbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/cli-shared-utils": "^5.0.9", + "eslint-webpack-plugin": "^3.1.0", + "globby": "^11.0.2", + "webpack": "^5.54.0", + "yorkie": "^2.0.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0", + "eslint": ">=7.5.0" + } + }, + "node_modules/@vue/cli-plugin-router": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.9.tgz", + "integrity": "sha512-kopbO/8kIl5CAffwgptXEwV509i+M0FfwW4sSkgQ2RzpxOYBjQZvp+096mjZfFcWKSmryNP/ri/Mnu78vmhlhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/cli-shared-utils": "^5.0.9" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + } + }, + "node_modules/@vue/cli-plugin-typescript": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-typescript/-/cli-plugin-typescript-5.0.9.tgz", + "integrity": "sha512-68S9rtpLMZLOIjQ9UaLSPupiJlE6ySO68kDVraIkqeQNi0qfcnVOlXTsDd4UnobKv+v+qHnt593+8bt3mjXiyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.16", + "@types/webpack-env": "^1.15.2", + "@vue/cli-shared-utils": "^5.0.9", + "babel-loader": "^8.2.2", + "fork-ts-checker-webpack-plugin": "^6.4.0", + "globby": "^11.0.2", + "thread-loader": "^3.0.0", + "ts-loader": "^9.2.5", + "webpack": "^5.54.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0", + "cache-loader": "^4.1.0", + "typescript": ">=2", + "vue": "^2 || ^3.2.13", + "vue-template-compiler": "^2.0.0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-unit-jest": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-5.0.9.tgz", + "integrity": "sha512-Fp5aos0+S64UeBcdxiC7+6jSWRN1b3iIwIB3v+tpkCaBDsR+54f66MQMqv6lfF16l2HT8qLbsjq8dbxDljilsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/plugin-transform-modules-commonjs": "^7.15.0", + "@types/jest": "^27.0.1", + "@vue/cli-shared-utils": "^5.0.9", + "babel-jest": "^27.1.0", + "deepmerge": "^4.2.2", + "jest": "^27.1.0", + "jest-serializer-vue": "^2.0.2", + "jest-transform-stub": "^2.0.0", + "jest-watch-typeahead": "^1.0.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0", + "@vue/vue2-jest": "^27.0.0-alpha.3", + "@vue/vue3-jest": "^27.0.0-alpha.3", + "jest": "^27.1.0", + "ts-jest": "^27.0.4" + }, + "peerDependenciesMeta": { + "@vue/vue2-jest": { + "optional": true + }, + "@vue/vue3-jest": { + "optional": true + }, + "ts-jest": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@types/jest": { + "version": "27.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", + "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/@types/yargs": { + "version": "16.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.11.tgz", + "integrity": "sha512-sbtvk8wDN+JvEdabmZExoW/HNr1cB7D/j4LT08rMiuikfA7m/JNJg7ATQcgzs34zHnoScDkY0ZRSl29Fkmk36g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/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/@vue/cli-plugin-unit-jest/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/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/@vue/cli-plugin-unit-jest/node_modules/pretty-format/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/@vue/cli-plugin-unit-jest/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/@vue/cli-plugin-unit-jest/node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@vue/cli-plugin-unit-jest/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/@vue/cli-plugin-vuex": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.9.tgz", + "integrity": "sha512-AQhgGNFVd4Pu2crvS0a+hRckgrJv07gzOASdbLd3I72wkT43dd01MLRp8IBRRsu92t3MXenW86AZUCbQBz3//A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + } + }, + "node_modules/@vue/cli-service": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-5.0.9.tgz", + "integrity": "sha512-yTX7GVyM19tEbd+y5/gA6MkVKA6K61nVYHYAivD61Hx6odVFmQsaC3/R3cWAHM1P5oVKCevBbumPljbT+tFG2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.12.16", + "@soda/friendly-errors-webpack-plugin": "^1.8.0", + "@soda/get-current-script": "^1.0.2", + "@types/minimist": "^1.2.0", + "@vue/cli-overlay": "^5.0.9", + "@vue/cli-plugin-router": "^5.0.9", + "@vue/cli-plugin-vuex": "^5.0.9", + "@vue/cli-shared-utils": "^5.0.9", + "@vue/component-compiler-utils": "^3.3.0", + "@vue/vue-loader-v15": "npm:vue-loader@^15.9.7", + "@vue/web-component-wrapper": "^1.3.0", + "acorn": "^8.0.5", + "acorn-walk": "^8.0.2", + "address": "^1.1.2", + "autoprefixer": "^10.2.4", + "browserslist": "^4.16.3", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.10", + "clipboardy": "^2.3.0", + "cliui": "^7.0.4", + "copy-webpack-plugin": "^9.0.1", + "css-loader": "^6.5.0", + "css-minimizer-webpack-plugin": "^3.0.2", + "cssnano": "^5.0.0", + "debug": "^4.1.1", + "default-gateway": "^6.0.3", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^5.1.0", + "is-file-esm": "^1.0.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "mini-css-extract-plugin": "^2.5.3", + "minimist": "^1.2.5", + "module-alias": "^2.2.2", + "portfinder": "^1.0.26", + "postcss": "^8.2.6", + "postcss-loader": "^6.1.1", + "progress-webpack-plugin": "^1.0.12", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^5.1.1", + "thread-loader": "^3.0.0", + "vue-loader": "^17.0.0", + "vue-style-loader": "^4.1.3", + "webpack": "^5.54.0", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-chain": "^6.5.1", + "webpack-dev-server": "^4.7.3", + "webpack-merge": "^5.7.3", + "webpack-virtual-modules": "^0.4.2", + "whatwg-fetch": "^3.6.2" + }, + "bin": { + "vue-cli-service": "bin/vue-cli-service.js" + }, + "engines": { + "node": "^12.0.0 || >= 14.0.0" + }, + "peerDependencies": { + "vue-template-compiler": "^2.0.0", + "webpack-sources": "*" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "less-loader": { + "optional": true + }, + "pug-plain-loader": { + "optional": true + }, + "raw-loader": { + "optional": true + }, + "sass-loader": { + "optional": true + }, + "stylus-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/@vue/cli-service/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vue/cli-shared-utils": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.9.tgz", + "integrity": "sha512-lf4KykiG8j9KwvNVi7fKtASmHuLsxCcCsflVU2b2CHMRuR4weOIV3zuuCrjWKjk0APn/MHJhgCjJGzHMbTtd5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@achrinza/node-ipc": "^9.2.5", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "joi": "^17.4.0", + "launch-editor": "^2.2.1", + "lru-cache": "^6.0.0", + "node-fetch": "^2.6.7", + "open": "^8.0.2", + "ora": "^5.3.0", + "read-pkg": "^5.1.1", + "semver": "^7.3.4", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/@vue/cli-shared-utils/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/@vue/cli-shared-utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/component-compiler-utils/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/devtools-api": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.0.tgz", + "integrity": "sha512-O44X57jjkLKbLEc4OgL/6fEPOOanRJU8kYpCE8qfKlV96RQZcdzrcLI5mxMuVRUeXhHKIHGhCpHacyCk0HyO4w==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.0" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.0.tgz", + "integrity": "sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.0", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.0.tgz", + "integrity": "sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==", + "license": "MIT" + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", + "integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.59.1", + "@typescript-eslint/parser": "^5.59.1", + "vue-eslint-parser": "^9.1.1" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, + "node_modules/@vue/test-utils": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz", + "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-beautify": "^1.14.9", + "vue-component-type-helpers": "^2.0.0" + } + }, + "node_modules/@vue/vue-loader-v15": { + "name": "vue-loader", + "version": "15.11.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz", + "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "prettier": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/@vue/vue-loader-v15/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/vue3-jest": { + "version": "29.2.6", + "resolved": "https://registry.npmjs.org/@vue/vue3-jest/-/vue3-jest-29.2.6.tgz", + "integrity": "sha512-Hy4i2BsV5fUmER5LplYiAeRkLTDCSB3ZbnAeEawXtjto/ILaOnamBAoAvEqARgPpR6NRtiYjSgGKmllMtnFd9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "chalk": "^2.1.0", + "convert-source-map": "^1.6.0", + "css-tree": "^2.0.1", + "source-map": "0.5.6", + "tsconfig": "^7.0.0" + }, + "engines": { + "node": ">10" + }, + "peerDependencies": { + "@babel/core": "7.x", + "babel-jest": "29.x", + "jest": "29.x", + "typescript": ">= 4.3", + "vue": "^3.0.0-0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/vue3-jest/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/vue3-jest/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/vue3-jest/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@vue/vue3-jest/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/vue3-jest/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/vue3-jest/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@vue/vue3-jest/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/vue3-jest/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/vue3-jest/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.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/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/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/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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": "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz", + "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "ast-kit": "^2.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/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/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.16.tgz", + "integrity": "sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.7", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/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/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.7.tgz", + "integrity": "sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.7" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "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/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/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001779", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001779.tgz", + "integrity": "sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA==", + "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/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/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/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "1.4.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "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/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "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/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", + "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/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/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-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/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/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "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/cypress": { + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.12.0.tgz", + "integrity": "sha512-B2BRcudLfA4NZZP5QpA45J70bu1heCH59V1yKRLHAtiC49r7RV03X5ifUh7Nfbk8QNg93RAsc6oAmodm/+j0pA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@cypress/request": "^3.0.10", + "@cypress/xvfb": "^1.2.4", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "@types/tmp": "^0.2.3", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.7.1", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "ci-info": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-table3": "0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "hasha": "5.2.2", + "is-installed-globally": "~0.4.0", + "listr2": "^3.8.3", + "lodash": "^4.17.23", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "process": "^0.11.10", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "supports-color": "^8.1.1", + "systeminformation": "^5.31.1", + "tmp": "~0.2.4", + "tree-kill": "1.2.2", + "tslib": "1.14.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^20.1.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/cypress/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/cypress/node_modules/chalk/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/cypress/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cypress/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cypress/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cypress/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/cypress/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cypress/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/cypress/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "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/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "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==", + "dev": true, + "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/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/editorconfig": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "^9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enhanced-resolve/node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/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-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/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/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-cypress": { + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.2.tgz", + "integrity": "sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "globals": "^13.20.0" + }, + "peerDependencies": { + "eslint": ">= 3.2.1" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", + "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/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/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/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/eslint/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/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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/eslint/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/eslint/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/eslint/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/eslint/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/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/esquery/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/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/esrecurse/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/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "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-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", + "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==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/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/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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==", + "dev": true, + "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/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "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==", + "dev": true, + "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-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "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/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "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-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true, + "license": "MIT" + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "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-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", + "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-signature": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.18.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iceberg-js": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", + "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/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/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ionicons": { + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-8.0.13.tgz", + "integrity": "sha512-2QQVyG2P4wszne79jemMjWYLp0DBbDhr4/yFroPCxvPP1wtMxgdIV3l5n+XZ5E9mgoXU79w7yTWpm2XzJsISxQ==", + "license": "MIT", + "dependencies": { + "@stencil/core": "^4.35.3" + } + }, + "node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true, + "license": "MIT" + }, + "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-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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-file-esm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-file-esm/-/is-file-esm-1.0.0.tgz", + "integrity": "sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "read-pkg-up": "^7.0.1" + } + }, + "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-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "license": "MIT" + }, + "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-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/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/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-lib-report/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/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "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/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/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/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/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/jest-cli/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/jest-cli/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/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/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/jest-config/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/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/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/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/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "16.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.11.tgz", + "integrity": "sha512-sbtvk8wDN+JvEdabmZExoW/HNr1cB7D/j4LT08rMiuikfA7m/JNJg7ATQcgzs34zHnoScDkY0ZRSl29Fkmk36g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-jsdom/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/jest-environment-jsdom/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/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/jest-environment-jsdom/node_modules/pretty-format/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/jest-environment-jsdom/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/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/jest-jasmine2/node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "16.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.11.tgz", + "integrity": "sha512-sbtvk8wDN+JvEdabmZExoW/HNr1cB7D/j4LT08rMiuikfA7m/JNJg7ATQcgzs34zHnoScDkY0ZRSl29Fkmk36g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-jasmine2/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/jest-jasmine2/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-jasmine2/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-jasmine2/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/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/jest-jasmine2/node_modules/pretty-format/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/jest-jasmine2/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/jest-jasmine2/node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-jasmine2/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/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/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/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/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/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/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/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/jest-runner/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/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/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer-vue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-2.0.2.tgz", + "integrity": "sha512-nK/YIFo6qe3i9Ge+hr3h4PpRehuPPGZFt8LDBdTHYldMb7ZWlkanZS8Ls7D8h6qmQP2lBQVDLP0DKn5bJ9QApQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pretty": "2.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/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/jest-transform-stub": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz", + "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/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/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/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/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/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/jest-watch-typeahead/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/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/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format/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/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/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/jest-watch-typeahead/node_modules/strip-ansi/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/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/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/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-beautify": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "dev": true, + "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.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "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-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "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/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/launch-editor": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.1.tgz", + "integrity": "sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/launch-editor-middleware": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.13.1.tgz", + "integrity": "sha512-ZuzP8PJT7eKS4zZ/UWk0ciEOXlpqsHyDGSwQ6mwvszvjwT8/VUft+ISeR/BMvd2VkuaBispslpF5jaAEsD2wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "launch-editor": "^2.13.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "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/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/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/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/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/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "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/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/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/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.1.tgz", + "integrity": "sha512-k7G3Y5QOegl380tXmZ68foBRRjE9Ljavx835ObdvmZjQ639izvZD8CS7BkWw1qKPPzHsGL/JDhl0uyU1zc2rJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/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/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mlly": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/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/mlly/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/module-alias": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.3.4.tgz", + "integrity": "sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/native-run": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.3.tgz", + "integrity": "sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", + "through2": "^4.0.2", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/native-run/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "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-forge": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "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/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, + "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/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "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/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.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-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "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==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "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/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": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/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/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress-webpack-plugin": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz", + "integrity": "sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.1.0", + "figures": "^2.0.0", + "log-update": "^2.3.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/progress-webpack-plugin/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/progress-webpack-plugin/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress-webpack-plugin/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/progress-webpack-plugin/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "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/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "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/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/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/rimraf/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true, + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "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/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true, + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "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/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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/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-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "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-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.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/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svgo": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.2.tgz", + "integrity": "sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "sax": "^1.5.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/svgo/node_modules/sax": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/systeminformation": { + "version": "5.31.4", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.4.tgz", + "integrity": "sha512-lZppDyQx91VdS5zJvAyGkmwe+Mq6xY978BDUG2wRkWE+jkmUF5ti8cvOovFQoN5bvSFKCXVkyKEaU5ec3SJiRg==", + "dev": true, + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thread-loader": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-3.0.4.tgz", + "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.1.0", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/thread-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/thread-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/throttleit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", + "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "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": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "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/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-loader": { + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", + "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/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/ts-loader/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" + }, + "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-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "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/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/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", + "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin/node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz", + "integrity": "sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/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/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-loader": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.4.2.tgz", + "integrity": "sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "watchpack": "^2.4.0" + }, + "peerDependencies": { + "webpack": "^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/vue-loader/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/vue-router": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.3.tgz", + "integrity": "sha512-nG1c7aAFac7NYj8Hluo68WyWfc41xkEjaR0ViLHCa3oDvTQ/nIuLJlXJX1NUPw/DXzx/8+OKMng045HHQKQKWw==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.6", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.0.6", + "ast-walker-scope": "^0.8.3", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.15", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1", + "yaml": "^2.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.17", + "pinia": "^3.0.4", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/vue-router/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/vue-router/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vue-router/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/vue-router/node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-style-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true, + "license": "MIT" + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "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/webpack": { + "version": "5.105.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", + "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-chain/node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/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/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", + "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/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/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true, + "license": "MIT" + }, + "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/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "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/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "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/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "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/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "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": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "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/yargs/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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/yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/yorkie/node_modules/execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/yorkie/node_modules/normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/yorkie/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/examples/user-management/ionic-vue-user-management/package.json b/examples/user-management/ionic-vue-user-management/package.json new file mode 100644 index 00000000000..1cbb31c09d4 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/package.json @@ -0,0 +1,51 @@ +{ + "name": "supabase-ionic-vue", + "version": "0.0.1", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "test:unit": "vue-cli-service test:unit", + "test:e2e": "vue-cli-service test:e2e", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "@capacitor/app": "8.0.1", + "@capacitor/camera": "^8.0.2", + "@capacitor/core": "8.2.0", + "@capacitor/haptics": "8.0.1", + "@capacitor/keyboard": "8.0.1", + "@capacitor/status-bar": "8.0.1", + "@ionic/pwa-elements": "^3.4.0", + "@ionic/vue": "^8.8.1", + "@ionic/vue-router": "^8.8.1", + "@supabase/supabase-js": "^2.99.1", + "core-js": "^3.48.0", + "vue": "^3.5.30", + "vue-router": "^5.0.3" + }, + "devDependencies": { + "@capacitor/cli": "8.2.0", + "@types/jest": "^29.5.14", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "@vue/cli-plugin-babel": "~5.0.9", + "@vue/cli-plugin-e2e-cypress": "~5.0.9", + "@vue/cli-plugin-eslint": "~5.0.9", + "@vue/cli-plugin-router": "~5.0.9", + "@vue/cli-plugin-typescript": "~5.0.9", + "@vue/cli-plugin-unit-jest": "~5.0.9", + "@vue/cli-service": "~5.0.9", + "@vue/eslint-config-typescript": "^11.0.3", + "@vue/test-utils": "^2.4.6", + "@vue/vue3-jest": "^29.2.6", + "babel-jest": "^29.7.0", + "cypress": "^9.7.0", + "eslint": "^8.57.0", + "eslint-plugin-vue": "^9.32.0", + "jest": "^29.7.0", + "ts-jest": "^29.4.6", + "typescript": "^5.9.3" + }, + "description": "An Ionic project" +} diff --git a/examples/user-management/ionic-vue-user-management/public/assets/icon/favicon.png b/examples/user-management/ionic-vue-user-management/public/assets/icon/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..51888a7bbdb59f04c29c548523eb2638c1c954f5 GIT binary patch literal 930 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

    HKF0m1(Dz`$p z;8CD!yy4yS&%huDZw^`#7X1~({40AY?A@;aQb2bp*K!}~$*wM4vC(nb{=`iuX;P!a z`jVq8Cq7Gedz9(`&R=lGI%Q^=`nqV7kedDBfv(ux%TYv{a@Aewg_aiV_Td6OG~*Y9 zJBKtq4oyC%eY3z8BTp?wi~ZR5*F$nM z8EYn2Y|AolySbx!4?JDR@A`}U@-+aHLQhnPmKi1r?e#JZp}ljBeM2siQ8`^;d9q$l z4r!^#d=>l!ZQap^xAQv#76Z8iF2!PcUw;eQPyZ$6lnm)-qM(UcfC_a``iMRR0a3%K zpt;%)=cL>B84}vCUj1nI>%4Vqf;P_uj`oOzvjH@?C4mOxBWw1U!xSX&?nA%~J?S>q z`Drs@DX0i_&|vma{EMU$voU!m&T=**gzTsG{7#s6e&UYCe1T0nO4x^oj_W}xAZfJ- zi*13eG}V_CK!$q)_MML#!af0~3v~3jrAa#k}puLda%RcUZ zS-@CPF!SM|`L1Bw=QrASiWbjR(Y&+2yAy?KgG~WWm`yAA-@oy`EwnL=Xj@zSVFHKJ zppEeSILSZlV`%l_ diff --git a/examples/user-management/ionic-vue-user-management/public/index.html b/examples/user-management/ionic-vue-user-management/public/index.html new file mode 100644 index 00000000000..486392c9a9b --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/public/index.html @@ -0,0 +1,30 @@ + + + + + Ionic App + + + + + + + + + + + + + + + + + +

    + + + + diff --git a/examples/user-management/ionic-vue-user-management/src/App.vue b/examples/user-management/ionic-vue-user-management/src/App.vue new file mode 100644 index 00000000000..aa8db75e481 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/App.vue @@ -0,0 +1,33 @@ + + + diff --git a/examples/user-management/ionic-vue-user-management/src/components/Avatar.vue b/examples/user-management/ionic-vue-user-management/src/components/Avatar.vue new file mode 100644 index 00000000000..1bcfeb6bef3 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/components/Avatar.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/examples/user-management/ionic-vue-user-management/src/main.ts b/examples/user-management/ionic-vue-user-management/src/main.ts new file mode 100644 index 00000000000..5954365b533 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/main.ts @@ -0,0 +1,20 @@ +import { createApp } from 'vue' +import App from './App.vue' +import router from './router'; + +import { IonicVue } from '@ionic/vue'; +/* Core CSS required for Ionic components to work properly */ +import '@ionic/vue/css/ionic.bundle.css'; + +/* Theme variables */ +import './theme/variables.css'; + +import { defineCustomElements } from '@ionic/pwa-elements/loader'; +defineCustomElements(window); +const app = createApp(App) + .use(IonicVue) + .use(router); + +router.isReady().then(() => { + app.mount('#app'); +}); diff --git a/examples/user-management/ionic-vue-user-management/src/router/index.ts b/examples/user-management/ionic-vue-user-management/src/router/index.ts new file mode 100644 index 00000000000..87e749d94f2 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/router/index.ts @@ -0,0 +1,23 @@ +import { createRouter, createWebHistory } from '@ionic/vue-router'; +import { RouteRecordRaw } from 'vue-router'; +import LoginPage from '../views/Login.vue'; +import AccountPage from '../views/Account.vue'; +const routes: Array = [ + { + path: '/', + name: 'Login', + component: LoginPage + }, + { + path: '/account', + name: 'Account', + component: AccountPage + } +] + +const router = createRouter({ + history: createWebHistory(process.env.BASE_URL), + routes +}) + +export default router diff --git a/examples/user-management/ionic-vue-user-management/src/shims-vue.d.ts b/examples/user-management/ionic-vue-user-management/src/shims-vue.d.ts new file mode 100644 index 00000000000..3804a43e2f3 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/shims-vue.d.ts @@ -0,0 +1,6 @@ +/* eslint-disable */ +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/examples/user-management/ionic-vue-user-management/src/store/index.ts b/examples/user-management/ionic-vue-user-management/src/store/index.ts new file mode 100644 index 00000000000..dc3bbdbde24 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/store/index.ts @@ -0,0 +1,6 @@ +import type { Claims } from '@supabase/supabase-js'; +import { reactive } from 'vue'; + +export const store = reactive<{ user: Claims | null }>({ + user: null, +}); diff --git a/examples/user-management/ionic-vue-user-management/src/supabase.ts b/examples/user-management/ionic-vue-user-management/src/supabase.ts new file mode 100644 index 00000000000..71332a68d4b --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/supabase.ts @@ -0,0 +1,18 @@ +import { createClient } from '@supabase/supabase-js'; + +const supabaseUrl = process.env.VUE_APP_SUPABASE_URL; +const supabaseKey = process.env.VUE_APP_SUPABASE_KEY; + +if (!supabaseUrl) { + throw new Error( + 'Environment variable VUE_APP_SUPABASE_URL is not set. Please define it before starting the application.' + ); +} + +if (!supabaseKey) { + throw new Error( + 'Environment variable VUE_APP_SUPABASE_KEY is not set. Please define it before starting the application.' + ); +} + +export const supabase = createClient(supabaseUrl, supabaseKey); diff --git a/examples/user-management/ionic-vue-user-management/src/theme/variables.css b/examples/user-management/ionic-vue-user-management/src/theme/variables.css new file mode 100644 index 00000000000..1cbe9872e3b --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/theme/variables.css @@ -0,0 +1,236 @@ +/* Ionic Variables and Theming. For more info, please see: +http://ionicframework.com/docs/theming/ */ + +/** Ionic CSS Variables **/ +:root { + /** primary **/ + --ion-color-primary: #3880ff; + --ion-color-primary-rgb: 56, 128, 255; + --ion-color-primary-contrast: #ffffff; + --ion-color-primary-contrast-rgb: 255, 255, 255; + --ion-color-primary-shade: #3171e0; + --ion-color-primary-tint: #4c8dff; + + /** secondary **/ + --ion-color-secondary: #3dc2ff; + --ion-color-secondary-rgb: 61, 194, 255; + --ion-color-secondary-contrast: #ffffff; + --ion-color-secondary-contrast-rgb: 255, 255, 255; + --ion-color-secondary-shade: #36abe0; + --ion-color-secondary-tint: #50c8ff; + + /** tertiary **/ + --ion-color-tertiary: #5260ff; + --ion-color-tertiary-rgb: 82, 96, 255; + --ion-color-tertiary-contrast: #ffffff; + --ion-color-tertiary-contrast-rgb: 255, 255, 255; + --ion-color-tertiary-shade: #4854e0; + --ion-color-tertiary-tint: #6370ff; + + /** success **/ + --ion-color-success: #2dd36f; + --ion-color-success-rgb: 45, 211, 111; + --ion-color-success-contrast: #ffffff; + --ion-color-success-contrast-rgb: 255, 255, 255; + --ion-color-success-shade: #28ba62; + --ion-color-success-tint: #42d77d; + + /** warning **/ + --ion-color-warning: #ffc409; + --ion-color-warning-rgb: 255, 196, 9; + --ion-color-warning-contrast: #000000; + --ion-color-warning-contrast-rgb: 0, 0, 0; + --ion-color-warning-shade: #e0ac08; + --ion-color-warning-tint: #ffca22; + + /** danger **/ + --ion-color-danger: #eb445a; + --ion-color-danger-rgb: 235, 68, 90; + --ion-color-danger-contrast: #ffffff; + --ion-color-danger-contrast-rgb: 255, 255, 255; + --ion-color-danger-shade: #cf3c4f; + --ion-color-danger-tint: #ed576b; + + /** dark **/ + --ion-color-dark: #222428; + --ion-color-dark-rgb: 34, 36, 40; + --ion-color-dark-contrast: #ffffff; + --ion-color-dark-contrast-rgb: 255, 255, 255; + --ion-color-dark-shade: #1e2023; + --ion-color-dark-tint: #383a3e; + + /** medium **/ + --ion-color-medium: #92949c; + --ion-color-medium-rgb: 146, 148, 156; + --ion-color-medium-contrast: #ffffff; + --ion-color-medium-contrast-rgb: 255, 255, 255; + --ion-color-medium-shade: #808289; + --ion-color-medium-tint: #9d9fa6; + + /** light **/ + --ion-color-light: #f4f5f8; + --ion-color-light-rgb: 244, 245, 248; + --ion-color-light-contrast: #000000; + --ion-color-light-contrast-rgb: 0, 0, 0; + --ion-color-light-shade: #d7d8da; + --ion-color-light-tint: #f5f6f9; +} + +@media (prefers-color-scheme: dark) { + /* + * Dark Colors + * ------------------------------------------- + */ + + body { + --ion-color-primary: #428cff; + --ion-color-primary-rgb: 66,140,255; + --ion-color-primary-contrast: #ffffff; + --ion-color-primary-contrast-rgb: 255,255,255; + --ion-color-primary-shade: #3a7be0; + --ion-color-primary-tint: #5598ff; + + --ion-color-secondary: #50c8ff; + --ion-color-secondary-rgb: 80,200,255; + --ion-color-secondary-contrast: #ffffff; + --ion-color-secondary-contrast-rgb: 255,255,255; + --ion-color-secondary-shade: #46b0e0; + --ion-color-secondary-tint: #62ceff; + + --ion-color-tertiary: #6a64ff; + --ion-color-tertiary-rgb: 106,100,255; + --ion-color-tertiary-contrast: #ffffff; + --ion-color-tertiary-contrast-rgb: 255,255,255; + --ion-color-tertiary-shade: #5d58e0; + --ion-color-tertiary-tint: #7974ff; + + --ion-color-success: #2fdf75; + --ion-color-success-rgb: 47,223,117; + --ion-color-success-contrast: #000000; + --ion-color-success-contrast-rgb: 0,0,0; + --ion-color-success-shade: #29c467; + --ion-color-success-tint: #44e283; + + --ion-color-warning: #ffd534; + --ion-color-warning-rgb: 255,213,52; + --ion-color-warning-contrast: #000000; + --ion-color-warning-contrast-rgb: 0,0,0; + --ion-color-warning-shade: #e0bb2e; + --ion-color-warning-tint: #ffd948; + + --ion-color-danger: #ff4961; + --ion-color-danger-rgb: 255,73,97; + --ion-color-danger-contrast: #ffffff; + --ion-color-danger-contrast-rgb: 255,255,255; + --ion-color-danger-shade: #e04055; + --ion-color-danger-tint: #ff5b71; + + --ion-color-dark: #f4f5f8; + --ion-color-dark-rgb: 244,245,248; + --ion-color-dark-contrast: #000000; + --ion-color-dark-contrast-rgb: 0,0,0; + --ion-color-dark-shade: #d7d8da; + --ion-color-dark-tint: #f5f6f9; + + --ion-color-medium: #989aa2; + --ion-color-medium-rgb: 152,154,162; + --ion-color-medium-contrast: #000000; + --ion-color-medium-contrast-rgb: 0,0,0; + --ion-color-medium-shade: #86888f; + --ion-color-medium-tint: #a2a4ab; + + --ion-color-light: #222428; + --ion-color-light-rgb: 34,36,40; + --ion-color-light-contrast: #ffffff; + --ion-color-light-contrast-rgb: 255,255,255; + --ion-color-light-shade: #1e2023; + --ion-color-light-tint: #383a3e; + } + + /* + * iOS Dark Theme + * ------------------------------------------- + */ + + .ios body { + --ion-background-color: #000000; + --ion-background-color-rgb: 0,0,0; + + --ion-text-color: #ffffff; + --ion-text-color-rgb: 255,255,255; + + --ion-color-step-50: #0d0d0d; + --ion-color-step-100: #1a1a1a; + --ion-color-step-150: #262626; + --ion-color-step-200: #333333; + --ion-color-step-250: #404040; + --ion-color-step-300: #4d4d4d; + --ion-color-step-350: #595959; + --ion-color-step-400: #666666; + --ion-color-step-450: #737373; + --ion-color-step-500: #808080; + --ion-color-step-550: #8c8c8c; + --ion-color-step-600: #999999; + --ion-color-step-650: #a6a6a6; + --ion-color-step-700: #b3b3b3; + --ion-color-step-750: #bfbfbf; + --ion-color-step-800: #cccccc; + --ion-color-step-850: #d9d9d9; + --ion-color-step-900: #e6e6e6; + --ion-color-step-950: #f2f2f2; + + --ion-item-background: #000000; + + --ion-card-background: #1c1c1d; + } + + .ios ion-modal { + --ion-background-color: var(--ion-color-step-100); + --ion-toolbar-background: var(--ion-color-step-150); + --ion-toolbar-border-color: var(--ion-color-step-250); + } + + + /* + * Material Design Dark Theme + * ------------------------------------------- + */ + + .md body { + --ion-background-color: #121212; + --ion-background-color-rgb: 18,18,18; + + --ion-text-color: #ffffff; + --ion-text-color-rgb: 255,255,255; + + --ion-border-color: #222222; + + --ion-color-step-50: #1e1e1e; + --ion-color-step-100: #2a2a2a; + --ion-color-step-150: #363636; + --ion-color-step-200: #414141; + --ion-color-step-250: #4d4d4d; + --ion-color-step-300: #595959; + --ion-color-step-350: #656565; + --ion-color-step-400: #717171; + --ion-color-step-450: #7d7d7d; + --ion-color-step-500: #898989; + --ion-color-step-550: #949494; + --ion-color-step-600: #a0a0a0; + --ion-color-step-650: #acacac; + --ion-color-step-700: #b8b8b8; + --ion-color-step-750: #c4c4c4; + --ion-color-step-800: #d0d0d0; + --ion-color-step-850: #dbdbdb; + --ion-color-step-900: #e7e7e7; + --ion-color-step-950: #f3f3f3; + + --ion-item-background: #1e1e1e; + + --ion-toolbar-background: #1f1f1f; + + --ion-tab-bar-background: #1f1f1f; + + --ion-card-background: #1e1e1e; + } +} \ No newline at end of file diff --git a/examples/user-management/ionic-vue-user-management/src/views/Account.vue b/examples/user-management/ionic-vue-user-management/src/views/Account.vue new file mode 100644 index 00000000000..823a2a8c3a0 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/views/Account.vue @@ -0,0 +1,153 @@ + + + diff --git a/examples/user-management/ionic-vue-user-management/src/views/HomePage.vue b/examples/user-management/ionic-vue-user-management/src/views/HomePage.vue new file mode 100644 index 00000000000..984f01f445f --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/views/HomePage.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/examples/user-management/ionic-vue-user-management/src/views/Login.vue b/examples/user-management/ionic-vue-user-management/src/views/Login.vue new file mode 100644 index 00000000000..f1a91b0455f --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/src/views/Login.vue @@ -0,0 +1,74 @@ + + + diff --git a/examples/user-management/ionic-vue-user-management/tests/e2e/.eslintrc.js b/examples/user-management/ionic-vue-user-management/tests/e2e/.eslintrc.js new file mode 100644 index 00000000000..72e6bbff569 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/tests/e2e/.eslintrc.js @@ -0,0 +1,12 @@ +module.exports = { + plugins: [ + 'cypress' + ], + env: { + mocha: true, + 'cypress/globals': true + }, + rules: { + strict: 'off' + } +} diff --git a/examples/user-management/ionic-vue-user-management/tests/e2e/plugins/index.js b/examples/user-management/ionic-vue-user-management/tests/e2e/plugins/index.js new file mode 100644 index 00000000000..6f7e63b9ef9 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/tests/e2e/plugins/index.js @@ -0,0 +1,25 @@ +/* eslint-disable arrow-body-style */ +// https://docs.cypress.io/guides/guides/plugins-guide.html + +// if you need a custom webpack configuration you can uncomment the following import +// and then use the `file:preprocessor` event +// as explained in the cypress docs +// https://docs.cypress.io/api/plugins/preprocessors-api.html#Examples + +// /* eslint-disable import/no-extraneous-dependencies, global-require */ +// const webpack = require('@cypress/webpack-preprocessor') + +module.exports = (on, config) => { + // on('file:preprocessor', webpack({ + // webpackOptions: require('@vue/cli-service/webpack.config'), + // watchOptions: {} + // })) + + return Object.assign({}, config, { + fixturesFolder: 'tests/e2e/fixtures', + integrationFolder: 'tests/e2e/specs', + screenshotsFolder: 'tests/e2e/screenshots', + videosFolder: 'tests/e2e/videos', + supportFile: 'tests/e2e/support/index.js' + }) +} diff --git a/examples/user-management/ionic-vue-user-management/tests/e2e/specs/test.js b/examples/user-management/ionic-vue-user-management/tests/e2e/specs/test.js new file mode 100644 index 00000000000..c6b5114a327 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/tests/e2e/specs/test.js @@ -0,0 +1,8 @@ +// https://docs.cypress.io/api/introduction/api.html + +describe('My First Test', () => { + it('Visits the app root url', () => { + cy.visit('/') + cy.contains('#container', 'Ready to create an app?') + }) +}) diff --git a/examples/user-management/ionic-vue-user-management/tests/e2e/support/commands.js b/examples/user-management/ionic-vue-user-management/tests/e2e/support/commands.js new file mode 100644 index 00000000000..c1f5a772e2b --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/tests/e2e/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add("login", (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This is will overwrite an existing command -- +// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/examples/user-management/ionic-vue-user-management/tests/e2e/support/index.js b/examples/user-management/ionic-vue-user-management/tests/e2e/support/index.js new file mode 100644 index 00000000000..d68db96df26 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/tests/e2e/support/index.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/examples/user-management/ionic-vue-user-management/tests/unit/example.spec.ts b/examples/user-management/ionic-vue-user-management/tests/unit/example.spec.ts new file mode 100644 index 00000000000..645bdd280a4 --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/tests/unit/example.spec.ts @@ -0,0 +1,9 @@ +import { mount } from '@vue/test-utils' +import HomePage from '@/views/HomePage.vue' + +describe('HomePage.vue', () => { + it('renders home vue', () => { + const wrapper = mount(HomePage) + expect(wrapper.text()).toMatch('Ready to create an app?') + }) +}) diff --git a/examples/user-management/ionic-vue-user-management/tsconfig.json b/examples/user-management/ionic-vue-user-management/tsconfig.json new file mode 100644 index 00000000000..fc67121bbfd --- /dev/null +++ b/examples/user-management/ionic-vue-user-management/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "strict": true, + "jsx": "preserve", + "importHelpers": true, + "moduleResolution": "node", + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "baseUrl": ".", + "types": [ + "webpack-env", + "jest" + ], + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.vue", + "tests/**/*.ts", + "tests/**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} From d8947c11947f4366f069e3f82ae1f614ca329ec0 Mon Sep 17 00:00:00 2001 From: "Andrey A." <56412611+aantti@users.noreply.github.com> Date: Tue, 17 Mar 2026 13:27:01 +0100 Subject: [PATCH 015/169] chore(self-hosted): update image versions 2026-03-16 (#43826) --- docker/docker-compose.rustfs.yml | 2 +- docker/docker-compose.s3.yml | 2 +- docker/docker-compose.yml | 17 ++++++++++------- docker/versions.md | 7 +++++++ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/docker/docker-compose.rustfs.yml b/docker/docker-compose.rustfs.yml index ab22fcc82ec..147da6748dc 100644 --- a/docker/docker-compose.rustfs.yml +++ b/docker/docker-compose.rustfs.yml @@ -16,7 +16,7 @@ services: timeout: 10s retries: 5 volumes: - - rustfs-data:/data:z + - rustfs-data:/data rustfs-createbucket: image: rustfs/rc diff --git a/docker/docker-compose.s3.yml b/docker/docker-compose.s3.yml index c197b7dc060..165463f9d01 100644 --- a/docker/docker-compose.s3.yml +++ b/docker/docker-compose.s3.yml @@ -15,7 +15,7 @@ services: timeout: 10s retries: 5 volumes: - - minio-data:/data:z + - minio-data:/data minio-createbucket: image: cgr.dev/chainguard/minio-client:latest-dev diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 82440321daf..ee2b4028e8b 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,9 +1,9 @@ # Usage -# Start: docker compose up -# With helpers: docker compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up +# Start: docker compose up -d # Stop: docker compose down -# Destroy: docker compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml down -v --remove-orphans +# Dev mode: docker compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d # Reset everything: ./reset.sh +# name: supabase @@ -11,7 +11,7 @@ services: studio: container_name: supabase-studio - image: supabase/studio:2026.02.16-sha-26c615c + image: supabase/studio:2026.03.16-sha-5528817 restart: unless-stopped healthcheck: test: @@ -241,7 +241,7 @@ services: rest: container_name: supabase-rest - image: postgrest/postgrest:v14.5 + image: postgrest/postgrest:v14.6 restart: unless-stopped depends_on: db: @@ -299,6 +299,7 @@ services: #API_JWT_JWKS: ${JWT_JWKS:-{"keys":[]}} SECRET_KEY_BASE: ${SECRET_KEY_BASE} + METRICS_JWT_SECRET: ${JWT_SECRET} ERL_AFLAGS: -proto_dist inet_tcp DNS_NODES: "''" RLIMIT_NOFILE: "10000" @@ -310,7 +311,7 @@ services: # To use S3 backed storage: docker compose -f docker-compose.yml -f docker-compose.s3.yml up storage: container_name: supabase-storage - image: supabase/storage-api:v1.37.8 + image: supabase/storage-api:v1.44.2 restart: unless-stopped depends_on: db: @@ -333,6 +334,7 @@ services: timeout: 5s interval: 5s retries: 3 + start_period: 10s environment: ANON_KEY: ${ANON_KEY} SERVICE_KEY: ${SERVICE_ROLE_KEY} @@ -345,6 +347,7 @@ services: #JWT_JWKS: ${JWT_JWKS:-{"keys":[]}} DATABASE_URL: postgres://supabase_storage_admin:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + STORAGE_PUBLIC_URL: ${SUPABASE_PUBLIC_URL} REQUEST_ALLOW_X_FORWARDED_PATH: "true" FILE_SIZE_LIMIT: 52428800 STORAGE_BACKEND: file @@ -410,7 +413,7 @@ services: functions: container_name: supabase-edge-functions - image: supabase/edge-runtime:v1.70.3 + image: supabase/edge-runtime:v1.71.2 restart: unless-stopped volumes: - ./volumes/functions:/home/deno/functions:Z diff --git a/docker/versions.md b/docker/versions.md index af00d5872d6..59cccb87f51 100644 --- a/docker/versions.md +++ b/docker/versions.md @@ -1,5 +1,12 @@ # Docker Image Versions +## 2025-03-16 +- supabase/studio:2026.03.16-sha-5528817 (prev supabase/studio:2026.02.16-sha-26c615c) +- kong/kong:3.9.1 (prev kong:2.8.1) +- postgrest/postgrest:v14.6 (prev postgrest/postgrest:v14.5) +- supabase/storage-api:v1.44.2 (prev supabase/storage-api:v1.37.8) +- supabase/edge-runtime:v1.71.2 (prev supabase/edge-runtime:v1.70.3) + ## 2026-02-16 - supabase/studio:2026.02.16-sha-26c615c (prev supabase/studio:2026.01.27-sha-6aa59ff) - supabase/gotrue:v2.186.0 (prev supabase/gotrue:v2.185.0) From 4f65e09ff50caf250007b49b38883d0dd3e54702 Mon Sep 17 00:00:00 2001 From: "Andrey A." <56412611+aantti@users.noreply.github.com> Date: Tue, 17 Mar 2026 13:36:24 +0100 Subject: [PATCH 016/169] chore(self-hosted): update changelog 2026-03-16 (#43827) --- docker/CHANGELOG.md | 59 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/docker/CHANGELOG.md b/docker/CHANGELOG.md index e2fc4497947..05c21f40b4d 100644 --- a/docker/CHANGELOG.md +++ b/docker/CHANGELOG.md @@ -15,13 +15,61 @@ Check updates for each service to learn more. --- +## [2026-03-16] + +⚠️ **Note:** This update includes **important changes**. Please check the details below. The following configuration files have been added/updated: `utils/add-new-auth-keys.sh`, `utils/rotate-new-api-keys.sh`, `docker-compose.yml`, `.env.example`, `docker-compose.s3.yml`, `docker-compose.rustfs.yml`, `volumes/api/kong.yml`, `volumes/api/kong-entrypoint.sh`, `docker-compose.caddy.yml`, `docker-compose.nginx.yml`, `volumes/functions/main/index.ts`, and `volumes/proxy`. + +### Configuration +- ⚠️ Added scripts and templates to support the new API key format (`sb_` API keys) and the new asymmetric authentication - PR [#43554](https://github.com/supabase/supabase/pull/43554); see the [how-to guide](https://supabase.com/docs/guides/self-hosting/self-hosted-auth-keys) for detailed instructions +- Added optional proxy configuration for Caddy and nginx - PR [#43291](https://github.com/supabase/supabase/pull/43291); read the [how-to guide](https://supabase.com/docs/guides/self-hosting/self-hosted-proxy-https) to learn more + +### Documentation +- Added several new how-to guides to the self-hosted Supabase [documentation](https://supabase.com/docs/guides/self-hosting) - PR [#42745](https://github.com/supabase/supabase/pull/42745), PR [#42953](https://github.com/supabase/supabase/pull/42953), PR [#43177](https://github.com/supabase/supabase/pull/43177), PR [#43286](https://github.com/supabase/supabase/pull/43286), PR [#43293](https://github.com/supabase/supabase/pull/43293) + +### Utils and tests +- Added `add-new-auth-keys.sh` and `rotate-new-api-keys.sh` - PR [#43554](https://github.com/supabase/supabase/pull/43554) +- Added `./tests` with 100+ test cases - PR [#43573](https://github.com/supabase/supabase/pull/43573) + +### Studio +- Updated to `supabase/studio:2026.03.16-sha-5528817` +- ⚠️ Added the link to Data API page in Integrations - PR [#43268](https://github.com/supabase/supabase/pull/43268) +- ⚠️ Added `PGRST_DB_SCHEMAS`, `PGRST_DB_EXTRA_SEARCH_PATH`, and `PGRST_DB_MAX_ROWS` to Studio configuration (requires `docker-compose.yml` update) - PR [#43268](https://github.com/supabase/supabase/pull/43268) + +### MCP Server +- Updated to `v0.7.0` - [Release](https://github.com/supabase-community/supabase-mcp/releases/tag/v0.7.0) + +### API gateway +- ⚠️ Updated Kong to `3.9.1` - PR [#43554](https://github.com/supabase/supabase/pull/43554) + +### PostgREST +- Updated to `v14.6` - [Changelog](https://github.com/PostgREST/postgrest/blob/main/CHANGELOG.md) | [Release](https://github.com/PostgREST/postgrest/releases/tag/v14.6) + +### Realtime + +- ⚠️ Added **mandatory** `METRICS_JWT_SECRET` environment variable (requires `docker-compose.s3.yml` update) - PR [realtime#1729](https://github.com/supabase/realtime/pull/1729) + +### Storage +- Updated to `v1.44.2` - [Release](https://github.com/supabase/storage/releases/tag/v1.44.2) +- ⚠️ Added `STORAGE_PUBLIC_URL` environment variable to simplify proxy configuration (requires `docker-compose.s3.yml` update) - PR [storage#900](https://github.com/supabase/storage/pull/900) +- ⚠️ Added RustFS as an optional S3 backend - PR [#42935](https://github.com/supabase/supabase/pull/42935) +- ⚠️ Changed Docker Compose configuration for S3 backends to use named volumes - PR [#43815](https://github.com/supabase/supabase/pull/43815) + +### Edge Runtime + +- Updated to `v1.71.2` - [Release](https://github.com/supabase/edge-runtime/releases/tag/v1.71.2) +- ⚠️ Added `SUPABASE_PUBLISHABLE_KEYS`, `SUPABASE_SECRET_KEYS`, and `SUPABASE_PUBLIC_URL` environment variables (requires `docker-compose.yml` update) +- ⚠️ Added an option for a "hybrid" JWT verification following the addition of the new API keys and the new asymmetric authentication (requires `volumes/functions/main/index.ts` update) - PR [#42130](https://github.com/supabase/supabase/pull/42130) +- ⚠️ Added optional rate limiter - PR [edge-runtime#670](https://github.com/supabase/edge-runtime/pull/670) + +--- + ## [2026-02-18] ### Storage -- Updated `supabase/storage-api` to `v1.37.8` in `docker-compose.s3.yml` -- Changed MinIO image in `docker-compose.s3.yml` to use Chainguard [minio](https://images.chainguard.dev/directory/image/minio/overview) and [minio-client](https://images.chainguard.dev/directory/image/minio-client/overview) (requires `docker-compose.s3.yml` update) - PR [#42942](https://github.com/supabase/supabase/pull/42942) +- Changed MinIO image to use Chainguard [minio](https://images.chainguard.dev/directory/image/minio/overview) and [minio-client](https://images.chainguard.dev/directory/image/minio-client/overview) (requires `docker-compose.s3.yml` update) - PR [#42942](https://github.com/supabase/supabase/pull/42942) +- Updated Storage image version to `v1.37.8` in `docker-compose.s3.yml` - Removed `imgproxy` service from `docker-compose.s3.yml` to minimize redundancy - PR [#42942](https://github.com/supabase/supabase/pull/42942) -- Fixed inconsistent `storage` service entry ordering in `docker-compose.yml` and `docker-compose.s3.yml` to improve diff readability (requires `docker-compose.yml` and `docker-compose.s3.yml` update) - PR [#42942](https://github.com/supabase/supabase/pull/42942) +- Fixed inconsistent `storage` service entry ordering in `docker-compose.yml` and `docker-compose.s3.yml` to improve diff readability - PR [#42942](https://github.com/supabase/supabase/pull/42942) ### Edge Runtime @@ -55,8 +103,9 @@ Check updates for each service to learn more. ### Storage - Updated to `v1.37.8` - [Release](https://github.com/supabase/storage/releases/tag/v1.37.8) -- ⚠️ Added configuration to access buckets via `/storage/v1/s3` endpoint (requires `docker-compose.s3.yml` update) - PR [#37185](https://github.com/supabase/supabase/pull/37185) - ⚠️ Changed environment variable configuration for Storage (requires `docker-compose.yml`, `.env.example` and `.env` update) - PR [#37185](https://github.com/supabase/supabase/pull/37185), PR [#42862](https://github.com/supabase/supabase/pull/42862) +- ⚠️ Added **default** configuration to access buckets via `/storage/v1/s3` endpoint (requires `docker-compose.yml` and `.env` update) - PR [#37185](https://github.com/supabase/supabase/pull/37185) +- ⚠️ Changed MinIO configuration for the S3 backend (requires `docker-compose.s3.yml` and `.env` update update) - PR [#37185](https://github.com/supabase/supabase/pull/37185) ### Edge Runtime @@ -89,7 +138,7 @@ Check updates for each service to learn more. ### Studio - Updated to `2026.01.27-sha-6aa59ff` -- Added SQL snippets (requires `docker-compose.yml` update) - PR [#41112](https://github.com/supabase/supabase/pull/41112), PR [#41557](https://github.com/supabase/supabase/pull/41557) +- Added SQL snippets (requires `docker-compose.yml` update) - PR [#41112](https://github.com/supabase/supabase/pull/41112), PR [#41557](https://github.com/supabase/supabase/pull/41557), discussion [#42031](https://github.com/orgs/supabase/discussions/42031) - Fixed type generator - PR [#40481](https://github.com/supabase/supabase/pull/40481) - Fixed minor UI discrepancies - PR [#40579](https://github.com/supabase/supabase/pull/40579), PR [#41936](https://github.com/supabase/supabase/pull/41936), PR [#41970](https://github.com/supabase/supabase/pull/41970), PR [#41971](https://github.com/supabase/supabase/pull/41971), PR [#41972](https://github.com/supabase/supabase/pull/41972), PR [#42015](https://github.com/supabase/supabase/pull/42015) From 9bf981f371fd849ca7450de836c47b4779ddc7d3 Mon Sep 17 00:00:00 2001 From: Tiago Antunes Date: Tue, 17 Mar 2026 12:55:03 +0000 Subject: [PATCH 017/169] feat(ui-library): add Realtime Monaco ui component (#41766) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Adds a new Realtime Monaco component to the UI Library, enabling collaborative code editing with Supabase Realtime synchronization using Monaco Editor and Yjs. ## Additional context This is WIP and used for discuss further changes to the y-supabase provider. ## Demo https://github.com/user-attachments/assets/84a761e5-73bb-478e-979a-682121ffee89 ## Summary by CodeRabbit ## Release Notes * **New Features** * Added a new Realtime Monaco collaborative code editor component with real-time synchronization support across multiple frameworks (Next.js, React, React Router, Tanstack). * **Documentation** * Added comprehensive documentation and usage guides for the Realtime Monaco component across all supported frameworks. * **Dependencies** * Added Monaco editor, Yjs, y-monaco, and Supabase collaboration packages. ✏️ Tip: You can customize this high-level summary in your review settings. --------- Co-authored-by: Ivan Vasilov --- apps/ui-library/__registry__/index.tsx | 4 + .../app/example/realtime-monaco-demo/page.tsx | 9 ++ .../components/dual-realtime-monaco.tsx | 12 ++ apps/ui-library/components/mdx-components.tsx | 2 + apps/ui-library/config/docs.ts | 7 + .../content/docs/nextjs/realtime-monaco.mdx | 124 ++++++++++++++ .../docs/react-router/realtime-monaco.mdx | 124 ++++++++++++++ .../content/docs/react/realtime-monaco.mdx | 124 ++++++++++++++ .../content/docs/tanstack/realtime-monaco.mdx | 124 ++++++++++++++ apps/ui-library/package.json | 8 +- apps/ui-library/public/llms.txt | 8 + .../public/r/realtime-monaco-nextjs.json | 47 ++++++ .../r/realtime-monaco-react-router.json | 42 +++++ .../public/r/realtime-monaco-react.json | 36 +++++ .../public/r/realtime-monaco-tanstack.json | 42 +++++ apps/ui-library/public/r/registry.json | 151 ++++++++++++++++++ apps/ui-library/registry/blocks.ts | 2 + .../components/realtime-monaco.tsx | 43 +++++ .../hooks/use-connect-on-mount.ts | 121 ++++++++++++++ .../blocks/realtime-monaco/registry-item.json | 19 +++ .../default/examples/realtime-monaco-demo.tsx | 29 ++++ apps/ui-library/registry/examples.ts | 11 ++ pnpm-lock.yaml | 99 +++++++++++- pnpm-workspace.yaml | 1 + 24 files changed, 1184 insertions(+), 5 deletions(-) create mode 100644 apps/ui-library/app/example/realtime-monaco-demo/page.tsx create mode 100644 apps/ui-library/components/dual-realtime-monaco.tsx create mode 100644 apps/ui-library/content/docs/nextjs/realtime-monaco.mdx create mode 100644 apps/ui-library/content/docs/react-router/realtime-monaco.mdx create mode 100644 apps/ui-library/content/docs/react/realtime-monaco.mdx create mode 100644 apps/ui-library/content/docs/tanstack/realtime-monaco.mdx create mode 100644 apps/ui-library/public/r/realtime-monaco-nextjs.json create mode 100644 apps/ui-library/public/r/realtime-monaco-react-router.json create mode 100644 apps/ui-library/public/r/realtime-monaco-react.json create mode 100644 apps/ui-library/public/r/realtime-monaco-tanstack.json create mode 100644 apps/ui-library/registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx create mode 100644 apps/ui-library/registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts create mode 100644 apps/ui-library/registry/default/blocks/realtime-monaco/registry-item.json create mode 100644 apps/ui-library/registry/default/examples/realtime-monaco-demo.tsx diff --git a/apps/ui-library/__registry__/index.tsx b/apps/ui-library/__registry__/index.tsx index f20ed0206cd..7cd9c0996e9 100644 --- a/apps/ui-library/__registry__/index.tsx +++ b/apps/ui-library/__registry__/index.tsx @@ -15,6 +15,10 @@ export const Index = { component: React.lazy(() => import("@/registry/default/examples/realtime-cursor-demo.tsx")), } , + "realtime-monaco-demo": { + component: React.lazy(() => import("@/registry/default/examples/realtime-monaco-demo.tsx")), + } + , "password-based-auth-demo": { component: React.lazy(() => import("@/registry/default/examples/password-based-auth.tsx")), } diff --git a/apps/ui-library/app/example/realtime-monaco-demo/page.tsx b/apps/ui-library/app/example/realtime-monaco-demo/page.tsx new file mode 100644 index 00000000000..7e2bdc7961c --- /dev/null +++ b/apps/ui-library/app/example/realtime-monaco-demo/page.tsx @@ -0,0 +1,9 @@ +'use client' + +import Demo from '@/registry/default/examples/realtime-monaco-demo' + +const RealtimeMonacoDemoPage = () => { + return +} + +export default RealtimeMonacoDemoPage diff --git a/apps/ui-library/components/dual-realtime-monaco.tsx b/apps/ui-library/components/dual-realtime-monaco.tsx new file mode 100644 index 00000000000..687a0ea63f9 --- /dev/null +++ b/apps/ui-library/components/dual-realtime-monaco.tsx @@ -0,0 +1,12 @@ +'use client' + +import { BlockPreview } from './block-preview' + +export function DualRealtimeMonaco() { + return ( +
    + + +
    + ) +} diff --git a/apps/ui-library/components/mdx-components.tsx b/apps/ui-library/components/mdx-components.tsx index 22600e89326..372a9d82406 100644 --- a/apps/ui-library/components/mdx-components.tsx +++ b/apps/ui-library/components/mdx-components.tsx @@ -14,6 +14,7 @@ import { Callout } from './callout' import { ComponentPreview } from './component-preview' import { CopyButton } from './copy-button' import { DualRealtimeChat } from './dual-realtime-chat' +import { DualRealtimeMonaco } from './dual-realtime-monaco' import { RegistryBlock } from './registry-block' import { StyleWrapper } from './style-wrapper' import TanStackBeta from './tanstack-beta' @@ -182,6 +183,7 @@ const components = { BlockItem, BlockPreview, DualRealtimeChat, + DualRealtimeMonaco, TanstackDBGenerator, } diff --git a/apps/ui-library/config/docs.ts b/apps/ui-library/config/docs.ts index 17302b7ff19..34c7f4a4893 100644 --- a/apps/ui-library/config/docs.ts +++ b/apps/ui-library/config/docs.ts @@ -88,6 +88,13 @@ export const componentPages: SidebarNavGroup = { items: [], commandItemLabel: 'Realtime Cursor', }, + { + title: 'Realtime Monaco', + supportedFrameworks: ['nextjs', 'react-router', 'tanstack', 'react'], + href: '/docs/nextjs/realtime-monaco', + items: [], + commandItemLabel: 'Realtime Monaco', + }, { title: 'Current User Avatar', supportedFrameworks: ['nextjs', 'react-router', 'tanstack', 'react', 'vue', 'nuxtjs'], diff --git a/apps/ui-library/content/docs/nextjs/realtime-monaco.mdx b/apps/ui-library/content/docs/nextjs/realtime-monaco.mdx new file mode 100644 index 00000000000..06b21c75070 --- /dev/null +++ b/apps/ui-library/content/docs/nextjs/realtime-monaco.mdx @@ -0,0 +1,124 @@ +--- +title: Realtime Monaco +description: Real-time Monaco editor for collaborative applications +--- + + + +## Installation + + + +## Folder structure + + + +## Introduction + +The Realtime Monaco component provides a collaborative code editor powered by [Monaco](https://microsoft.github.io/monaco-editor/) and [Yjs](https://yjs.dev/). It uses [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase) under the hood to sync document state across clients through Supabase Realtime. + +**Features** + +- Real-time document synchronization via Supabase Realtime broadcast +- Cursor and selection sharing between collaborators (awareness) +- Optional persistence to Postgres so documents survive page reloads +- Supports all Monaco languages and themes +- Room-based isolation for scoped collaboration + +## How it works under the hood + +The component creates a [Yjs](https://yjs.dev/) document and connects it to a Supabase Realtime channel using `SupabaseProvider` from `@supabase-labs/y-supabase`. A `MonacoBinding` from `y-monaco` bridges the Yjs document with the Monaco editor model, keeping them in sync. + +When **awareness** is enabled, each user's cursor position and selection are broadcast to other clients in the same channel. Remote cursors are rendered with unique colors via dynamically injected CSS. + +When **persistence** is enabled, the full Yjs document state is saved to a Postgres table so it can be restored when clients reconnect. + +## Usage + +### Basic usage + +```tsx +import { RealtimeMonaco } from '@/components/realtime-monaco' + +export default function MonacoPage() { + return +} +``` + +### With persistence + +Enable persistence to save the editor content to your Supabase database. This requires a table to store the Yjs document state. + +First, create the required table in your Supabase project: + +```sql +create table yjs_documents ( + room text primary key, + state text not null +); +``` + +Then pass `persistence` to the component: + +```tsx +import { RealtimeMonaco } from '@/components/realtime-monaco' + +export default function MonacoPage() { + return +} +``` + +You can also pass a `SupabasePersistenceOptions` object: + +```tsx + +``` + +### Without awareness + +By default, cursor and selection positions are shared between collaborators. To disable this: + +```tsx + +``` + +## Props + +| Prop | Type | Description | +| -------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `channel` | `string` | Unique channel name used to sync editor content between collaborators in the same session. | +| `language?` | `string` | Monaco [language identifier](https://code.visualstudio.com/docs/languages/identifiers) (e.g. `typescript`, `python`). Defaults to `javascript`. | +| `height?` | `string \| number` | Height of the editor container. Accepts a pixel number or CSS string (e.g. `"100%"`). Defaults to `550`. | +| `className?` | `string` | CSS class applied to the editor wrapper element. | +| `awareness?` | `boolean \| Awareness` | Enables cursor and selection sharing between users. Pass `false` to disable or a custom `Awareness` instance. Defaults to `true`. | +| `persistence?` | `boolean \| SupabasePersistenceOptions` | Persists editor content to Supabase so it survives page reloads. Pass `true` for defaults or an options object for fine-grained control. | +| `theme?` | `'light' \| 'dark'` | Color theme for the editor. Maps to Monaco's `light` and `vs-dark` themes. | + +### SupabasePersistenceOptions + +| Option | Type | Default | Description | +| -------------- | -------- | ----------------- | --------------------------------------------------- | +| `table` | `string` | `'yjs_documents'` | Name of the Postgres table used to store documents. | +| `schema` | `string` | `'public'` | Schema where the table is located. | +| `roomColumn` | `string` | `'room'` | Column used as the document identifier. | +| `stateColumn` | `string` | `'state'` | Column used to store the binary Yjs state. | +| `storeTimeout` | `number` | `1000` | Debounce delay (ms) before persisting changes. | + +## Further reading + +- [Realtime Broadcast](https://supabase.com/docs/guides/realtime/broadcast) +- [Realtime authorization](https://supabase.com/docs/guides/realtime/authorization) +- [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase) +- [Yjs documentation](https://docs.yjs.dev/) diff --git a/apps/ui-library/content/docs/react-router/realtime-monaco.mdx b/apps/ui-library/content/docs/react-router/realtime-monaco.mdx new file mode 100644 index 00000000000..3959f8a34e0 --- /dev/null +++ b/apps/ui-library/content/docs/react-router/realtime-monaco.mdx @@ -0,0 +1,124 @@ +--- +title: Realtime Monaco +description: Real-time Monaco editor for collaborative applications +--- + + + +## Installation + + + +## Folder structure + + + +## Introduction + +The Realtime Monaco component provides a collaborative code editor powered by [Monaco](https://microsoft.github.io/monaco-editor/) and [Yjs](https://yjs.dev/). It uses [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase) under the hood to sync document state across clients through Supabase Realtime. + +**Features** + +- Real-time document synchronization via Supabase Realtime broadcast +- Cursor and selection sharing between collaborators (awareness) +- Optional persistence to Postgres so documents survive page reloads +- Supports all Monaco languages and themes +- Room-based isolation for scoped collaboration + +## How it works under the hood + +The component creates a [Yjs](https://yjs.dev/) document and connects it to a Supabase Realtime channel using `SupabaseProvider` from `@supabase-labs/y-supabase`. A `MonacoBinding` from `y-monaco` bridges the Yjs document with the Monaco editor model, keeping them in sync. + +When **awareness** is enabled, each user's cursor position and selection are broadcast to other clients in the same channel. Remote cursors are rendered with unique colors via dynamically injected CSS. + +When **persistence** is enabled, the full Yjs document state is saved to a Postgres table so it can be restored when clients reconnect. + +## Usage + +### Basic usage + +```tsx +import { RealtimeMonaco } from '@/components/realtime-monaco' + +export default function MonacoPage() { + return +} +``` + +### With persistence + +Enable persistence to save the editor content to your Supabase database. This requires a table to store the Yjs document state. + +First, create the required table in your Supabase project: + +```sql +create table yjs_documents ( + room text primary key, + state text not null +); +``` + +Then pass `persistence` to the component: + +```tsx +import { RealtimeMonaco } from '@/components/realtime-monaco' + +export default function MonacoPage() { + return +} +``` + +You can also pass a `SupabasePersistenceOptions` object: + +```tsx + +``` + +### Without awareness + +By default, cursor and selection positions are shared between collaborators. To disable this: + +```tsx + +``` + +## Props + +| Prop | Type | Description | +| -------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `channel` | `string` | Unique channel name used to sync editor content between collaborators in the same session. | +| `language?` | `string` | Monaco [language identifier](https://code.visualstudio.com/docs/languages/identifiers) (e.g. `typescript`, `python`). Defaults to `javascript`. | +| `height?` | `string \| number` | Height of the editor container. Accepts a pixel number or CSS string (e.g. `"100%"`). Defaults to `550`. | +| `className?` | `string` | CSS class applied to the editor wrapper element. | +| `awareness?` | `boolean \| Awareness` | Enables cursor and selection sharing between users. Pass `false` to disable or a custom `Awareness` instance. Defaults to `true`. | +| `persistence?` | `boolean \| SupabasePersistenceOptions` | Persists editor content to Supabase so it survives page reloads. Pass `true` for defaults or an options object for fine-grained control. | +| `theme?` | `'light' \| 'dark'` | Color theme for the editor. Maps to Monaco's `light` and `vs-dark` themes. | + +### SupabasePersistenceOptions + +| Option | Type | Default | Description | +| -------------- | -------- | ----------------- | --------------------------------------------------- | +| `table` | `string` | `'yjs_documents'` | Name of the Postgres table used to store documents. | +| `schema` | `string` | `'public'` | Schema where the table is located. | +| `roomColumn` | `string` | `'room'` | Column used as the document identifier. | +| `stateColumn` | `string` | `'state'` | Column used to store the binary Yjs state. | +| `storeTimeout` | `number` | `1000` | Debounce delay (ms) before persisting changes. | + +## Further reading + +- [Realtime Broadcast](https://supabase.com/docs/guides/realtime/broadcast) +- [Realtime authorization](https://supabase.com/docs/guides/realtime/authorization) +- [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase) +- [Yjs documentation](https://docs.yjs.dev/) diff --git a/apps/ui-library/content/docs/react/realtime-monaco.mdx b/apps/ui-library/content/docs/react/realtime-monaco.mdx new file mode 100644 index 00000000000..016f2baa712 --- /dev/null +++ b/apps/ui-library/content/docs/react/realtime-monaco.mdx @@ -0,0 +1,124 @@ +--- +title: Realtime Monaco +description: Real-time Monaco editor for collaborative applications +--- + + + +## Installation + + + +## Folder structure + + + +## Introduction + +The Realtime Monaco component provides a collaborative code editor powered by [Monaco](https://microsoft.github.io/monaco-editor/) and [Yjs](https://yjs.dev/). It uses [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase) under the hood to sync document state across clients through Supabase Realtime. + +**Features** + +- Real-time document synchronization via Supabase Realtime broadcast +- Cursor and selection sharing between collaborators (awareness) +- Optional persistence to Postgres so documents survive page reloads +- Supports all Monaco languages and themes +- Room-based isolation for scoped collaboration + +## How it works under the hood + +The component creates a [Yjs](https://yjs.dev/) document and connects it to a Supabase Realtime channel using `SupabaseProvider` from `@supabase-labs/y-supabase`. A `MonacoBinding` from `y-monaco` bridges the Yjs document with the Monaco editor model, keeping them in sync. + +When **awareness** is enabled, each user's cursor position and selection are broadcast to other clients in the same channel. Remote cursors are rendered with unique colors via dynamically injected CSS. + +When **persistence** is enabled, the full Yjs document state is saved to a Postgres table so it can be restored when clients reconnect. + +## Usage + +### Basic usage + +```tsx +import { RealtimeMonaco } from '@/components/realtime-monaco' + +export default function MonacoPage() { + return +} +``` + +### With persistence + +Enable persistence to save the editor content to your Supabase database. This requires a table to store the Yjs document state. + +First, create the required table in your Supabase project: + +```sql +create table yjs_documents ( + room text primary key, + state text not null +); +``` + +Then pass `persistence` to the component: + +```tsx +import { RealtimeMonaco } from '@/components/realtime-monaco' + +export default function MonacoPage() { + return +} +``` + +You can also pass a `SupabasePersistenceOptions` object: + +```tsx + +``` + +### Without awareness + +By default, cursor and selection positions are shared between collaborators. To disable this: + +```tsx + +``` + +## Props + +| Prop | Type | Description | +| -------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `channel` | `string` | Unique channel name used to sync editor content between collaborators in the same session. | +| `language?` | `string` | Monaco [language identifier](https://code.visualstudio.com/docs/languages/identifiers) (e.g. `typescript`, `python`). Defaults to `javascript`. | +| `height?` | `string \| number` | Height of the editor container. Accepts a pixel number or CSS string (e.g. `"100%"`). Defaults to `550`. | +| `className?` | `string` | CSS class applied to the editor wrapper element. | +| `awareness?` | `boolean \| Awareness` | Enables cursor and selection sharing between users. Pass `false` to disable or a custom `Awareness` instance. Defaults to `true`. | +| `persistence?` | `boolean \| SupabasePersistenceOptions` | Persists editor content to Supabase so it survives page reloads. Pass `true` for defaults or an options object for fine-grained control. | +| `theme?` | `'light' \| 'dark'` | Color theme for the editor. Maps to Monaco's `light` and `vs-dark` themes. | + +### SupabasePersistenceOptions + +| Option | Type | Default | Description | +| -------------- | -------- | ----------------- | --------------------------------------------------- | +| `table` | `string` | `'yjs_documents'` | Name of the Postgres table used to store documents. | +| `schema` | `string` | `'public'` | Schema where the table is located. | +| `roomColumn` | `string` | `'room'` | Column used as the document identifier. | +| `stateColumn` | `string` | `'state'` | Column used to store the binary Yjs state. | +| `storeTimeout` | `number` | `1000` | Debounce delay (ms) before persisting changes. | + +## Further reading + +- [Realtime Broadcast](https://supabase.com/docs/guides/realtime/broadcast) +- [Realtime authorization](https://supabase.com/docs/guides/realtime/authorization) +- [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase) +- [Yjs documentation](https://docs.yjs.dev/) diff --git a/apps/ui-library/content/docs/tanstack/realtime-monaco.mdx b/apps/ui-library/content/docs/tanstack/realtime-monaco.mdx new file mode 100644 index 00000000000..cd29727b136 --- /dev/null +++ b/apps/ui-library/content/docs/tanstack/realtime-monaco.mdx @@ -0,0 +1,124 @@ +--- +title: Realtime Monaco +description: Real-time Monaco editor for collaborative applications +--- + + + +## Installation + + + +## Folder structure + + + +## Introduction + +The Realtime Monaco component provides a collaborative code editor powered by [Monaco](https://microsoft.github.io/monaco-editor/) and [Yjs](https://yjs.dev/). It uses [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase) under the hood to sync document state across clients through Supabase Realtime. + +**Features** + +- Real-time document synchronization via Supabase Realtime broadcast +- Cursor and selection sharing between collaborators (awareness) +- Optional persistence to Postgres so documents survive page reloads +- Supports all Monaco languages and themes +- Room-based isolation for scoped collaboration + +## How it works under the hood + +The component creates a [Yjs](https://yjs.dev/) document and connects it to a Supabase Realtime channel using `SupabaseProvider` from `@supabase-labs/y-supabase`. A `MonacoBinding` from `y-monaco` bridges the Yjs document with the Monaco editor model, keeping them in sync. + +When **awareness** is enabled, each user's cursor position and selection are broadcast to other clients in the same channel. Remote cursors are rendered with unique colors via dynamically injected CSS. + +When **persistence** is enabled, the full Yjs document state is saved to a Postgres table so it can be restored when clients reconnect. + +## Usage + +### Basic usage + +```tsx +import { RealtimeMonaco } from '@/components/realtime-monaco' + +export default function MonacoPage() { + return +} +``` + +### With persistence + +Enable persistence to save the editor content to your Supabase database. This requires a table to store the Yjs document state. + +First, create the required table in your Supabase project: + +```sql +create table yjs_documents ( + room text primary key, + state text not null +); +``` + +Then pass `persistence` to the component: + +```tsx +import { RealtimeMonaco } from '@/components/realtime-monaco' + +export default function MonacoPage() { + return +} +``` + +You can also pass a `SupabasePersistenceOptions` object: + +```tsx + +``` + +### Without awareness + +By default, cursor and selection positions are shared between collaborators. To disable this: + +```tsx + +``` + +## Props + +| Prop | Type | Description | +| -------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `channel` | `string` | Unique channel name used to sync editor content between collaborators in the same session. | +| `language?` | `string` | Monaco [language identifier](https://code.visualstudio.com/docs/languages/identifiers) (e.g. `typescript`, `python`). Defaults to `javascript`. | +| `height?` | `string \| number` | Height of the editor container. Accepts a pixel number or CSS string (e.g. `"100%"`). Defaults to `550`. | +| `className?` | `string` | CSS class applied to the editor wrapper element. | +| `awareness?` | `boolean \| Awareness` | Enables cursor and selection sharing between users. Pass `false` to disable or a custom `Awareness` instance. Defaults to `true`. | +| `persistence?` | `boolean \| SupabasePersistenceOptions` | Persists editor content to Supabase so it survives page reloads. Pass `true` for defaults or an options object for fine-grained control. | +| `theme?` | `'light' \| 'dark'` | Color theme for the editor. Maps to Monaco's `light` and `vs-dark` themes. | + +### SupabasePersistenceOptions + +| Option | Type | Default | Description | +| -------------- | -------- | ----------------- | --------------------------------------------------- | +| `table` | `string` | `'yjs_documents'` | Name of the Postgres table used to store documents. | +| `schema` | `string` | `'public'` | Schema where the table is located. | +| `roomColumn` | `string` | `'room'` | Column used as the document identifier. | +| `stateColumn` | `string` | `'state'` | Column used to store the binary Yjs state. | +| `storeTimeout` | `number` | `1000` | Debounce delay (ms) before persisting changes. | + +## Further reading + +- [Realtime Broadcast](https://supabase.com/docs/guides/realtime/broadcast) +- [Realtime authorization](https://supabase.com/docs/guides/realtime/authorization) +- [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase) +- [Yjs documentation](https://docs.yjs.dev/) diff --git a/apps/ui-library/package.json b/apps/ui-library/package.json index 544f1a5fd3f..9820ec83582 100644 --- a/apps/ui-library/package.json +++ b/apps/ui-library/package.json @@ -47,11 +47,12 @@ "@radix-ui/react-toggle-group": "*", "@radix-ui/react-tooltip": "*", "@react-router/fs-routes": "^7.4.0", + "@supabase-labs/y-supabase": "0.1.0", "@supabase/postgrest-js": "catalog:", "@supabase/supa-mdx-lint": "0.2.6-alpha", + "@supabase/vue-blocks": "workspace:*", "@tanstack/react-query": "^5.83.0", "api-types": "workspace:*", - "@supabase/vue-blocks": "workspace:*", "axios": "^1.12.0", "class-variance-authority": "*", "cmdk": "^1.0.0", @@ -63,6 +64,7 @@ "icons": "workspace:*", "jotai": "^2.8.0", "lucide-react": "*", + "monaco-editor": "^0.55.1", "next": "catalog:", "next-contentlayer2": "0.4.6", "next-themes": "^0.3.0", @@ -85,9 +87,13 @@ "ui-patterns": "workspace:*", "unist-util-visit": "^5.0.0", "vaul": "^0.9.6", + "y-monaco": "^0.1.6", + "y-protocols": "^1.0.7", + "yjs": "^13.6.29", "zod": "catalog:" }, "devDependencies": { + "@babel/core": "*", "@react-router/dev": "^7.9.0", "@shikijs/compat": "^1.1.7", "@supabase/ssr": "^0.7.0", diff --git a/apps/ui-library/public/llms.txt b/apps/ui-library/public/llms.txt index 1b76808e7e7..2e039c7f2b3 100644 --- a/apps/ui-library/public/llms.txt +++ b/apps/ui-library/public/llms.txt @@ -29,6 +29,8 @@ Library of components for your project. The components integrate with Supabase a - Real-time chat component for collaborative applications - [Realtime Cursor](https://supabase.com/ui/docs/nextjs/realtime-cursor) - Real-time cursor sharing for collaborative applications +- [Realtime Monaco](https://supabase.com/ui/docs/nextjs/realtime-monaco) + - Real-time Monaco editor for collaborative applications - [Social Authentication](https://supabase.com/ui/docs/nextjs/social-auth) - Social authentication block for Next.js - [Supabase Client Libraries](https://supabase.com/ui/docs/nuxtjs/client) @@ -61,6 +63,8 @@ Library of components for your project. The components integrate with Supabase a - Real-time chat component for collaborative applications - [Realtime Cursor](https://supabase.com/ui/docs/react-router/realtime-cursor) - Real-time cursor sharing for collaborative applications +- [Realtime Monaco](https://supabase.com/ui/docs/react-router/realtime-monaco) + - Real-time Monaco editor for collaborative applications - [Social Authentication](https://supabase.com/ui/docs/react-router/social-auth) - Social authentication block for React Router - [Supabase Client Libraries](https://supabase.com/ui/docs/react/client) @@ -77,6 +81,8 @@ Library of components for your project. The components integrate with Supabase a - Real-time chat component for collaborative applications - [Realtime Cursor](https://supabase.com/ui/docs/react/realtime-cursor) - Real-time cursor sharing for collaborative applications +- [Realtime Monaco](https://supabase.com/ui/docs/react/realtime-monaco) + - Real-time Monaco editor for collaborative applications - [Social Authentication](https://supabase.com/ui/docs/react/social-auth) - Social authentication block for React Single Page Applications - [Supabase Client Libraries](https://supabase.com/ui/docs/tanstack/client) @@ -93,6 +99,8 @@ Library of components for your project. The components integrate with Supabase a - Real-time chat component for collaborative applications - [Realtime Cursor](https://supabase.com/ui/docs/tanstack/realtime-cursor) - Real-time cursor sharing for collaborative applications +- [Realtime Monaco](https://supabase.com/ui/docs/tanstack/realtime-monaco) + - Real-time Monaco editor for collaborative applications - [Social Authentication](https://supabase.com/ui/docs/tanstack/social-auth) - Social authentication block for Tanstack Start - [Supabase Client Libraries](https://supabase.com/ui/docs/vue/client) diff --git a/apps/ui-library/public/r/realtime-monaco-nextjs.json b/apps/ui-library/public/r/realtime-monaco-nextjs.json new file mode 100644 index 00000000000..cf141d4690b --- /dev/null +++ b/apps/ui-library/public/r/realtime-monaco-nextjs.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "realtime-monaco-nextjs", + "type": "registry:component", + "title": "Realtime Monaco", + "description": "Real-time Monaco editor for collaborative applications.", + "dependencies": [ + "@monaco-editor/react@latest", + "y-monaco@latest", + "yjs@latest", + "@supabase/ssr@latest", + "@supabase/supabase-js@latest" + ], + "registryDependencies": [], + "files": [ + { + "path": "registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts", + "content": "'use client'\n\nimport { SupabasePersistenceOptions, SupabaseProvider } from '@supabase-labs/y-supabase'\nimport type { editor as MonacoEditor } from 'monaco-editor'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { MonacoBinding } from 'y-monaco'\nimport { Awareness } from 'y-protocols/awareness'\nimport * as Y from 'yjs'\n\nimport { createClient } from '@/registry/default/clients/nextjs/lib/supabase/client'\n\ntype UseConnectOnMountOptions = {\n channel: string\n persistence?: boolean | SupabasePersistenceOptions\n awareness?: boolean | Awareness\n}\n\nconst generateRandomColor = () => `hsl(${Math.floor(Math.random() * 360)}, 80%, 60%)`\n\nexport function useConnectOnMount({\n channel,\n persistence,\n awareness = true,\n}: UseConnectOnMountOptions) {\n const docRef = useRef(null)\n const providerRef = useRef(null)\n const bindingRef = useRef(null)\n const userRef = useRef<{ color: string } | null>(null)\n const styleRef = useRef(null)\n const awarenessHandlerRef = useRef<(() => void) | null>(null)\n\n const connectOnMount = useCallback(\n (editor: MonacoEditor.IStandaloneCodeEditor) => {\n if (bindingRef.current) return\n\n const model = editor.getModel()\n if (!model) return\n\n const doc = new Y.Doc()\n const yText = doc.getText('monaco')\n const supabase = createClient()\n const provider = new SupabaseProvider(channel, doc, supabase as any, {\n awareness,\n persistence,\n })\n const providerAwareness = provider.getAwareness()\n\n if (providerAwareness) {\n if (!userRef.current) {\n userRef.current = {\n color: generateRandomColor(),\n }\n }\n providerAwareness.setLocalStateField('user', userRef.current)\n\n const applyAwarenessStyles = () => {\n if (!styleRef.current) {\n styleRef.current = document.createElement('style')\n styleRef.current.setAttribute('data-monaco-y-cursors', 'true')\n document.head.appendChild(styleRef.current)\n }\n\n let css = `\n .yRemoteSelection {\n background-color: var(--y-remote-selection-color, rgba(0, 0, 0, 0.2));\n opacity: 0.2;\n }\n .yRemoteSelectionHead {\n border-left: 2px solid var(--y-remote-selection-color, rgba(0, 0, 0, 0.7));\n margin-left: -1px;\n box-sizing: border-box;\n }\n `\n\n providerAwareness.getStates().forEach((state, clientId) => {\n const color = state?.user?.color\n const isValidHsl = /^hsl\\(\\d{1,3},\\s*\\d{1,3}%,\\s*\\d{1,3}%\\)$/.test(color)\n\n if (!isValidHsl) return\n if (!color) return\n\n css += `\n .yRemoteSelection-${clientId}, .yRemoteSelectionHead-${clientId} {\n --y-remote-selection-color: ${color};\n }\n `\n })\n\n styleRef.current.textContent = css\n }\n\n awarenessHandlerRef.current = applyAwarenessStyles\n applyAwarenessStyles()\n providerAwareness.on('update', applyAwarenessStyles)\n }\n\n docRef.current = doc\n providerRef.current = provider\n bindingRef.current = new MonacoBinding(yText, model, new Set([editor]), providerAwareness)\n },\n [channel]\n )\n\n useEffect(() => {\n return () => {\n if (awarenessHandlerRef.current && providerRef.current) {\n const awareness = providerRef.current.getAwareness()\n awareness?.off('update', awarenessHandlerRef.current)\n }\n styleRef.current?.remove()\n bindingRef.current?.destroy()\n bindingRef.current = null\n providerRef.current?.destroy()\n providerRef.current = null\n docRef.current?.destroy()\n docRef.current = null\n }\n }, [])\n\n return { connectOnMount }\n}\n", + "type": "registry:hook" + }, + { + "path": "registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx", + "content": "'use client'\n\nimport { Editor } from '@monaco-editor/react'\nimport { SupabasePersistenceOptions } from '@supabase-labs/y-supabase'\nimport { Awareness } from 'y-protocols/awareness.js'\n\nimport { useConnectOnMount } from '../hooks/use-connect-on-mount'\n\ntype RealtimeMonacoProps = {\n channel: string\n language?: string\n height?: string | number\n className?: string\n awareness?: boolean | Awareness\n persistence?: boolean | SupabasePersistenceOptions\n theme?: 'light' | 'dark'\n}\n\nconst DEFAULT_HEIGHT = 550\n\nconst RealtimeMonaco = ({\n channel,\n language = 'javascript',\n height = DEFAULT_HEIGHT,\n awareness = true,\n persistence,\n theme,\n ...rest\n}: RealtimeMonacoProps) => {\n const { connectOnMount } = useConnectOnMount({ channel, persistence, awareness })\n\n return (\n \n )\n}\n\nexport { RealtimeMonaco }\n", + "type": "registry:component" + }, + { + "path": "registry/default/clients/nextjs/lib/supabase/client.ts", + "content": "import { createBrowserClient } from '@supabase/ssr'\n\nexport function createClient() {\n return createBrowserClient(\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\n )\n}\n", + "type": "registry:lib" + }, + { + "path": "registry/default/clients/nextjs/lib/supabase/middleware.ts", + "content": "import { createServerClient } from '@supabase/ssr'\nimport { NextResponse, type NextRequest } from 'next/server'\n\nexport async function updateSession(request: NextRequest) {\n let supabaseResponse = NextResponse.next({\n request,\n })\n\n // With Fluid compute, don't put this client in a global environment\n // variable. Always create a new one on each request.\n const supabase = createServerClient(\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!,\n {\n cookies: {\n getAll() {\n return request.cookies.getAll()\n },\n setAll(cookiesToSet) {\n cookiesToSet.forEach(({ name, value }) => request.cookies.set(name, value))\n supabaseResponse = NextResponse.next({\n request,\n })\n cookiesToSet.forEach(({ name, value, options }) =>\n supabaseResponse.cookies.set(name, value, options)\n )\n },\n },\n }\n )\n\n // Do not run code between createServerClient and\n // supabase.auth.getClaims(). A simple mistake could make it very hard to debug\n // issues with users being randomly logged out.\n\n // IMPORTANT: If you remove getClaims() and you use server-side rendering\n // with the Supabase client, your users may be randomly logged out.\n const { data } = await supabase.auth.getClaims()\n const user = data?.claims\n\n if (\n !user &&\n !request.nextUrl.pathname.startsWith('/login') &&\n !request.nextUrl.pathname.startsWith('/auth')\n ) {\n // no user, potentially respond by redirecting the user to the login page\n const url = request.nextUrl.clone()\n url.pathname = '/auth/login'\n return NextResponse.redirect(url)\n }\n\n // IMPORTANT: You *must* return the supabaseResponse object as it is.\n // If you're creating a new response object with NextResponse.next() make sure to:\n // 1. Pass the request in it, like so:\n // const myNewResponse = NextResponse.next({ request })\n // 2. Copy over the cookies, like so:\n // myNewResponse.cookies.setAll(supabaseResponse.cookies.getAll())\n // 3. Change the myNewResponse object to fit your needs, but avoid changing\n // the cookies!\n // 4. Finally:\n // return myNewResponse\n // If this is not done, you may be causing the browser and server to go out\n // of sync and terminate the user's session prematurely!\n\n return supabaseResponse\n}\n", + "type": "registry:lib" + }, + { + "path": "registry/default/clients/nextjs/lib/supabase/server.ts", + "content": "import { createServerClient } from '@supabase/ssr'\nimport { cookies } from 'next/headers'\n\n/**\n * If using Fluid compute: Don't put this client in a global variable. Always create a new client within each\n * function when using it.\n */\nexport async function createClient() {\n const cookieStore = await cookies()\n\n return createServerClient(\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!,\n {\n cookies: {\n getAll() {\n return cookieStore.getAll()\n },\n setAll(cookiesToSet) {\n try {\n cookiesToSet.forEach(({ name, value, options }) =>\n cookieStore.set(name, value, options)\n )\n } catch {\n // The `setAll` method was called from a Server Component.\n // This can be ignored if you have middleware refreshing\n // user sessions.\n }\n },\n },\n }\n )\n}\n", + "type": "registry:lib" + } + ], + "envVars": { + "NEXT_PUBLIC_SUPABASE_URL": "", + "NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY": "" + }, + "docs": "You'll need to set the following environment variables in your project: `NEXT_PUBLIC_SUPABASE_URL` and `NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY`." +} \ No newline at end of file diff --git a/apps/ui-library/public/r/realtime-monaco-react-router.json b/apps/ui-library/public/r/realtime-monaco-react-router.json new file mode 100644 index 00000000000..55eee0edccc --- /dev/null +++ b/apps/ui-library/public/r/realtime-monaco-react-router.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "realtime-monaco-react-router", + "type": "registry:component", + "title": "Realtime Monaco", + "description": "Real-time Monaco editor for collaborative applications.", + "dependencies": [ + "@monaco-editor/react@latest", + "y-monaco@latest", + "yjs@latest", + "@supabase/ssr@latest", + "@supabase/supabase-js@latest" + ], + "registryDependencies": [], + "files": [ + { + "path": "registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts", + "content": "'use client'\n\nimport { SupabasePersistenceOptions, SupabaseProvider } from '@supabase-labs/y-supabase'\nimport type { editor as MonacoEditor } from 'monaco-editor'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { MonacoBinding } from 'y-monaco'\nimport { Awareness } from 'y-protocols/awareness'\nimport * as Y from 'yjs'\n\nimport { createClient } from '@/registry/default/clients/nextjs/lib/supabase/client'\n\ntype UseConnectOnMountOptions = {\n channel: string\n persistence?: boolean | SupabasePersistenceOptions\n awareness?: boolean | Awareness\n}\n\nconst generateRandomColor = () => `hsl(${Math.floor(Math.random() * 360)}, 80%, 60%)`\n\nexport function useConnectOnMount({\n channel,\n persistence,\n awareness = true,\n}: UseConnectOnMountOptions) {\n const docRef = useRef(null)\n const providerRef = useRef(null)\n const bindingRef = useRef(null)\n const userRef = useRef<{ color: string } | null>(null)\n const styleRef = useRef(null)\n const awarenessHandlerRef = useRef<(() => void) | null>(null)\n\n const connectOnMount = useCallback(\n (editor: MonacoEditor.IStandaloneCodeEditor) => {\n if (bindingRef.current) return\n\n const model = editor.getModel()\n if (!model) return\n\n const doc = new Y.Doc()\n const yText = doc.getText('monaco')\n const supabase = createClient()\n const provider = new SupabaseProvider(channel, doc, supabase as any, {\n awareness,\n persistence,\n })\n const providerAwareness = provider.getAwareness()\n\n if (providerAwareness) {\n if (!userRef.current) {\n userRef.current = {\n color: generateRandomColor(),\n }\n }\n providerAwareness.setLocalStateField('user', userRef.current)\n\n const applyAwarenessStyles = () => {\n if (!styleRef.current) {\n styleRef.current = document.createElement('style')\n styleRef.current.setAttribute('data-monaco-y-cursors', 'true')\n document.head.appendChild(styleRef.current)\n }\n\n let css = `\n .yRemoteSelection {\n background-color: var(--y-remote-selection-color, rgba(0, 0, 0, 0.2));\n opacity: 0.2;\n }\n .yRemoteSelectionHead {\n border-left: 2px solid var(--y-remote-selection-color, rgba(0, 0, 0, 0.7));\n margin-left: -1px;\n box-sizing: border-box;\n }\n `\n\n providerAwareness.getStates().forEach((state, clientId) => {\n const color = state?.user?.color\n const isValidHsl = /^hsl\\(\\d{1,3},\\s*\\d{1,3}%,\\s*\\d{1,3}%\\)$/.test(color)\n\n if (!isValidHsl) return\n if (!color) return\n\n css += `\n .yRemoteSelection-${clientId}, .yRemoteSelectionHead-${clientId} {\n --y-remote-selection-color: ${color};\n }\n `\n })\n\n styleRef.current.textContent = css\n }\n\n awarenessHandlerRef.current = applyAwarenessStyles\n applyAwarenessStyles()\n providerAwareness.on('update', applyAwarenessStyles)\n }\n\n docRef.current = doc\n providerRef.current = provider\n bindingRef.current = new MonacoBinding(yText, model, new Set([editor]), providerAwareness)\n },\n [channel]\n )\n\n useEffect(() => {\n return () => {\n if (awarenessHandlerRef.current && providerRef.current) {\n const awareness = providerRef.current.getAwareness()\n awareness?.off('update', awarenessHandlerRef.current)\n }\n styleRef.current?.remove()\n bindingRef.current?.destroy()\n bindingRef.current = null\n providerRef.current?.destroy()\n providerRef.current = null\n docRef.current?.destroy()\n docRef.current = null\n }\n }, [])\n\n return { connectOnMount }\n}\n", + "type": "registry:hook" + }, + { + "path": "registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx", + "content": "'use client'\n\nimport { Editor } from '@monaco-editor/react'\nimport { SupabasePersistenceOptions } from '@supabase-labs/y-supabase'\nimport { Awareness } from 'y-protocols/awareness.js'\n\nimport { useConnectOnMount } from '../hooks/use-connect-on-mount'\n\ntype RealtimeMonacoProps = {\n channel: string\n language?: string\n height?: string | number\n className?: string\n awareness?: boolean | Awareness\n persistence?: boolean | SupabasePersistenceOptions\n theme?: 'light' | 'dark'\n}\n\nconst DEFAULT_HEIGHT = 550\n\nconst RealtimeMonaco = ({\n channel,\n language = 'javascript',\n height = DEFAULT_HEIGHT,\n awareness = true,\n persistence,\n theme,\n ...rest\n}: RealtimeMonacoProps) => {\n const { connectOnMount } = useConnectOnMount({ channel, persistence, awareness })\n\n return (\n \n )\n}\n\nexport { RealtimeMonaco }\n", + "type": "registry:component" + }, + { + "path": "registry/default/clients/react-router/lib/supabase/client.ts", + "content": "/// \nimport { createBrowserClient } from '@supabase/ssr'\n\nexport function createClient() {\n return createBrowserClient(\n import.meta.env.VITE_SUPABASE_URL!,\n import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY!\n )\n}\n", + "type": "registry:lib" + }, + { + "path": "registry/default/clients/react-router/lib/supabase/server.ts", + "content": "import { createServerClient, parseCookieHeader, serializeCookieHeader } from '@supabase/ssr'\n\nexport function createClient(request: Request) {\n const headers = new Headers()\n\n const supabase = createServerClient(\n process.env.VITE_SUPABASE_URL!,\n process.env.VITE_SUPABASE_PUBLISHABLE_KEY!,\n {\n cookies: {\n getAll() {\n return parseCookieHeader(request.headers.get('Cookie') ?? '') as {\n name: string\n value: string\n }[]\n },\n setAll(cookiesToSet) {\n cookiesToSet.forEach(({ name, value, options }) =>\n headers.append('Set-Cookie', serializeCookieHeader(name, value, options))\n )\n },\n },\n }\n )\n\n return { supabase, headers }\n}\n", + "type": "registry:lib" + } + ], + "envVars": { + "VITE_SUPABASE_URL": "", + "VITE_SUPABASE_PUBLISHABLE_KEY": "" + }, + "docs": "You'll need to set the following environment variables in your project: `VITE_SUPABASE_URL` and `VITE_SUPABASE_PUBLISHABLE_KEY`." +} \ No newline at end of file diff --git a/apps/ui-library/public/r/realtime-monaco-react.json b/apps/ui-library/public/r/realtime-monaco-react.json new file mode 100644 index 00000000000..a2645c9fb21 --- /dev/null +++ b/apps/ui-library/public/r/realtime-monaco-react.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "realtime-monaco-react", + "type": "registry:component", + "title": "Realtime Monaco", + "description": "Real-time Monaco editor for collaborative applications.", + "dependencies": [ + "@monaco-editor/react@latest", + "y-monaco@latest", + "yjs@latest", + "@supabase/supabase-js@latest" + ], + "registryDependencies": [], + "files": [ + { + "path": "registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts", + "content": "'use client'\n\nimport { SupabasePersistenceOptions, SupabaseProvider } from '@supabase-labs/y-supabase'\nimport type { editor as MonacoEditor } from 'monaco-editor'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { MonacoBinding } from 'y-monaco'\nimport { Awareness } from 'y-protocols/awareness'\nimport * as Y from 'yjs'\n\nimport { createClient } from '@/registry/default/clients/nextjs/lib/supabase/client'\n\ntype UseConnectOnMountOptions = {\n channel: string\n persistence?: boolean | SupabasePersistenceOptions\n awareness?: boolean | Awareness\n}\n\nconst generateRandomColor = () => `hsl(${Math.floor(Math.random() * 360)}, 80%, 60%)`\n\nexport function useConnectOnMount({\n channel,\n persistence,\n awareness = true,\n}: UseConnectOnMountOptions) {\n const docRef = useRef(null)\n const providerRef = useRef(null)\n const bindingRef = useRef(null)\n const userRef = useRef<{ color: string } | null>(null)\n const styleRef = useRef(null)\n const awarenessHandlerRef = useRef<(() => void) | null>(null)\n\n const connectOnMount = useCallback(\n (editor: MonacoEditor.IStandaloneCodeEditor) => {\n if (bindingRef.current) return\n\n const model = editor.getModel()\n if (!model) return\n\n const doc = new Y.Doc()\n const yText = doc.getText('monaco')\n const supabase = createClient()\n const provider = new SupabaseProvider(channel, doc, supabase as any, {\n awareness,\n persistence,\n })\n const providerAwareness = provider.getAwareness()\n\n if (providerAwareness) {\n if (!userRef.current) {\n userRef.current = {\n color: generateRandomColor(),\n }\n }\n providerAwareness.setLocalStateField('user', userRef.current)\n\n const applyAwarenessStyles = () => {\n if (!styleRef.current) {\n styleRef.current = document.createElement('style')\n styleRef.current.setAttribute('data-monaco-y-cursors', 'true')\n document.head.appendChild(styleRef.current)\n }\n\n let css = `\n .yRemoteSelection {\n background-color: var(--y-remote-selection-color, rgba(0, 0, 0, 0.2));\n opacity: 0.2;\n }\n .yRemoteSelectionHead {\n border-left: 2px solid var(--y-remote-selection-color, rgba(0, 0, 0, 0.7));\n margin-left: -1px;\n box-sizing: border-box;\n }\n `\n\n providerAwareness.getStates().forEach((state, clientId) => {\n const color = state?.user?.color\n const isValidHsl = /^hsl\\(\\d{1,3},\\s*\\d{1,3}%,\\s*\\d{1,3}%\\)$/.test(color)\n\n if (!isValidHsl) return\n if (!color) return\n\n css += `\n .yRemoteSelection-${clientId}, .yRemoteSelectionHead-${clientId} {\n --y-remote-selection-color: ${color};\n }\n `\n })\n\n styleRef.current.textContent = css\n }\n\n awarenessHandlerRef.current = applyAwarenessStyles\n applyAwarenessStyles()\n providerAwareness.on('update', applyAwarenessStyles)\n }\n\n docRef.current = doc\n providerRef.current = provider\n bindingRef.current = new MonacoBinding(yText, model, new Set([editor]), providerAwareness)\n },\n [channel]\n )\n\n useEffect(() => {\n return () => {\n if (awarenessHandlerRef.current && providerRef.current) {\n const awareness = providerRef.current.getAwareness()\n awareness?.off('update', awarenessHandlerRef.current)\n }\n styleRef.current?.remove()\n bindingRef.current?.destroy()\n bindingRef.current = null\n providerRef.current?.destroy()\n providerRef.current = null\n docRef.current?.destroy()\n docRef.current = null\n }\n }, [])\n\n return { connectOnMount }\n}\n", + "type": "registry:hook" + }, + { + "path": "registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx", + "content": "'use client'\n\nimport { Editor } from '@monaco-editor/react'\nimport { SupabasePersistenceOptions } from '@supabase-labs/y-supabase'\nimport { Awareness } from 'y-protocols/awareness.js'\n\nimport { useConnectOnMount } from '../hooks/use-connect-on-mount'\n\ntype RealtimeMonacoProps = {\n channel: string\n language?: string\n height?: string | number\n className?: string\n awareness?: boolean | Awareness\n persistence?: boolean | SupabasePersistenceOptions\n theme?: 'light' | 'dark'\n}\n\nconst DEFAULT_HEIGHT = 550\n\nconst RealtimeMonaco = ({\n channel,\n language = 'javascript',\n height = DEFAULT_HEIGHT,\n awareness = true,\n persistence,\n theme,\n ...rest\n}: RealtimeMonacoProps) => {\n const { connectOnMount } = useConnectOnMount({ channel, persistence, awareness })\n\n return (\n \n )\n}\n\nexport { RealtimeMonaco }\n", + "type": "registry:component" + }, + { + "path": "registry/default/clients/react/lib/supabase/client.ts", + "content": "import { createClient as createSupabaseClient } from '@supabase/supabase-js'\n\nexport function createClient() {\n return createSupabaseClient(\n import.meta.env.VITE_SUPABASE_URL!,\n import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY!\n )\n}\n", + "type": "registry:lib" + } + ], + "envVars": { + "VITE_SUPABASE_URL": "", + "VITE_SUPABASE_PUBLISHABLE_KEY": "" + }, + "docs": "You'll need to set the following environment variables in your project: `VITE_SUPABASE_URL` and `VITE_SUPABASE_PUBLISHABLE_KEY`." +} \ No newline at end of file diff --git a/apps/ui-library/public/r/realtime-monaco-tanstack.json b/apps/ui-library/public/r/realtime-monaco-tanstack.json new file mode 100644 index 00000000000..e03695557ef --- /dev/null +++ b/apps/ui-library/public/r/realtime-monaco-tanstack.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "realtime-monaco-tanstack", + "type": "registry:component", + "title": "Realtime Monaco", + "description": "Real-time Monaco editor for collaborative applications.", + "dependencies": [ + "@monaco-editor/react@latest", + "y-monaco@latest", + "yjs@latest", + "@supabase/ssr@latest", + "@supabase/supabase-js@latest" + ], + "registryDependencies": [], + "files": [ + { + "path": "registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts", + "content": "'use client'\n\nimport { SupabasePersistenceOptions, SupabaseProvider } from '@supabase-labs/y-supabase'\nimport type { editor as MonacoEditor } from 'monaco-editor'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { MonacoBinding } from 'y-monaco'\nimport { Awareness } from 'y-protocols/awareness'\nimport * as Y from 'yjs'\n\nimport { createClient } from '@/registry/default/clients/nextjs/lib/supabase/client'\n\ntype UseConnectOnMountOptions = {\n channel: string\n persistence?: boolean | SupabasePersistenceOptions\n awareness?: boolean | Awareness\n}\n\nconst generateRandomColor = () => `hsl(${Math.floor(Math.random() * 360)}, 80%, 60%)`\n\nexport function useConnectOnMount({\n channel,\n persistence,\n awareness = true,\n}: UseConnectOnMountOptions) {\n const docRef = useRef(null)\n const providerRef = useRef(null)\n const bindingRef = useRef(null)\n const userRef = useRef<{ color: string } | null>(null)\n const styleRef = useRef(null)\n const awarenessHandlerRef = useRef<(() => void) | null>(null)\n\n const connectOnMount = useCallback(\n (editor: MonacoEditor.IStandaloneCodeEditor) => {\n if (bindingRef.current) return\n\n const model = editor.getModel()\n if (!model) return\n\n const doc = new Y.Doc()\n const yText = doc.getText('monaco')\n const supabase = createClient()\n const provider = new SupabaseProvider(channel, doc, supabase as any, {\n awareness,\n persistence,\n })\n const providerAwareness = provider.getAwareness()\n\n if (providerAwareness) {\n if (!userRef.current) {\n userRef.current = {\n color: generateRandomColor(),\n }\n }\n providerAwareness.setLocalStateField('user', userRef.current)\n\n const applyAwarenessStyles = () => {\n if (!styleRef.current) {\n styleRef.current = document.createElement('style')\n styleRef.current.setAttribute('data-monaco-y-cursors', 'true')\n document.head.appendChild(styleRef.current)\n }\n\n let css = `\n .yRemoteSelection {\n background-color: var(--y-remote-selection-color, rgba(0, 0, 0, 0.2));\n opacity: 0.2;\n }\n .yRemoteSelectionHead {\n border-left: 2px solid var(--y-remote-selection-color, rgba(0, 0, 0, 0.7));\n margin-left: -1px;\n box-sizing: border-box;\n }\n `\n\n providerAwareness.getStates().forEach((state, clientId) => {\n const color = state?.user?.color\n const isValidHsl = /^hsl\\(\\d{1,3},\\s*\\d{1,3}%,\\s*\\d{1,3}%\\)$/.test(color)\n\n if (!isValidHsl) return\n if (!color) return\n\n css += `\n .yRemoteSelection-${clientId}, .yRemoteSelectionHead-${clientId} {\n --y-remote-selection-color: ${color};\n }\n `\n })\n\n styleRef.current.textContent = css\n }\n\n awarenessHandlerRef.current = applyAwarenessStyles\n applyAwarenessStyles()\n providerAwareness.on('update', applyAwarenessStyles)\n }\n\n docRef.current = doc\n providerRef.current = provider\n bindingRef.current = new MonacoBinding(yText, model, new Set([editor]), providerAwareness)\n },\n [channel]\n )\n\n useEffect(() => {\n return () => {\n if (awarenessHandlerRef.current && providerRef.current) {\n const awareness = providerRef.current.getAwareness()\n awareness?.off('update', awarenessHandlerRef.current)\n }\n styleRef.current?.remove()\n bindingRef.current?.destroy()\n bindingRef.current = null\n providerRef.current?.destroy()\n providerRef.current = null\n docRef.current?.destroy()\n docRef.current = null\n }\n }, [])\n\n return { connectOnMount }\n}\n", + "type": "registry:hook" + }, + { + "path": "registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx", + "content": "'use client'\n\nimport { Editor } from '@monaco-editor/react'\nimport { SupabasePersistenceOptions } from '@supabase-labs/y-supabase'\nimport { Awareness } from 'y-protocols/awareness.js'\n\nimport { useConnectOnMount } from '../hooks/use-connect-on-mount'\n\ntype RealtimeMonacoProps = {\n channel: string\n language?: string\n height?: string | number\n className?: string\n awareness?: boolean | Awareness\n persistence?: boolean | SupabasePersistenceOptions\n theme?: 'light' | 'dark'\n}\n\nconst DEFAULT_HEIGHT = 550\n\nconst RealtimeMonaco = ({\n channel,\n language = 'javascript',\n height = DEFAULT_HEIGHT,\n awareness = true,\n persistence,\n theme,\n ...rest\n}: RealtimeMonacoProps) => {\n const { connectOnMount } = useConnectOnMount({ channel, persistence, awareness })\n\n return (\n \n )\n}\n\nexport { RealtimeMonaco }\n", + "type": "registry:component" + }, + { + "path": "registry/default/clients/tanstack/lib/supabase/client.ts", + "content": "/// \nimport { createBrowserClient } from '@supabase/ssr'\n\nexport function createClient() {\n return createBrowserClient(\n import.meta.env.VITE_SUPABASE_URL!,\n import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY!\n )\n}\n", + "type": "registry:lib" + }, + { + "path": "registry/default/clients/tanstack/lib/supabase/server.ts", + "content": "import { createServerClient } from '@supabase/ssr'\nimport { getCookies, setCookie } from '@tanstack/react-start/server'\n\nexport function createClient() {\n return createServerClient(\n process.env.VITE_SUPABASE_URL!,\n process.env.VITE_SUPABASE_PUBLISHABLE_KEY!,\n {\n cookies: {\n getAll() {\n return Object.entries(getCookies()).map(\n ([name, value]) =>\n ({\n name,\n value,\n }) as { name: string; value: string }\n )\n },\n setAll(cookies) {\n cookies.forEach((cookie) => {\n setCookie(cookie.name, cookie.value)\n })\n },\n },\n }\n )\n}\n", + "type": "registry:lib" + } + ], + "envVars": { + "VITE_SUPABASE_URL": "", + "VITE_SUPABASE_PUBLISHABLE_KEY": "" + }, + "docs": "You'll need to set the following environment variables in your project: `VITE_SUPABASE_URL` and `VITE_SUPABASE_PUBLISHABLE_KEY`." +} \ No newline at end of file diff --git a/apps/ui-library/public/r/registry.json b/apps/ui-library/public/r/registry.json index bb2b4b399e3..f9168973a6d 100644 --- a/apps/ui-library/public/r/registry.json +++ b/apps/ui-library/public/r/registry.json @@ -1399,6 +1399,157 @@ "VITE_SUPABASE_PUBLISHABLE_KEY": "" } }, + { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "realtime-monaco-nextjs", + "type": "registry:component", + "title": "Realtime Monaco", + "description": "Real-time Monaco editor for collaborative applications.", + "registryDependencies": [], + "dependencies": [ + "@monaco-editor/react@latest", + "y-monaco@latest", + "yjs@latest", + "@supabase/ssr@latest", + "@supabase/supabase-js@latest" + ], + "files": [ + { + "path": "registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts", + "type": "registry:hook" + }, + { + "path": "registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx", + "type": "registry:component" + }, + { + "path": "registry/default/clients/nextjs/lib/supabase/client.ts", + "type": "registry:lib" + }, + { + "path": "registry/default/clients/nextjs/lib/supabase/middleware.ts", + "type": "registry:lib" + }, + { + "path": "registry/default/clients/nextjs/lib/supabase/server.ts", + "type": "registry:lib" + } + ], + "docs": "You'll need to set the following environment variables in your project: `NEXT_PUBLIC_SUPABASE_URL` and `NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY`.", + "envVars": { + "NEXT_PUBLIC_SUPABASE_URL": "", + "NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY": "" + } + }, + { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "realtime-monaco-react", + "type": "registry:component", + "title": "Realtime Monaco", + "description": "Real-time Monaco editor for collaborative applications.", + "registryDependencies": [], + "dependencies": [ + "@monaco-editor/react@latest", + "y-monaco@latest", + "yjs@latest", + "@supabase/supabase-js@latest" + ], + "files": [ + { + "path": "registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts", + "type": "registry:hook" + }, + { + "path": "registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx", + "type": "registry:component" + }, + { + "path": "registry/default/clients/react/lib/supabase/client.ts", + "type": "registry:lib" + } + ], + "docs": "You'll need to set the following environment variables in your project: `VITE_SUPABASE_URL` and `VITE_SUPABASE_PUBLISHABLE_KEY`.", + "envVars": { + "VITE_SUPABASE_URL": "", + "VITE_SUPABASE_PUBLISHABLE_KEY": "" + } + }, + { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "realtime-monaco-react-router", + "type": "registry:component", + "title": "Realtime Monaco", + "description": "Real-time Monaco editor for collaborative applications.", + "registryDependencies": [], + "dependencies": [ + "@monaco-editor/react@latest", + "y-monaco@latest", + "yjs@latest", + "@supabase/ssr@latest", + "@supabase/supabase-js@latest" + ], + "files": [ + { + "path": "registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts", + "type": "registry:hook" + }, + { + "path": "registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx", + "type": "registry:component" + }, + { + "path": "registry/default/clients/react-router/lib/supabase/client.ts", + "type": "registry:lib" + }, + { + "path": "registry/default/clients/react-router/lib/supabase/server.ts", + "type": "registry:lib" + } + ], + "docs": "You'll need to set the following environment variables in your project: `VITE_SUPABASE_URL` and `VITE_SUPABASE_PUBLISHABLE_KEY`.", + "envVars": { + "VITE_SUPABASE_URL": "", + "VITE_SUPABASE_PUBLISHABLE_KEY": "" + } + }, + { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "realtime-monaco-tanstack", + "type": "registry:component", + "title": "Realtime Monaco", + "description": "Real-time Monaco editor for collaborative applications.", + "registryDependencies": [], + "dependencies": [ + "@monaco-editor/react@latest", + "y-monaco@latest", + "yjs@latest", + "@supabase/ssr@latest", + "@supabase/supabase-js@latest" + ], + "files": [ + { + "path": "registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts", + "type": "registry:hook" + }, + { + "path": "registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx", + "type": "registry:component" + }, + { + "path": "registry/default/clients/tanstack/lib/supabase/client.ts", + "type": "registry:lib" + }, + { + "path": "registry/default/clients/tanstack/lib/supabase/server.ts", + "type": "registry:lib" + } + ], + "docs": "You'll need to set the following environment variables in your project: `VITE_SUPABASE_URL` and `VITE_SUPABASE_PUBLISHABLE_KEY`.", + "envVars": { + "VITE_SUPABASE_URL": "", + "VITE_SUPABASE_PUBLISHABLE_KEY": "" + } + }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "infinite-query-hook", diff --git a/apps/ui-library/registry/blocks.ts b/apps/ui-library/registry/blocks.ts index d54c7bcd59e..513875a7f5c 100644 --- a/apps/ui-library/registry/blocks.ts +++ b/apps/ui-library/registry/blocks.ts @@ -11,6 +11,7 @@ import passwordBasedAuthTanstack from './default/blocks/password-based-auth-tans import realtimeAvatarStack from './default/blocks/realtime-avatar-stack/registry-item.json' with { type: 'json' } import realtimeChat from './default/blocks/realtime-chat/registry-item.json' with { type: 'json' } import realtimeCursor from './default/blocks/realtime-cursor/registry-item.json' with { type: 'json' } +import realtimeMonaco from './default/blocks/realtime-monaco/registry-item.json' with { type: 'json' } import socialAuthNextjs from './default/blocks/social-auth-nextjs/registry-item.json' with { type: 'json' } import socialAuthReactRouter from './default/blocks/social-auth-react-router/registry-item.json' with { type: 'json' } import socialAuthReact from './default/blocks/social-auth-react/registry-item.json' with { type: 'json' } @@ -51,6 +52,7 @@ export const blocks = [ ...combine(currentUserAvatar as RegistryItem), ...combine(realtimeAvatarStack as RegistryItem), ...combine(realtimeChat as RegistryItem), + ...combine(realtimeMonaco as RegistryItem), // infinite query hook is intentionally not combined with the clients since it depends on clients having database types. infiniteQueryHook as RegistryItem, diff --git a/apps/ui-library/registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx b/apps/ui-library/registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx new file mode 100644 index 00000000000..e90b00d4306 --- /dev/null +++ b/apps/ui-library/registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx @@ -0,0 +1,43 @@ +'use client' + +import { Editor } from '@monaco-editor/react' +import { SupabasePersistenceOptions } from '@supabase-labs/y-supabase' +import { Awareness } from 'y-protocols/awareness.js' + +import { useConnectOnMount } from '../hooks/use-connect-on-mount' + +type RealtimeMonacoProps = { + channel: string + language?: string + height?: string | number + className?: string + awareness?: boolean | Awareness + persistence?: boolean | SupabasePersistenceOptions + theme?: 'light' | 'dark' +} + +const DEFAULT_HEIGHT = 550 + +const RealtimeMonaco = ({ + channel, + language = 'javascript', + height = DEFAULT_HEIGHT, + awareness = true, + persistence, + theme, + ...rest +}: RealtimeMonacoProps) => { + const { connectOnMount } = useConnectOnMount({ channel, persistence, awareness }) + + return ( + + ) +} + +export { RealtimeMonaco } diff --git a/apps/ui-library/registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts b/apps/ui-library/registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts new file mode 100644 index 00000000000..4ebd629a301 --- /dev/null +++ b/apps/ui-library/registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts @@ -0,0 +1,121 @@ +'use client' + +import { SupabasePersistenceOptions, SupabaseProvider } from '@supabase-labs/y-supabase' +import type { editor as MonacoEditor } from 'monaco-editor' +import { useCallback, useEffect, useRef } from 'react' +import { MonacoBinding } from 'y-monaco' +import { Awareness } from 'y-protocols/awareness' +import * as Y from 'yjs' + +import { createClient } from '@/registry/default/clients/nextjs/lib/supabase/client' + +type UseConnectOnMountOptions = { + channel: string + persistence?: boolean | SupabasePersistenceOptions + awareness?: boolean | Awareness +} + +const generateRandomColor = () => `hsl(${Math.floor(Math.random() * 360)}, 80%, 60%)` + +export function useConnectOnMount({ + channel, + persistence, + awareness = true, +}: UseConnectOnMountOptions) { + const docRef = useRef(null) + const providerRef = useRef(null) + const bindingRef = useRef(null) + const userRef = useRef<{ color: string } | null>(null) + const styleRef = useRef(null) + const awarenessHandlerRef = useRef<(() => void) | null>(null) + + const connectOnMount = useCallback( + (editor: MonacoEditor.IStandaloneCodeEditor) => { + if (bindingRef.current) return + + const model = editor.getModel() + if (!model) return + + const doc = new Y.Doc() + const yText = doc.getText('monaco') + const supabase = createClient() + const provider = new SupabaseProvider(channel, doc, supabase as any, { + awareness, + persistence, + }) + const providerAwareness = provider.getAwareness() + + if (providerAwareness) { + if (!userRef.current) { + userRef.current = { + color: generateRandomColor(), + } + } + providerAwareness.setLocalStateField('user', userRef.current) + + const applyAwarenessStyles = () => { + if (!styleRef.current) { + styleRef.current = document.createElement('style') + styleRef.current.setAttribute('data-monaco-y-cursors', 'true') + document.head.appendChild(styleRef.current) + } + + let css = ` + .yRemoteSelection { + background-color: var(--y-remote-selection-color, rgba(0, 0, 0, 0.2)); + opacity: 0.2; + } + .yRemoteSelectionHead { + border-left: 2px solid var(--y-remote-selection-color, rgba(0, 0, 0, 0.7)); + margin-left: -1px; + box-sizing: border-box; + } + ` + + providerAwareness.getStates().forEach((state, clientId) => { + const color = state?.user?.color + const isValidHsl = /^hsl\(\d{1,3},\s*\d{1,3}%,\s*\d{1,3}%\)$/.test(color) + + if (!isValidHsl) return + if (!color) return + + css += ` + .yRemoteSelection-${clientId}, .yRemoteSelectionHead-${clientId} { + --y-remote-selection-color: ${color}; + } + ` + }) + + styleRef.current.textContent = css + } + + awarenessHandlerRef.current = applyAwarenessStyles + applyAwarenessStyles() + providerAwareness.on('update', applyAwarenessStyles) + } + + docRef.current = doc + providerRef.current = provider + bindingRef.current = new MonacoBinding(yText, model, new Set([editor]), providerAwareness) + }, + [channel] + ) + + useEffect(() => { + return () => { + if (awarenessHandlerRef.current && providerRef.current) { + const awareness = providerRef.current.getAwareness() + awareness?.off('update', awarenessHandlerRef.current) + } + styleRef.current?.remove() + bindingRef.current?.destroy() + bindingRef.current = null + providerRef.current?.destroy() + providerRef.current = null + docRef.current?.destroy() + docRef.current = null + } + }, []) + + return { connectOnMount } +} diff --git a/apps/ui-library/registry/default/blocks/realtime-monaco/registry-item.json b/apps/ui-library/registry/default/blocks/realtime-monaco/registry-item.json new file mode 100644 index 00000000000..f36e4769d7a --- /dev/null +++ b/apps/ui-library/registry/default/blocks/realtime-monaco/registry-item.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "realtime-monaco", + "type": "registry:component", + "title": "Realtime Monaco", + "description": "Real-time Monaco editor for collaborative applications.", + "registryDependencies": [], + "dependencies": ["@monaco-editor/react@latest", "y-monaco@latest", "yjs@latest"], + "files": [ + { + "path": "registry/default/blocks/realtime-monaco/hooks/use-connect-on-mount.ts", + "type": "registry:hook" + }, + { + "path": "registry/default/blocks/realtime-monaco/components/realtime-monaco.tsx", + "type": "registry:component" + } + ] +} diff --git a/apps/ui-library/registry/default/examples/realtime-monaco-demo.tsx b/apps/ui-library/registry/default/examples/realtime-monaco-demo.tsx new file mode 100644 index 00000000000..730e04ca5ac --- /dev/null +++ b/apps/ui-library/registry/default/examples/realtime-monaco-demo.tsx @@ -0,0 +1,29 @@ +'use client' + +import { useTheme } from 'next-themes' +import dynamic from 'next/dynamic' + +const Editor = dynamic( + () => + import('../blocks/realtime-monaco/components/realtime-monaco').then( + (mod) => mod.RealtimeMonaco + ), + { ssr: false } +) + +const RealtimeMonacoDemo = () => { + const { resolvedTheme } = useTheme() + const isDark = resolvedTheme?.includes('dark') + + return ( +
    + +
    + ) +} + +export default RealtimeMonacoDemo diff --git a/apps/ui-library/registry/examples.ts b/apps/ui-library/registry/examples.ts index c7a160cd627..83e3fcd837f 100644 --- a/apps/ui-library/registry/examples.ts +++ b/apps/ui-library/registry/examples.ts @@ -23,6 +23,17 @@ export const examples: RegistryItem[] = [ }, ], }, + { + name: 'realtime-monaco-demo', + type: 'registry:example', + registryDependencies: [], + files: [ + { + path: 'registry/default/examples/realtime-monaco-demo.tsx', + type: 'registry:example', + }, + ], + }, { name: 'password-based-auth-demo', type: 'registry:example', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0e979d9d09..cc0906e1ccd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1290,7 +1290,7 @@ importers: version: 3.3.1(react-hook-form@7.47.0(react@18.3.1)) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.7.0(monaco-editor@0.52.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.7.0(monaco-editor@0.55.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-accordion': specifier: '*' version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1375,6 +1375,9 @@ importers: '@react-router/fs-routes': specifier: ^7.4.0 version: 7.4.0(@react-router/dev@7.9.6(@types/node@22.13.14)(@vitejs/plugin-rsc@0.5.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)))(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.2) + '@supabase-labs/y-supabase': + specifier: 0.1.0 + version: 0.1.0 '@supabase/postgrest-js': specifier: 'catalog:' version: 2.99.1 @@ -1423,6 +1426,9 @@ importers: lucide-react: specifier: '*' version: 0.436.0(react@18.3.1) + monaco-editor: + specifier: ^0.55.1 + version: 0.55.1 next: specifier: 'catalog:' version: 15.5.10(@babel/core@7.29.0(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4) @@ -1489,10 +1495,22 @@ importers: vaul: specifier: ^0.9.6 version: 0.9.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + y-monaco: + specifier: ^0.1.6 + version: 0.1.6(monaco-editor@0.55.1)(yjs@13.6.29) + y-protocols: + specifier: ^1.0.7 + version: 1.0.7(yjs@13.6.29) + yjs: + specifier: ^13.6.29 + version: 13.6.29 zod: specifier: 'catalog:' version: 3.25.76 devDependencies: + '@babel/core': + specifier: '*' + version: 7.29.0(supports-color@8.1.1) '@react-router/dev': specifier: ^7.9.0 version: 7.9.6(@types/node@22.13.14)(@vitejs/plugin-rsc@0.5.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1)))(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(sass@1.77.4)(supports-color@8.1.1)(terser@5.39.0)(tsx@4.20.3)(typescript@5.9.2)(vite@7.1.11(@types/node@22.13.14)(jiti@2.5.1)(sass@1.77.4)(terser@5.39.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1) @@ -8305,6 +8323,9 @@ packages: resolution: {integrity: sha512-Cq3KKe+G1o7PSBMbmrgpT2JgBeyH2THHr3RdIX2MqF7AnBuspIMgtZ3ktcCgP7kZsTMvnmWymr7zZCT1zeWbMw==} engines: {node: '>=12.16'} + '@supabase-labs/y-supabase@0.1.0': + resolution: {integrity: sha512-1ItaKbcImgy7ueYfJcyVYihqCKi9RAee9MKBV8wcCqSMNsrWvw4ibhW8ai91kWsewsiWzIDXVPONgcUcxagk9g==} + '@supabase/auth-js@2.99.1': resolution: {integrity: sha512-x7lKKTvKjABJt/FYcRSPiTT01Xhm2FF8RhfL8+RHMkmlwmRQ88/lREupIHKwFPW0W6pTCJqkZb7Yhpw/EZ+fNw==} engines: {node: '>=20.0.0'} @@ -13220,6 +13241,9 @@ packages: peerDependencies: ws: '*' + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -13509,6 +13533,11 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lib0@0.2.117: + resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==} + engines: {node: '>=16'} + hasBin: true + libpg-query@13.3.1: resolution: {integrity: sha512-RLvnKPLWngNR7bNep/Q9euPcfFJVFfDg/iP13lYGxcSI01emS/1vbTw6EBd8UordweWFdvUuK+31sHp104dukA==} @@ -13805,6 +13834,11 @@ packages: markdown-wasm@1.2.0: resolution: {integrity: sha512-S12OTkyXCkOgI1n1rZY9cg4bK/PGu80Emjpvwp8BEjwCxhPV3yddF0U6+QhCitdBsI1tzWcoeahmW7k0Pq81OA==} + marked@14.0.0: + resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==} + engines: {node: '>= 18'} + hasBin: true + marked@16.3.0: resolution: {integrity: sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==} engines: {node: '>= 20'} @@ -14428,6 +14462,9 @@ packages: monaco-editor@0.52.2: resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + monaco-editor@0.55.1: + resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==} + moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} @@ -18597,6 +18634,19 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y-monaco@0.1.6: + resolution: {integrity: sha512-sYRywMmcylt+Nupl+11AvizD2am06ST8lkVbUXuaEmrtV6Tf+TD4rsEm6u9YGGowYue+Vfg1IJ97SUP2J+PVXg==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + peerDependencies: + monaco-editor: '>=0.20.0' + yjs: ^13.3.1 + + y-protocols@1.0.7: + resolution: {integrity: sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -18642,6 +18692,10 @@ packages: yesql@7.0.0: resolution: {integrity: sha512-sosfr7agy4ibLM7BvXBkM6BpBmKMGuBO8DUYQEuey+QqaqrgW+2bsSg6D050ocBYIz0PuHxUyehyzEztZTU4pw==} + yjs@13.6.29: + resolution: {integrity: sha512-kHqDPdltoXH+X4w1lVmMtddE3Oeqq48nM40FD5ojTd8xYhQpzIDcfE2keMSU5bAgRPJBe225WTUdyUgj1DtbiQ==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -21543,10 +21597,10 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@monaco-editor/react@4.7.0(monaco-editor@0.55.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@monaco-editor/loader': 1.5.0 - monaco-editor: 0.52.2 + monaco-editor: 0.55.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -25624,6 +25678,15 @@ snapshots: '@stripe/stripe-js@7.5.0': {} + '@supabase-labs/y-supabase@0.1.0': + dependencies: + '@supabase/supabase-js': 2.99.1 + y-protocols: 1.0.7(yjs@13.6.29) + yjs: 13.6.29 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@supabase/auth-js@2.99.1': dependencies: tslib: 2.8.1 @@ -31282,6 +31345,8 @@ snapshots: dependencies: ws: 8.18.3 + isomorphic.js@0.2.5: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -31567,6 +31632,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lib0@0.2.117: + dependencies: + isomorphic.js: 0.2.5 + libpg-query@13.3.1(encoding@0.1.13)(supports-color@8.1.1): dependencies: '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13)(supports-color@8.1.1) @@ -31948,6 +32017,8 @@ snapshots: markdown-wasm@1.2.0: {} + marked@14.0.0: {} + marked@16.3.0: {} marked@4.3.0: {} @@ -33114,6 +33185,11 @@ snapshots: monaco-editor@0.52.2: {} + monaco-editor@0.55.1: + dependencies: + dompurify: 3.2.7 + marked: 14.0.0 + moo@0.5.2: {} motion-dom@12.9.4: @@ -35361,7 +35437,7 @@ snapshots: classnames: 2.5.1 core-js: 3.35.0 decko: 1.2.0 - dompurify: 3.2.7 + dompurify: 3.3.1 eventemitter3: 5.0.1 json-pointer: 0.6.2 lunr: 2.3.9 @@ -38167,6 +38243,17 @@ snapshots: xtend@4.0.2: {} + y-monaco@0.1.6(monaco-editor@0.55.1)(yjs@13.6.29): + dependencies: + lib0: 0.2.117 + monaco-editor: 0.55.1 + yjs: 13.6.29 + + y-protocols@1.0.7(yjs@13.6.29): + dependencies: + lib0: 0.2.117 + yjs: 13.6.29 + y18n@5.0.8: {} yallist@3.1.1: {} @@ -38207,6 +38294,10 @@ snapshots: yesql@7.0.0: {} + yjs@13.6.29: + dependencies: + lib0: 0.2.117 + yn@3.1.1: optional: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 603292f9c78..d51300ab4c9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -44,6 +44,7 @@ minimumReleaseAge: 10080 minimumReleaseAgeExclude: - '@ai-sdk/*' - '@supabase/*' + - '@supabase-labs/*' - next - '@next/*' - ai From 3b010f146f3923553e1bea0780203dca826a8a64 Mon Sep 17 00:00:00 2001 From: Jordi Enric <37541088+jordienr@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:06:46 +0100 Subject: [PATCH 018/169] fix(studio): hide observability from sidebar for self-hosted (#43862) Ensure the observability link in the sidebar and command menu are properly guarded by IS_PLATFORM to prevent them from showing in self-hosted or CLI environments. The logic is functionally the same (IS_PLATFORM && reportsEnabled), but restructured with IS_PLATFORM as the outer check for clarity, and added comments explaining the platform-only restriction. https://claude.ai/code/session_01PG2TEGaSxaXZfXkbSBU3kQ ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES/NO ## What kind of change does this PR introduce? Bug fix, feature, docs update, ... ## What is the current behavior? Please link any relevant issues here. ## What is the new behavior? Feel free to include screenshots if it includes visual changes. ## Additional context Add any other context or screenshots. Co-authored-by: Claude --- .../App/CommandMenu/CreateCommands.tsx | 21 +++++++++-------- .../NavigationBar/NavigationBar.utils.tsx | 23 +++++++++++-------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.tsx b/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.tsx index 4885b327494..fb1c5140345 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.tsx @@ -363,17 +363,20 @@ export function useCreateCommands(options?: CommandOptions) { .filter(Boolean) as ICommand[] }, [ref, allIntegrations, installedIntegrationIds]) + // Observability commands are only available on the platform, not for self-hosted/CLI const observabilityCommands = useMemo( () => [ - ...(IS_PLATFORM && reportsEnabled - ? ([ - { - id: 'create-observability-report', - name: 'Create Custom Report', - route: `/project/${ref}/observability/api-overview?newReport=true`, - icon: () => , - }, - ].filter(Boolean) as ICommand[]) + ...(IS_PLATFORM + ? reportsEnabled + ? ([ + { + id: 'create-observability-report', + name: 'Create Custom Report', + route: `/project/${ref}/observability/api-overview?newReport=true`, + icon: () => , + }, + ].filter(Boolean) as ICommand[]) + : [] : []), ], [ref, reportsEnabled] diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.tsx index 0bab5712ebf..92d2d101457 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.tsx @@ -141,16 +141,19 @@ export const generateOtherRoutes = ( icon: , link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/advisors/security`), }, - ...(IS_PLATFORM && reportsEnabled - ? [ - { - key: 'observability', - label: 'Observability', - disabled: !isProjectActive, - icon: , - link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/observability`), - }, - ] + // Observability is only available on the platform, not for self-hosted/CLI + ...(IS_PLATFORM + ? reportsEnabled + ? [ + { + key: 'observability', + label: 'Observability', + disabled: !isProjectActive, + icon: , + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/observability`), + }, + ] + : [] : []), { key: 'logs', From 609b6db112e501bfeb33b39cc3d345a7a5759871 Mon Sep 17 00:00:00 2001 From: Ali Waseem Date: Tue, 17 Mar 2026 08:10:23 -0600 Subject: [PATCH 019/169] fix: remove oauth apps from self hosted (#43865) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? self hosted fix: remove oauth apps and add tests so this never happens again --- .../AuthLayout/AuthLayout.utils.test.ts | 143 ++++++++++++++++++ .../layouts/AuthLayout/AuthLayout.utils.ts | 103 ++++++++----- 2 files changed, 212 insertions(+), 34 deletions(-) create mode 100644 apps/studio/components/layouts/AuthLayout/AuthLayout.utils.test.ts diff --git a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.test.ts b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.test.ts new file mode 100644 index 00000000000..edf74a36099 --- /dev/null +++ b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.test.ts @@ -0,0 +1,143 @@ +import { describe, expect, it } from 'vitest' +import { generateAuthMenu, GenerateAuthMenuOptions } from './AuthLayout.utils' + +const allFeaturesEnabled: GenerateAuthMenuOptions = { + ref: 'test-ref', + isPlatform: true, + showOverview: true, + features: { + signInProviders: true, + rateLimits: true, + emails: true, + multiFactor: true, + attackProtection: true, + performance: true, + }, +} + +const allFeaturesDisabled: GenerateAuthMenuOptions = { + ref: 'test-ref', + isPlatform: true, + showOverview: false, + features: { + signInProviders: false, + rateLimits: false, + emails: false, + multiFactor: false, + attackProtection: false, + performance: false, + }, +} + +function flatItemNames(menu: ReturnType): string[] { + return menu.flatMap((group) => group.items.map((item) => item.name)) +} + +function findItem(menu: ReturnType, name: string) { + for (const group of menu) { + const item = group.items.find((i) => i.name === name) + if (item) return item + } + return undefined +} + +describe('generateAuthMenu', () => { + it('platform with all features enabled includes all menu items', () => { + const menu = generateAuthMenu(allFeaturesEnabled) + const names = flatItemNames(menu) + + expect(names).toContain('Overview') + expect(names).toContain('Users') + expect(names).toContain('OAuth Apps') + expect(names).toContain('Email') + expect(names).toContain('Sign In / Providers') + expect(names).toContain('OAuth Server') + expect(names).toContain('Sessions') + expect(names).toContain('Rate Limits') + expect(names).toContain('Multi-Factor') + expect(names).toContain('URL Configuration') + expect(names).toContain('Attack Protection') + expect(names).toContain('Auth Hooks') + expect(names).toContain('Audit Logs') + expect(names).toContain('Performance') + }) + + it('platform with all features disabled shows only core items', () => { + const menu = generateAuthMenu(allFeaturesDisabled) + const names = flatItemNames(menu) + + expect(names).toContain('Users') + expect(names).toContain('OAuth Apps') + expect(names).toContain('Policies') + expect(names).toContain('OAuth Server') + expect(names).toContain('Sessions') + expect(names).toContain('URL Configuration') + expect(names).toContain('Auth Hooks') + expect(names).toContain('Audit Logs') + + expect(names).not.toContain('Overview') + expect(names).not.toContain('Email') + expect(names).not.toContain('Sign In / Providers') + expect(names).not.toContain('Rate Limits') + expect(names).not.toContain('Multi-Factor') + expect(names).not.toContain('Attack Protection') + expect(names).not.toContain('Performance') + }) + + it('self-hosted hides OAuth Apps, Notifications, and platform-only Configuration items', () => { + const menu = generateAuthMenu({ + ...allFeaturesEnabled, + isPlatform: false, + }) + const names = flatItemNames(menu) + const groupTitles = menu.map((g) => g.title) + + expect(names).not.toContain('OAuth Apps') + expect(groupTitles).not.toContain('Notifications') + + // Configuration should only have Policies + const configGroup = menu.find((g) => g.title === 'Configuration')! + expect(configGroup.items).toHaveLength(1) + expect(configGroup.items[0].name).toBe('Policies') + }) + + it('shows Overview when showOverview is true', () => { + const menu = generateAuthMenu({ ...allFeaturesDisabled, showOverview: true }) + expect(flatItemNames(menu)).toContain('Overview') + }) + + it('hides Overview when showOverview is false', () => { + const menu = generateAuthMenu({ ...allFeaturesEnabled, showOverview: false }) + expect(flatItemNames(menu)).not.toContain('Overview') + }) + + it.each([ + ['signInProviders', 'Sign In / Providers'], + ['rateLimits', 'Rate Limits'], + ['emails', 'Email'], + ['multiFactor', 'Multi-Factor'], + ['attackProtection', 'Attack Protection'], + ['performance', 'Performance'], + ] as const)('feature flag %s toggles %s', (flag, itemName) => { + const withEnabled = generateAuthMenu({ + ...allFeaturesDisabled, + features: { ...allFeaturesDisabled.features, [flag]: true }, + }) + const withDisabled = generateAuthMenu({ + ...allFeaturesEnabled, + features: { ...allFeaturesEnabled.features, [flag]: false }, + }) + + expect(flatItemNames(withEnabled)).toContain(itemName) + expect(flatItemNames(withDisabled)).not.toContain(itemName) + }) + + it('generates correct URLs using the ref parameter', () => { + const menu = generateAuthMenu({ ...allFeaturesEnabled, ref: 'my-project' }) + const users = findItem(menu, 'Users') + const oauthApps = findItem(menu, 'OAuth Apps') + + expect(users?.url).toBe('/project/my-project/auth/users') + expect(oauthApps?.url).toBe('/project/my-project/auth/oauth-apps') + }) +}) diff --git a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts index 1fe0504cf67..972b74567c1 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts +++ b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts @@ -4,50 +4,50 @@ import { IS_PLATFORM } from 'lib/constants' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' -export const useGenerateAuthMenu = (): ProductMenuGroup[] => { - const { ref } = useParams() - const authenticationShowOverview = useFlag('authOverviewPage') - - const { - authenticationSignInProviders, - authenticationRateLimits, - authenticationEmails, - authenticationMultiFactor, - authenticationAttackProtection, - authenticationPerformance, - } = useIsFeatureEnabled([ - 'authentication:sign_in_providers', - 'authentication:rate_limits', - 'authentication:emails', - 'authentication:multi_factor', - 'authentication:attack_protection', - 'authentication:performance', - ]) +export interface GenerateAuthMenuOptions { + ref?: string + isPlatform: boolean + showOverview: boolean + features: { + signInProviders: boolean + rateLimits: boolean + emails: boolean + multiFactor: boolean + attackProtection: boolean + performance: boolean + } +} +export function generateAuthMenu(options: GenerateAuthMenuOptions): ProductMenuGroup[] { + const { ref, isPlatform, showOverview, features } = options const baseUrl = `/project/${ref}/auth` return [ { title: 'Manage', items: [ - ...(authenticationShowOverview + ...(showOverview ? [{ name: 'Overview', key: 'overview', url: `${baseUrl}/overview`, items: [] }] : []), { name: 'Users', key: 'users', url: `${baseUrl}/users`, items: [] }, - { - name: 'OAuth Apps', - key: 'oauth-apps', - url: `${baseUrl}/oauth-apps`, - items: [], - }, + ...(isPlatform + ? [ + { + name: 'OAuth Apps', + key: 'oauth-apps', + url: `${baseUrl}/oauth-apps`, + items: [], + }, + ] + : []), ], }, - ...(authenticationEmails && IS_PLATFORM + ...(features.emails && isPlatform ? [ { title: 'Notifications', items: [ - ...(authenticationEmails + ...(features.emails ? [ { name: 'Email', @@ -71,9 +71,9 @@ export const useGenerateAuthMenu = (): ProductMenuGroup[] => { url: `${baseUrl}/policies`, items: [], }, - ...(IS_PLATFORM + ...(isPlatform ? [ - ...(authenticationSignInProviders + ...(features.signInProviders ? [ { name: 'Sign In / Providers', @@ -96,7 +96,7 @@ export const useGenerateAuthMenu = (): ProductMenuGroup[] => { url: `${baseUrl}/sessions`, items: [], }, - ...(authenticationRateLimits + ...(features.rateLimits ? [ { name: 'Rate Limits', @@ -106,7 +106,7 @@ export const useGenerateAuthMenu = (): ProductMenuGroup[] => { }, ] : []), - ...(authenticationMultiFactor + ...(features.multiFactor ? [ { name: 'Multi-Factor', @@ -122,7 +122,7 @@ export const useGenerateAuthMenu = (): ProductMenuGroup[] => { url: `${baseUrl}/url-configuration`, items: [], }, - ...(authenticationAttackProtection + ...(features.attackProtection ? [ { name: 'Attack Protection', @@ -145,7 +145,7 @@ export const useGenerateAuthMenu = (): ProductMenuGroup[] => { url: `${baseUrl}/audit-logs`, items: [], }, - ...(authenticationPerformance + ...(features.performance ? [ { name: 'Performance', @@ -161,3 +161,38 @@ export const useGenerateAuthMenu = (): ProductMenuGroup[] => { }, ] } + +export const useGenerateAuthMenu = (): ProductMenuGroup[] => { + const { ref } = useParams() + const showOverview = useFlag('authOverviewPage') + + const { + authenticationSignInProviders, + authenticationRateLimits, + authenticationEmails, + authenticationMultiFactor, + authenticationAttackProtection, + authenticationPerformance, + } = useIsFeatureEnabled([ + 'authentication:sign_in_providers', + 'authentication:rate_limits', + 'authentication:emails', + 'authentication:multi_factor', + 'authentication:attack_protection', + 'authentication:performance', + ]) + + return generateAuthMenu({ + ref, + isPlatform: IS_PLATFORM, + showOverview, + features: { + signInProviders: authenticationSignInProviders, + rateLimits: authenticationRateLimits, + emails: authenticationEmails, + multiFactor: authenticationMultiFactor, + attackProtection: authenticationAttackProtection, + performance: authenticationPerformance, + }, + }) +} From 9819fb7b209aefd0e4396bc0bbcfeba70467dc22 Mon Sep 17 00:00:00 2001 From: TheOtherBrian1 <91111415+TheOtherBrian1@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:01:27 -0400 Subject: [PATCH 020/169] docs: updated bundle size limits (#43836) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Docs update ## What is the current behavior? [Edge function docs state:](https://supabase.com/docs/guides/functions/limits#:~:text=Maximum%20Function%20Size%3A%2020MB%20(After%20bundling%20using%20CLI))> Maximum Function Size: 20MB (After bundling using CLI) However, the bundle size troubleshooting guide argues: > Edge Functions have a 10MB source code limit. If your function exceeds this limit, deployment will fail. ## What is the new behavior? Updated the 10MB limit to 20MB in the troubleshooting docs --- .../troubleshooting/edge-function-bundle-size-issues.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/content/troubleshooting/edge-function-bundle-size-issues.mdx b/apps/docs/content/troubleshooting/edge-function-bundle-size-issues.mdx index c073b417748..6f30b06e7b5 100644 --- a/apps/docs/content/troubleshooting/edge-function-bundle-size-issues.mdx +++ b/apps/docs/content/troubleshooting/edge-function-bundle-size-issues.mdx @@ -8,7 +8,7 @@ database_id = "aaf9e673-64ae-460a-88e0-b83ea4963382" cli = [ "supabase-functions-deploy" ] --- -Edge Functions have a 10MB source code limit. If your function exceeds this limit, deployment will fail. +Edge Functions have a 20MB source code limit. If your function exceeds this limit, deployment will fail. ## Check your bundle size From 5c7bf76e6cf8a7237236fd22bfaa2c292c4e46c4 Mon Sep 17 00:00:00 2001 From: Matas Urbonavicius <79410740+matasurbonavicius@users.noreply.github.com> Date: Tue, 17 Mar 2026 17:19:40 +0200 Subject: [PATCH 021/169] Correct Lithuanian text in README.lt.md (#43240) Fixed a few grammatical mistakes in the README.lt.md ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Just a few grammatical fixes in the readme, really nothing big ## What is the current behavior? Difficult to read, clearly AI generated sentences ## What is the new behavior? Not AI generated sentences, slightly easier to read (changed a few sentences only though) --------- Co-authored-by: Chris Chinchilla Co-authored-by: Chris Chinchilla --- i18n/README.lt.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i18n/README.lt.md b/i18n/README.lt.md index 66c104a52bf..5fc86aef480 100644 --- a/i18n/README.lt.md +++ b/i18n/README.lt.md @@ -7,11 +7,11 @@ # Supabase -[Supabase](https://supabase.com) yra atvirojo kodo Firebase alternatyva. Kuriame "Firebase" funkcijas naudodami įmonių klasės atvirojo kodo įrankius. +[Supabase](https://supabase.com) yra atvirojo kodo „Firebase" alternatyva. Kuriame „Firebase" funkcijas naudodami įmonių-lygmens atvirojo kodo įrankius. - [x] Prieglobos Postgres duomenų bazė. [Dokumentai](https://supabase.com/docs/guides/database) -- [x] Autentiškumo nustatymas ir autorizavimas. [Dokumentai](https://supabase.com/docs/guides/auth) -- [x] Automatiškai generuojamos API. +- [x] Autentifikacijos nustatymas ir autorizavimas. [Dokumentai](https://supabase.com/docs/guides/auth) +- [x] Automatiškai generuojami API. - [x] REST. [Dokumentai](https://supabase.com/docs/guides/api#rest-api-overview) - [x] GraphQL. [Dokumentai](https://supabase.com/docs/guides/api#graphql-api-overview) - [x] Realaus laiko prenumeratos. [Dokumentai](https://supabase.com/docs/guides/api#realtime-api-overview) @@ -25,7 +25,7 @@ ## Dokumentacija -Išsamios dokumentacijos rasite [supabase.com/docs](https://supabase.com/docs) +Išsamias dokumentacijas rasite [supabase.com/docs](https://supabase.com/docs) Norėdami sužinoti, kaip prisidėti, apsilankykite [Getting Started](../DEVELOPERS.md) From ddb4322eb3998510b647bb2facfd4f22d5f31af7 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 17 Mar 2026 16:22:04 +0100 Subject: [PATCH 022/169] fix: Bucket policies actions menu is hidden on Safari (#43866) ## Problem image ## Solution image Tested on Safari, Chrome and Firefox --- .../interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx | 2 +- .../Storage/StoragePolicies/StoragePoliciesBucketRow.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx index cae263d3abc..889131da299 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx @@ -107,7 +107,7 @@ export const PolicyRow = ({ )}
  • - + {!isLocked && ( diff --git a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketRow.tsx b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketRow.tsx index 81ece470257..4a487ad9031 100644 --- a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketRow.tsx +++ b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketRow.tsx @@ -71,7 +71,7 @@ export const StoragePoliciesBucketRow = forwardRefName Command Applied to - + Actions From b79a645f4fa31e8591026222371b4b0300d4e58a Mon Sep 17 00:00:00 2001 From: Etienne Stalmans Date: Tue, 17 Mar 2026 16:28:38 +0100 Subject: [PATCH 023/169] fix: escape regex control character (#43806) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Bug fix ## What is the current behavior? regex control character, `.` is not escaped. ## What is the new behavior? Escapes control characters and makes regex a little stricter. Use regex literal --- apps/studio/lib/api/edgeFunctions.test.ts | 8 ++++---- apps/studio/lib/api/edgeFunctions.ts | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/studio/lib/api/edgeFunctions.test.ts b/apps/studio/lib/api/edgeFunctions.test.ts index 54e0af1f63e..76ac26dda3d 100644 --- a/apps/studio/lib/api/edgeFunctions.test.ts +++ b/apps/studio/lib/api/edgeFunctions.test.ts @@ -4,10 +4,10 @@ import { isValidEdgeFunctionURL } from './edgeFunctions' describe('isValidEdgeFunctionURL', () => { const validEdgeFunctionUrls = [ - 'https://projectref.supabase.co/functions/v1/hello-world', - 'https://projectref.supabase.red/functions/v1/hello-world', - 'https://projectref.supabase.red/functions/v3/hello-world', - 'https://projectref.supabase.red/functions/v3/hello-world', + 'https://uniquetwentychararef.supabase.co/functions/v1/hello-world', + 'https://uniquetwentychararef.supabase.red/functions/v1/hello-world', + 'https://uniquetwentychararef.supabase.red/functions/v3/hello-world', + 'https://uniquetwentychararef.supabase.red/functions/v3/hello-world', ] const validLocalEdgeFunctionsUrls = [ diff --git a/apps/studio/lib/api/edgeFunctions.ts b/apps/studio/lib/api/edgeFunctions.ts index 15b0138328a..4a1a4817436 100644 --- a/apps/studio/lib/api/edgeFunctions.ts +++ b/apps/studio/lib/api/edgeFunctions.ts @@ -9,14 +9,14 @@ export const isValidEdgeFunctionURL = (url: string, isPlatform: boolean) => { if (!isPlatform) { const regexValidLocalEdgeFunctionURL = new RegExp( - '^https?://[^\\s/?#]+/functions/v[0-9]{1}/.*$' + /^https?:\/\/[^\s/?#]+\/functions\/v[0-9]{1}\/.*$/ ) return regexValidLocalEdgeFunctionURL.test(url) } const regexValidEdgeFunctionURL = new RegExp( - '^https://[a-z]*.supabase.(red|co)/functions/v[0-9]{1}/.*$' + /^https:\/\/[a-z]{20}\.supabase\.(red|co)\/functions\/v[0-9]{1}\/.*$/ ) return regexValidEdgeFunctionURL.test(url) From 26293b377d133454795d4cffb8ebe8a289d958aa Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 17 Mar 2026 22:58:19 +0700 Subject: [PATCH 024/169] Add usercentrics to script src CSP (#43870) ## Context Addresses a CSP issue for usercentrics script src on prod image Just adds usercentrics to script src, previously was only in default src --- apps/studio/csp.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/studio/csp.js b/apps/studio/csp.js index ff2f9f0a1db..60cd2dcc38c 100644 --- a/apps/studio/csp.js +++ b/apps/studio/csp.js @@ -112,6 +112,7 @@ module.exports.getCSP = function getCSP() { SUPABASE_ASSETS_URL, STAPE_URL, POSTHOG_URL, + USERCENTRICS_URLS, ] const FRAME_SRC_URLS = [ HCAPTCHA_ASSET_URL, From 8ca55ac1ff5956f0d19494a2d5cc3d41fa22237d Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 17 Mar 2026 23:39:49 +0700 Subject: [PATCH 025/169] Update CSP for usercentrics img src (#43873) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One more 🤦 --- apps/studio/csp.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/studio/csp.js b/apps/studio/csp.js index 60cd2dcc38c..610cc22d161 100644 --- a/apps/studio/csp.js +++ b/apps/studio/csp.js @@ -129,6 +129,7 @@ module.exports.getCSP = function getCSP() { SUPABASE_ASSETS_URL, USERCENTRICS_APP_URL, STAPE_URL, + USERCENTRICS_URLS, ...(!!NIMBUS_PROD_PROJECTS_URL ? [NIMBUS_PROD_PROJECTS_URL, NIMBUS_PROD_PROJECTS_URL_WS] : []), ] const STYLE_SRC_URLS = [CLOUDFLARE_CDN_URL, SUPABASE_ASSETS_URL] From c473cf0720e08e48492b4622b896b07594c4ae8c Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:12:28 +0100 Subject: [PATCH 026/169] fix: storage copy url include the opened folder for files that are not in it (#43875) Fixes #42357 Supersedes #42364 ## Problem When copying the URL of a file that is not in the currently opened folder, the folder path is still included in that file URL. ## Solution We actually always have the file path, use it directly instead of rebuilding it from the storage explorer state ## How to test 1. Create a bucket and upload a file in it 2. Create a folder and upload a file in it While the folder is selected, right click the root file uploaded in 1 and copy its URL. It should not contain the folder name. Same with the dropdown menu that appears when hovering the file. --- .../StorageExplorer/CustomExpiryModal.tsx | 6 +- .../StorageExplorer/FileExplorerRow.tsx | 11 ++- .../StorageExplorer/ItemContextMenu.tsx | 4 +- .../Storage/StorageExplorer/PreviewPane.tsx | 8 +- .../Storage/StorageExplorer/useCopyUrl.tsx | 24 ++---- e2e/studio/features/files/test-file-2.txt | 3 + e2e/studio/features/storage.spec.ts | 82 +++++++++++++++++++ 7 files changed, 109 insertions(+), 29 deletions(-) create mode 100644 e2e/studio/features/files/test-file-2.txt diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/CustomExpiryModal.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/CustomExpiryModal.tsx index b33474ac03d..8f8fd70e57a 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/CustomExpiryModal.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/CustomExpiryModal.tsx @@ -1,8 +1,8 @@ import dayjs from 'dayjs' -import { Button, Form, Input, Listbox, Modal } from 'ui' - import { DATETIME_FORMAT } from 'lib/constants' import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' +import { Button, Form, Input, Listbox, Modal } from 'ui' + import { useCopyUrl } from './useCopyUrl' const unitMap = { @@ -36,7 +36,7 @@ export const CustomExpiryModal = () => { onSubmit={async (values: any, { setSubmitting }: any) => { setSubmitting(true) await onCopyUrl( - selectedFileCustomExpiry!.name, + selectedFileCustomExpiry!.path!, values.expiresIn * unitMap[values.units as 'days' | 'weeks' | 'months' | 'years'] ) setSubmitting(false) diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx index 79e9362c414..da0f398924c 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx @@ -202,7 +202,9 @@ export const FileExplorerRow = ({ { name: 'Get URL', icon: , - onClick: () => onCopyUrl(itemWithColumnIndex.name), + onClick: () => { + onCopyUrl(itemWithColumnIndex.path!) + }, }, ] : [ @@ -213,17 +215,17 @@ export const FileExplorerRow = ({ { name: 'Expire in 1 week', onClick: () => - onCopyUrl(itemWithColumnIndex.name, URL_EXPIRY_DURATION.WEEK), + onCopyUrl(itemWithColumnIndex.path!, URL_EXPIRY_DURATION.WEEK), }, { name: 'Expire in 1 month', onClick: () => - onCopyUrl(itemWithColumnIndex.name, URL_EXPIRY_DURATION.MONTH), + onCopyUrl(itemWithColumnIndex.path!, URL_EXPIRY_DURATION.MONTH), }, { name: 'Expire in 1 year', onClick: () => - onCopyUrl(itemWithColumnIndex.name, URL_EXPIRY_DURATION.YEAR), + onCopyUrl(itemWithColumnIndex.path!, URL_EXPIRY_DURATION.YEAR), }, { name: 'Custom expiry', @@ -404,6 +406,7 @@ export const FileExplorerRow = ({
    + {item.name} actions
    diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx index 270c5ec3cd2..4f5fcba4f12 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx @@ -1,11 +1,13 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { ChevronRight, Copy, Download, Edit, Move, Trash2 } from 'lucide-react' import { Item, Menu, Separator, Submenu } from 'react-contexify' + import 'react-contexify/dist/ReactContexify.css' import { useParams } from 'common' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' + import { URL_EXPIRY_DURATION } from '../Storage.constants' import { StorageItemWithColumn } from '../Storage.types' import { useCopyUrl } from './useCopyUrl' @@ -34,7 +36,7 @@ export const ItemContextMenu = ({ id = '' }: ItemContextMenuProps) => { switch (event) { case 'copy': if (expiresIn !== undefined && expiresIn < 0) return setSelectedFileCustomExpiry(item) - else return onCopyUrl(item.name, expiresIn) + if (item.path) return onCopyUrl(item.path, expiresIn) case 'rename': return setSelectedItemToRename(item) case 'move': diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx index 68176cc020b..56be45a6f32 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx @@ -212,7 +212,7 @@ export const PreviewPane = () => {