From 1fe25e461b7da6e9cdc68c3788821807f4dc9cef Mon Sep 17 00:00:00 2001 From: Daniel Madrid <105010181+dannimad@users.noreply.github.com> Date: Thu, 2 Oct 2025 13:33:24 -0700 Subject: [PATCH 1/4] initialize --- ...oadFrozenContainerFromPendingState.spec.ts | 72 +++++++++++-------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts b/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts index 588ea8119d9d..55101dc10199 100644 --- a/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts +++ b/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts @@ -24,36 +24,52 @@ const toComparableArray = (dir: ISharedMap): [string, unknown][] => isFluidHandle(value) ? toFluidHandleInternal(value).absolutePath : value, ]); +// initialize loader and create a container function +const initialize = async () => { + const deltaConnectionServer = LocalDeltaConnectionServer.create(); + + const { urlResolver, codeDetails, codeLoader, loaderProps, documentServiceFactory } = + createLoader({ + deltaConnectionServer, + }); + + const container = asLegacyAlpha( + await createDetachedContainer({ + codeDetails, + ...loaderProps, + configProvider: { + getRawConfig: (name) => { + switch (name) { + case "Fluid.Container.enableOfflineLoad": + return true; + default: + return undefined; + } + }, + }, + }), + ); + const { ITestFluidObject }: FluidObject = + (await container.getEntryPoint()) ?? {}; + assert( + ITestFluidObject !== undefined, + "Expected entrypoint to be a valid TestFluidObject, but it was undefined", + ); + return { + container, + ITestFluidObject, + urlResolver, + codeLoader, + documentServiceFactory, + deltaConnectionServer, + loaderProps, + }; +}; + describe("loadFrozenContainerFromPendingState", () => { it("loadFrozenContainerFromPendingState", async () => { - const deltaConnectionServer = LocalDeltaConnectionServer.create(); - - const { urlResolver, codeDetails, codeLoader, loaderProps, documentServiceFactory } = - createLoader({ - deltaConnectionServer, - }); - const container = asLegacyAlpha( - await createDetachedContainer({ - codeDetails, - ...loaderProps, - configProvider: { - getRawConfig: (name) => { - switch (name) { - case "Fluid.Container.enableOfflineLoad": - return true; - default: - return undefined; - } - }, - }, - }), - ); - const { ITestFluidObject }: FluidObject = - (await container.getEntryPoint()) ?? {}; - assert( - ITestFluidObject !== undefined, - "Expected entrypoint to be a valid TestFluidObject, but it was undefined", - ); + const { container, ITestFluidObject, urlResolver, codeLoader, documentServiceFactory } = + await initialize(); for (let i = 0; i < 10; i++) { ITestFluidObject.root.set(`detached-${i}`, i); From 0bbd1b633a7561b2305be9b626a566612f1bbc2d Mon Sep 17 00:00:00 2001 From: Daniel Madrid <105010181+dannimad@users.noreply.github.com> Date: Thu, 2 Oct 2025 13:45:26 -0700 Subject: [PATCH 2/4] More testing for frozen containers --- packages/test/local-server-tests/package.json | 1 + ...oadFrozenContainerFromPendingState.spec.ts | 169 ++++++++++- pnpm-lock.yaml | 263 +++++++++++++++++- 3 files changed, 431 insertions(+), 2 deletions(-) diff --git a/packages/test/local-server-tests/package.json b/packages/test/local-server-tests/package.json index a0838776492d..8f103c96e378 100644 --- a/packages/test/local-server-tests/package.json +++ b/packages/test/local-server-tests/package.json @@ -57,6 +57,7 @@ "@biomejs/biome": "~1.9.3", "@fluid-experimental/tree": "workspace:~", "@fluid-internal/mocha-test-setup": "workspace:~", + "@fluid-internal/client-utils": "workspace:~", "@fluid-private/test-drivers": "workspace:~", "@fluid-private/test-pairwise-generator": "workspace:~", "@fluidframework/aqueduct": "workspace:~", diff --git a/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts b/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts index 55101dc10199..6446a18fa4dd 100644 --- a/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts +++ b/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts @@ -11,12 +11,13 @@ import { loadFrozenContainerFromPendingState, } from "@fluidframework/container-loader/internal"; import type { FluidObject } from "@fluidframework/core-interfaces/internal"; -import type { ISharedMap } from "@fluidframework/map/internal"; +import { SharedMap, type ISharedMap } from "@fluidframework/map/internal"; import { isFluidHandle, toFluidHandleInternal } from "@fluidframework/runtime-utils/internal"; import { LocalDeltaConnectionServer } from "@fluidframework/server-local-server"; import { timeoutPromise, type TestFluidObject } from "@fluidframework/test-utils/internal"; import { createLoader } from "../utils.js"; +import { bufferToString, stringToBuffer } from "@fluid-internal/client-utils"; const toComparableArray = (dir: ISharedMap): [string, unknown][] => [...dir.entries()].map(([key, value]) => [ @@ -144,4 +145,170 @@ describe("loadFrozenContainerFromPendingState", () => { "Expected frozen container's data to remain unchanged after new changes in the original container.", ); }); + + it("frozen container loads DDS", async () => { + const { container, ITestFluidObject, urlResolver, codeLoader, documentServiceFactory } = + await initialize(); + const newSharedMap1 = SharedMap.create(ITestFluidObject.runtime); + // Set a value while in local state. + newSharedMap1.set("newKey", "newValue"); + ITestFluidObject.root.set("newSharedMapId", newSharedMap1.handle); + + await container.attach(urlResolver.createCreateNewRequest("test")); + const url = await container.getAbsoluteUrl(""); + assert( + url !== undefined, + "Expected container to provide a valid absolute URL, but got undefined", + ); + const pendingLocalState = await container.getPendingLocalState(); + + const frozenContainer = await loadFrozenContainerFromPendingState({ + codeLoader, + documentServiceFactory, + urlResolver, + request: { + url, + }, + pendingLocalState, + }); + const frozenEntryPoint: FluidObject = + await frozenContainer.getEntryPoint(); + assert( + frozenEntryPoint.ITestFluidObject !== undefined, + "Expected frozen container entrypoint to be a valid TestFluidObject, but it was undefined", + ); + const newSharedMap1Retrieved = (await frozenEntryPoint.ITestFluidObject.root + .get("newSharedMapId") + .get()) as ISharedMap; + assert( + newSharedMap1Retrieved !== undefined, + "Expected to retrieve newSharedMap1 from frozen container, but it was undefined", + ); + assert( + newSharedMap1Retrieved.get("newKey") === "newValue", + "Expected newSharedMap1 to have key 'newKey' with value 'newValue', but it did not", + ); + }); + + it("frozen container loads blob", async () => { + const { container, ITestFluidObject, urlResolver, codeLoader, documentServiceFactory } = + await initialize(); + await container.attach(urlResolver.createCreateNewRequest("test")); + const blobHandle = await ITestFluidObject.runtime.uploadBlob( + stringToBuffer("test", "utf-8"), + ); + // Set a value while in local state. + ITestFluidObject.root.set("newBlobId", blobHandle); + const url = await container.getAbsoluteUrl(""); + assert( + url !== undefined, + "Expected container to provide a valid absolute URL, but got undefined", + ); + const pendingLocalState = await container.getPendingLocalState(); + + const frozenContainer = await loadFrozenContainerFromPendingState({ + codeLoader, + documentServiceFactory, + urlResolver, + request: { + url, + }, + pendingLocalState, + }); + const frozenEntryPoint: FluidObject = + await frozenContainer.getEntryPoint(); + assert( + frozenEntryPoint.ITestFluidObject !== undefined, + "Expected frozen container entrypoint to be a valid TestFluidObject, but it was undefined", + ); + const newBlobRetrieved = await frozenEntryPoint.ITestFluidObject.root + .get("newBlobId") + .get(); + assert( + newBlobRetrieved !== undefined, + "Expected to retrieve newBlobRetrieved from frozen container, but it was undefined", + ); + assert( + bufferToString(newBlobRetrieved, "utf-8") === "test", + "Expected newBlobRetrieved to have value 'test', but it did not", + ); + }); + + it("uploading blob on frozen container", async () => { + const { container, urlResolver, codeLoader, documentServiceFactory } = await initialize(); + await container.attach(urlResolver.createCreateNewRequest("test")); + + const url = await container.getAbsoluteUrl(""); + assert( + url !== undefined, + "Expected container to provide a valid absolute URL, but got undefined", + ); + const pendingLocalState = await container.getPendingLocalState(); + + const frozenContainer = await loadFrozenContainerFromPendingState({ + codeLoader, + documentServiceFactory, + urlResolver, + request: { + url, + }, + pendingLocalState, + }); + const frozenEntryPoint: FluidObject = + await frozenContainer.getEntryPoint(); + assert( + frozenEntryPoint.ITestFluidObject !== undefined, + "Expected frozen container entrypoint to be a valid TestFluidObject, but it was undefined", + ); + try { + await frozenEntryPoint.ITestFluidObject.runtime.uploadBlob( + stringToBuffer("some random text", "utf-8"), + ); + assert.fail("uploadBlob should have failed"); + } catch (error: any) { + assert.strictEqual( + error.message, + "Operations are not supported on the FrozenDocumentStorageService.", + "Error message mismatch", + ); + } + }); + + it("trying to attach a frozen container", async () => { + const { container, urlResolver, codeLoader, documentServiceFactory } = await initialize(); + await container.attach(urlResolver.createCreateNewRequest("test")); + + const url = await container.getAbsoluteUrl(""); + assert( + url !== undefined, + "Expected container to provide a valid absolute URL, but got undefined", + ); + const pendingLocalState = await container.getPendingLocalState(); + + const frozenContainer = await loadFrozenContainerFromPendingState({ + codeLoader, + documentServiceFactory, + urlResolver, + request: { + url, + }, + pendingLocalState, + }); + const frozenEntryPoint: FluidObject = + await frozenContainer.getEntryPoint(); + assert( + frozenEntryPoint.ITestFluidObject !== undefined, + "Expected frozen container entrypoint to be a valid TestFluidObject, but it was undefined", + ); + try { + await frozenContainer.attach(urlResolver.createCreateNewRequest("test")); + assert.fail("attach should have failed"); + } catch (error: any) { + assert.strictEqual( + error.message, + "The Container is not in a valid state for attach [loaded] and [Attached]", + "Error message mismatch", + ); + } + }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c48198e33d2e..7fbdc09b79dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -127,7 +127,7 @@ importers: version: 0.58.3(@types/node@22.14.1) '@fluidframework/eslint-config-fluid': specifier: ^6.0.0 - version: 6.0.0(eslint@8.55.0)(typescript@5.4.5) + version: 6.0.0(eslint@8.55.0)(typescript@5.9.2) eslint: specifier: ~8.55.0 version: 8.55.0 @@ -13845,6 +13845,9 @@ importers: '@fluid-experimental/tree': specifier: workspace:~ version: link:../../../experimental/dds/tree + '@fluid-internal/client-utils': + specifier: workspace:~ + version: link:../../common/client-utils '@fluid-internal/mocha-test-setup': specifier: workspace:~ version: link:../mocha-test-setup @@ -29771,6 +29774,16 @@ snapshots: - supports-color - typescript + '@fluid-internal/eslint-plugin-fluid@0.1.5(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@typescript-eslint/parser': 6.21.0(eslint@8.55.0)(typescript@5.9.2) + ts-morph: 22.0.0 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + '@fluid-internal/test-driver-definitions@2.60.0': dependencies: '@fluidframework/core-interfaces': 2.60.0 @@ -30668,6 +30681,35 @@ snapshots: - supports-color - typescript + '@fluidframework/eslint-config-fluid@6.0.0(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@fluid-internal/eslint-plugin-fluid': 0.1.5(eslint@8.55.0)(typescript@5.9.2) + '@microsoft/tsdoc': 0.14.2 + '@rushstack/eslint-patch': 1.4.0 + '@rushstack/eslint-plugin': 0.13.1(eslint@8.55.0)(typescript@5.9.2) + '@rushstack/eslint-plugin-security': 0.7.1(eslint@8.55.0)(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 6.7.5(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint@8.55.0)(typescript@5.9.2) + '@typescript-eslint/parser': 6.7.5(eslint@8.55.0)(typescript@5.9.2) + eslint-config-biome: 1.9.4 + eslint-config-prettier: 9.0.0(eslint@8.55.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint-plugin-i@2.29.1)(eslint@8.55.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.55.0) + eslint-plugin-import: eslint-plugin-i@2.29.1(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.55.0) + eslint-plugin-jsdoc: 46.8.2(eslint@8.55.0) + eslint-plugin-promise: 6.1.1(eslint@8.55.0) + eslint-plugin-react: 7.33.2(eslint@8.55.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.55.0) + eslint-plugin-tsdoc: 0.2.17 + eslint-plugin-unicorn: 48.0.1(eslint@8.55.0) + eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint@8.55.0)(typescript@5.9.2))(eslint@8.55.0) + transitivePeerDependencies: + - eslint + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + - typescript + '@fluidframework/file-driver@2.60.0': dependencies: '@fluid-internal/client-utils': 2.60.0 @@ -33109,6 +33151,15 @@ snapshots: - supports-color - typescript + '@rushstack/eslint-plugin-security@0.7.1(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@rushstack/tree-pattern': 0.3.1 + '@typescript-eslint/experimental-utils': 5.59.11(eslint@8.55.0)(typescript@5.9.2) + eslint: 8.55.0 + transitivePeerDependencies: + - supports-color + - typescript + '@rushstack/eslint-plugin@0.13.1(eslint@8.55.0)(typescript@5.4.5)': dependencies: '@rushstack/tree-pattern': 0.3.1 @@ -33118,6 +33169,15 @@ snapshots: - supports-color - typescript + '@rushstack/eslint-plugin@0.13.1(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@rushstack/tree-pattern': 0.3.1 + '@typescript-eslint/experimental-utils': 5.59.11(eslint@8.55.0)(typescript@5.9.2) + eslint: 8.55.0 + transitivePeerDependencies: + - supports-color + - typescript + '@rushstack/node-core-library@3.66.1(@types/node@18.19.86)': dependencies: colors: 1.2.5 @@ -33931,6 +33991,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.7.5(eslint@8.55.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 6.7.5 + '@typescript-eslint/type-utils': 6.7.5(eslint@8.55.0)(typescript@5.9.2) + '@typescript-eslint/utils': 6.7.5(eslint@8.55.0)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 6.7.5 + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.55.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.1 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/experimental-utils@5.59.11(eslint@8.55.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/utils': 5.59.11(eslint@8.55.0)(typescript@5.4.5) @@ -33939,6 +34019,14 @@ snapshots: - supports-color - typescript + '@typescript-eslint/experimental-utils@5.59.11(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/utils': 5.59.11(eslint@8.55.0)(typescript@5.9.2) + eslint: 8.55.0 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 @@ -33952,6 +34040,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.55.0 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/scope-manager': 6.7.5 @@ -33965,6 +34066,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 6.7.5 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 6.7.5 + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.55.0 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@5.59.11': dependencies: '@typescript-eslint/types': 5.59.11 @@ -33997,6 +34111,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@6.7.5(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.9.2) + '@typescript-eslint/utils': 6.7.5(eslint@8.55.0)(typescript@5.9.2) + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.55.0 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@5.59.11': {} '@typescript-eslint/types@5.62.0': {} @@ -34019,6 +34145,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@5.59.11(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/visitor-keys': 5.59.11 + debug: 4.4.0(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.1 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -34048,6 +34188,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.7.1 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@6.7.5(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 6.7.5 @@ -34062,6 +34217,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@6.7.5(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/visitor-keys': 6.7.5 + debug: 4.4.0(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.1 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@5.59.11(eslint@8.55.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.55.0) @@ -34077,6 +34246,21 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@5.59.11(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.55.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 5.59.11 + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.9.2) + eslint: 8.55.0 + eslint-scope: 5.1.1 + semver: 7.7.1 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@5.62.0(eslint@8.55.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.55.0) @@ -34106,6 +34290,20 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@6.7.5(eslint@8.55.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.55.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 6.7.5 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.9.2) + eslint: 8.55.0 + semver: 7.7.1 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/visitor-keys@5.59.11': dependencies: '@typescript-eslint/types': 5.59.11 @@ -36376,6 +36574,25 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint-plugin-i@2.29.1)(eslint@8.55.0): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0(supports-color@8.1.1) + enhanced-resolve: 5.17.1 + eslint: 8.55.0 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.55.0) + fast-glob: 3.3.3 + get-tsconfig: 4.10.0 + is-bun-module: 1.3.0 + is-glob: 4.0.3 + optionalDependencies: + eslint-plugin-import: eslint-plugin-i@2.29.1(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.55.0) + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.55.0): dependencies: debug: 3.2.7 @@ -36387,6 +36604,17 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.55.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.7.5(eslint@8.55.0)(typescript@5.9.2) + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint-plugin-i@2.29.1)(eslint@8.55.0) + transitivePeerDependencies: + - supports-color + eslint-plugin-chai-expect@3.0.0(eslint@8.55.0): dependencies: eslint: 8.55.0 @@ -36414,6 +36642,23 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-i@2.29.1(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.55.0): + dependencies: + debug: 4.4.0(supports-color@8.1.1) + doctrine: 3.0.0 + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.55.0) + get-tsconfig: 4.10.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + semver: 7.7.1 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-jest@27.4.3(@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.4.5))(eslint@8.55.0)(typescript@5.4.5))(eslint@8.55.0)(jest@29.7.0(@types/node@18.19.86)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.86)(typescript@5.4.5)))(typescript@5.4.5): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.55.0)(typescript@5.4.5) @@ -36510,6 +36755,13 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 6.7.5(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.4.5))(eslint@8.55.0)(typescript@5.4.5) + eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint@8.55.0)(typescript@5.9.2))(eslint@8.55.0): + dependencies: + eslint: 8.55.0 + eslint-rule-composer: 0.3.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 6.7.5(@typescript-eslint/parser@6.7.5(eslint@8.55.0)(typescript@5.9.2))(eslint@8.55.0)(typescript@5.9.2) + eslint-rule-composer@0.3.0: {} eslint-scope@5.1.1: @@ -43018,6 +43270,10 @@ snapshots: dependencies: typescript: 5.4.5 + ts-api-utils@1.4.3(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + ts-deepmerge@7.0.2: {} ts-interface-checker@0.1.13: {} @@ -43155,6 +43411,11 @@ snapshots: tslib: 1.14.1 typescript: 5.4.5 + tsutils@3.21.0(typescript@5.9.2): + dependencies: + tslib: 1.14.1 + typescript: 5.9.2 + tuf-js@1.1.7: dependencies: '@tufjs/models': 1.0.4 From 885c4d089b44352dfabb6807fa2b0a447bab7f32 Mon Sep 17 00:00:00 2001 From: Daniel Madrid <105010181+dannimad@users.noreply.github.com> Date: Thu, 2 Oct 2025 14:46:33 -0700 Subject: [PATCH 3/4] policy --- packages/test/local-server-tests/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/test/local-server-tests/package.json b/packages/test/local-server-tests/package.json index 8f103c96e378..6739d128093f 100644 --- a/packages/test/local-server-tests/package.json +++ b/packages/test/local-server-tests/package.json @@ -56,8 +56,8 @@ "devDependencies": { "@biomejs/biome": "~1.9.3", "@fluid-experimental/tree": "workspace:~", - "@fluid-internal/mocha-test-setup": "workspace:~", "@fluid-internal/client-utils": "workspace:~", + "@fluid-internal/mocha-test-setup": "workspace:~", "@fluid-private/test-drivers": "workspace:~", "@fluid-private/test-pairwise-generator": "workspace:~", "@fluidframework/aqueduct": "workspace:~", From 5d59b06bdd8bf21b0a9d7df401ca72d3b98213f1 Mon Sep 17 00:00:00 2001 From: Daniel Madrid <105010181+dannimad@users.noreply.github.com> Date: Thu, 2 Oct 2025 15:39:29 -0700 Subject: [PATCH 4/4] nit --- .../src/test/loadFrozenContainerFromPendingState.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts b/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts index 6446a18fa4dd..2e66785ce320 100644 --- a/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts +++ b/packages/test/local-server-tests/src/test/loadFrozenContainerFromPendingState.spec.ts @@ -5,6 +5,7 @@ import { strict as assert } from "assert"; +import { bufferToString, stringToBuffer } from "@fluid-internal/client-utils"; import { asLegacyAlpha, createDetachedContainer, @@ -17,7 +18,6 @@ import { LocalDeltaConnectionServer } from "@fluidframework/server-local-server" import { timeoutPromise, type TestFluidObject } from "@fluidframework/test-utils/internal"; import { createLoader } from "../utils.js"; -import { bufferToString, stringToBuffer } from "@fluid-internal/client-utils"; const toComparableArray = (dir: ISharedMap): [string, unknown][] => [...dir.entries()].map(([key, value]) => [