-
- Schema Results
-
-
- {{ JSON.stringify(serialize(schemaResults).json, null, 2) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Executing
+
+
+
+
+
+
+
+
+
+ Results
+
+
+ {{ JSON.stringify(serialize(results).json, null, 2) }}
+
+
+
+
+
+
+ Executing (ORM, read-only)
+
+
+
+await db.insert(users).values({ id: '9449af72-faad-4c97-8a45-69f9f1ca1b05' })
+await db.select().from(users)
+
+
+
+
+
+
+
+
+ Schema Results
+
+
+ {{ JSON.stringify(serialize(schemaResults).json, null, 2) }}
+
+
diff --git a/packages/drizzle-duckdb-wasm/src/driver.browser.test.ts b/packages/drizzle-duckdb-wasm/src/driver.browser.test.ts
new file mode 100644
index 0000000..412713e
--- /dev/null
+++ b/packages/drizzle-duckdb-wasm/src/driver.browser.test.ts
@@ -0,0 +1,223 @@
+import { DuckDBAccessMode } from '@duckdb/duckdb-wasm'
+import { DBStorageType } from '@proj-airi/duckdb-wasm'
+import { afterAll, beforeAll, describe, expect, it, onTestFinished } from 'vitest'
+
+import { drizzle } from '.'
+import { getImportUrlBundles } from './bundles/import-url-browser'
+
+describe('drizzle with duckdb wasm in browser', { timeout: 10000 }, async () => {
+ beforeAll(async () => {
+ const opfsRoot = await navigator.storage.getDirectory()
+ for await (const name of opfsRoot.keys()) {
+ if (name.startsWith('drizzle_test_')) {
+ await opfsRoot.removeEntry(name)
+ }
+ }
+ })
+
+ afterAll(async () => {
+ const opfsRoot = await navigator.storage.getDirectory()
+ for await (const name of opfsRoot.keys()) {
+ if (name.startsWith('drizzle_test_')) {
+ await opfsRoot.removeEntry(name)
+ }
+ }
+ })
+
+ it('should have navigator.storage.getDirectory', async () => {
+ const getDirectory = navigator.storage?.getDirectory
+ expect(typeof getDirectory).toBe('function')
+ })
+
+ it('should connect to an in-memory DuckDB WASM database', async () => {
+ const db = drizzle({ connection: { bundles: getImportUrlBundles() } })
+ const res = await db.execute('SELECT count(*)::INTEGER as v FROM generate_series(0, 100) t(v)')
+ expect(res).toBeDefined()
+ expect(res).toEqual([{ v: 101 }])
+ })
+
+ // TODO: Enable this test when DuckDB no longer creates files in read-only mode
+ it.skip('should fail to open a non-existent OPFS database', async () => {
+ const db = drizzle({
+ connection: {
+ bundles: getImportUrlBundles(),
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: 'drizzle_test_non_existent',
+ accessMode: DuckDBAccessMode.READ_ONLY,
+ },
+ },
+ })
+ // No need to close as the DB will fail to open
+
+ await expect(db.$client).rejects.toThrow(/file or directory could not be found/)
+
+ const opfsRoot = await navigator.storage.getDirectory()
+ const nonExistentFileHandle = opfsRoot.getFileHandle('drizzle_test_non_existent', { create: false })
+ await expect(nonExistentFileHandle).rejects.toThrow(/file or directory could not be found/)
+ })
+
+ it('should create and open an OPFS database', async () => {
+ const path = `drizzle_test_${crypto.randomUUID().replace(/-/g, '')}`
+
+ const db = drizzle({
+ connection: {
+ bundles: getImportUrlBundles(),
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: `${path}`,
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ },
+ },
+ })
+ onTestFinished(async () => (await db.$client).close())
+
+ await expect(db.$client).resolves.toBeDefined()
+ })
+
+ it('should not create an OPFS database with an empty path', async () => {
+ const db = drizzle({
+ connection: {
+ bundles: getImportUrlBundles(),
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: '',
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ },
+ },
+ })
+ // No need to close as the DB will fail to open
+
+ await expect(db.$client).rejects.toThrow(/Name is not allowed/)
+ })
+
+ it('should not create an OPFS database with an invalid path', async () => {
+ const path = `//drizzle_test_${crypto.randomUUID().replace(/-/g, '')}`
+
+ const db = drizzle({
+ connection: {
+ bundles: getImportUrlBundles(),
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: `${path}`,
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ },
+ },
+ })
+ // No need to close as the DB will fail to open
+
+ await expect(db.$client).rejects.toThrow(/Name is not allowed/)
+ })
+
+ it('should open, update, save, and reload an OPFS database', async () => {
+ const path = `drizzle_test_${crypto.randomUUID().replace(/-/g, '')}`
+
+ const db1 = drizzle({
+ connection: {
+ bundles: getImportUrlBundles(),
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: `${path}`,
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ },
+ },
+ })
+ onTestFinished(async () => (await db1.$client).close())
+
+ await expect(db1.$client).resolves.toBeDefined()
+ expect(await db1.execute('SHOW TABLES')).toEqual([])
+
+ await expect(db1.execute('CREATE TABLE test (v INTEGER)')).resolves.toBeDefined()
+ await expect(db1.execute('INSERT INTO test VALUES (1), (2), (3)')).resolves.toBeDefined()
+
+ expect(await db1.execute('SELECT * FROM test')).toEqual([{ v: 1 }, { v: 2 }, { v: 3 }])
+
+ await expect(db1.execute('CHECKPOINT')).resolves.toBeDefined()
+
+ await expect((await db1.$client).close()).resolves.toBeUndefined()
+
+ const db2 = drizzle({
+ connection: {
+ bundles: getImportUrlBundles(),
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: `${path}`,
+ accessMode: DuckDBAccessMode.READ_ONLY,
+ },
+ },
+ })
+ onTestFinished(async () => (await db2.$client).close())
+
+ expect(await db2.execute('SHOW TABLES')).toEqual([{ name: 'test' }])
+ expect(await db2.execute('SELECT * FROM test')).toEqual([{ v: 1 }, { v: 2 }, { v: 3 }])
+ })
+
+ it('should create open the same OPFS database with or without a leading slash', async () => {
+ const path = `drizzle_test_${crypto.randomUUID().replace(/-/g, '')}`
+
+ const db1 = drizzle({
+ connection: {
+ bundles: getImportUrlBundles(),
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: `${path}`,
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ },
+ },
+ })
+ onTestFinished(async () => (await db1.$client).close())
+
+ await expect(db1.$client).resolves.toBeDefined()
+ expect(await db1.execute('SHOW TABLES')).toEqual([])
+
+ await expect(db1.execute('CREATE TABLE test (v INTEGER)')).resolves.toBeDefined()
+ await expect(db1.execute('INSERT INTO test VALUES (1), (2), (3)')).resolves.toBeDefined()
+
+ expect(await db1.execute('SELECT * FROM test')).toEqual([{ v: 1 }, { v: 2 }, { v: 3 }])
+
+ await expect(db1.execute('CHECKPOINT')).resolves.toBeDefined()
+
+ await expect((await db1.$client).close()).resolves.toBeUndefined()
+
+ const db2 = drizzle({
+ connection: {
+ bundles: getImportUrlBundles(),
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: `/${path}`,
+ accessMode: DuckDBAccessMode.READ_ONLY,
+ },
+ },
+ })
+ onTestFinished(async () => (await db2.$client).close())
+
+ expect(await db2.execute('SHOW TABLES')).toEqual([{ name: 'test' }])
+ expect(await db2.execute('SELECT * FROM test')).toEqual([{ v: 1 }, { v: 2 }, { v: 3 }])
+ })
+
+ it('should create, open, update, save, and reload an OPFS database with DSN', async () => {
+ const path = `drizzle_test_${crypto.randomUUID().replace(/-/g, '')}`
+ const dsn = `duckdb-wasm:///${path}?bundles=import-url&storage=origin-private-fs&write=true`
+
+ const db1 = drizzle(dsn)
+ onTestFinished(async () => (await db1.$client).close())
+
+ await expect(db1.$client).resolves.toBeDefined()
+ expect(await db1.execute('SHOW TABLES')).toEqual([])
+
+ await expect(db1.execute('CREATE TABLE test (v INTEGER)')).resolves.toBeDefined()
+ await expect(db1.execute('INSERT INTO test VALUES (1), (2), (3)')).resolves.toBeDefined()
+
+ expect(await db1.execute('SELECT * FROM test')).toEqual([{ v: 1 }, { v: 2 }, { v: 3 }])
+
+ await expect(db1.execute('CHECKPOINT')).resolves.toBeDefined()
+
+ await expect((await db1.$client).close()).resolves.toBeUndefined()
+
+ const db2 = drizzle(dsn)
+ onTestFinished(async () => (await db2.$client).close())
+
+ expect(await db2.execute('SHOW TABLES')).toEqual([{ name: 'test' }])
+ expect(await db2.execute('SELECT * FROM test')).toEqual([{ v: 1 }, { v: 2 }, { v: 3 }])
+ })
+})
diff --git a/packages/drizzle-duckdb-wasm/src/driver.test.ts b/packages/drizzle-duckdb-wasm/src/driver.test.ts
new file mode 100644
index 0000000..7aeccde
--- /dev/null
+++ b/packages/drizzle-duckdb-wasm/src/driver.test.ts
@@ -0,0 +1,107 @@
+import type { DBNodeFS } from '@proj-airi/duckdb-wasm'
+
+import { randomUUID } from 'node:crypto'
+import { readdir, unlink } from 'node:fs/promises'
+import { tmpdir } from 'node:os'
+import path from 'node:path'
+import { DuckDBAccessMode } from '@duckdb/duckdb-wasm'
+import { DBStorageType } from '@proj-airi/duckdb-wasm'
+import { getBundles } from '@proj-airi/duckdb-wasm/bundles/default-node'
+import { afterAll, beforeAll, describe, expect, it, onTestFinished } from 'vitest'
+
+import { drizzle } from '.'
+
+describe('drizzle with duckdb wasm in node', { timeout: 10000 }, async () => {
+ beforeAll(async () => {
+ const tmp = tmpdir()
+ await Promise.all(
+ (await readdir(tmp)).reduce
[]>((tasks, filename) => {
+ if (filename.startsWith('drizzle_test_')) {
+ tasks.push(unlink(path.join(tmp, filename)))
+ }
+ return tasks
+ }, []),
+ )
+ })
+
+ afterAll(async () => {
+ const tmp = tmpdir()
+ await Promise.all(
+ (await readdir(tmp)).reduce[]>((tasks, filename) => {
+ if (filename.startsWith('drizzle_test_')) {
+ tasks.push(unlink(path.join(tmp, filename)))
+ }
+ return tasks
+ }, []),
+ )
+ })
+
+ it('should connect to an in-memory DuckDB WASM database', async () => {
+ const db = drizzle({ connection: { bundles: getBundles() } })
+ const res = await db.execute('SELECT count(*)::INTEGER as v FROM generate_series(0, 100) t(v)')
+ expect(res).toBeDefined()
+ expect(res).toEqual([{ v: 101 }])
+ })
+
+ it('should open a DuckDB WASM database in Node FS', async () => {
+ const tmp = tmpdir()
+ const filename = `drizzle_test_${randomUUID().replace(/-/g, '')}`
+
+ const db = drizzle({
+ connection: {
+ bundles: getBundles(),
+ storage: {
+ type: DBStorageType.NODE_FS,
+ path: path.resolve(tmp, filename),
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ } as DBNodeFS,
+ },
+ })
+
+ await expect(db.$client).resolves.toBeDefined()
+ })
+
+ it('should open, update, save, and reload an OPFS database', async () => {
+ const tmp = tmpdir()
+ const filename = `drizzle_test_${randomUUID().replace(/-/g, '')}`
+
+ const db1 = drizzle({
+ connection: {
+ bundles: getBundles(),
+ storage: {
+ type: DBStorageType.NODE_FS,
+ path: path.resolve(tmp, filename),
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ },
+ },
+ })
+ onTestFinished(async () => (await db1.$client).close())
+
+ await expect(db1.$client).resolves.toBeDefined()
+ expect(await db1.execute('SHOW TABLES')).toEqual([])
+
+ await expect(db1.execute('CREATE TABLE test (v INTEGER)')).resolves.toBeDefined()
+ await expect(db1.execute('INSERT INTO test VALUES (1), (2), (3)')).resolves.toBeDefined()
+
+ expect(await db1.execute('SELECT * FROM test')).toEqual([{ v: 1 }, { v: 2 }, { v: 3 }])
+
+ await expect(db1.execute('CHECKPOINT')).resolves.toBeDefined()
+
+ await expect((await db1.$client).close()).resolves.toBeUndefined()
+
+ const db2 = drizzle({
+ connection: {
+ bundles: getBundles(),
+ storage: {
+ type: DBStorageType.NODE_FS,
+ path: path.resolve(tmp, filename),
+ accessMode: DuckDBAccessMode.READ_ONLY,
+ },
+ },
+ })
+ onTestFinished(async () => (await db2.$client).close())
+
+ expect(await db2.execute('SHOW TABLES')).toEqual([{ name: 'test' }])
+ expect(await db2.execute('SELECT * FROM test')).toEqual([{ v: 1 }, { v: 2 }, { v: 3 }])
+ })
+})
diff --git a/packages/drizzle-duckdb-wasm/src/driver.ts b/packages/drizzle-duckdb-wasm/src/driver.ts
index f8294cd..4bd94a5 100644
--- a/packages/drizzle-duckdb-wasm/src/driver.ts
+++ b/packages/drizzle-duckdb-wasm/src/driver.ts
@@ -1,5 +1,5 @@
-import type { DuckDBBundles, Logger } from '@duckdb/duckdb-wasm'
-import type { DuckDBWasmClient } from '@proj-airi/duckdb-wasm'
+import type { DuckDBBundles } from '@duckdb/duckdb-wasm'
+import type { ConnectOptions, DuckDBWasmClient } from '@proj-airi/duckdb-wasm'
import type { DrizzleConfig, RelationalSchemaConfig, TablesRelationalConfig } from 'drizzle-orm'
import type { DuckDBWasmQueryResultHKT } from './session'
@@ -8,6 +8,7 @@ import { connect, getEnvironment } from '@proj-airi/duckdb-wasm'
import { createTableRelationsHelpers, DefaultLogger, entityKind, extractTablesRelationalConfig, isConfig } from 'drizzle-orm'
import { PgDatabase, PgDialect } from 'drizzle-orm/pg-core'
+import { parseDSN } from './dsn'
import { DuckDBWasmSession } from './session'
export class DuckDBWasmDatabase<
@@ -59,45 +60,51 @@ export interface DuckDBWasmDrizzleDatabase<
$client: TClient
}
+async function getBundles(importUrl = false): Promise {
+ const env = await getEnvironment()
+ switch (env) {
+ case 'browser':
+ return importUrl
+ ? (await import('@proj-airi/duckdb-wasm/bundles/import-url-browser')).getImportUrlBundles()
+ : (await import('@proj-airi/duckdb-wasm/bundles/default-browser')).getBundles()
+ case 'node':
+ return importUrl
+ ? await (await import('@proj-airi/duckdb-wasm/bundles/import-url-node')).getImportUrlBundles()
+ : await (await import('@proj-airi/duckdb-wasm/bundles/default-node')).getBundles()
+ default:
+ throw new Error(`Unsupported environment: "${env}"`)
+ }
+}
+
+function constructByDSN<
+ TSchema extends Record = Record,
+>(
+ dsn: string,
+ drizzleConfig?: DrizzleConfig,
+): DuckDBWasmDrizzleDatabase> {
+ const structured = parseDSN(dsn)
+
+ return construct(connect({
+ bundles: getBundles(structured.bundles === 'import-url'),
+ logger: structured.logger ? new ConsoleLogger() : undefined,
+ storage: structured.storage,
+ }), drizzleConfig) as any
+}
+
export function drizzle<
TSchema extends Record = Record,
TClient extends Promise = Promise,
>(
...params:
- | [{ connection: string | ({ url?: string, bundles?: DuckDBBundles | Promise, logger?: Logger | false }) }]
- | [{ connection: string | ({ url?: string, bundles?: DuckDBBundles | Promise, logger?: Logger | false }) }, DrizzleConfig]
+ | [{ connection: string | ConnectOptions }]
+ | [{ connection: string | ConnectOptions }, DrizzleConfig]
| [{ client: TClient }]
| [{ client: TClient }, DrizzleConfig]
| [ TClient | string ]
| [ TClient | string, DrizzleConfig ]
): DuckDBWasmDrizzleDatabase {
if (typeof params[0] === 'string') {
- const parsedDSN = new URL(params[0] as string)
- if (parsedDSN.searchParams.get('bundles') === 'import-url') {
- const logger = parsedDSN.searchParams.get('logger') === 'true' ? new ConsoleLogger() : undefined
- return construct(new Promise((resolve) => {
- getEnvironment().then((env) => {
- if (env === 'browser') {
- import('@proj-airi/duckdb-wasm/bundles/import-url-browser')
- .then(res => res.getImportUrlBundles())
- .then(bundles => connect({ bundles, logger }))
- .then(resolve)
- }
- else if (env === 'node') {
- import('@proj-airi/duckdb-wasm/bundles/import-url-node')
- .then(res => res.getImportUrlBundles())
- .then(bundles => connect({ bundles, logger }))
- .then(resolve)
- }
- else {
- throw new Error('Unsupported environment')
- }
- })
- }), params[1]) as any
- }
-
- const instance = connect({})
- return construct(instance, params[1]) as any
+ return constructByDSN(params[0] as string, params[1]) as any
}
if (isConfig(params[0])) {
@@ -106,48 +113,21 @@ export function drizzle<
client,
...drizzleConfig
} = params[0] as {
- connection?: {
- url?: string
- bundles?: DuckDBBundles
- }
+ connection?: string | ConnectOptions // a DSN or a ConnectOptions object
client?: TClient
} & DrizzleConfig
if (client)
return construct(client, drizzleConfig) as any
- if (typeof connection === 'object') {
- if (connection.url !== undefined) {
- const { url } = connection
- const parsedDSN = new URL(url)
- const logger = parsedDSN.searchParams.get('logger') === 'true' ? new ConsoleLogger() : undefined
- if (parsedDSN.searchParams.get('bundles') === 'import-url') {
- return construct(new Promise((resolve) => {
- getEnvironment().then((env) => {
- if (env === 'browser') {
- import('@proj-airi/duckdb-wasm/bundles/import-url-browser')
- .then(res => res.getImportUrlBundles())
- .then(bundles => connect({ bundles, logger }))
- .then(resolve)
- }
- else if (env === 'node') {
- import('@proj-airi/duckdb-wasm/bundles/import-url-node')
- .then(res => res.getImportUrlBundles())
- .then(bundles => connect({ bundles, logger }))
- .then(resolve)
- }
- else {
- throw new Error('Unsupported environment')
- }
- })
- }), drizzleConfig) as any
- }
- }
-
- return construct(connect({ bundles: connection.bundles }), drizzleConfig) as any
- }
+ if (typeof connection === 'string')
+ return constructByDSN(connection, drizzleConfig) as any
- return construct(connect({}), drizzleConfig) as any
+ return construct(connect({
+ bundles: connection.bundles,
+ logger: connection.logger,
+ storage: connection.storage,
+ }), drizzleConfig) as any
}
return construct(params[0] as TClient, params[1] as DrizzleConfig | undefined) as any
diff --git a/packages/drizzle-duckdb-wasm/src/dsn.test.ts b/packages/drizzle-duckdb-wasm/src/dsn.test.ts
new file mode 100644
index 0000000..a229da9
--- /dev/null
+++ b/packages/drizzle-duckdb-wasm/src/dsn.test.ts
@@ -0,0 +1,142 @@
+import type { DBOriginPrivateFS } from '@proj-airi/duckdb-wasm'
+import type { StructuredDSN } from './dsn'
+
+import { DuckDBAccessMode } from '@duckdb/duckdb-wasm'
+import { DBStorageType } from '@proj-airi/duckdb-wasm'
+import { describe, expect, it } from 'vitest'
+
+import { buildDSN, parseDSN } from './dsn'
+import { spyConsoleWarn } from './test-utils'
+
+describe('parseDSN', { timeout: 10000 }, async () => {
+ it('should fail with non-duckdb-wasm protocol', async () => {
+ const dsn = 'random-db:///database.db'
+
+ expect(() => parseDSN(dsn)).toThrow('Expected scheme to be "duckdb-wasm:" but got "random-db:"')
+ })
+
+ it('should parse OPFS with path', async () => {
+ const dsn = 'duckdb-wasm:///path/to/database.db?storage=origin-private-fs'
+
+ let structured: StructuredDSN
+ expect(() => structured = parseDSN(dsn)).not.toThrow()
+ expect(structured).toEqual({
+ scheme: 'duckdb-wasm:',
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: 'path/to/database.db',
+ } as DBOriginPrivateFS,
+ })
+ })
+
+ it('should parse OPFS with missing leading slash', async () => {
+ const consoleWarnMock = spyConsoleWarn()
+
+ const dsn = 'duckdb-wasm://path/to/database.db?storage=origin-private-fs'
+ // ^~~~~ missing leading slash: this will be parsed as host/hostname
+
+ let structured: StructuredDSN
+ expect(() => structured = parseDSN(dsn)).not.toThrow()
+ expect(structured).toEqual({
+ scheme: 'duckdb-wasm:',
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: 'to/database.db',
+ } as DBOriginPrivateFS,
+ })
+
+ expect(consoleWarnMock).toHaveBeenCalledTimes(1)
+ expect(consoleWarnMock).toHaveBeenCalledWith('Host "path" will be ignored while using Origin Private FS')
+ })
+
+ it('should parse OPFS with path and (write = true)', async () => {
+ const dsn = 'duckdb-wasm:///path/to/database.db?storage=origin-private-fs&write=true'
+
+ const structured = parseDSN(dsn)
+ expect(structured).toEqual({
+ scheme: 'duckdb-wasm:',
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: 'path/to/database.db',
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ } as DBOriginPrivateFS,
+ })
+ })
+
+ it('should parse OPFS with path and (write = false)', async () => {
+ const dsn = 'duckdb-wasm:///path/to/database.db?storage=origin-private-fs&write=false'
+
+ const structured = parseDSN(dsn)
+ expect(structured).toEqual({
+ scheme: 'duckdb-wasm:',
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: 'path/to/database.db',
+ } as DBOriginPrivateFS,
+ })
+ })
+})
+
+describe('buildDSN', { timeout: 10000 }, async () => {
+ it('should build DSN with OPFS (ro)', async () => {
+ const structured: StructuredDSN = {
+ scheme: 'duckdb-wasm:',
+ bundles: 'import-url',
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: 'path/to/database.db',
+ } as DBOriginPrivateFS,
+ }
+
+ let url: URL
+ expect(() => url = new URL(buildDSN(structured))).not.toThrow()
+ expect(url.protocol).toBe('duckdb-wasm:')
+ expect(url.host).toBe('')
+ expect(url.pathname).toBe('/path/to/database.db')
+ expect(url.searchParams.get('storage')).toBe(DBStorageType.ORIGIN_PRIVATE_FS)
+ expect(url.searchParams.get('write')).toBeNull()
+ expect(url.searchParams.get('bundles')).toBe('import-url')
+ })
+
+ it('should build DSN with OPFS (rw)', async () => {
+ const structured: StructuredDSN = {
+ scheme: 'duckdb-wasm:',
+ bundles: 'import-url',
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: 'path/to/database.db',
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ } as DBOriginPrivateFS,
+ }
+
+ let url: URL
+ expect(() => url = new URL(buildDSN(structured))).not.toThrow()
+ expect(url.protocol).toBe('duckdb-wasm:')
+ expect(url.host).toBe('')
+ expect(url.pathname).toBe('/path/to/database.db')
+ expect(url.searchParams.get('storage')).toBe(DBStorageType.ORIGIN_PRIVATE_FS)
+ expect(url.searchParams.get('write')).toBe('true')
+ expect(url.searchParams.get('bundles')).toBe('import-url')
+ })
+
+ it('should build the same DSN with OPFS but with a leading slash in the path', async () => {
+ const structured: StructuredDSN = {
+ scheme: 'duckdb-wasm:',
+ bundles: 'import-url',
+ storage: {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: '/path/to/database.db',
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ } as DBOriginPrivateFS,
+ }
+
+ let url: URL
+ expect(() => url = new URL(buildDSN(structured))).not.toThrow()
+ expect(url.protocol).toBe('duckdb-wasm:')
+ expect(url.host).toBe('')
+ expect(url.pathname).toBe('/path/to/database.db')
+ expect(url.searchParams.get('storage')).toBe(DBStorageType.ORIGIN_PRIVATE_FS)
+ expect(url.searchParams.get('write')).toBe('true')
+ expect(url.searchParams.get('bundles')).toBe('import-url')
+ })
+})
diff --git a/packages/drizzle-duckdb-wasm/src/dsn.ts b/packages/drizzle-duckdb-wasm/src/dsn.ts
new file mode 100644
index 0000000..547beb1
--- /dev/null
+++ b/packages/drizzle-duckdb-wasm/src/dsn.ts
@@ -0,0 +1,117 @@
+import type { DBStorage } from '@proj-airi/duckdb-wasm'
+
+import { DuckDBAccessMode } from '@duckdb/duckdb-wasm'
+import { DBStorageType } from '@proj-airi/duckdb-wasm'
+
+export interface StructuredDSN {
+ scheme: 'duckdb-wasm:'
+ bundles?: 'import-url'
+ logger?: boolean
+ storage?: DBStorage
+}
+
+export function isLiterallyTrue(value?: string): boolean {
+ return typeof value === 'string' && /^true$/i.test(value)
+}
+
+/**
+ * Parse a DuckDB WASM DSN string into a structured object
+ *
+ * Examples:
+ * - `duckdb-wasm:///` -> In-memory
+ * - `duckdb-wasm:///?bundles=import-url` -> In-memory, use import-URL bundles
+ * - `duckdb-wasm:///?logger=true` -> In-memory, enable logger
+ * - `duckdb-wasm://database.db?storage=origin-private-fs&write=true` -> Origin Private FS, RW, database.db
+ * - `duckdb-wasm:///database.db?storage=origin-private-fs&write=true` -> Origin Private FS, RW, database.db (leading slash is optional)
+ *
+ * @param dsn The DSN string to parse
+ */
+export function parseDSN(dsn: string): StructuredDSN {
+ const structured: StructuredDSN = {
+ scheme: 'duckdb-wasm:',
+ }
+
+ const parsed = new URL(dsn)
+
+ // The protocol in the URL maps to the scheme in the DSN (URI)
+ // See: https://developer.mozilla.org/en-US/docs/Web/API/URL/protocol
+ if (!parsed.protocol.startsWith('duckdb-wasm:')) {
+ throw new Error(`Expected scheme to be "duckdb-wasm:" but got "${parsed.protocol}"`)
+ }
+
+ if (parsed.searchParams.get('bundles') === 'import-url') {
+ structured.bundles = 'import-url'
+ }
+
+ if (isLiterallyTrue(parsed.searchParams.get('logger'))) {
+ structured.logger = true
+ }
+
+ const paramStorage = parsed.searchParams.get('storage')
+ switch (paramStorage) {
+ case DBStorageType.ORIGIN_PRIVATE_FS: {
+ if (parsed.host.length > 0) {
+ console.warn(`Host "${parsed.host}" will be ignored while using Origin Private FS`)
+ }
+ const paramWrite = parsed.searchParams.get('write')
+ structured.storage = {
+ type: DBStorageType.ORIGIN_PRIVATE_FS,
+ path: parsed.pathname.startsWith('/') ? parsed.pathname.slice(1) : parsed.pathname,
+ ...isLiterallyTrue(paramWrite) && {
+ accessMode: DuckDBAccessMode.READ_WRITE,
+ },
+ }
+ break
+ }
+ case null:
+ break
+ default:
+ console.warn(`Unknown storage type "${paramStorage}"`)
+ break
+ }
+
+ return structured
+}
+
+/**
+ * Build a DuckDB WASM DSN string from a structured DSN object
+ *
+ * @param structured The structured DSN object
+ * @returns The DSN string
+ */
+export function buildDSN(structured: StructuredDSN): string {
+ const parsed = new URL('duckdb-wasm:///')
+
+ if (structured.bundles === 'import-url') {
+ parsed.searchParams.set('bundles', 'import-url')
+ }
+
+ if (structured.logger) {
+ parsed.searchParams.set('logger', 'true')
+ }
+
+ if (structured.storage) {
+ parsed.searchParams.set('storage', structured.storage.type)
+
+ switch (structured.storage.type) {
+ case DBStorageType.ORIGIN_PRIVATE_FS:
+ parsed.pathname = structured.storage.path
+ if (!parsed.pathname.startsWith('/')) {
+ // To make the pathname pathname in the URL
+ parsed.pathname = `/${parsed.pathname}`
+ }
+ if (structured.storage.accessMode === DuckDBAccessMode.READ_WRITE) {
+ parsed.searchParams.set('write', 'true')
+ }
+ break
+ case DBStorageType.NODE_FS:
+ parsed.pathname = structured.storage.path
+ if (structured.storage.accessMode === DuckDBAccessMode.READ_WRITE) {
+ parsed.searchParams.set('write', 'true')
+ }
+ break
+ }
+ }
+
+ return parsed.toString()
+}
diff --git a/packages/drizzle-duckdb-wasm/src/index.test.ts b/packages/drizzle-duckdb-wasm/src/index.test.ts
deleted file mode 100644
index cecc77b..0000000
--- a/packages/drizzle-duckdb-wasm/src/index.test.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { getBundles } from '@proj-airi/duckdb-wasm/bundles/default-node'
-import { describe, expect, it } from 'vitest'
-
-import { drizzle } from '.'
-
-describe('drizzle', { timeout: 10000 }, async () => {
- it('should connect to a DuckDBWasm database', async () => {
- const db = drizzle({ connection: { bundles: getBundles() } })
- const res = await db.execute('SELECT count(*)::INTEGER as v FROM generate_series(0, 100) t(v)')
- expect(res).toBeDefined()
- expect(res).toEqual([{ v: 101 }])
- })
-})
diff --git a/packages/drizzle-duckdb-wasm/src/test-utils.ts b/packages/drizzle-duckdb-wasm/src/test-utils.ts
new file mode 100644
index 0000000..91a315c
--- /dev/null
+++ b/packages/drizzle-duckdb-wasm/src/test-utils.ts
@@ -0,0 +1,12 @@
+import { afterAll, vi } from 'vitest'
+
+export function spyConsoleWarn() {
+ const hookedConsoleWarn = console.warn
+ const consoleWarnMock = vi.spyOn(console, 'warn').mockImplementation(hookedConsoleWarn)
+
+ afterAll(() => {
+ consoleWarnMock.mockReset()
+ })
+
+ return consoleWarnMock
+}
diff --git a/packages/drizzle-duckdb-wasm/tsconfig.json b/packages/drizzle-duckdb-wasm/tsconfig.json
index 4edc824..30f069d 100644
--- a/packages/drizzle-duckdb-wasm/tsconfig.json
+++ b/packages/drizzle-duckdb-wasm/tsconfig.json
@@ -5,12 +5,14 @@
"ESNext",
"DOM",
"DOM.Iterable",
+ "DOM.AsyncIterable",
"WebWorker"
],
"module": "ESNext",
"moduleResolution": "bundler",
"types": [
- "vite/client"
+ "vite/client",
+ "@vitest/browser/providers/playwright"
],
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
diff --git a/packages/drizzle-duckdb-wasm/vitest.config.ts b/packages/drizzle-duckdb-wasm/vitest.config.ts
new file mode 100644
index 0000000..1ff94a0
--- /dev/null
+++ b/packages/drizzle-duckdb-wasm/vitest.config.ts
@@ -0,0 +1,32 @@
+import { defineConfig } from 'vitest/config'
+
+export default defineConfig({
+ test: {
+ workspace: [
+ {
+ extends: true,
+ test: {
+ name: 'node',
+ environment: 'node',
+ include: ['**/*.{spec,test}.ts'],
+ exclude: ['**/*.browser.{spec,test}.ts', '**/node_modules/**'],
+ },
+ },
+ {
+ extends: true,
+ test: {
+ name: 'browser',
+ include: ['**/*.browser.{spec,test}.ts'],
+ exclude: ['**/node_modules/**'],
+ browser: {
+ enabled: true,
+ provider: 'playwright',
+ instances: [
+ { browser: 'chromium' },
+ ],
+ },
+ },
+ },
+ ],
+ },
+})
diff --git a/packages/duckdb-wasm/package.json b/packages/duckdb-wasm/package.json
index fc071ed..6122bd1 100644
--- a/packages/duckdb-wasm/package.json
+++ b/packages/duckdb-wasm/package.json
@@ -63,7 +63,7 @@
},
"dependencies": {
"@date-fns/tz": "^1.2.0",
- "@duckdb/duckdb-wasm": "^1.29.0",
+ "@duckdb/duckdb-wasm": "1.29.1-dev68.0",
"apache-arrow": "^19.0.1",
"date-fns": "^4.1.0",
"defu": "^6.1.4",
diff --git a/packages/duckdb-wasm/src/duckdb.ts b/packages/duckdb-wasm/src/duckdb.ts
index 8a14617..607e1b8 100644
--- a/packages/duckdb-wasm/src/duckdb.ts
+++ b/packages/duckdb-wasm/src/duckdb.ts
@@ -1,16 +1,19 @@
import type { AsyncDuckDBConnection, DuckDBBundle, DuckDBBundles, Logger } from '@duckdb/duckdb-wasm'
+import type { DBStorage } from './storage'
import { AsyncDuckDB, ConsoleLogger, selectBundle, VoidLogger } from '@duckdb/duckdb-wasm'
import { defu } from 'defu'
import { getEnvironment } from './common'
import { mapStructRowData } from './format'
+import { DBStorageType } from './storage'
export type ConnectOptions = ConnectRequiredOptions & ConnectOptionalOptions
export interface ConnectOptionalOptions {
bundles?: DuckDBBundles | Promise
logger?: boolean | Logger
+ storage?: DBStorage
}
export interface ConnectRequiredOptions {
@@ -75,6 +78,47 @@ export async function connect(options: ConnectOptions): Promise=18'}
+ '@bundled-es-modules/cookie@2.0.1':
+ resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==}
+
+ '@bundled-es-modules/statuses@1.0.1':
+ resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==}
+
+ '@bundled-es-modules/tough-cookie@0.1.6':
+ resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==}
+
'@clack/core@0.4.1':
resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==}
@@ -1898,8 +1913,8 @@ packages:
'@drizzle-team/brocli@0.10.2':
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
- '@duckdb/duckdb-wasm@1.29.0':
- resolution: {integrity: sha512-8Zq7vafQuIz9gklC/9375KE38UlkaS2n8+yvG+/JK7irm3DjwYNJHL4xfplIj0bSHFIg6we5XhWYFqtE/vO3+Q==}
+ '@duckdb/duckdb-wasm@1.29.1-dev68.0':
+ resolution: {integrity: sha512-UttGAEDiCjSrn3anOlBwwrc+rDBY4jwyg+m9ZbNqazVWlanInQ8p6gZE1ZGDYp3Z0GG7fGSrkXs+bdT/mXSHEQ==}
'@ecies/ciphers@0.2.2':
resolution: {integrity: sha512-ylfGR7PyTd+Rm2PqQowG08BCKA22QuX8NzrL+LxAAvazN10DMwdJ2fWwAzRj05FI/M8vNFGm3cv9Wq/GFWCBLg==}
@@ -2945,6 +2960,37 @@ packages:
cpu: [x64]
os: [win32]
+ '@inquirer/confirm@5.1.6':
+ resolution: {integrity: sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/core@10.1.7':
+ resolution: {integrity: sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/figures@1.0.10':
+ resolution: {integrity: sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==}
+ engines: {node: '>=18'}
+
+ '@inquirer/type@3.0.4':
+ resolution: {integrity: sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
'@internationalized/date@3.6.0':
resolution: {integrity: sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ==}
@@ -3070,6 +3116,10 @@ packages:
'@mdx-js/mdx@3.1.0':
resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==}
+ '@mswjs/interceptors@0.37.6':
+ resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==}
+ engines: {node: '>=18'}
+
'@napi-rs/wasm-runtime@0.2.5':
resolution: {integrity: sha512-kwUxR7J9WLutBbulqg1dfOrMTwhMdXLdcGUhcbCcGwnPLt3gz19uHVdwH1syKVDbE022ZS2vZxOWflFLS0YTjw==}
@@ -3108,6 +3158,15 @@ packages:
'@nxg-org/mineflayer-util-plugin@1.8.3':
resolution: {integrity: sha512-YlIbzCDs9822xuvmYlD0vXZz0iye9buqp9NK4nNn15gYybdqBtC/YxK6BLqXtwNohZCKoZdKgei7Xd5Bt2/rUg==}
+ '@open-draft/deferred-promise@2.2.0':
+ resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
+
+ '@open-draft/logger@0.3.0':
+ resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==}
+
+ '@open-draft/until@2.1.0':
+ resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==}
+
'@oslojs/encoding@1.1.0':
resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
@@ -3983,6 +4042,16 @@ packages:
peerDependencies:
vue: ^2.7.0 || ^3.0.0
+ '@testing-library/dom@10.4.0':
+ resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
+ engines: {node: '>=18'}
+
+ '@testing-library/user-event@14.6.1':
+ resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==}
+ engines: {node: '>=12', npm: '>=6'}
+ peerDependencies:
+ '@testing-library/dom': '>=7.21.4'
+
'@tootallnate/once@2.0.0':
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
@@ -4013,6 +4082,9 @@ packages:
'@types/acorn@4.0.6':
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
+ '@types/aria-query@5.0.4':
+ resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+
'@types/audioworklet@0.0.70':
resolution: {integrity: sha512-Hdrt4J7rOQrIiigxh3zkCiicVxIy7AVH5R5QhoLVjBP7HywkvMLNkGZEVAO4frNF6Gk7phFQr7ZdJgIy/EbnyA==}
@@ -4160,12 +4232,18 @@ packages:
'@types/stats.js@0.17.3':
resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==}
+ '@types/statuses@2.0.5':
+ resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==}
+
'@types/tar@6.1.13':
resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==}
'@types/three@0.173.0':
resolution: {integrity: sha512-KtNjfI/CRB6JVKIVeZM1R3GYDX2wkoV2itNcQu2j4d7qkhjGOuB+s2oF6jl9mztycDLGMtrAnJQYxInC8Bb20A==}
+ '@types/tough-cookie@4.0.5':
+ resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
+
'@types/trusted-types@2.0.3':
resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==}
@@ -4463,6 +4541,21 @@ packages:
vite: ^5.0.0 || ^6.0.0
vue: ^3.2.25
+ '@vitest/browser@3.0.6':
+ resolution: {integrity: sha512-FqKwCAkALZfNzGNx4YvRJa6HCWM2USWTjOdNO2egI/s6+3WkIl4xAlYISOARLJLDAI3yCXcpTtuUUF39K8TQgw==}
+ peerDependencies:
+ playwright: '*'
+ safaridriver: '*'
+ vitest: 3.0.6
+ webdriverio: '*'
+ peerDependenciesMeta:
+ playwright:
+ optional: true
+ safaridriver:
+ optional: true
+ webdriverio:
+ optional: true
+
'@vitest/coverage-v8@3.0.5':
resolution: {integrity: sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==}
peerDependencies:
@@ -4898,6 +4991,10 @@ packages:
ansi-align@3.0.1:
resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+ ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+
ansi-escapes@7.0.0:
resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
engines: {node: '>=18'}
@@ -4914,6 +5011,10 @@ packages:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
+ ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+
ansi-styles@6.2.1:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
@@ -4984,6 +5085,9 @@ packages:
resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
engines: {node: '>=10'}
+ aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+
aria-query@5.3.2:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'}
@@ -5409,6 +5513,10 @@ packages:
resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
engines: {node: '>=18'}
+ cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+
clipboardy@4.0.0:
resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==}
engines: {node: '>=18'}
@@ -5876,6 +5984,9 @@ packages:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
engines: {node: '>=6.0.0'}
+ dom-accessibility-api@0.5.16:
+ resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+
dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
@@ -6762,6 +6873,11 @@ packages:
fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -6920,6 +7036,10 @@ packages:
graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ graphql@16.10.0:
+ resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==}
+ engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+
gray-matter@4.0.3:
resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
engines: {node: '>=6.0'}
@@ -7034,6 +7154,9 @@ packages:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
+ headers-polyfill@4.0.3:
+ resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==}
+
hey-listen@1.0.8:
resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
@@ -7306,6 +7429,9 @@ packages:
resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
engines: {node: '>= 0.4'}
+ is-node-process@1.2.0:
+ resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==}
+
is-number-object@1.0.7:
resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
engines: {node: '>= 0.4'}
@@ -7755,6 +7881,10 @@ packages:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
+ lz-string@1.5.0:
+ resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+ hasBin: true
+
macaddress@0.5.3:
resolution: {integrity: sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg==}
@@ -8189,9 +8319,23 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ msw@2.7.1:
+ resolution: {integrity: sha512-TVT65uoWt9LE4lMTLBdClHBQVwvZv5ofac1YyE119nCrNyXf4ktdeVnWH9Fyt94Ifmiedhw6Npp4DSuVRSuRpw==}
+ engines: {node: '>=18'}
+ hasBin: true
+ peerDependencies:
+ typescript: '>= 4.8.x'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+ mute-stream@2.0.0:
+ resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
nanoid@3.3.8:
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -8452,6 +8596,9 @@ packages:
opusscript@0.1.1:
resolution: {integrity: sha512-mL0fZZOUnXdZ78woRXp18lApwpp0lF5tozJOD1Wut0dgrA9WuQTgSels/CSmFleaAZrJi/nci5KOVtbuxeWoQA==}
+ outvariant@1.4.3:
+ resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==}
+
oxc-resolver@3.0.3:
resolution: {integrity: sha512-fU5lhDCb9fCv/CP2YJiBEcuC+ZhTdOBzyacoUvPlZxA4NpF6JPVbgeYD9rthQIjfWlAwi5qfxQj2dyqxLoJ9HA==}
@@ -8588,6 +8735,9 @@ packages:
path-to-regexp@0.1.12:
resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+ path-to-regexp@6.3.0:
+ resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+
path-type@5.0.0:
resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==}
engines: {node: '>=12'}
@@ -8723,6 +8873,16 @@ packages:
platform@1.3.6:
resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
+ playwright-core@1.50.1:
+ resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ playwright@1.50.1:
+ resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
plist@3.1.0:
resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==}
engines: {node: '>=10.4.0'}
@@ -8984,6 +9144,10 @@ packages:
resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==}
engines: {node: ^14.13.1 || >=16.0.0}
+ pretty-format@27.5.1:
+ resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
pretty-ms@9.2.0:
resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
engines: {node: '>=18'}
@@ -9115,6 +9279,9 @@ packages:
prr@1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+ psl@1.15.0:
+ resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
+
pump@3.0.2:
resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
@@ -9137,6 +9304,9 @@ packages:
resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==}
engines: {node: '>=0.6'}
+ querystringify@2.2.0:
+ resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -9173,6 +9343,9 @@ packages:
rc9@2.1.2:
resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
+ react-is@17.0.2:
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
react@18.3.1:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
@@ -9343,6 +9516,9 @@ packages:
resolution: {integrity: sha512-keGBWkK0PWJGFAd6IznpjM5zZzySbsrvzq0ElXpZ4G8hzymV9I+/OnC916MF5mRxHRWSZKGIyCFJ73BZFz3xaA==}
hasBin: true
+ requires-port@1.0.0:
+ resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+
resolve-alpn@1.2.1:
resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
@@ -9581,6 +9757,10 @@ packages:
resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==}
engines: {node: '>=18'}
+ sirv@3.0.1:
+ resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==}
+ engines: {node: '>=18'}
+
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
@@ -9737,6 +9917,9 @@ packages:
strict-event-emitter-types@2.0.0:
resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==}
+ strict-event-emitter@0.5.1:
+ resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==}
+
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
@@ -10019,6 +10202,10 @@ packages:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
+ tough-cookie@4.1.4:
+ resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
+ engines: {node: '>=6'}
+
tough-cookie@5.0.0:
resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==}
engines: {node: '>=16'}
@@ -10099,6 +10286,10 @@ packages:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
+ type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+
type-fest@4.33.0:
resolution: {integrity: sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==}
engines: {node: '>=16'}
@@ -10290,6 +10481,10 @@ packages:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
+ universalify@0.2.0:
+ resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+ engines: {node: '>= 4.0.0'}
+
universalify@2.0.0:
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
engines: {node: '>= 10.0.0'}
@@ -10487,6 +10682,9 @@ packages:
url-join@4.0.1:
resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==}
+ url-parse@1.5.10:
+ resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+
url@0.11.4:
resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
engines: {node: '>= 0.4'}
@@ -10892,6 +11090,10 @@ packages:
workbox-window@7.3.0:
resolution: {integrity: sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==}
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+
wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
@@ -11031,6 +11233,10 @@ packages:
resolution: {integrity: sha512-Qu6WAqNLGleB687CCGcmgHIo8l+J19MX/32UrSMfbf/4L8gLoxjpOYoiHT1asiWyqvjRZbgvOhLlvne6E5Tbdw==}
engines: {node: '>=18.19'}
+ yoctocolors-cjs@2.1.2:
+ resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
+ engines: {node: '>=18'}
+
yoctocolors@2.1.1:
resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==}
engines: {node: '>=18'}
@@ -11074,7 +11280,7 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
- '@antfu/eslint-config@4.3.0(@typescript-eslint/utils@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(@unocss/eslint-plugin@66.0.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(eslint-plugin-format@1.0.1(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))':
+ '@antfu/eslint-config@4.3.0(@typescript-eslint/utils@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(@unocss/eslint-plugin@66.0.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(eslint-plugin-format@1.0.1(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@antfu/install-pkg': 1.0.0
'@clack/prompts': 0.10.0
@@ -11083,7 +11289,7 @@ snapshots:
'@stylistic/eslint-plugin': 4.0.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/parser': 8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)
- '@vitest/eslint-plugin': 1.1.31(@typescript-eslint/utils@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))
+ '@vitest/eslint-plugin': 1.1.31(@typescript-eslint/utils@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))
ansis: 3.15.0
cac: 6.7.14
eslint: 9.20.1(jiti@2.4.2)
@@ -11960,6 +12166,19 @@ snapshots:
'@bcoe/v8-coverage@1.0.2': {}
+ '@bundled-es-modules/cookie@2.0.1':
+ dependencies:
+ cookie: 0.7.2
+
+ '@bundled-es-modules/statuses@1.0.1':
+ dependencies:
+ statuses: 2.0.1
+
+ '@bundled-es-modules/tough-cookie@0.1.6':
+ dependencies:
+ '@types/tough-cookie': 4.0.5
+ tough-cookie: 4.1.4
+
'@clack/core@0.4.1':
dependencies:
picocolors: 1.1.1
@@ -12099,7 +12318,7 @@ snapshots:
'@drizzle-team/brocli@0.10.2': {}
- '@duckdb/duckdb-wasm@1.29.0':
+ '@duckdb/duckdb-wasm@1.29.1-dev68.0':
dependencies:
apache-arrow: 17.0.0
@@ -12656,10 +12875,10 @@ snapshots:
dependencies:
'@expressive-code/core': 0.40.1
- '@fetch-mock/vitest@0.2.8(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))':
+ '@fetch-mock/vitest@0.2.8(vitest@3.0.6)':
dependencies:
fetch-mock: 12.3.0
- vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
+ vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(@vitest/browser@3.0.6)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
'@floating-ui/core@1.6.8':
dependencies:
@@ -12868,6 +13087,32 @@ snapshots:
'@img/sharp-win32-x64@0.33.5':
optional: true
+ '@inquirer/confirm@5.1.6(@types/node@22.13.4)':
+ dependencies:
+ '@inquirer/core': 10.1.7(@types/node@22.13.4)
+ '@inquirer/type': 3.0.4(@types/node@22.13.4)
+ optionalDependencies:
+ '@types/node': 22.13.4
+
+ '@inquirer/core@10.1.7(@types/node@22.13.4)':
+ dependencies:
+ '@inquirer/figures': 1.0.10
+ '@inquirer/type': 3.0.4(@types/node@22.13.4)
+ ansi-escapes: 4.3.2
+ cli-width: 4.1.0
+ mute-stream: 2.0.0
+ signal-exit: 4.1.0
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.2
+ optionalDependencies:
+ '@types/node': 22.13.4
+
+ '@inquirer/figures@1.0.10': {}
+
+ '@inquirer/type@3.0.4(@types/node@22.13.4)':
+ optionalDependencies:
+ '@types/node': 22.13.4
+
'@internationalized/date@3.6.0':
dependencies:
'@swc/helpers': 0.5.15
@@ -13068,6 +13313,15 @@ snapshots:
- acorn
- supports-color
+ '@mswjs/interceptors@0.37.6':
+ dependencies:
+ '@open-draft/deferred-promise': 2.2.0
+ '@open-draft/logger': 0.3.0
+ '@open-draft/until': 2.1.0
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ strict-event-emitter: 0.5.1
+
'@napi-rs/wasm-runtime@0.2.5':
dependencies:
'@emnapi/core': 1.3.1
@@ -13195,6 +13449,15 @@ snapshots:
'@nxg-org/mineflayer-util-plugin@1.8.3': {}
+ '@open-draft/deferred-promise@2.2.0': {}
+
+ '@open-draft/logger@0.3.0':
+ dependencies:
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+
+ '@open-draft/until@2.1.0': {}
+
'@oslojs/encoding@1.1.0': {}
'@oxc-resolver/binding-darwin-arm64@3.0.3':
@@ -13371,7 +13634,7 @@ snapshots:
'@pixi/math': 6.5.10
'@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))
- '@pixi/filter-bloom@4.2.0(84172d5a9c3f97ab2b843c48c30bfc44)':
+ '@pixi/filter-bloom@4.2.0(7n6ylgx4tbwrexny4hitvaigqm)':
dependencies:
'@pixi/constants': 6.5.10
'@pixi/core': 6.5.10(@pixi/constants@6.5.10)(@pixi/extensions@6.5.10)(@pixi/math@6.5.10)(@pixi/runner@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))
@@ -13975,6 +14238,21 @@ snapshots:
'@tanstack/virtual-core': 3.11.2
vue: 3.5.13(typescript@5.7.3)
+ '@testing-library/dom@10.4.0':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/runtime': 7.26.7
+ '@types/aria-query': 5.0.4
+ aria-query: 5.3.0
+ chalk: 4.1.2
+ dom-accessibility-api: 0.5.16
+ lz-string: 1.5.0
+ pretty-format: 27.5.1
+
+ '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)':
+ dependencies:
+ '@testing-library/dom': 10.4.0
+
'@tootallnate/once@2.0.0': {}
'@tresjs/cientos@4.1.0(@tresjs/core@4.3.3(three@0.173.0)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(@types/three@0.173.0)(react@18.3.1)(three@0.173.0)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))':
@@ -14017,6 +14295,8 @@ snapshots:
dependencies:
'@types/estree': 1.0.6
+ '@types/aria-query@5.0.4': {}
+
'@types/audioworklet@0.0.70': {}
'@types/cacheable-request@6.0.3':
@@ -14173,6 +14453,8 @@ snapshots:
'@types/stats.js@0.17.3': {}
+ '@types/statuses@2.0.5': {}
+
'@types/tar@6.1.13':
dependencies:
'@types/node': 22.13.4
@@ -14187,6 +14469,8 @@ snapshots:
fflate: 0.8.2
meshoptimizer: 0.18.1
+ '@types/tough-cookie@4.0.5': {}
+
'@types/trusted-types@2.0.3': {}
'@types/unist@2.0.11': {}
@@ -14545,7 +14829,28 @@ snapshots:
vite: 6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
vue: 3.5.13(typescript@5.7.3)
- '@vitest/coverage-v8@3.0.5(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))':
+ '@vitest/browser@3.0.6(@types/node@22.13.4)(bufferutil@4.0.9)(playwright@1.50.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.6)':
+ dependencies:
+ '@testing-library/dom': 10.4.0
+ '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0)
+ '@vitest/mocker': 3.0.6(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))
+ '@vitest/utils': 3.0.6
+ magic-string: 0.30.17
+ msw: 2.7.1(@types/node@22.13.4)(typescript@5.7.3)
+ sirv: 3.0.1
+ tinyrainbow: 2.0.0
+ vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(@vitest/browser@3.0.6)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
+ ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ optionalDependencies:
+ playwright: 1.50.1
+ transitivePeerDependencies:
+ - '@types/node'
+ - bufferutil
+ - typescript
+ - utf-8-validate
+ - vite
+
+ '@vitest/coverage-v8@3.0.5(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 1.0.2
@@ -14559,17 +14864,17 @@ snapshots:
std-env: 3.8.0
test-exclude: 7.0.1
tinyrainbow: 2.0.0
- vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
+ vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(@vitest/browser@3.0.6)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
- '@vitest/eslint-plugin@1.1.31(@typescript-eslint/utils@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))':
+ '@vitest/eslint-plugin@1.1.31(@typescript-eslint/utils@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@typescript-eslint/utils': 8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.20.1(jiti@2.4.2)
optionalDependencies:
typescript: 5.7.3
- vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
+ vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(@vitest/browser@3.0.6)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
'@vitest/expect@3.0.6':
dependencies:
@@ -14578,12 +14883,13 @@ snapshots:
chai: 5.2.0
tinyrainbow: 2.0.0
- '@vitest/mocker@3.0.6(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))':
+ '@vitest/mocker@3.0.6(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@vitest/spy': 3.0.6
estree-walker: 3.0.3
magic-string: 0.30.17
optionalDependencies:
+ msw: 2.7.1(@types/node@22.13.4)(typescript@5.7.3)
vite: 6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
'@vitest/pretty-format@3.0.6':
@@ -15214,6 +15520,10 @@ snapshots:
dependencies:
string-width: 4.2.3
+ ansi-escapes@4.3.2:
+ dependencies:
+ type-fest: 0.21.3
+
ansi-escapes@7.0.0:
dependencies:
environment: 1.1.0
@@ -15226,6 +15536,8 @@ snapshots:
dependencies:
color-convert: 2.0.1
+ ansi-styles@5.2.0: {}
+
ansi-styles@6.2.1: {}
ansis@3.15.0: {}
@@ -15358,6 +15670,10 @@ snapshots:
dependencies:
tslib: 2.8.1
+ aria-query@5.3.0:
+ dependencies:
+ dequal: 2.0.3
+
aria-query@5.3.2: {}
array-back@3.1.0: {}
@@ -15984,6 +16300,8 @@ snapshots:
slice-ansi: 5.0.0
string-width: 7.0.0
+ cli-width@4.1.0: {}
+
clipboardy@4.0.0:
dependencies:
execa: 8.0.1
@@ -16452,6 +16770,8 @@ snapshots:
dependencies:
esutils: 2.0.3
+ dom-accessibility-api@0.5.16: {}
+
dom-serializer@1.4.1:
dependencies:
domelementtype: 2.3.0
@@ -17662,6 +17982,9 @@ snapshots:
fs.realpath@1.0.0: {}
+ fsevents@2.3.2:
+ optional: true
+
fsevents@2.3.3:
optional: true
@@ -17864,6 +18187,8 @@ snapshots:
graphemer@1.4.0: {}
+ graphql@16.10.0: {}
+
gray-matter@4.0.3:
dependencies:
js-yaml: 3.14.1
@@ -18111,6 +18436,8 @@ snapshots:
he@1.2.0: {}
+ headers-polyfill@4.0.3: {}
+
hey-listen@1.0.8: {}
hookable@5.5.3: {}
@@ -18380,6 +18707,8 @@ snapshots:
is-negative-zero@2.0.2: {}
+ is-node-process@1.2.0: {}
+
is-number-object@1.0.7:
dependencies:
has-tostringtag: 1.0.0
@@ -18842,6 +19171,8 @@ snapshots:
dependencies:
yallist: 4.0.0
+ lz-string@1.5.0: {}
+
macaddress@0.5.3: {}
magic-bytes.js@1.10.0: {}
@@ -19639,8 +19970,35 @@ snapshots:
ms@2.1.3: {}
+ msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3):
+ dependencies:
+ '@bundled-es-modules/cookie': 2.0.1
+ '@bundled-es-modules/statuses': 1.0.1
+ '@bundled-es-modules/tough-cookie': 0.1.6
+ '@inquirer/confirm': 5.1.6(@types/node@22.13.4)
+ '@mswjs/interceptors': 0.37.6
+ '@open-draft/deferred-promise': 2.2.0
+ '@open-draft/until': 2.1.0
+ '@types/cookie': 0.6.0
+ '@types/statuses': 2.0.5
+ graphql: 16.10.0
+ headers-polyfill: 4.0.3
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ path-to-regexp: 6.3.0
+ picocolors: 1.1.1
+ strict-event-emitter: 0.5.1
+ type-fest: 4.33.0
+ yargs: 17.7.2
+ optionalDependencies:
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - '@types/node'
+
muggle-string@0.4.1: {}
+ mute-stream@2.0.0: {}
+
nanoid@3.3.8: {}
nanoid@5.0.9: {}
@@ -19668,9 +20026,9 @@ snapshots:
neotraverse@0.6.18: {}
- neuri@0.0.22(@types/json-schema@7.0.15)(@typeschema/valibot@0.14.0(@types/json-schema@7.0.15))(@typeschema/zod@0.14.0(@types/json-schema@7.0.15)(zod-to-json-schema@3.24.1(zod@3.24.2))(zod@3.24.2))(encoding@0.1.13)(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod-to-json-schema@3.24.1(zod@3.24.2))(zod@3.24.2):
+ neuri@0.0.22(@types/json-schema@7.0.15)(@typeschema/valibot@0.14.0(@types/json-schema@7.0.15))(@typeschema/zod@0.14.0(@types/json-schema@7.0.15)(zod-to-json-schema@3.24.1(zod@3.24.2))(zod@3.24.2))(encoding@0.1.13)(vitest@3.0.6)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod-to-json-schema@3.24.1(zod@3.24.2))(zod@3.24.2):
dependencies:
- '@fetch-mock/vitest': 0.2.8(vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))
+ '@fetch-mock/vitest': 0.2.8(vitest@3.0.6)
'@guiiai/logg': 1.0.7
'@typeschema/main': 0.14.1(@types/json-schema@7.0.15)(@typeschema/valibot@0.14.0(@types/json-schema@7.0.15))(@typeschema/zod@0.14.0(@types/json-schema@7.0.15)(zod-to-json-schema@3.24.1(zod@3.24.2))(zod@3.24.2))
'@xsai/generate-text': 0.1.0-beta.5
@@ -19952,6 +20310,8 @@ snapshots:
opusscript@0.1.1: {}
+ outvariant@1.4.3: {}
+
oxc-resolver@3.0.3:
optionalDependencies:
'@oxc-resolver/binding-darwin-arm64': 3.0.3
@@ -20098,6 +20458,8 @@ snapshots:
path-to-regexp@0.1.12: {}
+ path-to-regexp@6.3.0: {}
+
path-type@5.0.0:
optional: true
@@ -20187,13 +20549,13 @@ snapshots:
pinkie@2.0.4: {}
- pixi-filters@4.2.0(5af797a0b5bd919a06578c24a7479046):
+ pixi-filters@4.2.0(loysptdgmjku7omjbg7krwlz24):
dependencies:
'@pixi/filter-adjustment': 4.2.0(@pixi/constants@6.5.10)(@pixi/core@6.5.10(@pixi/constants@6.5.10)(@pixi/extensions@6.5.10)(@pixi/math@6.5.10)(@pixi/runner@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))))
'@pixi/filter-advanced-bloom': 4.2.0(@pixi/constants@6.5.10)(@pixi/core@6.5.10(@pixi/constants@6.5.10)(@pixi/extensions@6.5.10)(@pixi/math@6.5.10)(@pixi/runner@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))))(@pixi/math@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))
'@pixi/filter-ascii': 4.2.0(@pixi/core@6.5.10(@pixi/constants@6.5.10)(@pixi/extensions@6.5.10)(@pixi/math@6.5.10)(@pixi/runner@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))))
'@pixi/filter-bevel': 4.2.0(@pixi/core@6.5.10(@pixi/constants@6.5.10)(@pixi/extensions@6.5.10)(@pixi/math@6.5.10)(@pixi/runner@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))))(@pixi/math@6.5.10)(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))
- '@pixi/filter-bloom': 4.2.0(84172d5a9c3f97ab2b843c48c30bfc44)
+ '@pixi/filter-bloom': 4.2.0(7n6ylgx4tbwrexny4hitvaigqm)
'@pixi/filter-bulge-pinch': 4.2.0(@pixi/constants@6.5.10)(@pixi/core@6.5.10(@pixi/constants@6.5.10)(@pixi/extensions@6.5.10)(@pixi/math@6.5.10)(@pixi/runner@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))))(@pixi/math@6.5.10)
'@pixi/filter-color-map': 4.2.0(@pixi/constants@6.5.10)(@pixi/core@6.5.10(@pixi/constants@6.5.10)(@pixi/extensions@6.5.10)(@pixi/math@6.5.10)(@pixi/runner@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))))
'@pixi/filter-color-overlay': 4.2.0(@pixi/core@6.5.10(@pixi/constants@6.5.10)(@pixi/extensions@6.5.10)(@pixi/math@6.5.10)(@pixi/runner@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))
@@ -20230,7 +20592,7 @@ snapshots:
- '@pixi/settings'
- '@pixi/utils'
- pixi-live2d-display@0.4.0(0736f5bd67d2e4de7e9fff36ad63fa2e):
+ pixi-live2d-display@0.4.0(76g3zz2nt7dtjnktvdvk76m2oe):
dependencies:
'@pixi/core': 6.5.10(@pixi/constants@6.5.10)(@pixi/extensions@6.5.10)(@pixi/math@6.5.10)(@pixi/runner@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))
'@pixi/display': 6.5.10(@pixi/constants@6.5.10)(@pixi/math@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10))(@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10(@pixi/constants@6.5.10)))
@@ -20258,6 +20620,14 @@ snapshots:
platform@1.3.6: {}
+ playwright-core@1.50.1: {}
+
+ playwright@1.50.1:
+ dependencies:
+ playwright-core: 1.50.1
+ optionalDependencies:
+ fsevents: 2.3.2
+
plist@3.1.0:
dependencies:
'@xmldom/xmldom': 0.8.10
@@ -20499,6 +20869,12 @@ snapshots:
pretty-bytes@6.1.1: {}
+ pretty-format@27.5.1:
+ dependencies:
+ ansi-regex: 5.0.1
+ ansi-styles: 5.2.0
+ react-is: 17.0.2
+
pretty-ms@9.2.0:
dependencies:
parse-ms: 4.0.0
@@ -20719,6 +21095,10 @@ snapshots:
prr@1.0.1:
optional: true
+ psl@1.15.0:
+ dependencies:
+ punycode: 2.3.1
+
pump@3.0.2:
dependencies:
end-of-stream: 1.4.4
@@ -20738,6 +21118,8 @@ snapshots:
dependencies:
side-channel: 1.0.6
+ querystringify@2.2.0: {}
+
queue-microtask@1.2.3: {}
quick-lru@5.1.1: {}
@@ -20786,6 +21168,8 @@ snapshots:
defu: 6.1.4
destr: 2.0.3
+ react-is@17.0.2: {}
+
react@18.3.1:
dependencies:
loose-envify: 1.4.0
@@ -21057,6 +21441,8 @@ snapshots:
require-self@0.2.3: {}
+ requires-port@1.0.0: {}
+
resolve-alpn@1.2.1: {}
resolve-from@4.0.0: {}
@@ -21395,6 +21781,12 @@ snapshots:
mrmime: 2.0.0
totalist: 3.0.1
+ sirv@3.0.1:
+ dependencies:
+ '@polka/url': 1.0.0-next.24
+ mrmime: 2.0.0
+ totalist: 3.0.1
+
sisteransi@1.0.5: {}
sitemap@8.0.0:
@@ -21554,6 +21946,8 @@ snapshots:
strict-event-emitter-types@2.0.0: {}
+ strict-event-emitter@0.5.1: {}
+
string-argv@0.3.2: {}
string-width@4.2.3:
@@ -21897,6 +22291,13 @@ snapshots:
totalist@3.0.1: {}
+ tough-cookie@4.1.4:
+ dependencies:
+ psl: 1.15.0
+ punycode: 2.3.1
+ universalify: 0.2.0
+ url-parse: 1.5.10
+
tough-cookie@5.0.0:
dependencies:
tldts: 6.1.61
@@ -21979,6 +22380,8 @@ snapshots:
type-fest@0.20.2: {}
+ type-fest@0.21.3: {}
+
type-fest@4.33.0: {}
type-is@1.6.18:
@@ -22265,6 +22668,8 @@ snapshots:
universalify@0.1.2: {}
+ universalify@0.2.0: {}
+
universalify@2.0.0: {}
unocss@66.0.0(postcss@8.4.49)(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)):
@@ -22597,6 +23002,11 @@ snapshots:
url-join@4.0.1: {}
+ url-parse@1.5.10:
+ dependencies:
+ querystringify: 2.2.0
+ requires-port: 1.0.0
+
url@0.11.4:
dependencies:
punycode: 1.4.1
@@ -22843,10 +23253,10 @@ snapshots:
optionalDependencies:
vite: 6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0)
- vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0):
+ vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.4)(@vitest/browser@3.0.6)(jiti@2.4.2)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.2.1)(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0):
dependencies:
'@vitest/expect': 3.0.6
- '@vitest/mocker': 3.0.6(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))
+ '@vitest/mocker': 3.0.6(msw@2.7.1(@types/node@22.13.4)(typescript@5.7.3))(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))
'@vitest/pretty-format': 3.0.6
'@vitest/runner': 3.0.6
'@vitest/snapshot': 3.0.6
@@ -22868,6 +23278,7 @@ snapshots:
optionalDependencies:
'@types/debug': 4.1.12
'@types/node': 22.13.4
+ '@vitest/browser': 3.0.6(@types/node@22.13.4)(bufferutil@4.0.9)(playwright@1.50.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(less@4.2.1)(terser@5.17.6)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.6)
jsdom: 25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
transitivePeerDependencies:
- jiti
@@ -23149,6 +23560,12 @@ snapshots:
'@types/trusted-types': 2.0.3
workbox-core: 7.3.0
+ wrap-ansi@6.2.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
wrap-ansi@7.0.0:
dependencies:
ansi-styles: 4.3.0
@@ -23263,6 +23680,8 @@ snapshots:
dependencies:
yoctocolors: 2.1.1
+ yoctocolors-cjs@2.1.2: {}
+
yoctocolors@2.1.1: {}
zhead@2.2.4: {}