From 0fa0810b0018f9ee98c886cf10a32fd3c35b4053 Mon Sep 17 00:00:00 2001 From: Felipe Forbeck Date: Thu, 14 Aug 2025 17:12:05 -0300 Subject: [PATCH] Revert "feat(console): plan verification before encryption/decryption operations (#354)" This reverts commit fe77ef0fe993652f3c8ae8c3fa89b4ea4c6b3a6f. --- .github/workflows/console-deploy.yml | 4 +- .../console/src/hooks/useFileDecryption.ts | 33 +---- packages/ui/packages/react/package.json | 2 - packages/ui/packages/react/src/Uploader.tsx | 35 ++--- .../react/test/Uploader.encrypted.spec.tsx | 127 +++--------------- packages/ui/packages/react/tsconfig.json | 3 - packages/ui/packages/react/tsconfig.lib.json | 3 - pnpm-lock.yaml | 34 ++--- 8 files changed, 53 insertions(+), 188 deletions(-) diff --git a/.github/workflows/console-deploy.yml b/.github/workflows/console-deploy.yml index 8d247c29c..5a8a66d1a 100644 --- a/.github/workflows/console-deploy.yml +++ b/.github/workflows/console-deploy.yml @@ -73,7 +73,7 @@ jobs: echo "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" >> .env echo "NEXT_PUBLIC_PRIVATE_SPACES_DOMAINS=dmail.ai,storacha.network" >> .env echo "NEXT_PUBLIC_UCAN_KMS_URL=https://ucan-kms-staging.protocol-labs.workers.dev" >> .env - echo "NEXT_PUBLIC_UCAN_KMS_DID=did:key:z6MkmRf149D6oc9wq9ioXCsT5fgTn6esd7JjB9S5JnM4Y9qj" >> .env + echo "NEXT_PUBLIC_UCAN_KMS_DID=did:web:staging.kms.storacha.network" >> .env echo "NEXT_PUBLIC_ENABLE_TEST_IFRAME=true" >> .env echo "NEXT_PUBLIC_SSO_ALLOWED_ORIGINS=https://mail.dmail.ai,https://testmailhu9fg9h.dmail.ai" >> .env echo "NEXT_PUBLIC_SSO_IFRAME_STRIPE_PRICING_TABLE_ID=prctbl_1RrNd0F6A5ufQX5vpB0sYPHm" >> .env @@ -188,7 +188,7 @@ jobs: echo "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" >> .env echo "NEXT_PUBLIC_PRIVATE_SPACES_DOMAINS=dmail.ai,storacha.network" >> .env echo "NEXT_PUBLIC_UCAN_KMS_URL=https://ucan-kms-production.protocol-labs.workers.dev" >> .env - echo "NEXT_PUBLIC_UCAN_KMS_DID=did:key:z6MksQJobJmBfPhjHWgFXVppqM6Fcjc1k7xu4z6xvusVrtKv" >> .env + echo "NEXT_PUBLIC_UCAN_KMS_DID=did:web:kms.storacha.network" >> .env echo "NEXT_PUBLIC_ENABLE_TEST_IFRAME=true" >> .env echo "NEXT_PUBLIC_SSO_ALLOWED_ORIGINS=https://mail.dmail.ai,https://testmailhu9fg9h.dmail.ai" >> .env echo "NEXT_PUBLIC_SSO_IFRAME_STRIPE_PRICING_TABLE_ID=prctbl_1RrNZSF6A5ufQX5vryBeKnFe" >> .env diff --git a/packages/console/src/hooks/useFileDecryption.ts b/packages/console/src/hooks/useFileDecryption.ts index 5babb5e45..3970e9e77 100644 --- a/packages/console/src/hooks/useFileDecryption.ts +++ b/packages/console/src/hooks/useFileDecryption.ts @@ -4,9 +4,7 @@ import type { Space, UnknownLink } from '@storacha/ui-react' import { parse as parseLink } from 'multiformats/link' import { create as createEncryptedClient } from '@storacha/encrypt-upload-client' import { useKMSConfig } from '@storacha/ui-react' -import * as PlanCapabilities from '@storacha/capabilities/plan' -import * as SpaceCapabilities from '@storacha/capabilities/space' -import { delegate } from '@ucanto/core' +import { decrypt } from '@storacha/capabilities/space' import type { FileMetadata } from '@storacha/encrypt-upload-client/types' interface DecryptionState { @@ -16,14 +14,14 @@ interface DecryptionState { } export const useFileDecryption = (space?: Space) => { - const [{ client, accounts }] = useW3() + const [{ client }] = useW3() const [state, setState] = useState({ loading: false, error: null, fileMetadata: undefined }) - const { createKMSAdapter, isConfigured, kmsConfig } = useKMSConfig() + const { createKMSAdapter, isConfigured } = useKMSConfig() const downloadBlob = (blob: Blob, filename: string) => { const url = URL.createObjectURL(blob) @@ -64,7 +62,7 @@ export const useFileDecryption = (space?: Space) => { try { // Create crypto adapter using shared KMS config const cryptoAdapter = await createKMSAdapter() - if (!cryptoAdapter || !kmsConfig) { + if (!cryptoAdapter) { throw new Error('KMS configuration required for decryption') } @@ -76,26 +74,9 @@ export const useFileDecryption = (space?: Space) => { // Parse CID if it's a string const encryptionMetadataCID = typeof cid === 'string' ? parseLink(cid) : cid - - // Get account for plan delegation - const [account] = accounts ?? [] - if (!account) { - throw new Error('No account available for plan/get delegation') - } - - // Authorize the UCAN KMS server to check user's plan - const getPlanDelegation = await delegate({ - issuer: client.agent.issuer, - audience: { did: () => kmsConfig.keyManagerServiceDID as `did:${string}:${string}` }, - capabilities: [ - { can: PlanCapabilities.get.can, with: account.did() }, - ], - proofs: client.proofs(), - expiration: Math.floor((Date.now() + 60 * 15 * 1000) / 1000) // 15 minutes - }) const proofs = client.proofs([ { - can: SpaceCapabilities.decrypt.can, + can: 'space/content/decrypt', with: space.did() } ]) @@ -104,7 +85,7 @@ export const useFileDecryption = (space?: Space) => { cap.can === 'ucan/attest' || cap.with === 'ucan:*')) - const decryptDelegation = await SpaceCapabilities.decrypt.delegate({ + const decryptDelegation = await decrypt.delegate({ issuer: client.agent.issuer, audience: client.agent.issuer, with: space.did(), @@ -121,7 +102,7 @@ export const useFileDecryption = (space?: Space) => { { spaceDID: space.did(), decryptDelegation, - proofs: [...proofs, getPlanDelegation], + proofs, } ) diff --git a/packages/ui/packages/react/package.json b/packages/ui/packages/react/package.json index 9bbd10fac..c97d8c333 100644 --- a/packages/ui/packages/react/package.json +++ b/packages/ui/packages/react/package.json @@ -42,11 +42,9 @@ "devDependencies": { "@ipld/dag-ucan": "^3.2.0", "@storacha/eslint-config-ui": "workspace:^", - "@storacha/capabilities": "workspace:^", "@testing-library/react": "catalog:", "@testing-library/user-event": "catalog:", "@types/react": "catalog:", - "@ucanto/core": "catalog:", "@ucanto/client": "catalog:", "@ucanto/interface": "catalog:", "@ucanto/principal": "catalog:", diff --git a/packages/ui/packages/react/src/Uploader.tsx b/packages/ui/packages/react/src/Uploader.tsx index 2b57c7c11..d7bd84ae8 100644 --- a/packages/ui/packages/react/src/Uploader.tsx +++ b/packages/ui/packages/react/src/Uploader.tsx @@ -21,9 +21,6 @@ import { useW3 } from './providers/Provider.js' import { create as createEncryptedClient } from '@storacha/encrypt-upload-client' import { EncryptionConfig, EncryptionStrategy, FileMetadata } from '@storacha/encrypt-upload-client/types' import { useKMSConfig, type KMSConfig } from './hooks.js' -import * as SpaceCapabilities from '@storacha/capabilities/space' -import * as PlanCapabilities from '@storacha/capabilities/plan' -import { delegate } from '@ucanto/core' export type UploadProgress = Record @@ -198,8 +195,7 @@ export const UploaderRoot: Component = createComponent( kmsConfig, ...props }) => { - const [{ client, accounts }] = useW3() - const [account] = accounts ?? [] + const [{ client }] = useW3() const [files, setFiles] = useState() const file = files?.[0] const setFile = (file: File | undefined): void => { @@ -258,9 +254,6 @@ export const UploaderRoot: Component = createComponent( if (files.length > 1) { throw new Error('Encrypted uploads currently only support single files') } - if (!account) { - throw new Error('No account selected for upload encryption') - } const space = client.currentSpace() if (!space) { throw new Error('Missing private space for upload encryption') @@ -269,7 +262,7 @@ export const UploaderRoot: Component = createComponent( if (spaceAccess?.type !== 'private') { throw new Error('Encrypted uploads currently only supported in private spaces') } - + let cryptoAdapter if (spaceAccess.encryption.provider === 'google-kms') { // Use KMS strategy with config from shared hook @@ -281,7 +274,7 @@ export const UploaderRoot: Component = createComponent( } // else if - add other providers here... - if (!cryptoAdapter || !kmsConfigState) { + if (!cryptoAdapter) { throw new Error('Encryption provider not supported') } @@ -290,28 +283,16 @@ export const UploaderRoot: Component = createComponent( cryptoAdapter, }) - // Authorize the UCAN KMS server to check user's plan - const getPlanDelegation = await delegate({ - issuer: client.agent.issuer, - audience: { did: () => kmsConfigState.keyManagerServiceDID as `did:${string}:${string}` }, - capabilities: [ - { can: PlanCapabilities.get.can, with: account.did() }, - ], - proofs: client.proofs(), - expiration: Math.floor((Date.now() + 60 * 15 * 1000) / 1000) // 15 minutes - }) - - // Agent needs to have access to the space - const proofs = await client.agent.proofs([ - { can: SpaceCapabilities.EncryptionSetup.can, with: space.did() }, - ]) + // Extract file metadata + const fileMetadata = extractFileMetadata(file) // Prepare encryption config + const proofs = await client.agent.proofs([{ can: "space/encryption/setup", with: space.did() }]) // Agent needs to have access to the space const encryptionConfig: EncryptionConfig = { issuer: client.agent.issuer, spaceDID: space.did(), - proofs: [...proofs, getPlanDelegation], - fileMetadata: extractFileMetadata(file), + proofs, + fileMetadata, ...(kmsConfigState?.location && encryptionStrategy === 'kms' && { location: kmsConfigState?.location }), ...(kmsConfigState?.keyring && encryptionStrategy === 'kms' && { keyring: kmsConfigState?.keyring }), } diff --git a/packages/ui/packages/react/test/Uploader.encrypted.spec.tsx b/packages/ui/packages/react/test/Uploader.encrypted.spec.tsx index a5536bbdf..5a9c31ad4 100644 --- a/packages/ui/packages/react/test/Uploader.encrypted.spec.tsx +++ b/packages/ui/packages/react/test/Uploader.encrypted.spec.tsx @@ -13,7 +13,6 @@ import { import { Uploader, UploaderContext } from '../src/Uploader.js' const SpaceDID = "did:key:z6Mkit3tepJFA1Em9S1BTLVNdJ6rmXTrBaTTbt55dxyQvKZF" -const AccountDID = "did:mailto:storacha.network:test" // Mock the encrypt-upload-client module vi.mock('@storacha/encrypt-upload-client', () => ({ @@ -24,14 +23,6 @@ vi.mock('@storacha/encrypt-upload-client/factories.browser', () => ({ createGenericKMSAdapter: vi.fn(), })) -vi.mock('@ucanto/core', async (importOriginal) => { - const actual = await importOriginal() as any - return { - ...actual, - delegate: vi.fn(), - } -}) - afterEach(() => { cleanup() vi.clearAllMocks() @@ -60,16 +51,6 @@ test('encrypted upload with private space', async () => { const { create: createEncryptedClient } = await import('@storacha/encrypt-upload-client') vi.mocked(createEncryptedClient).mockResolvedValue(mockEncryptedClient) - // Set up delegate mock to return proper delegation - const { delegate } = await import('@ucanto/core') - vi.mocked(delegate).mockResolvedValue({ - cid: { toString: () => 'bafyreiabc123' }, - issuer: { did: () => 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK' }, - audience: { did: () => 'did:web:kms.storacha.network' }, - capabilities: [{ can: 'plan/get', with: AccountDID }], - expiration: Math.floor(Date.now() / 1000) + 3600, - } as any) - const { createGenericKMSAdapter } = await import('@storacha/encrypt-upload-client/factories.browser') vi.mocked(createGenericKMSAdapter).mockReturnValue(mockCryptoAdapter) @@ -85,17 +66,12 @@ test('encrypted upload with private space', async () => { }), } - const account = { - did: vi.fn().mockReturnValue(AccountDID), - } as any - const client = { currentSpace: vi.fn().mockReturnValue(space), agent: { - issuer: { did: () => 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK' }, + issuer: { did: () => 'did:key:agent123' }, proofs: vi.fn().mockReturnValue([]), }, - proofs: vi.fn().mockReturnValue([]), } const contextValue: ContextValue = [ @@ -103,30 +79,18 @@ test('encrypted upload with private space', async () => { ...ContextDefaultValue[0], // @ts-expect-error not a real client client, - accounts: [account], }, ContextDefaultValue[1], ] const handleComplete = vi.fn() - const defaultKmsConfig = { - keyManagerServiceURL: 'https://kms.storacha.network', - keyManagerServiceDID: 'did:web:kms.storacha.network', - } - - const TestComponent = () => { - return ( - - - - - ) - } - render( - - + + + + + ) @@ -163,17 +127,7 @@ test('encrypted upload with private space', async () => { { issuer: client.agent.issuer, spaceDID: space.did(), - proofs: expect.arrayContaining([ - expect.objectContaining({ - cid: expect.objectContaining({ toString: expect.any(Function) }), - issuer: expect.objectContaining({ did: expect.any(Function) }), - audience: expect.objectContaining({ did: expect.any(Function) }), - capabilities: expect.arrayContaining([ - expect.objectContaining({ can: 'plan/get', with: AccountDID }) - ]), - expiration: expect.any(Number), - }) - ]), + proofs: [], fileMetadata: { name: 'secret.txt', type: 'text/plain', @@ -211,16 +165,6 @@ test('encrypted upload with custom KMS config', async () => { const { create: createEncryptedClient } = await import('@storacha/encrypt-upload-client') vi.mocked(createEncryptedClient).mockResolvedValue(mockEncryptedClient) - // Set up delegate mock to return proper delegation - const { delegate } = await import('@ucanto/core') - vi.mocked(delegate).mockResolvedValue({ - cid: { toString: () => 'bafyreiabc123' }, - issuer: { did: () => 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK' }, - audience: { did: () => 'did:web:kms.storacha.network' }, - capabilities: [{ can: 'plan/get', with: AccountDID }], - expiration: Math.floor(Date.now() / 1000) + 3600, - } as any) - const { createGenericKMSAdapter } = await import('@storacha/encrypt-upload-client/factories.browser') vi.mocked(createGenericKMSAdapter).mockReturnValue(mockCryptoAdapter) @@ -235,18 +179,13 @@ test('encrypted upload with custom KMS config', async () => { }, }), } - - const account = { - did: vi.fn().mockReturnValue(AccountDID), - } as any const client = { currentSpace: vi.fn().mockReturnValue(space), agent: { - issuer: { did: () => 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK' }, + issuer: { did: () => 'did:key:agent123' }, proofs: vi.fn().mockReturnValue([]), }, - proofs: vi.fn().mockReturnValue([]), } const customKmsConfig = { @@ -261,24 +200,17 @@ test('encrypted upload with custom KMS config', async () => { ...ContextDefaultValue[0], // @ts-expect-error not a real client client, - accounts: [account], }, ContextDefaultValue[1], ] - const TestComponent = () => { - return ( - - - - - ) - } - render( - + + + + ) @@ -311,17 +243,7 @@ test('encrypted upload with custom KMS config', async () => { spaceDID: space.did(), location: customKmsConfig.location, keyring: customKmsConfig.keyring, - proofs: expect.arrayContaining([ - expect.objectContaining({ - cid: expect.objectContaining({ toString: expect.any(Function) }), - issuer: expect.objectContaining({ did: expect.any(Function) }), - audience: expect.objectContaining({ did: expect.any(Function) }), - capabilities: expect.arrayContaining([ - expect.objectContaining({ can: 'plan/get', with: AccountDID }) - ]), - expiration: expect.any(Number), - }) - ]), + proofs: [], fileMetadata: { name: 'secret.txt', type: 'text/plain', @@ -353,7 +275,7 @@ test('encrypted upload fails with multiple files', async () => { const client = { currentSpace: vi.fn().mockReturnValue(space), agent: { - issuer: { did: () => 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK' }, + issuer: { did: () => 'did:key:agent123' }, }, } @@ -427,7 +349,7 @@ test('encrypted upload falls back to regular upload for public space', async () currentSpace: vi.fn().mockReturnValue(space), uploadFile: vi.fn().mockResolvedValue(cid), // Mock regular upload agent: { - issuer: { did: () => 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK' }, + issuer: { did: () => 'did:key:agent123' }, }, } @@ -482,25 +404,11 @@ test('encrypted upload fails with unsupported provider', async () => { }), } - const account = { - did: vi.fn().mockReturnValue(AccountDID), - model: { - id: AccountDID as `did:mailto:${string}:${string}`, - agent: { - did: vi.fn().mockReturnValue(AccountDID), - } as any, - proofs: [], - }, - toEmail: vi.fn().mockReturnValue('test@storacha.network'), - } as any - const client = { currentSpace: vi.fn().mockReturnValue(space), agent: { - issuer: { did: () => 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK' }, - proofs: vi.fn().mockReturnValue([]), + issuer: { did: () => 'did:key:agent123' }, }, - proofs: vi.fn().mockReturnValue([]), } let uploaderState: any @@ -520,7 +428,6 @@ test('encrypted upload fails with unsupported provider', async () => { ...ContextDefaultValue[0], // @ts-expect-error not a real client client, - accounts: [account], }, ContextDefaultValue[1], ] @@ -557,7 +464,7 @@ test('upload fails without space', async () => { const client = { currentSpace: vi.fn().mockReturnValue(null), // No space selected agent: { - issuer: { did: () => 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK' }, + issuer: { did: () => 'did:key:agent123' }, }, } diff --git a/packages/ui/packages/react/tsconfig.json b/packages/ui/packages/react/tsconfig.json index f2b0eb412..dad9d3695 100644 --- a/packages/ui/packages/react/tsconfig.json +++ b/packages/ui/packages/react/tsconfig.json @@ -11,9 +11,6 @@ { "path": "../core" }, - { - "path": "../../../capabilities" - }, { "path": "./tsconfig.lib.json" }, diff --git a/packages/ui/packages/react/tsconfig.lib.json b/packages/ui/packages/react/tsconfig.lib.json index f04fdccda..2b3fb9922 100644 --- a/packages/ui/packages/react/tsconfig.lib.json +++ b/packages/ui/packages/react/tsconfig.lib.json @@ -7,9 +7,6 @@ }, { "path": "../core/tsconfig.lib.json" - }, - { - "path": "../../../capabilities/tsconfig.lib.json" } ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b014a5c4..941571225 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -310,7 +310,7 @@ importers: version: 20.3.2(@babel/traverse@7.26.5)(@swc/core@1.11.11(@swc/helpers@0.5.15))(@types/node@22.13.10)(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(typescript@5.8.3) '@nx/next': specifier: 20.3.2 - version: 20.3.2(@babel/core@7.26.0)(@babel/traverse@7.26.5)(@rspack/core@1.3.6(@swc/helpers@0.5.15))(@swc/core@1.11.11(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(next@13.5.11(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.87.0))(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15))) + version: 20.3.2(@babel/core@7.26.0)(@babel/traverse@7.26.5)(@rspack/core@1.3.6(@swc/helpers@0.5.15))(@swc/core@1.11.11(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(next@13.5.11(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.87.0))(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15))) '@types/npm-registry-fetch': specifier: ^8.0.7 version: 8.0.7 @@ -1552,9 +1552,6 @@ importers: '@ipld/dag-ucan': specifier: ^3.2.0 version: 3.4.5 - '@storacha/capabilities': - specifier: workspace:^ - version: link:../../../capabilities '@storacha/eslint-config-ui': specifier: workspace:^ version: link:../eslint-config @@ -1570,9 +1567,6 @@ importers: '@ucanto/client': specifier: 'catalog:' version: 9.0.1 - '@ucanto/core': - specifier: 'catalog:' - version: 10.4.0 '@ucanto/interface': specifier: 'catalog:' version: 10.3.0 @@ -16904,19 +16898,19 @@ snapshots: - vue-tsc - webpack-cli - '@nx/next@20.3.2(@babel/core@7.26.0)(@babel/traverse@7.26.5)(@rspack/core@1.3.6(@swc/helpers@0.5.15))(@swc/core@1.11.11(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(next@13.5.11(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.87.0))(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15)))': + '@nx/next@20.3.2(@babel/core@7.26.0)(@babel/traverse@7.26.5)(@rspack/core@1.3.6(@swc/helpers@0.5.15))(@swc/core@1.11.11(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(next@13.5.11(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.87.0))(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15)))': dependencies: '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) '@nx/devkit': 20.3.2(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15))) '@nx/eslint': 20.3.2(@babel/traverse@7.26.5)(@swc/core@1.11.11(@swc/helpers@0.5.15))(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15))) '@nx/js': 20.3.2(@babel/traverse@7.26.5)(@swc/core@1.11.11(@swc/helpers@0.5.15))(@types/node@22.13.10)(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(typescript@5.8.3) - '@nx/react': 20.3.2(@babel/traverse@7.26.5)(@swc/core@1.11.11(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(next@13.5.11(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.87.0))(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15))) + '@nx/react': 20.3.2(@babel/traverse@7.26.5)(@swc/core@1.11.11(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(next@13.5.11(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.87.0))(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15))) '@nx/web': 20.3.2(@babel/traverse@7.26.5)(@swc/core@1.11.11(@swc/helpers@0.5.15))(@types/node@22.13.10)(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(typescript@5.8.3) '@nx/webpack': 20.3.2(@babel/traverse@7.26.5)(@rspack/core@1.3.6(@swc/helpers@0.5.15))(@swc/core@1.11.11(@swc/helpers@0.5.15))(@types/node@22.13.10)(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(typescript@5.8.3) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) '@svgr/webpack': 8.1.0(typescript@5.8.3) - copy-webpack-plugin: 10.2.4(webpack@5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15))) - file-loader: 6.2.0(webpack@5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15))) + copy-webpack-plugin: 10.2.4(webpack@5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15))) + file-loader: 6.2.0(webpack@5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15))) ignore: 5.3.2 next: 13.5.11(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.87.0) semver: 7.6.3 @@ -16988,7 +16982,7 @@ snapshots: '@nx/nx-win32-x64-msvc@20.3.2': optional: true - '@nx/react@20.3.2(@babel/traverse@7.26.5)(@swc/core@1.11.11(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(next@13.5.11(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.87.0))(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15)))': + '@nx/react@20.3.2(@babel/traverse@7.26.5)(@swc/core@1.11.11(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(next@13.5.11(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.87.0))(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15)))': dependencies: '@nx/devkit': 20.3.2(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15))) '@nx/eslint': 20.3.2(@babel/traverse@7.26.5)(@swc/core@1.11.11(@swc/helpers@0.5.15))(@types/node@22.13.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.1)(nx@20.3.2(@swc/core@1.11.11(@swc/helpers@0.5.15))) @@ -16998,7 +16992,7 @@ snapshots: '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) '@svgr/webpack': 8.1.0(typescript@5.8.3) express: 4.21.2 - file-loader: 6.2.0(webpack@5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15))) + file-loader: 6.2.0(webpack@5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15))) http-proxy-middleware: 3.0.5 minimatch: 9.0.3 picocolors: 1.1.1 @@ -21072,6 +21066,16 @@ snapshots: graceful-fs: 4.2.11 p-event: 6.0.1 + copy-webpack-plugin@10.2.4(webpack@5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15))): + dependencies: + fast-glob: 3.3.3 + glob-parent: 6.0.2 + globby: 12.2.0 + normalize-path: 3.0.0 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + webpack: 5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15)) + copy-webpack-plugin@10.2.4(webpack@5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15))): dependencies: fast-glob: 3.3.3 @@ -22731,11 +22735,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15))): + file-loader@6.2.0(webpack@5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.99.6(@swc/core@1.11.11(@swc/helpers@0.5.15)) + webpack: 5.88.0(@swc/core@1.11.11(@swc/helpers@0.5.15)) file-uri-to-path@1.0.0: {}