diff --git a/.changeset/few-hounds-return.md b/.changeset/few-hounds-return.md new file mode 100644 index 00000000..33de1145 --- /dev/null +++ b/.changeset/few-hounds-return.md @@ -0,0 +1,6 @@ +--- +'@powersync/common': patch +'@powersync/web': patch +--- + +Fix: correctly apply SQLOpen flags. This fixes an issue where `PowerSyncDatabase` constructor `flags` options were not used when opening SQLite connections in web. diff --git a/demos/example-electron/package.json b/demos/example-electron/package.json index 851e989e..19a65257 100644 --- a/demos/example-electron/package.json +++ b/demos/example-electron/package.json @@ -19,6 +19,8 @@ }, "license": "MIT", "dependencies": { + "@emotion/react": "^11.13.0", + "@emotion/styled": "^11.13.0", "@journeyapps/wa-sqlite": "~0.2.0", "@mui/icons-material": "^5.15.16", "@mui/material": "^5.15.16", diff --git a/packages/common/src/client/AbstractPowerSyncDatabase.ts b/packages/common/src/client/AbstractPowerSyncDatabase.ts index d478c436..574f645b 100644 --- a/packages/common/src/client/AbstractPowerSyncDatabase.ts +++ b/packages/common/src/client/AbstractPowerSyncDatabase.ts @@ -14,8 +14,10 @@ import { SyncStatus } from '../db/crud/SyncStatus'; import { UploadQueueStats } from '../db/crud/UploadQueueStatus'; import { Schema } from '../db/schema/Schema'; import { BaseObserver } from '../utils/BaseObserver'; +import { ControlledExecutor } from '../utils/ControlledExecutor'; import { mutexRunExclusive } from '../utils/mutex'; import { quoteIdentifier } from '../utils/strings'; +import { SQLOpenFactory, SQLOpenOptions, isDBAdapter, isSQLOpenFactory, isSQLOpenOptions } from './SQLOpenFactory'; import { PowerSyncBackendConnector } from './connection/PowerSyncBackendConnector'; import { BucketStorageAdapter, PSInternalTable } from './sync/bucket/BucketStorageAdapter'; import { CrudBatch } from './sync/bucket/CrudBatch'; @@ -24,12 +26,10 @@ import { CrudTransaction } from './sync/bucket/CrudTransaction'; import { AbstractStreamingSyncImplementation, DEFAULT_CRUD_UPLOAD_THROTTLE_MS, - StreamingSyncImplementationListener, + PowerSyncConnectionOptions, StreamingSyncImplementation, - PowerSyncConnectionOptions + StreamingSyncImplementationListener } from './sync/stream/AbstractStreamingSyncImplementation'; -import { ControlledExecutor } from '../utils/ControlledExecutor'; -import { SQLOpenFactory, SQLOpenOptions, isDBAdapter, isSQLOpenFactory, isSQLOpenOptions } from './SQLOpenFactory'; export interface DisconnectAndClearOptions { /** When set to false, data in local-only tables is preserved. */ @@ -139,6 +139,14 @@ export const DEFAULT_POWERSYNC_DB_OPTIONS = { */ export const DEFAULT_LOCK_TIMEOUT_MS = 120_000; // 2 mins +/** + * Tests if the input is a {@link PowerSyncDatabaseOptionsWithSettings} + * @internal + */ +export const isPowerSyncDatabaseOptionsWithSettings = (test: any): test is PowerSyncDatabaseOptionsWithSettings => { + return typeof test == 'object' && isSQLOpenOptions(test.database); +}; + export abstract class AbstractPowerSyncDatabase extends BaseObserver { /** * Transactions should be queued in the DBAdapter, but we also want to prevent @@ -182,8 +190,8 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver {} - protected openDBAdapter(options: SQLOpenOptions): DBAdapter { - const defaultFactory = new WASQLiteOpenFactory({ ...options, flags: this.resolvedFlags }); + protected openDBAdapter(options: WebPowerSyncDatabaseOptionsWithSettings): DBAdapter { + const defaultFactory = new WASQLiteOpenFactory({ + ...options.database, + flags: resolveWebPowerSyncFlags(options.flags) + }); return defaultFactory.openDB(); } diff --git a/packages/web/tests/open.test.ts b/packages/web/tests/open.test.ts index 5d36c1c0..861cd078 100644 --- a/packages/web/tests/open.test.ts +++ b/packages/web/tests/open.test.ts @@ -1,11 +1,11 @@ -import { describe, expect, it } from 'vitest'; import { AbstractPowerSyncDatabase } from '@powersync/common'; import { PowerSyncDatabase, WASQLiteDBAdapter, - WASQLitePowerSyncDatabaseOpenFactory, - WASQLiteOpenFactory + WASQLiteOpenFactory, + WASQLitePowerSyncDatabaseOpenFactory } from '@powersync/web'; +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; import { testSchema } from './utils/testDb'; const testId = '2290de4f-0488-4e50-abed-f8e8eb1d0b42'; @@ -18,6 +18,45 @@ export const basicTest = async (db: AbstractPowerSyncDatabase) => { }; describe('Open Methods', () => { + let originalSharedWorker: typeof SharedWorker; + let originalWorker: typeof Worker; + + const sharedWorkerProxyHandler = { + construct(target: typeof SharedWorker, args: any[]) { + const [url, options] = args; + + // Call the original constructor + const instance = new target(url, options); + return instance; + } + }; + const workerProxyHandler = { + construct(target: typeof Worker, args: any[]) { + const [url, options] = args; + + // Call the original constructor + const instance = new target(url, options); + return instance; + } + }; + + beforeAll(() => { + // Store the original SharedWorker constructor + originalSharedWorker = SharedWorker; + originalWorker = Worker; + + // Create a proxy to intercept the worker constructors + // The vi.SpyOn does not work well with constructors + window.SharedWorker = new Proxy(SharedWorker, sharedWorkerProxyHandler); + window.Worker = new Proxy(Worker, workerProxyHandler); + }); + + afterAll(() => { + // Restore Worker + window.SharedWorker = originalSharedWorker; + window.Worker = originalWorker; + }); + it('Should open PowerSync clients from old factory methods', async () => { const db = new WASQLitePowerSyncDatabaseOpenFactory({ dbFilename: `test-legacy.db`, @@ -46,4 +85,46 @@ describe('Open Methods', () => { await basicTest(db); }); + + it('Should use shared worker for multiple tabs', async () => { + const sharedSpy = vi.spyOn(sharedWorkerProxyHandler, 'construct'); + + const db = new PowerSyncDatabase({ database: { dbFilename: 'options-test.db' }, schema: testSchema }); + + await basicTest(db); + + expect(sharedSpy).toBeCalledTimes(1); + }); + + it('Should use dedicated worker when multiple tabs disabled', async () => { + const sharedSpy = vi.spyOn(sharedWorkerProxyHandler, 'construct'); + const dedicatedSpy = vi.spyOn(workerProxyHandler, 'construct'); + + const db = new PowerSyncDatabase({ + database: { dbFilename: 'options-test.db' }, + schema: testSchema, + flags: { enableMultiTabs: false } + }); + + await basicTest(db); + + expect(sharedSpy).toBeCalledTimes(0); + expect(dedicatedSpy).toBeCalledTimes(1); + }); + + it('Should not use workers when specified', async () => { + const sharedSpy = vi.spyOn(sharedWorkerProxyHandler, 'construct'); + const dedicatedSpy = vi.spyOn(workerProxyHandler, 'construct'); + + const db = new PowerSyncDatabase({ + database: { dbFilename: 'options-test.db' }, + schema: testSchema, + flags: { useWebWorker: false } + }); + + await basicTest(db); + + expect(sharedSpy).toBeCalledTimes(0); + expect(dedicatedSpy).toBeCalledTimes(0); + }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 499c5634..438d7ab5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -296,18 +296,24 @@ importers: demos/example-electron: dependencies: + '@emotion/react': + specifier: ^11.13.0 + version: 11.13.0(@types/react@18.3.3)(react@18.2.0) + '@emotion/styled': + specifier: ^11.13.0 + version: 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) '@journeyapps/wa-sqlite': specifier: ~0.2.0 version: 0.2.0 '@mui/icons-material': specifier: ^5.15.16 - version: 5.16.4(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) + version: 5.16.4(@mui/material@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) '@mui/material': specifier: ^5.15.16 - version: 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/x-data-grid': specifier: ^6.19.11 - version: 6.20.4(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mui/system@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 6.20.4(@mui/material@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mui/system@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@powersync/react': specifier: workspace:* version: link:../../packages/react @@ -1587,10 +1593,10 @@ importers: version: 0.1.1 '@mui/material': specifier: ^5.15.12 - version: 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/x-data-grid': specifier: ^6.19.6 - version: 6.20.4(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mui/system@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 6.20.4(@mui/material@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mui/system@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@powersync/react': specifier: workspace:* version: link:../../packages/react @@ -3145,6 +3151,9 @@ packages: '@emotion/cache@11.13.0': resolution: {integrity: sha512-hPV345J/tH0Cwk2wnU/3PBzORQ9HeX+kQSbwI+jslzpRCHE6fSGTohswksA/Ensr8znPzwfzKZCmAM9Lmlhp7g==} + '@emotion/cache@11.13.1': + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -3169,6 +3178,15 @@ packages: '@types/react': optional: true + '@emotion/react@11.13.0': + resolution: {integrity: sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + '@emotion/serialize@1.3.0': resolution: {integrity: sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==} @@ -3185,6 +3203,16 @@ packages: '@types/react': optional: true + '@emotion/styled@11.13.0': + resolution: {integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + '@emotion/unitless@0.9.0': resolution: {integrity: sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==} @@ -20197,6 +20225,14 @@ snapshots: '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 + '@emotion/cache@11.13.1': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + '@emotion/hash@0.9.2': {} '@emotion/is-prop-valid@0.8.8': @@ -20229,6 +20265,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.8 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.2.0) + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.3 + transitivePeerDependencies: + - supports-color + '@emotion/serialize@1.3.0': dependencies: '@emotion/hash': 0.9.2 @@ -20254,6 +20306,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.8 + '@emotion/babel-plugin': 11.12.0 + '@emotion/is-prop-valid': 1.3.0 + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.2.0) + '@emotion/serialize': 1.3.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.2.0) + '@emotion/utils': 1.4.0 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.3 + transitivePeerDependencies: + - supports-color + '@emotion/unitless@0.9.0': {} '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.2.0)': @@ -22003,6 +22070,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@mui/icons-material@5.16.4(@mui/material@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.3)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.8 + '@mui/material': 5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.3 + '@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.8 @@ -22024,6 +22099,27 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) '@types/react': 18.3.3 + '@mui/material@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.8 + '@mui/core-downloads-tracker': 5.16.4 + '@mui/system': 5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) + '@mui/types': 7.2.15(@types/react@18.3.3) + '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.2.0) + '@popperjs/core': 2.11.8 + '@types/react-transition-group': 4.4.10 + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.3.1 + react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + optionalDependencies: + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) + '@types/react': 18.3.3 + '@mui/private-theming@5.16.4(@types/react@18.3.3)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.8 @@ -22044,6 +22140,17 @@ snapshots: '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.2.0) '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) + '@mui/styled-engine@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.8 + '@emotion/cache': 11.13.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + optionalDependencies: + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) + '@mui/system@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.8 @@ -22060,6 +22167,22 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) '@types/react': 18.3.3 + '@mui/system@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.8 + '@mui/private-theming': 5.16.4(@types/react@18.3.3)(react@18.2.0) + '@mui/styled-engine': 5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(react@18.2.0) + '@mui/types': 7.2.15(@types/react@18.3.3) + '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.2.0) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + optionalDependencies: + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) + '@types/react': 18.3.3 + '@mui/types@7.2.15(@types/react@18.3.3)': optionalDependencies: '@types/react': 18.3.3 @@ -22089,6 +22212,20 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@mui/x-data-grid@6.20.4(@mui/material@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mui/system@5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.8 + '@mui/material': 5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/system': 5.16.4(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0))(@types/react@18.3.3)(react@18.2.0) + '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.2.0) + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + reselect: 4.1.8 + transitivePeerDependencies: + - '@types/react' + '@next/env@14.2.3': {} '@next/eslint-plugin-next@14.0.0':