From afe77d45aa23a40eb2b610f624cab00910a553eb Mon Sep 17 00:00:00 2001 From: James Hunt Date: Wed, 9 Sep 2026 12:33:37 -0700 Subject: [PATCH 01/10] Drop the CommonJS build and migrate build/tests to ESM + Node16 Fluid Framework 3.0 is ESM-only, so a CommonJS build of Live Share cannot consume it under any tsc configuration. This removes the CJS build and moves the remaining CommonJS/Node10 tooling to ESM/Node16, which is a prerequisite for supporting Fluid 3. No Fluid version ranges change here; this is verified against the currently locked Fluid 2.110.0. Live Share v2 is still marked internal, so the breaking packaging change is acceptable now. Packaging (breaking for CommonJS consumers): - Remove "main" and reduce each "exports" entry to its "import" condition, so require() fails cleanly with ERR_PACKAGE_PATH_NOT_EXPORTED rather than resolving ESM through "default" and half-working on Node >= 22.12. - Delete the five tsconfig.cjs.json files and the --cjs build task. - Delete internal/usage-test/cjs-test and its CI step. Build and test tooling: - Point the three tsconfig.test.json files at the ESM/Node16 base. They previously extended tsconfig.cjs.json, which meant the entire mocha suite compiled as CommonJS with Node10 resolution. - Replace ts-mocha with mocha in the test scripts. The suites run compiled JavaScript, so registering ts-node only conflicted with ESM. - Migrate internal/test-utils to Node16/ESM. - Add the .js extensions Node16 ESM requires to relative imports. - Report build failures with the failing package and tsc exit code instead of an unhandled promise rejection. Verified on Fluid 2.110.0: all packages and samples build, live-share 81, live-share-media 57 and live-share-canvas 17 tests pass, the ESM usage test passes, and npm run doctor is clean. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7807308b-8b2a-4390-813d-a986277cec42 --- .github/workflows/live-share-test-usage.yaml | 4 - internal/build-tools/build-package.js | 23 +-- internal/test-utils/package.json | 10 ++ internal/test-utils/src/compatUtils.ts | 6 +- internal/test-utils/src/describeCompat.ts | 6 +- internal/test-utils/src/index.ts | 5 +- internal/test-utils/tsconfig.json | 3 +- internal/usage-test/cjs-test/.npmrc | 1 - internal/usage-test/cjs-test/package.json | 20 --- internal/usage-test/cjs-test/src/index.js | 29 ---- package-lock.json | 153 ------------------ packages/live-share-acs/package.json | 7 +- packages/live-share-acs/tsconfig.cjs.json | 14 -- packages/live-share-canvas/package.json | 11 +- .../src/test/Miscellaneous.spec.ts | 6 +- .../src/test/Security.spec.ts | 5 +- .../live-share-canvas/src/test/Stroke.spec.ts | 6 +- .../live-share-canvas/src/test/Utils.spec.ts | 2 +- packages/live-share-canvas/tsconfig.cjs.json | 14 -- packages/live-share-canvas/tsconfig.test.json | 3 +- packages/live-share-media/package.json | 11 +- .../src/test/GroupPlaybackPosition.spec.ts | 14 +- .../src/test/GroupPlaybackRate.spec.ts | 2 +- .../src/test/GroupPlaybackTrack.spec.ts | 4 +- .../src/test/GroupPlaybackTrackData.spec.ts | 6 +- ...veMediaSession_ManualActionHandler.spec.ts | 9 +- .../LiveMediaSession_Synchronizer.spec.ts | 6 +- .../src/test/PriorityTimeInterval.spec.ts | 2 +- .../live-share-media/src/test/TestUtils.ts | 4 +- .../src/test/VolumeManager.spec.ts | 4 +- packages/live-share-media/tsconfig.cjs.json | 14 -- packages/live-share-media/tsconfig.test.json | 3 +- packages/live-share-react/package.json | 7 +- packages/live-share-react/tsconfig.cjs.json | 14 -- packages/live-share/package.json | 15 +- packages/live-share/tsconfig.cjs.json | 9 -- packages/live-share/tsconfig.test.json | 3 +- 37 files changed, 84 insertions(+), 371 deletions(-) delete mode 100644 internal/usage-test/cjs-test/.npmrc delete mode 100644 internal/usage-test/cjs-test/package.json delete mode 100644 internal/usage-test/cjs-test/src/index.js delete mode 100644 packages/live-share-acs/tsconfig.cjs.json delete mode 100644 packages/live-share-canvas/tsconfig.cjs.json delete mode 100644 packages/live-share-media/tsconfig.cjs.json delete mode 100644 packages/live-share-react/tsconfig.cjs.json delete mode 100644 packages/live-share/tsconfig.cjs.json diff --git a/.github/workflows/live-share-test-usage.yaml b/.github/workflows/live-share-test-usage.yaml index bc155fb26..bad840940 100644 --- a/.github/workflows/live-share-test-usage.yaml +++ b/.github/workflows/live-share-test-usage.yaml @@ -27,10 +27,6 @@ jobs: - run: npm run prepare # will trigger a build of all packages - - name: "test live-share with cjs app" - run: npm run test - working-directory: internal/usage-test/cjs-test - - name: "test live-share with esm app" run: npm run test working-directory: internal/usage-test/esm-test diff --git a/internal/build-tools/build-package.js b/internal/build-tools/build-package.js index aa6977663..9b096083c 100644 --- a/internal/build-tools/build-package.js +++ b/internal/build-tools/build-package.js @@ -1,10 +1,9 @@ /** - * Tool used to consolidate building package with different outputs of esm, cjs, or cjs with tests included. - * Invocation with all arguments looks like `node /build-package.js --cjs --esm --test` + * Tool used to consolidate building package with different outputs of esm, or esm with tests included. + * Invocation with all arguments looks like `node /build-package.js --esm --test` */ const childProcess = require("child_process"); -const fs = require("fs"); const { argv } = require("process"); async function build(tsConfig) { @@ -30,23 +29,15 @@ async function build(tsConfig) { }); } -function addCJSPackageJsonOverride(type) { - fs.writeFileSync( - `./bin/${type}/package.json`, - JSON.stringify({ type: "commonjs" }) - ); -} - const esmBuildTask = argv.includes("--esm") ? build("tsconfig.json") : Promise.resolve(); -const cjsBuildTask = argv.includes("--cjs") - ? build("tsconfig.cjs.json").then(() => addCJSPackageJsonOverride("cjs")) - : Promise.resolve(); - const testBuildTask = argv.includes("--test") - ? build("tsconfig.test.json").then(() => addCJSPackageJsonOverride("test")) + ? build("tsconfig.test.json") : Promise.resolve(); -Promise.all([esmBuildTask, cjsBuildTask, testBuildTask]); +Promise.all([esmBuildTask, testBuildTask]).catch((code) => { + console.error(`build failed in ${process.cwd()} (tsc exit ${code})`); + process.exit(typeof code === "number" && code !== 0 ? code : 1); +}); diff --git a/internal/test-utils/package.json b/internal/test-utils/package.json index f6db742f9..241095a4c 100644 --- a/internal/test-utils/package.json +++ b/internal/test-utils/package.json @@ -58,5 +58,15 @@ "prettier": "^3.3.3", "rimraf": "^4.4.0", "typescript": "~5.5.3" + }, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./bin/index.d.ts", + "default": "./bin/index.js" + } + } } } diff --git a/internal/test-utils/src/compatUtils.ts b/internal/test-utils/src/compatUtils.ts index c7aeb5e6b..9481d2546 100644 --- a/internal/test-utils/src/compatUtils.ts +++ b/internal/test-utils/src/compatUtils.ts @@ -22,9 +22,9 @@ import { TestObjectProvider, } from "@fluidframework/test-utils/internal"; import { mixinAttributor } from "@fluid-experimental/attributor"; -import { ContainerRuntimeApi, DataRuntimeApi, LoaderApi } from "./testApi"; -import { LocalServerTestDriver } from "./localServerTestDriver"; -import { LocalDriverApi } from "./localDriverApi"; +import { ContainerRuntimeApi, DataRuntimeApi, LoaderApi } from "./testApi.js"; +import { LocalServerTestDriver } from "./localServerTestDriver.js"; +import { LocalDriverApi } from "./localDriverApi.js"; /** * @internal diff --git a/internal/test-utils/src/describeCompat.ts b/internal/test-utils/src/describeCompat.ts index 87bdd3080..28c8e3f31 100644 --- a/internal/test-utils/src/describeCompat.ts +++ b/internal/test-utils/src/describeCompat.ts @@ -11,9 +11,9 @@ import { import { CompatApis, getVersionedTestObjectProviderFromApis, -} from "./compatUtils"; -import { ContainerRuntimeApi, DataRuntimeApi, LoaderApi } from "./testApi"; -import { LocalDriverApi } from "./localDriverApi"; +} from "./compatUtils.js"; +import { ContainerRuntimeApi, DataRuntimeApi, LoaderApi } from "./testApi.js"; +import { LocalDriverApi } from "./localDriverApi.js"; /* * Mocha Utils for test to generate the compat variants. diff --git a/internal/test-utils/src/index.ts b/internal/test-utils/src/index.ts index 07afbaf81..133e13179 100644 --- a/internal/test-utils/src/index.ts +++ b/internal/test-utils/src/index.ts @@ -3,4 +3,7 @@ * Licensed under the MIT License. */ -export { describeCompat, ITestObjectProviderOptions } from "./describeCompat"; +export { + describeCompat, + ITestObjectProviderOptions, +} from "./describeCompat.js"; diff --git a/internal/test-utils/tsconfig.json b/internal/test-utils/tsconfig.json index 264b28619..a6bac04bb 100644 --- a/internal/test-utils/tsconfig.json +++ b/internal/test-utils/tsconfig.json @@ -5,7 +5,8 @@ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "CommonJS" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "module": "Node16", + "moduleResolution": "Node16", "lib": [ "es2020", "DOM" diff --git a/internal/usage-test/cjs-test/.npmrc b/internal/usage-test/cjs-test/.npmrc deleted file mode 100644 index 214c29d13..000000000 --- a/internal/usage-test/cjs-test/.npmrc +++ /dev/null @@ -1 +0,0 @@ -registry=https://registry.npmjs.org/ diff --git a/internal/usage-test/cjs-test/package.json b/internal/usage-test/cjs-test/package.json deleted file mode 100644 index 7c38917aa..000000000 --- a/internal/usage-test/cjs-test/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "live-share-cjs-test", - "version": "1.0.0", - "description": "", - "main": "src/index.js", - "type": "commonjs", - "scripts": { - "test": "npm install && node src/index.js" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "@microsoft/live-share": "file:/../../../packages/live-share", - "fluid-framework": ">=2.40 <2.120" - }, - "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120" - } -} diff --git a/internal/usage-test/cjs-test/src/index.js b/internal/usage-test/cjs-test/src/index.js deleted file mode 100644 index 4ef47edba..000000000 --- a/internal/usage-test/cjs-test/src/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const { LiveShareClient, TestLiveShareHost } = require("@microsoft/live-share"); -const { waitForDelay } = require("@microsoft/live-share/internal"); -const { - InsecureTokenProvider, -} = require("@fluidframework/test-runtime-utils/internal"); - -const client = new LiveShareClient( - TestLiveShareHost.create( - new InsecureTokenProvider("", { - id: "testId", - name: "Test User", - }) - ) -); -const canUseLiveShare = client !== undefined; -const canUseLiveShareInternal = waitForDelay(10) !== undefined; - -if (!canUseLiveShare) { - process.exit(1); -} - -if (!canUseLiveShareInternal) { - process.exit(2); -} - -console.log("client", client); -console.log( - "Sucessfully imported and able to use Live Share package in cjs project" -); diff --git a/package-lock.json b/package-lock.json index 8bcb43552..655d246e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3405,63 +3405,6 @@ "eslint-plugin-unused-imports": "~4.2.0" } }, - "node_modules/@fluidframework/eslint-config-fluid/node_modules/@typescript-eslint/project-service": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.0.tgz", - "integrity": "sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.62.0", - "@typescript-eslint/types": "^8.62.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@fluidframework/eslint-config-fluid/node_modules/@typescript-eslint/scope-manager": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.0.tgz", - "integrity": "sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@fluidframework/eslint-config-fluid/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.0.tgz", - "integrity": "sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, "node_modules/@fluidframework/eslint-config-fluid/node_modules/@typescript-eslint/types": { "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.0.tgz", @@ -3476,76 +3419,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@fluidframework/eslint-config-fluid/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.0.tgz", - "integrity": "sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.62.0", - "@typescript-eslint/tsconfig-utils": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@fluidframework/eslint-config-fluid/node_modules/@typescript-eslint/utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.0.tgz", - "integrity": "sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@fluidframework/eslint-config-fluid/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.0.tgz", - "integrity": "sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.62.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@fluidframework/eslint-config-fluid/node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -3687,19 +3560,6 @@ } } }, - "node_modules/@fluidframework/eslint-config-fluid/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "extraneous": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@fluidframework/eslint-config-fluid/node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", @@ -3716,19 +3576,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@fluidframework/eslint-config-fluid/node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/@fluidframework/fluid-static": { "version": "2.110.0", "resolved": "https://registry.npmjs.org/@fluidframework/fluid-static/-/fluid-static-2.110.0.tgz", diff --git a/packages/live-share-acs/package.json b/packages/live-share-acs/package.json index 8509b517d..755a7ca43 100644 --- a/packages/live-share-acs/package.json +++ b/packages/live-share-acs/package.json @@ -4,13 +4,12 @@ "description": "Live Share integration package for Azure Communication Services.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "main": "./bin/cjs/index.js", "module": "./bin/esm/index.js", "types": "./bin/esm/index.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", - "build": "node ../../internal/build-tools/build-package.js --cjs --esm", + "build": "node ../../internal/build-tools/build-package.js --esm", "test": "ts-mocha src/**/*.spec.ts --timeout 10000", "test:debug": "ts-mocha src/**/*.spec.ts --inspect-brk", "test:coverage": "nyc --reporter=html --reporter=text --reporter=text-summary npm test" @@ -18,10 +17,6 @@ "exports": { "./package.json": "./package.json", ".": { - "require": { - "types": "./bin/cjs/index.d.ts", - "default": "./bin/cjs/index.js" - }, "import": { "types": "./bin/esm/index.d.ts", "default": "./bin/esm/index.js" diff --git a/packages/live-share-acs/tsconfig.cjs.json b/packages/live-share-acs/tsconfig.cjs.json deleted file mode 100644 index 8a7de87cf..000000000 --- a/packages/live-share-acs/tsconfig.cjs.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./bin/cjs", - "module": "CommonJS", - "moduleResolution": "Node10", - "downlevelIteration": true, - "paths": { - "@microsoft/live-share/internal": [ - "../live-share/bin/esm/index.internal.d.ts" - ] - } - } -} diff --git a/packages/live-share-canvas/package.json b/packages/live-share-canvas/package.json index 01c7b0e6b..fbc70d2f0 100644 --- a/packages/live-share-canvas/package.json +++ b/packages/live-share-canvas/package.json @@ -4,25 +4,20 @@ "description": "Live Share extension library for collaborative inking.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "main": "./bin/cjs/index.js", "module": "./bin/esm/index.js", "types": "./bin/esm/index.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", - "build": "node ../../internal/build-tools/build-package.js --cjs --esm", + "build": "node ../../internal/build-tools/build-package.js --esm", "build:test": "node ../../internal/build-tools/build-package.js --test", - "test": "npm run build:test && ts-mocha -p tsconfig.test.json --recursive \"./bin/test/**/*.spec.js\" --timeout 10000", - "test:debug": "ts-mocha src/**/*.spec.ts --inspect-brk", + "test": "npm run build:test && mocha --recursive \"./bin/test/**/*.spec.js\" --timeout 10000", + "test:debug": "npm run build:test && mocha --recursive \"./bin/test/**/*.spec.js\" --inspect-brk", "test:coverage": "nyc --reporter=html --reporter=text --reporter=text-summary npm test" }, "exports": { "./package.json": "./package.json", ".": { - "require": { - "types": "./bin/cjs/index.d.ts", - "default": "./bin/cjs/index.js" - }, "import": { "types": "./bin/esm/index.d.ts", "default": "./bin/esm/index.js" diff --git a/packages/live-share-canvas/src/test/Miscellaneous.spec.ts b/packages/live-share-canvas/src/test/Miscellaneous.spec.ts index ef1761b4f..6b5cf54df 100644 --- a/packages/live-share-canvas/src/test/Miscellaneous.spec.ts +++ b/packages/live-share-canvas/src/test/Miscellaneous.spec.ts @@ -10,15 +10,15 @@ import { screenToViewport, viewportToScreen, ISegment, -} from "../core"; -import { assertObjectsEqual } from "./Utils.spec"; +} from "../core/index.js"; +import { assertObjectsEqual } from "./Utils.spec.js"; import { doRectanglesOverlap, getSegmentsIntersection, isPointInsideRectangle, isRectangleInsideRectangle, segmentsMayIntersect, -} from "../core/internals"; +} from "../core/internals/index.js"; const testColor: IColor = { r: 193, g: 221, b: 202 }; const serializedTestColor = "#C1DDCA"; diff --git a/packages/live-share-canvas/src/test/Security.spec.ts b/packages/live-share-canvas/src/test/Security.spec.ts index 4fea25d64..dcd6b462f 100644 --- a/packages/live-share-canvas/src/test/Security.spec.ts +++ b/packages/live-share-canvas/src/test/Security.spec.ts @@ -1,6 +1,9 @@ import "mocha"; import { strict as assert } from "assert"; -import { BuiltInLiveCursor, sanitizeUserPictureUrl } from "../core/internals"; +import { + BuiltInLiveCursor, + sanitizeUserPictureUrl, +} from "../core/internals/index.js"; class MockElement { public readonly children: MockElement[] = []; diff --git a/packages/live-share-canvas/src/test/Stroke.spec.ts b/packages/live-share-canvas/src/test/Stroke.spec.ts index bb1183c83..01f0f8b91 100644 --- a/packages/live-share-canvas/src/test/Stroke.spec.ts +++ b/packages/live-share-canvas/src/test/Stroke.spec.ts @@ -1,12 +1,12 @@ import "mocha"; import { strict as assert } from "assert"; -import { Stroke } from "../core/Stroke"; +import { Stroke } from "../core/Stroke.js"; import { assertPointArraysEqual, copyPointArrayAndDuplidateEachPoint, reducePointArrayPrecision, -} from "./Utils.spec"; -import { IPointerPoint } from "../core"; +} from "./Utils.spec.js"; +import { IPointerPoint } from "../core/index.js"; const testPoints: IPointerPoint[] = [ { diff --git a/packages/live-share-canvas/src/test/Utils.spec.ts b/packages/live-share-canvas/src/test/Utils.spec.ts index 5e85e19b3..c851e1f2f 100644 --- a/packages/live-share-canvas/src/test/Utils.spec.ts +++ b/packages/live-share-canvas/src/test/Utils.spec.ts @@ -1,6 +1,6 @@ import "mocha"; import { strict as assert } from "assert"; -import { Stroke, IPointerPoint, IColor, IRect } from "../core"; +import { Stroke, IPointerPoint, IColor, IRect } from "../core/index.js"; export const coordinateSerializationPrecision = Stroke[ "coordinateSerializationPrecision" diff --git a/packages/live-share-canvas/tsconfig.cjs.json b/packages/live-share-canvas/tsconfig.cjs.json deleted file mode 100644 index 8a7de87cf..000000000 --- a/packages/live-share-canvas/tsconfig.cjs.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./bin/cjs", - "module": "CommonJS", - "moduleResolution": "Node10", - "downlevelIteration": true, - "paths": { - "@microsoft/live-share/internal": [ - "../live-share/bin/esm/index.internal.d.ts" - ] - } - } -} diff --git a/packages/live-share-canvas/tsconfig.test.json b/packages/live-share-canvas/tsconfig.test.json index 59cee05ef..398bdec25 100644 --- a/packages/live-share-canvas/tsconfig.test.json +++ b/packages/live-share-canvas/tsconfig.test.json @@ -1,9 +1,10 @@ { - "extends": "./tsconfig.cjs.json", + "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./bin/test", "types": ["mocha", "node"] }, + "files": [], "include": ["src/**/*"], "exclude": [] } diff --git a/packages/live-share-media/package.json b/packages/live-share-media/package.json index b6c0c63cd..613f38bf2 100644 --- a/packages/live-share-media/package.json +++ b/packages/live-share-media/package.json @@ -4,26 +4,21 @@ "description": "Live Share classes that synchronize media playback across clients.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "main": "./bin/cjs/index.js", "module": "./bin/esm/index.js", "types": "./bin/esm/index.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", - "build": "node ../../internal/build-tools/build-package.js --cjs --esm", + "build": "node ../../internal/build-tools/build-package.js --esm", "build:test": "node ../../internal/build-tools/build-package.js --test", - "test": "npm run build:test && ts-mocha -p tsconfig.test.json --config .mocharc.cjs --recursive \"./bin/test/**/*.spec.js\" --timeout 10000", - "test:debug": "npm run build:test && ts-mocha -p tsconfig.test.json --config .mocharc.cjs --recursive \"./bin/test/**/LiveMediaSession_Synchronizer.spec.js\" --inspect-brk", + "test": "npm run build:test && mocha --config .mocharc.cjs --recursive \"./bin/test/**/*.spec.js\" --timeout 10000", + "test:debug": "npm run build:test && mocha --config .mocharc.cjs --recursive \"./bin/test/**/LiveMediaSession_Synchronizer.spec.js\" --inspect-brk", "test:coverage": "nyc --reporter=html --reporter=text --reporter=text-summary npm test", "test:race": "node ./../live-share/test-for-race-conditions.js" }, "exports": { "./package.json": "./package.json", ".": { - "require": { - "types": "./bin/cjs/index.d.ts", - "default": "./bin/cjs/index.js" - }, "import": { "types": "./bin/esm/index.d.ts", "default": "./bin/esm/index.js" diff --git a/packages/live-share-media/src/test/GroupPlaybackPosition.spec.ts b/packages/live-share-media/src/test/GroupPlaybackPosition.spec.ts index 7ca5f23dd..ed0dd21b7 100644 --- a/packages/live-share-media/src/test/GroupPlaybackPosition.spec.ts +++ b/packages/live-share-media/src/test/GroupPlaybackPosition.spec.ts @@ -9,16 +9,16 @@ import { CoordinationWaitPoint, ExtendedMediaMetadata, ExtendedMediaSessionPlaybackState, -} from "../MediaSessionExtensions"; +} from "../MediaSessionExtensions.js"; import { GroupPlaybackPosition, ICurrentPlaybackPosition, -} from "../internals/GroupPlaybackPosition"; -import { GroupPlaybackRate } from "../internals/GroupPlaybackRate"; +} from "../internals/GroupPlaybackPosition.js"; +import { GroupPlaybackRate } from "../internals/GroupPlaybackRate.js"; import { GroupTransportState, ITransportState, -} from "../internals/GroupTransportState"; +} from "../internals/GroupTransportState.js"; import { TestLiveShareHost } from "@microsoft/live-share"; import { IRuntimeSignaler, @@ -26,9 +26,9 @@ import { MockLiveShareRuntime, MockTokenProvider, } from "@microsoft/live-share/internal"; -import { IMediaPlayerState } from "../LiveMediaSessionCoordinator"; -import { GroupPlaybackTrack } from "../internals/GroupPlaybackTrack"; -import { PriorityTimeInterval } from "../internals/PriorityTimeInterval"; +import { IMediaPlayerState } from "../LiveMediaSessionCoordinator.js"; +import { GroupPlaybackTrack } from "../internals/GroupPlaybackTrack.js"; +import { PriorityTimeInterval } from "../internals/PriorityTimeInterval.js"; function createTransportUpdate( runtime: IRuntimeSignaler, diff --git a/packages/live-share-media/src/test/GroupPlaybackRate.spec.ts b/packages/live-share-media/src/test/GroupPlaybackRate.spec.ts index 9fc969e85..5317d4ed0 100644 --- a/packages/live-share-media/src/test/GroupPlaybackRate.spec.ts +++ b/packages/live-share-media/src/test/GroupPlaybackRate.spec.ts @@ -5,7 +5,7 @@ import "mocha"; import { strict as assert } from "assert"; -import { GroupPlaybackRate } from "../internals/GroupPlaybackRate"; +import { GroupPlaybackRate } from "../internals/GroupPlaybackRate.js"; describe("GroupPlaybackRate", () => { it("updatePlaybackRate should return false for older events", () => { diff --git a/packages/live-share-media/src/test/GroupPlaybackTrack.spec.ts b/packages/live-share-media/src/test/GroupPlaybackTrack.spec.ts index 8a2ec52d4..ee8aed0b2 100644 --- a/packages/live-share-media/src/test/GroupPlaybackTrack.spec.ts +++ b/packages/live-share-media/src/test/GroupPlaybackTrack.spec.ts @@ -9,8 +9,8 @@ import { GroupPlaybackTrack, GroupPlaybackTrackEvents, IPlaybackTrackChangeEvent, -} from "../internals/GroupPlaybackTrack"; -import { ExtendedMediaMetadata } from "../MediaSessionExtensions"; +} from "../internals/GroupPlaybackTrack.js"; +import { ExtendedMediaMetadata } from "../MediaSessionExtensions.js"; import { Deferred } from "@microsoft/live-share/internal"; describe("GroupPlaybackTrack", () => { diff --git a/packages/live-share-media/src/test/GroupPlaybackTrackData.spec.ts b/packages/live-share-media/src/test/GroupPlaybackTrackData.spec.ts index 1735bfd73..e1aed8775 100644 --- a/packages/live-share-media/src/test/GroupPlaybackTrackData.spec.ts +++ b/packages/live-share-media/src/test/GroupPlaybackTrackData.spec.ts @@ -5,9 +5,9 @@ import "mocha"; import { strict as assert } from "assert"; -import { GroupPlaybackTrack } from "../internals/GroupPlaybackTrack"; -import { ExtendedMediaMetadata } from "../MediaSessionExtensions"; -import { GroupPlaybackTrackData } from "../internals/GroupPlaybackTrackData"; +import { GroupPlaybackTrack } from "../internals/GroupPlaybackTrack.js"; +import { ExtendedMediaMetadata } from "../MediaSessionExtensions.js"; +import { GroupPlaybackTrackData } from "../internals/GroupPlaybackTrackData.js"; describe("GroupPlaybackTrackData", () => { const track1 = { diff --git a/packages/live-share-media/src/test/LiveMediaSession_ManualActionHandler.spec.ts b/packages/live-share-media/src/test/LiveMediaSession_ManualActionHandler.spec.ts index f9071f58d..8f1acce9e 100644 --- a/packages/live-share-media/src/test/LiveMediaSession_ManualActionHandler.spec.ts +++ b/packages/live-share-media/src/test/LiveMediaSession_ManualActionHandler.spec.ts @@ -3,7 +3,10 @@ * Licensed under the Microsoft Live Share SDK License. */ -import { TestLiveMediaSession, TestMediaTimeStampProvider } from "./TestUtils"; +import { + TestLiveMediaSession, + TestMediaTimeStampProvider, +} from "./TestUtils.js"; import { strict as assert } from "assert"; import { ITestObjectProvider, @@ -29,8 +32,8 @@ import { import { ExtendedMediaMetadata, ExtendedMediaSessionActionDetails, -} from "../MediaSessionExtensions"; -import { IMediaPlayerState } from "../LiveMediaSessionCoordinator"; +} from "../MediaSessionExtensions.js"; +import { IMediaPlayerState } from "../LiveMediaSessionCoordinator.js"; import { ITestObjectProviderOptions, describeCompat, diff --git a/packages/live-share-media/src/test/LiveMediaSession_Synchronizer.spec.ts b/packages/live-share-media/src/test/LiveMediaSession_Synchronizer.spec.ts index 2fd823d95..6a3223089 100644 --- a/packages/live-share-media/src/test/LiveMediaSession_Synchronizer.spec.ts +++ b/packages/live-share-media/src/test/LiveMediaSession_Synchronizer.spec.ts @@ -7,7 +7,7 @@ import { TestLiveMediaSession, TestMediaPlayer, TestMediaTimeStampProvider, -} from "./TestUtils"; +} from "./TestUtils.js"; import { strict as assert } from "assert"; import { getContainerEntryPointBackCompat, @@ -35,12 +35,12 @@ import { ExtendedMediaSessionActionDetails, ExtendedMediaSessionActionIgnore, ExtendedMediaSessionActionSource, -} from "../MediaSessionExtensions"; +} from "../MediaSessionExtensions.js"; import { IMediaPlayerSynchronizerEvent, MediaPlayerSynchronizer, MediaPlayerSynchronizerEvents, -} from "../MediaPlayerSynchronizer"; +} from "../MediaPlayerSynchronizer.js"; import { ITestObjectProviderOptions, describeCompat, diff --git a/packages/live-share-media/src/test/PriorityTimeInterval.spec.ts b/packages/live-share-media/src/test/PriorityTimeInterval.spec.ts index f5658fe1c..1f9faa098 100644 --- a/packages/live-share-media/src/test/PriorityTimeInterval.spec.ts +++ b/packages/live-share-media/src/test/PriorityTimeInterval.spec.ts @@ -5,7 +5,7 @@ import "mocha"; import { strict as assert } from "assert"; -import { PriorityTimeInterval } from "../internals/PriorityTimeInterval"; +import { PriorityTimeInterval } from "../internals/PriorityTimeInterval.js"; describe("PriorityTimeInterval", () => { it("Should scale properly with default values in constructor", () => { diff --git a/packages/live-share-media/src/test/TestUtils.ts b/packages/live-share-media/src/test/TestUtils.ts index dda79a869..e087d2614 100644 --- a/packages/live-share-media/src/test/TestUtils.ts +++ b/packages/live-share-media/src/test/TestUtils.ts @@ -3,8 +3,8 @@ * Licensed under the Microsoft Live Share SDK License. */ -import { IMediaPlayer } from "../IMediaPlayer"; -import { LiveMediaSession } from "../LiveMediaSession"; +import { IMediaPlayer } from "../IMediaPlayer.js"; +import { LiveMediaSession } from "../LiveMediaSession.js"; import { ITimestampProvider } from "@microsoft/live-share"; import { Deferred, diff --git a/packages/live-share-media/src/test/VolumeManager.spec.ts b/packages/live-share-media/src/test/VolumeManager.spec.ts index 4cce4210b..3002f2359 100644 --- a/packages/live-share-media/src/test/VolumeManager.spec.ts +++ b/packages/live-share-media/src/test/VolumeManager.spec.ts @@ -1,6 +1,6 @@ import { strict as assert } from "assert"; -import { IMediaPlayer } from "../IMediaPlayer"; -import { LimitLevelType, VolumeManager } from "../VolumeManager"; +import { IMediaPlayer } from "../IMediaPlayer.js"; +import { LimitLevelType, VolumeManager } from "../VolumeManager.js"; import { Deferred, waitForDelay } from "@microsoft/live-share/internal"; // few millis more than max timeout callback in scheduleAnimationFrame diff --git a/packages/live-share-media/tsconfig.cjs.json b/packages/live-share-media/tsconfig.cjs.json deleted file mode 100644 index 8a7de87cf..000000000 --- a/packages/live-share-media/tsconfig.cjs.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./bin/cjs", - "module": "CommonJS", - "moduleResolution": "Node10", - "downlevelIteration": true, - "paths": { - "@microsoft/live-share/internal": [ - "../live-share/bin/esm/index.internal.d.ts" - ] - } - } -} diff --git a/packages/live-share-media/tsconfig.test.json b/packages/live-share-media/tsconfig.test.json index 59cee05ef..398bdec25 100644 --- a/packages/live-share-media/tsconfig.test.json +++ b/packages/live-share-media/tsconfig.test.json @@ -1,9 +1,10 @@ { - "extends": "./tsconfig.cjs.json", + "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./bin/test", "types": ["mocha", "node"] }, + "files": [], "include": ["src/**/*"], "exclude": [] } diff --git a/packages/live-share-react/package.json b/packages/live-share-react/package.json index b8f63b5ac..3b421683b 100644 --- a/packages/live-share-react/package.json +++ b/packages/live-share-react/package.json @@ -4,22 +4,17 @@ "description": "Build collaborative React apps using Microsoft's Fluid & Live Share frameworks with ease.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "main": "./bin/cjs/index.js", "module": "./bin/esm/index.js", "types": "./bin/esm/index.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", - "build": "node ../../internal/build-tools/build-package.js --cjs --esm", + "build": "node ../../internal/build-tools/build-package.js --esm", "typecheck": "tsc" }, "exports": { "./package.json": "./package.json", ".": { - "require": { - "types": "./bin/cjs/index.d.ts", - "default": "./bin/cjs/index.js" - }, "import": { "types": "./bin/esm/index.d.ts", "default": "./bin/esm/index.js" diff --git a/packages/live-share-react/tsconfig.cjs.json b/packages/live-share-react/tsconfig.cjs.json deleted file mode 100644 index 8a7de87cf..000000000 --- a/packages/live-share-react/tsconfig.cjs.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./bin/cjs", - "module": "CommonJS", - "moduleResolution": "Node10", - "downlevelIteration": true, - "paths": { - "@microsoft/live-share/internal": [ - "../live-share/bin/esm/index.internal.d.ts" - ] - } - } -} diff --git a/packages/live-share/package.json b/packages/live-share/package.json index 04a849c9a..ab0d040eb 100644 --- a/packages/live-share/package.json +++ b/packages/live-share/package.json @@ -4,17 +4,16 @@ "description": "Building collaborative experiences for Microsoft Teams and M365 using Fluid.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "main": "./bin/cjs/index.public.js", "module": "./bin/esm/index.public.js", "types": "./bin/esm/index.public.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", - "build": "node ../../internal/build-tools/build-package.js --cjs --esm", + "build": "node ../../internal/build-tools/build-package.js --esm", "build:test": "node ../../internal/build-tools/build-package.js --test", "test": "npm run build:test && start-server-and-test test:client:start:server 7070 test:run", - "test:run": "ts-mocha -p tsconfig.test.json --config .mocharc.cjs --recursive \"./bin/test/**/*.spec.js\" --timeout 10000", - "test:debug": "npm run build:test && ts-mocha --config .mocharc.cjs --recursive \"./bin/test/**/*.spec.js\" --inspect-brk", + "test:run": "mocha --config .mocharc.cjs --recursive \"./bin/test/**/*.spec.js\" --timeout 10000", + "test:debug": "npm run build:test && mocha --config .mocharc.cjs --recursive \"./bin/test/**/*.spec.js\" --inspect-brk", "test:coverage": "nyc --reporter=html --reporter=text --reporter=text-summary npm test", "test:race": "npm run build:test && start-server-and-test test:client:start:server 7070 test:race:run", "test:race:run": "node test-for-race-conditions.js", @@ -26,20 +25,12 @@ "exports": { "./package.json": "./package.json", ".": { - "require": { - "types": "./bin/cjs/index.public.d.ts", - "default": "./bin/cjs/index.public.js" - }, "import": { "types": "./bin/esm/index.public.d.ts", "default": "./bin/esm/index.public.js" } }, "./internal": { - "require": { - "types": "./bin/cjs/index.internal.d.ts", - "default": "./bin/cjs/index.internal.js" - }, "import": { "types": "./bin/esm/index.internal.d.ts", "default": "./bin/esm/index.internal.js" diff --git a/packages/live-share/tsconfig.cjs.json b/packages/live-share/tsconfig.cjs.json deleted file mode 100644 index 343d65f21..000000000 --- a/packages/live-share/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./bin/cjs", - "module": "CommonJS", - "moduleResolution": "Node10", - "downlevelIteration": true - } -} diff --git a/packages/live-share/tsconfig.test.json b/packages/live-share/tsconfig.test.json index 59cee05ef..398bdec25 100644 --- a/packages/live-share/tsconfig.test.json +++ b/packages/live-share/tsconfig.test.json @@ -1,9 +1,10 @@ { - "extends": "./tsconfig.cjs.json", + "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./bin/test", "types": ["mocha", "node"] }, + "files": [], "include": ["src/**/*"], "exclude": [] } From 532f93202617fb833418066cacbcff9e6636165d Mon Sep 17 00:00:00 2001 From: James Hunt Date: Mon, 14 Sep 2026 16:24:30 -0600 Subject: [PATCH 02/10] Address PR feedback: ES2022 target and trim redundant package entry points Follow-ups to review comments on #888. Build: - Raise "target" and "lib" from es6/es2020 to ES2022 across the five packages and internal/test-utils. This matches Fluid Framework 3.x, which builds at ES2022 in common/build/build-common/tsconfig.base.json. - Leave "useDefineForClassFields" unset so it takes its ES2022 default of true, again matching Fluid. Live Share now compiles with standard ECMAScript class field semantics rather than TypeScript's legacy assignment semantics. Fluid only opts out in the experimental PropertyDDS packages, which depend on the legacy behavior; nothing here does. - Drop "moduleResolution", which is implied by "module": "Node16". Packaging: - Remove the top-level "module" and "types" fields. Resolution already goes through "exports", and CommonJS/Node10 consumers were dropped in the previous commit. - Reduce each "exports" entry to "import": ".js". The "types" condition is only required when the .d.ts is not adjacent to the .js, and every package emits both into the same directory. Verified: all packages and samples build, live-share 81, live-share-media 57 and live-share-canvas 17 tests pass, and the ESM and pnpm usage tests pass. Type-checking every project with useDefineForClassFields enabled reports no class field collisions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 59286b4a-1977-4cb4-a0f8-e50fde36924e --- internal/test-utils/package.json | 7 +------ internal/test-utils/tsconfig.json | 5 ++--- packages/live-share-acs/package.json | 7 +------ packages/live-share-acs/tsconfig.json | 7 +++---- packages/live-share-canvas/package.json | 7 +------ packages/live-share-canvas/tsconfig.json | 7 +++---- packages/live-share-media/package.json | 7 +------ packages/live-share-media/tsconfig.json | 7 +++---- packages/live-share-react/package.json | 7 +------ packages/live-share-react/tsconfig.json | 7 +++---- packages/live-share/package.json | 12 ++---------- packages/live-share/tsconfig.json | 7 +++---- 12 files changed, 24 insertions(+), 63 deletions(-) diff --git a/internal/test-utils/package.json b/internal/test-utils/package.json index 241095a4c..b826f5a64 100644 --- a/internal/test-utils/package.json +++ b/internal/test-utils/package.json @@ -10,8 +10,6 @@ "license": "MIT", "author": "Microsoft and contributors", "sideEffects": false, - "main": "./bin/index.js", - "types": "./bin/index.d.ts", "scripts": { "build": "tsc -p tsconfig.json", "eslint": "eslint --format stylish src", @@ -63,10 +61,7 @@ "exports": { "./package.json": "./package.json", ".": { - "import": { - "types": "./bin/index.d.ts", - "default": "./bin/index.js" - } + "import": "./bin/index.js" } } } diff --git a/internal/test-utils/tsconfig.json b/internal/test-utils/tsconfig.json index a6bac04bb..dd3d111d2 100644 --- a/internal/test-utils/tsconfig.json +++ b/internal/test-utils/tsconfig.json @@ -4,11 +4,10 @@ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "target": "ES2022" /* Specify ECMAScript target version. */, "module": "Node16", - "moduleResolution": "Node16", "lib": [ - "es2020", + "ES2022", "DOM" ] /* Specify library files to be included in the compilation. */, "allowJs": false /* Allow javascript files to be compiled. */, diff --git a/packages/live-share-acs/package.json b/packages/live-share-acs/package.json index 755a7ca43..e6b3c04c9 100644 --- a/packages/live-share-acs/package.json +++ b/packages/live-share-acs/package.json @@ -4,8 +4,6 @@ "description": "Live Share integration package for Azure Communication Services.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "module": "./bin/esm/index.js", - "types": "./bin/esm/index.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", @@ -17,10 +15,7 @@ "exports": { "./package.json": "./package.json", ".": { - "import": { - "types": "./bin/esm/index.d.ts", - "default": "./bin/esm/index.js" - } + "import": "./bin/esm/index.js" } }, "devDependencies": { diff --git a/packages/live-share-acs/tsconfig.json b/packages/live-share-acs/tsconfig.json index eda80143a..f1195380b 100644 --- a/packages/live-share-acs/tsconfig.json +++ b/packages/live-share-acs/tsconfig.json @@ -3,11 +3,10 @@ /* Visit https://aka.ms/tsconfig.json to read more about this file */ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "Node16" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "moduleResolution": "Node16", + "target": "ES2022" /* Specify ECMAScript target version. */, + "module": "Node16" /* Specify module code generation. */, "lib": [ - "es2020", + "ES2022", "DOM" ] /* Specify library files to be included in the compilation. */, "allowJs": false /* Allow javascript files to be compiled. */, diff --git a/packages/live-share-canvas/package.json b/packages/live-share-canvas/package.json index fbc70d2f0..f0083000d 100644 --- a/packages/live-share-canvas/package.json +++ b/packages/live-share-canvas/package.json @@ -4,8 +4,6 @@ "description": "Live Share extension library for collaborative inking.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "module": "./bin/esm/index.js", - "types": "./bin/esm/index.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", @@ -18,10 +16,7 @@ "exports": { "./package.json": "./package.json", ".": { - "import": { - "types": "./bin/esm/index.d.ts", - "default": "./bin/esm/index.js" - } + "import": "./bin/esm/index.js" } }, "devDependencies": { diff --git a/packages/live-share-canvas/tsconfig.json b/packages/live-share-canvas/tsconfig.json index eda80143a..f1195380b 100644 --- a/packages/live-share-canvas/tsconfig.json +++ b/packages/live-share-canvas/tsconfig.json @@ -3,11 +3,10 @@ /* Visit https://aka.ms/tsconfig.json to read more about this file */ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "Node16" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "moduleResolution": "Node16", + "target": "ES2022" /* Specify ECMAScript target version. */, + "module": "Node16" /* Specify module code generation. */, "lib": [ - "es2020", + "ES2022", "DOM" ] /* Specify library files to be included in the compilation. */, "allowJs": false /* Allow javascript files to be compiled. */, diff --git a/packages/live-share-media/package.json b/packages/live-share-media/package.json index 613f38bf2..aa46753eb 100644 --- a/packages/live-share-media/package.json +++ b/packages/live-share-media/package.json @@ -4,8 +4,6 @@ "description": "Live Share classes that synchronize media playback across clients.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "module": "./bin/esm/index.js", - "types": "./bin/esm/index.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", @@ -19,10 +17,7 @@ "exports": { "./package.json": "./package.json", ".": { - "import": { - "types": "./bin/esm/index.d.ts", - "default": "./bin/esm/index.js" - } + "import": "./bin/esm/index.js" } }, "devDependencies": { diff --git a/packages/live-share-media/tsconfig.json b/packages/live-share-media/tsconfig.json index eda80143a..f1195380b 100644 --- a/packages/live-share-media/tsconfig.json +++ b/packages/live-share-media/tsconfig.json @@ -3,11 +3,10 @@ /* Visit https://aka.ms/tsconfig.json to read more about this file */ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "Node16" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "moduleResolution": "Node16", + "target": "ES2022" /* Specify ECMAScript target version. */, + "module": "Node16" /* Specify module code generation. */, "lib": [ - "es2020", + "ES2022", "DOM" ] /* Specify library files to be included in the compilation. */, "allowJs": false /* Allow javascript files to be compiled. */, diff --git a/packages/live-share-react/package.json b/packages/live-share-react/package.json index 3b421683b..5739a5a86 100644 --- a/packages/live-share-react/package.json +++ b/packages/live-share-react/package.json @@ -4,8 +4,6 @@ "description": "Build collaborative React apps using Microsoft's Fluid & Live Share frameworks with ease.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "module": "./bin/esm/index.js", - "types": "./bin/esm/index.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", @@ -15,10 +13,7 @@ "exports": { "./package.json": "./package.json", ".": { - "import": { - "types": "./bin/esm/index.d.ts", - "default": "./bin/esm/index.js" - } + "import": "./bin/esm/index.js" } }, "dependencies": { diff --git a/packages/live-share-react/tsconfig.json b/packages/live-share-react/tsconfig.json index 64e499e92..7fd77dccb 100644 --- a/packages/live-share-react/tsconfig.json +++ b/packages/live-share-react/tsconfig.json @@ -3,11 +3,10 @@ /* Visit https://aka.ms/tsconfig.json to read more about this file */ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "Node16" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "moduleResolution": "Node16", + "target": "ES2022" /* Specify ECMAScript target version. */, + "module": "Node16" /* Specify module code generation. */, "lib": [ - "es2020", + "ES2022", "DOM" ] /* Specify library files to be included in the compilation. */, "allowJs": false /* Allow javascript files to be compiled. */, diff --git a/packages/live-share/package.json b/packages/live-share/package.json index ab0d040eb..1e06e1544 100644 --- a/packages/live-share/package.json +++ b/packages/live-share/package.json @@ -4,8 +4,6 @@ "description": "Building collaborative experiences for Microsoft Teams and M365 using Fluid.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", - "module": "./bin/esm/index.public.js", - "types": "./bin/esm/index.public.d.ts", "type": "module", "scripts": { "clean": "npx shx rm -rf bin", @@ -25,16 +23,10 @@ "exports": { "./package.json": "./package.json", ".": { - "import": { - "types": "./bin/esm/index.public.d.ts", - "default": "./bin/esm/index.public.js" - } + "import": "./bin/esm/index.public.js" }, "./internal": { - "import": { - "types": "./bin/esm/index.internal.d.ts", - "default": "./bin/esm/index.internal.js" - } + "import": "./bin/esm/index.internal.js" } }, "dependencies": { diff --git a/packages/live-share/tsconfig.json b/packages/live-share/tsconfig.json index 0527c76ec..4e12e96eb 100644 --- a/packages/live-share/tsconfig.json +++ b/packages/live-share/tsconfig.json @@ -3,11 +3,10 @@ /* Visit https://aka.ms/tsconfig.json to read more about this file */ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "Node16" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - "moduleResolution": "Node16", + "target": "ES2022" /* Specify ECMAScript target version. */, + "module": "Node16" /* Specify module code generation. */, "lib": [ - "es2020", + "ES2022", "DOM" ] /* Specify library files to be included in the compilation. */, "allowJs": false /* Allow javascript files to be compiled. */, From 2b1dca236b6639648fd03ced566559f2466a7ce2 Mon Sep 17 00:00:00 2001 From: James Hunt Date: Wed, 9 Sep 2026 12:47:31 -0700 Subject: [PATCH 03/10] Support Fluid Framework 3, and bump to 2.0.0-internal.19 Adds Fluid Framework 3 support alongside Fluid 2. Builds on the ESM/Node16 migration in the previous commit, which is a hard prerequisite: Fluid 3 is ESM-only, so a CommonJS build cannot consume it. Version range becomes ">=2.102 <2.120 || >=3.0.0 <3.10.0". Why the peer floor moves from 2.40 to 2.102: Fluid 3.0 removed the legacy CompatibilityMode values ("1" / "2"), so the container compatibility argument must be a SemVer string. That form is only understood from 2.102.0 onward. Below it, "2.0.0" misses the lookup tables that older releases use and the container is created with no compatibility options at all -- silently, with no error. 2.102 is also exactly where LogLevel.info / LogLevel.essential appear, so both breaks resolve at the same floor. This does not drop support for Fluid 2.40 clients. The peer range governs what a consumer installs to build against; oldestSupportedClient governs which clients can still collaborate on our documents, and it is set to "2.0.0" -- lower than 2.40, so 2.40-era clients keep working. API changes: - FluidCompatibilityMode -> FluidOldestSupportedClient, value "2.0.0". Left unannotated deliberately: the Fluid type is MinimumVersionForCollab in 2.102-2.115 and OldestSupportedClientVersion from 2.116, so naming either would break against part of the supported range. The inferred literal type satisfies both. - LogLevel.default / LogLevel.error were removed in 3.0. Replaced with LogLevel.info / LogLevel.essential, which carry identical values (20 / 30) and exist in both 2.102+ and 3.x. - IUseSharedMapResults.sharedMap narrows from (Map & SharedMap) to SharedMap. Fluid 3 changed ISharedMap to extend its own FluidMap rather than the built-in Map, and FluidMap cannot be named here because it does not exist in Fluid 2.x. Note for release notes: this loosens types rather than breaking builds, so sharedMap.get(key) still compiles but now yields any. Consumers should pass the type argument or use getEntry. - internal/test-utils Fluid pins moved from ^2.0.0 into the managed range. Verified on Fluid 3.0.1: all packages and samples build, live-share 81, live-share-media 57 and live-share-canvas 17 tests pass, the ESM usage test passes, and npm run doctor is clean. FLUID-V3-MIGRATION.md records the full investigation and the decisions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7807308b-8b2a-4390-813d-a986277cec42 --- FLUID-V3-MIGRATION.md | 431 ++++++ internal/build-tools/update-fluid-range.js | 15 +- internal/test-utils/package.json | 44 +- internal/usage-test/esm-test/package.json | 4 +- internal/usage-test/pnpm-test/package.json | 4 +- package-lock.json | 1350 +++++++++-------- packages/live-share-acs/package.json | 6 +- packages/live-share-canvas/package.json | 10 +- packages/live-share-media/package.json | 14 +- packages/live-share-react/package.json | 18 +- .../live-share-react/src/types/ResultTypes.ts | 9 +- packages/live-share/package.json | 22 +- .../live-share/src/AzureLiveShareClient.ts | 6 +- packages/live-share/src/LiveShareClient.ts | 8 +- .../live-share/src/LiveTelemetryLogger.ts | 6 +- packages/live-share/src/internals/consts.ts | 16 +- .../javascript/01.dice-roller/package.json | 8 +- .../javascript/02.react-video/package.json | 10 +- .../03.live-canvas-demo/package.json | 10 +- .../04.live-share-react/package.json | 14 +- .../05.dice-roller-turbo/package.json | 8 +- .../21.react-media-template/package.json | 12 +- .../22.react-agile-poker/package.json | 8 +- .../23.react-live-canvas/package.json | 10 +- .../typescript/01.dice-roller/package.json | 8 +- .../03.live-canvas-demo/package.json | 10 +- .../04.live-share-react/package.json | 14 +- .../05.dice-roller-turbo/package.json | 8 +- .../06.presence-avatars/package.json | 14 +- .../07.countdown-timer/package.json | 14 +- samples/typescript/08.3d-model/package.json | 14 +- .../typescript/11.react-video-js/package.json | 12 +- .../21.react-media-template/package.json | 12 +- .../31.live-canvas-tests/package.json | 10 +- 34 files changed, 1309 insertions(+), 850 deletions(-) create mode 100644 FLUID-V3-MIGRATION.md diff --git a/FLUID-V3-MIGRATION.md b/FLUID-V3-MIGRATION.md new file mode 100644 index 000000000..fe1444dfd --- /dev/null +++ b/FLUID-V3-MIGRATION.md @@ -0,0 +1,431 @@ +# Supporting Fluid Framework v2 and v3 in the Live Share SDK + +Status: **implemented and green on Fluid 3.0.1** +Branch: `user/jameshunt/2.0.0-internal.19` +Fluid Framework 3.0.0 published 2026-09-04 and is `latest` on npm. + +## 0. Outcome + +Implemented: CJS dropped, build and tests migrated to ESM/Node16, peer floor raised to 2.102, +`oldestSupportedClient` set to `"2.0.0"`. + +Shipped as two stacked PRs: + +1. **Drop CJS + migrate build/tests to ESM/Node16** - no Fluid version changes, verified on + Fluid 2.110.0. This is a prerequisite: a CommonJS build cannot consume ESM-only Fluid 3. +2. **Support Fluid 3** - raise the floor to 2.102, add the `>=3.0.0 <3.10.0` clause, swap the + container compatibility argument, and fix the two API breaks. + +Splitting them isolates the module-system migration from the Fluid upgrade, so a failure in +one is diagnosable. Each was verified green independently. + +### The 2.40 question + +Raising the _peer_ floor to 2.102 does not drop support for Fluid 2.40 clients. The two knobs +are independent: + +| Knob | Governs | Value | +| ----------------------- | -------------------------------------------------------------- | ------------------------------------- | +| Peer dependency range | which Fluid a consumer installs to **build** against | `>=2.102 <2.120 \|\| >=3.0.0 <3.10.0` | +| `oldestSupportedClient` | which Fluid clients can still **collaborate** on our documents | `"2.0.0"` | + +`"2.0.0"` is lower than 2.40, so every 2.40-era client keeps working. Per Jason Hartman: +"since lowest compat was already 2.40, you could probably use `"2.40.0"` for oldest supported +client. But `"2.0.0"` is very safe." We use the safe value. + +Verified on **Fluid 3.0.1** (resolved by `npm update` within the new range): + +| Check | Result | +| ----------------------------------------- | ---------- | +| All 5 packages build (ESM only) | pass | +| `internal/test-utils` builds under Node16 | pass | +| live-share tests | 81 passing | +| live-share-media tests | 57 passing | +| live-share-canvas tests | 17 passing | +| ESM usage test | pass | +| All samples build | pass | + +The same set was also verified green on Fluid 2.110.0 before moving to 3.0.1, which isolates +the ESM/Node16 migration from the Fluid 3 upgrade. + +Everything below records how each decision was reached. + +Every claim below was verified empirically in isolated probes under `/tmp/ff3probe` +(Fluid 2.118.0 and 3.0.0 installed side by side; nothing was built inside this repo). +Where a claim is an inference rather than a measurement, it says so. + +--- + +## 1. Executive summary + +Supporting both v2 and v3 from one source tree **is feasible**, and the source-code delta is +a single symbol. The difficulty is not in our application code — it is that **Fluid 3 is +ESM-only**, and roughly half our build and test tooling is CommonJS with Node10 module +resolution. + +| Area | v2+v3 dual support | Effort | +| ------------------------------------- | ------------------- | -------------------- | +| Package source (`packages/*/src`) | Yes | 1 symbol | +| ESM build (`tsconfig.json`) | Yes | none | +| TypeScript samples | Yes | none | +| **CJS build** (`tsconfig.cjs.json`) | **No — impossible** | see §5 | +| **Test suite** (`tsconfig.test.json`) | Not as-is | largest chunk | +| **`internal/test-utils`** | Not as-is | 6 files / ~503 lines | + +--- + +## 2. What we verified: the API delta is one symbol + +Probe method: extracted **all 18 Fluid module specifiers** imported by `packages/*/src`, +with **all 90 named imports** taken verbatim from the source, aliased to suppress +duplicate-identifier noise, then compiled under our existing ESM tsconfig +(`module: Node16`, `moduleResolution: Node16`). + +| Fluid version | `tsc` exit | Errors | +| ------------- | ---------- | ----------------------------------------------------------------------------- | +| 2.118.0 | 0 | none | +| 3.0.0 | 2 | **1** — `CompatibilityMode` is not exported by `@fluidframework/azure-client` | + +Every `/legacy` and `/internal` entrypoint we depend on still exists in 3.0. + +### v3 breaking changes and whether they affected us + +The type-only probe described above under-reported: it verified that every _imported name_ +still resolves, but not how those names are _used_. Two changes only surfaced during the real +build. + +| Breaking change | Affected us? | +| -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Log level required on every telemetry event | No — `LiveTelemetryLogger` already passed a `LogLevel` at all three `.send()` sites | +| **Deprecated log level aliases removed** | **Yes** — we used `LogLevel.default` and `LogLevel.error`, both removed. Replaced with `LogLevel.info` (both `20`) and `LogLevel.essential` (both `30`); values are identical and both names exist in 2.x and 3.x, so this is dual-safe | +| **Shared maps use Fluid-owned map types** | **Yes** — `ISharedMap` now extends Fluid's `FluidMap` rather than the built-in `Map`, so `useSharedMap`'s public `(Map & SharedMap)` type is unsatisfiable. See below | +| Container/presence APIs use Fluid-owned collection types | No — we don't consume those APIs | +| SharedTree deprecated API removals | No — we don't use the removed APIs | +| `assert` export changes in `client-utils` | No — we only import `TypedEventEmitter`, still exported | + +#### `useSharedMap` public type change + +`IUseSharedMapResults.sharedMap` changes from `(Map & SharedMap) | undefined` +to `SharedMap | undefined`. `FluidMap` cannot be named in its place because it does not exist in +Fluid 2.x, which we still support. Runtime behaviour is unchanged; consumers wanting value-typed +access should use the `getEntry` / `setEntry` callbacks. + +This needs to be called out in the release notes, because it **loosens types rather than +breaking builds**: `ISharedMap.get` is declared `get(key: string): T | undefined`, so +existing consumer code like `sharedMap.get(key)` still compiles but now yields `any` instead of +`TData`. Downstream type errors therefore disappear silently rather than surfacing at the call +site. Consumers should either pass the type argument explicitly (`sharedMap.get(key)`) or +switch to `getEntry`. + +### The one required source change + +`packages/live-share/src/internals/consts.ts:50` + +```ts +export const FluidCompatibilityMode: CompatibilityMode = "2"; +``` + +It is consumed positionally at six sites across `LiveShareClient.ts` and +`AzureLiveShareClient.ts`. It is internal (`@hidden`, not re-exported from `index.public.ts` +or `index.internal.ts`), so renaming it is not a public break. + +Replacement, verified compiling clean (`tsc` exit 0) against **both** 2.118.0 and 3.0.0: + +```ts +client.createContainer(schema, "2.0.0"); +client.getContainer(id, schema, "2.0.0"); +``` + +So the const becomes an `OldestSupportedClientVersion` of `"2.0.0"` and the six call sites +are untouched. The name `FluidCompatibilityMode` becomes misleading and should be renamed. + +--- + +## 3. Requirement: the supported floor must rise from 2.40 to 2.102 + +> **Correction.** An earlier draft of this document put the floor at 2.116.0. That was wrong. +> It came from grepping for the identifier `OldestSupportedClientVersion`, which is merely the +> **2.116 rename** of a capability that already existed. The capability itself — passing a +> SemVer string instead of `"1"`/`"2"` — arrived in **2.102.0** under the name +> `MinimumVersionForCollab`. The floor is 2.102, not 2.116. + +Fluid 3.0 removed `CompatibilityMode` (`"1" | "2"`), so the only accepted form is a SemVer +string. We therefore need the lowest version that accepts `"2.0.0"`. + +Determined by compiling the real expression `client.createContainer(schema, "2.0.0")`, not by +grepping: + +| Version | `tsc` | Result | +| ------- | ----- | ----------------------------------------------------------------------------------- | +| 2.101.1 | 2 | **TS2345** — `'"2.0.0"' is not assignable to parameter of type 'CompatibilityMode'` | +| 2.102.0 | 0 | accepted | +| 2.118.0 | 0 | accepted | +| 3.0.0 | 0 | accepted | + +A grep sweep across 2.40 / 2.50 / 2.60 / 2.70 / 2.80 / 2.90 / 2.100 / 2.100.1 / 2.101.0 / +2.101.1 confirms the `minVersionForCollab: MinimumVersionForCollab` overload is absent +throughout and first appears in 2.102.0. + +### Why we cannot simply keep 2.40 + +Below 2.102 this is not only a type error — it is a **silent runtime misconfiguration**. +In 2.101.1, `compatibilityMode` is used as a lookup-table key: + +```js +...compatibilityModeRuntimeOptions[compatibilityMode], +compatibilityModeToMinVersionForCollab[compatibilityMode], +``` + +Passing `"2.0.0"` yields `undefined` from both tables. Spreading `undefined` is a no-op, so the +container is created with **no compatibility options at all** — no throw, no warning. + +From 2.102 onward the value is instead passed through a resolver that maps `"2"` to `"2.0.0"` +and passes any other value through unchanged, so `"2.0.0"` and `"2"` are exactly equivalent. + +Consequence: the correct range is + +``` +>=2.102 <2.120 || >=3.0.0 <3.10.0 +``` + +> The range currently written on this branch is `>=2.40 <2.120 || >=3.0.0 <3.10.0`, which is +> **not accurate** and must be corrected before this ships. + +The lockfile currently resolves `fluid-framework` to 2.110.0, which **does** satisfy the 2.102 +floor. (Under the incorrect 2.116 figure it did not, so the floor alone no longer forces a +reinstall — though the module-system work does.) + +--- + +## 3a. Rejected alternative: a runtime shim to keep the 2.40 floor + +> **Decided: rejected.** Per Jason Hartman — "keep it simpler and just pass semantic version +> all of the time." The shim solved a problem that does not exist; see _Why this was +> unnecessary_ below. + +For the record, the shim was viable. `"2"` is accepted across all of Fluid 2.x (2.40–2.119), +and only 3.x rejects it, so detecting the major version was sufficient: + +```ts +import * as runtimeUtils from "@fluidframework/runtime-utils/internal"; +const isV3 = runtimeUtils.cleanedPackageVersion?.startsWith("3.") ?? false; +export const FluidOldestSupportedClient = ( + isV3 ? "2.0.0" : "2" +) as OldestSupportedClientVersion; +``` + +Verified against three real installations — 2.40.0 (marker absent, chose `"2"`), 2.118.0 +(chose `"2"`, resolves to `2.0.0`), 3.0.0 (chose `"2.0.0"`). It worked. + +### Why this was unnecessary + +The analysis above conflated two orthogonal knobs: + +| Knob | Governs | Our value | +| --------------------------- | ----------------------------------------------------------------- | ------------------------------------- | +| **Peer dependency range** | which Fluid versions a _consumer can build/install against_ | `>=2.102 <2.120 \|\| >=3.0.0 <3.10.0` | +| **`oldestSupportedClient`** | which Fluid _clients can still collaborate_ on documents we write | `"2.0.0"` | + +Raising the peer floor to 2.102 does **not** drop collaboration with older clients. Per Fluid's +[CrossClientCompatibility.md](https://github.com/microsoft/FluidFramework/blob/main/CrossClientCompatibility.md), +`oldestSupportedClient` "specifies the oldest Fluid client version that must be able to access +documents written by the runtime", and is what selects the write format and feature gating. +Keeping it at `"2.0.0"` preserves interop with Fluid 2.0.0-era clients regardless of what a +consumer builds against. Client 3.0 also defaults to `"2.0.0"`, so passing it explicitly +selects the same runtime defaults — Fluid recommends setting it explicitly so that version +mismatches surface at build time rather than silently locking out old clients. + +Consumers still on Fluid 2.40–2.101 therefore only need to upgrade their own Fluid dependency; +no existing session or document loses compatibility. + +The Fluid docs use exactly the call shape we verified: + +```ts +const { container } = await azureClient.createContainer(schema, "2.0.0"); +const { container } = await azureClient.getContainer(id, schema, "2.0.0"); +``` + +## 4. Requirement: module system + +Fluid 3 is ESM-only: `"type": "module"`, and its `exports` map has **no `require` condition**. + +Measured behaviour of a consumer against Fluid 3.0.0: + +| Consumer configuration | Result | Who this is | +| --------------------------------------- | ---------------------------------------------- | ------------------------------------ | +| `moduleResolution: Node16`, ESM context | works | our `tsconfig.json` (all 5 packages) | +| `moduleResolution: Bundler` | works, even inside a `type: commonjs` package | 7 TypeScript samples | +| `moduleResolution: Node10` | **TS2307** on every Fluid import | our 5 `tsconfig.cjs.json` | +| `moduleResolution: Node16`, CJS context | **TS1479** "cannot be imported with `require`" | any CJS consumer of ours | +| `require("fluid-framework")` at runtime | works on Node >= 22.12 (tested v24.14.0) | fails on Node 18 / 20 | + +--- + +## 5. The CJS build cannot support Fluid 3 + +This is a hard constraint, not a matter of effort. + +- All five `packages/*/tsconfig.cjs.json` use `"module": "CommonJS"` + `"moduleResolution": "Node10"`. + Fluid 3 removed its Node10 type-declaration entrypoints, so every Fluid import fails TS2307. +- It cannot be fixed by switching resolution: `module: CommonJS` with `moduleResolution: Bundler` + is rejected outright with **TS5095** ("bundler can only be used when module is set to + preserve or to es2015 or later"). +- It cannot be fixed by switching to Node16 either — a CJS-context consumer importing an + ESM-only package fails TS1479 by design. + +So `bin/cjs` cannot be produced against Fluid 3 with any tsc configuration. A CJS artifact +could in principle still be _emitted_ via a separate transpiler, but its `.d.ts` would still +reference ESM-only Fluid types and would fail for the consumer — so this does not rescue it. + +**Conclusion: CJS consumers of Live Share cannot use Fluid 3.** This is imposed by Fluid, not +by us. Note also that `exports` maps cannot express a per-format peer-dependency range, so a +"CJS means Fluid 2" split is a documented support-matrix statement that npm cannot enforce. + +--- + +## 6. The test suite is CJS/Node10 and must migrate + +This is the largest piece of work and was not obvious at the outset. + +| Config | Setting | Status vs Fluid 3 | +| ----------------------------------- | ------------------------------- | ------------------ | +| 5x `packages/*/tsconfig.cjs.json` | `CommonJS` + `Node10` | broken | +| 3x `packages/*/tsconfig.test.json` | **extends the cjs config** | broken | +| `internal/test-utils/tsconfig.json` | `CommonJS` + `node` | broken | +| `internal/usage-test/cjs-test` | runtime `require` | Node >= 22.12 only | +| `internal/usage-test/pnpm-test` | `Node16` | fine | +| 10 TypeScript samples | 7 `bundler`, 3 inherit `Node16` | fine | + +Because all three `tsconfig.test.json` files extend the CJS config, **the entire mocha suite +is Node10/CommonJS** and cannot compile against Fluid 3 at all. + +Scope of the migration: + +- 3 x `tsconfig.test.json` — re-point to extend `tsconfig.json` (Node16/ESM) +- `internal/build-tools/build-package.js` — stop writing `{"type":"commonjs"}` into `bin/test` +- test scripts in 3 packages — `ts-mocha -p tsconfig.test.json` becomes plain `mocha`, since + the tests are already compiled to `.js` before running +- `internal/test-utils` — 6 files / ~503 lines; convert to Node16/ESM. Its relative imports + mostly omit the `.js` extensions that Node16 ESM requires +- 26 `.spec.ts` files across live-share (14), live-share-media (8), live-share-canvas (4) — + these have only ever been compiled in Node10 mode, so their relative imports likely need + `.js` extensions too. Let `tsc` enumerate these (TS2835) rather than guessing + +One thing that is **not** a blocker: `.mocharc.cjs` `require()`s `@fluidframework/mocha-test-setup`, +which sounds like it would break under an ESM-only Fluid. But that package is frozen at +`2.0.0-rc.1.0.9` (npm `latest` is 1.4.0) and never tracked the 2.40+ line. It is already +decoupled from the Fluid version under test and can stay as-is. + +--- + +## 7. The dual-testing problem + +Two of the choices made so far are in tension, and this needs an explicit resolution. + +Keeping the CJS build means the repo's single `node_modules` must stay on Fluid 2.x, because +`tsconfig.cjs.json` cannot compile against 3.0. Therefore migrating the tests to Node16 is +**necessary but not sufficient** — after that migration the tests would still execute against +Fluid 2.x. + +Actually exercising Fluid 3 requires a **second install lane**: an npm `override` pinning +Fluid to 3.0.0, with the CJS build skipped, running as a separate CI job. There are currently +no `overrides` or `resolutions` in the root `package.json`. + +Existing CI (`.github/workflows/live-share-test-packages.yaml` and three others) runs a +Node `[22.x, 24.x]` matrix. Both satisfy the `require(ESM)` threshold of 22.12. + +Separately, `internal/test-utils/package.json` pins roughly 20 `@fluidframework/*` packages at +`^2.0.0`, which the range-update script does not touch. Until those are addressed, the compat +harness will never exercise 3.x even in a Fluid-3 lane. + +--- + +## 8. Consumer impact + +- **ESM consumers** — get v2 and v3 support, no action required beyond the floor raise. +- **Bundler-based apps** (webpack, vite, Next.js) — unaffected; `moduleResolution: bundler` + resolves Fluid 3 fine even from a `type: commonjs` package. +- **CJS consumers** — cannot move to Fluid 3. They also need Node >= 22.12 for `require(ESM)` + to work at all at runtime. No `engines` field is declared in any of our packages today. +- **Anyone on Fluid 2.40 – 2.115** — dropped by the floor raise. + +--- + +## 9. Decisions required + +### D1. Fate of the CJS build + +**Decided: drop it.** Live Share v2 is still marked internal, so breaking changes are +acceptable now (James Hunt / Mario Jauregui Gomez). Fluid 3 is ESM-only, so this also removes +the constraint that would have pinned the repo's `node_modules` to Fluid 2.x — meaning the +test suite can run against Fluid 3 in a single lane, and no second install lane is needed. + +### D2. Raising the floor 2.40 → 2.102 + +**Decided: accepted, with `oldestSupportedClient` left at `"2.0.0"`.** Per Jason Hartman, +pass a semantic version all the time rather than shimming (§3a). Note the two knobs are +orthogonal: the peer floor is what consumers build against, while `"2.0.0"` preserves +collaboration with older clients. Range syntax must use `||`, not a single `|` — a single pipe +fails when installing with yarn (Mario Jauregui Gomez). + +### D3. How to test against Fluid 3 + +_Open — this is the blocking decision._ +Options: (a) scaffold the second lane now (override + separate CI job + skip CJS there); +(b) do only the Node16 test migration now and defer the lane; (c) design the CI shape first. + +### D4. Scope of this release + +Does `2.0.0-internal.19` ship v3 support, or does it ship as a corrected 2.x-only release +(range `>=2.40 <2.120`, no v3 clause) with v3 following separately? The current branch state +is a half-step: it claims v3 support with a floor that cannot deliver it. + +### D5. Declared Node floor + +If CJS consumers require Node >= 22.12 for `require(ESM)`, should we add an `engines` field? +None of our packages declare one today. + +### D6. `internal/test-utils` Fluid pins + +Its ~20 `^2.0.0` pins are invisible to `update-fluid-range.js`. Bring them into the managed +range, or leave them pinned to 2.x deliberately? + +### D7. Samples + +Samples resolve Fluid 3 fine, but their lockfiles and any `CompatibilityMode` usage would need +review before we claim they work on v3. + +--- + +## 10. Work items + +Done on this branch: + +1. [x] Range corrected to `>=2.102 <2.120 || >=3.0.0 <3.10.0` across all 26 `package.json` + files, via `update-fluid-range.js` (one clean transformation). +2. [x] `consts.ts` — `CompatibilityMode` removed; const renamed + `FluidCompatibilityMode` -> `FluidOldestSupportedClient`, value `"2.0.0"`. Deliberately + left unannotated so it compiles across the whole supported range (§3a). +3. [x] CJS dropped — 5 `tsconfig.cjs.json` deleted, `main` removed, `exports` reduced to the + `import` condition, build scripts `--cjs --esm` -> `--esm`, `build-package.js` CJS task + removed, `internal/usage-test/cjs-test` deleted, CI step removed. +4. [x] 3 x `tsconfig.test.json` re-pointed to the Node16/ESM base; `ts-mocha` replaced with + `mocha` in the three test scripts (we run compiled JS, so ts-node only fought ESM). +5. [x] `internal/test-utils` migrated to Node16/ESM (`type: module`, `exports` map) and its + 22 `^2.0.0` Fluid pins moved into the managed range. +6. [x] `.js` extensions added to 39 relative imports across test-utils, canvas and media. +7. [x] `package-lock.json` regenerated; Fluid resolved to 3.0.1. +8. [x] `LogLevel.default` / `LogLevel.error` replaced with `LogLevel.info` / `LogLevel.essential`. +9. [x] `useSharedMap` result type narrowed to `SharedMap | undefined`. + +Not done — needs a decision or a follow-up: + +- [ ] Document the public support matrix in the README: ESM only, Fluid 2.102+ or 3.x. +- [ ] Decide whether to declare an `engines` field (D5). No package declares one today. +- [ ] `packages/live-share-acs` still has `ts-mocha` test scripts, but has zero spec files, so + it was left untouched rather than migrated speculatively. +- [ ] `@fluidframework/mocha-test-setup` remains pinned at `^2.0.0-rc.1.0.9`. It is frozen on + npm (latest is 1.4.0) and never tracked the 2.40+ line, so it is already decoupled from + the Fluid version under test. Its `require:` hooks still work with ESM specs — verified + by the passing live-share and media suites, which both load `.mocharc.cjs`. +- [ ] `internal/usage-test/pnpm-test` was not run locally (needs pnpm); CI covers it. diff --git a/internal/build-tools/update-fluid-range.js b/internal/build-tools/update-fluid-range.js index 1b52c430b..60c6d1f00 100644 --- a/internal/build-tools/update-fluid-range.js +++ b/internal/build-tools/update-fluid-range.js @@ -6,16 +6,23 @@ * node internal/build-tools/update-fluid-range.js * The repo root is auto-detected via git; no CLI flags required. * This writes changes in place (no dry-run). Commit/revert as needed after inspection. + * + * DEFAULT_FROM_RANGE must be the exact range string currently present in package.json + * files (whitespace-trimmed, but otherwise character-for-character, including any `||` + * clauses). A near-miss silently matches nothing instead of failing. + * + * Always use `||` to separate range clauses, never a single `|` — a single pipe fails when + * consumers install with yarn. */ const fs = require("fs"); const path = require("path"); const { getRootFolder } = require("./utils"); -const DEFAULT_FROM_RANGE = ">=2.40 <2.110"; -const DEFAULT_TO_RANGE = ">=2.40 <2.120"; -const DEFAULT_VERSION_FROM = "2.0.0-internal.17"; -const DEFAULT_VERSION_TO = "2.0.0-internal.18"; +const DEFAULT_FROM_RANGE = ">=2.40 <2.120"; +const DEFAULT_TO_RANGE = ">=2.102 <2.120 || >=3.0.0 <3.10.0"; +const DEFAULT_VERSION_FROM = "2.0.0-internal.18"; +const DEFAULT_VERSION_TO = "2.0.0-internal.19"; const INTERNAL_PKG_PREFIX = "@microsoft/live-share"; const IGNORED_FOLDERS = new Set([ "node_modules", diff --git a/internal/test-utils/package.json b/internal/test-utils/package.json index b826f5a64..1291cab1e 100644 --- a/internal/test-utils/package.json +++ b/internal/test-utils/package.json @@ -22,29 +22,29 @@ "tsc": "tsc" }, "dependencies": { - "@fluid-experimental/attributor": "^2.0.0", - "@fluid-experimental/sequence-deprecated": "^2.0.0", - "@fluid-internal/test-driver-definitions": "^2.0.0", - "@fluidframework/agent-scheduler": "^2.0.0", - "@fluidframework/aqueduct": "^2.0.0", - "@fluidframework/cell": "^2.0.0", - "@fluidframework/container-loader": "^2.0.0", - "@fluidframework/container-runtime": "^2.0.0", - "@fluidframework/core-interfaces": "^2.0.0", - "@fluidframework/core-utils": "^2.0.0", - "@fluidframework/counter": "^2.0.0", - "@fluidframework/datastore-definitions": "^2.0.0", - "@fluidframework/driver-definitions": "^2.0.0", - "@fluidframework/local-driver": "^2.0.0", - "@fluidframework/map": "^2.0.0", - "@fluidframework/matrix": "^2.0.0", - "@fluidframework/ordered-collection": "^2.0.0", - "@fluidframework/register-collection": "^2.0.0", - "@fluidframework/runtime-definitions": "^2.0.0", - "@fluidframework/sequence": "^2.0.0", + "@fluid-experimental/attributor": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluid-experimental/sequence-deprecated": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluid-internal/test-driver-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/agent-scheduler": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/aqueduct": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/cell": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/container-loader": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/container-runtime": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/core-interfaces": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/core-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/counter": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/datastore-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/driver-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/local-driver": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/map": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/matrix": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/ordered-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/register-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/runtime-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/sequence": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluidframework/server-local-server": "^7.0.0", - "@fluidframework/telemetry-utils": "^2.0.0", - "@fluidframework/test-utils": "^2.0.0" + "@fluidframework/telemetry-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/test-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { "@fluidframework/eslint-config-fluid": "^8.1.0", diff --git a/internal/usage-test/esm-test/package.json b/internal/usage-test/esm-test/package.json index aa8da5946..b8c5838ca 100644 --- a/internal/usage-test/esm-test/package.json +++ b/internal/usage-test/esm-test/package.json @@ -12,9 +12,9 @@ "license": "ISC", "dependencies": { "@microsoft/live-share": "file:/../../../packages/live-share", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120" + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0" } } diff --git a/internal/usage-test/pnpm-test/package.json b/internal/usage-test/pnpm-test/package.json index 2c2b62a6c..73fb7a894 100644 --- a/internal/usage-test/pnpm-test/package.json +++ b/internal/usage-test/pnpm-test/package.json @@ -13,10 +13,10 @@ "license": "ISC", "dependencies": { "@microsoft/live-share": "file:/../../../packages/live-share", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@types/node": "^20.14.14" } } diff --git a/package-lock.json b/package-lock.json index 655d246e7..9f444f7b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,29 +37,29 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@fluid-experimental/attributor": "^2.0.0", - "@fluid-experimental/sequence-deprecated": "^2.0.0", - "@fluid-internal/test-driver-definitions": "^2.0.0", - "@fluidframework/agent-scheduler": "^2.0.0", - "@fluidframework/aqueduct": "^2.0.0", - "@fluidframework/cell": "^2.0.0", - "@fluidframework/container-loader": "^2.0.0", - "@fluidframework/container-runtime": "^2.0.0", - "@fluidframework/core-interfaces": "^2.0.0", - "@fluidframework/core-utils": "^2.0.0", - "@fluidframework/counter": "^2.0.0", - "@fluidframework/datastore-definitions": "^2.0.0", - "@fluidframework/driver-definitions": "^2.0.0", - "@fluidframework/local-driver": "^2.0.0", - "@fluidframework/map": "^2.0.0", - "@fluidframework/matrix": "^2.0.0", - "@fluidframework/ordered-collection": "^2.0.0", - "@fluidframework/register-collection": "^2.0.0", - "@fluidframework/runtime-definitions": "^2.0.0", - "@fluidframework/sequence": "^2.0.0", + "@fluid-experimental/attributor": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluid-experimental/sequence-deprecated": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluid-internal/test-driver-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/agent-scheduler": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/aqueduct": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/cell": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/container-loader": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/container-runtime": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/core-interfaces": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/core-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/counter": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/datastore-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/driver-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/local-driver": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/map": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/matrix": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/ordered-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/register-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/runtime-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/sequence": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluidframework/server-local-server": "^7.0.0", - "@fluidframework/telemetry-utils": "^2.0.0", - "@fluidframework/test-utils": "^2.0.0" + "@fluidframework/telemetry-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/test-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { "@fluidframework/eslint-config-fluid": "^8.1.0", @@ -2795,48 +2795,48 @@ } }, "node_modules/@fluid-experimental/attributor": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluid-experimental/attributor/-/attributor-2.110.0.tgz", - "integrity": "sha512-lxBIX7j8rkRKQW1QxjBSJnN3nZeR9w6oFwAU2EC5Bi8j2eH/efD1GDyxXAmWdR7BnWubp6ukRea/d3DP85Xyzg==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-runtime": "~2.110.0", - "@fluidframework/container-runtime-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluid-experimental/attributor/-/attributor-3.0.1.tgz", + "integrity": "sha512-F6JgAZSq96g95bLCX7ntkf10We0UKZjs6K9rPoWqHhgNqHywkcPvLRH72Y0NcEfCuy6bW2JH7aXiBBbza6i6KA==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-runtime": "~3.0.1", + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "lz4js": "^0.2.0" } }, "node_modules/@fluid-experimental/sequence-deprecated": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluid-experimental/sequence-deprecated/-/sequence-deprecated-2.110.0.tgz", - "integrity": "sha512-ay0WfIYksi/oXe02Jt41nNaCGy3m9O7u4SmJppvbX44ZfjGAwzSCtcmZ7/nKaZB3Qoh6xzPl373+iGaMr2cYNg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluid-experimental/sequence-deprecated/-/sequence-deprecated-3.0.1.tgz", + "integrity": "sha512-PYOsekir6/ZIw8AI2SQcwvQWA61dUJzFPpVnLoH+uzwEhxQZ7WthUtObXgRQJkIzLekJNhZ+aG87lGymXjwSew==", "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/merge-tree": "~2.110.0", - "@fluidframework/sequence": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0" + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/merge-tree": "~3.0.1", + "@fluidframework/sequence": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1" } }, "node_modules/@fluid-internal/client-utils": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluid-internal/client-utils/-/client-utils-2.110.0.tgz", - "integrity": "sha512-g2q6/0UPVdKQvhVYDzTEd8A5+Jyt+VpmCKJxS7cqns+TvMmCdi4WnzeGH8Fn7beGkpdV5jHEoe8fpXFOwKcfOg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluid-internal/client-utils/-/client-utils-3.0.1.tgz", + "integrity": "sha512-5q7I+1fmyxwUpKzKgjBPohePtfQAw1yw8wkjYsLRDgotoIoBzgxEeY0Rz8+LgOx6NumuKqqBGkTWxusYKV1hXQ==", "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", "@types/events_pkg": "npm:@types/events@^3.0.0", "base64-js": "^1.5.1", "buffer": "^6.0.3", @@ -3015,59 +3015,59 @@ } }, "node_modules/@fluid-internal/presence-definitions": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluid-internal/presence-definitions/-/presence-definitions-2.110.0.tgz", - "integrity": "sha512-xvw+uTD2VsIb4FgaQt3dot8RyFZcCVpwDV9WifQXGf58BAX4/En4Vw2jiras/j5RZ0dAEFHDIBqV+JOlevLEJw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluid-internal/presence-definitions/-/presence-definitions-3.0.1.tgz", + "integrity": "sha512-Khpa1WfouCJW1+dOww1lEODFRrkr8M2s9ThrI4St6G107b9Gx/PIP8GIRaP2AX6UHdvSCFT11zC+pJELv3ex/A==", "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/id-compressor": "~2.110.0" + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/id-compressor": "~3.0.1" } }, "node_modules/@fluid-internal/presence-runtime": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluid-internal/presence-runtime/-/presence-runtime-2.110.0.tgz", - "integrity": "sha512-mzMpJHq1TiQOcF5hsRYjed5oRd6LbvfNRfPOImobKdFNeR5U02utN7JD47ZweBv/+xzJxCBqHDpi8p5JSMb5og==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluid-internal/presence-runtime/-/presence-runtime-3.0.1.tgz", + "integrity": "sha512-yq1fEjVM89fKktA1RjVAvFRNUY1uaGB/EFyoWUIpPN7XLLI4YtKkCFYPXYN/ZK6Sck3JQqyM40IQulrhW46Qlg==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluid-internal/presence-definitions": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-runtime-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/id-compressor": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0" + "@fluid-internal/client-utils": "~3.0.1", + "@fluid-internal/presence-definitions": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/id-compressor": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1" } }, "node_modules/@fluid-internal/test-driver-definitions": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluid-internal/test-driver-definitions/-/test-driver-definitions-2.110.0.tgz", - "integrity": "sha512-kIHHGnZTGyCcxQASX0A+z/3Oo1F72lMbiOg5Xj/Jlg2JXT7pON9OrSwJWniaUoMWPqTYuPz9kUwUOCahfQyXuA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluid-internal/test-driver-definitions/-/test-driver-definitions-3.0.1.tgz", + "integrity": "sha512-3NU7RATU5Hpo51lByR5ZtSDXmHsU6FICSIUZIsW5Cs0PiZtuijsfnhw48YvgMLxk0/ai9vgLU5HPsARA4xKeGg==", "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0" + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1" } }, "node_modules/@fluidframework/agent-scheduler": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/agent-scheduler/-/agent-scheduler-2.110.0.tgz", - "integrity": "sha512-2sGEO1a3HiLhoTmmmUKgmaWhmpD7VTMsqfSV2US5NJo+BH6vCFfLk5YkU9cfCcmsqbNLlzS6HVLpqdClqQGrew==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/map": "~2.110.0", - "@fluidframework/register-collection": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/agent-scheduler/-/agent-scheduler-3.0.1.tgz", + "integrity": "sha512-D+SwdLjmth0HWSIVFV4WayRTo9uBW965t/xV2zg8y9wd8EosGjUyF8UzxljoMT66vn6aSiN0Q5RCG0ir1yh7qw==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/map": "~3.0.1", + "@fluidframework/register-collection": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "uuid": "^11.1.0" } }, @@ -3085,59 +3085,59 @@ } }, "node_modules/@fluidframework/aqueduct": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/aqueduct/-/aqueduct-2.110.0.tgz", - "integrity": "sha512-jRdP0DK/tkghSa2KLlIn4yJIQAFL9kFRdwBvCoJqfeN39vi/tOo9estLGVNwxU8Jna7TvZ0LfHMRn+sffzdgIg==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-runtime": "~2.110.0", - "@fluidframework/container-runtime-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/map": "~2.110.0", - "@fluidframework/request-handler": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/synthesize": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", - "@fluidframework/tree": "~2.110.0" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/aqueduct/-/aqueduct-3.0.1.tgz", + "integrity": "sha512-xkfdYxPHZpE3/2L0o+yoan0J0LRJsDmHBTh0Pisvv7w1hUPtdzh/U2GMn20P8ZpwXrqhveEV3sF0/OBXHMhpSw==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-runtime": "~3.0.1", + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/map": "~3.0.1", + "@fluidframework/request-handler": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/synthesize": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", + "@fluidframework/tree": "~3.0.1" } }, "node_modules/@fluidframework/azure-client": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/azure-client/-/azure-client-2.110.0.tgz", - "integrity": "sha512-Ra6ZiY/rhAwGAWcbbAARFlGbkd8o7ZtvVulSmpiPTixYyvO8i8jzBYZRijphEyVARq2EUp6kOedab8pNJWePbg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/azure-client/-/azure-client-3.0.1.tgz", + "integrity": "sha512-uMWu2VKNA1kVb1RJil9/+O/B4JkmBzShPhLcKfazbwdzpXVwi8tuvgy0zcyr8xh8tFMtp38cNiZwyunWFBy0Tw==", "license": "MIT", "dependencies": { - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-loader": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/fluid-static": "~2.110.0", - "@fluidframework/routerlicious-driver": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0" + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-loader": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/fluid-static": "~3.0.1", + "@fluidframework/routerlicious-driver": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1" } }, "node_modules/@fluidframework/cell": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/cell/-/cell-2.110.0.tgz", - "integrity": "sha512-V3wvwillWqGtGYdARjvXwGvFdNH61BtffMRxqEiE2NISwj/9QJSScbWxy8xyqSzghhmOIOG7MGdB0+BleLM49A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/cell/-/cell-3.0.1.tgz", + "integrity": "sha512-USm/O81dqn9l/rfXA5/OwQNz0yIN08orN2JiX8QtsZ4y9EmZFfJu9AI6IjSLeb7GlRo5xZI10H1TAu/Rexh06Q==", "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0" + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1" } }, "node_modules/@fluidframework/common-definitions": { @@ -3162,28 +3162,28 @@ } }, "node_modules/@fluidframework/container-definitions": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/container-definitions/-/container-definitions-2.110.0.tgz", - "integrity": "sha512-FeXGQ2WU4HwchP3UTVpEeCXREAJccS2/Iv5Vcntm1hMaGRjdmtAPk5uNicGmf6i4/PUHmO2jrMtJhkVMmie5bg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/container-definitions/-/container-definitions-3.0.1.tgz", + "integrity": "sha512-/qjyc/+aZg/XjVIClvm5Ock0SAlavMJSbXBMa6fjZ89/lR6oamTj2Xym96PtEjf3aPpPNaM4WUfv2N2aDBGdcw==", "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0" + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1" } }, "node_modules/@fluidframework/container-loader": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/container-loader/-/container-loader-2.110.0.tgz", - "integrity": "sha512-W1wNWntdV2OiJGIIEphRZoKnPWW/1Ag0t5iR+XpxOsNKF4i7tHbeBH8Fzg3ZpvDdVEwkZcsNWWVrvuw1UvYXRw==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/container-loader/-/container-loader-3.0.1.tgz", + "integrity": "sha512-rZujPmABb5Z/KKbzJ6CnOg4NnOV6i454YPxQDySWI1TjQYp/soXfpOr1gSGcCppTwa8pgeYkMXPoPhF6xoOclQ==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "debug": "^4.3.4", "double-ended-queue": "^2.1.0-0", "events_pkg": "npm:events@^3.1.0", @@ -3204,23 +3204,23 @@ } }, "node_modules/@fluidframework/container-runtime": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime/-/container-runtime-2.110.0.tgz", - "integrity": "sha512-cC5XJO2TdlI6H1HbKXP+lbrbQiy5p/6jedgVZBQX6nNI9MyqkdeDlKYuiP0XtMps3W4X9N+cZwyjDkqlOofoJQ==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-runtime-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/id-compressor": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime/-/container-runtime-3.0.1.tgz", + "integrity": "sha512-ITpue9lmOn957hTUpQEzSwYySjepBiVcAXcUvYUD3jZ/YieNqZHHgH120mBBF08b9HZkr6hide6ChYFOJ5Ryqg==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/id-compressor": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "@tylerbu/sorted-btree-es6": "^2.1.1", "double-ended-queue": "^2.1.0-0", "lz4js": "^0.2.0", @@ -3229,16 +3229,16 @@ } }, "node_modules/@fluidframework/container-runtime-definitions": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime-definitions/-/container-runtime-definitions-2.110.0.tgz", - "integrity": "sha512-OngXutaIefasWbwjJdaSW5luGSjCftye/PtLkBZljwhN9/z/l/d7adAUiQuPp2UN72mosKLQUbFah0GsoEx+bQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime-definitions/-/container-runtime-definitions-3.0.1.tgz", + "integrity": "sha512-ifpWzoQmEsOSOwcLhAavgkm7IldYt/5gHT17y9RrZHl9N/dPAG+d7513Ly2vhlCjrAVnMUlreGj9CHE2E9HG6w==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0" + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1" } }, "node_modules/@fluidframework/container-runtime/node_modules/uuid": { @@ -3255,63 +3255,63 @@ } }, "node_modules/@fluidframework/core-interfaces": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/core-interfaces/-/core-interfaces-2.110.0.tgz", - "integrity": "sha512-e8tsTMqk50Ou8o4az8VqyTUnqV7uzIk04xKP8oPyjSJuMffjzAXBre9e/OaurORbuTjN0O1t26AIlkxtogCZ/w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/core-interfaces/-/core-interfaces-3.0.1.tgz", + "integrity": "sha512-C/zm33sWvvsjj3VRNqSlUinNLd4UFJ33PFo3BAiArmB2x5QGz1B1jB2KEKW91OJpbzeQJMQL7vaddyH4zTKf8g==", "license": "MIT" }, "node_modules/@fluidframework/core-utils": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/core-utils/-/core-utils-2.110.0.tgz", - "integrity": "sha512-qNL0q73sffopsql3rxhCY4G7acJTp5fcx3QBfcfb15tyZisn7dtS8ZkItxAnzLZ27gKsQg2atnsd4svpnuNAPg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/core-utils/-/core-utils-3.0.1.tgz", + "integrity": "sha512-ac8/6HlEsrhXeAaZ3Lxt20/r9mxLxsZpzKQmjreAi9MJyvJKfxk1oOu5Ci0A0ANiS+RH9Ux3IXv2Op4yx44Qdg==", "license": "MIT" }, "node_modules/@fluidframework/counter": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/counter/-/counter-2.110.0.tgz", - "integrity": "sha512-ILCZ+zBmrdIJoAlZGhu+Zi7OHuxgsfIotepyUK5VXcW2tL8I7wJXr0r6So66gYBvqc9mkoG2XsbxoqLHnz+Pzw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/counter/-/counter-3.0.1.tgz", + "integrity": "sha512-a1b1hdC8nDgf+b4cP5KPZ6R7CPRaxV7Lz8zgCQm+XPRjG1J/gjQtjzuY5Snspd4dULwO06w7sWMHjOkAwTYyYA==", "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0" + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1" } }, "node_modules/@fluidframework/datastore": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/datastore/-/datastore-2.110.0.tgz", - "integrity": "sha512-wjFDFrdgoY4uHZrMQji/2IhqA8Eph+x0a1LHq+5E2v1Ayt0NfyXMeR3JS/HCCMWiUZZWl++cFX6791bQ91G3tg==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/id-compressor": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/datastore/-/datastore-3.0.1.tgz", + "integrity": "sha512-J+JNIpCpOrnih4W4PI+kEAmQOnsJDywgxcLjXb1ZJ7HXBN7IKWcRwIgoxeGf3GBVXFxfztADOrNpVVxqxrMkNA==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/id-compressor": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "uuid": "^11.1.0" } }, "node_modules/@fluidframework/datastore-definitions": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/datastore-definitions/-/datastore-definitions-2.110.0.tgz", - "integrity": "sha512-uZYh6FiwcOug7dD+PTKnj1TE8InlDaqWVspGQbr19fOW2WiA4XTjGLpjIwVa0fDXA/9PWCmFZ3TpQGZRmxP0sw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/datastore-definitions/-/datastore-definitions-3.0.1.tgz", + "integrity": "sha512-UtA+NuzfIBTHl13jbOnKsEZOJJEaDdhBJqJJU730R+m/eCZVKm3HJgYYfCbf3yDfzf3ibA3UCXnCVMky0tCS/w==", "license": "MIT", "dependencies": { - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/id-compressor": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0" + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/id-compressor": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1" } }, "node_modules/@fluidframework/datastore/node_modules/uuid": { @@ -3328,39 +3328,39 @@ } }, "node_modules/@fluidframework/driver-base": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/driver-base/-/driver-base-2.110.0.tgz", - "integrity": "sha512-Km4UgcL6OxaQw36Ayg2YLwliwzIHh7KlHh9o82BUmLeho9ftK6/8T4G/AscgIoKVkIUNDolo9yM21DOV2CVuXw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/driver-base/-/driver-base-3.0.1.tgz", + "integrity": "sha512-MR1ZUJSUUyPHrC84wojapDldHo5F29f0vZYfbi/LcbkIxJjaSiYMJ2trID6www4x0BjAJqg0W6XUCNgz8Lbitw==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0" + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1" } }, "node_modules/@fluidframework/driver-definitions": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/driver-definitions/-/driver-definitions-2.110.0.tgz", - "integrity": "sha512-3faCGqIYMGqjfhaI90cJHaCMQiaquFnBh0A0Pu6GehNzGLRK19IvbeE1CQC3FJ96KkxDeD5j8dv7G6peGSkULA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/driver-definitions/-/driver-definitions-3.0.1.tgz", + "integrity": "sha512-qedgy44+1BSra7scgNmnw52ZGUq78OQE++fW6PS6Tzl/OuIawWZPjjLZjB+adJ7u/Rqff1PqFn7aYWq7WIIygA==", "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.110.0" + "@fluidframework/core-interfaces": "~3.0.1" } }, "node_modules/@fluidframework/driver-utils": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/driver-utils/-/driver-utils-2.110.0.tgz", - "integrity": "sha512-ZdBFFbHuApmxUTY+XqOQZU6sI4dDUsG1l8a7XHYd7B4vWVk2+QiQKkp+3JlKsVZjwotQipbg0YQrbKaMbwZhpg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/driver-utils/-/driver-utils-3.0.1.tgz", + "integrity": "sha512-hlGl/VSa5py/PPuKg+TBL5N5mhpUSt8z087FkuTWwgZIFLt57iDDV0VWGd5aClFLVbENMxDM4qoWcV90p2rLhA==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "lz4js": "^0.2.0", "uuid": "^11.1.0" } @@ -3577,29 +3577,29 @@ } }, "node_modules/@fluidframework/fluid-static": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/fluid-static/-/fluid-static-2.110.0.tgz", - "integrity": "sha512-ul0N0Decc8rtUTDBYRf/em5aOtTwexL+hhbACJKaOUzdqublVvbnWKrj6D/2IDS15cIHH12ODaBLXkheWONgSw==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluid-internal/presence-definitions": "~2.110.0", - "@fluid-internal/presence-runtime": "~2.110.0", - "@fluidframework/aqueduct": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-loader": "~2.110.0", - "@fluidframework/container-runtime": "~2.110.0", - "@fluidframework/container-runtime-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/request-handler": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", - "@fluidframework/tree": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/fluid-static/-/fluid-static-3.0.1.tgz", + "integrity": "sha512-V+JNlPrrUuy5J3K1Ul7ZSYmb/1Xq9dAt4QhkXRJ09sPTsX1IgtnlYxQgok9Lms9WadNQoCsy9rs6qAiCLNLlGg==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluid-internal/presence-definitions": "~3.0.1", + "@fluid-internal/presence-runtime": "~3.0.1", + "@fluidframework/aqueduct": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-loader": "~3.0.1", + "@fluidframework/container-runtime": "~3.0.1", + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/request-handler": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", + "@fluidframework/tree": "~3.0.1", "semver-ts": "^1.0.3" } }, @@ -3610,15 +3610,15 @@ "license": "MIT" }, "node_modules/@fluidframework/id-compressor": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/id-compressor/-/id-compressor-2.110.0.tgz", - "integrity": "sha512-XCiTB2NLx2vb85jh8cj/7L9ZiNpf3R5gjo9j0Bol/H33ca0/GsBgYx2RoYj8mc4CliyMo7DdX4jMBjLvfgBHHQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/id-compressor/-/id-compressor-3.0.1.tgz", + "integrity": "sha512-sLWIVEyOPl1WLrPWflcTDCGRkgyiP8KyvtAX/AHSZO4RYa+HpwB/RF0XMMRpcmL9ElQ5NiPWD/zQYnjq/SG3cA==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "@tylerbu/sorted-btree-es6": "^2.1.1", "uuid": "^11.1.0" } @@ -3637,24 +3637,29 @@ } }, "node_modules/@fluidframework/local-driver": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/local-driver/-/local-driver-2.110.0.tgz", - "integrity": "sha512-ATRyhSC5ktDRx+M3LcLK3Ei12HkzBDOS8Nv175sc8H84CpdQ+bxIs804pGxUH4W9QeCjvWfUCm4tRl0GT8O++g==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/driver-base": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/local-driver/-/local-driver-3.0.1.tgz", + "integrity": "sha512-TyPmuteUODI6/NEzMvhz/7qH3pgVi5KXx7P9ikEPEOG4AN+kE9fWvUTjQ0BdzmEBc5cWRIHbG1tIuEmHr/pPzQ==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-loader": "~3.0.1", + "@fluidframework/container-runtime": "~3.0.1", + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/driver-base": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", "@fluidframework/protocol-base": "^7.0.1", - "@fluidframework/routerlicious-driver": "~2.110.0", + "@fluidframework/routerlicious-driver": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", "@fluidframework/server-local-server": "^7.0.1", "@fluidframework/server-services-client": "^7.0.1", "@fluidframework/server-services-core": "^7.0.1", "@fluidframework/server-test-utils": "^7.0.1", - "@fluidframework/telemetry-utils": "~2.110.0", + "@fluidframework/telemetry-utils": "~3.0.1", "jsrsasign": "^11.1.1", "uuid": "^11.1.0" } @@ -3673,61 +3678,61 @@ } }, "node_modules/@fluidframework/map": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/map/-/map-2.110.0.tgz", - "integrity": "sha512-sGeqftNvFxIgJ7OaUbq6fFLYLVm9f9sRpimGNkJQK8nDxGWnik/soldfuTulLqwDznckv5ml/vhiIroNg0iNEw==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/map/-/map-3.0.1.tgz", + "integrity": "sha512-LFHA85wafSKqRWNYF+E5+gx4/ZYAWMlExXX8I1ytJWojP1W4xKcFSldz4vZXrRCbuxyDY6uxu+YjmrJcziHgwA==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "path-browserify": "^1.0.1" } }, "node_modules/@fluidframework/matrix": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/matrix/-/matrix-2.110.0.tgz", - "integrity": "sha512-KBkaNehpDKlvLLk0FcdUzcHa9JZeaY1epspN6AfJiKoNhFQC+E2RwSXgPAtxCzCtp2mb+nbUEVTLwK4+x+VtcQ==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/merge-tree": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/matrix/-/matrix-3.0.1.tgz", + "integrity": "sha512-itkuVXTg122hlHDfmurcgOZibm+QI9j54sd/Nqiztw6G0aBWlF3veS5NyiUYWeGgkHBnejiDKwBmnWxGgPlxwg==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/merge-tree": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "@tiny-calc/nano": "0.0.0-alpha.5", "double-ended-queue": "^2.1.0-0" } }, "node_modules/@fluidframework/merge-tree": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/merge-tree/-/merge-tree-2.110.0.tgz", - "integrity": "sha512-pUuXoxOvz3Rp2I972ne1LRq83mZv1coqjEKj+J3PdfcpclOnmE1X0aXYOeDWUmxU24wx/m7ARYJrTmGAkKG6ag==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/merge-tree/-/merge-tree-3.0.1.tgz", + "integrity": "sha512-BFkBM4WySQr3pqLJkAfw8XKhc7qfOqoBugbq2cMwWe54h0ubsXBOmr6xIETrIQf4CxWfyXF6feLx29vDdHk4tw==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0" + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1" } }, "node_modules/@fluidframework/mocha-test-setup": { @@ -3751,46 +3756,46 @@ "license": "MIT" }, "node_modules/@fluidframework/odsp-doclib-utils": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/odsp-doclib-utils/-/odsp-doclib-utils-2.110.0.tgz", - "integrity": "sha512-K5/KHSVulW41K/RpJXGNP3xAXpFX4sjFsk9pq3vcHFpjKYR4M4L+SpLElbDaSjmW4jU+ZOwVS2rjrWguKPDzgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/odsp-doclib-utils/-/odsp-doclib-utils-3.0.1.tgz", + "integrity": "sha512-GqDXekqdhe278+6d8vnTA9B9uQdLu9Bg/cU75x12sEhhKoi07EjRQRYck5vpKYCbfsxuIhfdtgE63SNGY/R8xA==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/odsp-driver-definitions": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0" + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/odsp-driver-definitions": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1" } }, "node_modules/@fluidframework/odsp-driver": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/odsp-driver/-/odsp-driver-2.110.0.tgz", - "integrity": "sha512-p4QEQVvs+SmuTvKt6YMnb0V6GOLluyOJRt5wASzavLaZQXpTTrXhBwGIhxcFydue1uxBfmMaCLAFYV8MjZRq9w==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/driver-base": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/odsp-doclib-utils": "~2.110.0", - "@fluidframework/odsp-driver-definitions": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/odsp-driver/-/odsp-driver-3.0.1.tgz", + "integrity": "sha512-Kg1ePXAB9dCiE5P+/xb/m2Zsvn4Qr9DmCuX852/hZgQYiyQDg6b1sPkTND1rjD601A5A7gv5xz4y7swQnnZ4gA==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/driver-base": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/odsp-doclib-utils": "~3.0.1", + "@fluidframework/odsp-driver-definitions": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "socket.io-client": "^4.8.3", "uuid": "^11.1.0" } }, "node_modules/@fluidframework/odsp-driver-definitions": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/odsp-driver-definitions/-/odsp-driver-definitions-2.110.0.tgz", - "integrity": "sha512-4cOdqdK92yca4cH7k/DTHNyX/QkbcH9ed7m4wVua2ApYg4hGI3qBbJFp8VfGQ0JfC773HmU5j6WX1Wh/GowXPA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/odsp-driver-definitions/-/odsp-driver-definitions-3.0.1.tgz", + "integrity": "sha512-WB06NE2iwJDr6jg9G61X2Jb1JXsbKTplhM7qgbhyco/eFrxQ8cEdhGgT7h0//dp0d9zDai2RZ6k2WuAa/qESJw==", "license": "MIT", "dependencies": { - "@fluidframework/driver-definitions": "~2.110.0" + "@fluidframework/driver-definitions": "~3.0.1" } }, "node_modules/@fluidframework/odsp-driver/node_modules/uuid": { @@ -3807,20 +3812,20 @@ } }, "node_modules/@fluidframework/ordered-collection": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/ordered-collection/-/ordered-collection-2.110.0.tgz", - "integrity": "sha512-cezj42htwF2LleVirRsmcHEjUxP7wvx3VrEp4KC2ns7m4fP3lmfS7npHo1Iejf28bq1a34WnErp2vq25SqK+6Q==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/ordered-collection/-/ordered-collection-3.0.1.tgz", + "integrity": "sha512-YbiWcO7YGsZeBv3kODkb9JXh+7KVE+Shpbpw5xqHA8T2xj/iWbt7YOYngC/56tTtCI1Hr0AP5kaSLTJZldnmrw==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "uuid": "^11.1.0" } }, @@ -3856,101 +3861,101 @@ "license": "MIT" }, "node_modules/@fluidframework/register-collection": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/register-collection/-/register-collection-2.110.0.tgz", - "integrity": "sha512-EvXMqSt53OQeTc+XjOwPDWbo/vlt2KP131i+VPx4IoKGCxvSgnmwSiRCYB+ptEiHlp8hvoua4RRU8VcVO430rQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/register-collection/-/register-collection-3.0.1.tgz", + "integrity": "sha512-7gfnSzeKzUKWUHLn/jjX+GNvGG4G+2ef61FEM0+Rhz9fSW7iUmPNSjqKCLtToCXMYeXHTIa4qClLBsDqBow++A==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0" + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1" } }, "node_modules/@fluidframework/request-handler": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/request-handler/-/request-handler-2.110.0.tgz", - "integrity": "sha512-gkYL0ILULv5llCEFhD+QysAeqbEYTTm7UqI+3l28xXQzEB1h3au+phCQF9mC5+I/UxlV7XNIlpGKPVk5d5wvtw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/request-handler/-/request-handler-3.0.1.tgz", + "integrity": "sha512-pu55IwwrmmsZgUcfpvdsgdXZ8FiWq+XS2xuYLrcutDF/ssgZX9OKL+rWB0U3/cFmbdQD9LwONX9Zj2ShrnUlFw==", "license": "MIT", "dependencies": { - "@fluidframework/container-runtime-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0" + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1" } }, "node_modules/@fluidframework/routerlicious-driver": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/routerlicious-driver/-/routerlicious-driver-2.110.0.tgz", - "integrity": "sha512-rGs02Na5gB47FIodqwareBfJE89UuU3PoP1GzrdqZIMTCF30ATqI3kgVC7x4/hKjTuxM6gjSTSNvTR9qt4yjAw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/routerlicious-driver/-/routerlicious-driver-3.0.1.tgz", + "integrity": "sha512-rEfieumMoAEYVZnwbR7tLYqD596kL4HxnqdiHZo2xRZtVUdQYyaj7r+nDk96fhKq2afLr6H7HldoIAQFAhUzyg==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/driver-base": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/driver-base": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", "@fluidframework/server-services-client": "^7.0.1", - "@fluidframework/telemetry-utils": "~2.110.0", + "@fluidframework/telemetry-utils": "~3.0.1", "json-stringify-safe": "5.0.1", "socket.io-client": "^4.8.3" } }, "node_modules/@fluidframework/runtime-definitions": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/runtime-definitions/-/runtime-definitions-2.110.0.tgz", - "integrity": "sha512-HJQaTk/9AhihPQal81pjVsjbHYvuobQ7Y9JrNHxsC1AfoCXVn7M5xHAcrzqjJyGaMlx/Nc4gNgvcLQWJPjbXXQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/runtime-definitions/-/runtime-definitions-3.0.1.tgz", + "integrity": "sha512-WRBI0986XTg+G/29by+lI/B2TZsKBndF3jhRrEE68NJthjzgsZWb26mzNB7tbjXl2jI0EtWg5nNRk/cNSZWZ3A==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/id-compressor": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0" + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/id-compressor": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1" } }, "node_modules/@fluidframework/runtime-utils": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/runtime-utils/-/runtime-utils-2.110.0.tgz", - "integrity": "sha512-MQozb8pvKtZipMGlbC5THFoiAtpfpLopD/4OlzQ1khBhBO5gnz1pESxSGjtQycnHbUdDjIVgX+j1/bAZC++s+w==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-runtime-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/runtime-utils/-/runtime-utils-3.0.1.tgz", + "integrity": "sha512-O4BQAIweRNVvearUoJwvUP26+9xj4UQ0vXgvKTFzABLyWt33G20cW/m0mWfYeLUVVrsdGj4S6huIrwZREZ9HMA==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "semver-ts": "^1.0.3" } }, "node_modules/@fluidframework/sequence": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/sequence/-/sequence-2.110.0.tgz", - "integrity": "sha512-N/lZn/BmliQ2dZd2pFRi0Wkw7chfNgx5uBAYdhqO5wJUK3MqKihGYJXrMuoahIYEcNO/4bdADVLdvpAOkpTUvg==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/merge-tree": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/sequence/-/sequence-3.0.1.tgz", + "integrity": "sha512-v6erFM0SdkZV6BnTd/u5c+T6DrA4RNOTnyefrs4d/rtgv02t9M8XmN+sL4oSJLadSPHvPNzJQivL4Jv5Qdx0Mw==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/merge-tree": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "double-ended-queue": "^2.1.0-0", "uuid": "^11.1.0" } @@ -4249,22 +4254,22 @@ } }, "node_modules/@fluidframework/shared-object-base": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/shared-object-base/-/shared-object-base-2.110.0.tgz", - "integrity": "sha512-lUeyXIfV0sM5/rhCXbk9vSD4tcBiUomKXiTSwV7N7P+3rnIV2NWkdgEP+FYn0yQdMR8G0RWS6rTScW51H0EeyQ==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/id-compressor": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/shared-object-base/-/shared-object-base-3.0.1.tgz", + "integrity": "sha512-xQw0KY0zRLCDinDKLWL7IdBHRSKlO5KM6g/qjjzatoSa0mVvToH3j1RPMvtbORlOii/ujANUQAigyMxQ4I3N1w==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/id-compressor": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "uuid": "^11.1.0" } }, @@ -4282,24 +4287,24 @@ } }, "node_modules/@fluidframework/synthesize": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/synthesize/-/synthesize-2.110.0.tgz", - "integrity": "sha512-KRSPMCRWJk2xe6Sd5KNYgacqK4VDvStj5bgnfPcNqE9zld7nMxmbCzsntJeS1um61X4vmgZoF6h0KPT7rKlo2A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/synthesize/-/synthesize-3.0.1.tgz", + "integrity": "sha512-i9bp3hsq4+mVjI0pjAbQYBykDG7BehvJVfxslErGMSDv0xEuQOWCKGbV6xzqoYpY6Je2Dr8eBs/o+H275DzCzg==", "license": "MIT", "dependencies": { - "@fluidframework/core-utils": "~2.110.0" + "@fluidframework/core-utils": "~3.0.1" } }, "node_modules/@fluidframework/telemetry-utils": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/telemetry-utils/-/telemetry-utils-2.110.0.tgz", - "integrity": "sha512-FzuyyKv2f2YPOUoigAnpDGbTiQykgqwTnVc3Xn4NIRhg3knkXSd9Ljx/Hy2WRBNbdAuCGWrYgMvIWkjj6OseWA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/telemetry-utils/-/telemetry-utils-3.0.1.tgz", + "integrity": "sha512-/HKh9qQksWP1iaDxzknHt/dE1jF3dasZeM5OQQiMhPzwIWc4TCibVUs6N8A6pr/E49DU3Lax97hiQDZTb8bsEA==", "license": "MIT", "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", "debug": "^4.3.4", "uuid": "^11.1.0" } @@ -4349,25 +4354,25 @@ } }, "node_modules/@fluidframework/test-runtime-utils": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/test-runtime-utils/-/test-runtime-utils-2.110.0.tgz", - "integrity": "sha512-ali5vagyjK8ByUSe+4MYwOYV4LIfVIhc+6aDWcEvzEYuNnR17gKZDeVbYLzDB6s+IIRxZ7+HxiUH8TTRKBJtLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-runtime-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/id-compressor": "~2.110.0", - "@fluidframework/routerlicious-driver": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/test-runtime-utils/-/test-runtime-utils-3.0.1.tgz", + "integrity": "sha512-++V1rkL3K8gOTxDjd9FkXtKrrYruH7svMliIQpka0Hk0OUlqNz1h7DRQszf4TfiM6m6rIpKF1hdZO/TLTge8sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/id-compressor": "~3.0.1", + "@fluidframework/routerlicious-driver": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "jsrsasign": "^11.1.1", "uuid": "^11.1.0" } @@ -4387,31 +4392,31 @@ } }, "node_modules/@fluidframework/test-utils": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/test-utils/-/test-utils-2.110.0.tgz", - "integrity": "sha512-kbdTOIEboxIMazIYKeHCp6kHzegYY4jc7sYtNVEeAoCDwwZowaESkBe/e81NqKyv+MiNVacztH2kx6cghKaW2w==", - "license": "MIT", - "dependencies": { - "@fluid-internal/test-driver-definitions": "~2.110.0", - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-loader": "~2.110.0", - "@fluidframework/container-runtime": "~2.110.0", - "@fluidframework/container-runtime-definitions": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/driver-utils": "~2.110.0", - "@fluidframework/local-driver": "~2.110.0", - "@fluidframework/map": "~2.110.0", - "@fluidframework/odsp-driver": "~2.110.0", - "@fluidframework/request-handler": "~2.110.0", - "@fluidframework/routerlicious-driver": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/test-utils/-/test-utils-3.0.1.tgz", + "integrity": "sha512-CZThesbIdRl9YMVwK2MTajCEwM8lQgkQJp2sfJC92Zw8MO6oDksAAcU1rPok+mZvN7Bg4E0t3aMh2vlZ4DHz2Q==", + "license": "MIT", + "dependencies": { + "@fluid-internal/test-driver-definitions": "~3.0.1", + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-loader": "~3.0.1", + "@fluidframework/container-runtime": "~3.0.1", + "@fluidframework/container-runtime-definitions": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/driver-utils": "~3.0.1", + "@fluidframework/local-driver": "~3.0.1", + "@fluidframework/map": "~3.0.1", + "@fluidframework/odsp-driver": "~3.0.1", + "@fluidframework/request-handler": "~3.0.1", + "@fluidframework/routerlicious-driver": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", "best-random": "^1.0.0", "debug": "^4.3.4", "uuid": "^11.1.0" @@ -4431,23 +4436,22 @@ } }, "node_modules/@fluidframework/tree": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/tree/-/tree-2.110.0.tgz", - "integrity": "sha512-fWn9los6yJALYVwCSzQtoeBz6k5vjuUn99bVpXI9TGEgct8FamVOCIB3Je6RZC7t1Oc6LJzvNXGnGfz4+jee1w==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.110.0", - "@fluidframework/container-runtime": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/datastore-definitions": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/id-compressor": "~2.110.0", - "@fluidframework/runtime-definitions": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/telemetry-utils": "~2.110.0", - "@fluidframework/type-factory": "~2.110.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/tree/-/tree-3.0.1.tgz", + "integrity": "sha512-xlw4BDVtcCSj+LDNAtmOdzrwE6vtnqK73BE8BqbFN1CTS/BRVYJgAoZxxUvkfCdtfJ+rzOcni0LkEHwNQmjXnw==", + "license": "MIT", + "dependencies": { + "@fluid-internal/client-utils": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/datastore-definitions": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/id-compressor": "~3.0.1", + "@fluidframework/runtime-definitions": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/telemetry-utils": "~3.0.1", + "@fluidframework/type-factory": "~3.0.1", "@sinclair/typebox": "^0.34.13", "@tylerbu/sorted-btree-es6": "^2.1.1", "semver-ts": "^1.0.3", @@ -4469,12 +4473,12 @@ } }, "node_modules/@fluidframework/type-factory": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@fluidframework/type-factory/-/type-factory-2.110.0.tgz", - "integrity": "sha512-4nHB986EEQMrkFkx+/DvAr1tHKFJ+K6R3Cz5GQvIrookbtW2Po4BZfs50iO95LlT3qiMrfKIvdq4v7Xz+S+9Og==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fluidframework/type-factory/-/type-factory-3.0.1.tgz", + "integrity": "sha512-cZ6s6Rx3u26vtbSwUYWEyOk9S+8MkzxOTGfxZBug0zKKexaDXV70kaJWM90qYtP2dxty7aBk/xgKMYuqyWa4JA==", "license": "MIT", "dependencies": { - "@fluidframework/telemetry-utils": "~2.110.0" + "@fluidframework/telemetry-utils": "~3.0.1" } }, "node_modules/@griffel/core": { @@ -10718,22 +10722,22 @@ "license": "ISC" }, "node_modules/fluid-framework": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/fluid-framework/-/fluid-framework-2.110.0.tgz", - "integrity": "sha512-6bU/5bsnvSrgOX+aHItxogNE5GHeucy/61JIFrZZ+rMeCqbyqaYb2weRTZqz2WhwDKi8ykUgkvfKP6yYFfhphw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fluid-framework/-/fluid-framework-3.0.1.tgz", + "integrity": "sha512-O1ZmRCBXRWM7XTPY4wDbIk19KO1qDJstrr/jT6SSOZTN2QQDOJ9GVHsNn40NI7syxh9IUSbifBxboR1dkCRPeA==", "license": "MIT", "dependencies": { - "@fluidframework/container-definitions": "~2.110.0", - "@fluidframework/container-loader": "~2.110.0", - "@fluidframework/core-interfaces": "~2.110.0", - "@fluidframework/core-utils": "~2.110.0", - "@fluidframework/driver-definitions": "~2.110.0", - "@fluidframework/fluid-static": "~2.110.0", - "@fluidframework/map": "~2.110.0", - "@fluidframework/runtime-utils": "~2.110.0", - "@fluidframework/sequence": "~2.110.0", - "@fluidframework/shared-object-base": "~2.110.0", - "@fluidframework/tree": "~2.110.0" + "@fluidframework/container-definitions": "~3.0.1", + "@fluidframework/container-loader": "~3.0.1", + "@fluidframework/core-interfaces": "~3.0.1", + "@fluidframework/core-utils": "~3.0.1", + "@fluidframework/driver-definitions": "~3.0.1", + "@fluidframework/fluid-static": "~3.0.1", + "@fluidframework/map": "~3.0.1", + "@fluidframework/runtime-utils": "~3.0.1", + "@fluidframework/sequence": "~3.0.1", + "@fluidframework/shared-object-base": "~3.0.1", + "@fluidframework/tree": "~3.0.1" } }, "node_modules/follow-redirects": { @@ -17870,26 +17874,26 @@ }, "packages/live-share": { "name": "@microsoft/live-share", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@fluid-internal/client-utils": ">=2.40 <2.120", - "@fluidframework/aqueduct": ">=2.40 <2.120", - "@fluidframework/core-interfaces": ">=2.40 <2.120", - "@fluidframework/core-utils": ">=2.40 <2.120", - "@fluidframework/register-collection": ">=2.40 <2.120", + "@fluid-internal/client-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/aqueduct": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/core-interfaces": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/core-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/register-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "uuid": "^9.0.0" }, "devDependencies": { "@fluidframework/mocha-test-setup": "^2.0.0-rc.1.0.9", - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", - "@fluidframework/test-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/test-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@live-share-private/test-utils": "^1.0.0", "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", "@types/node": "^20.2.3", "@types/uuid": "9.0.1", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "mocha": "^10.2.0", "nyc": "^15.1.0", "start-server-and-test": "^2.0.4", @@ -17897,17 +17901,17 @@ "typescript": "~5.5.3" }, "peerDependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "fluid-framework": ">=2.40 <2.120" + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" } }, "packages/live-share-acs": { "name": "@microsoft/live-share-acs", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "license": "SEE LICENSE IN LICENSE", "devDependencies": { "@azure/communication-calling": "^1.27.3", - "@microsoft/live-share": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", "@types/node": "^20.2.3", @@ -17918,7 +17922,7 @@ }, "peerDependencies": { "@azure/communication-calling": "^1.14.0", - "@microsoft/live-share": "2.0.0-internal.18" + "@microsoft/live-share": "2.0.0-internal.19" } }, "packages/live-share-acs/node_modules/@types/node": { @@ -17940,22 +17944,22 @@ }, "packages/live-share-canvas": { "name": "@microsoft/live-share-canvas", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "license": "SEE LICENSE IN LICENSE", "devDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", "@types/node": "^20.2.3", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "mocha": "^10.2.0", "nyc": "^15.1.0", "ts-mocha": "^10.0.0", "typescript": "~5.5.3" }, "peerDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", - "fluid-framework": ">=2.40 <2.120" + "@microsoft/live-share": "2.0.0-internal.19", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" } }, "packages/live-share-canvas/node_modules/@types/node": { @@ -17977,26 +17981,26 @@ }, "packages/live-share-media": { "name": "@microsoft/live-share-media", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "license": "SEE LICENSE IN LICENSE", "devDependencies": { "@fluidframework/mocha-test-setup": "^2.0.0-rc.1.0.9", - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", - "@fluidframework/test-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/test-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@live-share-private/test-utils": "^1.0.0", - "@microsoft/live-share": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", "@types/node": "^20.2.3", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "mocha": "^10.2.0", "nyc": "^15.1.0", "ts-mocha": "^10.0.0", "typescript": "~5.5.3" }, "peerDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", - "fluid-framework": ">=2.40 <2.120" + "@microsoft/live-share": "2.0.0-internal.19", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" } }, "packages/live-share-media/node_modules/@types/node": { @@ -18018,7 +18022,7 @@ }, "packages/live-share-react": { "name": "@microsoft/live-share-react", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "license": "SEE LICENSE IN LICENSE", "dependencies": { "url": "^0.11.0", @@ -18026,21 +18030,21 @@ }, "devDependencies": { "@babel/core": "^7.21.8", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "@types/uuid": "^9.0.1", "babel-loader": "^9.1.2", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "typescript": "~5.5.3" }, "peerDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "fluid-framework": ">=2.40 <2.120", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "react": "^16.8.0 || ^17 || ^18", "react-dom": "^16.8.0 || ^17 || ^18" } @@ -18067,13 +18071,13 @@ "version": "1.0.0", "license": "Microsoft", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", @@ -18089,14 +18093,14 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -18107,7 +18111,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "@vitejs/plugin-react": "^5.1.4", @@ -18199,14 +18203,14 @@ "version": "1.0.0", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", @@ -18222,13 +18226,13 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -18240,7 +18244,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -18261,13 +18265,13 @@ "version": "1.0.0", "license": "Microsoft", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", @@ -18283,12 +18287,12 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -18300,7 +18304,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -18324,10 +18328,10 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "prop-types": "^15.8.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -18337,7 +18341,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -18357,11 +18361,11 @@ "version": "0.4.0", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router": "^6.4.2", @@ -18370,7 +18374,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -18390,13 +18394,13 @@ "version": "1.0.0", "license": "Microsoft", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", @@ -18409,14 +18413,14 @@ "version": "1.0.0", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", @@ -18432,13 +18436,13 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -18450,7 +18454,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -18471,13 +18475,13 @@ "version": "1.0.0", "license": "Microsoft", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", @@ -18493,13 +18497,13 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -18511,7 +18515,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -18535,13 +18539,13 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -18553,7 +18557,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -18580,13 +18584,13 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -18600,7 +18604,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -18625,12 +18629,12 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -18643,7 +18647,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -19156,12 +19160,12 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -19173,7 +19177,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", @@ -19683,13 +19687,13 @@ "version": "1.0.0", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "fluid-framework": ">=2.40 <2.120" + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "buffer": "^6.0.3", "start-server-and-test": "^2.0.0", "vite": "^6.1.7" diff --git a/packages/live-share-acs/package.json b/packages/live-share-acs/package.json index e6b3c04c9..b1a958035 100644 --- a/packages/live-share-acs/package.json +++ b/packages/live-share-acs/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/live-share-acs", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "description": "Live Share integration package for Azure Communication Services.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", @@ -19,7 +19,7 @@ } }, "devDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", "@azure/communication-calling": "^1.27.3", "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", @@ -30,7 +30,7 @@ "typescript": "~5.5.3" }, "peerDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", "@azure/communication-calling": "^1.14.0" }, "repository": { diff --git a/packages/live-share-canvas/package.json b/packages/live-share-canvas/package.json index f0083000d..a97b966e5 100644 --- a/packages/live-share-canvas/package.json +++ b/packages/live-share-canvas/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/live-share-canvas", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "description": "Live Share extension library for collaborative inking.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", @@ -20,19 +20,19 @@ } }, "devDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", "@types/node": "^20.2.3", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "mocha": "^10.2.0", "nyc": "^15.1.0", "ts-mocha": "^10.0.0", "typescript": "~5.5.3" }, "peerDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", - "fluid-framework": ">=2.40 <2.120" + "@microsoft/live-share": "2.0.0-internal.19", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "repository": { "directory": "packages/live-share-canvas", diff --git a/packages/live-share-media/package.json b/packages/live-share-media/package.json index aa46753eb..7dfd77f77 100644 --- a/packages/live-share-media/package.json +++ b/packages/live-share-media/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/live-share-media", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "description": "Live Share classes that synchronize media playback across clients.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", @@ -22,22 +22,22 @@ }, "devDependencies": { "@fluidframework/mocha-test-setup": "^2.0.0-rc.1.0.9", - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", - "@fluidframework/test-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/test-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@live-share-private/test-utils": "^1.0.0", - "@microsoft/live-share": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", "@types/node": "^20.2.3", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "mocha": "^10.2.0", "nyc": "^15.1.0", "ts-mocha": "^10.0.0", "typescript": "~5.5.3" }, "peerDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", - "fluid-framework": ">=2.40 <2.120" + "@microsoft/live-share": "2.0.0-internal.19", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "repository": { "directory": "packages/live-share-media", diff --git a/packages/live-share-react/package.json b/packages/live-share-react/package.json index 5739a5a86..faf510045 100644 --- a/packages/live-share-react/package.json +++ b/packages/live-share-react/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/live-share-react", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "description": "Build collaborative React apps using Microsoft's Fluid & Live Share frameworks with ease.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", @@ -22,21 +22,21 @@ }, "devDependencies": { "@babel/core": "^7.21.8", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "@types/uuid": "^9.0.1", "babel-loader": "^9.1.2", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "typescript": "~5.5.3" }, "peerDependencies": { - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "fluid-framework": ">=2.40 <2.120", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "react": "^16.8.0 || ^17 || ^18", "react-dom": "^16.8.0 || ^17 || ^18" }, diff --git a/packages/live-share-react/src/types/ResultTypes.ts b/packages/live-share-react/src/types/ResultTypes.ts index a37029220..decc9a1c8 100644 --- a/packages/live-share-react/src/types/ResultTypes.ts +++ b/packages/live-share-react/src/types/ResultTypes.ts @@ -77,8 +77,15 @@ export interface ILiveShareContainerResults extends IAzureContainerResults { export interface IUseSharedMapResults { /** * The Fluid `SharedMap` object. + * + * @remarks + * Previously typed as `Map & SharedMap`. Fluid 3.0 changed `ISharedMap` to + * extend Fluid's own `FluidMap` rather than the built-in `Map`, so that intersection is no + * longer satisfiable — and `FluidMap` cannot be named here because it does not exist in + * Fluid 2.x, which we still support. Use the typed `getEntry` / `setEntry` callbacks below + * for value-typed access. */ - sharedMap: (Map & SharedMap) | undefined; + sharedMap: SharedMap | undefined; /** * Callback method to get entries in the `SharedMap`. */ diff --git a/packages/live-share/package.json b/packages/live-share/package.json index 1e06e1544..132e0f333 100644 --- a/packages/live-share/package.json +++ b/packages/live-share/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/live-share", - "version": "2.0.0-internal.18", + "version": "2.0.0-internal.19", "description": "Building collaborative experiences for Microsoft Teams and M365 using Fluid.", "author": "Microsoft", "license": "SEE LICENSE IN LICENSE", @@ -30,23 +30,23 @@ } }, "dependencies": { - "@fluid-internal/client-utils": ">=2.40 <2.120", - "@fluidframework/aqueduct": ">=2.40 <2.120", - "@fluidframework/core-interfaces": ">=2.40 <2.120", - "@fluidframework/core-utils": ">=2.40 <2.120", - "@fluidframework/register-collection": ">=2.40 <2.120", + "@fluid-internal/client-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/aqueduct": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/core-interfaces": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/core-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/register-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "uuid": "^9.0.0" }, "devDependencies": { "@fluidframework/mocha-test-setup": "^2.0.0-rc.1.0.9", - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", - "@fluidframework/test-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluidframework/test-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@live-share-private/test-utils": "^1.0.0", "@types/assert": "^1.5.6", "@types/mocha": "^10.0.1", "@types/node": "^20.2.3", "@types/uuid": "9.0.1", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "mocha": "^10.2.0", "nyc": "^15.1.0", "start-server-and-test": "^2.0.4", @@ -54,8 +54,8 @@ "typescript": "~5.5.3" }, "peerDependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "fluid-framework": ">=2.40 <2.120" + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "repository": { "directory": "packages/live-share", diff --git a/packages/live-share/src/AzureLiveShareClient.ts b/packages/live-share/src/AzureLiveShareClient.ts index 2173a9dfb..583e3a09c 100644 --- a/packages/live-share/src/AzureLiveShareClient.ts +++ b/packages/live-share/src/AzureLiveShareClient.ts @@ -16,7 +16,7 @@ import { LiveShareRuntime } from "./internals/LiveShareRuntime.js"; import { getLiveContainerSchema } from "./internals/schema-injection-utils.js"; import { LiveShareClient } from "./LiveShareClient.js"; import { LiveDataObject } from "./internals/LiveDataObject.js"; -import { FluidCompatibilityMode } from "./internals/consts.js"; +import { FluidOldestSupportedClient } from "./internals/consts.js"; /** * @alpha @@ -91,7 +91,7 @@ export class AzureLiveShareClient extends BaseLiveShareClient { const schema = this.getInjectedContainerSchema(fluidContainerSchema); const results = (this._results = await this._client.createContainer( schema, - FluidCompatibilityMode + FluidOldestSupportedClient )); if (this._host instanceof AzureLiveShareHost) { this._host.setAudience(this._results.services.audience); @@ -129,7 +129,7 @@ export class AzureLiveShareClient extends BaseLiveShareClient { const results = (this._results = await this._client.getContainer( id, schema, - FluidCompatibilityMode + FluidOldestSupportedClient )); if (this._host instanceof AzureLiveShareHost) { this._host.setAudience(this._results.services.audience); diff --git a/packages/live-share/src/LiveShareClient.ts b/packages/live-share/src/LiveShareClient.ts index 16eb42ecc..a1127d86d 100644 --- a/packages/live-share/src/LiveShareClient.ts +++ b/packages/live-share/src/LiveShareClient.ts @@ -26,7 +26,7 @@ import { TestLiveShareHost } from "./TestLiveShareHost.js"; import { LiveShareRuntime } from "./internals/LiveShareRuntime.js"; import { getLiveContainerSchema } from "./internals/schema-injection-utils.js"; import { ExpectedError, UnexpectedError } from "./errors.js"; -import { FluidCompatibilityMode } from "./internals/consts.js"; +import { FluidOldestSupportedClient } from "./internals/consts.js"; import { isTestHostWithInsecureTokenProvider } from "./internals/type-guards.js"; /** @@ -357,7 +357,7 @@ export class LiveShareClient extends BaseLiveShareClient { ...(await client.getContainer( containerInfo.containerId, fluidContainerSchema, - FluidCompatibilityMode + FluidOldestSupportedClient )), }; } else if ( @@ -395,7 +395,7 @@ export class LiveShareClient extends BaseLiveShareClient { // Create and initialize container const { container, services } = await client.createContainer( fluidContainerSchema, - FluidCompatibilityMode + FluidOldestSupportedClient ); await this.addTurboFolder(container); @@ -420,7 +420,7 @@ export class LiveShareClient extends BaseLiveShareClient { ...(await client.getContainer( containerInfo.containerId!, fluidContainerSchema, - FluidCompatibilityMode + FluidOldestSupportedClient )), }; } else { diff --git a/packages/live-share/src/LiveTelemetryLogger.ts b/packages/live-share/src/LiveTelemetryLogger.ts index 9e5c59c8d..1468d7c9d 100644 --- a/packages/live-share/src/LiveTelemetryLogger.ts +++ b/packages/live-share/src/LiveTelemetryLogger.ts @@ -81,7 +81,7 @@ export class LiveTelemetryLogger { ), error: this.parseErrorMessage(error), }; - this._runtime.logger.send(evt, LogLevel.default); + this._runtime.logger.send(evt, LogLevel.info); } } @@ -105,7 +105,7 @@ export class LiveTelemetryLogger { ), error: this.parseErrorMessage(error), }; - this._runtime.logger.send(evt, LogLevel.error); + this._runtime.logger.send(evt, LogLevel.essential); } } @@ -132,7 +132,7 @@ export class LiveTelemetryLogger { ), error: this.parseErrorMessage(error), }; - this._runtime.logger.send(evt, LogLevel.error); + this._runtime.logger.send(evt, LogLevel.essential); } } diff --git a/packages/live-share/src/internals/consts.ts b/packages/live-share/src/internals/consts.ts index 50d404e81..862192361 100644 --- a/packages/live-share/src/internals/consts.ts +++ b/packages/live-share/src/internals/consts.ts @@ -3,8 +3,6 @@ * Licensed under the Microsoft Live Share SDK License. */ -import { CompatibilityMode } from "@fluidframework/azure-client"; - /** * List of telemetry events. * @hidden @@ -45,6 +43,18 @@ export const ObjectSynchronizerEvents = { export const LiveShareReportIssueLink = "https://aka.ms/teamsliveshare/issue"; /** + * The oldest Fluid client version that must be able to access documents we write. + * + * @remarks + * Fluid 3.0 removed the legacy `CompatibilityMode` values (`"1"` / `"2"`), so this must be a + * SemVer string. `"2.0.0"` preserves collaboration with Fluid 2.0.0-era clients and matches + * Fluid 3's own default. + * + * Deliberately left unannotated: the corresponding Fluid type is named + * `MinimumVersionForCollab` in 2.102-2.115 and `OldestSupportedClientVersion` from 2.116 + * onward, so naming either one would break against part of our supported range. The inferred + * literal type `"2.0.0"` satisfies both. + * * @hidden */ -export const FluidCompatibilityMode: CompatibilityMode = "2"; +export const FluidOldestSupportedClient = "2.0.0"; diff --git a/samples/javascript/01.dice-roller/package.json b/samples/javascript/01.dice-roller/package.json index 7fd92be71..2a67914be 100644 --- a/samples/javascript/01.dice-roller/package.json +++ b/samples/javascript/01.dice-roller/package.json @@ -17,13 +17,13 @@ "doctor": "eslint src/**/*.{j,t}s{,x} --fix --no-error-on-unmatched-pattern" }, "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", diff --git a/samples/javascript/02.react-video/package.json b/samples/javascript/02.react-video/package.json index 5734a7789..6c046e80e 100644 --- a/samples/javascript/02.react-video/package.json +++ b/samples/javascript/02.react-video/package.json @@ -10,14 +10,14 @@ "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -28,7 +28,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "@vitejs/plugin-react": "^5.1.4", diff --git a/samples/javascript/03.live-canvas-demo/package.json b/samples/javascript/03.live-canvas-demo/package.json index c0900eb27..eead40171 100644 --- a/samples/javascript/03.live-canvas-demo/package.json +++ b/samples/javascript/03.live-canvas-demo/package.json @@ -16,14 +16,14 @@ "doctor": "eslint src/**/*.{j,t}s{,x} --fix --no-error-on-unmatched-pattern" }, "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", diff --git a/samples/javascript/04.live-share-react/package.json b/samples/javascript/04.live-share-react/package.json index f31d2ac5c..f74d59dea 100644 --- a/samples/javascript/04.live-share-react/package.json +++ b/samples/javascript/04.live-share-react/package.json @@ -5,16 +5,16 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -26,7 +26,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", diff --git a/samples/javascript/05.dice-roller-turbo/package.json b/samples/javascript/05.dice-roller-turbo/package.json index 93c7d981b..9dd92dbec 100644 --- a/samples/javascript/05.dice-roller-turbo/package.json +++ b/samples/javascript/05.dice-roller-turbo/package.json @@ -16,13 +16,13 @@ "doctor": "eslint src/**/*.{j,t}s{,x} --fix --no-error-on-unmatched-pattern" }, "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", diff --git a/samples/javascript/21.react-media-template/package.json b/samples/javascript/21.react-media-template/package.json index 6d4dba8e1..65af1321a 100644 --- a/samples/javascript/21.react-media-template/package.json +++ b/samples/javascript/21.react-media-template/package.json @@ -5,15 +5,15 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -25,7 +25,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "@vitejs/plugin-react": "^5.1.4", diff --git a/samples/javascript/22.react-agile-poker/package.json b/samples/javascript/22.react-agile-poker/package.json index 8e5acb8a0..ac59ec971 100644 --- a/samples/javascript/22.react-agile-poker/package.json +++ b/samples/javascript/22.react-agile-poker/package.json @@ -5,13 +5,13 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@microsoft/live-share": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "prop-types": "^15.8.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -21,7 +21,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", diff --git a/samples/javascript/23.react-live-canvas/package.json b/samples/javascript/23.react-live-canvas/package.json index 4ea2750a4..4ab17a4b6 100644 --- a/samples/javascript/23.react-live-canvas/package.json +++ b/samples/javascript/23.react-live-canvas/package.json @@ -5,11 +5,11 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router": "^6.4.2", @@ -18,7 +18,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", diff --git a/samples/typescript/01.dice-roller/package.json b/samples/typescript/01.dice-roller/package.json index 27b56c977..497ad00cc 100644 --- a/samples/typescript/01.dice-roller/package.json +++ b/samples/typescript/01.dice-roller/package.json @@ -17,13 +17,13 @@ "doctor": "eslint src/**/*.{j,t}s{,x} --fix --no-error-on-unmatched-pattern" }, "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", diff --git a/samples/typescript/03.live-canvas-demo/package.json b/samples/typescript/03.live-canvas-demo/package.json index a8748438f..f9e77c580 100644 --- a/samples/typescript/03.live-canvas-demo/package.json +++ b/samples/typescript/03.live-canvas-demo/package.json @@ -16,14 +16,14 @@ "doctor": "eslint src/**/*.{j,t}s{,x} --fix --no-error-on-unmatched-pattern" }, "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", diff --git a/samples/typescript/04.live-share-react/package.json b/samples/typescript/04.live-share-react/package.json index 3c99812ab..c2f76e221 100644 --- a/samples/typescript/04.live-share-react/package.json +++ b/samples/typescript/04.live-share-react/package.json @@ -5,16 +5,16 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -26,7 +26,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", diff --git a/samples/typescript/05.dice-roller-turbo/package.json b/samples/typescript/05.dice-roller-turbo/package.json index 0c401c5a7..37516a898 100644 --- a/samples/typescript/05.dice-roller-turbo/package.json +++ b/samples/typescript/05.dice-roller-turbo/package.json @@ -16,13 +16,13 @@ "doctor": "eslint src/**/*.{j,t}s{,x} --fix --no-error-on-unmatched-pattern" }, "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120" + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.16.0", "buffer": "^6.0.3", diff --git a/samples/typescript/06.presence-avatars/package.json b/samples/typescript/06.presence-avatars/package.json index 2f24078e4..6b7a812f9 100644 --- a/samples/typescript/06.presence-avatars/package.json +++ b/samples/typescript/06.presence-avatars/package.json @@ -5,16 +5,16 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -26,7 +26,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", diff --git a/samples/typescript/07.countdown-timer/package.json b/samples/typescript/07.countdown-timer/package.json index 45850bda8..8fab9f7e7 100644 --- a/samples/typescript/07.countdown-timer/package.json +++ b/samples/typescript/07.countdown-timer/package.json @@ -5,16 +5,16 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -26,7 +26,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", diff --git a/samples/typescript/08.3d-model/package.json b/samples/typescript/08.3d-model/package.json index 4e7ba9344..6b162a85b 100644 --- a/samples/typescript/08.3d-model/package.json +++ b/samples/typescript/08.3d-model/package.json @@ -5,19 +5,19 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@babylonjs/core": "6.43.0", "@babylonjs/loaders": "6.43.0", "@babylonjs/gui": "6.43.0", "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", - "@microsoft/live-share-react": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", + "@microsoft/live-share-react": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -31,7 +31,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.3", diff --git a/samples/typescript/11.react-video-js/package.json b/samples/typescript/11.react-video-js/package.json index 467333df8..1ad141adf 100644 --- a/samples/typescript/11.react-video-js/package.json +++ b/samples/typescript/11.react-video-js/package.json @@ -5,15 +5,15 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -26,7 +26,7 @@ "video.js": "^8.17.4" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@types/lodash": "^4.14.191", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", diff --git a/samples/typescript/21.react-media-template/package.json b/samples/typescript/21.react-media-template/package.json index 140846fde..2d0af1a01 100644 --- a/samples/typescript/21.react-media-template/package.json +++ b/samples/typescript/21.react-media-template/package.json @@ -5,15 +5,15 @@ "author": "Microsoft", "license": "MIT", "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@fluentui/react-components": "^9.18.6", "@fluentui/react-icons": "^2.0.202", "@fluentui/react-theme": "^9.1.5", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "@microsoft/live-share-media": "2.0.0-internal.18", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "@microsoft/live-share-media": "2.0.0-internal.19", "@microsoft/teams-js": "^2.16.0", - "fluid-framework": ">=2.40 <2.120", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -25,7 +25,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "@types/lodash": "^4.14.191", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", diff --git a/samples/typescript/31.live-canvas-tests/package.json b/samples/typescript/31.live-canvas-tests/package.json index efcf4fb2f..a8338e24b 100644 --- a/samples/typescript/31.live-canvas-tests/package.json +++ b/samples/typescript/31.live-canvas-tests/package.json @@ -15,13 +15,13 @@ "doctor": "eslint src/**/*.{j,t}s{,x} --fix --no-error-on-unmatched-pattern" }, "dependencies": { - "@fluidframework/azure-client": ">=2.40 <2.120", - "@microsoft/live-share": "2.0.0-internal.18", - "@microsoft/live-share-canvas": "2.0.0-internal.18", - "fluid-framework": ">=2.40 <2.120" + "@fluidframework/azure-client": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@microsoft/live-share": "2.0.0-internal.19", + "@microsoft/live-share-canvas": "2.0.0-internal.19", + "fluid-framework": ">=2.102 <2.120 || >=3.0.0 <3.10.0" }, "devDependencies": { - "@fluidframework/test-runtime-utils": ">=2.40 <2.120", + "@fluidframework/test-runtime-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", "buffer": "^6.0.3", "start-server-and-test": "^2.0.0", "vite": "^6.1.7" From b2e6c9dc8bd21bd44c5d89291b3485611a359afc Mon Sep 17 00:00:00 2001 From: James Hunt Date: Tue, 15 Sep 2026 10:00:05 -0700 Subject: [PATCH 04/10] Address PR feedback: correct Fluid 3 compatibility claims in docs Documentation and comment corrections from review comments on #889. No behavior changes. - FluidOldestSupportedClient: Fluid 3 has no default minimum-version value, so a value must always be supplied. "2.0.0" is unchanged and remains correct as the lowest version Fluid 3 supports; only the justification was wrong. - update-fluid-range.js: drop the note about separating range clauses with "||" rather than a single "|". - FLUID-V3-MIGRATION.md: require(esm) was backported to Node 20.19, so the runtime support line is ">= 20.19" rather than ">= 22.12 / fails on 18 / 20". - FLUID-V3-MIGRATION.md: scope the CJS conclusion to the build. We cannot ship a tsc-built CJS artifact against Fluid 3, but CJS consumers are not blocked outright, since Node >= 20.19 and TypeScript 5.9+ support require(esm). - FLUID-V3-MIGRATION.md: state the consequence of declaring no "engines" field, rather than only noting its absence. Verified against both ends of the supported range. At Fluid 2.102.0 and 3.0.1 all packages and samples build and live-share 81, live-share-media 57 and live-share-canvas 17 tests pass. The ESM and pnpm usage tests pass on 3.0.2. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 59286b4a-1977-4cb4-a0f8-e50fde36924e --- FLUID-V3-MIGRATION.md | 19 ++++++++++++------- internal/build-tools/update-fluid-range.js | 3 --- packages/live-share/src/internals/consts.ts | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/FLUID-V3-MIGRATION.md b/FLUID-V3-MIGRATION.md index fe1444dfd..7d5fed5ac 100644 --- a/FLUID-V3-MIGRATION.md +++ b/FLUID-V3-MIGRATION.md @@ -257,13 +257,13 @@ Measured behaviour of a consumer against Fluid 3.0.0: | `moduleResolution: Bundler` | works, even inside a `type: commonjs` package | 7 TypeScript samples | | `moduleResolution: Node10` | **TS2307** on every Fluid import | our 5 `tsconfig.cjs.json` | | `moduleResolution: Node16`, CJS context | **TS1479** "cannot be imported with `require`" | any CJS consumer of ours | -| `require("fluid-framework")` at runtime | works on Node >= 22.12 (tested v24.14.0) | fails on Node 18 / 20 | +| `require("fluid-framework")` at runtime | works on Node >= 20.19 (tested v24.14.0) | fails below Node 20.19 | --- ## 5. The CJS build cannot support Fluid 3 -This is a hard constraint, not a matter of effort. +This is a hard constraint on the build, not a matter of effort. - All five `packages/*/tsconfig.cjs.json` use `"module": "CommonJS"` + `"moduleResolution": "Node10"`. Fluid 3 removed its Node10 type-declaration entrypoints, so every Fluid import fails TS2307. @@ -277,9 +277,12 @@ So `bin/cjs` cannot be produced against Fluid 3 with any tsc configuration. A CJ could in principle still be _emitted_ via a separate transpiler, but its `.d.ts` would still reference ESM-only Fluid types and would fail for the consumer — so this does not rescue it. -**Conclusion: CJS consumers of Live Share cannot use Fluid 3.** This is imposed by Fluid, not -by us. Note also that `exports` maps cannot express a per-format peer-dependency range, so a -"CJS means Fluid 2" split is a documented support-matrix statement that npm cannot enforce. +**Conclusion: we cannot ship a tsc-built CJS artifact against Fluid 3.** This is imposed by +Fluid, not by us. CJS _consumers_ are not absolutely blocked — Node >= 20.19 and TypeScript +5.9+ support `require(esm)`, which is enough to consume ESM-only packages — but that is a +consumer-side capability, not something our CJS build can provide. Note also that `exports` +maps cannot express a per-format peer-dependency range, so a "CJS means Fluid 2" split is a +documented support-matrix statement that npm cannot enforce. --- @@ -345,8 +348,10 @@ harness will never exercise 3.x even in a Fluid-3 lane. - **ESM consumers** — get v2 and v3 support, no action required beyond the floor raise. - **Bundler-based apps** (webpack, vite, Next.js) — unaffected; `moduleResolution: bundler` resolves Fluid 3 fine even from a `type: commonjs` package. -- **CJS consumers** — cannot move to Fluid 3. They also need Node >= 22.12 for `require(ESM)` - to work at all at runtime. No `engines` field is declared in any of our packages today. +- **CJS consumers** — cannot consume a CJS build of Live Share, because we no longer ship one. + They can still use the ESM packages via `require(esm)` on Node >= 20.19. Below that version + the import fails at runtime rather than at install time, because none of our packages declare + an `engines` field. - **Anyone on Fluid 2.40 – 2.115** — dropped by the floor raise. --- diff --git a/internal/build-tools/update-fluid-range.js b/internal/build-tools/update-fluid-range.js index 60c6d1f00..f5eb26ec7 100644 --- a/internal/build-tools/update-fluid-range.js +++ b/internal/build-tools/update-fluid-range.js @@ -10,9 +10,6 @@ * DEFAULT_FROM_RANGE must be the exact range string currently present in package.json * files (whitespace-trimmed, but otherwise character-for-character, including any `||` * clauses). A near-miss silently matches nothing instead of failing. - * - * Always use `||` to separate range clauses, never a single `|` — a single pipe fails when - * consumers install with yarn. */ const fs = require("fs"); diff --git a/packages/live-share/src/internals/consts.ts b/packages/live-share/src/internals/consts.ts index 862192361..f480a3be2 100644 --- a/packages/live-share/src/internals/consts.ts +++ b/packages/live-share/src/internals/consts.ts @@ -47,8 +47,8 @@ export const LiveShareReportIssueLink = "https://aka.ms/teamsliveshare/issue"; * * @remarks * Fluid 3.0 removed the legacy `CompatibilityMode` values (`"1"` / `"2"`), so this must be a - * SemVer string. `"2.0.0"` preserves collaboration with Fluid 2.0.0-era clients and matches - * Fluid 3's own default. + * SemVer string. Fluid 3 has no default — a value must always be supplied — and `"2.0.0"` is + * the lowest version it supports, preserving collaboration with Fluid 2.0.0-era clients. * * Deliberately left unannotated: the corresponding Fluid type is named * `MinimumVersionForCollab` in 2.102-2.115 and `OldestSupportedClientVersion` from 2.116 From e0cd095ae1db5f6003872939d969845ef09586fc Mon Sep 17 00:00:00 2001 From: James Hunt Date: Tue, 15 Sep 2026 15:33:02 -0600 Subject: [PATCH 05/10] fix(react): preserve SharedMap typing across Fluid versions Vendor Fluid map interfaces and preserve typed reads, boolean deletion, and chainable writes with TypedSharedMap overrides. Document the remaining native Map and callback typing limitations. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 9e828dbb-c789-4b25-96f0-7e0b7dd0242a --- FLUID-V3-MIGRATION.md | 40 ++-- packages/live-share-react/README.md | 6 + .../live-share-react/src/types/FluidMap.ts | 172 ++++++++++++++++++ .../live-share-react/src/types/ResultTypes.ts | 22 ++- 4 files changed, 223 insertions(+), 17 deletions(-) create mode 100644 packages/live-share-react/src/types/FluidMap.ts diff --git a/FLUID-V3-MIGRATION.md b/FLUID-V3-MIGRATION.md index 7d5fed5ac..10d951118 100644 --- a/FLUID-V3-MIGRATION.md +++ b/FLUID-V3-MIGRATION.md @@ -106,16 +106,32 @@ build. #### `useSharedMap` public type change `IUseSharedMapResults.sharedMap` changes from `(Map & SharedMap) | undefined` -to `SharedMap | undefined`. `FluidMap` cannot be named in its place because it does not exist in -Fluid 2.x, which we still support. Runtime behaviour is unchanged; consumers wanting value-typed -access should use the `getEntry` / `setEntry` callbacks. - -This needs to be called out in the release notes, because it **loosens types rather than -breaking builds**: `ISharedMap.get` is declared `get(key: string): T | undefined`, so -existing consumer code like `sharedMap.get(key)` still compiles but now yields `any` instead of -`TData`. Downstream type errors therefore disappear silently rather than surfacing at the call -site. Consumers should either pass the type argument explicitly (`sharedMap.get(key)`) or -switch to `getEntry`. +to `TypedSharedMap | undefined`. Because Fluid 2.x does not export +`FluidMap`, `packages/live-share-react/src/types/FluidMap.ts` contains a local copy of +[Fluid's map and iterable interfaces](https://github.com/microsoft/FluidFramework/blob/main/packages/common/core-interfaces/src/fluidMap.ts). +The copy retains its MIT license and is not re-exported from the package entry point, avoiding +name collisions with Fluid 3.x exports. + +Following the [review discussion](https://github.com/microsoft/live-share-sdk/pull/889#discussion_r3981502313), +`TypedSharedMap` places `delete(key): boolean` and +`set(key, value): TypedSharedMap` overrides before `FluidMap & SharedMap`. +These preserve boolean deletion results and chaining, including DDS members after `set`. +The local copy retains upstream's `void` mutator returns: changing those in the copy itself +makes Fluid 3's `SharedMap` incompatible through the map argument of its `forEach` callback. +That callback's third argument consequently retains Fluid's map interface and `void` mutator +returns; use the outer `sharedMap` for boolean deletion results or chaining inside a callback. +Keeping `FluidMap` before `SharedMap` preserves `TData` inference for `get`, +`forEach`, `values`, and `entries`. Direct `for...of sharedMap` retains the original +intersection's untyped value inference; iterate `sharedMap.entries()` for typed entries. +Runtime behaviour is unchanged, as are the +`getEntry` / `setEntry` callbacks. The underlying `SharedMap` generic `set` overload still +accepts other value types, as it did before; use `setEntry` for a `TData`-constrained write. + +**Release-notes item:** the returned map is no longer assignable to the built-in +`Map` type on Fluid 3.x. Consumers requiring a built-in `Map` should use +`new Map(sharedMap)` after checking that `sharedMap` is defined. This creates a local snapshot, +not a synchronized DDS. A Fluid 3.1 patch will not remove the need for this compatibility +approach while Fluid 2.x remains supported. ### The one required source change @@ -421,7 +437,9 @@ Done on this branch: 6. [x] `.js` extensions added to 39 relative imports across test-utils, canvas and media. 7. [x] `package-lock.json` regenerated; Fluid resolved to 3.0.1. 8. [x] `LogLevel.default` / `LogLevel.error` replaced with `LogLevel.info` / `LogLevel.essential`. -9. [x] `useSharedMap` result type narrowed to `SharedMap | undefined`. +9. [x] `useSharedMap` value typing preserved with `TypedSharedMap`, using a local + `FluidMap & SharedMap` intersection with `delete` / `set` overrides for boolean + results and chaining. Not done — needs a decision or a follow-up: diff --git a/packages/live-share-react/README.md b/packages/live-share-react/README.md index a9f4bbf58..5c860801b 100644 --- a/packages/live-share-react/README.md +++ b/packages/live-share-react/README.md @@ -133,6 +133,12 @@ _NOTE:_ While this hook will get you pretty far on its own, carefully consider w This hook loads a Fluid `SharedMap` corresponding with the key you provide. Compared to `useSharedState`, this hook allows you to render a collection of items with less risk of conflict when multiple users may be writing to the same object simultaneously. For example, rather than storing an entire list of objects in a single key of `useSharedState`, the map allows each item in the list to have its own unique key. +In TypeScript, `useSharedMap` preserves `TData` for `sharedMap.get`, `forEach`, +`values`, and `entries` on both Fluid 2.x and 3.x. Its `delete` method returns a boolean and `set` +remains chainable. With Fluid 3.x, `sharedMap` is not assignable to a built-in `Map`; +use `new Map(sharedMap)` once it is defined if you need a local, unsynchronized snapshot. +Use `setEntry` for writes constrained to `TData`. + While you write to keys individually, the `map` object exposed through the hook uses React state itself. Lets see an example in action: ```javascript diff --git a/packages/live-share-react/src/types/FluidMap.ts b/packages/live-share-react/src/types/FluidMap.ts new file mode 100644 index 000000000..e7e96746f --- /dev/null +++ b/packages/live-share-react/src/types/FluidMap.ts @@ -0,0 +1,172 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +// Copied from https://github.com/microsoft/FluidFramework/blob/main/packages/common/core-interfaces/src/fluidMap.ts +// Fluid 2.x does not export these types. Keep this copy out of the package barrel. + +/** + * Like TypeScript's built-in `Iterable` type. + * + * @privateRemarks + * This exists to be unaffected by TypeScript's version and configuration options. + * + * @sealed @public + */ +export interface FluidIterable { + /** + * Returns an iterator over the elements in this iterable. + * + * @remarks Works like the built-in {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator | \[Symbol.iterator\]} protocol. + */ + [Symbol.iterator](): FluidIterableIterator; +} + +/** + * Like TypeScript's built-in iterable iterator type. + * + * @privateRemarks + * The done branch uses `any` rather than `undefined` to match TypeScript's built-in IteratorReturnResult, which defaults to any for the same reason. + * Using `undefined` causes TypeScript to include it in type inference at call sites like `Array.from` which would infer `T | undefined` instead of `T`. + * The done value is rarely meaningful to callers since values are mainly consumed when done is false. + * Thus `any` is not particularly harmful here, and the unsafety is worth it as + * it interacts better with the existing TypeScript `IteratorResult` interfaces where `TReturn` defaults to any. + * + * @sealed @public + */ +export interface FluidIterableIterator extends FluidIterable { + /** + * Returns the next element in the iteration sequence. + * + * @remarks Works like the built-in {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterator_protocol | Iterator.next} method. + * When there are remaining elements, returns `\{ value: T; done?: false \}`. + * When the iteration is complete, returns `\{ value: any; done: true \}`. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + next(): { value: T; done?: false } | { value: any; done: true }; +} + +/** + * Like TypeScript's built in `ReadonlyMap` type. + * Unlike the built in `ReadonlyMap`, this interface includes Symbol.toStringTag. + * + * @privateRemarks + * This exists so that Fluid has a `ReadonlyMap` type which is unaffected by TypeScript's version and configuration options, + * and safe to implement without being broken by changes to TypeScript's default ReadonlyMap type. + * All behavior exposed through this interface should be compatible with the corresponding behavior of built in ReadonlyMaps, + * but it may lack some of the newer APIs, + * and might express the type slightly different from how TypeScript does in its `ReadonlyMap` type. + * + * @sealed @public + */ +export interface FluidReadonlyMap { + /** + * Returns an iterable of entries in the map. + */ + [Symbol.iterator](): FluidIterableIterator<[K, V]>; + + /** + * The number of entries in the map. + */ + readonly size: number; + + /** + * Returns an iterable of key, value pairs for every entry in the map. + */ + entries(): FluidIterableIterator<[K, V]>; + + /** + * Executes the provided function once per each key/value pair in the map. + */ + forEach( + callbackfn: (value: V, key: K, map: FluidReadonlyMap) => void, + // Typing inherited from ReadonlyMap. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + thisArg?: any + ): void; + + /** + * Returns the value associated to the specified key, or undefined if there is none. + */ + get(key: K): V | undefined; + + /** + * Returns a boolean indicating whether an element with the specified key exists or not. + */ + has(key: K): boolean; + + /** + * Returns an iterable of keys in the map. + */ + keys(): FluidIterableIterator; + + /** + * Returns an iterable of values in the map. + */ + values(): FluidIterableIterator; + + /** + * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag | Symbol.toStringTag} + */ + readonly [Symbol.toStringTag]: string; +} + +/** + * Like TypeScript's built in `Map` type. + * + * @privateRemarks + * This exists so that Fluid has a `Map` type which is unaffected by TypeScript's version and configuration options, + * and safe to implement without being broken by changes to TypeScript's default Map type. + * All behavior exposed through this interface should be compatible with the corresponding behavior of JavaScript Maps, + * but it may lack some of the newer APIs, + * and might express the type slightly different from how TypeScript does in its `Map` type. + * + * @sealed @public + */ +export interface FluidMap extends FluidReadonlyMap { + /** + * Removes the specified element from the map by its key. + * + * @remarks + * Unlike the built-in `Map.delete`, this returns `void` instead of a boolean. + * This is intentional: in a distributed system, the caller often cannot reliably know + * whether the element existed at the time of deletion. + * Subtypes may override this to return a boolean if appropriate. + */ + delete(key: K): void; + + /** + * Executes the provided function once per each key/value pair in the map. + */ + forEach( + callbackfn: (value: V, key: K, map: FluidMap) => void, + // Typing inherited from Map. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + thisArg?: any + ): void; + + /** + * Adds a new element with a specified key and value to the map. + * If an element with the same key already exists, the element will be updated. + */ + set(key: K, value: V): void; +} diff --git a/packages/live-share-react/src/types/ResultTypes.ts b/packages/live-share-react/src/types/ResultTypes.ts index decc9a1c8..ff825a7f3 100644 --- a/packages/live-share-react/src/types/ResultTypes.ts +++ b/packages/live-share-react/src/types/ResultTypes.ts @@ -50,6 +50,7 @@ import { OnUpdateLivePresenceAction, SendLiveEventAction, } from "./ActionTypes.js"; +import type { FluidMap } from "./FluidMap.js"; export interface IAzureContainerResults { /** @@ -69,6 +70,16 @@ export interface ILiveShareContainerResults extends IAzureContainerResults { created: boolean; } +/** + * A value-typed SharedMap compatible with Fluid 2.x and 3.x. + */ +export type TypedSharedMap = { + // These overloads precede FluidMap's void returns without changing its forEach callback type. + delete(key: string): boolean; + set(key: string, value: TData): TypedSharedMap; +} & FluidMap & + SharedMap; + /** * @deprecated use {@link useSharedTree} instead. * @@ -79,13 +90,12 @@ export interface IUseSharedMapResults { * The Fluid `SharedMap` object. * * @remarks - * Previously typed as `Map & SharedMap`. Fluid 3.0 changed `ISharedMap` to - * extend Fluid's own `FluidMap` rather than the built-in `Map`, so that intersection is no - * longer satisfiable — and `FluidMap` cannot be named here because it does not exist in - * Fluid 2.x, which we still support. Use the typed `getEntry` / `setEntry` callbacks below - * for value-typed access. + * Uses a local FluidMap type for value-typed get, forEach, values, and entries across Fluid 2.x and 3.x, + * while preserving ISharedMap's boolean delete result and chainable set method. + * Fluid 3.x maps are not assignable to the built-in Map type; use new Map(sharedMap) + * when a built-in Map is required. */ - sharedMap: SharedMap | undefined; + sharedMap: TypedSharedMap | undefined; /** * Callback method to get entries in the `SharedMap`. */ From bececa6dff3a4ee799a2e3ec2bab7714480d1322 Mon Sep 17 00:00:00 2001 From: James Hunt Date: Tue, 15 Sep 2026 15:35:24 -0600 Subject: [PATCH 06/10] docs: move Fluid migration rationale to PR description Remove the standalone investigation document; keep the migration summary, compatibility caveats, and validation results in PR #889. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 9e828dbb-c789-4b25-96f0-7e0b7dd0242a --- FLUID-V3-MIGRATION.md | 454 ------------------------------------------ 1 file changed, 454 deletions(-) delete mode 100644 FLUID-V3-MIGRATION.md diff --git a/FLUID-V3-MIGRATION.md b/FLUID-V3-MIGRATION.md deleted file mode 100644 index 10d951118..000000000 --- a/FLUID-V3-MIGRATION.md +++ /dev/null @@ -1,454 +0,0 @@ -# Supporting Fluid Framework v2 and v3 in the Live Share SDK - -Status: **implemented and green on Fluid 3.0.1** -Branch: `user/jameshunt/2.0.0-internal.19` -Fluid Framework 3.0.0 published 2026-09-04 and is `latest` on npm. - -## 0. Outcome - -Implemented: CJS dropped, build and tests migrated to ESM/Node16, peer floor raised to 2.102, -`oldestSupportedClient` set to `"2.0.0"`. - -Shipped as two stacked PRs: - -1. **Drop CJS + migrate build/tests to ESM/Node16** - no Fluid version changes, verified on - Fluid 2.110.0. This is a prerequisite: a CommonJS build cannot consume ESM-only Fluid 3. -2. **Support Fluid 3** - raise the floor to 2.102, add the `>=3.0.0 <3.10.0` clause, swap the - container compatibility argument, and fix the two API breaks. - -Splitting them isolates the module-system migration from the Fluid upgrade, so a failure in -one is diagnosable. Each was verified green independently. - -### The 2.40 question - -Raising the _peer_ floor to 2.102 does not drop support for Fluid 2.40 clients. The two knobs -are independent: - -| Knob | Governs | Value | -| ----------------------- | -------------------------------------------------------------- | ------------------------------------- | -| Peer dependency range | which Fluid a consumer installs to **build** against | `>=2.102 <2.120 \|\| >=3.0.0 <3.10.0` | -| `oldestSupportedClient` | which Fluid clients can still **collaborate** on our documents | `"2.0.0"` | - -`"2.0.0"` is lower than 2.40, so every 2.40-era client keeps working. Per Jason Hartman: -"since lowest compat was already 2.40, you could probably use `"2.40.0"` for oldest supported -client. But `"2.0.0"` is very safe." We use the safe value. - -Verified on **Fluid 3.0.1** (resolved by `npm update` within the new range): - -| Check | Result | -| ----------------------------------------- | ---------- | -| All 5 packages build (ESM only) | pass | -| `internal/test-utils` builds under Node16 | pass | -| live-share tests | 81 passing | -| live-share-media tests | 57 passing | -| live-share-canvas tests | 17 passing | -| ESM usage test | pass | -| All samples build | pass | - -The same set was also verified green on Fluid 2.110.0 before moving to 3.0.1, which isolates -the ESM/Node16 migration from the Fluid 3 upgrade. - -Everything below records how each decision was reached. - -Every claim below was verified empirically in isolated probes under `/tmp/ff3probe` -(Fluid 2.118.0 and 3.0.0 installed side by side; nothing was built inside this repo). -Where a claim is an inference rather than a measurement, it says so. - ---- - -## 1. Executive summary - -Supporting both v2 and v3 from one source tree **is feasible**, and the source-code delta is -a single symbol. The difficulty is not in our application code — it is that **Fluid 3 is -ESM-only**, and roughly half our build and test tooling is CommonJS with Node10 module -resolution. - -| Area | v2+v3 dual support | Effort | -| ------------------------------------- | ------------------- | -------------------- | -| Package source (`packages/*/src`) | Yes | 1 symbol | -| ESM build (`tsconfig.json`) | Yes | none | -| TypeScript samples | Yes | none | -| **CJS build** (`tsconfig.cjs.json`) | **No — impossible** | see §5 | -| **Test suite** (`tsconfig.test.json`) | Not as-is | largest chunk | -| **`internal/test-utils`** | Not as-is | 6 files / ~503 lines | - ---- - -## 2. What we verified: the API delta is one symbol - -Probe method: extracted **all 18 Fluid module specifiers** imported by `packages/*/src`, -with **all 90 named imports** taken verbatim from the source, aliased to suppress -duplicate-identifier noise, then compiled under our existing ESM tsconfig -(`module: Node16`, `moduleResolution: Node16`). - -| Fluid version | `tsc` exit | Errors | -| ------------- | ---------- | ----------------------------------------------------------------------------- | -| 2.118.0 | 0 | none | -| 3.0.0 | 2 | **1** — `CompatibilityMode` is not exported by `@fluidframework/azure-client` | - -Every `/legacy` and `/internal` entrypoint we depend on still exists in 3.0. - -### v3 breaking changes and whether they affected us - -The type-only probe described above under-reported: it verified that every _imported name_ -still resolves, but not how those names are _used_. Two changes only surfaced during the real -build. - -| Breaking change | Affected us? | -| -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Log level required on every telemetry event | No — `LiveTelemetryLogger` already passed a `LogLevel` at all three `.send()` sites | -| **Deprecated log level aliases removed** | **Yes** — we used `LogLevel.default` and `LogLevel.error`, both removed. Replaced with `LogLevel.info` (both `20`) and `LogLevel.essential` (both `30`); values are identical and both names exist in 2.x and 3.x, so this is dual-safe | -| **Shared maps use Fluid-owned map types** | **Yes** — `ISharedMap` now extends Fluid's `FluidMap` rather than the built-in `Map`, so `useSharedMap`'s public `(Map & SharedMap)` type is unsatisfiable. See below | -| Container/presence APIs use Fluid-owned collection types | No — we don't consume those APIs | -| SharedTree deprecated API removals | No — we don't use the removed APIs | -| `assert` export changes in `client-utils` | No — we only import `TypedEventEmitter`, still exported | - -#### `useSharedMap` public type change - -`IUseSharedMapResults.sharedMap` changes from `(Map & SharedMap) | undefined` -to `TypedSharedMap | undefined`. Because Fluid 2.x does not export -`FluidMap`, `packages/live-share-react/src/types/FluidMap.ts` contains a local copy of -[Fluid's map and iterable interfaces](https://github.com/microsoft/FluidFramework/blob/main/packages/common/core-interfaces/src/fluidMap.ts). -The copy retains its MIT license and is not re-exported from the package entry point, avoiding -name collisions with Fluid 3.x exports. - -Following the [review discussion](https://github.com/microsoft/live-share-sdk/pull/889#discussion_r3981502313), -`TypedSharedMap` places `delete(key): boolean` and -`set(key, value): TypedSharedMap` overrides before `FluidMap & SharedMap`. -These preserve boolean deletion results and chaining, including DDS members after `set`. -The local copy retains upstream's `void` mutator returns: changing those in the copy itself -makes Fluid 3's `SharedMap` incompatible through the map argument of its `forEach` callback. -That callback's third argument consequently retains Fluid's map interface and `void` mutator -returns; use the outer `sharedMap` for boolean deletion results or chaining inside a callback. -Keeping `FluidMap` before `SharedMap` preserves `TData` inference for `get`, -`forEach`, `values`, and `entries`. Direct `for...of sharedMap` retains the original -intersection's untyped value inference; iterate `sharedMap.entries()` for typed entries. -Runtime behaviour is unchanged, as are the -`getEntry` / `setEntry` callbacks. The underlying `SharedMap` generic `set` overload still -accepts other value types, as it did before; use `setEntry` for a `TData`-constrained write. - -**Release-notes item:** the returned map is no longer assignable to the built-in -`Map` type on Fluid 3.x. Consumers requiring a built-in `Map` should use -`new Map(sharedMap)` after checking that `sharedMap` is defined. This creates a local snapshot, -not a synchronized DDS. A Fluid 3.1 patch will not remove the need for this compatibility -approach while Fluid 2.x remains supported. - -### The one required source change - -`packages/live-share/src/internals/consts.ts:50` - -```ts -export const FluidCompatibilityMode: CompatibilityMode = "2"; -``` - -It is consumed positionally at six sites across `LiveShareClient.ts` and -`AzureLiveShareClient.ts`. It is internal (`@hidden`, not re-exported from `index.public.ts` -or `index.internal.ts`), so renaming it is not a public break. - -Replacement, verified compiling clean (`tsc` exit 0) against **both** 2.118.0 and 3.0.0: - -```ts -client.createContainer(schema, "2.0.0"); -client.getContainer(id, schema, "2.0.0"); -``` - -So the const becomes an `OldestSupportedClientVersion` of `"2.0.0"` and the six call sites -are untouched. The name `FluidCompatibilityMode` becomes misleading and should be renamed. - ---- - -## 3. Requirement: the supported floor must rise from 2.40 to 2.102 - -> **Correction.** An earlier draft of this document put the floor at 2.116.0. That was wrong. -> It came from grepping for the identifier `OldestSupportedClientVersion`, which is merely the -> **2.116 rename** of a capability that already existed. The capability itself — passing a -> SemVer string instead of `"1"`/`"2"` — arrived in **2.102.0** under the name -> `MinimumVersionForCollab`. The floor is 2.102, not 2.116. - -Fluid 3.0 removed `CompatibilityMode` (`"1" | "2"`), so the only accepted form is a SemVer -string. We therefore need the lowest version that accepts `"2.0.0"`. - -Determined by compiling the real expression `client.createContainer(schema, "2.0.0")`, not by -grepping: - -| Version | `tsc` | Result | -| ------- | ----- | ----------------------------------------------------------------------------------- | -| 2.101.1 | 2 | **TS2345** — `'"2.0.0"' is not assignable to parameter of type 'CompatibilityMode'` | -| 2.102.0 | 0 | accepted | -| 2.118.0 | 0 | accepted | -| 3.0.0 | 0 | accepted | - -A grep sweep across 2.40 / 2.50 / 2.60 / 2.70 / 2.80 / 2.90 / 2.100 / 2.100.1 / 2.101.0 / -2.101.1 confirms the `minVersionForCollab: MinimumVersionForCollab` overload is absent -throughout and first appears in 2.102.0. - -### Why we cannot simply keep 2.40 - -Below 2.102 this is not only a type error — it is a **silent runtime misconfiguration**. -In 2.101.1, `compatibilityMode` is used as a lookup-table key: - -```js -...compatibilityModeRuntimeOptions[compatibilityMode], -compatibilityModeToMinVersionForCollab[compatibilityMode], -``` - -Passing `"2.0.0"` yields `undefined` from both tables. Spreading `undefined` is a no-op, so the -container is created with **no compatibility options at all** — no throw, no warning. - -From 2.102 onward the value is instead passed through a resolver that maps `"2"` to `"2.0.0"` -and passes any other value through unchanged, so `"2.0.0"` and `"2"` are exactly equivalent. - -Consequence: the correct range is - -``` ->=2.102 <2.120 || >=3.0.0 <3.10.0 -``` - -> The range currently written on this branch is `>=2.40 <2.120 || >=3.0.0 <3.10.0`, which is -> **not accurate** and must be corrected before this ships. - -The lockfile currently resolves `fluid-framework` to 2.110.0, which **does** satisfy the 2.102 -floor. (Under the incorrect 2.116 figure it did not, so the floor alone no longer forces a -reinstall — though the module-system work does.) - ---- - -## 3a. Rejected alternative: a runtime shim to keep the 2.40 floor - -> **Decided: rejected.** Per Jason Hartman — "keep it simpler and just pass semantic version -> all of the time." The shim solved a problem that does not exist; see _Why this was -> unnecessary_ below. - -For the record, the shim was viable. `"2"` is accepted across all of Fluid 2.x (2.40–2.119), -and only 3.x rejects it, so detecting the major version was sufficient: - -```ts -import * as runtimeUtils from "@fluidframework/runtime-utils/internal"; -const isV3 = runtimeUtils.cleanedPackageVersion?.startsWith("3.") ?? false; -export const FluidOldestSupportedClient = ( - isV3 ? "2.0.0" : "2" -) as OldestSupportedClientVersion; -``` - -Verified against three real installations — 2.40.0 (marker absent, chose `"2"`), 2.118.0 -(chose `"2"`, resolves to `2.0.0`), 3.0.0 (chose `"2.0.0"`). It worked. - -### Why this was unnecessary - -The analysis above conflated two orthogonal knobs: - -| Knob | Governs | Our value | -| --------------------------- | ----------------------------------------------------------------- | ------------------------------------- | -| **Peer dependency range** | which Fluid versions a _consumer can build/install against_ | `>=2.102 <2.120 \|\| >=3.0.0 <3.10.0` | -| **`oldestSupportedClient`** | which Fluid _clients can still collaborate_ on documents we write | `"2.0.0"` | - -Raising the peer floor to 2.102 does **not** drop collaboration with older clients. Per Fluid's -[CrossClientCompatibility.md](https://github.com/microsoft/FluidFramework/blob/main/CrossClientCompatibility.md), -`oldestSupportedClient` "specifies the oldest Fluid client version that must be able to access -documents written by the runtime", and is what selects the write format and feature gating. -Keeping it at `"2.0.0"` preserves interop with Fluid 2.0.0-era clients regardless of what a -consumer builds against. Client 3.0 also defaults to `"2.0.0"`, so passing it explicitly -selects the same runtime defaults — Fluid recommends setting it explicitly so that version -mismatches surface at build time rather than silently locking out old clients. - -Consumers still on Fluid 2.40–2.101 therefore only need to upgrade their own Fluid dependency; -no existing session or document loses compatibility. - -The Fluid docs use exactly the call shape we verified: - -```ts -const { container } = await azureClient.createContainer(schema, "2.0.0"); -const { container } = await azureClient.getContainer(id, schema, "2.0.0"); -``` - -## 4. Requirement: module system - -Fluid 3 is ESM-only: `"type": "module"`, and its `exports` map has **no `require` condition**. - -Measured behaviour of a consumer against Fluid 3.0.0: - -| Consumer configuration | Result | Who this is | -| --------------------------------------- | ---------------------------------------------- | ------------------------------------ | -| `moduleResolution: Node16`, ESM context | works | our `tsconfig.json` (all 5 packages) | -| `moduleResolution: Bundler` | works, even inside a `type: commonjs` package | 7 TypeScript samples | -| `moduleResolution: Node10` | **TS2307** on every Fluid import | our 5 `tsconfig.cjs.json` | -| `moduleResolution: Node16`, CJS context | **TS1479** "cannot be imported with `require`" | any CJS consumer of ours | -| `require("fluid-framework")` at runtime | works on Node >= 20.19 (tested v24.14.0) | fails below Node 20.19 | - ---- - -## 5. The CJS build cannot support Fluid 3 - -This is a hard constraint on the build, not a matter of effort. - -- All five `packages/*/tsconfig.cjs.json` use `"module": "CommonJS"` + `"moduleResolution": "Node10"`. - Fluid 3 removed its Node10 type-declaration entrypoints, so every Fluid import fails TS2307. -- It cannot be fixed by switching resolution: `module: CommonJS` with `moduleResolution: Bundler` - is rejected outright with **TS5095** ("bundler can only be used when module is set to - preserve or to es2015 or later"). -- It cannot be fixed by switching to Node16 either — a CJS-context consumer importing an - ESM-only package fails TS1479 by design. - -So `bin/cjs` cannot be produced against Fluid 3 with any tsc configuration. A CJS artifact -could in principle still be _emitted_ via a separate transpiler, but its `.d.ts` would still -reference ESM-only Fluid types and would fail for the consumer — so this does not rescue it. - -**Conclusion: we cannot ship a tsc-built CJS artifact against Fluid 3.** This is imposed by -Fluid, not by us. CJS _consumers_ are not absolutely blocked — Node >= 20.19 and TypeScript -5.9+ support `require(esm)`, which is enough to consume ESM-only packages — but that is a -consumer-side capability, not something our CJS build can provide. Note also that `exports` -maps cannot express a per-format peer-dependency range, so a "CJS means Fluid 2" split is a -documented support-matrix statement that npm cannot enforce. - ---- - -## 6. The test suite is CJS/Node10 and must migrate - -This is the largest piece of work and was not obvious at the outset. - -| Config | Setting | Status vs Fluid 3 | -| ----------------------------------- | ------------------------------- | ------------------ | -| 5x `packages/*/tsconfig.cjs.json` | `CommonJS` + `Node10` | broken | -| 3x `packages/*/tsconfig.test.json` | **extends the cjs config** | broken | -| `internal/test-utils/tsconfig.json` | `CommonJS` + `node` | broken | -| `internal/usage-test/cjs-test` | runtime `require` | Node >= 22.12 only | -| `internal/usage-test/pnpm-test` | `Node16` | fine | -| 10 TypeScript samples | 7 `bundler`, 3 inherit `Node16` | fine | - -Because all three `tsconfig.test.json` files extend the CJS config, **the entire mocha suite -is Node10/CommonJS** and cannot compile against Fluid 3 at all. - -Scope of the migration: - -- 3 x `tsconfig.test.json` — re-point to extend `tsconfig.json` (Node16/ESM) -- `internal/build-tools/build-package.js` — stop writing `{"type":"commonjs"}` into `bin/test` -- test scripts in 3 packages — `ts-mocha -p tsconfig.test.json` becomes plain `mocha`, since - the tests are already compiled to `.js` before running -- `internal/test-utils` — 6 files / ~503 lines; convert to Node16/ESM. Its relative imports - mostly omit the `.js` extensions that Node16 ESM requires -- 26 `.spec.ts` files across live-share (14), live-share-media (8), live-share-canvas (4) — - these have only ever been compiled in Node10 mode, so their relative imports likely need - `.js` extensions too. Let `tsc` enumerate these (TS2835) rather than guessing - -One thing that is **not** a blocker: `.mocharc.cjs` `require()`s `@fluidframework/mocha-test-setup`, -which sounds like it would break under an ESM-only Fluid. But that package is frozen at -`2.0.0-rc.1.0.9` (npm `latest` is 1.4.0) and never tracked the 2.40+ line. It is already -decoupled from the Fluid version under test and can stay as-is. - ---- - -## 7. The dual-testing problem - -Two of the choices made so far are in tension, and this needs an explicit resolution. - -Keeping the CJS build means the repo's single `node_modules` must stay on Fluid 2.x, because -`tsconfig.cjs.json` cannot compile against 3.0. Therefore migrating the tests to Node16 is -**necessary but not sufficient** — after that migration the tests would still execute against -Fluid 2.x. - -Actually exercising Fluid 3 requires a **second install lane**: an npm `override` pinning -Fluid to 3.0.0, with the CJS build skipped, running as a separate CI job. There are currently -no `overrides` or `resolutions` in the root `package.json`. - -Existing CI (`.github/workflows/live-share-test-packages.yaml` and three others) runs a -Node `[22.x, 24.x]` matrix. Both satisfy the `require(ESM)` threshold of 22.12. - -Separately, `internal/test-utils/package.json` pins roughly 20 `@fluidframework/*` packages at -`^2.0.0`, which the range-update script does not touch. Until those are addressed, the compat -harness will never exercise 3.x even in a Fluid-3 lane. - ---- - -## 8. Consumer impact - -- **ESM consumers** — get v2 and v3 support, no action required beyond the floor raise. -- **Bundler-based apps** (webpack, vite, Next.js) — unaffected; `moduleResolution: bundler` - resolves Fluid 3 fine even from a `type: commonjs` package. -- **CJS consumers** — cannot consume a CJS build of Live Share, because we no longer ship one. - They can still use the ESM packages via `require(esm)` on Node >= 20.19. Below that version - the import fails at runtime rather than at install time, because none of our packages declare - an `engines` field. -- **Anyone on Fluid 2.40 – 2.115** — dropped by the floor raise. - ---- - -## 9. Decisions required - -### D1. Fate of the CJS build - -**Decided: drop it.** Live Share v2 is still marked internal, so breaking changes are -acceptable now (James Hunt / Mario Jauregui Gomez). Fluid 3 is ESM-only, so this also removes -the constraint that would have pinned the repo's `node_modules` to Fluid 2.x — meaning the -test suite can run against Fluid 3 in a single lane, and no second install lane is needed. - -### D2. Raising the floor 2.40 → 2.102 - -**Decided: accepted, with `oldestSupportedClient` left at `"2.0.0"`.** Per Jason Hartman, -pass a semantic version all the time rather than shimming (§3a). Note the two knobs are -orthogonal: the peer floor is what consumers build against, while `"2.0.0"` preserves -collaboration with older clients. Range syntax must use `||`, not a single `|` — a single pipe -fails when installing with yarn (Mario Jauregui Gomez). - -### D3. How to test against Fluid 3 - -_Open — this is the blocking decision._ -Options: (a) scaffold the second lane now (override + separate CI job + skip CJS there); -(b) do only the Node16 test migration now and defer the lane; (c) design the CI shape first. - -### D4. Scope of this release - -Does `2.0.0-internal.19` ship v3 support, or does it ship as a corrected 2.x-only release -(range `>=2.40 <2.120`, no v3 clause) with v3 following separately? The current branch state -is a half-step: it claims v3 support with a floor that cannot deliver it. - -### D5. Declared Node floor - -If CJS consumers require Node >= 22.12 for `require(ESM)`, should we add an `engines` field? -None of our packages declare one today. - -### D6. `internal/test-utils` Fluid pins - -Its ~20 `^2.0.0` pins are invisible to `update-fluid-range.js`. Bring them into the managed -range, or leave them pinned to 2.x deliberately? - -### D7. Samples - -Samples resolve Fluid 3 fine, but their lockfiles and any `CompatibilityMode` usage would need -review before we claim they work on v3. - ---- - -## 10. Work items - -Done on this branch: - -1. [x] Range corrected to `>=2.102 <2.120 || >=3.0.0 <3.10.0` across all 26 `package.json` - files, via `update-fluid-range.js` (one clean transformation). -2. [x] `consts.ts` — `CompatibilityMode` removed; const renamed - `FluidCompatibilityMode` -> `FluidOldestSupportedClient`, value `"2.0.0"`. Deliberately - left unannotated so it compiles across the whole supported range (§3a). -3. [x] CJS dropped — 5 `tsconfig.cjs.json` deleted, `main` removed, `exports` reduced to the - `import` condition, build scripts `--cjs --esm` -> `--esm`, `build-package.js` CJS task - removed, `internal/usage-test/cjs-test` deleted, CI step removed. -4. [x] 3 x `tsconfig.test.json` re-pointed to the Node16/ESM base; `ts-mocha` replaced with - `mocha` in the three test scripts (we run compiled JS, so ts-node only fought ESM). -5. [x] `internal/test-utils` migrated to Node16/ESM (`type: module`, `exports` map) and its - 22 `^2.0.0` Fluid pins moved into the managed range. -6. [x] `.js` extensions added to 39 relative imports across test-utils, canvas and media. -7. [x] `package-lock.json` regenerated; Fluid resolved to 3.0.1. -8. [x] `LogLevel.default` / `LogLevel.error` replaced with `LogLevel.info` / `LogLevel.essential`. -9. [x] `useSharedMap` value typing preserved with `TypedSharedMap`, using a local - `FluidMap & SharedMap` intersection with `delete` / `set` overrides for boolean - results and chaining. - -Not done — needs a decision or a follow-up: - -- [ ] Document the public support matrix in the README: ESM only, Fluid 2.102+ or 3.x. -- [ ] Decide whether to declare an `engines` field (D5). No package declares one today. -- [ ] `packages/live-share-acs` still has `ts-mocha` test scripts, but has zero spec files, so - it was left untouched rather than migrated speculatively. -- [ ] `@fluidframework/mocha-test-setup` remains pinned at `^2.0.0-rc.1.0.9`. It is frozen on - npm (latest is 1.4.0) and never tracked the 2.40+ line, so it is already decoupled from - the Fluid version under test. Its `require:` hooks still work with ESM specs — verified - by the passing live-share and media suites, which both load `.mocharc.cjs`. -- [ ] `internal/usage-test/pnpm-test` was not run locally (needs pnpm); CI covers it. From 87e2ac2b3189f32cb592f2c2f7266b22747fd4da Mon Sep 17 00:00:00 2001 From: James Hunt Date: Tue, 15 Sep 2026 17:00:26 -0600 Subject: [PATCH 07/10] Widen Fluid dependency ranges for internal test utilities Allow Fluid ^2.102.0 || ^3.0.0 in the developer-only test harness while retaining bounded ranges for published SDK packages. Update lockfile metadata and document dependency alignment for compatibility checks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 6d962410-cbd7-4339-b699-e2767a57c1c5 --- internal/test-utils/README.md | 4 +++ internal/test-utils/package.json | 44 ++++++++++++++++---------------- package-lock.json | 44 ++++++++++++++++---------------- 3 files changed, 48 insertions(+), 44 deletions(-) diff --git a/internal/test-utils/README.md b/internal/test-utils/README.md index 68cfea66a..d1073d4e0 100644 --- a/internal/test-utils/README.md +++ b/internal/test-utils/README.md @@ -1,3 +1,7 @@ This package contains code to setup tests for live share data objects using a local fluid server. Code is duplicated and simplified from "@fluid-private/test-version-utils" and "@fluid-private/test-drivers", which are no longer available over npm in fluid v2. + +Fluid client dependencies intentionally use `^2.102.0 || ^3.0.0` here. This is an internal, development-only test harness, so we accept the maintenance risk of breaking changes in its legacy, internal, and experimental APIs. Published Live Share packages retain their narrower compatibility ranges. + +When checking a specific Fluid version, align all Fluid client dependencies across the test harness and workspace packages to that version, including `@fluid-experimental` and `@fluid-internal` packages. Use a separate installation, rebuild the packages and test utilities, then run the Live Share, canvas, and media test suites; changing only `fluid-framework` can leave incompatible Fluid versions in the same dependency graph. diff --git a/internal/test-utils/package.json b/internal/test-utils/package.json index 1291cab1e..c2495c583 100644 --- a/internal/test-utils/package.json +++ b/internal/test-utils/package.json @@ -22,29 +22,29 @@ "tsc": "tsc" }, "dependencies": { - "@fluid-experimental/attributor": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluid-experimental/sequence-deprecated": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluid-internal/test-driver-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/agent-scheduler": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/aqueduct": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/cell": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/container-loader": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/container-runtime": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/core-interfaces": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/core-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/counter": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/datastore-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/driver-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/local-driver": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/map": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/matrix": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/ordered-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/register-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/runtime-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/sequence": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluid-experimental/attributor": "^2.102.0 || ^3.0.0", + "@fluid-experimental/sequence-deprecated": "^2.102.0 || ^3.0.0", + "@fluid-internal/test-driver-definitions": "^2.102.0 || ^3.0.0", + "@fluidframework/agent-scheduler": "^2.102.0 || ^3.0.0", + "@fluidframework/aqueduct": "^2.102.0 || ^3.0.0", + "@fluidframework/cell": "^2.102.0 || ^3.0.0", + "@fluidframework/container-loader": "^2.102.0 || ^3.0.0", + "@fluidframework/container-runtime": "^2.102.0 || ^3.0.0", + "@fluidframework/core-interfaces": "^2.102.0 || ^3.0.0", + "@fluidframework/core-utils": "^2.102.0 || ^3.0.0", + "@fluidframework/counter": "^2.102.0 || ^3.0.0", + "@fluidframework/datastore-definitions": "^2.102.0 || ^3.0.0", + "@fluidframework/driver-definitions": "^2.102.0 || ^3.0.0", + "@fluidframework/local-driver": "^2.102.0 || ^3.0.0", + "@fluidframework/map": "^2.102.0 || ^3.0.0", + "@fluidframework/matrix": "^2.102.0 || ^3.0.0", + "@fluidframework/ordered-collection": "^2.102.0 || ^3.0.0", + "@fluidframework/register-collection": "^2.102.0 || ^3.0.0", + "@fluidframework/runtime-definitions": "^2.102.0 || ^3.0.0", + "@fluidframework/sequence": "^2.102.0 || ^3.0.0", "@fluidframework/server-local-server": "^7.0.0", - "@fluidframework/telemetry-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/test-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0" + "@fluidframework/telemetry-utils": "^2.102.0 || ^3.0.0", + "@fluidframework/test-utils": "^2.102.0 || ^3.0.0" }, "devDependencies": { "@fluidframework/eslint-config-fluid": "^8.1.0", diff --git a/package-lock.json b/package-lock.json index 9f444f7b0..4858c0d8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,29 +37,29 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@fluid-experimental/attributor": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluid-experimental/sequence-deprecated": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluid-internal/test-driver-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/agent-scheduler": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/aqueduct": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/cell": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/container-loader": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/container-runtime": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/core-interfaces": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/core-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/counter": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/datastore-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/driver-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/local-driver": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/map": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/matrix": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/ordered-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/register-collection": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/runtime-definitions": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/sequence": ">=2.102 <2.120 || >=3.0.0 <3.10.0", + "@fluid-experimental/attributor": "^2.102.0 || ^3.0.0", + "@fluid-experimental/sequence-deprecated": "^2.102.0 || ^3.0.0", + "@fluid-internal/test-driver-definitions": "^2.102.0 || ^3.0.0", + "@fluidframework/agent-scheduler": "^2.102.0 || ^3.0.0", + "@fluidframework/aqueduct": "^2.102.0 || ^3.0.0", + "@fluidframework/cell": "^2.102.0 || ^3.0.0", + "@fluidframework/container-loader": "^2.102.0 || ^3.0.0", + "@fluidframework/container-runtime": "^2.102.0 || ^3.0.0", + "@fluidframework/core-interfaces": "^2.102.0 || ^3.0.0", + "@fluidframework/core-utils": "^2.102.0 || ^3.0.0", + "@fluidframework/counter": "^2.102.0 || ^3.0.0", + "@fluidframework/datastore-definitions": "^2.102.0 || ^3.0.0", + "@fluidframework/driver-definitions": "^2.102.0 || ^3.0.0", + "@fluidframework/local-driver": "^2.102.0 || ^3.0.0", + "@fluidframework/map": "^2.102.0 || ^3.0.0", + "@fluidframework/matrix": "^2.102.0 || ^3.0.0", + "@fluidframework/ordered-collection": "^2.102.0 || ^3.0.0", + "@fluidframework/register-collection": "^2.102.0 || ^3.0.0", + "@fluidframework/runtime-definitions": "^2.102.0 || ^3.0.0", + "@fluidframework/sequence": "^2.102.0 || ^3.0.0", "@fluidframework/server-local-server": "^7.0.0", - "@fluidframework/telemetry-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0", - "@fluidframework/test-utils": ">=2.102 <2.120 || >=3.0.0 <3.10.0" + "@fluidframework/telemetry-utils": "^2.102.0 || ^3.0.0", + "@fluidframework/test-utils": "^2.102.0 || ^3.0.0" }, "devDependencies": { "@fluidframework/eslint-config-fluid": "^8.1.0", From be25b24ba2812d36bcb42558fa285d65e19acce6 Mon Sep 17 00:00:00 2001 From: James Hunt Date: Tue, 15 Sep 2026 17:34:07 -0600 Subject: [PATCH 08/10] Remove redundant ESLint suppressions from copied Fluid types Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ef6b77af-295d-428b-9806-d51ee8baabb2 --- packages/live-share-react/src/types/FluidMap.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/live-share-react/src/types/FluidMap.ts b/packages/live-share-react/src/types/FluidMap.ts index e7e96746f..ceb5377af 100644 --- a/packages/live-share-react/src/types/FluidMap.ts +++ b/packages/live-share-react/src/types/FluidMap.ts @@ -61,7 +61,6 @@ export interface FluidIterableIterator extends FluidIterable { * When there are remaining elements, returns `\{ value: T; done?: false \}`. * When the iteration is complete, returns `\{ value: any; done: true \}`. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any next(): { value: T; done?: false } | { value: any; done: true }; } @@ -100,7 +99,6 @@ export interface FluidReadonlyMap { forEach( callbackfn: (value: V, key: K, map: FluidReadonlyMap) => void, // Typing inherited from ReadonlyMap. - // eslint-disable-next-line @typescript-eslint/no-explicit-any thisArg?: any ): void; @@ -160,7 +158,6 @@ export interface FluidMap extends FluidReadonlyMap { forEach( callbackfn: (value: V, key: K, map: FluidMap) => void, // Typing inherited from Map. - // eslint-disable-next-line @typescript-eslint/no-explicit-any thisArg?: any ): void; From 2eb914de835989bccad7ee0befb4bbf620531ec5 Mon Sep 17 00:00:00 2001 From: James Hunt Date: Tue, 22 Sep 2026 13:08:01 -0600 Subject: [PATCH 09/10] Simplify TypedSharedMap mutator typing Omit FluidMap's set and delete signatures so SharedMap supplies its native mutator return types while preserving forEach callback compatibility. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 403384ca-b379-48c8-8b11-0e73224b7302 --- packages/live-share-react/src/types/ResultTypes.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/live-share-react/src/types/ResultTypes.ts b/packages/live-share-react/src/types/ResultTypes.ts index ff825a7f3..717f770a1 100644 --- a/packages/live-share-react/src/types/ResultTypes.ts +++ b/packages/live-share-react/src/types/ResultTypes.ts @@ -72,12 +72,12 @@ export interface ILiveShareContainerResults extends IAzureContainerResults { /** * A value-typed SharedMap compatible with Fluid 2.x and 3.x. + * Uses SharedMap's mutators without changing FluidMap's forEach callback type. */ -export type TypedSharedMap = { - // These overloads precede FluidMap's void returns without changing its forEach callback type. - delete(key: string): boolean; - set(key: string, value: TData): TypedSharedMap; -} & FluidMap & +export type TypedSharedMap = Omit< + FluidMap, + "delete" | "set" +> & SharedMap; /** From 123edbcb2c39cff641b80f9f213e5c655c5d5c67 Mon Sep 17 00:00:00 2001 From: James Hunt Date: Mon, 2 Nov 2026 12:42:17 -0800 Subject: [PATCH 10/10] module fixes --- samples/typescript/06.presence-avatars/tsconfig.json | 4 +++- samples/typescript/07.countdown-timer/tsconfig.json | 4 +++- samples/typescript/08.3d-model/tsconfig.json | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/samples/typescript/06.presence-avatars/tsconfig.json b/samples/typescript/06.presence-avatars/tsconfig.json index 15d2ac6b0..9b59463fa 100644 --- a/samples/typescript/06.presence-avatars/tsconfig.json +++ b/samples/typescript/06.presence-avatars/tsconfig.json @@ -3,7 +3,9 @@ "include": ["./src"], "compilerOptions": { "jsx": "react-jsx", - "outDir": "/tmp" + "outDir": "/tmp", + "module": "ESNext", + "moduleResolution": "Bundler" }, "files": ["src/main.tsx"] } diff --git a/samples/typescript/07.countdown-timer/tsconfig.json b/samples/typescript/07.countdown-timer/tsconfig.json index 15d2ac6b0..9b59463fa 100644 --- a/samples/typescript/07.countdown-timer/tsconfig.json +++ b/samples/typescript/07.countdown-timer/tsconfig.json @@ -3,7 +3,9 @@ "include": ["./src"], "compilerOptions": { "jsx": "react-jsx", - "outDir": "/tmp" + "outDir": "/tmp", + "module": "ESNext", + "moduleResolution": "Bundler" }, "files": ["src/main.tsx"] } diff --git a/samples/typescript/08.3d-model/tsconfig.json b/samples/typescript/08.3d-model/tsconfig.json index 15d2ac6b0..9b59463fa 100644 --- a/samples/typescript/08.3d-model/tsconfig.json +++ b/samples/typescript/08.3d-model/tsconfig.json @@ -3,7 +3,9 @@ "include": ["./src"], "compilerOptions": { "jsx": "react-jsx", - "outDir": "/tmp" + "outDir": "/tmp", + "module": "ESNext", + "moduleResolution": "Bundler" }, "files": ["src/main.tsx"] }