diff --git a/.changeset/itchy-years-drop.md b/.changeset/itchy-years-drop.md new file mode 100644 index 000000000..c43e86d6f --- /dev/null +++ b/.changeset/itchy-years-drop.md @@ -0,0 +1,5 @@ +--- +'@powersync/common': minor +--- + +Updated watch functions to recalculate depedendent tables if schema is updated. diff --git a/.changeset/short-owls-play.md b/.changeset/short-owls-play.md new file mode 100644 index 000000000..ba5949dd7 --- /dev/null +++ b/.changeset/short-owls-play.md @@ -0,0 +1,7 @@ +--- +'@powersync/op-sqlite': minor +'@powersync/react-native': minor +'@powersync/web': minor +--- + +Added `refreshSchema()` which will cause all connections to be aware of a schema change. diff --git a/.changeset/ten-birds-camp.md b/.changeset/ten-birds-camp.md new file mode 100644 index 000000000..60753b254 --- /dev/null +++ b/.changeset/ten-birds-camp.md @@ -0,0 +1,5 @@ +--- +'@powersync/vue': patch +--- + +Queries will recalculate dependent tables if schema is updated. diff --git a/.changeset/tender-llamas-shop.md b/.changeset/tender-llamas-shop.md new file mode 100644 index 000000000..4a3cb39ac --- /dev/null +++ b/.changeset/tender-llamas-shop.md @@ -0,0 +1,6 @@ +--- +'@powersync/tanstack-react-query': patch +'@powersync/react': patch +--- + +Queries will recalculate dependent tables if schema is updated. diff --git a/demos/react-supabase-todolist-optional-sync/src/app/views/layout.tsx b/demos/react-supabase-todolist-optional-sync/src/app/views/layout.tsx index c2d152e72..fd3c787d4 100644 --- a/demos/react-supabase-todolist-optional-sync/src/app/views/layout.tsx +++ b/demos/react-supabase-todolist-optional-sync/src/app/views/layout.tsx @@ -58,7 +58,7 @@ export default function ViewsLayout({ children }: { children: React.ReactNode }) beforeNavigate: async () => { // If user is logged in, sign out and stay on the current page if (supabase?.currentSession) { - await supabase?.client.auth.signOut(); + await supabase?.logout(); await powerSync.disconnectAndClear(); setSyncEnabled(powerSync.database.name, false); diff --git a/demos/react-supabase-todolist-optional-sync/src/library/powersync/SupabaseConnector.ts b/demos/react-supabase-todolist-optional-sync/src/library/powersync/SupabaseConnector.ts index cefed43be..c999c3b17 100644 --- a/demos/react-supabase-todolist-optional-sync/src/library/powersync/SupabaseConnector.ts +++ b/demos/react-supabase-todolist-optional-sync/src/library/powersync/SupabaseConnector.ts @@ -93,6 +93,11 @@ export class SupabaseConnector extends BaseObserver i this.updateSession(session); } + async logout() { + await this.client.auth.signOut(); + this.updateSession(null); + } + async fetchCredentials() { const { data: { session }, diff --git a/packages/common/src/client/AbstractPowerSyncDatabase.ts b/packages/common/src/client/AbstractPowerSyncDatabase.ts index fc2be124f..d9927c5bf 100644 --- a/packages/common/src/client/AbstractPowerSyncDatabase.ts +++ b/packages/common/src/client/AbstractPowerSyncDatabase.ts @@ -28,6 +28,7 @@ import { StreamingSyncImplementation, StreamingSyncImplementationListener } from './sync/stream/AbstractStreamingSyncImplementation.js'; +import { runOnSchemaChange } from './runOnSchemaChange.js'; export interface DisconnectAndClearOptions { /** When set to false, data in local-only tables is preserved. */ @@ -103,6 +104,7 @@ export interface WatchOnChangeHandler { export interface PowerSyncDBListener extends StreamingSyncImplementationListener { initialized: () => void; + schemaChanged: (schema: Schema) => void; } export interface PowerSyncCloseOptions { @@ -360,7 +362,10 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver cb.schemaChanged?.(schema)); } /** @@ -758,10 +763,9 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver { + const watchQuery = async (abortSignal: AbortSignal) => { try { const resolvedTables = await this.resolveTables(sql, parameters, options); - // Fetch initial data const result = await this.executeReadOnly(sql, parameters); onResult(result); @@ -780,13 +784,17 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver { return new EventIterator((eventOptions) => { - (async () => { - const resolvedTables = await this.resolveTables(sql, parameters, options); + const handler: WatchHandler = { + onResult: (result) => { + eventOptions.push(result); + }, + onError: (error) => { + eventOptions.fail(error); + } + }; - // Fetch initial data - eventOptions.push(await this.executeReadOnly(sql, parameters)); + this.watchWithCallback(sql, parameters, handler, options); - for await (const event of this.onChangeWithAsyncGenerator({ - ...(options ?? {}), - tables: resolvedTables - })) { - eventOptions.push(await this.executeReadOnly(sql, parameters)); - } - })(); + options?.signal?.addEventListener('abort', () => { + eventOptions.stop(); + }); }); } diff --git a/packages/common/src/client/runOnSchemaChange.ts b/packages/common/src/client/runOnSchemaChange.ts new file mode 100644 index 000000000..7151849a6 --- /dev/null +++ b/packages/common/src/client/runOnSchemaChange.ts @@ -0,0 +1,31 @@ +import { AbstractPowerSyncDatabase, SQLWatchOptions } from './AbstractPowerSyncDatabase.js'; + +export function runOnSchemaChange( + callback: (signal: AbortSignal) => void, + db: AbstractPowerSyncDatabase, + options?: SQLWatchOptions +): void { + const triggerWatchedQuery = () => { + const abortController = new AbortController(); + let disposeSchemaListener: (() => void) | null = null; + const stopWatching = () => { + abortController.abort('Abort triggered'); + disposeSchemaListener?.(); + disposeSchemaListener = null; + // Stop listening to upstream abort for this watch + options?.signal?.removeEventListener('abort', stopWatching); + }; + + options?.signal?.addEventListener('abort', stopWatching); + disposeSchemaListener = db.registerListener({ + schemaChanged: async () => { + stopWatching(); + // Re trigger the watched query (recursively), setTimeout ensures that we don't modify the list of listeners while iterating through them + setTimeout(() => triggerWatchedQuery(), 0); + } + }); + callback(abortController.signal); + }; + + triggerWatchedQuery(); +} diff --git a/packages/common/src/db/DBAdapter.ts b/packages/common/src/db/DBAdapter.ts index 052ccf20d..56085284e 100644 --- a/packages/common/src/db/DBAdapter.ts +++ b/packages/common/src/db/DBAdapter.ts @@ -101,6 +101,10 @@ export interface DBAdapter extends BaseObserverInterface, DBG readTransaction: (fn: (tx: Transaction) => Promise, options?: DBLockOptions) => Promise; writeLock: (fn: (tx: LockContext) => Promise, options?: DBLockOptions) => Promise; writeTransaction: (fn: (tx: Transaction) => Promise, options?: DBLockOptions) => Promise; + /** + * This method refreshes the schema information across all connections. This is for advanced use cases, and should generally not be needed. + */ + refreshSchema: () => Promise; } export function isBatchedUpdateNotification( diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 44e5c947c..b55cca847 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -4,6 +4,7 @@ export * from './client/SQLOpenFactory.js'; export * from './client/connection/PowerSyncBackendConnector.js'; export * from './client/connection/PowerSyncCredentials.js'; export * from './client/sync/bucket/BucketStorageAdapter.js'; +export { runOnSchemaChange } from './client/runOnSchemaChange.js'; export { UpdateType, CrudEntry, OpId } from './client/sync/bucket/CrudEntry.js'; export * from './client/sync/bucket/SqliteBucketStorage.js'; export * from './client/sync/bucket/CrudBatch.js'; diff --git a/packages/powersync-op-sqlite/src/db/OPSQLiteConnection.ts b/packages/powersync-op-sqlite/src/db/OPSQLiteConnection.ts index 5c3a1cbc6..3e342b56a 100644 --- a/packages/powersync-op-sqlite/src/db/OPSQLiteConnection.ts +++ b/packages/powersync-op-sqlite/src/db/OPSQLiteConnection.ts @@ -79,4 +79,8 @@ export class OPSQLiteConnection extends BaseObserver { } return result as T; } + + async refreshSchema() { + await this.get("PRAGMA table_info('sqlite_master')"); + } } diff --git a/packages/powersync-op-sqlite/src/db/OPSqliteAdapter.ts b/packages/powersync-op-sqlite/src/db/OPSqliteAdapter.ts index 000e7be83..37a962ef1 100644 --- a/packages/powersync-op-sqlite/src/db/OPSqliteAdapter.ts +++ b/packages/powersync-op-sqlite/src/db/OPSqliteAdapter.ts @@ -271,4 +271,13 @@ export class OPSQLiteDBAdapter extends BaseObserver implement throw ex; } } + + async refreshSchema(): Promise { + await this.initialized; + await this.writeConnection!.refreshSchema(); + + for (let readConnection of this.readConnections) { + await readConnection.connection.refreshSchema(); + } + } } diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 84b153299..35acf9f04 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -30,8 +30,8 @@ }, "homepage": "https://docs.powersync.com/", "peerDependencies": { - "@journeyapps/react-native-quick-sqlite": "^2.0.0", - "@powersync/common": "workspace:^1.20.2", + "@journeyapps/react-native-quick-sqlite": "^2.1.0", + "@powersync/common": "workspace:^1.20.1", "react": "*", "react-native": "*" }, @@ -46,7 +46,7 @@ }, "devDependencies": { "@craftzdog/react-native-buffer": "^6.0.5", - "@journeyapps/react-native-quick-sqlite": "^2.0.0", + "@journeyapps/react-native-quick-sqlite": "^2.1.0", "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-inject": "^5.0.5", diff --git a/packages/react-native/src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts b/packages/react-native/src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts index d70108b94..2b82d74f2 100644 --- a/packages/react-native/src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts +++ b/packages/react-native/src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts @@ -124,4 +124,8 @@ export class RNQSDBAdapter extends BaseObserver implements DB } }; } + + async refreshSchema() { + await this.baseDB.refreshSchema(); + } } diff --git a/packages/react/src/WatchedQuery.ts b/packages/react/src/WatchedQuery.ts index 05639ffd1..be52a0085 100644 --- a/packages/react/src/WatchedQuery.ts +++ b/packages/react/src/WatchedQuery.ts @@ -1,4 +1,11 @@ -import { AbstractPowerSyncDatabase, BaseListener, BaseObserver, CompilableQuery, Disposable } from '@powersync/common'; +import { + AbstractPowerSyncDatabase, + BaseListener, + BaseObserver, + CompilableQuery, + Disposable, + runOnSchemaChange +} from '@powersync/common'; import { AdditionalOptions } from './hooks/useQuery'; export class Query { @@ -117,7 +124,7 @@ export class WatchedQuery extends BaseObserver implements this.setError(error); }; - (async () => { + const watchQuery = async (abortSignal: AbortSignal) => { await this.fetchTables(); await this.fetchData(); @@ -131,12 +138,13 @@ export class WatchedQuery extends BaseObserver implements }, { ...this.options, - signal: this.controller.signal, + signal: abortSignal, tables: this.tables } ); } - })(); + }; + runOnSchemaChange(watchQuery, this.db, { signal: this.controller.signal }); } private setData(results: any[]) { diff --git a/packages/react/src/hooks/useQuery.ts b/packages/react/src/hooks/useQuery.ts index 257450604..3559928cd 100644 --- a/packages/react/src/hooks/useQuery.ts +++ b/packages/react/src/hooks/useQuery.ts @@ -118,10 +118,18 @@ export const useQuery = ( }; React.useEffect(() => { - (async () => { + const updateData = async () => { await fetchTables(); await fetchData(); - })(); + }; + + updateData(); + + const l = powerSync.registerListener({ + schemaChanged: updateData + }); + + return () => l?.(); }, [powerSync, memoizedParams, sqlStatement]); React.useEffect(() => { diff --git a/packages/react/tests/useQuery.test.tsx b/packages/react/tests/useQuery.test.tsx index 2b9e61589..0941e8fb1 100644 --- a/packages/react/tests/useQuery.test.tsx +++ b/packages/react/tests/useQuery.test.tsx @@ -7,9 +7,7 @@ import { useQuery } from '../src/hooks/useQuery'; const mockPowerSync = { currentStatus: { status: 'initial' }, - registerListener: vi.fn(() => ({ - statusChanged: vi.fn(() => 'updated') - })), + registerListener: vi.fn(() => {}), resolveTables: vi.fn(() => ['table1', 'table2']), onChangeWithCallback: vi.fn(), getAll: vi.fn(() => Promise.resolve(['list1', 'list2'])) @@ -92,9 +90,7 @@ describe('useQuery', () => { it('should set error when error occurs and runQueryOnce flag is set', async () => { const mockPowerSyncError = { currentStatus: { status: 'initial' }, - registerListener: vi.fn(() => ({ - statusChanged: vi.fn(() => 'updated') - })), + registerListener: vi.fn(() => {}), onChangeWithCallback: vi.fn(), resolveTables: vi.fn(() => ['table1', 'table2']), getAll: vi.fn(() => { @@ -119,9 +115,7 @@ describe('useQuery', () => { it('should set error when error occurs', async () => { const mockPowerSyncError = { currentStatus: { status: 'initial' }, - registerListener: vi.fn(() => ({ - statusChanged: vi.fn(() => 'updated') - })), + registerListener: vi.fn(() => {}), onChangeWithCallback: vi.fn(), resolveTables: vi.fn(() => ['table1', 'table2']), getAll: vi.fn(() => { diff --git a/packages/react/tests/useStatus.test.tsx b/packages/react/tests/useStatus.test.tsx index 2fd221f29..f525e793e 100644 --- a/packages/react/tests/useStatus.test.tsx +++ b/packages/react/tests/useStatus.test.tsx @@ -33,9 +33,7 @@ describe('useStatus', () => { it.skip('should update the status when the listener is called', () => { const mockPowerSyncInTest = { currentStatus: { status: 'initial' }, - registerListener: () => ({ - statusChanged: () => 'updated' - }) + registerListener: vi.fn(() => {}) }; const wrapper = ({ children }) => ( diff --git a/packages/react/tests/useSuspenseQuery.test.tsx b/packages/react/tests/useSuspenseQuery.test.tsx index 6deca29f7..f83c164d2 100644 --- a/packages/react/tests/useSuspenseQuery.test.tsx +++ b/packages/react/tests/useSuspenseQuery.test.tsx @@ -11,9 +11,7 @@ const defaultQueryResult = ['list1', 'list2']; const createMockPowerSync = () => { return { currentStatus: { status: 'initial' }, - registerListener: vi.fn(() => ({ - statusChanged: vi.fn(() => 'updated') - })), + registerListener: vi.fn(() => {}), resolveTables: vi.fn(() => ['table1', 'table2']), onChangeWithCallback: vi.fn(), getAll: vi.fn(() => Promise.resolve(defaultQueryResult)) as Mock diff --git a/packages/tanstack-react-query/src/hooks/useQuery.ts b/packages/tanstack-react-query/src/hooks/useQuery.ts index e47d7388c..8c24bc569 100644 --- a/packages/tanstack-react-query/src/hooks/useQuery.ts +++ b/packages/tanstack-react-query/src/hooks/useQuery.ts @@ -102,11 +102,20 @@ function useQueryCore< }; React.useEffect(() => { - if (!query) return; + if (!query) return () => {}; (async () => { await fetchTables(); })(); + + const l = powerSync.registerListener({ + schemaChanged: async () => { + await fetchTables(); + queryClient.invalidateQueries({ queryKey: options.queryKey }); + } + }); + + return () => l?.(); }, [powerSync, sqlStatement, stringifiedParams]); const queryFn = React.useCallback(async () => { diff --git a/packages/vue/src/composables/useQuery.ts b/packages/vue/src/composables/useQuery.ts index dc4509309..57295e65a 100644 --- a/packages/vue/src/composables/useQuery.ts +++ b/packages/vue/src/composables/useQuery.ts @@ -1,4 +1,10 @@ -import { type CompilableQuery, ParsedQuery, type SQLWatchOptions, parseQuery } from '@powersync/common'; +import { + type CompilableQuery, + ParsedQuery, + type SQLWatchOptions, + parseQuery, + runOnSchemaChange +} from '@powersync/common'; import { type MaybeRef, type Ref, ref, toValue, watchEffect } from 'vue'; import { usePowerSync } from './powerSync'; @@ -114,38 +120,41 @@ export const useQuery = ( } const { sqlStatement: sql, parameters } = parsedQuery; + const watchQuery = async (abortSignal: AbortSignal) => { + let resolvedTables = []; + try { + resolvedTables = await powerSync.value.resolveTables(sql, parameters, options); + } catch (e) { + console.error('Failed to fetch tables:', e); + handleError(e); + return; + } + // Fetch initial data + const executor = + typeof queryValue == 'string' ? () => powerSync.value.getAll(sql, parameters) : () => queryValue.execute(); + fetchData = () => _fetchData(executor); + await fetchData(); + + if (options.runQueryOnce) { + return; + } - let resolvedTables = []; - try { - resolvedTables = await powerSync.value.resolveTables(sql, parameters, options); - } catch (e) { - console.error('Failed to fetch tables:', e); - handleError(e); - return; - } - // Fetch initial data - const executor = - typeof queryValue == 'string' ? () => powerSync.value.getAll(sql, parameters) : () => queryValue.execute(); - fetchData = () => _fetchData(executor); - await fetchData(); - - if (options.runQueryOnce) { - return; - } - - powerSync.value.onChangeWithCallback( - { - onChange: async () => { - await fetchData(); + powerSync.value.onChangeWithCallback( + { + onChange: async () => { + await fetchData(); + }, + onError: handleError }, - onError: handleError - }, - { - ...options, - signal: abortController.signal, - tables: resolvedTables - } - ); + { + ...options, + signal: abortSignal, + tables: resolvedTables + } + ); + }; + + runOnSchemaChange(watchQuery, powerSync.value, { signal: abortController.signal }); }); return { diff --git a/packages/vue/tests/useQuery.test.ts b/packages/vue/tests/useQuery.test.ts index ceac35e2f..76549edc8 100644 --- a/packages/vue/tests/useQuery.test.ts +++ b/packages/vue/tests/useQuery.test.ts @@ -7,9 +7,7 @@ import { withSetup } from './utils'; const mockPowerSync = { currentStatus: { status: 'initial' }, - registerListener: vi.fn(() => ({ - statusChanged: vi.fn(() => 'updated') - })), + registerListener: vi.fn(() => {}), resolveTables: vi.fn(), watch: vi.fn(), onChangeWithCallback: vi.fn(), @@ -33,13 +31,11 @@ describe('useQuery', () => { }); it('should handle error in watchEffect', async () => { - vi.spyOn(PowerSync, 'usePowerSync').mockReturnValue(ref({}) as any); + vi.spyOn(PowerSync, 'usePowerSync').mockReturnValue(undefined); const [{ data, isLoading, isFetching, error }] = withSetup(() => useQuery('SELECT * from lists')); - expect(error.value).toEqual( - Error('PowerSync failed to fetch data: powerSync.value.resolveTables is not a function') - ); + expect(error.value).toEqual(Error('PowerSync not configured.')); expect(isFetching.value).toEqual(false); expect(isLoading.value).toEqual(false); expect(data.value).toEqual([]); diff --git a/packages/web/src/db/adapters/SSRDBAdapter.ts b/packages/web/src/db/adapters/SSRDBAdapter.ts index a958ddede..b808d7477 100644 --- a/packages/web/src/db/adapters/SSRDBAdapter.ts +++ b/packages/web/src/db/adapters/SSRDBAdapter.ts @@ -85,4 +85,6 @@ export class SSRDBAdapter extends BaseObserver implements DBA } }; } + + async refreshSchema(): Promise {} } diff --git a/packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts b/packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts index c7d963f51..d8b12970a 100644 --- a/packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts +++ b/packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts @@ -275,4 +275,6 @@ export class WASQLiteDBAdapter extends BaseObserver implement } }; } + + async refreshSchema(): Promise {} } diff --git a/packages/web/tests/offline.test.ts b/packages/web/tests/offline.test.ts index bf7bf6fd3..65f894e58 100644 --- a/packages/web/tests/offline.test.ts +++ b/packages/web/tests/offline.test.ts @@ -1,67 +1,12 @@ import { AbstractPowerSyncDatabase, column, Schema, Table } from '@powersync/common'; import { PowerSyncDatabase } from '@powersync/web'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { makeOptionalSyncSchema } from './utils/optionalSyncTestSchema'; const assetId = '2290de4f-0488-4e50-abed-f8e8eb1d0b42'; const userId = '3390de4f-0488-4e50-abed-f8e8eb1d0b42'; const customerId = '4490de4f-0488-4e50-abed-f8e8eb1d0b42'; -const assetsDef = { - name: 'assets', - columns: { - created_at: column.text, - make: column.text, - model: column.text, - serial_number: column.text, - quantity: column.integer, - user_id: column.text, - customer_id: column.text, - description: column.text - }, - options: { indexes: { makemodel: ['make, model'] } } -}; - -const customersDef = { - name: 'customers', - columns: { - name: column.text, - email: column.text - }, - options: {} -}; - -function makeSchema(synced: boolean) { - const syncedName = (table: string): string => { - if (synced) { - return table; - } else { - return `inactive_synced_${table}`; - } - }; - - const localName = (table: string): string => { - if (synced) { - return `inactive_local_${table}`; - } else { - return table; - } - }; - return new Schema({ - assets: new Table(assetsDef.columns, { ...assetsDef.options, viewName: syncedName(assetsDef.name) }), - local_assets: new Table(assetsDef.columns, { - ...assetsDef.options, - localOnly: true, - viewName: localName(assetsDef.name) - }), - customers: new Table(customersDef.columns, { ...customersDef.options, viewName: syncedName(customersDef.name) }), - local_customers: new Table(customersDef.columns, { - ...customersDef.options, - localOnly: true, - viewName: localName(customersDef.name) - }) - }); -} - describe('Schema Tests', () => { let db: AbstractPowerSyncDatabase; @@ -73,7 +18,7 @@ describe('Schema Tests', () => { * consistent */ database: { dbFilename: 'test.db' }, - schema: makeSchema(false), + schema: makeOptionalSyncSchema(false), flags: { enableMultiTabs: false } @@ -98,7 +43,7 @@ describe('Schema Tests', () => { expect(await db.getAll('SELECT data FROM ps_crud ORDER BY id')).toEqual([]); // Now switch to the "online" schema - await db.updateSchema(makeSchema(true)); + await db.updateSchema(makeOptionalSyncSchema(true)); // Note that updateSchema cannot be called inside a transaction, and there // is a possibility of crash between updating the schema, and when the data @@ -148,7 +93,7 @@ describe('Schema Tests', () => { const customerWatchTables = await getSourceTables(db, 'SELECT * FROM customers'); expect(customerWatchTables.includes('ps_data_local__local_customers')).toBeTruthy(); - await db.updateSchema(makeSchema(true)); + await db.updateSchema(makeOptionalSyncSchema(true)); const onlineCustomerWatchTables = await getSourceTables(db, 'SELECT * FROM customers'); expect(onlineCustomerWatchTables.includes('ps_data__customers')).toBeTruthy(); diff --git a/packages/web/tests/utils/optionalSyncTestSchema.ts b/packages/web/tests/utils/optionalSyncTestSchema.ts new file mode 100644 index 000000000..7d734314c --- /dev/null +++ b/packages/web/tests/utils/optionalSyncTestSchema.ts @@ -0,0 +1,58 @@ +import { column, Schema, Table } from '@powersync/common'; + +const assetsDef = { + name: 'assets', + columns: { + created_at: column.text, + make: column.text, + model: column.text, + serial_number: column.text, + quantity: column.integer, + user_id: column.text, + customer_id: column.text, + description: column.text + }, + options: {} +}; + +const customersDef = { + name: 'customers', + columns: { + name: column.text, + email: column.text + }, + options: {} +}; + +export function makeOptionalSyncSchema(synced: boolean) { + const syncedName = (table: string): string => { + if (synced) { + return table; + } else { + return `inactive_synced_${table}`; + } + }; + + const localName = (table: string): string => { + if (synced) { + return `inactive_local_${table}`; + } else { + return table; + } + }; + + return new Schema({ + assets: new Table(assetsDef.columns, { ...assetsDef.options, viewName: syncedName(assetsDef.name) }), + local_assets: new Table(assetsDef.columns, { + ...assetsDef.options, + localOnly: true, + viewName: localName(assetsDef.name) + }), + customers: new Table(customersDef.columns, { ...customersDef.options, viewName: syncedName(customersDef.name) }), + local_customers: new Table(customersDef.columns, { + ...customersDef.options, + localOnly: true, + viewName: localName(customersDef.name) + }) + }); +} diff --git a/packages/web/tests/watch.test.ts b/packages/web/tests/watch.test.ts index 6765d80d0..0320debf9 100644 --- a/packages/web/tests/watch.test.ts +++ b/packages/web/tests/watch.test.ts @@ -1,8 +1,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { v4 as uuid } from 'uuid'; -import { AbstractPowerSyncDatabase } from '@powersync/common'; +import { AbstractPowerSyncDatabase, QueryResult } from '@powersync/common'; import { PowerSyncDatabase } from '@powersync/web'; import { testSchema } from './utils/testDb'; +import { makeOptionalSyncSchema } from './utils/optionalSyncTestSchema'; vi.useRealTimers(); /** @@ -26,6 +27,7 @@ describe('Watch Tests', () => { enableMultiTabs: false } }); + await powersync.init(); }); afterEach(async () => { @@ -83,6 +85,7 @@ describe('Watch Tests', () => { const receivedUpdates = new Promise((resolve) => { const onUpdate = () => { receivedUpdatesCount++; + if (receivedUpdatesCount == updatesCount) { abortController.abort(); resolve(); @@ -286,25 +289,27 @@ describe('Watch Tests', () => { }); it('should throttle watch callback overflow', async () => { - const abortController = new AbortController(); - + const overflowAbortController = new AbortController(); const updatesCount = 25; let receivedWithManagedOverflowCount = 0; - const onResultOverflow = () => { - receivedWithManagedOverflowCount++; - }; + const firstResultReceived = new Promise((resolve) => { + const onResultOverflow = () => { + if (receivedWithManagedOverflowCount === 0) { + resolve(); + } + receivedWithManagedOverflowCount++; + }; - const overflowAbortController = new AbortController(); - powersync.watch( - 'SELECT count() AS count FROM assets', - [], - { onResult: onResultOverflow }, - { signal: overflowAbortController.signal, throttleMs: 1 } - ); + powersync.watch( + 'SELECT count() AS count FROM assets', + [], + { onResult: onResultOverflow }, + { signal: overflowAbortController.signal, throttleMs: 1 } + ); + }); - // Allows us to count the number of updates received without the initial trigger - await new Promise((resolve) => setTimeout(resolve, 1 * throttleDuration)); + await firstResultReceived; // Perform a large number of inserts to trigger overflow for (let i = 0; i < updatesCount; i++) { @@ -313,10 +318,10 @@ describe('Watch Tests', () => { await new Promise((resolve) => setTimeout(resolve, 1 * throttleDuration)); - abortController.abort(); overflowAbortController.abort(); - // Initial onResult plus two left after overflow was throttled for onChange triggers - expect(receivedWithManagedOverflowCount).toBe(3); + // This fluctuates between 3 and 4 based on timing, but should never be 25 + expect(receivedWithManagedOverflowCount).greaterThan(2); + expect(receivedWithManagedOverflowCount).toBeLessThanOrEqual(4); }); }); diff --git a/packages/web/tests/watchSchemaChange.test.ts b/packages/web/tests/watchSchemaChange.test.ts new file mode 100644 index 000000000..a9c0e5f62 --- /dev/null +++ b/packages/web/tests/watchSchemaChange.test.ts @@ -0,0 +1,166 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { v4 as uuid } from 'uuid'; +import { AbstractPowerSyncDatabase, QueryResult } from '@powersync/common'; +import { PowerSyncDatabase } from '@powersync/web'; +import { makeOptionalSyncSchema } from './utils/optionalSyncTestSchema'; +vi.useRealTimers(); + +/** + * There seems to be an issue with Vitest browser mode's setTimeout and + * fake timer functionality. + * e.g. calling: + * await new Promise((resolve) => setTimeout(resolve, 10)); + * waits for 1 second instead of 10ms. + * Setting this to 1 second as a work around. + */ +const throttleDuration = 1000; + +describe('Watch With Schema Change Tests', () => { + let powersync: AbstractPowerSyncDatabase; + + beforeEach(async () => { + powersync = new PowerSyncDatabase({ + database: { dbFilename: 'test-watch-optional-sync.db' }, + schema: makeOptionalSyncSchema(false), + flags: { + enableMultiTabs: false + } + }); + await powersync.init(); + }); + + afterEach(async () => { + await powersync.disconnectAndClear(); + await powersync.close(); + }); + + it('should trigger onResult after schema change', async () => { + const userId = uuid(); + const abortController = new AbortController(); + + let lastResult = 0; + const query = 'SELECT count() AS count FROM assets'; + + const watch = powersync.watch(query, [], { + signal: abortController.signal, + throttleMs: throttleDuration + }); + + const assetsWatchTables = await getSourceTables(powersync, query); + expect(assetsWatchTables.includes('ps_data_local__local_assets')).toBeTruthy(); + + (async () => { + for await (const results of watch) { + lastResult = results.rows?._array[0].count; // `count` from sql output + } + })(); + + // Insert 3 records + for (let i = 0; i < 3; i++) { + await powersync.execute('INSERT INTO assets(id, make, customer_id) VALUES (uuid(), ?, ?)', ['test', userId]); + } + await new Promise((resolve) => setTimeout(resolve, throttleDuration * 2)); + + expect(lastResult).toBe(3); + + // changes the underlying table that the `assets` and `customers` views are based on + await powersync.updateSchema(makeOptionalSyncSchema(true)); + + const onlineAssetsWatchTables = await getSourceTables(powersync, query); + expect(onlineAssetsWatchTables.includes('ps_data__assets')).toBeTruthy(); + + await powersync.writeTransaction(async (tx) => { + // Copy local data to the "online" views. + await tx.execute( + 'INSERT INTO assets(id, description, customer_id, user_id) SELECT id, description, customer_id, ? FROM inactive_local_assets', + [userId] + ); + + // Delete the "local-only" data. + await tx.execute('DELETE FROM inactive_local_customers'); + await tx.execute('DELETE FROM inactive_local_assets'); + }); + + for (let i = 0; i < 3; i++) { + await powersync.execute('INSERT INTO assets(id, make, customer_id) VALUES (uuid(), ?, ?)', ['test', uuid()]); + } + await new Promise((resolve) => setTimeout(resolve, throttleDuration * 2)); + abortController.abort(); + + expect(lastResult).toBe(6); + }); + + it('should trigger onResult after schema change (callback)', async () => { + const userId = uuid(); + const abortController = new AbortController(); + + let lastResult = 0; + const query = 'SELECT count() AS count FROM assets'; + + const onUpdate = (results: QueryResult) => { + lastResult = results.rows?._array[0].count; // `count` from sql output + }; + + powersync.watch( + query, + [], + { onResult: onUpdate }, + { signal: abortController.signal, throttleMs: throttleDuration } + ); + + const assetsWatchTables = await getSourceTables(powersync, query); + expect(assetsWatchTables.includes('ps_data_local__local_assets')).toBeTruthy(); + + // Insert 3 records + for (let i = 0; i < 3; i++) { + await powersync.execute('INSERT INTO assets(id, make, customer_id) VALUES (uuid(), ?, ?)', ['test', userId]); + } + await new Promise((resolve) => setTimeout(resolve, throttleDuration * 2)); + + expect(lastResult).toBe(3); + + // changes the underlying table that the `assets` and `customers` views are based on + await powersync.updateSchema(makeOptionalSyncSchema(true)); + + const onlineAssetsWatchTables = await getSourceTables(powersync, query); + expect(onlineAssetsWatchTables.includes('ps_data__assets')).toBeTruthy(); + + await powersync.writeTransaction(async (tx) => { + // Copy local data to the "online" views. + await tx.execute( + 'INSERT INTO assets(id, description, customer_id, user_id) SELECT id, description, customer_id, ? FROM inactive_local_assets', + [userId] + ); + + // Delete the "local-only" data. + await tx.execute('DELETE FROM inactive_local_customers'); + await tx.execute('DELETE FROM inactive_local_assets'); + }); + + for (let i = 0; i < 3; i++) { + await powersync.execute('INSERT INTO assets(id, make, customer_id) VALUES (uuid(), ?, ?)', ['test', uuid()]); + } + await new Promise((resolve) => setTimeout(resolve, throttleDuration * 2)); + abortController.abort(); + + expect(lastResult).toBe(6); + }); +}); + +export async function getSourceTables(db: AbstractPowerSyncDatabase, sql: string, parameters: Array = []) { + const rows = await db.getAll<{ opcode: string; p3: number; p2: string }>(`EXPLAIN ${sql}`, parameters); + const rootpages: number[] = []; + + for (const row of rows) { + if (row.opcode === 'OpenRead' && row.p3 === 0 && typeof row.p2 === 'number') { + rootpages.push(row.p2); + } + } + + const tableRows = await db.getAll<{ tbl_name: string }>( + `SELECT tbl_name FROM sqlite_master WHERE rootpage IN (SELECT json_each.value FROM json_each(?))`, + [JSON.stringify(rootpages)] + ); + + return tableRows.map((row: { tbl_name: string }) => row.tbl_name); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43604639b..745c189e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,10 +77,10 @@ importers: devDependencies: '@angular-builders/custom-webpack': specifier: ^18.0.0 - version: 18.0.0(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26)(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26)))(tailwindcss@3.4.13)(typescript@5.5.4) + version: 18.0.0(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))))(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)))(typescript@5.5.4) '@angular-devkit/build-angular': specifier: ^18.1.1 - version: 18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26)(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26)))(tailwindcss@3.4.13)(typescript@5.5.4) + version: 18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))))(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)))(typescript@5.5.4) '@angular/cli': specifier: ^18.1.1 version: 18.2.7(chokidar@3.6.0) @@ -474,10 +474,10 @@ importers: version: 10.4.20(postcss@8.4.47) babel-loader: specifier: ^9.1.3 - version: 9.2.1(@babel/core@7.25.7)(webpack@5.95.0) + version: 9.2.1(@babel/core@7.25.7)(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) css-loader: specifier: ^6.11.0 - version: 6.11.0(webpack@5.95.0) + version: 6.11.0(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -492,13 +492,13 @@ importers: version: 1.79.4 sass-loader: specifier: ^13.3.3 - version: 13.3.3(sass@1.79.4)(webpack@5.95.0) + version: 13.3.3(sass@1.79.4)(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) style-loader: specifier: ^3.3.4 - version: 3.3.4(webpack@5.95.0) + version: 3.3.4(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) tailwindcss: specifier: ^3.4.3 - version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.3)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@20.16.10)(typescript@5.6.3)) demos/example-vite: dependencies: @@ -527,10 +527,10 @@ importers: devDependencies: '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@5.1.4(webpack@5.95.0)) + version: 5.28.5(webpack-cli@5.1.4) html-webpack-plugin: specifier: ^5.6.0 - version: 5.6.0(webpack@5.95.0(webpack-cli@5.1.4)) + version: 5.6.0(webpack@5.95.0) serve: specifier: ^14.2.1 version: 14.2.3 @@ -745,7 +745,7 @@ importers: version: 18.3.11 eas-cli: specifier: ^7.2.0 - version: 7.8.5(@swc/core@1.7.26)(@types/node@22.7.4)(encoding@0.1.13)(expo-modules-autolinking@1.11.1)(typescript@5.3.3) + version: 7.8.5(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(encoding@0.1.13)(expo-modules-autolinking@1.11.1)(typescript@5.3.3) eslint: specifier: 8.55.0 version: 8.55.0 @@ -1731,8 +1731,8 @@ importers: specifier: ^6.0.5 version: 6.0.5(react-native@0.72.4(@babel/core@7.24.5)(@babel/preset-env@7.25.7(@babel/core@7.24.5))(encoding@0.1.13)(react@18.2.0))(react@18.2.0) '@journeyapps/react-native-quick-sqlite': - specifier: ^2.0.0 - version: 2.0.0(react-native@0.72.4(@babel/core@7.24.5)(@babel/preset-env@7.25.7(@babel/core@7.24.5))(encoding@0.1.13)(react@18.2.0))(react@18.2.0) + specifier: ^2.1.0 + version: 2.1.0(react-native@0.72.4(@babel/core@7.24.5)(@babel/preset-env@7.25.7(@babel/core@7.24.5))(encoding@0.1.13)(react@18.2.0))(react@18.2.0) '@rollup/plugin-alias': specifier: ^5.1.0 version: 5.1.1(rollup@4.14.3) @@ -1867,13 +1867,13 @@ importers: version: 4.0.1 source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.95.0(webpack-cli@5.1.4)) + version: 5.0.0(webpack@5.95.0) stream-browserify: specifier: ^3.0.0 version: 3.0.0 terser-webpack-plugin: specifier: ^5.3.9 - version: 5.3.10(webpack@5.95.0(webpack-cli@5.1.4)) + version: 5.3.10(webpack@5.95.0) typescript: specifier: ^5.5.3 version: 5.5.4 @@ -4517,6 +4517,12 @@ packages: react: '*' react-native: '*' + '@journeyapps/react-native-quick-sqlite@2.1.0': + resolution: {integrity: sha512-cZHjL6fw91KtcnAfgSutqrKd1dRaAVZKrel3btdC9xBAWpcEyu2t+6f18zZVqiAwkCe+XP1bKTtemm6p5gRP/g==} + peerDependencies: + react: '*' + react-native: '*' + '@journeyapps/wa-sqlite@0.4.1': resolution: {integrity: sha512-a964h8f+6PSVfg3kxhLF2FwAqPdlY4gaWYIV6nnwJbdUhfjUcHDdL5njkw7egwmjEIG9rbIuxRsEqANcQ/bTwQ==} @@ -18524,10 +18530,10 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@angular-builders/common@2.0.0(@swc/core@1.7.26)(@types/node@22.7.4)(chokidar@3.6.0)(typescript@5.5.4)': + '@angular-builders/common@2.0.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(chokidar@3.6.0)(typescript@5.5.4)': dependencies: '@angular-devkit/core': 18.2.7(chokidar@3.6.0) - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.5.4) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4) tsconfig-paths: 4.2.0 transitivePeerDependencies: - '@swc/core' @@ -18536,11 +18542,11 @@ snapshots: - chokidar - typescript - '@angular-builders/custom-webpack@18.0.0(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26)(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26)))(tailwindcss@3.4.13)(typescript@5.5.4)': + '@angular-builders/custom-webpack@18.0.0(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))))(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)))(typescript@5.5.4)': dependencies: - '@angular-builders/common': 2.0.0(@swc/core@1.7.26)(@types/node@22.7.4)(chokidar@3.6.0)(typescript@5.5.4) + '@angular-builders/common': 2.0.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(chokidar@3.6.0)(typescript@5.5.4) '@angular-devkit/architect': 0.1802.7(chokidar@3.6.0) - '@angular-devkit/build-angular': 18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26)(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26)))(tailwindcss@3.4.13)(typescript@5.5.4) + '@angular-devkit/build-angular': 18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))))(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)))(typescript@5.5.4) '@angular-devkit/core': 18.2.7(chokidar@3.6.0) '@angular/compiler-cli': 18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4) lodash: 4.17.21 @@ -18583,13 +18589,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26)(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26)))(tailwindcss@3.4.13)(typescript@5.5.4)': + '@angular-devkit/build-angular@18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))))(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)))(typescript@5.5.4)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1802.7(chokidar@3.6.0) - '@angular-devkit/build-webpack': 0.1802.7(chokidar@3.6.0)(webpack-dev-server@5.0.4(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)))(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + '@angular-devkit/build-webpack': 0.1802.7(chokidar@3.6.0)(webpack-dev-server@5.0.4(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) '@angular-devkit/core': 18.2.7(chokidar@3.6.0) - '@angular/build': 18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@types/node@22.7.4)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.41)(tailwindcss@3.4.13)(terser@5.31.6)(typescript@5.5.4) + '@angular/build': 18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@types/node@22.7.4)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.41)(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)))(terser@5.31.6)(typescript@5.5.4) '@angular/compiler-cli': 18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4) '@babel/core': 7.25.2 '@babel/generator': 7.25.0 @@ -18601,15 +18607,15 @@ snapshots: '@babel/preset-env': 7.25.3(@babel/core@7.25.2) '@babel/runtime': 7.25.0 '@discoveryjs/json-ext': 0.6.1 - '@ngtools/webpack': 18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + '@ngtools/webpack': 18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.4.6(@types/node@22.7.4)(less@4.2.0)(sass@1.77.6)(terser@5.31.6)) ansi-colors: 4.1.3 autoprefixer: 10.4.20(postcss@8.4.41) - babel-loader: 9.1.3(@babel/core@7.25.2)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + babel-loader: 9.1.3(@babel/core@7.25.2)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) browserslist: 4.24.0 - copy-webpack-plugin: 12.0.2(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + copy-webpack-plugin: 12.0.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) critters: 0.0.24 - css-loader: 7.1.2(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + css-loader: 7.1.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) esbuild-wasm: 0.23.0 fast-glob: 3.3.2 http-proxy-middleware: 3.0.0 @@ -18618,11 +18624,11 @@ snapshots: jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 less: 4.2.0 - less-loader: 12.2.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) - license-webpack-plugin: 4.0.2(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + less-loader: 12.2.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) + license-webpack-plugin: 4.0.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) loader-utils: 3.3.1 magic-string: 0.30.11 - mini-css-extract-plugin: 2.9.0(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + mini-css-extract-plugin: 2.9.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) mrmime: 2.0.0 open: 10.1.0 ora: 5.4.1 @@ -18630,13 +18636,13 @@ snapshots: picomatch: 4.0.2 piscina: 4.6.1 postcss: 8.4.41 - postcss-loader: 8.1.1(postcss@8.4.41)(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + postcss-loader: 8.1.1(postcss@8.4.41)(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.77.6 - sass-loader: 16.0.0(sass@1.77.6)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + sass-loader: 16.0.0(sass@1.77.6)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) semver: 7.6.3 - source-map-loader: 5.0.0(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + source-map-loader: 5.0.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) source-map-support: 0.5.21 terser: 5.31.6 tree-kill: 1.2.2 @@ -18644,15 +18650,15 @@ snapshots: typescript: 5.5.4 vite: 5.4.6(@types/node@22.7.4)(less@4.2.0)(sass@1.77.6)(terser@5.31.6) watchpack: 2.4.1 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) - webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) - webpack-dev-server: 5.0.4(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) + webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) + webpack-dev-server: 5.0.4(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26)))(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) optionalDependencies: '@angular/service-worker': 18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)) esbuild: 0.23.0 - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.3)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)) transitivePeerDependencies: - '@rspack/core' - '@swc/core' @@ -18671,12 +18677,12 @@ snapshots: - utf-8-validate - webpack-cli - '@angular-devkit/build-webpack@0.1802.7(chokidar@3.6.0)(webpack-dev-server@5.0.4(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)))(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0))': + '@angular-devkit/build-webpack@0.1802.7(chokidar@3.6.0)(webpack-dev-server@5.0.4(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5)))': dependencies: '@angular-devkit/architect': 0.1802.7(chokidar@3.6.0) rxjs: 7.8.1 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) - webpack-dev-server: 5.0.4(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) + webpack-dev-server: 5.0.4(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) transitivePeerDependencies: - chokidar @@ -18706,7 +18712,7 @@ snapshots: '@angular/core': 18.2.7(rxjs@7.8.1)(zone.js@0.14.10) tslib: 2.7.0 - '@angular/build@18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@types/node@22.7.4)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.41)(tailwindcss@3.4.13)(terser@5.31.6)(typescript@5.5.4)': + '@angular/build@18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@angular/service-worker@18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(@types/node@22.7.4)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.41)(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)))(terser@5.31.6)(typescript@5.5.4)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1802.7(chokidar@3.6.0) @@ -18739,7 +18745,7 @@ snapshots: '@angular/service-worker': 18.2.7(@angular/common@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)) less: 4.2.0 postcss: 8.4.41 - tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.3)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' - chokidar @@ -21669,7 +21675,7 @@ snapshots: tslib: 2.7.0 update-notifier: 6.0.2 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) webpack-bundle-analyzer: 4.10.2 webpack-dev-server: 4.15.2(webpack@5.95.0) webpack-merge: 5.10.0 @@ -21761,7 +21767,7 @@ snapshots: tslib: 2.7.0 update-notifier: 6.0.2 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) webpack-bundle-analyzer: 4.10.2 webpack-dev-server: 4.15.2(webpack@5.95.0) webpack-merge: 5.10.0 @@ -21824,7 +21830,7 @@ snapshots: unist-util-visit: 5.0.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) vfile: 6.0.3 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -21861,7 +21867,7 @@ snapshots: unist-util-visit: 5.0.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) vfile: 6.0.3 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -21911,7 +21917,7 @@ snapshots: tslib: 2.7.0 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -21951,7 +21957,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) tslib: 2.7.0 utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -21982,7 +21988,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.7.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -22324,7 +22330,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -22344,7 +22350,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -22424,7 +22430,7 @@ snapshots: tslib: 2.7.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) optionalDependencies: '@docusaurus/types': 3.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: @@ -22456,7 +22462,7 @@ snapshots: tslib: 2.7.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) utility-types: 3.11.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) optionalDependencies: '@docusaurus/types': 3.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: @@ -23710,18 +23716,18 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 14.0.0 - '@expo/plugin-help@5.1.23(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3)': + '@expo/plugin-help@5.1.23(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3)': dependencies: - '@oclif/core': 2.16.0(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3) + '@oclif/core': 2.16.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript - '@expo/plugin-warn-if-update-available@2.5.1(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3)': + '@expo/plugin-warn-if-update-available@2.5.1(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3)': dependencies: - '@oclif/core': 2.16.0(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3) + '@oclif/core': 2.16.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3) chalk: 4.1.2 debug: 4.3.7(supports-color@8.1.1) ejs: 3.1.10 @@ -24335,11 +24341,6 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@journeyapps/react-native-quick-sqlite@2.0.0(react-native@0.72.4(@babel/core@7.24.5)(@babel/preset-env@7.25.7(@babel/core@7.24.5))(encoding@0.1.13)(react@18.2.0))(react@18.2.0)': - dependencies: - react: 18.2.0 - react-native: 0.72.4(@babel/core@7.24.5)(@babel/preset-env@7.25.7(@babel/core@7.24.5))(encoding@0.1.13)(react@18.2.0) - '@journeyapps/react-native-quick-sqlite@2.0.0(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.25.7(@babel/core@7.24.5))(@types/react@18.3.11)(encoding@0.1.13)(react@18.2.0))(react@18.2.0)': dependencies: react: 18.2.0 @@ -24355,6 +24356,11 @@ snapshots: react: 18.2.0 react-native: 0.74.5(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.2.79)(encoding@0.1.13)(react@18.2.0) + '@journeyapps/react-native-quick-sqlite@2.1.0(react-native@0.72.4(@babel/core@7.24.5)(@babel/preset-env@7.25.7(@babel/core@7.24.5))(encoding@0.1.13)(react@18.2.0))(react@18.2.0)': + dependencies: + react: 18.2.0 + react-native: 0.72.4(@babel/core@7.24.5)(@babel/preset-env@7.25.7(@babel/core@7.24.5))(encoding@0.1.13)(react@18.2.0) + '@journeyapps/wa-sqlite@0.4.1': {} '@jridgewell/gen-mapping@0.3.5': @@ -25028,11 +25034,11 @@ snapshots: '@next/swc-win32-x64-msvc@14.2.3': optional: true - '@ngtools/webpack@18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0))': + '@ngtools/webpack@18.2.7(@angular/compiler-cli@18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5)))': dependencies: '@angular/compiler-cli': 18.2.7(@angular/compiler@18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4) typescript: 5.5.4 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: @@ -25158,7 +25164,7 @@ snapshots: widest-line: 3.1.0 wrap-ansi: 7.0.0 - '@oclif/core@2.16.0(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3)': + '@oclif/core@2.16.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3)': dependencies: '@types/cli-progress': 3.11.6 ansi-escapes: 4.3.2 @@ -25183,7 +25189,7 @@ snapshots: strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3) tslib: 2.7.0 widest-line: 3.1.0 wordwrap: 1.0.0 @@ -25196,9 +25202,9 @@ snapshots: '@oclif/linewrap@1.0.0': {} - '@oclif/plugin-autocomplete@2.3.10(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3)': + '@oclif/plugin-autocomplete@2.3.10(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3)': dependencies: - '@oclif/core': 2.16.0(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3) + '@oclif/core': 2.16.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3) chalk: 4.1.2 debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: @@ -29233,7 +29239,7 @@ snapshots: dependencies: vue: 2.7.16 - '@types/webpack@5.28.5(webpack-cli@5.1.4(webpack@5.95.0))': + '@types/webpack@5.28.5(webpack-cli@5.1.4)': dependencies: '@types/node': 20.16.10 tapable: 2.2.1 @@ -29530,6 +29536,16 @@ snapshots: optionalDependencies: webdriverio: 8.40.6 + '@vitest/browser@1.6.0(vitest@1.6.0)(webdriverio@9.2.8)': + dependencies: + '@vitest/utils': 1.6.0 + magic-string: 0.30.11 + sirv: 2.0.4 + vitest: 1.6.0(@types/node@22.7.4)(@vitest/browser@1.6.0)(jsdom@24.1.3)(less@4.2.0)(sass@1.79.4)(terser@5.34.1) + optionalDependencies: + webdriverio: 9.2.8 + optional: true + '@vitest/browser@2.1.4(@types/node@20.17.6)(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.6)(less@4.2.0)(sass@1.79.4)(terser@5.34.1))(vitest@2.1.4)(webdriverio@9.2.8)': dependencies: '@testing-library/dom': 10.4.0 @@ -29797,7 +29813,7 @@ snapshots: vue: 3.4.21(typescript@5.5.4) vue-demi: 0.13.11(vue@3.4.21(typescript@5.5.4)) - '@vuetify/loader-shared@2.0.3(vue@3.4.21(typescript@5.5.4))(vuetify@3.6.8(typescript@5.5.4)(vite-plugin-vuetify@2.0.4)(vue@3.4.21(typescript@5.5.4)))': + '@vuetify/loader-shared@2.0.3(vue@3.4.21(typescript@5.5.4))(vuetify@3.6.8)': dependencies: upath: 2.0.1 vue: 3.4.21(typescript@5.5.4) @@ -29979,17 +29995,17 @@ snapshots: dependencies: commander: 10.0.1 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: webpack: 5.95.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: webpack: 5.95.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: webpack: 5.95.0(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) @@ -30468,19 +30484,19 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) babel-loader@9.2.1(@babel/core@7.24.5)(webpack@5.95.0): dependencies: '@babel/core': 7.24.5 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) babel-loader@9.2.1(@babel/core@7.25.7)(webpack@5.95.0(@swc/core@1.6.13(@swc/helpers@0.5.5))): dependencies: @@ -30489,12 +30505,12 @@ snapshots: schema-utils: 4.2.0 webpack: 5.95.0(@swc/core@1.6.13(@swc/helpers@0.5.5)) - babel-loader@9.2.1(@babel/core@7.25.7)(webpack@5.95.0): + babel-loader@9.2.1(@babel/core@7.25.7)(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: '@babel/core': 7.25.7 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5)) babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -31563,9 +31579,9 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) - copy-webpack-plugin@12.0.2(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + copy-webpack-plugin@12.0.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -31573,7 +31589,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) core-js-compat@3.38.1: dependencies: @@ -31739,6 +31755,19 @@ snapshots: dependencies: hyphenate-style-name: 1.1.0 + css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): + dependencies: + icss-utils: 5.1.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.47) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.47) + postcss-modules-scope: 3.2.0(postcss@8.4.47) + postcss-modules-values: 4.0.0(postcss@8.4.47) + postcss-value-parser: 4.2.0 + semver: 7.6.3 + optionalDependencies: + webpack: 5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5)) + css-loader@6.11.0(webpack@5.95.0): dependencies: icss-utils: 5.1.0(postcss@8.4.47) @@ -31750,9 +31779,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) - css-loader@7.1.2(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + css-loader@7.1.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -31763,7 +31792,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0): dependencies: @@ -31773,7 +31802,7 @@ snapshots: postcss: 8.4.47 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) optionalDependencies: clean-css: 5.3.3 @@ -32425,7 +32454,7 @@ snapshots: duplexer@0.1.2: {} - eas-cli@7.8.5(@swc/core@1.7.26)(@types/node@22.7.4)(encoding@0.1.13)(expo-modules-autolinking@1.11.1)(typescript@5.3.3): + eas-cli@7.8.5(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(encoding@0.1.13)(expo-modules-autolinking@1.11.1)(typescript@5.3.3): dependencies: '@expo/apple-utils': 1.7.0 '@expo/code-signing-certificates': 0.0.5 @@ -32441,8 +32470,8 @@ snapshots: '@expo/package-manager': 1.1.2 '@expo/pkcs12': 0.0.8 '@expo/plist': 0.0.20 - '@expo/plugin-help': 5.1.23(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3) - '@expo/plugin-warn-if-update-available': 2.5.1(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3) + '@expo/plugin-help': 5.1.23(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3) + '@expo/plugin-warn-if-update-available': 2.5.1(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3) '@expo/prebuild-config': 6.7.3(encoding@0.1.13)(expo-modules-autolinking@1.11.1) '@expo/results': 1.0.0 '@expo/rudder-sdk-node': 1.1.1(encoding@0.1.13) @@ -32450,7 +32479,7 @@ snapshots: '@expo/steps': 1.0.95 '@expo/timeago.js': 1.0.0 '@oclif/core': 1.26.2 - '@oclif/plugin-autocomplete': 2.3.10(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3) + '@oclif/plugin-autocomplete': 2.3.10(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3) '@segment/ajv-human-errors': 2.13.0(ajv@8.11.0) '@urql/core': 4.0.11(graphql@16.8.1) '@urql/exchange-retry': 1.2.0(graphql@16.8.1) @@ -32985,7 +33014,7 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -33008,7 +33037,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -33078,7 +33107,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -34125,7 +34154,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) filelist@1.0.4: dependencies: @@ -34284,7 +34313,7 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.5.4 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) optionalDependencies: eslint: 8.57.1 @@ -35007,7 +35036,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26)): + html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -35015,19 +35044,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.94.0(@swc/core@1.7.26) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) optional: true - html-webpack-plugin@5.6.0(webpack@5.95.0(webpack-cli@5.1.4)): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - optionalDependencies: - webpack: 5.95.0(webpack-cli@5.1.4) - html-webpack-plugin@5.6.0(webpack@5.95.0): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -35036,7 +35055,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) htmlfy@0.3.2: {} @@ -35978,11 +35997,11 @@ snapshots: dependencies: readable-stream: 2.3.8 - less-loader@12.2.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + less-loader@12.2.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: less: 4.2.0 optionalDependencies: - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) less@4.2.0: dependencies: @@ -36013,11 +36032,11 @@ snapshots: dependencies: isomorphic.js: 0.2.5 - license-webpack-plugin@4.0.2(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + license-webpack-plugin@4.0.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: webpack-sources: 3.2.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) lie@3.3.0: dependencies: @@ -37495,17 +37514,17 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.0(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + mini-css-extract-plugin@2.9.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) mini-css-extract-plugin@2.9.1(webpack@5.95.0): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) minimalistic-assert@1.0.1: {} @@ -38638,13 +38657,22 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.3)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@20.16.10)(typescript@5.6.3)): + dependencies: + lilconfig: 3.1.2 + yaml: 2.5.1 + optionalDependencies: + postcss: 8.4.47 + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@20.16.10)(typescript@5.6.3) + + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@20.16.10)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4) + optional: true postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.5.4)(webpack@5.95.0): dependencies: @@ -38652,18 +38680,18 @@ snapshots: jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) transitivePeerDependencies: - typescript - postcss-loader@8.1.1(postcss@8.4.41)(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + postcss-loader@8.1.1(postcss@8.4.41)(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: cosmiconfig: 9.0.0(typescript@5.5.4) jiti: 1.21.6 postcss: 8.4.41 semver: 7.6.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) transitivePeerDependencies: - typescript @@ -39243,7 +39271,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -39324,7 +39352,7 @@ snapshots: dependencies: '@babel/runtime': 7.25.7 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.2.0)' - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) react-native-builder-bob@0.30.2(typescript@5.5.4): dependencies: @@ -40686,19 +40714,19 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@13.3.3(sass@1.79.4)(webpack@5.95.0): + sass-loader@13.3.3(sass@1.79.4)(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: neo-async: 2.6.2 - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5)) optionalDependencies: sass: 1.79.4 - sass-loader@16.0.0(sass@1.77.6)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + sass-loader@16.0.0(sass@1.77.6)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: neo-async: 2.6.2 optionalDependencies: sass: 1.77.6 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) sass@1.77.6: dependencies: @@ -41109,13 +41137,13 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + source-map-loader@5.0.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) - source-map-loader@5.0.0(webpack@5.95.0(webpack-cli@5.1.4)): + source-map-loader@5.0.0(webpack@5.95.0): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 @@ -41408,9 +41436,9 @@ snapshots: dependencies: webpack: 5.95.0(@swc/core@1.6.13(@swc/helpers@0.5.5)) - style-loader@3.3.4(webpack@5.95.0): + style-loader@3.3.4(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: - webpack: 5.95.0 + webpack: 5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5)) style-to-object@0.4.4: dependencies: @@ -41534,7 +41562,7 @@ snapshots: tabbable@6.2.0: {} - tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.3)): + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@20.16.10)(typescript@5.6.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -41553,7 +41581,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.3)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@20.16.10)(typescript@5.6.3)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -41561,6 +41589,34 @@ snapshots: transitivePeerDependencies: - ts-node + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.0 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4)) + postcss-nested: 6.2.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + optional: true + tamagui@1.79.6(@types/react@18.3.11)(immer@9.0.21)(react-dom@18.2.0(react@18.2.0))(react-native-web@0.19.12(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.25.7(@babel/core@7.24.5))(@types/react@18.3.11)(encoding@0.1.13)(react@18.2.0))(react@18.2.0): dependencies: '@tamagui/accordion': 1.79.6(react@18.2.0) @@ -41726,49 +41782,28 @@ snapshots: optionalDependencies: '@swc/core': 1.6.13(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.34.1 - webpack: 5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5)) - optionalDependencies: - '@swc/core': 1.7.26(@swc/helpers@0.5.5) - - terser-webpack-plugin@5.3.10(@swc/core@1.7.26)(esbuild@0.23.0)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.5) esbuild: 0.23.0 - terser-webpack-plugin@5.3.10(@swc/core@1.7.26)(webpack@5.94.0(@swc/core@1.7.26)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.94.0(@swc/core@1.7.26) + webpack: 5.95.0(@swc/core@1.7.26(@swc/helpers@0.5.5)) optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.5) - optional: true - - terser-webpack-plugin@5.3.10(webpack@5.95.0(webpack-cli@5.1.4)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.34.1 - webpack: 5.95.0(webpack-cli@5.1.4) terser-webpack-plugin@5.3.10(webpack@5.95.0): dependencies: @@ -41777,7 +41812,7 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) terser@5.31.6: dependencies: @@ -41964,14 +41999,14 @@ snapshots: optionalDependencies: '@swc/core': 1.6.13(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@20.17.6)(typescript@5.6.3): + ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@20.16.10)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.17.6 + '@types/node': 20.16.10 acorn: 8.12.1 acorn-walk: 8.3.4 arg: 4.1.3 @@ -41983,28 +42018,29 @@ snapshots: yn: 3.1.1 optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.5) + optional: true - ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.3.3): + ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@20.17.6)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.7.4 + '@types/node': 20.17.6 acorn: 8.12.1 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.7.4)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.3.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -42018,30 +42054,31 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.5) - ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.3): + ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.5))(@types/node@22.7.4)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.10 + '@types/node': 22.7.4 acorn: 8.12.1 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.3 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optional: true + optionalDependencies: + '@swc/core': 1.7.26(@swc/helpers@0.5.5) ts-object-utils@0.0.5: {} @@ -42451,7 +42488,7 @@ snapshots: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) optionalDependencies: file-loader: 6.2.0(webpack@5.95.0) @@ -42688,7 +42725,7 @@ snapshots: vite-plugin-vuetify@2.0.4(vite@5.4.8(@types/node@22.7.4)(less@4.2.0)(sass@1.79.4)(terser@5.34.1))(vue@3.4.21(typescript@5.5.4))(vuetify@3.6.8): dependencies: - '@vuetify/loader-shared': 2.0.3(vue@3.4.21(typescript@5.5.4))(vuetify@3.6.8(typescript@5.5.4)(vite-plugin-vuetify@2.0.4)(vue@3.4.21(typescript@5.5.4))) + '@vuetify/loader-shared': 2.0.3(vue@3.4.21(typescript@5.5.4))(vuetify@3.6.8) debug: 4.3.7(supports-color@8.1.1) upath: 2.0.1 vite: 5.4.8(@types/node@22.7.4)(less@4.2.0)(sass@1.79.4)(terser@5.34.1) @@ -42805,7 +42842,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.7.4 - '@vitest/browser': 1.6.0(vitest@1.6.0)(webdriverio@8.40.6) + '@vitest/browser': 1.6.0(vitest@1.6.0)(webdriverio@9.2.8) jsdom: 24.1.3 transitivePeerDependencies: - less @@ -43128,9 +43165,9 @@ snapshots: webpack-cli@5.1.4(webpack@5.95.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.95.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.95.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.95.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -43149,9 +43186,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) - webpack-dev-middleware@7.4.2(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + webpack-dev-middleware@7.4.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: colorette: 2.0.20 memfs: 4.12.0 @@ -43160,7 +43197,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.2.0 optionalDependencies: - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) webpack-dev-server@4.15.2(webpack@5.95.0): dependencies: @@ -43195,14 +43232,14 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.95.0) ws: 8.18.0 optionalDependencies: - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.0.4(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + webpack-dev-server@5.0.4(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -43232,10 +43269,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) + webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) ws: 8.18.0 optionalDependencies: - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) transitivePeerDependencies: - bufferutil - debug @@ -43258,16 +43295,16 @@ snapshots: webpack-sources@3.2.3: {} - webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26)))(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)): + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))): dependencies: typed-assert: 1.0.9 - webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0) optionalDependencies: - html-webpack-plugin: 5.6.0(webpack@5.94.0(@swc/core@1.7.26)) + html-webpack-plugin: 5.6.0(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.7.26): + webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -43289,74 +43326,13 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(webpack@5.94.0(@swc/core@1.7.26)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.5))(esbuild@0.23.0)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.5))) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - optional: true - - webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0): - dependencies: - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.24.0 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.23.0)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.0)) - watchpack: 2.4.1 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.95.0: - dependencies: - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.24.0 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.95.0) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js webpack@5.95.0(@swc/core@1.6.13(@swc/helpers@0.5.5)): dependencies: @@ -43440,7 +43416,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.95.0(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(webpack@5.95.0) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -43456,7 +43432,7 @@ snapshots: consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.7.0 - webpack: 5.95.0 + webpack: 5.95.0(webpack-cli@5.1.4) websocket-driver@0.7.4: dependencies: