diff --git a/.changeset/brown-roses-drive.md b/.changeset/brown-roses-drive.md deleted file mode 100644 index 21cefcc5c8cd..000000000000 --- a/.changeset/brown-roses-drive.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@fluidframework/sequence": minor ---- - -Incorporate change and change properties into the same method, and update the change signature to match the new add signature. - -Instead of having 2 separate methods to change the endpoints of an interval and the properties, combine them into a single method that will change the endpoints, properties, or both, depending on the arguments passed in. The signature of this combined method is now updated as well, so the new usage of the change method is to call it with an interval id as the first parameter and an object containing the desired portions of the interval to update as the second parameter. For the object parameter, the endpoints field should be an object containing the new start and end values for the interval, and the properties field should be an object containing the new properties for the interval. Either the endpoints field or the properties field can be omitted, and if neither are present, change will return undefined. The new usage of the change method is as follows: - -Change interval endpoints: change(id, { endpoints: { start: 1, end: 4 } }); -Change interval properties: change(id { props: { a: 1 } }); -Change interval endpoints and properties: change(id, { endpoints: { start: 1, end: 4 }, props: { a: 1 } }); diff --git a/.changeset/cool-goats-open.md b/.changeset/cool-goats-open.md deleted file mode 100644 index 1bb54fa742b2..000000000000 --- a/.changeset/cool-goats-open.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@fluidframework/azure-client": minor -"@fluidframework/container-runtime": minor -"@fluidframework/core-interfaces": minor -"@fluid-experimental/odsp-client": minor -"@fluidframework/telemetry-utils": minor -"@fluid-experimental/tree2": minor ---- - -Move config base types from telemetry-utils to core-interfaces - -The types ConfigTypes, and IConfigProviderBase have been deprecated in the @fluidframework/telemetry-utils and copied to the @fluidframework/core-interfaces. Please update your reference to use these types from @fluidframework/core-interfaces. diff --git a/.changeset/happy-pens-lie.md b/.changeset/happy-pens-lie.md deleted file mode 100644 index 5ec6437790fd..000000000000 --- a/.changeset/happy-pens-lie.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@fluidframework/sequence": minor -"@fluid-private/test-end-to-end-tests": minor ---- - -Deprecate API `findOverlappingIntervals` from `IntervalCollection`, this functionality is moved to the `OverlappingIntervalsIndex`. Users are advised to independently attach the index to the collection and utilize the API accordingly, for instance: - -```typescript -const overlappingIntervalsIndex = createOverlappingIntervalsIndex(sharedString); -collection.attachIndex(overlappingIntervalsIndex) -const result = overlappingIntervalsIndex.findOverlappingIntervals(start, end); -``` \ No newline at end of file diff --git a/.changeset/loose-comics-wonder.md b/.changeset/loose-comics-wonder.md deleted file mode 100644 index 6e09feaeba88..000000000000 --- a/.changeset/loose-comics-wonder.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@fluidframework/container-runtime": minor ---- - -GC: Tombstoned objects will fail to load by default - -Previously, by default Tombstoned objects would merely trigger informational logs, with an option via config -to also cause errors to be thrown on load. Now failure to load is the default, with an option to disable it if necessary. -This reflects the purpose of Tombstone stage which is to mimic the user experience of having objects deleted. diff --git a/.changeset/lovely-stave-squad.md b/.changeset/lovely-stave-squad.md deleted file mode 100644 index 4b6de7cd40dd..000000000000 --- a/.changeset/lovely-stave-squad.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"@fluidframework/container-runtime": minor -"@fluidframework/runtime-definitions": minor ---- - -Moves `IdCompressor` and related types from `@fluidframework/container-runtime` and `@fluidframework/runtime-definitions` into their own package, `@fluidframework/id-compressor`. -Exports from original packages have been marked as deprecated. - -Additionally, marks the `IdCompressor` class as deprecated. -Consumers should use the interfaces, `IIdCompressor` and `IIdCompressorCore`, in conjunction with the factory function `createIdCompressor` instead. diff --git a/.changeset/smol-kittens-blep.md b/.changeset/smol-kittens-blep.md deleted file mode 100644 index 220ad3bfb209..000000000000 --- a/.changeset/smol-kittens-blep.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@fluidframework/telemetry-utils": minor ---- - -Deprecate logIfFalse - -This functionality was not intended for export and will be removed in a future release. -No replacement API is offered, as the logic is trivial to reproduce as needed. diff --git a/.changeset/soft-taxis-thank.md b/.changeset/soft-taxis-thank.md deleted file mode 100644 index 46b2f2449284..000000000000 --- a/.changeset/soft-taxis-thank.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -"@fluidframework/sequence": minor -"@fluid-experimental/sequence-deprecated": minor ---- - -Deprecate API `previousInterval` and `nextInterval` from `IntervalCollection`, these functionalities are moved to the `EndpointIndex`. Users are advised to independently attach the index to the collection and utilize the API accordingly, for instance: - -```typescript -const endpointIndex = createEndpointIndex(sharedString); -collection.attachIndex(endpointIndex); - -const result1 = endpointIndex.previousInterval(pos); -const result2 = endpointIndex.nextInterval(pos); -``` diff --git a/.changeset/spicy-laws-pick.md b/.changeset/spicy-laws-pick.md deleted file mode 100644 index 57429c2ebfa5..000000000000 --- a/.changeset/spicy-laws-pick.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@fluidframework/merge-tree": minor -"@fluidframework/sequence": minor ---- - -Deprecate ICombiningOp, PropertiesRollback.Rewrite, and SharedString.annotateMarkerNotifyConsensus - -This change deprecates usage of ICombiningOp in various APIs, including SharedSegmentSequence.annotateRange and SharedString.annotateMarker. It also deprecates SharedString.annotateMarkerNotifyConsensus which is related to combining ops. This functionality had no test coverage and was largely unused. diff --git a/.changeset/swift-geese-tap.md b/.changeset/swift-geese-tap.md deleted file mode 100644 index 73cce2a9fd5c..000000000000 --- a/.changeset/swift-geese-tap.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@fluidframework/aqueduct": minor ---- - -Deprecated `IRootDataObjectFactory` - -The `IRootDataObjectFactory` interface has been deprecated and will be removed in a future major release. Please remove all usage of it. diff --git a/.changeset/wet-bees-scream.md b/.changeset/wet-bees-scream.md deleted file mode 100644 index 73f9454bcad6..000000000000 --- a/.changeset/wet-bees-scream.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -"@fluidframework/azure-client": minor -"@fluid-experimental/devtools": minor -"fluid-framework": minor -"@fluidframework/fluid-static": minor -"@fluidframework/mocha-test-setup": minor -"@fluidframework/tinylicious-client": minor ---- - -Deprecate FluidStatic Classes - -This change deprecates a number of unnecessarily exposed FluidStatic classes, and replaces them with creation functions. This helps us keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the public surface area of downstream packages. The deprecated classes are as follows: - -- AzureAudience -- TinyliciousAudience -- DOProviderContainerRuntimeFactory -- FluidContainer -- ServiceAudience diff --git a/RELEASE_NOTES/2.0.0-internal.7.4.0.md b/RELEASE_NOTES/2.0.0-internal.7.4.0.md new file mode 100644 index 000000000000..59472c6f34fe --- /dev/null +++ b/RELEASE_NOTES/2.0.0-internal.7.4.0.md @@ -0,0 +1,75 @@ + + +# Upcoming changes in Fluid Framework v2.0.0-internal.7.4.0 + +## container-runtime: (GC) Tombstoned objects will fail to load by default + +Previously, Tombstoned objects would only trigger informational logs by default, with an option via config to also cause errors to be thrown on load. Now, failure to load is the default with an option to disable it if necessary. This reflects the purpose of the Tombstone stage which is to mimic the user experience of objects being deleted. + +## container-runtime/runtime-definitions: `IdCompressor` and related types deprecated + +`IdCompressor` and related types from the @fluidframework/container-runtime and @fluidframework/runtime-definitions packages have been deprecated. They can now be found in a new package, @fluidframework/id-compressor. + +The `IdCompressor` class is deprecated even in the new package. Consumers should use the interfaces, `IIdCompressor` and `IIdCompressorCore`, in conjunction with the factory function `createIdCompressor` instead. + +## telemetry-utils: Deprecate ConfigTypes and IConfigProviderBase + +The types `ConfigTypes` and `IConfigProviderBase` have been deprecated in the @fluidframework/telemetry-utils package. The types can now be found in the @fluidframework/core-interfaces package. Please replace any uses with the types from @fluidframework/core-interfaces. + +## telemetry-utils: Deprecated logIfFalse + +This functionality was not intended for export and will be removed in a future release. No replacement API is offered because the logic is trivial to reproduce as needed. + +## sequence: Deprecated findOverlappingIntervals API + +The `findOverlappingIntervals` API from `IntervalCollection` has been deprecated. This functionality is moved to the `OverlappingIntervalsIndex`. Users should independently attach the index to the collection and utilize the API accordingly, for instance: + +```typescript +const overlappingIntervalsIndex = createOverlappingIntervalsIndex(sharedString); +collection.attachIndex(overlappingIntervalsIndex); +const result = overlappingIntervalsIndex.findOverlappingIntervals(start, end); +``` + +## sequence: Deprecated previousInterval and nextInterval APIs + +The `previousInterval` and `nextInterval` APIs from `IntervalCollection` have been deprecated. These functions are moved to the `EndpointIndex`. Users should independently attach the index to the collection and utilize the API accordingly, for instance: + +```typescript +const endpointIndex = createEndpointIndex(sharedString); +collection.attachIndex(endpointIndex); + +const result1 = endpointIndex.previousInterval(pos); +const result2 = endpointIndex.nextInterval(pos); +``` + +## sequence: Deprecated ICombiningOp, PropertiesRollback.Rewrite, and SharedString.annotateMarkerNotifyConsensus + +The `ICombiningOp` and its usage in various APIs has been deprecated. APIs affected include `SharedSegmentSequence.annotateRange` and `SharedString.annotateMarker`. `SharedString.annotateMarkerNotifyConsensus` has also been deprecated, because it is related to combining ops. This functionality had no test coverage and was largely unused. + +## sequence: `change` and `changeProperties` are now a single method + +Instead of having two separate methods to change the endpoints of an interval and the properties, they have been combined into a single method that will change the endpoints, properties, or both, depending on the arguments passed in. The signature of this combined method is now updated as well. + +The new way to use the change method is to call it with an interval id as the first parameter and an object containing the desired portions of the interval to update as the second parameter. For the object parameter, the `endpoints` field should be an object containing the new `start` and `end` values for the interval, and the `properties` field should be an object containing the new properties for the interval. Either the `endpoints` field or the `properties` field can be omitted, and if neither are present, `change` will return `undefined`. + +The new usage of the change method is as follows: + +Change interval endpoints: `change(id, { endpoints: { start: 1, end: 4 } });` + +Change interval properties: `change(id { props: { a: 1 } });` + +Change interval endpoints and properties: `change(id, { endpoints: { start: 1, end: 4 }, props: { a: 1 } });` + +## aqueduct: Deprecated IRootDataObjectFactory + +The `IRootDataObjectFactory` interface has been deprecated and will be removed in a future major release. Please remove all usage of it. + +## azure-client: Deprecated FluidStatic Classes + +Several FluidStatic classes were unnecessarily exposed. They have been replaced with creation functions. This helps us keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the public surface area of downstream packages. The deprecated classes are as follows: + +- `AzureAudience` (use `IAzureAudience` instead) +- `TinyliciousAudience` (use `ITinyliciousAudience` instead) +- `DOProviderContainerRuntimeFactory` +- `FluidContainer` +- `ServiceAudience` diff --git a/azure/packages/azure-client/CHANGELOG.md b/azure/packages/azure-client/CHANGELOG.md index b65b9dbbad12..1698b2b20780 100644 --- a/azure/packages/azure-client/CHANGELOG.md +++ b/azure/packages/azure-client/CHANGELOG.md @@ -1,5 +1,21 @@ # @fluidframework/azure-client +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- azure-client: Deprecated FluidStatic Classes ([#18402](https://github.com/microsoft/FluidFramework/issues/18402)) [589ec39de5](https://github.com/microsoft/FluidFramework/commits/589ec39de52116c7f782319e6f6aa61bc5aa9964) + + Several FluidStatic classes were unnecessarily exposed. They have been replaced with creation functions. This helps us + keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the + public surface area of downstream packages. The deprecated classes are as follows: + + - `AzureAudience` (use `IAzureAudience` instead) + - `TinyliciousAudience` (use `ITinyliciousAudience` instead) + - `DOProviderContainerRuntimeFactory` + - `FluidContainer` + - `ServiceAudience` + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/azure/packages/azure-local-service/CHANGELOG.md b/azure/packages/azure-local-service/CHANGELOG.md index e4ac26ead7bb..f58ed5fe39b9 100644 --- a/azure/packages/azure-local-service/CHANGELOG.md +++ b/azure/packages/azure-local-service/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/azure-local-service +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/azure/packages/azure-service-utils/CHANGELOG.md b/azure/packages/azure-service-utils/CHANGELOG.md index 44f1da54752a..7a195d655d39 100644 --- a/azure/packages/azure-service-utils/CHANGELOG.md +++ b/azure/packages/azure-service-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/azure-service-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/azure/packages/external-controller/CHANGELOG.md b/azure/packages/external-controller/CHANGELOG.md index 0048579b2ff6..67839c41e459 100644 --- a/azure/packages/external-controller/CHANGELOG.md +++ b/azure/packages/external-controller/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/app-integration-external-controller +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/azure/packages/test/end-to-end-tests/CHANGELOG.md b/azure/packages/test/end-to-end-tests/CHANGELOG.md index 67af573f92fb..cda051f118eb 100644 --- a/azure/packages/test/end-to-end-tests/CHANGELOG.md +++ b/azure/packages/test/end-to-end-tests/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/azure-end-to-end-tests +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/azure/packages/test/scenario-runner/CHANGELOG.md b/azure/packages/test/scenario-runner/CHANGELOG.md index 280f84671c2d..70db05092881 100644 --- a/azure/packages/test/scenario-runner/CHANGELOG.md +++ b/azure/packages/test/scenario-runner/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/azure-scenario-runner +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/common/build/build-common/tsc-multi.esm.json b/common/build/build-common/tsc-multi.esm.json index 7d8225939da4..e579055bf89e 100644 --- a/common/build/build-common/tsc-multi.esm.json +++ b/common/build/build-common/tsc-multi.esm.json @@ -1,6 +1,12 @@ { "targets": [ - { "extname": ".mjs", "module": "ESNext", "moduleResolution": "node10", "outDir": "./lib" } + { + "extname": ".mjs", + "rewriteDtsImports": true, + "module": "ESNext", + "moduleResolution": "Node16", + "outDir": "./lib" + } ], "projects": ["tsconfig.json"] } diff --git a/common/build/build-common/tsconfig.esm.json b/common/build/build-common/tsconfig.esm.json index 4a63ac46b2a5..be89aa6efce7 100644 --- a/common/build/build-common/tsconfig.esm.json +++ b/common/build/build-common/tsconfig.esm.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "module": "ESNext", - "moduleResolution": "Node10", + "module": "Node16", + "moduleResolution": "Node16", }, } diff --git a/common/lib/protocol-definitions/CHANGELOG.md b/common/lib/protocol-definitions/CHANGELOG.md index 1d114138177e..aec40cb3c841 100644 --- a/common/lib/protocol-definitions/CHANGELOG.md +++ b/common/lib/protocol-definitions/CHANGELOG.md @@ -2,7 +2,15 @@ ## [3.1.0](https://github.com/microsoft/FluidFramework/releases/tag/protocol-definitions_v3.1.0) -`ISequencedDocumentMessage` properties `compression` and `expHash1` are deprecated. They have been extracted into a separate interface `ISequencedDocumentMessageExperimental` and should be used from there instead. +### Deprecated properties on ISequencedDocumentMessage + +`ISequencedDocumentMessage` properties `compression` and `expHash1` are deprecated. They have been extracted into a +separate interface `ISequencedDocumentMessageExperimental` and should be used from there instead. + +### Package now works properly with TypeScript's node16 moduleResolution + +The package now has an "exports" field in its package.json so node16 moduleResolution will work +for both CJS and ESM. ## [3.0.0](https://github.com/microsoft/FluidFramework/releases/tag/protocol-definitions_v3.0.0) diff --git a/common/lib/protocol-definitions/package.json b/common/lib/protocol-definitions/package.json index 35d0bd891ae2..4349966473f2 100644 --- a/common/lib/protocol-definitions/package.json +++ b/common/lib/protocol-definitions/package.json @@ -11,14 +11,30 @@ "license": "MIT", "author": "Microsoft and contributors", "sideEffects": false, - "main": "dist/index.js", - "module": "lib/index.js", + "exports": { + ".": { + "import": { + "types": "./lib/index.d.mts", + "default": "./lib/index.mjs" + }, + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.cjs" + } + } + }, + "main": "dist/index.cjs", + "module": "lib/index.mjs", "types": "dist/index.d.ts", "scripts": { + "api-extractor:commonjs": "api-extractor run --local", + "api-extractor:esnext": "copyfiles -u 1 \"dist/**/*-@(alpha|beta|public|untrimmed).d.ts\" lib", "build": "npm run build:compile && concurrently npm:lint npm:build:docs", "build:compile": "concurrently npm:typetests:gen npm:tsc npm:build:esnext", - "build:docs": "api-extractor run --local --typescript-compiler-folder ./node_modules/typescript && copyfiles -u 1 \"./_api-extractor-temp/doc-models/*\" ../../../_api-extractor-temp/", - "build:esnext": "tsc --project ./tsconfig.esnext.json", + "build:docs": "npm run api-extractor:commonjs && npm run api-extractor:esnext", + "build:esnext": "tsc-multi --config ../../build/build-common/tsc-multi.esm.json && npm run build:rename-types", + "build:rename-types": "renamer \"lib/**\" -f .d.ts -r .d.mts --force", + "check:are-the-types-wrong": "attw --pack . --entrypoints .", "check:release-tags": "api-extractor run --local --config ./api-extractor-lint.json", "ci:build": "npm run build:compile", "ci:build:docs": "api-extractor run --typescript-compiler-folder ./node_modules/typescript && copyfiles -u 1 \"./_api-extractor-temp/doc-models/*\" ../../../_api-extractor-temp/", @@ -28,48 +44,38 @@ "eslint": "eslint --format stylish src", "eslint:fix": "eslint --format stylish src --fix --fix-type problem,suggestion,layout", "format": "npm run prettier:fix", - "lint": "npm run prettier && npm run check:release-tags && npm run eslint", + "lint": "npm run prettier && npm run check:release-tags && npm run eslint && npm run check:are-the-types-wrong", "lint:fix": "npm run prettier:fix && npm run eslint:fix", "prettier": "prettier --check . --cache --ignore-path ../../../.prettierignore", "prettier:fix": "prettier --write . --cache --ignore-path ../../../.prettierignore", - "tsc": "tsc", - "tsc:watch": "tsc --watch", + "tsc": "tsc-multi --config ../../build/build-common/tsc-multi.cjs.json", "typetests:gen": "fluid-type-test-generator", "typetests:prepare": "flub typetests --dir . --reset --previous --normalize" }, "dependencies": {}, "devDependencies": { + "@arethetypeswrong/cli": "^0.13.3", "@fluid-tools/build-cli": "^0.26.1", "@fluidframework/build-common": "^2.0.3", "@fluidframework/build-tools": "^0.26.1", - "@fluidframework/eslint-config-fluid": "^2.0.0", + "@fluidframework/eslint-config-fluid": "^3.1.0", "@fluidframework/protocol-definitions-previous": "npm:@fluidframework/protocol-definitions@2.0.0", "@microsoft/api-extractor": "^7.38.3", "concurrently": "^6.2.0", "copyfiles": "^2.4.1", - "eslint": "~8.6.0", + "eslint": "~8.55.0", "eslint-config-prettier": "~9.0.0", "prettier": "~3.0.3", + "renamer": "^4.0.0", "rimraf": "^2.6.2", - "typescript": "~4.5.5", - "typescript-formatter": "7.1.0" + "tsc-multi": "^1.1.0", + "typescript": "~5.1.6" }, "packageManager": "pnpm@7.32.3+sha512.c28d73f0d82a6c4712a40b91aa43d7397e119b16f35e5e75fe9b7e8fd4f2fc6dfbb68bb3ffac3473a958bbafa7888b79ec384ad122537378089a3a2a19b9900e", - "fluidBuild": { - "branchReleaseTypes": { - "main": "minor", - "release/**": "patch" - }, - "tasks": { - "tsc": [ - "...", - "typetests:gen" - ] - } - }, "pnpm": { "patchedDependencies": { - "@microsoft/api-extractor@7.38.3": "../../../patches/@microsoft__api-extractor@7.38.3.patch" + "@microsoft/api-extractor@7.38.3": "../../../patches/@microsoft__api-extractor@7.38.3.patch", + "tsc-multi@1.1.0": "../../../patches/tsc-multi@1.1.0.patch" }, "peerDependencyComments": [ "@types/node is a peer dependency because of build tools. The package is not needed because it's only used for compilation. It's not needed at runtime." diff --git a/common/lib/protocol-definitions/pnpm-lock.yaml b/common/lib/protocol-definitions/pnpm-lock.yaml index 9357c5d5da2b..814dd1398580 100644 --- a/common/lib/protocol-definitions/pnpm-lock.yaml +++ b/common/lib/protocol-definitions/pnpm-lock.yaml @@ -4,43 +4,84 @@ patchedDependencies: '@microsoft/api-extractor@7.38.3': hash: veevzrg6trzjzkr6gaha4thdmm path: ../../../patches/@microsoft__api-extractor@7.38.3.patch + tsc-multi@1.1.0: + hash: 44oayjl3iesbankmh6w6z32iii + path: ../../../patches/tsc-multi@1.1.0.patch importers: .: specifiers: + '@arethetypeswrong/cli': ^0.13.3 '@fluid-tools/build-cli': ^0.26.1 '@fluidframework/build-common': ^2.0.3 '@fluidframework/build-tools': ^0.26.1 - '@fluidframework/eslint-config-fluid': ^2.0.0 + '@fluidframework/eslint-config-fluid': ^3.1.0 '@fluidframework/protocol-definitions-previous': npm:@fluidframework/protocol-definitions@2.0.0 '@microsoft/api-extractor': ^7.38.3 concurrently: ^6.2.0 copyfiles: ^2.4.1 - eslint: ~8.6.0 + eslint: ~8.55.0 eslint-config-prettier: ~9.0.0 prettier: ~3.0.3 + renamer: ^4.0.0 rimraf: ^2.6.2 - typescript: ~4.5.5 - typescript-formatter: 7.1.0 + tsc-multi: ^1.1.0 + typescript: ~5.1.6 devDependencies: - '@fluid-tools/build-cli': 0.26.1_kufnqfq7tb5rpdawkdb6g5smma + '@arethetypeswrong/cli': 0.13.3 + '@fluid-tools/build-cli': 0.26.1_bpztyfltmpuv6lhsgzfwtmxhte '@fluidframework/build-common': 2.0.3 '@fluidframework/build-tools': 0.26.1 - '@fluidframework/eslint-config-fluid': 2.0.0_kufnqfq7tb5rpdawkdb6g5smma + '@fluidframework/eslint-config-fluid': 3.1.0_bpztyfltmpuv6lhsgzfwtmxhte '@fluidframework/protocol-definitions-previous': /@fluidframework/protocol-definitions/2.0.0 '@microsoft/api-extractor': 7.38.3_veevzrg6trzjzkr6gaha4thdmm concurrently: 6.5.1 copyfiles: 2.4.1 - eslint: 8.6.0 - eslint-config-prettier: 9.0.0_eslint@8.6.0 + eslint: 8.55.0 + eslint-config-prettier: 9.0.0_eslint@8.55.0 prettier: 3.0.3 + renamer: 4.0.0 rimraf: 2.7.1 - typescript: 4.5.5 - typescript-formatter: 7.1.0_typescript@4.5.5 + tsc-multi: 1.1.0_44oayjl3iesbankmh6w6z32iii_typescript@5.1.6 + typescript: 5.1.6 packages: + /@aashutoshrathi/word-wrap/1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@andrewbranch/untar.js/1.0.3: + resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} + dev: true + + /@arethetypeswrong/cli/0.13.3: + resolution: {integrity: sha512-lA29j9fkRGq+hNE3zQGxD/d8WmjhimSaPU2887CBe0Yv3C1UbIWvy51mYerp3/NoevjBLKSWhHmP5oY/eavtjQ==} + engines: {node: '>=18'} + hasBin: true + dependencies: + '@arethetypeswrong/core': 0.13.3 + chalk: 4.1.2 + cli-table3: 0.6.3 + commander: 10.0.1 + marked: 9.1.6 + marked-terminal: 6.2.0_marked@9.1.6 + semver: 7.5.4 + dev: true + + /@arethetypeswrong/core/0.13.3: + resolution: {integrity: sha512-oxa26D3z5DEv9LGzfJWV/6PhQd170dFfDOXl9J3cGRNLo2B68zj6/YOD1RJaYF/kmxechdXT1XyGUPOtkXv8Lg==} + engines: {node: '>=18'} + dependencies: + '@andrewbranch/untar.js': 1.0.3 + fflate: 0.7.4 + semver: 7.5.4 + typescript: 5.3.2 + validate-npm-package-name: 5.0.0 + dev: true + /@babel/code-frame/7.21.4: resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} @@ -53,6 +94,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-identifier/7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/highlight/7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} @@ -91,33 +137,28 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@es-joy/jsdoccomment/0.33.4: - resolution: {integrity: sha512-02XyYuvR/Gn+3BT6idHVNQ4SSQlA1X1FeEfeKm2ypv8ANB6Lt9KRFZ2S7y5xjwR+EPQ/Rzb0XFaD+xKyqe4ALw==} - engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} + /@es-joy/jsdoccomment/0.40.1: + resolution: {integrity: sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==} + engines: {node: '>=16'} dependencies: - comment-parser: 1.3.1 + comment-parser: 1.4.0 esquery: 1.5.0 - jsdoc-type-pratt-parser: 3.1.0 + jsdoc-type-pratt-parser: 4.0.0 dev: true - /@eslint-community/eslint-utils/4.4.0_eslint@8.40.0: + /@eslint-community/eslint-utils/4.4.0_eslint@8.55.0: resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.40.0 - eslint-visitor-keys: 3.4.1 + eslint: 8.55.0 + eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/eslint-utils/4.4.0_eslint@8.6.0: - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.6.0 - eslint-visitor-keys: 3.4.1 + /@eslint-community/regexpp/4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true /@eslint-community/regexpp/4.5.1: @@ -125,30 +166,13 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc/1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.5.2 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/eslintrc/2.0.3: - resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} + /@eslint/eslintrc/2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.5.2 + espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -159,27 +183,27 @@ packages: - supports-color dev: true - /@eslint/js/8.40.0: - resolution: {integrity: sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==} + /@eslint/js/8.55.0: + resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@fluid-tools/build-cli/0.26.1_kufnqfq7tb5rpdawkdb6g5smma: + /@fluid-tools/build-cli/0.26.1_bpztyfltmpuv6lhsgzfwtmxhte: resolution: {integrity: sha512-eqvUMIcJVgXdWN1tQrdVhx0FnLhstfcx4VywmmlT+nNt197sq2Lar5M+7C7enN3zlysctt3mJ9WIgcvZfc1Dew==} engines: {node: '>=14.17.0'} hasBin: true dependencies: - '@fluid-tools/version-tools': 0.26.1_typescript@4.5.5 + '@fluid-tools/version-tools': 0.26.1_typescript@5.1.6 '@fluidframework/build-tools': 0.26.1 '@fluidframework/bundle-size-tools': 0.26.1 '@microsoft/api-extractor': 7.38.3_veevzrg6trzjzkr6gaha4thdmm '@oclif/core': 3.5.0 - '@oclif/plugin-autocomplete': 2.3.10_typescript@4.5.5 + '@oclif/plugin-autocomplete': 2.3.10_typescript@5.1.6 '@oclif/plugin-commands': 3.0.3 '@oclif/plugin-help': 6.0.3 '@oclif/plugin-not-found': 3.0.2 - '@oclif/plugin-plugins': 3.9.3_typescript@4.5.5 - '@oclif/test': 2.3.30_typescript@4.5.5 + '@oclif/plugin-plugins': 3.9.3_typescript@5.1.6 + '@oclif/test': 2.3.30_typescript@5.1.6 '@octokit/core': 4.2.4 '@rushstack/node-core-library': 3.61.0 async: 3.2.4 @@ -198,7 +222,7 @@ packages: minimatch: 7.4.6 node-fetch: 2.6.10 npm-check-updates: 16.10.16 - oclif: 4.0.3_kufnqfq7tb5rpdawkdb6g5smma + oclif: 4.0.3_bpztyfltmpuv6lhsgzfwtmxhte prettier: 3.0.3 prompts: 2.4.2 read-pkg-up: 7.0.1 @@ -230,28 +254,6 @@ packages: - webpack-cli dev: true - /@fluid-tools/version-tools/0.26.1_typescript@4.5.5: - resolution: {integrity: sha512-pktW83q4E4PteL+pnCg3CdcXVQqzMO8Vrmp5zWLX5rKbPwKN1puvue5413R7MvkCRnqtmzQuwXepHHmitpMD/Q==} - engines: {node: '>=14.17.0'} - hasBin: true - dependencies: - '@oclif/core': 3.5.0 - '@oclif/plugin-autocomplete': 2.3.10_typescript@4.5.5 - '@oclif/plugin-commands': 3.0.3 - '@oclif/plugin-help': 6.0.3 - '@oclif/plugin-not-found': 3.0.2 - '@oclif/plugin-plugins': 3.9.3_typescript@4.5.5 - chalk: 2.4.2 - semver: 7.5.4 - table: 6.8.1 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - supports-color - - typescript - dev: true - /@fluid-tools/version-tools/0.26.1_typescript@5.1.6: resolution: {integrity: sha512-pktW83q4E4PteL+pnCg3CdcXVQqzMO8Vrmp5zWLX5rKbPwKN1puvue5413R7MvkCRnqtmzQuwXepHHmitpMD/Q==} engines: {node: '>=14.17.0'} @@ -343,27 +345,28 @@ packages: resolution: {integrity: sha512-KaoQ7w2MDH5OeRKVatL5yVOCFg+9wD6bLSLFh1/TV1EZM46l49iBqO7UVjUtPE6BIm0jvvOzJXULGVSpzokX3g==} dev: true - /@fluidframework/eslint-config-fluid/2.0.0_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-/az5CybW5XUZUOk9HMH0nUMtKx5AK+CRfHg35UyygTK+V2OmNRes/yCAbmxoQ1J1Vn2iow3Y/Sgw/oJygciugQ==} - dependencies: - '@rushstack/eslint-patch': 1.1.4 - '@rushstack/eslint-plugin': 0.8.6_kufnqfq7tb5rpdawkdb6g5smma - '@rushstack/eslint-plugin-security': 0.2.6_kufnqfq7tb5rpdawkdb6g5smma - '@typescript-eslint/eslint-plugin': 5.9.1_i37r4pxnuonvhfobrnldva5ppi - '@typescript-eslint/parser': 5.9.1_kufnqfq7tb5rpdawkdb6g5smma - eslint-config-prettier: 8.5.0_eslint@8.6.0 - eslint-plugin-editorconfig: 3.2.0_4x3vxi7gdq53yv6dpzqqqrxppq - eslint-plugin-eslint-comments: 3.2.0_eslint@8.6.0 - eslint-plugin-import: 2.25.4_gyqcce5u2ijhn2hqkipmk56rmu - eslint-plugin-jsdoc: 39.3.25_eslint@8.6.0 - eslint-plugin-promise: 6.0.1_eslint@8.6.0 - eslint-plugin-react: 7.28.0_eslint@8.6.0 + /@fluidframework/eslint-config-fluid/3.1.0_bpztyfltmpuv6lhsgzfwtmxhte: + resolution: {integrity: sha512-njzRv8jHv15ncN8WfVMHBiMVfY5aL6isYbHIgYT0dOPJe8THC03O+6vNTZm6kDQzGnuqklsIMfs4J0u/vj157A==} + dependencies: + '@rushstack/eslint-patch': 1.4.0 + '@rushstack/eslint-plugin': 0.13.1_bpztyfltmpuv6lhsgzfwtmxhte + '@rushstack/eslint-plugin-security': 0.7.1_bpztyfltmpuv6lhsgzfwtmxhte + '@typescript-eslint/eslint-plugin': 6.7.5_gutmsi6rpbyypn46fpwnxcekni + '@typescript-eslint/parser': 6.7.5_bpztyfltmpuv6lhsgzfwtmxhte + eslint-config-prettier: 9.0.0_eslint@8.55.0 + eslint-import-resolver-typescript: 3.6.1_tpu45zodljnzvckpnsmhtdqkmi + eslint-plugin-eslint-comments: 3.2.0_eslint@8.55.0 + eslint-plugin-import: /eslint-plugin-i/2.29.0_j7h7oj6rrhtikhzta4fgkou42e + eslint-plugin-jsdoc: 46.8.2_eslint@8.55.0 + eslint-plugin-promise: 6.1.1_eslint@8.55.0 + eslint-plugin-react: 7.33.2_eslint@8.55.0 + eslint-plugin-react-hooks: 4.6.0_eslint@8.55.0 eslint-plugin-tsdoc: 0.2.17 - eslint-plugin-unicorn: 40.0.0_eslint@8.6.0 - eslint-plugin-unused-imports: 2.0.0_fhnxgfsp6r3qynjxjvskmntitm + eslint-plugin-unicorn: 48.0.1_eslint@8.55.0 + eslint-plugin-unused-imports: 3.0.0_q2lq45qjv2a3kzwivaf2whp57u transitivePeerDependencies: - eslint - - eslint-import-resolver-typescript + - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - typescript @@ -379,22 +382,11 @@ packages: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true - /@humanwhocodes/config-array/0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + /@humanwhocodes/config-array/0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/config-array/0.9.5: - resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -406,8 +398,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema/1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema/2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true /@isaacs/cliui/8.0.2: @@ -795,45 +787,6 @@ packages: - supports-color dev: true - /@oclif/core/2.15.0_typescript@4.5.5: - resolution: {integrity: sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA==} - engines: {node: '>=14.0.0'} - dependencies: - '@types/cli-progress': 3.11.0 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - debug: 4.3.4_supports-color@8.1.1 - ejs: 3.1.9 - get-package-type: 0.1.0 - globby: 11.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - ts-node: 10.9.1_typescript@4.5.5 - tslib: 2.6.2 - widest-line: 3.1.0 - wordwrap: 1.0.0 - wrap-ansi: 7.0.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - typescript - dev: true - /@oclif/core/2.15.0_typescript@5.1.6: resolution: {integrity: sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA==} engines: {node: '>=14.0.0'} @@ -904,21 +857,6 @@ packages: wrap-ansi: 7.0.0 dev: true - /@oclif/plugin-autocomplete/2.3.10_typescript@4.5.5: - resolution: {integrity: sha512-Ow1AR8WtjzlyCtiWWPgzMyT8SbcDJFr47009riLioHa+MHX2BCDtVn2DVnN/E6b9JlPV5ptQpjefoRSNWBesmg==} - engines: {node: '>=12.0.0'} - dependencies: - '@oclif/core': 2.15.0_typescript@4.5.5 - chalk: 4.1.2 - debug: 4.3.4 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - supports-color - - typescript - dev: true - /@oclif/plugin-autocomplete/2.3.10_typescript@5.1.6: resolution: {integrity: sha512-Ow1AR8WtjzlyCtiWWPgzMyT8SbcDJFr47009riLioHa+MHX2BCDtVn2DVnN/E6b9JlPV5ptQpjefoRSNWBesmg==} engines: {node: '>=12.0.0'} @@ -945,11 +883,11 @@ packages: lodash.uniqby: 4.7.0 dev: true - /@oclif/plugin-help/5.2.20_typescript@4.5.5: + /@oclif/plugin-help/5.2.20_typescript@5.1.6: resolution: {integrity: sha512-u+GXX/KAGL9S10LxAwNUaWdzbEBARJ92ogmM7g3gDVud2HioCmvWQCDohNRVZ9GYV9oKwZ/M8xwd6a1d95rEKQ==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.15.0_typescript@4.5.5 + '@oclif/core': 2.15.0_typescript@5.1.6 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -964,11 +902,11 @@ packages: '@oclif/core': 3.5.0 dev: true - /@oclif/plugin-not-found/2.4.3_typescript@4.5.5: + /@oclif/plugin-not-found/2.4.3_typescript@5.1.6: resolution: {integrity: sha512-nIyaR4y692frwh7wIHZ3fb+2L6XEecQwRDIb4zbEam0TvaVmBQWZoColQyWA84ljFBPZ8XWiQyTz+ixSwdRkqg==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.15.0_typescript@4.5.5 + '@oclif/core': 2.15.0_typescript@5.1.6 chalk: 4.1.2 fast-levenshtein: 3.0.0 transitivePeerDependencies: @@ -987,30 +925,6 @@ packages: fast-levenshtein: 3.0.0 dev: true - /@oclif/plugin-plugins/3.9.3_typescript@4.5.5: - resolution: {integrity: sha512-hsm2mTL6uCP79WpltC+G1gkOrn2ckWXUnSi4UmF0eKbddOxJ9vakekuQpj/zlRJkXBNWaXlAskzJmnRoCGT+AQ==} - engines: {node: '>=16'} - dependencies: - '@oclif/core': 2.15.0_typescript@4.5.5 - chalk: 4.1.2 - debug: 4.3.4 - http-call: 5.3.0 - load-json-file: 5.3.0 - npm: 9.8.1 - npm-run-path: 4.0.1 - semver: 7.5.4 - shelljs: 0.8.5 - tslib: 2.6.2 - validate-npm-package-name: 5.0.0 - yarn: 1.22.19 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - supports-color - - typescript - dev: true - /@oclif/plugin-plugins/3.9.3_typescript@5.1.6: resolution: {integrity: sha512-hsm2mTL6uCP79WpltC+G1gkOrn2ckWXUnSi4UmF0eKbddOxJ9vakekuQpj/zlRJkXBNWaXlAskzJmnRoCGT+AQ==} engines: {node: '>=16'} @@ -1048,11 +962,11 @@ packages: - supports-color dev: true - /@oclif/test/2.3.30_typescript@4.5.5: + /@oclif/test/2.3.30_typescript@5.1.6: resolution: {integrity: sha512-zuOv23wiF+H7cRGMjcKx/91qhdcNMcZnr+1TCpbyDeQBIvRs/nGWyuwfrmoF2fXs+HtNZsNFvwbjg7Ue5JfAug==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.15.0_typescript@4.5.5 + '@oclif/core': 2.15.0_typescript@5.1.6 fancy-test: 2.0.30 transitivePeerDependencies: - '@swc/core' @@ -1331,31 +1245,31 @@ packages: config-chain: 1.1.13 dev: true - /@rushstack/eslint-patch/1.1.4: - resolution: {integrity: sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==} + /@rushstack/eslint-patch/1.4.0: + resolution: {integrity: sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg==} dev: true - /@rushstack/eslint-plugin-security/0.2.6_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-gicwYhbc3Q5U43U2qmhePLedfF6+mSEjcQ/D+Bq4zQLP7zo9MGTKAeYPnLTq0M7hqoCEeQUFQZvNav+kjue6Nw==} + /@rushstack/eslint-plugin-security/0.7.1_bpztyfltmpuv6lhsgzfwtmxhte: + resolution: {integrity: sha512-84N42tlONhcbXdlk5Rkb+/pVxPnH+ojX8XwtFoecCRV88/4Ii7eGEyJPb73lOpHaE3NJxLzLVIeixKYQmdjImA==} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@rushstack/tree-pattern': 0.2.3 - '@typescript-eslint/experimental-utils': 5.6.0_kufnqfq7tb5rpdawkdb6g5smma - eslint: 8.6.0 + '@rushstack/tree-pattern': 0.3.1 + '@typescript-eslint/experimental-utils': 5.59.11_bpztyfltmpuv6lhsgzfwtmxhte + eslint: 8.55.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@rushstack/eslint-plugin/0.8.6_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-R0gbPI3nz1vRUZddOiwpGtBSQ6FXrnsUpKvKoVkADWhkYmtdi6cU/gpQ6amOa5LhLPhSdQNtkhCB+yhUINKgEg==} + /@rushstack/eslint-plugin/0.13.1_bpztyfltmpuv6lhsgzfwtmxhte: + resolution: {integrity: sha512-qQ6iPCm8SFuY+bpcSv5hlYtdwDHcFlE6wlpUHa0ywG9tGVBYM5But8S4qVRFq1iejAuFX+ubNUOyFJHvxpox+A==} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@rushstack/tree-pattern': 0.2.3 - '@typescript-eslint/experimental-utils': 5.6.0_kufnqfq7tb5rpdawkdb6g5smma - eslint: 8.6.0 + '@rushstack/tree-pattern': 0.3.1 + '@typescript-eslint/experimental-utils': 5.59.11_bpztyfltmpuv6lhsgzfwtmxhte + eslint: 8.55.0 transitivePeerDependencies: - supports-color - typescript @@ -1373,7 +1287,7 @@ packages: fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.2 + resolve: 1.22.8 semver: 7.5.4 z-schema: 5.0.5 dev: true @@ -1385,8 +1299,8 @@ packages: strip-json-comments: 3.1.1 dev: true - /@rushstack/tree-pattern/0.2.3: - resolution: {integrity: sha512-8KWZxzn6XKuy3iKRSAd2CHXSXneRlGCmH9h/qM7jYQDekp+U18oUzub5xqOqHS2PLUC+torOMYZxgAIO/fF86A==} + /@rushstack/tree-pattern/0.3.1: + resolution: {integrity: sha512-2yn4qTkXZTByQffL3ymS6viYuyZk3YnJT49bopGBlm9Thtyfa7iuFUV6tt+09YIRO1sjmSWILf4dPj6+Dr5YVA==} dev: true /@rushstack/ts-command-line/4.17.1: @@ -1547,10 +1461,6 @@ packages: resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} dev: true - /@types/json5/0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: @@ -1604,139 +1514,83 @@ packages: '@types/node': 15.14.9 dev: true - /@typescript-eslint/eslint-plugin/5.55.0_i37r4pxnuonvhfobrnldva5ppi: - resolution: {integrity: sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin/6.7.5_gutmsi6rpbyypn46fpwnxcekni: + resolution: {integrity: sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.9.1_kufnqfq7tb5rpdawkdb6g5smma - '@typescript-eslint/scope-manager': 5.55.0 - '@typescript-eslint/type-utils': 5.55.0_kufnqfq7tb5rpdawkdb6g5smma - '@typescript-eslint/utils': 5.55.0_kufnqfq7tb5rpdawkdb6g5smma - debug: 4.3.4 - eslint: 8.6.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.5.4 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/eslint-plugin/5.9.1_i37r4pxnuonvhfobrnldva5ppi: - resolution: {integrity: sha512-Xv9tkFlyD4MQGpJgTo6wqDqGvHIRmRgah/2Sjz1PUnJTawjHWIwBivUE9x0QtU2WVii9baYgavo/bHjrZJkqTw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/experimental-utils': 5.9.1_kufnqfq7tb5rpdawkdb6g5smma - '@typescript-eslint/parser': 5.9.1_kufnqfq7tb5rpdawkdb6g5smma - '@typescript-eslint/scope-manager': 5.9.1 - '@typescript-eslint/type-utils': 5.9.1_kufnqfq7tb5rpdawkdb6g5smma + '@typescript-eslint/parser': 6.7.5_bpztyfltmpuv6lhsgzfwtmxhte + '@typescript-eslint/scope-manager': 6.7.5 + '@typescript-eslint/type-utils': 6.7.5_bpztyfltmpuv6lhsgzfwtmxhte + '@typescript-eslint/utils': 6.7.5_bpztyfltmpuv6lhsgzfwtmxhte + '@typescript-eslint/visitor-keys': 6.7.5 debug: 4.3.4 - eslint: 8.6.0 - functional-red-black-tree: 1.0.1 + eslint: 8.55.0 + graphemer: 1.4.0 ignore: 5.2.4 - regexpp: 3.2.0 + natural-compare: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/experimental-utils/5.6.0_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - dependencies: - '@types/json-schema': 7.0.14 - '@typescript-eslint/scope-manager': 5.6.0 - '@typescript-eslint/types': 5.6.0 - '@typescript-eslint/typescript-estree': 5.6.0_typescript@4.5.5 - eslint: 8.6.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.6.0 + ts-api-utils: 1.0.3_typescript@5.1.6 + typescript: 5.1.6 transitivePeerDependencies: - supports-color - - typescript dev: true - /@typescript-eslint/experimental-utils/5.9.1_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-cb1Njyss0mLL9kLXgS/eEY53SZQ9sT519wpX3i+U457l2UXRDuo87hgKfgRazmu9/tQb0x2sr3Y0yrU+Zz0y+w==} + /@typescript-eslint/experimental-utils/5.59.11_bpztyfltmpuv6lhsgzfwtmxhte: + resolution: {integrity: sha512-GkQGV0UF/V5Ra7gZMBmiD1WrYUFOJNvCZs+XQnUyJoxmqfWMXVNyB2NVCPRKefoQcpvTv9UpJyfCvsJFs8NzzQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/json-schema': 7.0.14 - '@typescript-eslint/scope-manager': 5.9.1 - '@typescript-eslint/types': 5.9.1 - '@typescript-eslint/typescript-estree': 5.9.1_typescript@4.5.5 - eslint: 8.6.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.6.0 + '@typescript-eslint/utils': 5.59.11_bpztyfltmpuv6lhsgzfwtmxhte + eslint: 8.55.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser/5.9.1_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-PLYO0AmwD6s6n0ZQB5kqPgfvh73p0+VqopQQLuNfi7Lm0EpfKyDalchpVwkE+81k5HeiRrTV/9w1aNHzjD7C4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser/6.7.5_bpztyfltmpuv6lhsgzfwtmxhte: + resolution: {integrity: sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.9.1 - '@typescript-eslint/types': 5.9.1 - '@typescript-eslint/typescript-estree': 5.9.1_typescript@4.5.5 + '@typescript-eslint/scope-manager': 6.7.5 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/typescript-estree': 6.7.5_typescript@5.1.6 + '@typescript-eslint/visitor-keys': 6.7.5 debug: 4.3.4 - eslint: 8.6.0 - typescript: 4.5.5 + eslint: 8.55.0 + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.55.0: - resolution: {integrity: sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==} + /@typescript-eslint/scope-manager/5.59.11: + resolution: {integrity: sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.55.0 - '@typescript-eslint/visitor-keys': 5.55.0 + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/visitor-keys': 5.59.11 dev: true - /@typescript-eslint/scope-manager/5.6.0: - resolution: {integrity: sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.6.0 - '@typescript-eslint/visitor-keys': 5.6.0 - dev: true - - /@typescript-eslint/scope-manager/5.9.1: - resolution: {integrity: sha512-8BwvWkho3B/UOtzRyW07ffJXPaLSUKFBjpq8aqsRvu6HdEuzCY57+ffT7QoV4QXJXWSU1+7g3wE4AlgImmQ9pQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/scope-manager/6.7.5: + resolution: {integrity: sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.9.1 - '@typescript-eslint/visitor-keys': 5.9.1 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/visitor-keys': 6.7.5 dev: true /@typescript-eslint/scope-manager/6.8.0: @@ -1747,58 +1601,34 @@ packages: '@typescript-eslint/visitor-keys': 6.8.0 dev: true - /@typescript-eslint/type-utils/5.55.0_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.55.0_typescript@4.5.5 - '@typescript-eslint/utils': 5.55.0_kufnqfq7tb5rpdawkdb6g5smma - debug: 4.3.4 - eslint: 8.6.0 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/type-utils/5.9.1_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-tRSpdBnPRssjlUh35rE9ug5HrUvaB9ntREy7gPXXKwmIx61TNN7+l5YKgi1hMKxo5NvqZCfYhA5FvyuJG6X6vg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils/6.7.5_bpztyfltmpuv6lhsgzfwtmxhte: + resolution: {integrity: sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 5.9.1_kufnqfq7tb5rpdawkdb6g5smma + '@typescript-eslint/typescript-estree': 6.7.5_typescript@5.1.6 + '@typescript-eslint/utils': 6.7.5_bpztyfltmpuv6lhsgzfwtmxhte debug: 4.3.4 - eslint: 8.6.0 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 + eslint: 8.55.0 + ts-api-utils: 1.0.3_typescript@5.1.6 + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.55.0: - resolution: {integrity: sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/types/5.6.0: - resolution: {integrity: sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==} + /@typescript-eslint/types/5.59.11: + resolution: {integrity: sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types/5.9.1: - resolution: {integrity: sha512-SsWegWudWpkZCwwYcKoDwuAjoZXnM1y2EbEerTHho19Hmm+bQ56QG4L4jrtCu0bI5STaRTvRTZmjprWlTw/5NQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/types/6.7.5: + resolution: {integrity: sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==} + engines: {node: ^16.0.0 || >=18.0.0} dev: true /@typescript-eslint/types/6.8.0: @@ -1806,29 +1636,8 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree/5.55.0_typescript@4.5.5: - resolution: {integrity: sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.55.0 - '@typescript-eslint/visitor-keys': 5.55.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree/5.6.0_typescript@4.5.5: - resolution: {integrity: sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==} + /@typescript-eslint/typescript-estree/5.59.11_typescript@5.1.6: + resolution: {integrity: sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -1836,40 +1645,40 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.6.0 - '@typescript-eslint/visitor-keys': 5.6.0 + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/visitor-keys': 5.59.11 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 + tsutils: 3.21.0_typescript@5.1.6 + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.9.1_typescript@4.5.5: - resolution: {integrity: sha512-gL1sP6A/KG0HwrahVXI9fZyeVTxEYV//6PmcOn1tD0rw8VhUWYeZeuWHwwhnewnvEMcHjhnJLOBhA9rK4vmb8A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/typescript-estree/6.7.5_typescript@5.1.6: + resolution: {integrity: sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.9.1 - '@typescript-eslint/visitor-keys': 5.9.1 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/visitor-keys': 6.7.5 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 + ts-api-utils: 1.0.3_typescript@5.1.6 + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree/6.8.0_typescript@4.5.5: + /@typescript-eslint/typescript-estree/6.8.0_typescript@5.1.6: resolution: {integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1884,25 +1693,25 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.3_typescript@4.5.5 - typescript: 4.5.5 + ts-api-utils: 1.0.3_typescript@5.1.6 + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.55.0_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==} + /@typescript-eslint/utils/5.59.11_bpztyfltmpuv6lhsgzfwtmxhte: + resolution: {integrity: sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@8.6.0 + '@eslint-community/eslint-utils': 4.4.0_eslint@8.55.0 '@types/json-schema': 7.0.14 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.55.0 - '@typescript-eslint/types': 5.55.0 - '@typescript-eslint/typescript-estree': 5.55.0_typescript@4.5.5 - eslint: 8.6.0 + '@typescript-eslint/scope-manager': 5.59.11 + '@typescript-eslint/types': 5.59.11 + '@typescript-eslint/typescript-estree': 5.59.11_typescript@5.1.6 + eslint: 8.55.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -1910,46 +1719,57 @@ packages: - typescript dev: true - /@typescript-eslint/utils/6.8.0_kufnqfq7tb5rpdawkdb6g5smma: - resolution: {integrity: sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==} + /@typescript-eslint/utils/6.7.5_bpztyfltmpuv6lhsgzfwtmxhte: + resolution: {integrity: sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@8.6.0 + '@eslint-community/eslint-utils': 4.4.0_eslint@8.55.0 '@types/json-schema': 7.0.14 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.8.0 - '@typescript-eslint/types': 6.8.0 - '@typescript-eslint/typescript-estree': 6.8.0_typescript@4.5.5 - eslint: 8.6.0 + '@typescript-eslint/scope-manager': 6.7.5 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/typescript-estree': 6.7.5_typescript@5.1.6 + eslint: 8.55.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.55.0: - resolution: {integrity: sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils/6.8.0_bpztyfltmpuv6lhsgzfwtmxhte: + resolution: {integrity: sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/types': 5.55.0 - eslint-visitor-keys: 3.4.1 + '@eslint-community/eslint-utils': 4.4.0_eslint@8.55.0 + '@types/json-schema': 7.0.14 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 6.8.0 + '@typescript-eslint/types': 6.8.0 + '@typescript-eslint/typescript-estree': 6.8.0_typescript@5.1.6 + eslint: 8.55.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript dev: true - /@typescript-eslint/visitor-keys/5.6.0: - resolution: {integrity: sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==} + /@typescript-eslint/visitor-keys/5.59.11: + resolution: {integrity: sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.6.0 + '@typescript-eslint/types': 5.59.11 eslint-visitor-keys: 3.4.1 dev: true - /@typescript-eslint/visitor-keys/5.9.1: - resolution: {integrity: sha512-Xh37pNz9e9ryW4TVdwiFzmr4hloty8cFj8GTWMXh3Z8swGwyQWeCcNgF0hm6t09iZd6eiZmIf4zHedQVP6TVtg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/visitor-keys/6.7.5: + resolution: {integrity: sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.9.1 + '@typescript-eslint/types': 6.7.5 eslint-visitor-keys: 3.4.1 dev: true @@ -1961,6 +1781,10 @@ packages: eslint-visitor-keys: 3.4.1 dev: true + /@ungap/structured-clone/1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + /@webassemblyjs/ast/1.11.5: resolution: {integrity: sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==} dependencies: @@ -2094,12 +1918,12 @@ packages: acorn: 8.8.2 dev: true - /acorn-jsx/5.3.2_acorn@8.8.2: + /acorn-jsx/5.3.2_acorn@8.11.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.11.2 dev: true /acorn-walk/8.2.0: @@ -2107,6 +1931,12 @@ packages: engines: {node: '>=0.4.0'} dev: true + /acorn/8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /acorn/8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} @@ -2185,11 +2015,6 @@ packages: string-width: 4.2.3 dev: true - /ansi-colors/4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - /ansi-escapes/3.2.0: resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} engines: {node: '>=4'} @@ -2202,6 +2027,13 @@ packages: type-fest: 0.21.3 dev: true + /ansi-escapes/6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 + dev: true + /ansi-regex/2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} @@ -2244,6 +2076,11 @@ packages: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: true + /are-docs-informative/0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + dev: true + /are-we-there-yet/2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} @@ -2293,6 +2130,21 @@ packages: typical: 2.6.1 dev: true + /array-back/3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + dev: true + + /array-back/4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + dev: true + + /array-back/6.2.2: + resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} + engines: {node: '>=12.17'} + dev: true + /array-buffer-byte-length/1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: @@ -2321,8 +2173,8 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.flat/1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + /array.prototype.flatmap/1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -2331,14 +2183,27 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /array.prototype.flatmap/1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} + /array.prototype.tosorted/1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.2 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.2 + dev: true + + /arraybuffer.prototype.slice/1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 dev: true /arrify/2.0.1: @@ -2371,6 +2236,12 @@ packages: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true + /asynciterator.prototype/1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true @@ -2667,10 +2538,18 @@ packages: /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 get-intrinsic: 1.2.0 dev: true + /call-bind/1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: true + /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2747,6 +2626,11 @@ packages: tslib: 2.6.2 dev: true + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true @@ -2982,6 +2866,26 @@ packages: typical: 2.6.1 dev: true + /command-line-args/5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: true + + /command-line-usage/6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + dev: true + /commander/10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -3006,12 +2910,8 @@ packages: engines: {node: ^12.20.0 || >=14} dev: true - /commandpost/1.4.0: - resolution: {integrity: sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ==} - dev: true - - /comment-parser/1.3.1: - resolution: {integrity: sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==} + /comment-parser/1.4.0: + resolution: {integrity: sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==} engines: {node: '>= 12.0.0'} dev: true @@ -3141,6 +3041,11 @@ packages: type-fest: 1.4.0 dev: true + /current-module-paths/1.1.1: + resolution: {integrity: sha512-8Ga5T8oMXBaSsHq9Gj+bddX7kHSaJKsl2vaAd3ep51eQLkr4W18eFEmEZM5bLo1zrz8tt3jE1U8QK9QGhaLR4g==} + engines: {node: '>=12.17'} + dev: true + /d/1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: @@ -3210,17 +3115,6 @@ packages: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true - /debug/2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - /debug/3.1.0: resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} peerDependencies: @@ -3316,6 +3210,15 @@ packages: engines: {node: '>=10'} dev: true + /define-data-property/1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + dev: true + /define-properties/1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} @@ -3324,6 +3227,15 @@ packages: object-keys: 1.1.1 dev: true + /define-properties/1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -3433,16 +3345,6 @@ packages: safe-buffer: 5.2.1 dev: true - /editorconfig/0.15.3: - resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} - hasBin: true - dependencies: - commander: 2.20.3 - lru-cache: 4.1.5 - semver: 5.7.1 - sigmund: 1.0.1 - dev: true - /ejs/3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} engines: {node: '>=0.10.0'} @@ -3463,6 +3365,10 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /emojilib/2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + dev: true + /encoding/0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} requiresBuild: true @@ -3485,13 +3391,6 @@ packages: tapable: 2.2.1 dev: true - /enquirer/2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - dev: true - /env-paths/2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -3551,6 +3450,70 @@ packages: which-typed-array: 1.1.9 dev: true + /es-abstract/1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + + /es-iterator-helpers/1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 + dev: true + /es-module-lexer/1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true @@ -3559,7 +3522,7 @@ packages: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 has: 1.0.3 has-tostringtag: 1.0.0 dev: true @@ -3643,35 +3606,49 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier/8.5.0_eslint@8.6.0: - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + /eslint-config-prettier/9.0.0_eslint@8.55.0: + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.6.0 + eslint: 8.55.0 dev: true - /eslint-config-prettier/9.0.0_eslint@8.6.0: - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + /eslint-import-resolver-node/0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: - eslint: 8.6.0 + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color dev: true - /eslint-import-resolver-node/0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + /eslint-import-resolver-typescript/3.6.1_tpu45zodljnzvckpnsmhtdqkmi: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' dependencies: - debug: 3.2.7 + debug: 4.3.4 + enhanced-resolve: 5.15.0 + eslint: 8.55.0 + eslint-module-utils: 2.8.0_j7h7oj6rrhtikhzta4fgkou42e + eslint-plugin-import: /eslint-plugin-i/2.29.0_j7h7oj6rrhtikhzta4fgkou42e + fast-glob: 3.3.2 + get-tsconfig: 4.7.2 is-core-module: 2.12.0 - resolve: 1.22.2 + is-glob: 4.0.3 transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack - supports-color dev: true - /eslint-module-utils/2.8.0_iwcyz3q5swh44qq6nyzz4rzmcq: + /eslint-module-utils/2.8.0_762h3b5esehr7f4s6pbg6xsz7q: resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -3692,88 +3669,99 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.9.1_kufnqfq7tb5rpdawkdb6g5smma + '@typescript-eslint/parser': 6.7.5_bpztyfltmpuv6lhsgzfwtmxhte debug: 3.2.7 - eslint: 8.6.0 - eslint-import-resolver-node: 0.3.7 + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1_tpu45zodljnzvckpnsmhtdqkmi transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-editorconfig/3.2.0_4x3vxi7gdq53yv6dpzqqqrxppq: - resolution: {integrity: sha512-XiUg69+qgv6BekkPCjP8+2DMODzPqtLV5i0Q9FO1v40P62pfodG1vjIihVbw/338hS5W26S+8MTtXaAlrg37QQ==} + /eslint-module-utils/2.8.0_j7h7oj6rrhtikhzta4fgkou42e: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.55.0_i37r4pxnuonvhfobrnldva5ppi - editorconfig: 0.15.3 - eslint: 8.6.0 - klona: 2.0.6 + '@typescript-eslint/parser': 6.7.5_bpztyfltmpuv6lhsgzfwtmxhte + debug: 3.2.7 + eslint: 8.55.0 + eslint-import-resolver-typescript: 3.6.1_tpu45zodljnzvckpnsmhtdqkmi transitivePeerDependencies: - - '@typescript-eslint/parser' - supports-color - - typescript dev: true - /eslint-plugin-eslint-comments/3.2.0_eslint@8.6.0: + /eslint-plugin-eslint-comments/3.2.0_eslint@8.55.0: resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: escape-string-regexp: 1.0.5 - eslint: 8.6.0 + eslint: 8.55.0 ignore: 5.2.4 dev: true - /eslint-plugin-import/2.25.4_gyqcce5u2ijhn2hqkipmk56rmu: - resolution: {integrity: sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==} - engines: {node: '>=4'} + /eslint-plugin-i/2.29.0_j7h7oj6rrhtikhzta4fgkou42e: + resolution: {integrity: sha512-slGeTS3GQzx9267wLJnNYNO8X9EHGsc75AKIAFvnvMYEcTJKotPKL1Ru5PIGVHIVet+2DsugePWp8Oxpx8G22w==} + engines: {node: '>=12'} peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint: ^7.2.0 || ^8 dependencies: - '@typescript-eslint/parser': 5.9.1_kufnqfq7tb5rpdawkdb6g5smma - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - debug: 2.6.9 + debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.6.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0_iwcyz3q5swh44qq6nyzz4rzmcq - has: 1.0.3 - is-core-module: 2.12.0 + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0_762h3b5esehr7f4s6pbg6xsz7q + get-tsconfig: 4.7.2 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.2 - tsconfig-paths: 3.14.2 + resolve: 1.22.8 + semver: 7.5.4 transitivePeerDependencies: + - '@typescript-eslint/parser' - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color dev: true - /eslint-plugin-jsdoc/39.3.25_eslint@8.6.0: - resolution: {integrity: sha512-7JiFOOaipz7Z7lNQ9sMJ6cdvclmVUwNYtFWGS3a0k0uEFcdZPPD64WOfENuyNHpl86C0AKIEPgOpZby5kd+pew==} - engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} + /eslint-plugin-jsdoc/46.8.2_eslint@8.55.0: + resolution: {integrity: sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==} + engines: {node: '>=16'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@es-joy/jsdoccomment': 0.33.4 - comment-parser: 1.3.1 + '@es-joy/jsdoccomment': 0.40.1 + are-docs-informative: 0.0.2 + comment-parser: 1.4.0 debug: 4.3.4 escape-string-regexp: 4.0.0 - eslint: 8.6.0 + eslint: 8.55.0 esquery: 1.5.0 + is-builtin-module: 3.2.1 semver: 7.5.4 spdx-expression-parse: 3.0.1 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-perfectionist/2.2.0_kufnqfq7tb5rpdawkdb6g5smma: + /eslint-plugin-perfectionist/2.2.0_bpztyfltmpuv6lhsgzfwtmxhte: resolution: {integrity: sha512-/nG2Uurd6AY7CI6zlgjHPOoiPY8B7EYMUWdNb5w+EzyauYiQjjD5lQwAI1FlkBbCCFFZw/CdZIPQhXumYoiyaw==} peerDependencies: astro-eslint-parser: ^0.16.0 @@ -3791,8 +3779,8 @@ packages: vue-eslint-parser: optional: true dependencies: - '@typescript-eslint/utils': 6.8.0_kufnqfq7tb5rpdawkdb6g5smma - eslint: 8.6.0 + '@typescript-eslint/utils': 6.8.0_bpztyfltmpuv6lhsgzfwtmxhte + eslint: 8.55.0 minimatch: 9.0.3 natural-compare-lite: 1.4.0 transitivePeerDependencies: @@ -3800,25 +3788,36 @@ packages: - typescript dev: true - /eslint-plugin-promise/6.0.1_eslint@8.6.0: - resolution: {integrity: sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw==} + /eslint-plugin-promise/6.1.1_eslint@8.55.0: + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.6.0 + eslint: 8.55.0 + dev: true + + /eslint-plugin-react-hooks/4.6.0_eslint@8.55.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.55.0 dev: true - /eslint-plugin-react/7.28.0_eslint@8.6.0: - resolution: {integrity: sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==} + /eslint-plugin-react/7.33.2_eslint@8.55.0: + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 - eslint: 8.6.0 + es-iterator-helpers: 1.0.15 + eslint: 8.55.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -3828,7 +3827,7 @@ packages: object.values: 1.1.6 prop-types: 15.8.1 resolve: 2.0.0-next.4 - semver: 6.3.0 + semver: 6.3.1 string.prototype.matchall: 4.0.8 dev: true @@ -3839,41 +3838,42 @@ packages: '@microsoft/tsdoc-config': 0.16.2 dev: true - /eslint-plugin-unicorn/40.0.0_eslint@8.6.0: - resolution: {integrity: sha512-5GRXISfBk8jMmYk1eeNDw8zSRnWTxBjWkzx2Prre6E2/yLu2twozZ3EomLWCBu9nWms/ZE361BItyMQwfnG1qA==} - engines: {node: '>=12'} + /eslint-plugin-unicorn/48.0.1_eslint@8.55.0: + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} + engines: {node: '>=16'} peerDependencies: - eslint: '>=7.32.0' + eslint: '>=8.44.0' dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.20 + '@eslint-community/eslint-utils': 4.4.0_eslint@8.55.0 ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.6.0 - eslint-utils: 3.0.0_eslint@8.6.0 + eslint: 8.55.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 + jsesc: 3.0.2 lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 - safe-regex: 2.1.1 + regjsparser: 0.10.0 semver: 7.5.4 strip-indent: 3.0.0 dev: true - /eslint-plugin-unused-imports/2.0.0_fhnxgfsp6r3qynjxjvskmntitm: - resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} + /eslint-plugin-unused-imports/3.0.0_q2lq45qjv2a3kzwivaf2whp57u: + resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 + '@typescript-eslint/eslint-plugin': ^6.0.0 eslint: ^8.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.9.1_i37r4pxnuonvhfobrnldva5ppi - eslint: 8.6.0 + '@typescript-eslint/eslint-plugin': 6.7.5_gutmsi6rpbyypn46fpwnxcekni + eslint: 8.55.0 eslint-rule-composer: 0.3.0 dev: true @@ -3890,55 +3890,46 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope/7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + /eslint-scope/7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.6.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.6.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys/2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - /eslint-visitor-keys/3.4.1: resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.40.0: - resolution: {integrity: sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==} + /eslint-visitor-keys/3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.55.0: + resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@8.40.0 - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.0.3 - '@eslint/js': 8.40.0 - '@humanwhocodes/config-array': 0.11.8 + '@eslint-community/eslint-utils': 4.4.0_eslint@8.55.0 + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.55.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.5.2 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -3946,81 +3937,31 @@ packages: find-up: 5.0.0 glob-parent: 6.0.2 globals: 13.20.0 - grapheme-splitter: 1.0.4 + graphemer: 1.4.0 ignore: 5.2.4 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-sdsl: 4.4.0 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint/8.6.0: - resolution: {integrity: sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.9.5 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - enquirer: 2.3.6 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-utils: 3.0.0_eslint@8.6.0 - eslint-visitor-keys: 3.4.1 - espree: 9.5.2 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 6.0.2 - globals: 13.20.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 - progress: 2.0.3 - regexpp: 3.2.0 - semver: 7.5.0 + optionator: 0.9.3 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 - v8-compile-cache: 2.3.0 transitivePeerDependencies: - supports-color dev: true - /espree/9.5.2: - resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} + /espree/9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2_acorn@8.8.2 - eslint-visitor-keys: 3.4.1 + acorn: 8.11.2 + acorn-jsx: 5.3.2_acorn@8.11.2 + eslint-visitor-keys: 3.4.3 dev: true /esprima/4.0.1: @@ -4170,6 +4111,10 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true + /fast-diff/1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + /fast-glob/3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -4181,6 +4126,17 @@ packages: micromatch: 4.0.5 dev: true + /fast-glob/3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-patch/3.1.1: resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} dev: true @@ -4214,6 +4170,10 @@ packages: reusify: 1.0.4 dev: true + /fflate/0.7.4: + resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} + dev: true + /figures/3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -4228,6 +4188,14 @@ packages: flat-cache: 3.0.4 dev: true + /file-set/5.1.3: + resolution: {integrity: sha512-mQ6dqz+z59on3B50IGF3ujNGbZmY1TAeLHpNfhLEeNM6Lky31w3RUlbCyqZWQs0DuZJQU4R2qDuVd9ojyzadcg==} + engines: {node: '>=12.17'} + dependencies: + array-back: 6.2.2 + glob: 7.2.3 + dev: true + /filelist/1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: @@ -4254,6 +4222,13 @@ packages: test-value: 2.1.0 dev: true + /find-replace/3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + dev: true + /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -4390,8 +4365,8 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind/1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true /function.prototype.name/1.1.5: @@ -4404,8 +4379,14 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree/1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + /function.prototype.name/1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 dev: true /functions-have-names/1.2.3: @@ -4449,11 +4430,20 @@ packages: /get-intrinsic/1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 has: 1.0.3 has-symbols: 1.0.3 dev: true + /get-intrinsic/1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: true + /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -4496,6 +4486,12 @@ packages: get-intrinsic: 1.2.0 dev: true + /get-tsconfig/4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /git-config-path/1.0.1: resolution: {integrity: sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==} engines: {node: '>=0.10.0'} @@ -4622,7 +4618,7 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 dev: true /globby/10.0.0: @@ -4718,8 +4714,8 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true - /grapheme-splitter/1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + /graphemer/1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true /gray-matter/4.0.3: @@ -4759,7 +4755,7 @@ packages: /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 dev: true /has-proto/1.0.1: @@ -4792,7 +4788,14 @@ packages: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 + dev: true + + /hasown/2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 dev: true /hasurl/1.0.0: @@ -4986,11 +4989,6 @@ packages: minimatch: 9.0.3 dev: true - /ignore/4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - dev: true - /ignore/5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -5081,7 +5079,7 @@ packages: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -5119,6 +5117,13 @@ packages: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: true + /is-async-function/2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -5158,6 +5163,12 @@ packages: has: 1.0.3 dev: true + /is-core-module/2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + /is-date-object/1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -5181,6 +5192,12 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-finalizationregistry/1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.2 + dev: true + /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -5217,6 +5234,10 @@ packages: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: true + /is-map/2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -5283,6 +5304,10 @@ packages: scoped-regex: 2.1.0 dev: true + /is-set/2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + /is-shared-array-buffer/1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: @@ -5324,6 +5349,13 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-typed-array/1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + dev: true + /is-typedarray/1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true @@ -5337,12 +5369,23 @@ packages: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true + /is-weakmap/2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true + /is-weakset/2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.2 + dev: true + /is-wsl/2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -5363,6 +5406,10 @@ packages: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + /isbinaryfile/4.0.10: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} @@ -5377,6 +5424,16 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /iterator.prototype/1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 + dev: true + /jackspeak/2.2.0: resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==} engines: {node: '>=14'} @@ -5415,10 +5472,6 @@ packages: engines: {node: '>= 0.6.0'} dev: true - /js-sdsl/4.4.0: - resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} - dev: true - /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -5438,11 +5491,22 @@ packages: argparse: 2.0.1 dev: true - /jsdoc-type-pratt-parser/3.1.0: - resolution: {integrity: sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==} + /jsdoc-type-pratt-parser/4.0.0: + resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} engines: {node: '>=12.0.0'} dev: true + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc/3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + /json-buffer/3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} dev: true @@ -5490,13 +5554,6 @@ packages: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} dev: true - /json5/1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -5565,7 +5622,7 @@ packages: resolution: {integrity: sha512-2kKqnTsgJ+ncSX3IsrpclVIcZH6UGyTLGRfc7axTKhViTWoftJF2WxBA02Smc5ZkmXOov2t3jsuBBJ+IJ3lZ7Q==} dependencies: better_git_changelog: 1.6.2 - eslint: 8.40.0 + eslint: 8.55.0 jssm: 5.89.2 reduce-to-639-1: 1.1.0 text_audit: 0.9.3 @@ -5649,11 +5706,6 @@ packages: engines: {node: '>=6'} dev: true - /klona/2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - dev: true - /ky-universal/0.3.0_ky@0.12.0: resolution: {integrity: sha512-CM4Bgb2zZZpsprcjI6DNYTaH3oGHXL2u7BU4DK+lfCuC4snkt9/WRpMYeKbBbXscvKkeqBwzzjFX2WwmKY5K/A==} engines: {node: '>=8'} @@ -5719,6 +5771,13 @@ packages: type-fest: 0.3.1 dev: true + /load-module/4.2.1: + resolution: {integrity: sha512-Sbfg6R4LjvyThJpqUoADHMjyoI2+cL4msbCQeZ9kkY/CqP/TT2938eftKm7x4I2gd4/A+DEe6nePkbfWYbXwSw==} + engines: {node: '>=12.17'} + dependencies: + array-back: 6.2.2 + dev: true + /load-yaml-file/0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -5752,6 +5811,10 @@ packages: resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} dev: true + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + /lodash.find/4.6.0: resolution: {integrity: sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==} dev: true @@ -5885,15 +5948,8 @@ packages: dev: true /lowercase-keys/3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /lru-cache/4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /lru-cache/6.0.0: @@ -6001,6 +6057,27 @@ packages: - supports-color dev: true + /marked-terminal/6.2.0_marked@9.1.6: + resolution: {integrity: sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==} + engines: {node: '>=16.0.0'} + peerDependencies: + marked: '>=1 <12' + dependencies: + ansi-escapes: 6.2.0 + cardinal: 2.1.1 + chalk: 5.3.0 + cli-table3: 0.6.3 + marked: 9.1.6 + node-emoji: 2.1.3 + supports-hyperlinks: 3.0.0 + dev: true + + /marked/9.1.6: + resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} + engines: {node: '>= 16'} + hasBin: true + dev: true + /mem-fs-editor/9.7.0: resolution: {integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==} engines: {node: '>=12.10.0'} @@ -6387,6 +6464,16 @@ packages: resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==} dev: true + /node-emoji/2.1.3: + resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + dev: true + /node-fetch/2.6.10: resolution: {integrity: sha512-5YytjUVbwzjE/BX4N62vnPPkGNxlJPwdA9/ArUc4pcM6cYS4Hinuv4VazzwjMGgnWuiQqcemOanib/5PpcsGug==} engines: {node: 4.x || >=6.0.0} @@ -6470,7 +6557,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.2 + resolve: 1.22.8 semver: 5.7.1 validate-npm-package-license: 3.0.4 dev: true @@ -6480,7 +6567,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.12.0 + is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -6490,7 +6577,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: hosted-git-info: 6.1.1 - is-core-module: 2.12.0 + is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -6799,6 +6886,10 @@ packages: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true + /object-inspect/1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -6853,20 +6944,20 @@ packages: es-abstract: 1.21.2 dev: true - /oclif/4.0.3_kufnqfq7tb5rpdawkdb6g5smma: + /oclif/4.0.3_bpztyfltmpuv6lhsgzfwtmxhte: resolution: {integrity: sha512-Bq7t1bJvAKYwW3DKQIzok3jkXv7yUIMneoSec1qUr9wfSqzRTZQB0UUDovwlT/L+3TBMVoRyw1WeX+YDvfRJNA==} engines: {node: '>=18.0.0'} hasBin: true dependencies: '@oclif/core': 3.5.0 - '@oclif/plugin-help': 5.2.20_typescript@4.5.5 - '@oclif/plugin-not-found': 2.4.3_typescript@4.5.5 + '@oclif/plugin-help': 5.2.20_typescript@5.1.6 + '@oclif/plugin-not-found': 2.4.3_typescript@5.1.6 '@oclif/plugin-warn-if-update-available': 3.0.2 async-retry: 1.3.3 aws-sdk: 2.1374.0 change-case: 4.1.2 debug: 4.3.4 - eslint-plugin-perfectionist: 2.2.0_kufnqfq7tb5rpdawkdb6g5smma + eslint-plugin-perfectionist: 2.2.0_bpztyfltmpuv6lhsgzfwtmxhte find-yarn-workspace-root: 2.0.0 fs-extra: 8.1.0 github-slugger: 1.5.0 @@ -6909,16 +7000,16 @@ packages: mimic-fn: 2.1.0 dev: true - /optionator/0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + /optionator/0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 dev: true /ora/5.4.1: @@ -6953,6 +7044,13 @@ packages: resolution: {integrity: sha512-eoJ9YWxFcXbrn2U8FKT6RV+/Kj7fiGAB1VvHzbYKt8xM5ZuKZgCGvnHzDxmreEjcBH28ejg5MiOH4iyY1mQnkg==} dev: true + /p-all/3.0.0: + resolution: {integrity: sha512-qUZbvbBFVXm6uJ7U/WDiO0fv6waBMbjlCm4E66oZdRR+egswICarIdHyVSZZHudH8T5SF8x/JG0q0duFzPnlBw==} + engines: {node: '>=10'} + dependencies: + p-map: 4.0.0 + dev: true + /p-cancelable/1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} engines: {node: '>=6'} @@ -7045,7 +7143,7 @@ packages: got: 9.6.0 registry-auth-token: 4.2.2 registry-url: 5.1.0 - semver: 6.3.0 + semver: 6.3.1 dev: true /package-json/8.1.0: @@ -7349,6 +7447,12 @@ packages: minimist: 1.2.8 dev: true + /printj/1.3.1: + resolution: {integrity: sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==} + engines: {node: '>=0.8'} + hasBin: true + dev: true + /proc-log/1.0.0: resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} dev: true @@ -7425,10 +7529,6 @@ packages: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: true - /pseudomap/1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true - /pump/3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -7624,7 +7724,7 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.2 + resolve: 1.22.8 dev: true /redeyed/2.1.1: @@ -7633,10 +7733,27 @@ packages: esprima: 4.0.1 dev: true + /reduce-flatten/2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + dev: true + /reduce-to-639-1/1.1.0: resolution: {integrity: sha512-9yy/xgTE8qPlZKQrQmyCU1Y1ZSnnOCP4K0Oe1YrBtteUmVXk0AgyINp0NS5kHGzZfpvjgHr6ygFZc9fpqf7moQ==} dev: true + /reflect.getprototypeof/1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + /regenerator-runtime/0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: true @@ -7655,9 +7772,13 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp/3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} + /regexp.prototype.flags/1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + set-function-name: 2.0.1 dev: true /registry-auth-token/4.2.2: @@ -7688,6 +7809,13 @@ packages: rc: 1.2.8 dev: true + /regjsparser/0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + /remote-git-tags/3.0.0: resolution: {integrity: sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==} engines: {node: '>=8'} @@ -7697,6 +7825,25 @@ packages: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} dev: true + /renamer/4.0.0: + resolution: {integrity: sha512-yurufcXxbJfFBVAUoByNyDVH811zTZ/MrKo6gUH8pHGeAmdK7J5egj2lSNe57HuVIvnVzSalzeVGu8pi8UHGxg==} + engines: {node: '>=12.17'} + hasBin: true + dependencies: + array-back: 6.2.2 + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + current-module-paths: 1.1.1 + fast-diff: 1.3.0 + file-set: 5.1.3 + global-dirs: 3.0.1 + load-module: 4.2.1 + printj: 1.3.1 + stream-read-all: 3.0.1 + typical: 7.1.1 + dev: true + /replace-ext/1.0.1: resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} engines: {node: '>= 0.10'} @@ -7731,10 +7878,14 @@ packages: engines: {node: '>=4'} dev: true + /resolve-pkg-maps/1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve/1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} dependencies: - is-core-module: 2.12.0 + is-core-module: 2.13.1 path-parse: 1.0.7 dev: true @@ -7747,11 +7898,20 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /resolve/1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /resolve/2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: - is-core-module: 2.12.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -7852,6 +8012,16 @@ packages: tslib: 2.6.2 dev: true + /safe-array-concat/1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true @@ -7868,12 +8038,6 @@ packages: is-regex: 1.1.4 dev: true - /safe-regex/2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} - dependencies: - regexp-tree: 0.1.27 - dev: true - /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true @@ -7920,17 +8084,9 @@ packages: hasBin: true dev: true - /semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - - /semver/7.5.0: - resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} - engines: {node: '>=10'} + /semver/6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dependencies: - lru-cache: 6.0.0 dev: true /semver/7.5.4: @@ -7959,6 +8115,25 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true + /set-function-length/1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + dev: true + + /set-function-name/2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.0 + dev: true + /setimmediate/1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: true @@ -8020,10 +8195,6 @@ packages: object-inspect: 1.12.3 dev: true - /sigmund/1.0.1: - resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} - dev: true - /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -8077,6 +8248,13 @@ packages: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true + /skin-tone/2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + dependencies: + unicode-emoji-modifier-base: 1.0.0 + dev: true + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -8250,6 +8428,11 @@ packages: - supports-color dev: true + /stream-read-all/3.0.1: + resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} + engines: {node: '>=10'} + dev: true + /strict-uri-encode/2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -8260,6 +8443,12 @@ packages: engines: {node: '>=0.6.19'} dev: true + /string-to-stream/3.0.1: + resolution: {integrity: sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==} + dependencies: + readable-stream: 3.6.2 + dev: true + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -8300,6 +8489,15 @@ packages: es-abstract: 1.21.2 dev: true + /string.prototype.trim/1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + dev: true + /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: @@ -8308,6 +8506,14 @@ packages: es-abstract: 1.21.2 dev: true + /string.prototype.trimend/1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + dev: true + /string.prototype.trimstart/1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: @@ -8316,6 +8522,14 @@ packages: es-abstract: 1.21.2 dev: true + /string.prototype.trimstart/1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.0 + es-abstract: 1.22.3 + dev: true + /string_decoder/0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} dev: true @@ -8410,6 +8624,11 @@ packages: engines: {node: '>=14.16'} dev: true + /superstruct/1.0.3: + resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} + engines: {node: '>=14.0.0'} + dev: true + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -8447,11 +8666,29 @@ packages: supports-color: 7.2.0 dev: true + /supports-hyperlinks/3.0.0: + resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} + engines: {node: '>=14.18'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true + /table-layout/1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + dev: true + /table/6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} @@ -8618,13 +8855,13 @@ packages: resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} dev: true - /ts-api-utils/1.0.3_typescript@4.5.5: + /ts-api-utils/1.0.3_typescript@5.1.6: resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 4.5.5 + typescript: 5.1.6 dev: true /ts-morph/17.0.1: @@ -8634,7 +8871,7 @@ packages: code-block-writer: 11.0.3 dev: true - /ts-node/10.9.1_typescript@4.5.5: + /ts-node/10.9.1_typescript@5.1.6: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -8661,51 +8898,33 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.5.5 + typescript: 5.1.6 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /ts-node/10.9.1_typescript@5.1.6: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + /tsc-multi/1.1.0_44oayjl3iesbankmh6w6z32iii_typescript@5.1.6: + resolution: {integrity: sha512-THE6X+sse7EZ2qMhqXvBhd2HMTvXyWwYnx+2T/ijqdp/6Rf7rUc2uPRzPdrrljZCNcYDeL0qP2P7tqm2IwayTg==} + engines: {node: '>=14'} hasBin: true peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - '@types/node': - optional: true + typescript: '>=4.3.0' dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 + debug: 4.3.4 + fast-glob: 3.2.12 + get-stdin: 8.0.0 + p-all: 3.0.0 + picocolors: 1.0.0 + signal-exit: 3.0.7 + string-to-stream: 3.0.1 + superstruct: 1.0.3 + tslib: 2.6.2 typescript: 5.1.6 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /tsconfig-paths/3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color dev: true + patched: true /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -8715,14 +8934,14 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsutils/3.21.0_typescript@4.5.5: + /tsutils/3.21.0_typescript@5.1.6: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.5.5 + typescript: 5.1.6 dev: true /tuf-js/1.1.5: @@ -8792,6 +9011,11 @@ packages: engines: {node: '>=12.20'} dev: true + /type-fest/3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true + /type/1.2.0: resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} dev: true @@ -8800,6 +9024,36 @@ packages: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} dev: true + /typed-array-buffer/1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length/1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset/1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + /typed-array-length/1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: @@ -8822,24 +9076,6 @@ packages: is-typedarray: 1.0.0 dev: true - /typescript-formatter/7.1.0_typescript@4.5.5: - resolution: {integrity: sha512-XgPUSZ3beF7Xx2ZIEngIonWpDTS0XzWqV0vjtcm6nOPONug4WFXQYjbvulCzY2T0+knceZn5CFQjVUShNkIdLA==} - engines: {node: '>= 4.2.0'} - hasBin: true - peerDependencies: - typescript: ^2.1.6 || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev - dependencies: - commandpost: 1.4.0 - editorconfig: 0.15.3 - typescript: 4.5.5 - dev: true - - /typescript/4.5.5: - resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - /typescript/5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} @@ -8852,10 +9088,31 @@ packages: hasBin: true dev: true + /typescript/5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /typical/2.6.1: resolution: {integrity: sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==} dev: true + /typical/4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: true + + /typical/5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + dev: true + + /typical/7.1.1: + resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} + engines: {node: '>=12.17'} + dev: true + /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -8869,6 +9126,11 @@ packages: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: true + /unicode-emoji-modifier-base/1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + dev: true + /unique-filename/1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} dependencies: @@ -9035,10 +9297,6 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-compile-cache/2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} - dev: true - /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -9183,6 +9441,33 @@ packages: is-symbol: 1.0.4 dev: true + /which-builtin-type/1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.5 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.9 + dev: true + + /which-collection/1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + /which-pm/2.0.0: resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} engines: {node: '>=8.15'} @@ -9191,6 +9476,17 @@ packages: path-exists: 4.0.0 dev: true + /which-typed-array/1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + /which-typed-array/1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} @@ -9253,15 +9549,18 @@ packages: execa: 1.0.0 dev: true - /word-wrap/1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - dev: true - /wordwrap/1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true + /wordwrapjs/4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + dev: true + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -9329,10 +9628,6 @@ packages: engines: {node: '>=10'} dev: true - /yallist/2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true - /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true diff --git a/common/lib/protocol-definitions/src/storage.ts b/common/lib/protocol-definitions/src/storage.ts index 196c9f6a3d05..e43ab3119f5c 100644 --- a/common/lib/protocol-definitions/src/storage.ts +++ b/common/lib/protocol-definitions/src/storage.ts @@ -43,6 +43,7 @@ export interface IBlob { /** * The encoding of the contents string */ + // eslint-disable-next-line unicorn/text-encoding-identifier-case encoding: "utf-8" | "base64"; } diff --git a/common/lib/protocol-definitions/tsconfig.esnext.json b/common/lib/protocol-definitions/tsconfig.esnext.json deleted file mode 100644 index 1ea62d46b20b..000000000000 --- a/common/lib/protocol-definitions/tsconfig.esnext.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./lib", - "module": "esnext", - }, -} diff --git a/common/lib/protocol-definitions/tsconfig.json b/common/lib/protocol-definitions/tsconfig.json index 4c4c04fe6144..1214dd9b05f7 100644 --- a/common/lib/protocol-definitions/tsconfig.json +++ b/common/lib/protocol-definitions/tsconfig.json @@ -1,5 +1,8 @@ { - "extends": "@fluidframework/build-common/ts-common-config.json", + "extends": [ + "../../build/build-common/tsconfig.base.json", + "../../build/build-common/tsconfig.cjs.json", + ], "exclude": ["dist", "node_modules"], "compilerOptions": { "rootDir": "./src", diff --git a/examples/apps/attributable-map/CHANGELOG.md b/examples/apps/attributable-map/CHANGELOG.md index eabc84b5d390..dfdfa134d922 100644 --- a/examples/apps/attributable-map/CHANGELOG.md +++ b/examples/apps/attributable-map/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/attributable-map +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/apps/collaborative-textarea/CHANGELOG.md b/examples/apps/collaborative-textarea/CHANGELOG.md index 8dc234f01b6a..fa3e03d7bd32 100644 --- a/examples/apps/collaborative-textarea/CHANGELOG.md +++ b/examples/apps/collaborative-textarea/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/collaborative-textarea +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/apps/contact-collection/CHANGELOG.md b/examples/apps/contact-collection/CHANGELOG.md index 0c386e98e884..61c107385d8c 100644 --- a/examples/apps/contact-collection/CHANGELOG.md +++ b/examples/apps/contact-collection/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/contact-collection +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/apps/data-object-grid/CHANGELOG.md b/examples/apps/data-object-grid/CHANGELOG.md index fa469bb9704b..d409896f0c99 100644 --- a/examples/apps/data-object-grid/CHANGELOG.md +++ b/examples/apps/data-object-grid/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/data-object-grid +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/apps/presence-tracker/CHANGELOG.md b/examples/apps/presence-tracker/CHANGELOG.md index 0db9053cd19c..0821776d1db8 100644 --- a/examples/apps/presence-tracker/CHANGELOG.md +++ b/examples/apps/presence-tracker/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/presence-tracker +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/apps/task-selection/CHANGELOG.md b/examples/apps/task-selection/CHANGELOG.md index a6c962049ec8..3a3c2ceb22e6 100644 --- a/examples/apps/task-selection/CHANGELOG.md +++ b/examples/apps/task-selection/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/task-selection +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/apps/tree-comparison/CHANGELOG.md b/examples/apps/tree-comparison/CHANGELOG.md index 9b8007306e36..4759afa69148 100644 --- a/examples/apps/tree-comparison/CHANGELOG.md +++ b/examples/apps/tree-comparison/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/tree-comparison +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/benchmarks/bubblebench/baseline/CHANGELOG.md b/examples/benchmarks/bubblebench/baseline/CHANGELOG.md index 1efcc2facffc..4027b29b7f13 100644 --- a/examples/benchmarks/bubblebench/baseline/CHANGELOG.md +++ b/examples/benchmarks/bubblebench/baseline/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/bubblebench-baseline +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/benchmarks/bubblebench/common/CHANGELOG.md b/examples/benchmarks/bubblebench/common/CHANGELOG.md index 4f07f2eb175a..4f152d5d8215 100644 --- a/examples/benchmarks/bubblebench/common/CHANGELOG.md +++ b/examples/benchmarks/bubblebench/common/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/bubblebench-common +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/benchmarks/bubblebench/editable-shared-tree/CHANGELOG.md b/examples/benchmarks/bubblebench/editable-shared-tree/CHANGELOG.md index 2e1636ae0fa9..7f6e5e80d046 100644 --- a/examples/benchmarks/bubblebench/editable-shared-tree/CHANGELOG.md +++ b/examples/benchmarks/bubblebench/editable-shared-tree/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/bubblebench-editable-shared-tree +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/benchmarks/bubblebench/ot/CHANGELOG.md b/examples/benchmarks/bubblebench/ot/CHANGELOG.md index 0eef5a737793..4a84ddb40868 100644 --- a/examples/benchmarks/bubblebench/ot/CHANGELOG.md +++ b/examples/benchmarks/bubblebench/ot/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/bubblebench-ot +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/benchmarks/bubblebench/sharedtree/CHANGELOG.md b/examples/benchmarks/bubblebench/sharedtree/CHANGELOG.md index 4671c1a9ab22..8c51299c9d1d 100644 --- a/examples/benchmarks/bubblebench/sharedtree/CHANGELOG.md +++ b/examples/benchmarks/bubblebench/sharedtree/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/bubblebench-sharedtree +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/benchmarks/odspsnapshotfetch-perftestapp/CHANGELOG.md b/examples/benchmarks/odspsnapshotfetch-perftestapp/CHANGELOG.md index b83d5f48de24..042d8d02d33f 100644 --- a/examples/benchmarks/odspsnapshotfetch-perftestapp/CHANGELOG.md +++ b/examples/benchmarks/odspsnapshotfetch-perftestapp/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/odspsnapshotfetch-perftestapp +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/client-logger/app-insights-logger/CHANGELOG.md b/examples/client-logger/app-insights-logger/CHANGELOG.md index bbc0ba01ca54..689e2f4e68ce 100644 --- a/examples/client-logger/app-insights-logger/CHANGELOG.md +++ b/examples/client-logger/app-insights-logger/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/app-insights-logger +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/canvas/CHANGELOG.md b/examples/data-objects/canvas/CHANGELOG.md index 88514a37e5bb..14c7509f07dd 100644 --- a/examples/data-objects/canvas/CHANGELOG.md +++ b/examples/data-objects/canvas/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/canvas +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/clicker/CHANGELOG.md b/examples/data-objects/clicker/CHANGELOG.md index 07eeae644fc7..8eb89b82e5cc 100644 --- a/examples/data-objects/clicker/CHANGELOG.md +++ b/examples/data-objects/clicker/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/clicker +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/codemirror/CHANGELOG.md b/examples/data-objects/codemirror/CHANGELOG.md index 57b6ca8712a8..2d644ac8b70c 100644 --- a/examples/data-objects/codemirror/CHANGELOG.md +++ b/examples/data-objects/codemirror/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/codemirror +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/diceroller/CHANGELOG.md b/examples/data-objects/diceroller/CHANGELOG.md index 0c01363da4c9..1e4626f27f76 100644 --- a/examples/data-objects/diceroller/CHANGELOG.md +++ b/examples/data-objects/diceroller/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/diceroller +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/inventory-app/CHANGELOG.md b/examples/data-objects/inventory-app/CHANGELOG.md index 662b7d7fa883..1a1eb5a4f014 100644 --- a/examples/data-objects/inventory-app/CHANGELOG.md +++ b/examples/data-objects/inventory-app/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/inventory-app +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/monaco/CHANGELOG.md b/examples/data-objects/monaco/CHANGELOG.md index 8661f747654e..17091464e786 100644 --- a/examples/data-objects/monaco/CHANGELOG.md +++ b/examples/data-objects/monaco/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/monaco +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/multiview/constellation-model/CHANGELOG.md b/examples/data-objects/multiview/constellation-model/CHANGELOG.md index eded99185ac4..dc04f9889ac7 100644 --- a/examples/data-objects/multiview/constellation-model/CHANGELOG.md +++ b/examples/data-objects/multiview/constellation-model/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/multiview-constellation-model +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/multiview/constellation-view/CHANGELOG.md b/examples/data-objects/multiview/constellation-view/CHANGELOG.md index 1aeac77a209f..e523a79c2407 100644 --- a/examples/data-objects/multiview/constellation-view/CHANGELOG.md +++ b/examples/data-objects/multiview/constellation-view/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/multiview-constellation-view +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/multiview/container/CHANGELOG.md b/examples/data-objects/multiview/container/CHANGELOG.md index aa51970147f2..08fb38be5bbb 100644 --- a/examples/data-objects/multiview/container/CHANGELOG.md +++ b/examples/data-objects/multiview/container/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/multiview-container +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/multiview/coordinate-model/CHANGELOG.md b/examples/data-objects/multiview/coordinate-model/CHANGELOG.md index 1b3feaf8c19b..7d0ba0970d70 100644 --- a/examples/data-objects/multiview/coordinate-model/CHANGELOG.md +++ b/examples/data-objects/multiview/coordinate-model/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/multiview-coordinate-model +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/multiview/interface/CHANGELOG.md b/examples/data-objects/multiview/interface/CHANGELOG.md index 4fc6c4f07e06..2494b07eb9c4 100644 --- a/examples/data-objects/multiview/interface/CHANGELOG.md +++ b/examples/data-objects/multiview/interface/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/multiview-coordinate-interface +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/multiview/plot-coordinate-view/CHANGELOG.md b/examples/data-objects/multiview/plot-coordinate-view/CHANGELOG.md index 59b17fb88eb7..5498f0ce6bf0 100644 --- a/examples/data-objects/multiview/plot-coordinate-view/CHANGELOG.md +++ b/examples/data-objects/multiview/plot-coordinate-view/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/multiview-plot-coordinate-view +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/multiview/slider-coordinate-view/CHANGELOG.md b/examples/data-objects/multiview/slider-coordinate-view/CHANGELOG.md index 12c416e72693..40c47ebf6bf7 100644 --- a/examples/data-objects/multiview/slider-coordinate-view/CHANGELOG.md +++ b/examples/data-objects/multiview/slider-coordinate-view/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/multiview-slider-coordinate-view +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/multiview/triangle-view/CHANGELOG.md b/examples/data-objects/multiview/triangle-view/CHANGELOG.md index 402fe0731219..0b25d0b25df9 100644 --- a/examples/data-objects/multiview/triangle-view/CHANGELOG.md +++ b/examples/data-objects/multiview/triangle-view/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/multiview-triangle-view +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/prosemirror/CHANGELOG.md b/examples/data-objects/prosemirror/CHANGELOG.md index 286c3ef6e598..306c77b32ac2 100644 --- a/examples/data-objects/prosemirror/CHANGELOG.md +++ b/examples/data-objects/prosemirror/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/prosemirror +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/smde/CHANGELOG.md b/examples/data-objects/smde/CHANGELOG.md index 40369840085b..82162a7cea89 100644 --- a/examples/data-objects/smde/CHANGELOG.md +++ b/examples/data-objects/smde/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/smde +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/table-document/CHANGELOG.md b/examples/data-objects/table-document/CHANGELOG.md index 187b8a1c4930..bd506dda2f2d 100644 --- a/examples/data-objects/table-document/CHANGELOG.md +++ b/examples/data-objects/table-document/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/table-document +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/table-view/CHANGELOG.md b/examples/data-objects/table-view/CHANGELOG.md index 3aae62cd6b04..a6d95a9b9f90 100644 --- a/examples/data-objects/table-view/CHANGELOG.md +++ b/examples/data-objects/table-view/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/table-view +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/todo/CHANGELOG.md b/examples/data-objects/todo/CHANGELOG.md index d4134f93c848..29984d5b4053 100644 --- a/examples/data-objects/todo/CHANGELOG.md +++ b/examples/data-objects/todo/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/todo +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/data-objects/webflow/CHANGELOG.md b/examples/data-objects/webflow/CHANGELOG.md index 7c1e51d51450..d528ffe21324 100644 --- a/examples/data-objects/webflow/CHANGELOG.md +++ b/examples/data-objects/webflow/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/webflow +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/external-data/CHANGELOG.md b/examples/external-data/CHANGELOG.md index 0f14d711f128..6384170237e8 100644 --- a/examples/external-data/CHANGELOG.md +++ b/examples/external-data/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/app-integration-external-data +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/service-clients/odsp-client/shared-tree-demo/CHANGELOG.md b/examples/service-clients/odsp-client/shared-tree-demo/CHANGELOG.md new file mode 100644 index 000000000000..9160ffac3cc9 --- /dev/null +++ b/examples/service-clients/odsp-client/shared-tree-demo/CHANGELOG.md @@ -0,0 +1,3 @@ +# @fluid-example/shared-tree-demo + +## 2.0.0-internal.7.4.0 diff --git a/examples/utils/bundle-size-tests/CHANGELOG.md b/examples/utils/bundle-size-tests/CHANGELOG.md index 301e71ac345a..905a5079911a 100644 --- a/examples/utils/bundle-size-tests/CHANGELOG.md +++ b/examples/utils/bundle-size-tests/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/bundle-size-tests +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/utils/example-utils/CHANGELOG.md b/examples/utils/example-utils/CHANGELOG.md index a337b1a97f5b..d783496e226d 100644 --- a/examples/utils/example-utils/CHANGELOG.md +++ b/examples/utils/example-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/example-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/utils/example-utils/tsconfig.json b/examples/utils/example-utils/tsconfig.json index f21a00a9eaf5..d674f6f74094 100644 --- a/examples/utils/example-utils/tsconfig.json +++ b/examples/utils/example-utils/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "@fluidframework/build-common/ts-common-config.json", "compilerOptions": { - "declarationDir": "./dist", "rootDir": "./src", "outDir": "./dist", }, diff --git a/examples/version-migration/live-schema-upgrade/CHANGELOG.md b/examples/version-migration/live-schema-upgrade/CHANGELOG.md index 47cf6cd95d60..a67f29ad1dba 100644 --- a/examples/version-migration/live-schema-upgrade/CHANGELOG.md +++ b/examples/version-migration/live-schema-upgrade/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/app-integration-live-schema-upgrade +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/version-migration/same-container/CHANGELOG.md b/examples/version-migration/same-container/CHANGELOG.md index dce7d15284ec..2ff62e758b1f 100644 --- a/examples/version-migration/same-container/CHANGELOG.md +++ b/examples/version-migration/same-container/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/version-migration-same-container +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/version-migration/schema-upgrade/CHANGELOG.md b/examples/version-migration/schema-upgrade/CHANGELOG.md index 06c76212fbb8..e08a0c7d353a 100644 --- a/examples/version-migration/schema-upgrade/CHANGELOG.md +++ b/examples/version-migration/schema-upgrade/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/app-integration-schema-upgrade +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/version-migration/tree-shim/CHANGELOG.md b/examples/version-migration/tree-shim/CHANGELOG.md index aa3272dae054..b1c23d0f912f 100644 --- a/examples/version-migration/tree-shim/CHANGELOG.md +++ b/examples/version-migration/tree-shim/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/tree-comparison +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/view-integration/container-views/CHANGELOG.md b/examples/view-integration/container-views/CHANGELOG.md index 92e36dd28ef8..f147565d51db 100644 --- a/examples/view-integration/container-views/CHANGELOG.md +++ b/examples/view-integration/container-views/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/app-integration-container-views +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/view-integration/external-views/CHANGELOG.md b/examples/view-integration/external-views/CHANGELOG.md index 57e38d551789..a3ad8a66e99e 100644 --- a/examples/view-integration/external-views/CHANGELOG.md +++ b/examples/view-integration/external-views/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/app-integration-external-views +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/examples/view-integration/view-framework-sampler/CHANGELOG.md b/examples/view-integration/view-framework-sampler/CHANGELOG.md index 8fc5182e2c78..4e86c03cbf38 100644 --- a/examples/view-integration/view-framework-sampler/CHANGELOG.md +++ b/examples/view-integration/view-framework-sampler/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/view-framework-sampler +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/examples/partial-checkout/CHANGELOG.md b/experimental/PropertyDDS/examples/partial-checkout/CHANGELOG.md index 1f8e4b723f31..53499c02006c 100644 --- a/experimental/PropertyDDS/examples/partial-checkout/CHANGELOG.md +++ b/experimental/PropertyDDS/examples/partial-checkout/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/partial-checkout +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/examples/property-inspector/CHANGELOG.md b/experimental/PropertyDDS/examples/property-inspector/CHANGELOG.md index f88a5b296ab6..59c1ff7f7b9a 100644 --- a/experimental/PropertyDDS/examples/property-inspector/CHANGELOG.md +++ b/experimental/PropertyDDS/examples/property-inspector/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/property-inspector +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/examples/schemas/CHANGELOG.md b/experimental/PropertyDDS/examples/schemas/CHANGELOG.md index e5fb48f20c75..f69bd97df60b 100644 --- a/experimental/PropertyDDS/examples/schemas/CHANGELOG.md +++ b/experimental/PropertyDDS/examples/schemas/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/schemas +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-binder/CHANGELOG.md b/experimental/PropertyDDS/packages/property-binder/CHANGELOG.md index 928a9e712c10..8d8eb774a685 100644 --- a/experimental/PropertyDDS/packages/property-binder/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-binder/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-binder +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-changeset/CHANGELOG.md b/experimental/PropertyDDS/packages/property-changeset/CHANGELOG.md index 1ff5f1641877..32db9c8648e5 100644 --- a/experimental/PropertyDDS/packages/property-changeset/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-changeset/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-changeset +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-changeset/tsconfig.json b/experimental/PropertyDDS/packages/property-changeset/tsconfig.json index 7fb432d8f282..25748543bab3 100644 --- a/experimental/PropertyDDS/packages/property-changeset/tsconfig.json +++ b/experimental/PropertyDDS/packages/property-changeset/tsconfig.json @@ -3,7 +3,6 @@ "exclude": ["src/test/**/*"], "compilerOptions": { "strict": false, - "declarationDir": "./dist", "rootDir": "./src", "outDir": "./dist", "composite": true, diff --git a/experimental/PropertyDDS/packages/property-common/CHANGELOG.md b/experimental/PropertyDDS/packages/property-common/CHANGELOG.md index 7345ae93f547..3f0062ea9ebe 100644 --- a/experimental/PropertyDDS/packages/property-common/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-common/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-common +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-common/platform-dependent/CHANGELOG.md b/experimental/PropertyDDS/packages/property-common/platform-dependent/CHANGELOG.md index fdd5a6b6aade..91a7891cff98 100644 --- a/experimental/PropertyDDS/packages/property-common/platform-dependent/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-common/platform-dependent/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/platform-dependent +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-dds/CHANGELOG.md b/experimental/PropertyDDS/packages/property-dds/CHANGELOG.md index 0ea8e83e0c41..e02e5db08e07 100644 --- a/experimental/PropertyDDS/packages/property-dds/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-dds/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-dds +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-inspector-table/CHANGELOG.md b/experimental/PropertyDDS/packages/property-inspector-table/CHANGELOG.md index 49cd9e0c9c0b..df77fd4d9503 100644 --- a/experimental/PropertyDDS/packages/property-inspector-table/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-inspector-table/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-inspector-table +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-inspector-table/tsconfig.json b/experimental/PropertyDDS/packages/property-inspector-table/tsconfig.json index 9678ba258c26..5aa4129937cf 100644 --- a/experimental/PropertyDDS/packages/property-inspector-table/tsconfig.json +++ b/experimental/PropertyDDS/packages/property-inspector-table/tsconfig.json @@ -4,7 +4,6 @@ "jsx": "react", "resolveJsonModule": true, "typeRoots": ["../node_modules/@types"], - "declarationDir": "./dist", "outDir": "./dist", }, "exclude": ["dist", "node_modules"], diff --git a/experimental/PropertyDDS/packages/property-properties/CHANGELOG.md b/experimental/PropertyDDS/packages/property-properties/CHANGELOG.md index 1a621ccacf1e..bca4abc0e470 100644 --- a/experimental/PropertyDDS/packages/property-properties/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-properties/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-properties +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-proxy/CHANGELOG.md b/experimental/PropertyDDS/packages/property-proxy/CHANGELOG.md index 39b83d1b2881..a6567b170f44 100644 --- a/experimental/PropertyDDS/packages/property-proxy/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-proxy/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-proxy +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-query/CHANGELOG.md b/experimental/PropertyDDS/packages/property-query/CHANGELOG.md index a14cae773a1b..87ab91061214 100644 --- a/experimental/PropertyDDS/packages/property-query/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-query/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-query +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/PropertyDDS/packages/property-shared-tree-interop/CHANGELOG.md b/experimental/PropertyDDS/packages/property-shared-tree-interop/CHANGELOG.md index a6a0509a0bea..04440508ebd1 100644 --- a/experimental/PropertyDDS/packages/property-shared-tree-interop/CHANGELOG.md +++ b/experimental/PropertyDDS/packages/property-shared-tree-interop/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-shared-tree-interop +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 ### Minor Changes diff --git a/experimental/PropertyDDS/services/property-query-service/CHANGELOG.md b/experimental/PropertyDDS/services/property-query-service/CHANGELOG.md index 22e19368a40d..792a04c14393 100644 --- a/experimental/PropertyDDS/services/property-query-service/CHANGELOG.md +++ b/experimental/PropertyDDS/services/property-query-service/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/property-query-service +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/dds/attributable-map/CHANGELOG.md b/experimental/dds/attributable-map/CHANGELOG.md index 2c6bfd2a8e52..e6c54664701d 100644 --- a/experimental/dds/attributable-map/CHANGELOG.md +++ b/experimental/dds/attributable-map/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/attributable-map +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/dds/ot/ot/CHANGELOG.md b/experimental/dds/ot/ot/CHANGELOG.md index c110764890ab..b4959c09768c 100644 --- a/experimental/dds/ot/ot/CHANGELOG.md +++ b/experimental/dds/ot/ot/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/ot +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/dds/ot/sharejs/json1/CHANGELOG.md b/experimental/dds/ot/sharejs/json1/CHANGELOG.md index 989c6ebc496f..d0f51280bd15 100644 --- a/experimental/dds/ot/sharejs/json1/CHANGELOG.md +++ b/experimental/dds/ot/sharejs/json1/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/sharejs-json1 +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/dds/sequence-deprecated/CHANGELOG.md b/experimental/dds/sequence-deprecated/CHANGELOG.md index 3dac59c81b30..8fa656b9a2b9 100644 --- a/experimental/dds/sequence-deprecated/CHANGELOG.md +++ b/experimental/dds/sequence-deprecated/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/sequence-deprecated +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/dds/tree/CHANGELOG.md b/experimental/dds/tree/CHANGELOG.md index e37c19c26268..4ce15dd3e3d2 100644 --- a/experimental/dds/tree/CHANGELOG.md +++ b/experimental/dds/tree/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/tree +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/dds/tree2/CHANGELOG.md b/experimental/dds/tree2/CHANGELOG.md index c82e424237a7..a38c388d8957 100644 --- a/experimental/dds/tree2/CHANGELOG.md +++ b/experimental/dds/tree2/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/tree2 +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 ### Minor Changes diff --git a/experimental/dds/tree2/api-report/tree2.api.md b/experimental/dds/tree2/api-report/tree2.api.md index 809acfc3cc03..600647acbe9e 100644 --- a/experimental/dds/tree2/api-report/tree2.api.md +++ b/experimental/dds/tree2/api-report/tree2.api.md @@ -22,6 +22,18 @@ import { StableId } from '@fluidframework/runtime-definitions'; import type { Static } from '@sinclair/typebox'; import type { TSchema } from '@sinclair/typebox'; +// @alpha +export function adaptEnum>(factory: SchemaFactory, members: TEnum): ((value: TValue) => { + readonly value: TValue; +}) & { readonly [Property in keyof TEnum]: { + new (data?: EmptyObject | undefined): { + readonly value: TEnum[Property]; + }; + readonly identifier: `${TScope}.${TEnum[Property]}`; + readonly kind: NodeKind.Object; + readonly info: unknown; + }; }; + // @alpha export interface Adapters { // (undocumented) @@ -412,6 +424,18 @@ export type EmptyObject = {}; // @alpha export function encodeTreeSchema(schema: TreeStoredSchema): JsonCompatible; +// @alpha +export function enumFromStrings(factory: SchemaFactory, members: Members[]): ((value: TValue) => { + readonly value: TValue; +}) & Record; + // @beta export type Events = { [P in (string | symbol) & keyof E as IsEvent extends true ? P : never]: E[P]; @@ -1474,7 +1498,7 @@ export interface SchemaEvents { } // @beta @sealed -export class SchemaFactory { +export class SchemaFactory { constructor(scope: TScope); readonly boolean: TreeNodeSchema<"com.fluidframework.leaf.boolean", NodeKind.Leaf, boolean, boolean>; fixRecursiveReference(...types: T): void; @@ -1602,6 +1626,16 @@ export interface SharedTreeOptions extends Partial { // @alpha export function singleTextCursor(root: JsonableTree): ITreeCursorSynchronous; +// @alpha +export function singletonSchema(factory: SchemaFactory, name: TName): { + new (data?: EmptyObject): { + readonly value: TName; + }; + readonly identifier: `${TScope}.${TName}`; + readonly kind: NodeKind.Object; + readonly info: unknown; +}; + // @alpha export type StableNodeKey = Brand; @@ -1923,6 +1957,9 @@ TFields extends { } : EmptyObject ][_InlineTrick]; +// @alpha +export function typedObjectValues(object: Record): TValues[]; + // @alpha export const typeNameSymbol: unique symbol; diff --git a/experimental/dds/tree2/src/class-tree/index.ts b/experimental/dds/tree2/src/class-tree/index.ts index 6a6df34c9e3d..f31840e7fd51 100644 --- a/experimental/dds/tree2/src/class-tree/index.ts +++ b/experimental/dds/tree2/src/class-tree/index.ts @@ -23,6 +23,13 @@ export { SchemaFactory } from "./schemaFactory"; export { nodeApi as Tree, TreeApi, TreeNodeEvents } from "./treeApi"; export { toFlexConfig } from "./toFlexSchema"; +export { + adaptEnum, + enumFromStrings, + singletonSchema, + typedObjectValues, +} from "./schemaCreationUtilities"; + // Below here are things that are used by the above, but not part of the desired API surface. import * as InternalClassTreeTypes from "./internal"; export { InternalClassTreeTypes }; diff --git a/experimental/dds/tree2/src/class-tree/schemaCreationUtilities.ts b/experimental/dds/tree2/src/class-tree/schemaCreationUtilities.ts new file mode 100644 index 000000000000..dd0a33103eee --- /dev/null +++ b/experimental/dds/tree2/src/class-tree/schemaCreationUtilities.ts @@ -0,0 +1,178 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import { UsageError } from "@fluidframework/telemetry-utils"; +import { fail } from "../util"; +import { EmptyObject } from "../feature-libraries"; +import { SchemaFactory } from "./schemaFactory"; +// This type is referred to by the base type generated by schema. +// Adding the import of it here prevents TypeScript from generating inline includes for it in the d.ts file. +// If we let TypeScript generate these includes, they use relative paths which break API extractor's rollup. +// eslint-disable-next-line unused-imports/no-unused-imports +import { NodeFromSchema, type NodeKind as _dummy } from "./schemaTypes"; + +/** + * Create a schema for a node with no state. + * @remarks + * This is commonly used in unions when the only information needed is which kind of node the value is. + * Enums are a common example of this pattern. + * @alpha + */ +export function singletonSchema( + factory: SchemaFactory, + name: TName, +) { + return class SingletonSchema extends factory.object(name, {}) { + public constructor(data?: EmptyObject) { + super(data ?? {}); + } + public get value(): TName { + return name; + } + }; +} + +/** + * Converts an enum into a collection of schema which can be used in a union. + * @remarks + * Currently only supports `string` enums. + * @example + * ```typescript + * enum Mode { + * a = "A", + * b = "B", + * } + * const ModeNodes = adaptEnum(schema, Mode); + * type ModeNodes = NodeFromSchema<(typeof ModeNodes)[keyof typeof ModeNodes]>; + * const nodeFromString: ModeNodes = ModeNodes(Mode.a); + * const nodeFromSchema: ModeNodes = new ModeNodes.a(); + * const nameFromNode: Mode = nodeFromSchema.value; + * class Parent extends schemaFactory.object("Parent", { + * mode: typedObjectValues(ModeNodes), + * }) {} + * ``` + * @privateRemarks + * TODO: + * Extends this to support numeric enums. + * Maybe require an explicit nested scope to group them under, or at least a warning about collisions. + * Maybe just provide `SchemaFactory.nested` to east creating nested scopes? + * @alpha + */ +export function adaptEnum>( + factory: SchemaFactory, + members: TEnum, +) { + type Values = TEnum[keyof TEnum]; + const values = Object.values(members) as Values[]; + const inverse = new Map(Object.entries(members).map(([key, value]) => [value, key])) as Map< + Values, + keyof TEnum + >; + + if (inverse.size !== values.length) { + throw new UsageError("All members of enums must have distinct values."); + } + + type TOut = { + readonly [Property in keyof TEnum]: ReturnType< + typeof singletonSchema + >; + }; + const factoryOut = (value: TValue) => { + return new out[inverse.get(value) ?? fail("missing enum value")]({}) as NodeFromSchema< + ReturnType> + >; + }; + const out = factoryOut as typeof factoryOut & TOut; + for (const [key, value] of Object.entries(members)) { + Object.defineProperty(out, key, { + enumerable: true, + configurable: false, + writable: false, + value: singletonSchema(factory, value), + }); + } + + return out; +} + +/** + * `Object.values`, but with more specific types. + * @alpha + */ +export function typedObjectValues( + object: Record, +): TValues[] { + return Object.values(object); +} + +/** + * Converts an array of distinct strings into a collection of schema which can be used like an enum style union. + * @remarks + * The returned collection is also a function which can be used to convert strings into {@link Unhydrated} nodes in the union. + * Each node type has a `.value` getter which returns the associated string. + * + * The produced nodes use the provided strings as their `name`, and don't store any data beyond that. + * @example + * ```typescript + * const Mode = enumFromStrings(schemaFactory, ["Fun", "Cool"]); + * type Mode = NodeFromSchema<(typeof Mode)[keyof typeof Mode]>; + * const nodeFromString: Mode = Mode("Fun"); + * const nodeFromSchema: Mode = new Mode.Fun(); + * const nameFromNode = nodeFromSchema.value; + * + * class Parent extends schemaFactory.object("Parent", { mode: typedObjectValues(Mode) }) {} + * ``` + * @alpha + */ +export function enumFromStrings( + factory: SchemaFactory, + members: Members[], +) { + const names = new Set(members); + if (names.size !== members.length) { + throw new UsageError("All members of enums must have distinct names"); + } + + type TOut = Record>>; + const factoryOut = (value: TValue) => { + return new out[value]({}) as NodeFromSchema< + ReturnType> + >; + }; + const out = factoryOut as typeof factoryOut & TOut; + for (const name of members) { + Object.defineProperty(out, name, { + enumerable: true, + configurable: false, + writable: false, + value: singletonSchema(factory, name), + }); + } + + return out; +} + +// TODO: Why does this one generate an invalid d.ts file if exported? +// Tracked by https://github.com/microsoft/TypeScript/issues/56718 +// TODO: replace enumFromStrings above with this simpler implementation when the TypeScript bug is resolved. +function _enumFromStrings2( + factory: SchemaFactory, + members: Members, +) { + const enumObject: { + [key in keyof Members as Members[key] extends string ? Members[key] : string]: Members[key]; + } = Object.create(null); + for (const name of members) { + Object.defineProperty(enumObject, name, { + enumerable: true, + configurable: false, + writable: false, + value: name, + }); + } + + return adaptEnum(factory, enumObject); +} diff --git a/experimental/dds/tree2/src/class-tree/schemaFactory.ts b/experimental/dds/tree2/src/class-tree/schemaFactory.ts index bf582388838a..5896962fdc21 100644 --- a/experimental/dds/tree2/src/class-tree/schemaFactory.ts +++ b/experimental/dds/tree2/src/class-tree/schemaFactory.ts @@ -105,7 +105,7 @@ type UnbrandedName = T["name"] extends TreeNodeSch * * @sealed @beta */ -export class SchemaFactory { +export class SchemaFactory { private readonly structuralTypes: Map = new Map(); /** diff --git a/experimental/dds/tree2/src/feature-libraries/sequence-field/prune.ts b/experimental/dds/tree2/src/feature-libraries/sequence-field/prune.ts index 263ed4398517..713f6c04e7bf 100644 --- a/experimental/dds/tree2/src/feature-libraries/sequence-field/prune.ts +++ b/experimental/dds/tree2/src/feature-libraries/sequence-field/prune.ts @@ -5,7 +5,7 @@ import { Changeset } from "./types"; import { MarkListFactory } from "./markListFactory"; -import { withNodeChange } from "./utils"; +import { omitMarkEffect, withNodeChange } from "./utils"; export type NodeChangePruner = (change: TNodeChange) => TNodeChange | undefined; @@ -14,12 +14,14 @@ export function prune( pruneNode: NodeChangePruner, ): Changeset { const pruned = new MarkListFactory(); - for (const mark of changeset) { + for (let mark of changeset) { if (mark.changes !== undefined) { - pruned.push(withNodeChange(mark, pruneNode(mark.changes))); - } else { - pruned.push(mark); + mark = withNodeChange(mark, pruneNode(mark.changes)); } + if (mark.type === "Placeholder") { + mark = omitMarkEffect(mark); + } + pruned.push(mark); } return pruned.list; } diff --git a/experimental/dds/tree2/src/index.ts b/experimental/dds/tree2/src/index.ts index 7f96c964b785..e78b00ab555a 100644 --- a/experimental/dds/tree2/src/index.ts +++ b/experimental/dds/tree2/src/index.ts @@ -262,6 +262,12 @@ export { TreeMapNode, InsertableTreeNodeFromImplicitAllowedTypes, + // experimental @alpha APIs: + adaptEnum, + enumFromStrings, + singletonSchema, + typedObjectValues, + // test recursive schema for checking that d.ts files handles schema correctly test_RecursiveObject, test_RecursiveObject_base, diff --git a/experimental/dds/tree2/src/test/class-tree/schemaCreationUtilities.spec.ts b/experimental/dds/tree2/src/test/class-tree/schemaCreationUtilities.spec.ts new file mode 100644 index 000000000000..a35243e6c776 --- /dev/null +++ b/experimental/dds/tree2/src/test/class-tree/schemaCreationUtilities.spec.ts @@ -0,0 +1,183 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import { strict as assert } from "node:assert"; + +import { MockFluidDataStoreRuntime } from "@fluidframework/test-runtime-utils"; +import { unreachableCase } from "@fluidframework/core-utils"; +import { NodeFromSchema, SchemaFactory, TreeConfiguration, TreeView } from "../../class-tree"; +import { TreeFactory } from "../../treeFactory"; +import { + enumFromStrings, + typedObjectValues, + adaptEnum, + // eslint-disable-next-line import/no-internal-modules +} from "../../class-tree/schemaCreationUtilities"; + +const schema = new SchemaFactory("test"); + +describe("schemaCreationUtilities", () => { + it("enum type switch", () => { + const Mode = enumFromStrings(schema, ["Fun", "Cool", "Bonus"]); + class Parent extends schema.object("Parent", { mode: Object.values(Mode) }) {} + const config = new TreeConfiguration( + Parent, + () => + new Parent({ + mode: new Mode.Bonus({}), + }), + ); + + const factory = new TreeFactory({}); + const tree = factory.create(new MockFluidDataStoreRuntime(), "tree"); + const view: TreeView = tree.schematize(config); + const mode = view.root.mode; + switch (true) { + case mode instanceof Mode.Bonus: { + // This one runs + break; + } + case mode instanceof Mode.Fun: { + assert.fail(); + } + case mode instanceof Mode.Cool: { + assert.fail(); + } + default: + assert.fail(); + } + }); + + it("enumFromStrings example", () => { + const schemaFactory = new SchemaFactory("x"); + const Mode = enumFromStrings(schemaFactory, ["Fun", "Cool"]); + type Mode = NodeFromSchema<(typeof Mode)[keyof typeof Mode]>; + const nodeFromString: Mode = Mode("Fun"); + const nodeFromSchema: Mode = new Mode.Fun(); + // eslint-disable-next-line no-constant-condition + if (false) { + // Check this compiles, but don't run it since node is unhydrated + const nameFromNode: "Fun" | "Cool" = nodeFromSchema.value; + } + + class Parent extends schemaFactory.object("Parent", { mode: typedObjectValues(Mode) }) {} + }); + + it("adaptEnum example", () => { + const schemaFactory = new SchemaFactory("x"); + + enum Mode { + a = "A", + b = "B", + } + const ModeNodes = adaptEnum(schema, Mode); + type ModeNodes = NodeFromSchema<(typeof ModeNodes)[keyof typeof ModeNodes]>; + const nodeFromString: ModeNodes = ModeNodes(Mode.a); + const nodeFromSchema: ModeNodes = new ModeNodes.a(); + // eslint-disable-next-line no-constant-condition + if (false) { + // Check this compiles, but don't run it since node is unhydrated + const nameFromNode: Mode = nodeFromSchema.value; + } + class Parent extends schemaFactory.object("Parent", { + mode: typedObjectValues(ModeNodes), + }) {} + }); + + it("enum value switch", () => { + const Mode = enumFromStrings(schema, ["Fun", "Cool", "Bonus"]); + class Parent extends schema.object("Parent", { mode: typedObjectValues(Mode) }) {} + const config = new TreeConfiguration( + Parent, + () => + new Parent({ + mode: new Mode.Bonus({}), + }), + ); + + const factory = new TreeFactory({}); + const tree = factory.create(new MockFluidDataStoreRuntime(), "tree"); + const view: TreeView = tree.schematize(config); + const mode = view.root.mode; + switch (mode.value) { + case "Fun": { + assert.fail(); + } + case "Cool": { + assert.fail(); + } + case "Bonus": { + // This one runs + break; + } + default: + unreachableCase(mode.value); + } + }); + + it("enum interop - enumFromStrings", () => { + const factory = new TreeFactory({}); + + enum Day { + Today = "Today", + Tomorrow = "Tomorrow", + } + + const DayNodes = enumFromStrings(schema, typedObjectValues(Day)); + + const tree = factory.create(new MockFluidDataStoreRuntime(), "tree"); + + const day = Day.Today; + + const view = tree.schematize( + new TreeConfiguration(typedObjectValues(DayNodes), () => DayNodes(day)), + ); + + switch (view.root.value) { + case Day.Today: { + // This one runs + break; + } + case Day.Tomorrow: { + assert.fail(); + } + default: + unreachableCase(view.root.value); + } + }); + + it("enum interop - adaptEnum", () => { + const factory = new TreeFactory({}); + + enum Day { + Today = "today", + Tomorrow = "tomorrow", + } + + const DayNodes = adaptEnum(schema, Day); + + const tree = factory.create(new MockFluidDataStoreRuntime(), "tree"); + + // Can convert enum to unhydrated node: + const x = DayNodes(Day.Today); + // Can construct unhydrated node from enum's key: + const y = new DayNodes.Today({}); + + const view = tree.schematize( + new TreeConfiguration(typedObjectValues(DayNodes), () => DayNodes(Day.Today)), + ); + + switch (view.root.value) { + case Day.Today: { + break; + } + case Day.Tomorrow: { + assert.fail(); + } + default: + unreachableCase(view.root); + } + }); +}); diff --git a/experimental/dds/tree2/src/test/feature-libraries/sequence-field/sequenceChangeRebaser.spec.ts b/experimental/dds/tree2/src/test/feature-libraries/sequence-field/sequenceChangeRebaser.spec.ts index 7154bf2c1d10..4efdd916d772 100644 --- a/experimental/dds/tree2/src/test/feature-libraries/sequence-field/sequenceChangeRebaser.spec.ts +++ b/experimental/dds/tree2/src/test/feature-libraries/sequence-field/sequenceChangeRebaser.spec.ts @@ -18,7 +18,7 @@ import { ChildStateGenerator, FieldStateTree } from "../../exhaustiveRebaserUtil import { runExhaustiveComposeRebaseSuite } from "../../rebaserAxiomaticTests"; import { TestChange } from "../../testChange"; import { deepFreeze } from "../../utils"; -import { brand } from "../../../util"; +import { IdAllocator, brand, idAllocatorFromMaxId, makeArray } from "../../../util"; // eslint-disable-next-line import/no-internal-modules import { rebaseRevisionMetadataFromInfo } from "../../../feature-libraries/modular-schema/modularChangeFamily"; import { @@ -161,9 +161,10 @@ describe("SequenceField - Rebaser Axioms", () => { const r1 = rebaseTagged(change1, change2); const r2 = rebaseTagged(r1, inv); + const change1NoLineage = withoutLineage(change1.change); const r2NoLineage = withoutLineage(r2.change); // We do not expect exact equality because r2 may have accumulated some lineage. - assert.deepEqual(r2NoLineage, change1.change); + assert.deepEqual(r2NoLineage, change1NoLineage); } } }); @@ -206,7 +207,8 @@ describe("SequenceField - Rebaser Axioms", () => { const inv = tagChange(invert(change2), tag6); const r1 = rebaseTagged(change1, change2); const r2 = rebaseTagged(r1, inv); - assert.deepEqual(withoutLineage(r2.change), change1.change); + const change1NoLineage = withoutLineage(change1.change); + assert.deepEqual(withoutLineage(r2.change), change1NoLineage); } } }); @@ -356,20 +358,37 @@ describe("SequenceField - Rebaser Axioms", () => { }); }); +interface NodeState { + /** + * Unique ID associated with the node. + */ + id: number; + /** + * The list of intentions that have been applied to this subtree. + * This is used to generate new nested changes for a node. + */ + nested: number[]; +} + interface TestState { /** - * The current length of the sequence being edited + * Represents the state of the sequence field. */ - length: number; + currentState: NodeState[]; + config: TestConfig; +} + +interface TestConfig { /** - * The highest index that will be iterated to to generate inserts, deletes, and moves + * The maximum length that the sequence should be as part of the test. */ - maxIndex: number; + maxLength: number; /** * An array of node counts to operate on. For instance, passing [1, 3] would generate inserts, moves, and * deletes that operate on one node at a time and then 3 nodes at a time. */ numNodes: number[]; + allocator: IdAllocator; } type SequenceFieldTestState = FieldStateTree; @@ -382,113 +401,146 @@ const generateChildStates: ChildStateGenerator = funct tagFromIntention: (intention: number) => RevisionTag, mintIntention: () => number, ): Iterable { - const { numNodes, maxIndex } = state.content; - const iterationCap = Math.min(maxIndex, state.content.length); + const { currentState, config } = state.content; + // TODO: support for undoing earlier edits + // TODO: fix bugs encountered when this is enabled // Undo the most recent edit - if (state.mostRecentEdit !== undefined) { - assert(state.parent?.content !== undefined, "Must have parent state to undo"); - const undoIntention = mintIntention(); - const invertedEdit = invert(state.mostRecentEdit.changeset); - yield { - content: state.parent.content, - mostRecentEdit: { - changeset: tagChange(invertedEdit, tagFromIntention(undoIntention)), - intention: undoIntention, - description: `Undo:${state.mostRecentEdit.description}`, - }, - parent: state, - }; - } + // if (state.mostRecentEdit !== undefined) { + // assert(state.parent?.content !== undefined, "Must have parent state to undo"); + // const undoIntention = mintIntention(); + // const invertedEdit = invert(state.mostRecentEdit.changeset); + // yield { + // content: state.parent.content, + // mostRecentEdit: { + // changeset: tagChange(invertedEdit, tagFromIntention(undoIntention)), + // intention: undoIntention, + // description: `Undo(${state.mostRecentEdit.description})`, + // }, + // parent: state, + // }; + // } + + for (const nodeCount of config.numNodes) { + // Insert nodeCount nodes + if (nodeCount + currentState.length <= config.maxLength) { + const inserted = makeArray(nodeCount, () => ({ + id: config.allocator.allocate(), + nested: [], + })); + const insertedString = inserted.map((n) => n.id).join(","); + for (let i = 0; i <= currentState.length; i += 1) { + const insertIntention = mintIntention(); + const newState = [...currentState]; + newState.splice(i, 0, ...inserted); + yield { + content: { + currentState: newState, + config, + }, + mostRecentEdit: { + changeset: tagChange( + Change.insert(i, nodeCount), + tagFromIntention(insertIntention), + ), + intention: insertIntention, + description: `Add(${insertedString}@${i})`, + }, + parent: state, + }; + } + } - for (const nodeCount of numNodes) { - for (let i = 0; i <= iterationCap; i++) { - // Insert nodeCount nodes - const insertIntention = mintIntention(); + const maxDetachIndex = currentState.length - nodeCount; + + // Delete nodeCount nodes + for (let iSrc = 0; iSrc <= maxDetachIndex; iSrc += 1) { + const stateWithoutDetached = [...currentState]; + const detached = stateWithoutDetached.splice(iSrc, nodeCount); + const detachedString = detached.map((n) => n.id).join(","); + const deleteIntention = mintIntention(); yield { content: { - length: state.content.length + nodeCount, - maxIndex, - numNodes, + currentState: stateWithoutDetached, + config, }, mostRecentEdit: { changeset: tagChange( - Change.insert(i, nodeCount), - tagFromIntention(insertIntention), + Change.delete(iSrc, nodeCount), + tagFromIntention(deleteIntention), ), - intention: insertIntention, - description: `Insert${nodeCount}${nodeCount === 1 ? "Node" : "Nodes"}At${i}`, + intention: deleteIntention, + description: `Del(${detachedString})`, }, parent: state, }; - // Don't generate deletes past the length of the sequence - if (i + nodeCount <= state.content.length) { - // Delete nodeCount nodes - const deleteIntention = mintIntention(); + // Move nodeCount nodes + for (let iDst = 0; iDst <= currentState.length; iDst += 1) { + const moveInIntention = mintIntention(); + const newState = [...stateWithoutDetached]; + newState.splice(iDst - iDst < iSrc ? 0 : nodeCount, 0, ...detached); yield { content: { - length: state.content.length - nodeCount, - maxIndex, - numNodes, + currentState: newState, + config, }, mostRecentEdit: { changeset: tagChange( - Change.delete(i, nodeCount), - tagFromIntention(deleteIntention), - ), - intention: deleteIntention, - description: `Delete${nodeCount}${ - nodeCount === 1 ? "Node" : "Nodes" - }At${i}`, - }, - parent: state, - }; - } - - // Only generate moves when we're moving less than the length of the whole sequence - if (state.content.length > nodeCount) { - // MoveIn nodeCount nodes - const moveInIntention = mintIntention(); - yield { - content: state.content, - mostRecentEdit: { - changeset: tagChange( - Change.move(1, nodeCount, i), + Change.move(iSrc, nodeCount, iDst), tagFromIntention(moveInIntention), ), intention: moveInIntention, - description: `MoveIn${nodeCount}${ - nodeCount === 1 ? "Node" : "Nodes" - }From1To${i}`, - }, - parent: state, - }; - - // MoveOut nodeCount nodes - const moveOutIntention = mintIntention(); - yield { - content: state.content, - mostRecentEdit: { - changeset: tagChange( - Change.move(i, nodeCount, 1), - tagFromIntention(moveOutIntention), - ), - intention: moveOutIntention, - description: `MoveOut${nodeCount}${ - nodeCount === 1 ? "Node" : "Nodes" - }From${i}To1`, + description: `Mov(${detachedString})To${iDst}`, }, parent: state, }; } } } + + // TODO: fix bugs encountered when this is enabled + // Made nested changes to a node + // for (let i = 0; i < currentState.length; i += 1) { + // const modifyIntention = mintIntention(); + // const nestedChange = config.allocator.allocate(); + // const newState = [...currentState]; + // const node = currentState[i]; + // newState.splice(i, 1, { ...node, nested: [...node.nested, nestedChange] }); + // yield { + // content: { + // currentState: newState, + // config, + // }, + // mostRecentEdit: { + // changeset: tagChange( + // Change.modify(i, TestChange.mint(node.nested, nestedChange)), + // tagFromIntention(modifyIntention), + // ), + // intention: modifyIntention, + // description: `Mod(${nestedChange}on${node.id})`, + // }, + // parent: state, + // }; + // } }; -describe.skip("SequenceField - State-based Rebaser Axioms", () => { +describe("SequenceField - State-based Rebaser Axioms", () => { + const allocator = idAllocatorFromMaxId(); + const startingLength = 2; + const startingState: NodeState[] = makeArray(startingLength, () => ({ + id: allocator.allocate(), + nested: [], + })); runExhaustiveComposeRebaseSuite( - [{ content: { length: 4, numNodes: [1], maxIndex: 2 } }], + [ + { + content: { + currentState: startingState, + config: { maxLength: 5, numNodes: [2], allocator }, + }, + }, + ], generateChildStates, { rebase, @@ -507,16 +559,16 @@ describe.skip("SequenceField - State-based Rebaser Axioms", () => { return false; } - return assert.deepEqual( - withoutLineage(change1.change), - withoutLineage(change2.change), - ); + const pruned1 = prune(change1.change); + const pruned2 = prune(change2.change); + + return assert.deepEqual(withoutLineage(pruned1), withoutLineage(pruned2)); }, }, { groupSubSuites: false, numberOfEditsToVerifyAssociativity: 3, - skipRebaseOverCompose: true, + skipRebaseOverCompose: false, }, ); }); diff --git a/experimental/dds/tree2/src/test/feature-libraries/sequence-field/utils.ts b/experimental/dds/tree2/src/test/feature-libraries/sequence-field/utils.ts index fcdc45d2d4b2..1ea1266c374c 100644 --- a/experimental/dds/tree2/src/test/feature-libraries/sequence-field/utils.ts +++ b/experimental/dds/tree2/src/test/feature-libraries/sequence-field/utils.ts @@ -242,12 +242,13 @@ export function continuingAllocator(changes: TaggedChange> export function withoutLineage(changeset: SF.Changeset): SF.Changeset { const factory = new SF.MarkListFactory(); for (const mark of changeset) { - if (mark.cellId?.lineage === undefined) { + if (mark.cellId?.lineage === undefined && mark.cellId?.adjacentCells === undefined) { factory.push(mark); } else { const cloned = SF.cloneMark(mark); assert(cloned.cellId !== undefined, "Should have cell ID"); delete cloned.cellId.lineage; + delete cloned.cellId.adjacentCells; factory.push(cloned); } } diff --git a/experimental/dds/tree2/src/test/simple-tree/utils.ts b/experimental/dds/tree2/src/test/simple-tree/utils.ts index fcc6d7af6ca3..b26897e80fea 100644 --- a/experimental/dds/tree2/src/test/simple-tree/utils.ts +++ b/experimental/dds/tree2/src/test/simple-tree/utils.ts @@ -59,7 +59,7 @@ export function getOldRoot( * Helper for making small test schemas. */ export function makeSchema( - fn: (factory: SchemaFactory) => TSchema, + fn: (factory: SchemaFactory) => TSchema, ) { return fn(new SchemaFactory(`test.schema.${Math.random().toString(36).slice(2)}`)); } @@ -68,12 +68,12 @@ export function makeSchema( * Given the schema and initial tree data, returns a hydrated tree node. */ export function getRoot( - schema: TSchema | ((factory: SchemaFactory) => TSchema), + schema: TSchema | ((factory: SchemaFactory) => TSchema), data: InsertableTreeFieldFromImplicitField, ): TreeFieldFromImplicitField { if (typeof schema === "function") { // eslint-disable-next-line no-param-reassign - schema = makeSchema(schema as (builder: SchemaFactory) => TSchema); + schema = makeSchema(schema as (builder: SchemaFactory) => TSchema); } const config = new TreeConfiguration(schema, () => data); const factory = new TreeFactory({ diff --git a/experimental/dds/tree2/src/test/testChange.ts b/experimental/dds/tree2/src/test/testChange.ts index 0369a8cdc25f..2bc68476b84d 100644 --- a/experimental/dds/tree2/src/test/testChange.ts +++ b/experimental/dds/tree2/src/test/testChange.ts @@ -225,7 +225,7 @@ export class TestChangeRebaser implements ChangeRebaser { } export class UnrebasableTestChangeRebaser extends TestChangeRebaser { - public rebase(change: TestChange, over: TaggedChange): TestChange { + public override rebase(change: TestChange, over: TaggedChange): TestChange { assert.fail("Unexpected call to rebase"); } } @@ -235,17 +235,17 @@ export class NoOpChangeRebaser extends TestChangeRebaser { public invertedCount = 0; public composedCount = 0; - public rebase(change: TestChange, over: TaggedChange): TestChange { + public override rebase(change: TestChange, over: TaggedChange): TestChange { this.rebasedCount += 1; return change; } - public invert(change: TaggedChange): TestChange { + public override invert(change: TaggedChange): TestChange { this.invertedCount += 1; return change.change; } - public compose(changes: TaggedChange[]): TestChange { + public override compose(changes: TaggedChange[]): TestChange { this.composedCount += changes.length; return changes.length === 0 ? emptyChange : changes[0].change; } @@ -261,7 +261,7 @@ export class ConstrainedTestChangeRebaser extends TestChangeRebaser { super(); } - public rebase(change: TestChange, over: TaggedChange): TestChange { + public override rebase(change: TestChange, over: TaggedChange): TestChange { assert(this.constraint(change, over)); return super.rebase(change, over); } diff --git a/experimental/dds/tree2/src/test/tsconfig.json b/experimental/dds/tree2/src/test/tsconfig.json index db785028a805..398985da2d6e 100644 --- a/experimental/dds/tree2/src/test/tsconfig.json +++ b/experimental/dds/tree2/src/test/tsconfig.json @@ -4,6 +4,7 @@ "lib": ["ES2019", "ES2018.Promise", "DOM", "DOM.Iterable"], "noImplicitAny": true, "noUnusedLocals": false, + "noImplicitOverride": true, "rootDir": "./", "outDir": "../../dist/test", "types": ["node", "mocha"], diff --git a/experimental/framework/data-objects/CHANGELOG.md b/experimental/framework/data-objects/CHANGELOG.md index 0efd515428a0..9e439ffa5e4d 100644 --- a/experimental/framework/data-objects/CHANGELOG.md +++ b/experimental/framework/data-objects/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/data-objects +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/framework/last-edited/CHANGELOG.md b/experimental/framework/last-edited/CHANGELOG.md index 917d5805668c..7c77e07e729d 100644 --- a/experimental/framework/last-edited/CHANGELOG.md +++ b/experimental/framework/last-edited/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/last-edited +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/framework/react-inputs/CHANGELOG.md b/experimental/framework/react-inputs/CHANGELOG.md index e4f423c89211..e800fac39528 100644 --- a/experimental/framework/react-inputs/CHANGELOG.md +++ b/experimental/framework/react-inputs/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/react-inputs +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/experimental/framework/react-inputs/tsconfig.json b/experimental/framework/react-inputs/tsconfig.json index 72bf0f274afb..e53b666805a4 100644 --- a/experimental/framework/react-inputs/tsconfig.json +++ b/experimental/framework/react-inputs/tsconfig.json @@ -2,7 +2,6 @@ "extends": "@fluidframework/build-common/ts-common-config.json", "exclude": ["dist", "node_modules"], "compilerOptions": { - "declarationDir": "./dist", "rootDir": "./src", "outDir": "./dist", "jsx": "react", diff --git a/experimental/framework/tree-react-api/CHANGELOG.md b/experimental/framework/tree-react-api/CHANGELOG.md index 772d3c3f10bb..418e87a0755f 100644 --- a/experimental/framework/tree-react-api/CHANGELOG.md +++ b/experimental/framework/tree-react-api/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/tree-react-api +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/feeds/internal-build.txt b/feeds/internal-build.txt index 90b8ba89e88a..059adb274bfe 100644 --- a/feeds/internal-build.txt +++ b/feeds/internal-build.txt @@ -12,6 +12,7 @@ @fluid-internal/test-app-insights-logger @fluidframework/mocha-test-setup @fluid-experimental/odsp-client +@fluid-experimental/odsp-end-to-end-tests @fluidframework/test-runtime-utils @fluidframework/runtime-utils @fluidframework/runtime-definitions diff --git a/feeds/internal-test.txt b/feeds/internal-test.txt index 95c21512cd83..83e5bb8ba2dc 100644 --- a/feeds/internal-test.txt +++ b/feeds/internal-test.txt @@ -17,6 +17,7 @@ @fluid-private/stochastic-test-utils @fluidframework/mocha-test-setup @fluid-experimental/odsp-client +@fluid-experimental/odsp-end-to-end-tests @fluidframework/test-runtime-utils @fluidframework/runtime-utils @fluidframework/runtime-definitions diff --git a/feeds/public.txt b/feeds/public.txt index 8d35948a2ea5..6c80aefdea6d 100644 --- a/feeds/public.txt +++ b/feeds/public.txt @@ -10,6 +10,7 @@ @fluidframework/test-driver-definitions @fluidframework/mocha-test-setup @fluid-experimental/odsp-client +@fluid-experimental/odsp-end-to-end-tests @fluidframework/test-runtime-utils @fluidframework/runtime-utils @fluidframework/runtime-definitions diff --git a/packages/common/client-utils/CHANGELOG.md b/packages/common/client-utils/CHANGELOG.md index 56b4c7dffa6d..79fb8eac6e72 100644 --- a/packages/common/client-utils/CHANGELOG.md +++ b/packages/common/client-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/client-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/common/container-definitions/CHANGELOG.md b/packages/common/container-definitions/CHANGELOG.md index e67c635c4fa5..114e06fcad7a 100644 --- a/packages/common/container-definitions/CHANGELOG.md +++ b/packages/common/container-definitions/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/container-definitions +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/common/core-interfaces/CHANGELOG.md b/packages/common/core-interfaces/CHANGELOG.md index eec6783e7dbb..4fdcf4faa689 100644 --- a/packages/common/core-interfaces/CHANGELOG.md +++ b/packages/common/core-interfaces/CHANGELOG.md @@ -1,5 +1,15 @@ # @fluidframework/core-interfaces +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- telemetry-utils: Deprecate ConfigTypes and IConfigProviderBase ([#18597](https://github.com/microsoft/FluidFramework/issues/18597)) [39b9ff57c0](https://github.com/microsoft/FluidFramework/commits/39b9ff57c0184b72f0e3f9425922dda944995265) + + The types `ConfigTypes` and `IConfigProviderBase` have been deprecated in the @fluidframework/telemetry-utils package. + The types can now be found in the @fluidframework/core-interfaces package. Please replace any uses with the types from + @fluidframework/core-interfaces. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/common/core-utils/CHANGELOG.md b/packages/common/core-utils/CHANGELOG.md index f5a9ed5a6601..0bec14616e29 100644 --- a/packages/common/core-utils/CHANGELOG.md +++ b/packages/common/core-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/core-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/common/driver-definitions/CHANGELOG.md b/packages/common/driver-definitions/CHANGELOG.md index 54568dfd72ba..ef709e42c9ba 100644 --- a/packages/common/driver-definitions/CHANGELOG.md +++ b/packages/common/driver-definitions/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/driver-definitions +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/cell/CHANGELOG.md b/packages/dds/cell/CHANGELOG.md index aeafa44fa780..9e995cf8e662 100644 --- a/packages/dds/cell/CHANGELOG.md +++ b/packages/dds/cell/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/cell +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/counter/CHANGELOG.md b/packages/dds/counter/CHANGELOG.md index d0d50c661171..abdc5b8b06cb 100644 --- a/packages/dds/counter/CHANGELOG.md +++ b/packages/dds/counter/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/counter +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/ink/CHANGELOG.md b/packages/dds/ink/CHANGELOG.md index 584f95a24ded..83feb6edf655 100644 --- a/packages/dds/ink/CHANGELOG.md +++ b/packages/dds/ink/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/ink +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/map/CHANGELOG.md b/packages/dds/map/CHANGELOG.md index ac3824247acd..073f98a6f4cd 100644 --- a/packages/dds/map/CHANGELOG.md +++ b/packages/dds/map/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/map +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/matrix/CHANGELOG.md b/packages/dds/matrix/CHANGELOG.md index 6165090db61d..f97d09576f65 100644 --- a/packages/dds/matrix/CHANGELOG.md +++ b/packages/dds/matrix/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/matrix +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/merge-tree/CHANGELOG.md b/packages/dds/merge-tree/CHANGELOG.md index d5768226ddca..6f248be74f8b 100644 --- a/packages/dds/merge-tree/CHANGELOG.md +++ b/packages/dds/merge-tree/CHANGELOG.md @@ -1,5 +1,16 @@ # @fluidframework/merge-tree +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- sequence: Deprecated ICombiningOp, PropertiesRollback.Rewrite, and SharedString.annotateMarkerNotifyConsensus ([#18318](https://github.com/microsoft/FluidFramework/issues/18318)) [e67c2cac5f](https://github.com/microsoft/FluidFramework/commits/e67c2cac5f275fc5c875c0bc044bbb72aaf76648) + + The `ICombiningOp` and its usage in various APIs has been deprecated. APIs affected include + `SharedSegmentSequence.annotateRange` and `SharedString.annotateMarker`. `SharedString.annotateMarkerNotifyConsensus` + has also been deprecated, because it is related to combining ops. This functionality had no test coverage and was + largely unused. + ## 2.0.0-internal.7.3.0 ### Minor Changes diff --git a/packages/dds/ordered-collection/CHANGELOG.md b/packages/dds/ordered-collection/CHANGELOG.md index 61bb131e48aa..bf4441feb697 100644 --- a/packages/dds/ordered-collection/CHANGELOG.md +++ b/packages/dds/ordered-collection/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/ordered-collection +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/pact-map/CHANGELOG.md b/packages/dds/pact-map/CHANGELOG.md index 457937f575cd..34662f276b4d 100644 --- a/packages/dds/pact-map/CHANGELOG.md +++ b/packages/dds/pact-map/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/pact-map +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/register-collection/CHANGELOG.md b/packages/dds/register-collection/CHANGELOG.md index ef585a138be4..4587456cf429 100644 --- a/packages/dds/register-collection/CHANGELOG.md +++ b/packages/dds/register-collection/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/register-collection +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/sequence/CHANGELOG.md b/packages/dds/sequence/CHANGELOG.md index dcfce6c37241..6f2edeef0c08 100644 --- a/packages/dds/sequence/CHANGELOG.md +++ b/packages/dds/sequence/CHANGELOG.md @@ -1,5 +1,62 @@ # @fluidframework/sequence +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- sequence: `change` and `changeProperties` are now a single method ([#18676](https://github.com/microsoft/FluidFramework/issues/18676)) [12c83d2696](https://github.com/microsoft/FluidFramework/commits/12c83d26962a1d76db6eb0ccad31fd6a7976a1af) + + Instead of having two separate methods to change the endpoints of an interval and the properties, they have been combined into a + single method that will change the endpoints, properties, or both, depending on the arguments passed in. The signature + of this combined method is now updated as well. + + The new way to use the change method is to call it with an interval id as the first parameter and an object containing + the desired portions of the interval to update as the second parameter. For the object parameter, the `endpoints` field + should be an object containing the new `start` and `end` values for the interval, and the `properties` field should be + an object containing the new properties for the interval. Either the `endpoints` field or the `properties` field can be + omitted, and if neither are present, `change` will return `undefined`. + + The new usage of the change method is as follows: + + Change interval endpoints: `change(id, { endpoints: { start: 1, end: 4 } });` + + Change interval properties: `change(id { props: { a: 1 } });` + + Change interval endpoints and properties: `change(id, { endpoints: { start: 1, end: 4 }, props: { a: 1 } });` + +- sequence: Deprecated findOverlappingIntervals API ([#18036](https://github.com/microsoft/FluidFramework/issues/18036)) [52b864ea42](https://github.com/microsoft/FluidFramework/commits/52b864ea42759403771f2cbcb282b0ba19ce42f6) + + The `findOverlappingIntervals` API from `IntervalCollection` has been deprecated. This functionality is moved to the + `OverlappingIntervalsIndex`. Users should independently attach the index to the collection and utilize the API + accordingly, for instance: + + ```typescript + const overlappingIntervalsIndex = createOverlappingIntervalsIndex(sharedString); + collection.attachIndex(overlappingIntervalsIndex); + const result = overlappingIntervalsIndex.findOverlappingIntervals(start, end); + ``` + +- sequence: Deprecated previousInterval and nextInterval APIs ([#18060](https://github.com/microsoft/FluidFramework/issues/18060)) [05fb45d26f](https://github.com/microsoft/FluidFramework/commits/05fb45d26f3065297e219a4bce5763e25bdcffc9) + + The `previousInterval` and `nextInterval` APIs from `IntervalCollection` have been deprecated. These functions are moved + to the `EndpointIndex`. Users should independently attach the index to the collection and utilize the API accordingly, + for instance: + + ```typescript + const endpointIndex = createEndpointIndex(sharedString); + collection.attachIndex(endpointIndex); + + const result1 = endpointIndex.previousInterval(pos); + const result2 = endpointIndex.nextInterval(pos); + ``` + +- sequence: Deprecated ICombiningOp, PropertiesRollback.Rewrite, and SharedString.annotateMarkerNotifyConsensus ([#18318](https://github.com/microsoft/FluidFramework/issues/18318)) [e67c2cac5f](https://github.com/microsoft/FluidFramework/commits/e67c2cac5f275fc5c875c0bc044bbb72aaf76648) + + The `ICombiningOp` and its usage in various APIs has been deprecated. APIs affected include + `SharedSegmentSequence.annotateRange` and `SharedString.annotateMarker`. `SharedString.annotateMarkerNotifyConsensus` + has also been deprecated, because it is related to combining ops. This functionality had no test coverage and was + largely unused. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/shared-object-base/CHANGELOG.md b/packages/dds/shared-object-base/CHANGELOG.md index d8190fa8f991..1bc0a997e7f8 100644 --- a/packages/dds/shared-object-base/CHANGELOG.md +++ b/packages/dds/shared-object-base/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/shared-object-base +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/shared-summary-block/CHANGELOG.md b/packages/dds/shared-summary-block/CHANGELOG.md index 89fc46dc3d38..f16f72e65d28 100644 --- a/packages/dds/shared-summary-block/CHANGELOG.md +++ b/packages/dds/shared-summary-block/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/shared-summary-block +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/task-manager/CHANGELOG.md b/packages/dds/task-manager/CHANGELOG.md index 7eccce24f17a..c9f97ee851fc 100644 --- a/packages/dds/task-manager/CHANGELOG.md +++ b/packages/dds/task-manager/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/task-manager +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/dds/test-dds-utils/CHANGELOG.md b/packages/dds/test-dds-utils/CHANGELOG.md index a8a359441be6..47c170050c36 100644 --- a/packages/dds/test-dds-utils/CHANGELOG.md +++ b/packages/dds/test-dds-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-private/test-dds-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 ### Minor Changes diff --git a/packages/drivers/debugger/CHANGELOG.md b/packages/drivers/debugger/CHANGELOG.md index 549e02da85bd..e4841f167ef7 100644 --- a/packages/drivers/debugger/CHANGELOG.md +++ b/packages/drivers/debugger/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/debugger +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/driver-base/CHANGELOG.md b/packages/drivers/driver-base/CHANGELOG.md index 1b91bfcd4347..f5d6810b5284 100644 --- a/packages/drivers/driver-base/CHANGELOG.md +++ b/packages/drivers/driver-base/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/driver-base +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/driver-web-cache/CHANGELOG.md b/packages/drivers/driver-web-cache/CHANGELOG.md index dd0f209b2434..7775289120aa 100644 --- a/packages/drivers/driver-web-cache/CHANGELOG.md +++ b/packages/drivers/driver-web-cache/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/driver-web-cache +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/file-driver/CHANGELOG.md b/packages/drivers/file-driver/CHANGELOG.md index 51185d020625..d2113f739e84 100644 --- a/packages/drivers/file-driver/CHANGELOG.md +++ b/packages/drivers/file-driver/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/file-driver +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/fluidapp-odsp-urlResolver/CHANGELOG.md b/packages/drivers/fluidapp-odsp-urlResolver/CHANGELOG.md index 6c53bf5eb940..85771dac86a9 100644 --- a/packages/drivers/fluidapp-odsp-urlResolver/CHANGELOG.md +++ b/packages/drivers/fluidapp-odsp-urlResolver/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-tools/fluidapp-odsp-urlresolver +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/local-driver/CHANGELOG.md b/packages/drivers/local-driver/CHANGELOG.md index 00288d2ac596..52d3a25f4f7c 100644 --- a/packages/drivers/local-driver/CHANGELOG.md +++ b/packages/drivers/local-driver/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/local-driver +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/odsp-driver-definitions/CHANGELOG.md b/packages/drivers/odsp-driver-definitions/CHANGELOG.md index f5529f4a0269..3af9567b8d83 100644 --- a/packages/drivers/odsp-driver-definitions/CHANGELOG.md +++ b/packages/drivers/odsp-driver-definitions/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/odsp-driver-definitions +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/odsp-driver/CHANGELOG.md b/packages/drivers/odsp-driver/CHANGELOG.md index d9a3df3d1f6a..9dda04eb3118 100644 --- a/packages/drivers/odsp-driver/CHANGELOG.md +++ b/packages/drivers/odsp-driver/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/odsp-driver +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/odsp-urlResolver/CHANGELOG.md b/packages/drivers/odsp-urlResolver/CHANGELOG.md index 1297e6065199..d670a1ddfbab 100644 --- a/packages/drivers/odsp-urlResolver/CHANGELOG.md +++ b/packages/drivers/odsp-urlResolver/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/odsp-urlresolver +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/replay-driver/CHANGELOG.md b/packages/drivers/replay-driver/CHANGELOG.md index 552948d4a081..29b628c83ec4 100644 --- a/packages/drivers/replay-driver/CHANGELOG.md +++ b/packages/drivers/replay-driver/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/replay-driver +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/routerlicious-driver/CHANGELOG.md b/packages/drivers/routerlicious-driver/CHANGELOG.md index 5cbb7673a1ee..8fadf9b60256 100644 --- a/packages/drivers/routerlicious-driver/CHANGELOG.md +++ b/packages/drivers/routerlicious-driver/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/routerlicious-driver +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/routerlicious-urlResolver/CHANGELOG.md b/packages/drivers/routerlicious-urlResolver/CHANGELOG.md index 9f457f2c6175..0b320bc432b0 100644 --- a/packages/drivers/routerlicious-urlResolver/CHANGELOG.md +++ b/packages/drivers/routerlicious-urlResolver/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/routerlicious-urlresolver +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/drivers/tinylicious-driver/CHANGELOG.md b/packages/drivers/tinylicious-driver/CHANGELOG.md index 22142c02b21a..ce7f0d053e89 100644 --- a/packages/drivers/tinylicious-driver/CHANGELOG.md +++ b/packages/drivers/tinylicious-driver/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/tinylicious-driver +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/agent-scheduler/CHANGELOG.md b/packages/framework/agent-scheduler/CHANGELOG.md index 47718ce4cc12..8dff0ec624ca 100644 --- a/packages/framework/agent-scheduler/CHANGELOG.md +++ b/packages/framework/agent-scheduler/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/agent-scheduler +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/aqueduct/CHANGELOG.md b/packages/framework/aqueduct/CHANGELOG.md index 0ec9d21e98c9..b1a20c45fa41 100644 --- a/packages/framework/aqueduct/CHANGELOG.md +++ b/packages/framework/aqueduct/CHANGELOG.md @@ -1,5 +1,14 @@ # @fluidframework/aqueduct +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- aqueduct: Deprecated IRootDataObjectFactory ([#18565](https://github.com/microsoft/FluidFramework/issues/18565)) [030ab7adf9](https://github.com/microsoft/FluidFramework/commits/030ab7adf991d2d983437544600a191ac15ca5a5) + + The `IRootDataObjectFactory` interface has been deprecated and will be removed in a future major release. Please remove + all usage of it. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/aqueduct/tsconfig.json b/packages/framework/aqueduct/tsconfig.json index 1cf9ea776abb..adc0e767997c 100644 --- a/packages/framework/aqueduct/tsconfig.json +++ b/packages/framework/aqueduct/tsconfig.json @@ -6,7 +6,6 @@ "include": ["src/**/*"], "exclude": ["src/test/**/*"], "compilerOptions": { - "declarationDir": "./dist", "rootDir": "./src", "outDir": "./dist", }, diff --git a/packages/framework/attributor/CHANGELOG.md b/packages/framework/attributor/CHANGELOG.md index eb4a66cc92f6..de15f9ddaf60 100644 --- a/packages/framework/attributor/CHANGELOG.md +++ b/packages/framework/attributor/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/attributor +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/client-logger/app-insights-logger/CHANGELOG.md b/packages/framework/client-logger/app-insights-logger/CHANGELOG.md index 120ccad0fd83..0a72b89734ba 100644 --- a/packages/framework/client-logger/app-insights-logger/CHANGELOG.md +++ b/packages/framework/client-logger/app-insights-logger/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/app-insights-logger +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/data-object-base/CHANGELOG.md b/packages/framework/data-object-base/CHANGELOG.md index bfbfb57e27bf..c7f27de884e8 100644 --- a/packages/framework/data-object-base/CHANGELOG.md +++ b/packages/framework/data-object-base/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/data-object-base +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/data-object-base/tsconfig.json b/packages/framework/data-object-base/tsconfig.json index 1cf9ea776abb..adc0e767997c 100644 --- a/packages/framework/data-object-base/tsconfig.json +++ b/packages/framework/data-object-base/tsconfig.json @@ -6,7 +6,6 @@ "include": ["src/**/*"], "exclude": ["src/test/**/*"], "compilerOptions": { - "declarationDir": "./dist", "rootDir": "./src", "outDir": "./dist", }, diff --git a/packages/framework/dds-interceptions/CHANGELOG.md b/packages/framework/dds-interceptions/CHANGELOG.md index 8a1174674bd0..ac04d8c13ef8 100644 --- a/packages/framework/dds-interceptions/CHANGELOG.md +++ b/packages/framework/dds-interceptions/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/dds-interceptions +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/fluid-framework/CHANGELOG.md b/packages/framework/fluid-framework/CHANGELOG.md index 4b3342ea4905..e5064a849939 100644 --- a/packages/framework/fluid-framework/CHANGELOG.md +++ b/packages/framework/fluid-framework/CHANGELOG.md @@ -1,5 +1,21 @@ # fluid-framework +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- azure-client: Deprecated FluidStatic Classes ([#18402](https://github.com/microsoft/FluidFramework/issues/18402)) [589ec39de5](https://github.com/microsoft/FluidFramework/commits/589ec39de52116c7f782319e6f6aa61bc5aa9964) + + Several FluidStatic classes were unnecessarily exposed. They have been replaced with creation functions. This helps us + keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the + public surface area of downstream packages. The deprecated classes are as follows: + + - `AzureAudience` (use `IAzureAudience` instead) + - `TinyliciousAudience` (use `ITinyliciousAudience` instead) + - `DOProviderContainerRuntimeFactory` + - `FluidContainer` + - `ServiceAudience` + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/fluid-static/CHANGELOG.md b/packages/framework/fluid-static/CHANGELOG.md index afc823219d71..32cd01fda72e 100644 --- a/packages/framework/fluid-static/CHANGELOG.md +++ b/packages/framework/fluid-static/CHANGELOG.md @@ -1,5 +1,21 @@ # @fluidframework/fluid-static +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- azure-client: Deprecated FluidStatic Classes ([#18402](https://github.com/microsoft/FluidFramework/issues/18402)) [589ec39de5](https://github.com/microsoft/FluidFramework/commits/589ec39de52116c7f782319e6f6aa61bc5aa9964) + + Several FluidStatic classes were unnecessarily exposed. They have been replaced with creation functions. This helps us + keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the + public surface area of downstream packages. The deprecated classes are as follows: + + - `AzureAudience` (use `IAzureAudience` instead) + - `TinyliciousAudience` (use `ITinyliciousAudience` instead) + - `DOProviderContainerRuntimeFactory` + - `FluidContainer` + - `ServiceAudience` + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/oldest-client-observer/CHANGELOG.md b/packages/framework/oldest-client-observer/CHANGELOG.md index 035159843bda..6cbfed8920b0 100644 --- a/packages/framework/oldest-client-observer/CHANGELOG.md +++ b/packages/framework/oldest-client-observer/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/oldest-client-observer +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/request-handler/CHANGELOG.md b/packages/framework/request-handler/CHANGELOG.md index 6bb3a0c7600b..f11c434843a0 100644 --- a/packages/framework/request-handler/CHANGELOG.md +++ b/packages/framework/request-handler/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/request-handler +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/synthesize/CHANGELOG.md b/packages/framework/synthesize/CHANGELOG.md index fb175fdf489f..09778b89f8dc 100644 --- a/packages/framework/synthesize/CHANGELOG.md +++ b/packages/framework/synthesize/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/synthesize +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/synthesize/tsconfig.json b/packages/framework/synthesize/tsconfig.json index 1cf9ea776abb..adc0e767997c 100644 --- a/packages/framework/synthesize/tsconfig.json +++ b/packages/framework/synthesize/tsconfig.json @@ -6,7 +6,6 @@ "include": ["src/**/*"], "exclude": ["src/test/**/*"], "compilerOptions": { - "declarationDir": "./dist", "rootDir": "./src", "outDir": "./dist", }, diff --git a/packages/framework/tinylicious-client/CHANGELOG.md b/packages/framework/tinylicious-client/CHANGELOG.md index 97ab27aecd16..c483a0d54b21 100644 --- a/packages/framework/tinylicious-client/CHANGELOG.md +++ b/packages/framework/tinylicious-client/CHANGELOG.md @@ -1,5 +1,21 @@ # @fluidframework/tinylicious-client +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- azure-client: Deprecated FluidStatic Classes ([#18402](https://github.com/microsoft/FluidFramework/issues/18402)) [589ec39de5](https://github.com/microsoft/FluidFramework/commits/589ec39de52116c7f782319e6f6aa61bc5aa9964) + + Several FluidStatic classes were unnecessarily exposed. They have been replaced with creation functions. This helps us + keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the + public surface area of downstream packages. The deprecated classes are as follows: + + - `AzureAudience` (use `IAzureAudience` instead) + - `TinyliciousAudience` (use `ITinyliciousAudience` instead) + - `DOProviderContainerRuntimeFactory` + - `FluidContainer` + - `ServiceAudience` + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/undo-redo/CHANGELOG.md b/packages/framework/undo-redo/CHANGELOG.md index c27596dae797..eb1be89c253c 100644 --- a/packages/framework/undo-redo/CHANGELOG.md +++ b/packages/framework/undo-redo/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/undo-redo +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/view-adapters/CHANGELOG.md b/packages/framework/view-adapters/CHANGELOG.md index fac2b65c82e8..a739fade2981 100644 --- a/packages/framework/view-adapters/CHANGELOG.md +++ b/packages/framework/view-adapters/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/view-adapters +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/view-adapters/tsconfig.json b/packages/framework/view-adapters/tsconfig.json index 1cf9ea776abb..adc0e767997c 100644 --- a/packages/framework/view-adapters/tsconfig.json +++ b/packages/framework/view-adapters/tsconfig.json @@ -6,7 +6,6 @@ "include": ["src/**/*"], "exclude": ["src/test/**/*"], "compilerOptions": { - "declarationDir": "./dist", "rootDir": "./src", "outDir": "./dist", }, diff --git a/packages/framework/view-interfaces/CHANGELOG.md b/packages/framework/view-interfaces/CHANGELOG.md index 1df264620552..0849f88f613d 100644 --- a/packages/framework/view-interfaces/CHANGELOG.md +++ b/packages/framework/view-interfaces/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/view-interfaces +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/framework/view-interfaces/tsconfig.json b/packages/framework/view-interfaces/tsconfig.json index 1cf9ea776abb..adc0e767997c 100644 --- a/packages/framework/view-interfaces/tsconfig.json +++ b/packages/framework/view-interfaces/tsconfig.json @@ -6,7 +6,6 @@ "include": ["src/**/*"], "exclude": ["src/test/**/*"], "compilerOptions": { - "declarationDir": "./dist", "rootDir": "./src", "outDir": "./dist", }, diff --git a/packages/loader/container-loader/CHANGELOG.md b/packages/loader/container-loader/CHANGELOG.md index d32df5809859..a72d4d2d3d28 100644 --- a/packages/loader/container-loader/CHANGELOG.md +++ b/packages/loader/container-loader/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/container-loader +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/loader/driver-utils/CHANGELOG.md b/packages/loader/driver-utils/CHANGELOG.md index d98a09001e43..be4b47899abd 100644 --- a/packages/loader/driver-utils/CHANGELOG.md +++ b/packages/loader/driver-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/driver-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/loader/test-loader-utils/CHANGELOG.md b/packages/loader/test-loader-utils/CHANGELOG.md index 9700ac506b41..3fb9c10a6fd5 100644 --- a/packages/loader/test-loader-utils/CHANGELOG.md +++ b/packages/loader/test-loader-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-private/test-loader-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 ### Minor Changes diff --git a/packages/runtime/container-runtime-definitions/CHANGELOG.md b/packages/runtime/container-runtime-definitions/CHANGELOG.md index 0ec64d4d59ae..3f5a53fb1abc 100644 --- a/packages/runtime/container-runtime-definitions/CHANGELOG.md +++ b/packages/runtime/container-runtime-definitions/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/container-runtime-definitions +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/runtime/container-runtime/CHANGELOG.md b/packages/runtime/container-runtime/CHANGELOG.md index daa5eb06ddd0..ee4a3986950b 100644 --- a/packages/runtime/container-runtime/CHANGELOG.md +++ b/packages/runtime/container-runtime/CHANGELOG.md @@ -1,5 +1,23 @@ # @fluidframework/container-runtime +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- container-runtime: (GC) Tombstoned objects will fail to load by default ([#18651](https://github.com/microsoft/FluidFramework/issues/18651)) [2245c0578e](https://github.com/microsoft/FluidFramework/commits/2245c0578e756c944caa5c22311eaafbb73452bb) + + Previously, Tombstoned objects would only trigger informational logs by default, with an option via config to also cause + errors to be thrown on load. Now, failure to load is the default with an option to disable it if necessary. This + reflects the purpose of the Tombstone stage which is to mimic the user experience of objects being deleted. + +- container-runtime/runtime-definitions: `IdCompressor` and related types deprecated ([#18749](https://github.com/microsoft/FluidFramework/issues/18749)) [6f070179de](https://github.com/microsoft/FluidFramework/commits/6f070179ded7c2f4398252f75485e85b39725419) + + `IdCompressor` and related types from the @fluidframework/container-runtime and @fluidframework/runtime-definitions + packages have been deprecated. They can now be found in a new package, @fluidframework/id-compressor. + + The `IdCompressor` class is deprecated even in the new package. Consumers should use the interfaces, `IIdCompressor` and + `IIdCompressorCore`, in conjunction with the factory function `createIdCompressor` instead. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/runtime/container-runtime/api-report/container-runtime.api.md b/packages/runtime/container-runtime/api-report/container-runtime.api.md index d1975e90224f..f9b4ce27ca5f 100644 --- a/packages/runtime/container-runtime/api-report/container-runtime.api.md +++ b/packages/runtime/container-runtime/api-report/container-runtime.api.md @@ -253,10 +253,12 @@ export class FluidDataStoreRegistry implements IFluidDataStoreRegistry { } // @alpha (undocumented) -export interface GCFeatureMatrix { - sweepGeneration?: number; - tombstoneGeneration?: number; -} +export type GCFeatureMatrix = { + gcGeneration?: number; + tombstoneGeneration?: undefined; +} | { + tombstoneGeneration: number; +}; // @alpha export const GCNodeType: { @@ -428,6 +430,7 @@ export interface IGCMetadata { export interface IGCRuntimeOptions { [key: string]: any; disableGC?: boolean; + enableGCSweep?: true; gcAllowed?: boolean; runFullGC?: boolean; sessionExpiryTimeoutMs?: number; diff --git a/packages/runtime/container-runtime/src/containerRuntime.ts b/packages/runtime/container-runtime/src/containerRuntime.ts index 0b838c7a7e3a..aacccde26b2f 100644 --- a/packages/runtime/container-runtime/src/containerRuntime.ts +++ b/packages/runtime/container-runtime/src/containerRuntime.ts @@ -164,7 +164,7 @@ import { formExponentialFn, Throttler } from "./throttler"; import { GarbageCollector, GCNodeType, - gcTombstoneGenerationOptionName, + gcGenerationOptionName, IGarbageCollector, IGCRuntimeOptions, IGCStats, @@ -1292,8 +1292,7 @@ export class ContainerRuntime eventName: "GCFeatureMatrix", metadataValue: JSON.stringify(metadata?.gcFeatureMatrix), inputs: JSON.stringify({ - gcOptions_gcTombstoneGeneration: - this.runtimeOptions.gcOptions[gcTombstoneGenerationOptionName], + gcOptions_gcGeneration: this.runtimeOptions.gcOptions[gcGenerationOptionName], }), }); diff --git a/packages/runtime/container-runtime/src/gc/garbageCollection.md b/packages/runtime/container-runtime/src/gc/garbageCollection.md index 8cc4f6010038..4f74b3913f02 100644 --- a/packages/runtime/container-runtime/src/gc/garbageCollection.md +++ b/packages/runtime/container-runtime/src/gc/garbageCollection.md @@ -98,11 +98,7 @@ covered in the [Advanced Configuration](./gcEarlyAdoption.md#more-advanced-confi ### Enabling Sweep Phase -The Tombstone stage of Sweep is enabled by default. - -To enable the Delete Stage for new documents, you must set the `gcSweepGeneration` GC Option to a number, e.g. 0 to start. -This generation number is persisted, and any document where the persisted value matches the current value will have -Sweep enabled. +To enable the Sweep Phase for new documents, you must set the `enableGCSweep` GC Option to true. ### More Advanced Configuration diff --git a/packages/runtime/container-runtime/src/gc/garbageCollection.ts b/packages/runtime/container-runtime/src/gc/garbageCollection.ts index 7ce200849b72..4c00c2898aca 100644 --- a/packages/runtime/container-runtime/src/gc/garbageCollection.ts +++ b/packages/runtime/container-runtime/src/gc/garbageCollection.ts @@ -124,7 +124,7 @@ export class GarbageCollector implements IGarbageCollector { /** If false, loading or using a Tombstoned object should merely log, not fail */ public get tombstoneEnforcementAllowed(): boolean { - return this.configs.tombstoneEnforcementAllowed; + return this.configs.sweepEnabled; } /** If true, throw an error when a tombstone data store is retrieved */ public get throwOnTombstoneLoad(): boolean { @@ -708,17 +708,31 @@ export class GarbageCollector implements IGarbageCollector { return; } + // If sweep is disabled, we'll tombstone both tombstone-ready and sweep-ready nodes. + // This is important because a container may never load during a node's Sweep Grace Period, + // so that node would directly become sweep-ready skipping over tombstone-ready state, + // but should be Tombstoned since Sweep is disabled. + const { nodesToTombstone, nodesToDelete } = this.configs.shouldRunSweep + ? { + nodesToTombstone: [...tombstoneReadyNodes], + nodesToDelete: [...sweepReadyNodes], + } + : { + nodesToTombstone: [...tombstoneReadyNodes, ...sweepReadyNodes], + nodesToDelete: [], + }; + if (this.configs.tombstoneMode) { - this.tombstones = Array.from(tombstoneReadyNodes); + this.tombstones = nodesToTombstone; // If we are running in GC tombstone mode, update tombstoned routes. this.runtime.updateTombstonedRoutes(this.tombstones); } - if (this.configs.shouldRunSweep && sweepReadyNodes.size > 0) { + if (this.configs.shouldRunSweep && nodesToDelete.length > 0) { // Do not send DDS node ids in the GC op. This is an optimization to reduce its size. Since GC applies to // to data store only, all its DDSes are deleted along with it. The DDS ids will be retrieved from the // local state when processing the op. - const sweepReadyDSAndBlobs = Array.from(sweepReadyNodes).filter((nodeId) => { + const sweepReadyDSAndBlobs = nodesToDelete.filter((nodeId) => { const nodeType = this.runtime.getNodeType(nodeId); return nodeType === GCNodeType.DataStore || nodeType === GCNodeType.Blob; }); @@ -1165,7 +1179,7 @@ export class GarbageCollector implements IGarbageCollector { sweepPhaseStats.lifetimeDataStoreCount += sweepPhaseStats.deletedDataStoreCount; sweepPhaseStats.lifetimeAttachmentBlobCount += sweepPhaseStats.deletedAttachmentBlobCount; - if (this.configs.sweepEnabled) { + if (this.configs.shouldRunSweep) { return sweepPhaseStats; } diff --git a/packages/runtime/container-runtime/src/gc/gcConfigs.ts b/packages/runtime/container-runtime/src/gc/gcConfigs.ts index c44712ebf404..2e1a3bd5401d 100644 --- a/packages/runtime/container-runtime/src/gc/gcConfigs.ts +++ b/packages/runtime/container-runtime/src/gc/gcConfigs.ts @@ -15,9 +15,7 @@ import { defaultSessionExpiryDurationMs, disableTombstoneKey, GCFeatureMatrix, - gcSweepGenerationOptionName, gcTestModeKey, - gcTombstoneGenerationOptionName, GCVersion, gcVersionUpgradeToV4Key, IGarbageCollectorConfigs, @@ -32,8 +30,9 @@ import { throwOnTombstoneUsageKey, gcDisableThrowOnTombstoneLoadOptionName, defaultSweepGracePeriodMs, + gcGenerationOptionName, } from "./gcDefinitions"; -import { getGCVersion, shouldAllowGcSweep, shouldAllowGcTombstoneEnforcement } from "./gcHelpers"; +import { getGCVersion, shouldAllowGcSweep } from "./gcHelpers"; /** * Generates configurations for the Garbage Collector that it uses to determine what to run and how. @@ -76,14 +75,6 @@ export function generateGCConfigs( createParams.metadata?.sweepTimeoutMs ?? computeSweepTimeout(sessionExpiryTimeoutMs); // Backfill old documents that didn't persist this persistedGcFeatureMatrix = createParams.metadata?.gcFeatureMatrix; } else { - const tombstoneGeneration = createParams.gcOptions[gcTombstoneGenerationOptionName]; - const sweepGeneration = createParams.gcOptions[gcSweepGenerationOptionName]; - - // Sweep should not be enabled (via sweepGeneration value) without enabling GC mark phase. - if (sweepGeneration !== undefined && createParams.gcOptions.gcAllowed === false) { - throw new UsageError("GC sweep phase cannot be enabled without enabling GC mark phase"); - } - // This Test Override only applies for new containers const testOverrideSweepTimeoutMs = mc.config.getNumber( "Fluid.GarbageCollection.TestOverride.SweepTimeoutMs", @@ -100,18 +91,18 @@ export function generateGCConfigs( } sweepTimeoutMs = testOverrideSweepTimeoutMs ?? computeSweepTimeout(sessionExpiryTimeoutMs); - if (tombstoneGeneration !== undefined || sweepGeneration !== undefined) { - persistedGcFeatureMatrix = { - tombstoneGeneration, - sweepGeneration, - }; + const gcGeneration = createParams.gcOptions[gcGenerationOptionName]; + if (gcGeneration !== undefined) { + persistedGcFeatureMatrix = { gcGeneration }; } } - // Is sweepEnabled for this document? - const sweepEnabled = shouldAllowGcSweep( - persistedGcFeatureMatrix ?? {} /* persistedGenerations */, - createParams.gcOptions[gcSweepGenerationOptionName] /* currentGeneration */, + // The persisted GC generation must indicate Sweep is allowed for this document, + // according to the GC Generation option provided this session. + // Note that if no generation option is provided, Sweep is allowed for any document. + const sweepAllowed = shouldAllowGcSweep( + persistedGcFeatureMatrix ?? {} /* featureMatrix */, + createParams.gcOptions[gcGenerationOptionName] /* currentGeneration */, ); // If version upgrade is not enabled, fall back to the stable GC version. @@ -128,27 +119,30 @@ export function generateGCConfigs( * Whether GC should run or not. The following conditions have to be met to run sweep: * 1. GC should be enabled for this container. * 2. GC should not be disabled via disableGC GC option. - * 3. The current GC version should be greater of equal to the GC version in the base snapshot. - * These conditions can be overridden via runGCKey feature flag. + * 3. The current GC version should be greater or equal to the GC version in the base snapshot. + * + * These conditions can be overridden via the RunGC feature flag. */ const shouldRunGC = mc.config.getBoolean(runGCKey) ?? (gcEnabled && !createParams.gcOptions.disableGC && isGCVersionUpToDate); /** - * Whether sweep should run or not. The following conditions have to be met to run sweep: + * Whether sweep should run or not. This refers to whether Tombstones should fail on load and whether + * sweep-ready nodes should be deleted. * - * 1. Overall GC or mark phase must be enabled (this.configs.shouldRunGC). - * 2. Sweep timeout should be available. Without this, we wouldn't know when an object should be deleted. - * 3. The driver must implement the policy limiting the age of snapshots used for loading. Otherwise - * the Sweep Timeout calculation is not valid. We use the persisted value to ensure consistency over time. - * 4. Sweep should be enabled for this container. This can be overridden via runSweep - * feature flag. + * Assuming overall GC is enabled and sweepTimeout is provided, the following conditions have to be met to run sweep: + * + * 1. Sweep should be enabled for this container. + * 2. Sweep should be enabled for this session. + * + * These conditions can be overridden via the RunSweep feature flag. */ const shouldRunSweep = - shouldRunGC && - sweepTimeoutMs !== undefined && - (mc.config.getBoolean(runSweepKey) ?? sweepEnabled); + !shouldRunGC || sweepTimeoutMs === undefined + ? false + : mc.config.getBoolean(runSweepKey) ?? + (sweepAllowed && createParams.gcOptions.enableGCSweep === true); // Override inactive timeout if test config or gc options to override it is set. const inactiveTimeoutMs = @@ -176,28 +170,22 @@ export function generateGCConfigs( }); const throwOnInactiveLoad: boolean | undefined = createParams.gcOptions.throwOnInactiveLoad; - const tombstoneEnforcementAllowed = shouldAllowGcTombstoneEnforcement( - createParams.metadata?.gcFeatureMatrix?.tombstoneGeneration /* persisted */, - createParams.gcOptions[gcTombstoneGenerationOptionName] /* current */, - ); const throwOnTombstoneLoadConfig = mc.config.getBoolean(throwOnTombstoneLoadOverrideKey) ?? createParams.gcOptions[gcDisableThrowOnTombstoneLoadOptionName] !== true; const throwOnTombstoneLoad = - throwOnTombstoneLoadConfig && - tombstoneEnforcementAllowed && - !createParams.isSummarizerClient; + throwOnTombstoneLoadConfig && sweepAllowed && !createParams.isSummarizerClient; const throwOnTombstoneUsage = mc.config.getBoolean(throwOnTombstoneUsageKey) === true && - tombstoneEnforcementAllowed && + sweepAllowed && !createParams.isSummarizerClient; return { - gcEnabled, - sweepEnabled, - shouldRunGC, - shouldRunSweep, + gcEnabled, // For this document + sweepEnabled: sweepAllowed, // For this document (based on current GC Generation option) + shouldRunGC, // For this session + shouldRunSweep, // For this session runFullGC, testMode, tombstoneMode, @@ -209,7 +197,6 @@ export function generateGCConfigs( gcVersionInBaseSnapshot, gcVersionInEffect, throwOnInactiveLoad, - tombstoneEnforcementAllowed, throwOnTombstoneLoad, throwOnTombstoneUsage, }; diff --git a/packages/runtime/container-runtime/src/gc/gcDefinitions.ts b/packages/runtime/container-runtime/src/gc/gcDefinitions.ts index 8fc0bbd58728..799cf2a3ab0b 100644 --- a/packages/runtime/container-runtime/src/gc/gcDefinitions.ts +++ b/packages/runtime/container-runtime/src/gc/gcDefinitions.ts @@ -32,14 +32,6 @@ export const stableGCVersion: GCVersion = 3; /** The next version of GC Data, to bump to in case we need to regenerate all GC Data across all files. */ export const nextGCVersion: GCVersion = 4; -/** - * This undocumented GC Option (on ContainerRuntime Options) allows an app to disable enforcing GC on old documents by incrementing this value - * - * If unset, GC Tombstone phase will operate as otherwise configured - * Otherwise, only enforce GC Tombstone if the passed in value matches the persisted value - */ -export const gcTombstoneGenerationOptionName = "gcTombstoneGeneration"; - /** * This undocumented GC Option (on ContainerRuntime Options) allows an app to disable throwing an error when tombstone * object is loaded (requested), merely logging a message instead. @@ -49,13 +41,17 @@ export const gcTombstoneGenerationOptionName = "gcTombstoneGeneration"; export const gcDisableThrowOnTombstoneLoadOptionName = "gcDisableThrowOnTombstoneLoad"; /** - * This GC Option (on ContainerRuntime Options) allows an app to disable GC Sweep on old documents by incrementing this value. + * This undocumented GC Option (on ContainerRuntime Options) allows configuring which documents can have Sweep enabled. + * This provides a way to disable both Tombstone Enforcement and Sweep. * - * If unset altogether, Sweep will be disabled. - * If 0 is passed in, Sweep will be enabled for any document with gcSweepGeneration OR gcTombstoneGeneration as 0. - * If any other number is passed in, Sweep will be enabled only for documents with the same value persisted. + * If unset, Tombstone Enforcement + Sweep will operate as otherwise configured. + * Otherwise, the Sweep Phase will be disabled for documents where persisted value doesn't match what is passed into this session. + * This provides a way to disallow Sweep for old documents that may be too difficult for an app to repair, + * in case a bug is found that violates GC's assumptions. + * + * @see GCFeatureMatrix (gcGeneration) */ -export const gcSweepGenerationOptionName = "gcSweepGeneration"; +export const gcGenerationOptionName = "gcGeneration"; /** Config key to turn GC on / off. */ export const runGCKey = "Fluid.GarbageCollection.RunGC"; @@ -95,23 +91,27 @@ export const defaultSessionExpiryDurationMs = 30 * oneDayMs; // 30 days export const defaultSweepGracePeriodMs = 1 * oneDayMs; // 1 day /** - * @see IGCMetadata.gcFeatureMatrix + * @see IGCMetadata.gcFeatureMatrix and @see gcGenerationOptionName * @alpha */ -export interface GCFeatureMatrix { - /** - * The Tombstone Generation value in effect when this file was created. - * Gives a way for an app to disqualify old files from GC Tombstone enforcement. - * Provided via Container Runtime Options. - */ - tombstoneGeneration?: number; - /** - * The Sweep Generation value in effect when this file was created. - * Gives a way for an app to disqualify old files from GC Sweep. - * Provided via Container Runtime Options. - */ - sweepGeneration?: number; -} +export type GCFeatureMatrix = + | { + /** + * The GC Generation value in effect when this file was created. + * Gives a way for an app to disqualify old files from GC Sweep. + * Provided via Container Runtime Options. + */ + gcGeneration?: number; + /** Deprecated property from legacy type. Will not be set concurrently with gcGeneration */ + tombstoneGeneration?: undefined; + } + | { + /** + * The Tombstone Generation value in effect when this file was created. + * Legacy - new containers would get gcGeneration instead (if anything) + */ + tombstoneGeneration: number; + }; /** * @alpha @@ -143,7 +143,7 @@ export interface IGCMetadata { * - True means sweep phase is enabled. * - False means sweep phase is disabled. If GC is disabled as per gcFeature, sweep is also disabled. * - * @deprecated use GCFeatureMatrix.sweepGeneration instead. @see GCFeatureMatrix.sweepGeneration + * @deprecated use GCFeatureMatrix.gcGeneration instead. @see GCFeatureMatrix.gcGeneration */ readonly sweepEnabled?: boolean; /** If this is present, the session for this container will expire after this time and the container will close */ @@ -367,7 +367,7 @@ export interface IGCRuntimeOptions { * GC has mark phase and sweep phase. In mark phase, unreferenced objects are identified * and marked as such in the summary. This option enables the mark phase. * In sweep phase, unreferenced objects are eventually deleted from the container if they meet certain conditions. - * Sweep phase can be enabled using the "gcSweepGeneration" option. + * Sweep phase can be enabled using the "enableGCSweep" option. * * Note: This setting is persisted in the container's summary and cannot be changed. */ @@ -379,6 +379,17 @@ export interface IGCRuntimeOptions { */ disableGC?: boolean; + /** + * Flag that if true, will enable the full Sweep Phase of garbage collection for this session, + * where Tombstoned objects are permanently deleted from the container. + * + * IMPORTANT: This only applies if this document is allowed to run Sweep Phase. + * + * Current default behavior is for Sweep Phase not to delete Tombstoned objects, + * but merely to prevent them from being loaded. + */ + enableGCSweep?: true; + /** * Flag that will bypass optimizations and generate GC data for all nodes irrespective of whether a node * changed or not. @@ -462,8 +473,6 @@ export interface IGarbageCollectorConfigs { readonly gcVersionInEffect: GCVersion; /** It is easier for users to diagnose InactiveObject usage if we throw on load, which this option enables */ readonly throwOnInactiveLoad: boolean | undefined; - /** If false, loading or using a Tombstoned object should merely log, not fail */ - readonly tombstoneEnforcementAllowed: boolean; /** If true, throw an error when a tombstone data store is retrieved */ readonly throwOnTombstoneLoad: boolean; /** If true, throw an error when a tombstone data store is used. */ diff --git a/packages/runtime/container-runtime/src/gc/gcHelpers.ts b/packages/runtime/container-runtime/src/gc/gcHelpers.ts index 64532315d1e0..ed4b6223dc52 100644 --- a/packages/runtime/container-runtime/src/gc/gcHelpers.ts +++ b/packages/runtime/container-runtime/src/gc/gcHelpers.ts @@ -28,64 +28,34 @@ export function getGCVersion(metadata?: IGCMetadata): GCVersion { } /** - * Indicates whether Tombstone Enforcement is allowed for this document based on the current/persisted - * TombstoneGeneration values - * - * In order to protect old documents that were created at a time when known bugs exist that violate GC's invariants - * such that enforcing GC Tombstone (Failing on Tombstone load/usage) would cause legitimate data loss, - * the container author may increment the generation value for Tombstone such that containers created - * with a different value will not be subjected to GC enforcement. - * - * If no generation is provided at runtime, this defaults to return true to maintain expected default behavior - * - * @param persistedGeneration - The persisted tombstoneGeneration value - * @param currentGeneration - The current app-provided tombstoneGeneration value - * @returns true if GC Tombstone enforcement (Fail on Tombstone load/usage) should be allowed for this document - */ -export function shouldAllowGcTombstoneEnforcement( - persistedGeneration: number | undefined, - currentGeneration: number | undefined, -): boolean { - // If no Generation value is provided for this session, then we should default to letting Tombstone feature behave as intended. - if (currentGeneration === undefined) { - return true; - } - return persistedGeneration === currentGeneration; -} - -/** - * Indicates whether Sweep is allowed for this document based on the GC Feature Matrix and current SweepGeneration + * Indicates whether Sweep is allowed for this document based on the persisted GC Feature Matrix and current gcGeneration. + * This applies to the entire Sweep Phase the same - both Tombstone Enforcement (i.e. should loading a Tombstone fail?) and Deletion. * * In order to protect old documents that were created at a time when known bugs exist that violate GC's invariants * such that enforcing GC Sweep would cause legitimate data loss, the container author may increment the generation value for Sweep * such that containers created with a different value will not be subjected to GC Sweep. * - * If no generation is provided, Sweep will be disabled. - * Passing 0 is a special case: Sweep will be enabled for any document with gcSweepGeneration OR gcTombstoneGeneration as 0. + * If no generation is provided, Sweep will be enabled for all documents. * - * @param persistedGenerations - The persisted sweep/tombstone generations from the GC Feature Matrix - * @param currentGeneration - The current app-provided sweepGeneration value + * For backwards compatibility, the current generation value is also compared against the persisted gcTombstoneGeneration if present. + * + * @param featureMatrix - The GC Feature Matrix, containing the persisted generation value + * @param currentGeneration - The current app-provided gcGeneration value * @returns true if GC Sweep should be allowed for this document */ export function shouldAllowGcSweep( - persistedGenerations: Pick, + featureMatrix: GCFeatureMatrix, currentGeneration: number | undefined, ): boolean { - // If no Generation value is provided for this session, default to false + // If no Generation value is provided for this session, default to true if (currentGeneration === undefined) { - return false; + return true; } - // 0 is a special case: It matches both SweepGeneration and TombstoneGeneration - // This is an optimistic measure to maximize coverage of GC Sweep if no bumps to TombstoneGeneration are needed before enabling Sweep. - if (currentGeneration === 0) { - return ( - persistedGenerations.sweepGeneration === 0 || - persistedGenerations.tombstoneGeneration === 0 - ); - } + // tombstoneGeneration is the predecessor and needs to be supported for back-compat reasons + const targetGeneration = featureMatrix.tombstoneGeneration ?? featureMatrix.gcGeneration; - return persistedGenerations.sweepGeneration === currentGeneration; + return currentGeneration === targetGeneration; } /** diff --git a/packages/runtime/container-runtime/src/gc/index.ts b/packages/runtime/container-runtime/src/gc/index.ts index ff7ac84db7ad..c35c1fc474f1 100644 --- a/packages/runtime/container-runtime/src/gc/index.ts +++ b/packages/runtime/container-runtime/src/gc/index.ts @@ -11,9 +11,8 @@ export { defaultSessionExpiryDurationMs, GCNodeType, gcTestModeKey, - gcTombstoneGenerationOptionName, gcDisableThrowOnTombstoneLoadOptionName, - gcSweepGenerationOptionName, + gcGenerationOptionName, GCFeatureMatrix, GCVersion, gcVersionUpgradeToV4Key, diff --git a/packages/runtime/container-runtime/src/test/gc/garbageCollection.spec.ts b/packages/runtime/container-runtime/src/test/gc/garbageCollection.spec.ts index 80380945d22a..449c2943920c 100644 --- a/packages/runtime/container-runtime/src/test/gc/garbageCollection.spec.ts +++ b/packages/runtime/container-runtime/src/test/gc/garbageCollection.spec.ts @@ -4,7 +4,7 @@ */ import { strict as assert } from "assert"; -import { SinonFakeTimers, useFakeTimers } from "sinon"; +import { SinonFakeTimers, useFakeTimers, spy } from "sinon"; import { ContainerErrorTypes, ICriticalContainerError, @@ -63,6 +63,7 @@ import { pkgVersion } from "../../packageVersion"; import { configProvider } from "./gcUnitTestHelpers"; type GcWithPrivates = IGarbageCollector & { + readonly runtime: IGarbageCollectionRuntime; readonly configs: IGarbageCollectorConfigs; readonly summaryStateTracker: Omit< GCSummaryStateTracker, @@ -124,7 +125,7 @@ describe("Garbage Collection Tests", () => { gcMetadata: IGCMetadata = {}, closeFn: (error?: ICriticalContainerError) => void = () => {}, isSummarizerClient: boolean = true, - ) { + ): GcWithPrivates { const getNodeType = (nodePath: string) => { if (nodePath.split("/").length !== 2) { return GCNodeType.Other; @@ -178,7 +179,7 @@ describe("Garbage Collection Tests", () => { getLastSummaryTimestampMs: () => Date.now(), activeConnection: () => true, submitMessage: (message: ContainerRuntimeGCMessage) => {}, - }); + }) as GcWithPrivates; } let gc: GcWithPrivates | undefined; @@ -222,13 +223,112 @@ describe("Garbage Collection Tests", () => { () => { closeCalled = true; }, - ) as GcWithPrivates; + ); assert( closeCalledAfterExactTicks(defaultSessionExpiryDurationMs), "Close should have been called at exactly defaultSessionExpiryDurationMs", ); }); + describe("runSweepPhase", () => { + it("Tombstone then Delete", async () => { + // Simple starting reference graph - root and two nodes + defaultGCData.gcNodes["/"] = [nodes[0], nodes[1]]; + defaultGCData.gcNodes[nodes[0]] = []; + defaultGCData.gcNodes[nodes[1]] = []; + + // Sweep enabled + gc = createGarbageCollector({ gcOptions: { enableGCSweep: true } }); + // These spies will let us monitor how each of these functions are called (or not) during runSweepPhase. + // The original behavior of the function is preserved, but we can check how it was called. + const spies = { + updateTombstonedRoutes: spy(gc.runtime, "updateTombstonedRoutes"), + submitMessage: spy(gc, "submitMessage"), + }; + + // Nodes 0 and 1 are referenced + await gc.collectGarbage({}); + + // Unreference 0 + defaultGCData.gcNodes["/"] = [nodes[1]]; + clock.tick(10); + await gc.collectGarbage({}); + + // Erase the spy's tracking of calls up to this point - I just want to observe what happens next. + spies.updateTombstonedRoutes.resetHistory(); + + // Skip to TombstoneReady state + clock.tick(defaultSweepTimeoutMs); + await gc.collectGarbage({}); + + assert( + spies.updateTombstonedRoutes.calledWith([nodes[0]]), + "updateTombstonedRoutes should be called with node 0", + ); + assert.equal( + spies.submitMessage.callCount, + 0, + "submitMessage should not be called yet, didn't pass Grace Period yet", + ); + spies.updateTombstonedRoutes.resetHistory(); + + // Skip past Sweep Grace Period. GC Sweep op should be submitted + clock.tick(defaultSweepGracePeriodMs); + await gc.collectGarbage({}); + + assert.equal( + spies.submitMessage.callCount, + 1, + "submitMessage should be called since Sweep is enabled", + ); + assert( + spies.updateTombstonedRoutes.alwaysCalledWith([]), + "No additional nodes should be Tombstoned", + ); + }); + + it("Sweep Disabled - Should Tombstone SweepReady nodes", async () => { + defaultGCData.gcNodes["/"] = [nodes[0], nodes[1]]; + defaultGCData.gcNodes[nodes[0]] = []; + defaultGCData.gcNodes[nodes[1]] = []; + + gc = createGarbageCollector(); + const spies = { + updateTombstonedRoutes: spy(gc.runtime, "updateTombstonedRoutes"), + submitMessage: spy(gc, "submitMessage"), + }; + + // Nodes 0 and 1 are referenced + await gc.collectGarbage({}); + + // Unreference 0 + defaultGCData.gcNodes["/"] = [nodes[1]]; + clock.tick(10); + await gc.collectGarbage({}); + + // Skip all the way past Sweep Grace Period. But Sweep is disabled, so Tombstone should happen + clock.tick(defaultSweepTimeoutMs + defaultSweepGracePeriodMs); + assert.equal( + gc.unreferencedNodesState.get(nodes[0])?.state, + "SweepReady", + "Node 0 should be SweepReady (not TombstoneReady)", + ); + + spies.updateTombstonedRoutes.resetHistory(); + await gc.collectGarbage({}); + + assert( + spies.updateTombstonedRoutes.calledWith([nodes[0]]), + "updateTombstonedRoutes should be called with node 0", + ); + assert.equal( + spies.submitMessage.callCount, + 0, + "submitMessage should not be called since Sweep is disabled", + ); + }); + }); + describe("errors when unreferenced objects are used after they are inactive / deleted", () => { // Mock node loaded and changed activity for all the nodes in the graph. async function mockNodeChangesAndRunGC(garbageCollector: IGarbageCollector) { @@ -811,7 +911,7 @@ describe("Garbage Collection Tests", () => { { baseSnapshot: snapshotTree }, gcBlobsMap, gcMetadata, - ) as GcWithPrivates; + ); } it("reads all GC data from base snapshot when GC version does not change", async () => { @@ -894,7 +994,7 @@ describe("Garbage Collection Tests", () => { injectedSettings["Fluid.GarbageCollection.TestOverride.InactiveTimeoutMs"] = inactiveTimeoutMs; - const garbageCollector = createGarbageCollector({}) as GcWithPrivates; + const garbageCollector = createGarbageCollector({}); function validateUnreferencedStates( expectedUnreferencedStates: Record, @@ -1661,7 +1761,7 @@ describe("Garbage Collection Tests", () => { ]); const garbageCollector = createGarbageCollector({ baseSnapshot }, gcBlobMap, { sweepTimeoutMs: defaultSweepTimeoutMs, - }) as GcWithPrivates; + }); // GC state and tombstone state should be discarded but deleted nodes should be read from base snapshot. const baseSnapshotData = await garbageCollector.baseSnapshotDataP; @@ -1685,7 +1785,7 @@ describe("Garbage Collection Tests", () => { let garbageCollector: IGarbageCollector; beforeEach(async () => { - garbageCollector = createGarbageCollector({ gcOptions: { gcSweepGeneration: 1 } }); + garbageCollector = createGarbageCollector({ gcOptions: { enableGCSweep: true } }); }); it("can submit GC op compat behavior", async () => { diff --git a/packages/runtime/container-runtime/src/test/gc/gcConfigs.spec.ts b/packages/runtime/container-runtime/src/test/gc/gcConfigs.spec.ts index 2e1953621e2c..b578f3737011 100644 --- a/packages/runtime/container-runtime/src/test/gc/gcConfigs.spec.ts +++ b/packages/runtime/container-runtime/src/test/gc/gcConfigs.spec.ts @@ -40,8 +40,7 @@ import { nextGCVersion, stableGCVersion, gcVersionUpgradeToV4Key, - gcTombstoneGenerationOptionName, - gcSweepGenerationOptionName, + gcGenerationOptionName, throwOnTombstoneLoadOverrideKey, gcDisableThrowOnTombstoneLoadOptionName, GCVersion, @@ -176,7 +175,9 @@ describe("Garbage Collection configurations", () => { it("No metadata", () => { gc = createGcWithPrivateMembers({}); assert(!gc.configs.gcEnabled, "gcEnabled incorrect"); - assert(!gc.configs.sweepEnabled, "sweepEnabled incorrect"); + assert(!gc.configs.shouldRunGC, "shouldRunGC incorrect"); + assert(gc.configs.sweepEnabled, "sweepEnabled incorrect"); + assert(!gc.configs.shouldRunSweep, "shouldRunSweep incorrect"); assert( gc.configs.sessionExpiryTimeoutMs === undefined, "sessionExpiryTimeoutMs incorrect", @@ -197,14 +198,13 @@ describe("Garbage Collection configurations", () => { "latestSummaryGCVersion incorrect", ); }); - it("gcFeature 0, Sweep enabled via sweepGeneration", () => { + it("gcFeature 0, Sweep enabled via gcGeneration", () => { gc = createGcWithPrivateMembers( - { gcFeature: 0, gcFeatureMatrix: { sweepGeneration: 0 } }, - { [gcSweepGenerationOptionName]: 0 }, + { gcFeature: 0, gcFeatureMatrix: { gcGeneration: 0 } }, + { [gcGenerationOptionName]: 0 }, ); assert(!gc.configs.gcEnabled, "gcEnabled incorrect"); assert(gc.configs.sweepEnabled, "sweepEnabled incorrect"); - assert(!gc.configs.shouldRunSweep, "shouldRunSweep incorrect"); assert.equal( gc.summaryStateTracker.latestSummaryGCVersion, 0, @@ -221,7 +221,10 @@ describe("Garbage Collection configurations", () => { ); }); it("sweepEnabled value ignored", () => { - gc = createGcWithPrivateMembers({ sweepEnabled: true }); // no sweepGeneration option set + gc = createGcWithPrivateMembers( + { sweepEnabled: true }, + { [gcGenerationOptionName]: 1 }, // No persisted value, so sweep should not be allowed + ); assert(!gc.configs.sweepEnabled, "sweepEnabled incorrect"); }); it("sessionExpiryTimeoutMs set (sweepTimeoutMs unset)", () => { @@ -249,11 +252,59 @@ describe("Garbage Collection configurations", () => { gcFeature: 1, sessionExpiryTimeoutMs: customSessionExpiryDurationMs, sweepTimeoutMs: 123, - gcFeatureMatrix: { tombstoneGeneration: 1, sweepGeneration: 1 }, + gcFeatureMatrix: { gcGeneration: 1 }, }; gc = createGcWithPrivateMembers(inputMetadata, { - [gcTombstoneGenerationOptionName]: 2, // 2 should not be persisted - [gcSweepGenerationOptionName]: 2, // 2 should not be persisted + [gcGenerationOptionName]: 2, // 2 should not replace already-persisted value of 1 + }); + const outputMetadata = gc.getMetadata(); + const expectedOutputMetadata: IGCMetadata = { + ...inputMetadata, + sweepEnabled: false, // Hardcoded, not used + gcFeature: stableGCVersion, + }; + assert.deepEqual( + outputMetadata, + expectedOutputMetadata, + "getMetadata returned different metadata than loaded from", + ); + }); + it("Metadata Roundtrip - old file with tombstoneGeneration", () => { + const inputMetadata: IGCMetadata = { + sweepEnabled: true, // ignored + gcFeature: 1, + sessionExpiryTimeoutMs: customSessionExpiryDurationMs, + sweepTimeoutMs: 123, + gcFeatureMatrix: { tombstoneGeneration: 1 }, // legacy file before gcGeneration + }; + gc = createGcWithPrivateMembers(inputMetadata, { + [gcGenerationOptionName]: 2, // Will not be persisted - legacy file will only ever be stamped with tombstoneGeneration + }); + const outputMetadata = gc.getMetadata(); + const expectedOutputMetadata: IGCMetadata = { + ...inputMetadata, + sweepEnabled: false, // Hardcoded, not used + gcFeature: stableGCVersion, + }; + assert.deepEqual( + outputMetadata, + expectedOutputMetadata, + "getMetadata returned different metadata than loaded from", + ); + }); + it("Metadata Roundtrip transition to gcGeneration from tombstoneGeneration", () => { + const inputMetadata: IGCMetadata = { + sweepEnabled: true, // ignored + gcFeature: 1, + sessionExpiryTimeoutMs: customSessionExpiryDurationMs, + sweepTimeoutMs: 123, + gcFeatureMatrix: { gcGeneration: 1 }, + }; + // An app may write both Generation options to ease the transition. Only gcGeneration will be persisted + // (and previous to the change introducing gcGeneration, only tombstoneGeneration would have been persisted). + gc = createGcWithPrivateMembers(inputMetadata, { + [gcGenerationOptionName]: 1, + gcTombstoneGeneration: 1, // Legacy - will not be persisted but is ok to pass in }); const outputMetadata = gc.getMetadata(); const expectedOutputMetadata: IGCMetadata = { @@ -274,7 +325,7 @@ describe("Garbage Collection configurations", () => { gcFeature: 1, sessionExpiryTimeoutMs: customSessionExpiryDurationMs, sweepTimeoutMs: 123, - gcFeatureMatrix: { tombstoneGeneration: 1, sweepGeneration: 1 }, + gcFeatureMatrix: { gcGeneration: 1 }, }; gc = createGcWithPrivateMembers(inputMetadata); const outputMetadata = gc.getMetadata(); @@ -296,7 +347,7 @@ describe("Garbage Collection configurations", () => { gcFeature: 1, sessionExpiryTimeoutMs: customSessionExpiryDurationMs, sweepTimeoutMs: 123, - gcFeatureMatrix: { tombstoneGeneration: 1, sweepGeneration: 1 }, + gcFeatureMatrix: { gcGeneration: 1 }, }; gc = createGcWithPrivateMembers(inputMetadata); const outputMetadata = gc.getMetadata(); @@ -317,7 +368,9 @@ describe("Garbage Collection configurations", () => { it("No options", () => { gc = createGcWithPrivateMembers(undefined /* metadata */, {}); assert(gc.configs.gcEnabled, "gcEnabled incorrect"); - assert(!gc.configs.sweepEnabled, "sweepEnabled incorrect"); + assert(gc.configs.shouldRunGC, "shouldRunGC incorrect"); + assert(gc.configs.sweepEnabled, "sweepEnabled incorrect"); // Sweep is always allowed for a new container + assert(!gc.configs.shouldRunSweep, "shouldRunSweep incorrect"); assert( gc.configs.sessionExpiryTimeoutMs !== undefined, "sessionExpiryTimeoutMs incorrect", @@ -337,46 +390,24 @@ describe("Garbage Collection configurations", () => { gc = createGcWithPrivateMembers(undefined /* metadata */, { gcAllowed: false }); assert(!gc.configs.gcEnabled, "gcEnabled incorrect"); }); - it("sweepGeneration specified, gcAllowed false", () => { - assert.throws( - () => { - gc = createGcWithPrivateMembers(undefined /* metadata */, { - gcAllowed: false, - [gcSweepGenerationOptionName]: 1, - }); - }, - (e: IErrorBase) => e.errorType === "usageError", - "Should be unsupported", - ); - }); - it("Sweep enabled via sweepGeneration, gcAllowed true", () => { + it("Sweep enabled via gcGeneration, gcAllowed true", () => { gc = createGcWithPrivateMembers(undefined /* metadata */, { gcAllowed: true, - [gcSweepGenerationOptionName]: 1, + [gcGenerationOptionName]: 1, }); assert(gc.configs.gcEnabled, "gcEnabled incorrect"); assert(gc.configs.sweepEnabled, "sweepEnabled incorrect"); - assert(gc.configs.shouldRunSweep, "shouldRunSweep incorrect"); assert(gc.configs.sweepTimeoutMs !== undefined, "sweepTimeoutMs incorrect"); assert( gc.configs.sessionExpiryTimeoutMs !== undefined, "sessionExpiryTimeoutMs incorrect", ); }); - it("Sweep disabled (no sweepGeneration), sessionExpiry on", () => { - gc = createGcWithPrivateMembers(undefined /* metadata */, {}); - assert(!gc.configs.sweepEnabled, "sweepEnabled incorrect"); - assert( - gc.configs.sessionExpiryTimeoutMs !== undefined, - "sessionExpiryTimeoutMs incorrect", - ); - assert(gc.configs.sweepTimeoutMs !== undefined, "sweepTimeoutMs incorrect"); - }); - it("Sweep enabled via sweepGeneration, gcAllowed true, sessionExpiry off", () => { + it("Sweep enabled via gcGeneration, gcAllowed true, sessionExpiry off", () => { injectedSettings[runSessionExpiryKey] = false; gc = createGcWithPrivateMembers(undefined /* metadata */, { gcAllowed: true, - [gcSweepGenerationOptionName]: 1, + [gcGenerationOptionName]: 1, }); assert(gc.configs.gcEnabled, "gcEnabled incorrect"); assert(gc.configs.sweepEnabled, "sweepEnabled incorrect"); @@ -386,21 +417,21 @@ describe("Garbage Collection configurations", () => { ); assert(gc.configs.sweepTimeoutMs === undefined, "sweepTimeoutMs incorrect"); }); - it("TestOverride.SweepTimeout set, Sweep disabled (no sweepGeneration), sessionExpiry on", () => { + it("TestOverride.SweepTimeout set, sessionExpiry on", () => { injectedSettings[testOverrideSweepTimeoutKey] = 123; gc = createGcWithPrivateMembers(undefined /* metadata */, {}); - assert(!gc.configs.sweepEnabled, "sweepEnabled incorrect"); + assert(gc.configs.sweepEnabled, "sweepEnabled incorrect"); assert( gc.configs.sessionExpiryTimeoutMs === defaultSessionExpiryDurationMs, "sessionExpiryTimeoutMs incorrect", ); assert(gc.configs.sweepTimeoutMs === 123, "sweepTimeoutMs incorrect"); }); - it("TestOverride.SweepTimeout set, Sweep disabled (no sweepGeneration), sessionExpiry off", () => { + it("TestOverride.SweepTimeout set, sessionExpiry off", () => { injectedSettings[testOverrideSweepTimeoutKey] = 123; injectedSettings[runSessionExpiryKey] = false; gc = createGcWithPrivateMembers(undefined /* metadata */, {}); - assert(!gc.configs.sweepEnabled, "sweepEnabled incorrect"); + assert(gc.configs.sweepEnabled, "sweepEnabled incorrect"); assert( gc.configs.sessionExpiryTimeoutMs === undefined, "sessionExpiryTimeoutMs incorrect", @@ -413,11 +444,10 @@ describe("Garbage Collection configurations", () => { gcFeature: stableGCVersion, sessionExpiryTimeoutMs: defaultSessionExpiryDurationMs, sweepTimeoutMs: defaultSessionExpiryDurationMs + 6 * oneDayMs, - gcFeatureMatrix: { tombstoneGeneration: 2, sweepGeneration: 2 }, + gcFeatureMatrix: { gcGeneration: 2 }, }; gc = createGcWithPrivateMembers(undefined /* metadata */, { - [gcTombstoneGenerationOptionName]: 2, - [gcSweepGenerationOptionName]: 2, + [gcGenerationOptionName]: 2, }); const outputMetadata = gc.getMetadata(); assert.deepEqual( @@ -443,16 +473,22 @@ describe("Garbage Collection configurations", () => { "getMetadata returned different metadata than expected", ); }); - it("Metadata Roundtrip with only sweepGeneration", () => { + it("Metadata Roundtrip transition to gcGeneration from tombstoneGeneration", () => { const expectedMetadata: IGCMetadata = { sweepEnabled: false, // hardcoded, not used gcFeature: stableGCVersion, sessionExpiryTimeoutMs: defaultSessionExpiryDurationMs, sweepTimeoutMs: defaultSessionExpiryDurationMs + 6 * oneDayMs, - gcFeatureMatrix: { sweepGeneration: 2, tombstoneGeneration: undefined }, + gcFeatureMatrix: { + gcGeneration: 2, + // tombstoneGeneration will not be persisted + }, }; + // An app may write both Generation options to ease the transition. Only gcGeneration will be persisted + // (and previous to the change introducing gcGeneration, only tombstoneGeneration would have been persisted). gc = createGcWithPrivateMembers(undefined /* metadata */, { - [gcSweepGenerationOptionName]: 2, + [gcGenerationOptionName]: 2, + gcTombstoneGeneration: 2, // Legacy - will not be persisted but is ok to pass in }); const outputMetadata = gc.getMetadata(); assert.deepEqual( @@ -721,42 +757,55 @@ describe("Garbage Collection configurations", () => { describe("shouldRunSweep", () => { const testCases: { shouldRunGC: boolean; - sweepEnabled: boolean; + sweepEnabled_doc: boolean; + sweepEnabled_session: boolean; shouldRunSweep?: boolean; expectedShouldRunSweep: boolean; }[] = [ { - shouldRunGC: false, - sweepEnabled: true, + shouldRunGC: false, // Veto power + sweepEnabled_doc: true, + sweepEnabled_session: true, shouldRunSweep: true, expectedShouldRunSweep: false, }, { shouldRunGC: true, - sweepEnabled: true, + sweepEnabled_doc: true, + sweepEnabled_session: true, shouldRunSweep: true, expectedShouldRunSweep: true, }, { shouldRunGC: true, - sweepEnabled: true, - shouldRunSweep: false, + sweepEnabled_doc: true, + sweepEnabled_session: true, + shouldRunSweep: false, // Veto power expectedShouldRunSweep: false, }, { shouldRunGC: true, - sweepEnabled: false, - shouldRunSweep: true, + sweepEnabled_doc: true, + sweepEnabled_session: false, + shouldRunSweep: true, // Overrides sweepEnabled_session expectedShouldRunSweep: true, }, { shouldRunGC: true, - sweepEnabled: true, + sweepEnabled_doc: true, + sweepEnabled_session: true, expectedShouldRunSweep: true, }, { shouldRunGC: true, - sweepEnabled: false, + sweepEnabled_doc: true, + sweepEnabled_session: false, // Veto + expectedShouldRunSweep: false, + }, + { + shouldRunGC: true, + sweepEnabled_doc: false, // Veto + sweepEnabled_session: true, expectedShouldRunSweep: false, }, ]; @@ -765,9 +814,13 @@ describe("Garbage Collection configurations", () => { injectedSettings[runGCKey] = testCase.shouldRunGC; injectedSettings[runSweepKey] = testCase.shouldRunSweep; gc = createGcWithPrivateMembers( - undefined /* metadata */, { - [gcSweepGenerationOptionName]: testCase.sweepEnabled ? 1 : undefined, + gcFeatureMatrix: { gcGeneration: 1 }, + sessionExpiryTimeoutMs: defaultSessionExpiryDurationMs, + } /* metadata */, + { + enableGCSweep: testCase.sweepEnabled_session ? true : undefined, + [gcGenerationOptionName]: testCase.sweepEnabled_doc ? 1 : 2, } /* gcOptions */, ); assert.equal( @@ -777,7 +830,7 @@ describe("Garbage Collection configurations", () => { ); assert.equal( gc.configs.sweepEnabled, - testCase.sweepEnabled, + testCase.sweepEnabled_doc, "PRECONDITION: sweepEnabled set incorrectly", ); assert.equal( @@ -891,27 +944,42 @@ describe("Garbage Collection configurations", () => { }); }); - describe("throwOnTombstoneLoad", () => { + describe("throwOnTombstoneLoad (using new container)", () => { + beforeEach(() => { + injectedSettings[testOverrideSessionExpiryMsKey] = defaultSessionExpiryDurationMs; // Required for sweep to be enabled + }); it("gcDisableThrowOnTombstoneLoad true", () => { gc = createGcWithPrivateMembers( - { gcFeature: 0 }, - { [gcDisableThrowOnTombstoneLoadOptionName]: true }, + undefined /* metadata */, + { enableGCSweep: true, [gcDisableThrowOnTombstoneLoadOptionName]: true }, false /* isSummarizerClient */, ); assert.equal(gc.configs.throwOnTombstoneLoad, false, "throwOnTombstoneLoad incorrect"); }); it("gcDisableThrowOnTombstoneLoad false", () => { gc = createGcWithPrivateMembers( - { gcFeature: 0 }, - { [gcDisableThrowOnTombstoneLoadOptionName]: false }, + undefined /* metadata */, + { enableGCSweep: true, [gcDisableThrowOnTombstoneLoadOptionName]: false }, false /* isSummarizerClient */, ); assert.equal(gc.configs.throwOnTombstoneLoad, true, "throwOnTombstoneLoad incorrect"); }); it("gcDisableThrowOnTombstoneLoad undefined", () => { gc = createGcWithPrivateMembers( - { gcFeature: 0 }, - undefined /* gcOptions */, + undefined /* metadata */, + { + enableGCSweep: true, + [gcDisableThrowOnTombstoneLoadOptionName]: undefined, + }, + false /* isSummarizerClient */, + ); + assert.equal(gc.configs.throwOnTombstoneLoad, true, "throwOnTombstoneLoad incorrect"); + }); + it("gcDisableThrowOnTombstoneLoad undefined - Sweep Disabled does not interfere", () => { + injectedSettings[runSweepKey] = false; // Disable Sweep + gc = createGcWithPrivateMembers( + undefined /* metadata */, + { [gcDisableThrowOnTombstoneLoadOptionName]: undefined }, false /* isSummarizerClient */, ); assert.equal(gc.configs.throwOnTombstoneLoad, true, "throwOnTombstoneLoad incorrect"); @@ -919,8 +987,8 @@ describe("Garbage Collection configurations", () => { it("Old 'enable' option false (ignored)", () => { const gcThrowOnTombstoneLoadOptionName_old = "gcThrowOnTombstoneLoad"; gc = createGcWithPrivateMembers( - { gcFeature: 0 }, - { [gcThrowOnTombstoneLoadOptionName_old]: false }, + undefined /* metadata */, + { enableGCSweep: true, [gcThrowOnTombstoneLoadOptionName_old]: false }, false /* isSummarizerClient */, ); assert.equal(gc.configs.throwOnTombstoneLoad, true, "throwOnTombstoneLoad incorrect"); @@ -928,8 +996,8 @@ describe("Garbage Collection configurations", () => { it("throwOnTombstoneLoad enabled via override", () => { injectedSettings[throwOnTombstoneLoadOverrideKey] = true; gc = createGcWithPrivateMembers( - { gcFeature: 0 }, - { [gcDisableThrowOnTombstoneLoadOptionName]: true }, + undefined /* metadata */, + { enableGCSweep: true, [gcDisableThrowOnTombstoneLoadOptionName]: true }, false /* isSummarizerClient */, ); assert.equal(gc.configs.throwOnTombstoneLoad, true, "throwOnTombstoneLoad incorrect"); @@ -937,8 +1005,8 @@ describe("Garbage Collection configurations", () => { it("throwOnTombstoneLoad disabled via override", () => { injectedSettings[throwOnTombstoneLoadOverrideKey] = false; gc = createGcWithPrivateMembers( - { gcFeature: 0 }, - { [gcDisableThrowOnTombstoneLoadOptionName]: false }, + undefined /* metadata */, + { enableGCSweep: true, [gcDisableThrowOnTombstoneLoadOptionName]: false }, false /* isSummarizerClient */, ); assert.equal(gc.configs.throwOnTombstoneLoad, false, "throwOnTombstoneLoad incorrect"); diff --git a/packages/runtime/container-runtime/src/test/gc/gcHelpers.spec.ts b/packages/runtime/container-runtime/src/test/gc/gcHelpers.spec.ts index cfef5ca1821f..3c87b93b9df1 100644 --- a/packages/runtime/container-runtime/src/test/gc/gcHelpers.spec.ts +++ b/packages/runtime/container-runtime/src/test/gc/gcHelpers.spec.ts @@ -6,10 +6,10 @@ import { strict as assert } from "assert"; import { GCFeatureMatrix } from "../../gc"; // eslint-disable-next-line import/no-internal-modules -import { shouldAllowGcSweep, shouldAllowGcTombstoneEnforcement } from "../../gc/gcHelpers"; +import { shouldAllowGcSweep } from "../../gc/gcHelpers"; describe("Garbage Collection Helpers Tests", () => { - describe("shouldAllowGcTombstoneEnforcement", () => { + describe("[TEMP] shouldAllowGcTombstoneEnforcement - Show behavior change as it's replaced by shouldAllowGcSweep", () => { const testCases: { persisted: number | undefined; current: number | undefined; @@ -48,7 +48,7 @@ describe("Garbage Collection Helpers Tests", () => { ]; testCases.forEach(({ persisted, current, expectedShouldAllowValue }) => { it(`persisted=${persisted}, current=${current}`, () => { - const shouldAllow = shouldAllowGcTombstoneEnforcement(persisted, current); + const shouldAllow = shouldAllowGcSweep({ tombstoneGeneration: persisted }, current); assert.equal(shouldAllow, expectedShouldAllowValue); }); }); @@ -63,12 +63,12 @@ describe("Garbage Collection Helpers Tests", () => { { persisted: {}, current: undefined, - expectedShouldAllowValue: false, + expectedShouldAllowValue: true, }, { - persisted: { sweepGeneration: 1 }, + persisted: { gcGeneration: 1 }, current: undefined, - expectedShouldAllowValue: false, + expectedShouldAllowValue: true, }, { persisted: {}, @@ -80,28 +80,33 @@ describe("Garbage Collection Helpers Tests", () => { current: 0, expectedShouldAllowValue: true, }, + { + persisted: { tombstoneGeneration: 1 }, + current: 1, + expectedShouldAllowValue: true, + }, { persisted: { tombstoneGeneration: 1 }, current: 0, expectedShouldAllowValue: false, }, { - persisted: { sweepGeneration: 0 }, + persisted: { gcGeneration: 0 }, current: 0, expectedShouldAllowValue: true, }, { - persisted: { sweepGeneration: 1 }, + persisted: { gcGeneration: 1 }, current: 1, expectedShouldAllowValue: true, }, { - persisted: { sweepGeneration: 1 }, + persisted: { gcGeneration: 1 }, current: 2, expectedShouldAllowValue: false, }, { - persisted: { sweepGeneration: 2 }, + persisted: { gcGeneration: 2 }, current: 1, expectedShouldAllowValue: false, }, diff --git a/packages/runtime/container-runtime/src/test/gc/gcStats.spec.ts b/packages/runtime/container-runtime/src/test/gc/gcStats.spec.ts index 551255c178b5..94d646103419 100644 --- a/packages/runtime/container-runtime/src/test/gc/gcStats.spec.ts +++ b/packages/runtime/container-runtime/src/test/gc/gcStats.spec.ts @@ -316,7 +316,7 @@ describe("Garbage Collection Stats", () => { it("can generate stats with deleted nodes - sweep enabled", async () => { // Create garbage collector with sweep enabled. garbageCollector = createGarbageCollector({ - gcOptions: { gcSweepGeneration: 1, sweepGracePeriodMs }, + gcOptions: { enableGCSweep: true, sweepGracePeriodMs }, }); let previousGCMessagesCount = gcMessagesCount; @@ -371,7 +371,7 @@ describe("Garbage Collection Stats", () => { */ it("can generate stats with deleted nodes after multiple sweep runs - sweep enabled", async () => { garbageCollector = createGarbageCollector({ - gcOptions: { gcSweepGeneration: 1, sweepGracePeriodMs }, + gcOptions: { enableGCSweep: true, sweepGracePeriodMs }, }); const expectedStats = initialStats; diff --git a/packages/runtime/container-runtime/src/test/gc/gcTelemetry.spec.ts b/packages/runtime/container-runtime/src/test/gc/gcTelemetry.spec.ts index 04f91af894d9..1175c5a68e2d 100644 --- a/packages/runtime/container-runtime/src/test/gc/gcTelemetry.spec.ts +++ b/packages/runtime/container-runtime/src/test/gc/gcTelemetry.spec.ts @@ -83,7 +83,6 @@ describe("GC Telemetry Tracker", () => { sessionExpiryTimeoutMs: defaultSessionExpiryDurationMs, sweepTimeoutMs: enableSweep ? sweepTimeoutMs : undefined, sweepGracePeriodMs, - tombstoneEnforcementAllowed: false, throwOnTombstoneLoad: false, throwOnTombstoneUsage: false, throwOnInactiveLoad: false, diff --git a/packages/runtime/container-runtime/src/test/types/validateContainerRuntimePrevious.generated.ts b/packages/runtime/container-runtime/src/test/types/validateContainerRuntimePrevious.generated.ts index b9c44f65a235..3fbe054ce916 100644 --- a/packages/runtime/container-runtime/src/test/types/validateContainerRuntimePrevious.generated.ts +++ b/packages/runtime/container-runtime/src/test/types/validateContainerRuntimePrevious.generated.ts @@ -265,26 +265,26 @@ use_old_ClassDeclaration_FluidDataStoreRegistry( /* * Validate forward compat by using old type in place of current type * If breaking change required, add in package.json under typeValidation.broken: -* "InterfaceDeclaration_GCFeatureMatrix": {"forwardCompat": false} +* "RemovedInterfaceDeclaration_GCFeatureMatrix": {"forwardCompat": false} */ declare function get_old_InterfaceDeclaration_GCFeatureMatrix(): TypeOnly; -declare function use_current_InterfaceDeclaration_GCFeatureMatrix( +declare function use_current_RemovedInterfaceDeclaration_GCFeatureMatrix( use: TypeOnly): void; -use_current_InterfaceDeclaration_GCFeatureMatrix( +use_current_RemovedInterfaceDeclaration_GCFeatureMatrix( get_old_InterfaceDeclaration_GCFeatureMatrix()); /* * Validate back compat by using current type in place of old type * If breaking change required, add in package.json under typeValidation.broken: -* "InterfaceDeclaration_GCFeatureMatrix": {"backCompat": false} +* "RemovedInterfaceDeclaration_GCFeatureMatrix": {"backCompat": false} */ -declare function get_current_InterfaceDeclaration_GCFeatureMatrix(): +declare function get_current_RemovedInterfaceDeclaration_GCFeatureMatrix(): TypeOnly; declare function use_old_InterfaceDeclaration_GCFeatureMatrix( use: TypeOnly): void; use_old_InterfaceDeclaration_GCFeatureMatrix( - get_current_InterfaceDeclaration_GCFeatureMatrix()); + get_current_RemovedInterfaceDeclaration_GCFeatureMatrix()); /* * Validate forward compat by using old type in place of current type diff --git a/packages/runtime/datastore-definitions/CHANGELOG.md b/packages/runtime/datastore-definitions/CHANGELOG.md index b6b31412769d..ea3bc766b9d0 100644 --- a/packages/runtime/datastore-definitions/CHANGELOG.md +++ b/packages/runtime/datastore-definitions/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/datastore-definitions +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/runtime/datastore/CHANGELOG.md b/packages/runtime/datastore/CHANGELOG.md index 4d4a29de846b..de6b17e74f15 100644 --- a/packages/runtime/datastore/CHANGELOG.md +++ b/packages/runtime/datastore/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/datastore +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/runtime/id-compressor/CHANGELOG.md b/packages/runtime/id-compressor/CHANGELOG.md index 12c139cec3f3..b10f57c1efe4 100644 --- a/packages/runtime/id-compressor/CHANGELOG.md +++ b/packages/runtime/id-compressor/CHANGELOG.md @@ -1 +1,3 @@ # @fluidframework/id-compressor + +## 2.0.0-internal.7.4.0 diff --git a/packages/runtime/id-compressor/README.md b/packages/runtime/id-compressor/README.md index d7c06086331e..dd4904e355e5 100644 --- a/packages/runtime/id-compressor/README.md +++ b/packages/runtime/id-compressor/README.md @@ -1,22 +1,60 @@ -# **Distributed ID Allocator** +# @fluidframework/id-compressor A library which generates small number representations of arbitrary non-colliding Version 4 UUIDs ("stable IDs") across multiple sessions in a network. This scheme enables a distributed application to utilize the global uniqueness guarantees of UUIDs while maintaining the performance advantages of small integers. -## **Overview** + + + + + +## Installation + +To get started, install the package by running the following command: + +```bash +npm i @fluidframework/id-compressor +``` + + + + + + + + + + +## Using Fluid Framework libraries + +When taking a dependency on a Fluid Framework library, we recommend using a `^` (caret) version range, such as `^1.3.4`. +While Fluid Framework libraries may use different ranges with interdependencies between other Fluid Framework libraries, +library consumers should always prefer `^`. + +Note that when depending on a library version of the form `2.0.0-internal.x.y.z`, called the Fluid internal version scheme, +you must use a `>= <` dependency range (such as `>=2.0.0-internal.x.y.z <2.0.0-internal.w.0.0` where `w` is `x+1`). +Standard `^` and `~` ranges will not work as expected. +See the [@fluid-tools/version-tools](https://github.com/microsoft/FluidFramework/blob/main/build-tools/packages/version-tools/README.md) +package for more information including tools to convert between version schemes. + + + + + +## Overview The distributed ID allocation scheme allows clients to use, store, and reference small numbers that map to UUIDs rather than the UUIDs themselves. The primary benefits are improved memory efficiency and reduced storage size, as well as improved runtime performance when used as keys in collections. The scheme requires a total order for ID allocation, so the allocator is designed to work within a service that provides centralized total order broadcast. -## **Sessions** +### Sessions A session can be thought of as a unique identifier for a single allocator. Even if an allocator is taken offline, serialized to disk, and rehydrated back, it's considered the same session if it has the same session ID. -## **Document** +### Document The set of IDs generated by all Sessions contributing to the same distributed collection (e.g. an individual collaborative document). Uniqueness of allocated IDs is limited to the document context (unless in their UUID form), and thus IDs in their compressed form are not portable between documents. -## **Generation API** +### Generation API New IDs are generated via a synchronous API on the allocator. The API returns a small number representation of the UUID with the following guarantees: @@ -24,7 +62,7 @@ New IDs are generated via a synchronous API on the allocator. The API returns a - Prior to the service being notified of the ID's creation, it is unique within the scope of the session (i.e. the new ID will not collide with other IDs from the same allocator, but it can collide with IDs from a different allocator in the same network). - After the service has been notified of the ID's creation and has determined a total ordering between all clients creating IDs, the ID will have a "final" form that is a small number representation that is unique across the [document](#document). -## **ID Spaces** +### ID Spaces The allocation scheme separates the small-number IDs into two "spaces": @@ -33,7 +71,7 @@ The allocation scheme separates the small-number IDs into two "spaces": Each of these spaces is represented by a discrete type. This allows for the direct encoding of an ID's uniqueness guarantees without contextual ambiguity. An ID can be "normalized" from one space to the other with a sychronous call. -## **Usage Guidelines** +### Usage Guidelines When delivering Allocated IDs to application authors for use in place of V4 UUIDs, follow these guidelines: @@ -44,19 +82,19 @@ When delivering Allocated IDs to application authors for use in place of V4 UUID - Use op space IDs for serialized forms, such as sending information over the wire or storing it in a file. Op space IDs are always generated in their _final_ form when possible, which imparts a performance benefit by reducing normalization work when a client receives a network operation or rehydrates an allocator. - When serializing op space IDs, annotate the entire context (e.g., file or network operation) with the session ID. This is necessary because not all IDs in op space are in their final form. Any non-finalized IDs will still be in their session space form, unique only within that specific session. Annotating the entire context with the session ID ensures that recipients of the serialized data can correctly interpret and process the non-finalized IDs. -## **Efficiency Properties** +### Efficiency Properties -### **UUID Generation** +#### UUID Generation The allocator generates UUIDs in non-random ways to reduce entropy, optimizing storage of data. A session begins with a random UUID, and subsequent IDs are allocated sequentially. UUIDs generated with this strategy are less likely to collide than fully random UUIDs, and this fact can be leveraged to compact the on-disk and in-memory representations of the allocator. UUID generation is O(1). -### **Decompression/recompression** +#### Decompression/recompression Converting an allocated ID into its UUID form (decompression) and the reverse (recompression) are both O(logn) in the number of IDs created by the originating session. -### **Clustering** +#### Clustering The sequential allocation approach allows the system to implement a clustering scheme. @@ -64,6 +102,69 @@ As allocators across the network create IDs, they reserve blocks of positive ID Clusters are efficient to store, requiring only two integers: the base positive integer in the cluster and the count of reserved IDs in that cluster. -### **Normalization** +#### Normalization Normalization is O(logn) in the number of IDs created by the originating session, as it requires a simple binary search on the clusters owned by that session. + + + + + + +## Contribution Guidelines + +There are many ways to [contribute](https://github.com/microsoft/FluidFramework/blob/main/CONTRIBUTING.md) to Fluid. + +- Participate in Q&A in our [GitHub Discussions](https://github.com/microsoft/FluidFramework/discussions). +- [Submit bugs](https://github.com/microsoft/FluidFramework/issues) and help us verify fixes as they are checked in. +- Review the [source code changes](https://github.com/microsoft/FluidFramework/pulls). +- [Contribute bug fixes](https://github.com/microsoft/FluidFramework/blob/main/CONTRIBUTING.md). + +Detailed instructions for working in the repo can be found in the [Wiki](https://github.com/microsoft/FluidFramework/wiki). + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +This project may contain Microsoft trademarks or logos for Microsoft projects, products, or services. +Use of these trademarks or logos must follow Microsoft’s [Trademark & Brand Guidelines](https://www.microsoft.com/trademarks). +Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. + + + + + + + + + + +## Help + +Not finding what you're looking for in this README? Check out our [GitHub +Wiki](https://github.com/microsoft/FluidFramework/wiki) or [fluidframework.com](https://fluidframework.com/docs/). + +Still not finding what you're looking for? Please [file an +issue](https://github.com/microsoft/FluidFramework/wiki/Submitting-Bugs-and-Feature-Requests). + +Thank you! + + + + + + + + + + +## Trademark + +This project may contain Microsoft trademarks or logos for Microsoft projects, products, or services. + +Use of these trademarks or logos must follow Microsoft's [Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). + +Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. + + + + diff --git a/packages/runtime/runtime-definitions/CHANGELOG.md b/packages/runtime/runtime-definitions/CHANGELOG.md index 9f00a5b072d3..c89ff39b4b0a 100644 --- a/packages/runtime/runtime-definitions/CHANGELOG.md +++ b/packages/runtime/runtime-definitions/CHANGELOG.md @@ -1,5 +1,17 @@ # @fluidframework/runtime-definitions +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- container-runtime/runtime-definitions: `IdCompressor` and related types deprecated ([#18749](https://github.com/microsoft/FluidFramework/issues/18749)) [6f070179de](https://github.com/microsoft/FluidFramework/commits/6f070179ded7c2f4398252f75485e85b39725419) + + `IdCompressor` and related types from the @fluidframework/container-runtime and @fluidframework/runtime-definitions + packages have been deprecated. They can now be found in a new package, @fluidframework/id-compressor. + + The `IdCompressor` class is deprecated even in the new package. Consumers should use the interfaces, `IIdCompressor` and + `IIdCompressorCore`, in conjunction with the factory function `createIdCompressor` instead. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/runtime/runtime-utils/CHANGELOG.md b/packages/runtime/runtime-utils/CHANGELOG.md index 0f6f6c13f375..51a529b0c1e9 100644 --- a/packages/runtime/runtime-utils/CHANGELOG.md +++ b/packages/runtime/runtime-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/runtime-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/runtime/test-runtime-utils/CHANGELOG.md b/packages/runtime/test-runtime-utils/CHANGELOG.md index 7caf8a3b5bb3..b1e678266dfa 100644 --- a/packages/runtime/test-runtime-utils/CHANGELOG.md +++ b/packages/runtime/test-runtime-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/test-runtime-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/runtime/test-runtime-utils/src/assertionShortCodesMap.ts b/packages/runtime/test-runtime-utils/src/assertionShortCodesMap.ts index 0cac6d8976af..177306a230c7 100644 --- a/packages/runtime/test-runtime-utils/src/assertionShortCodesMap.ts +++ b/packages/runtime/test-runtime-utils/src/assertionShortCodesMap.ts @@ -885,7 +885,6 @@ export const shortCodeMap = { "0x569": "Must provide a change composer if modifying moves", "0x56e": "summary upload manager should have been initialized", "0x56f": "Should be loaded only once", - "0x570": "Inconsistent state! GC says the data store is deleted, but the data store is not deleted from the runtime.", "0x573": "Expected branches to be related", "0x576": "branch A and branch B must be related", "0x577": "Expected revision to be valid RevisionTag", diff --git a/packages/service-clients/end-to-end-tests/odsp-client/CHANGELOG.md b/packages/service-clients/end-to-end-tests/odsp-client/CHANGELOG.md new file mode 100644 index 000000000000..0709b3e422fd --- /dev/null +++ b/packages/service-clients/end-to-end-tests/odsp-client/CHANGELOG.md @@ -0,0 +1,3 @@ +# @fluid-experimental/odsp-end-to-end-tests + +## 2.0.0-internal.7.4.0 diff --git a/packages/service-clients/end-to-end-tests/odsp-client/LICENSE b/packages/service-clients/end-to-end-tests/odsp-client/LICENSE index f9ad92ab0b15..60af0a6a40e9 100644 --- a/packages/service-clients/end-to-end-tests/odsp-client/LICENSE +++ b/packages/service-clients/end-to-end-tests/odsp-client/LICENSE @@ -18,4 +18,4 @@ 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. \ No newline at end of file +SOFTWARE. diff --git a/packages/service-clients/end-to-end-tests/odsp-client/package.json b/packages/service-clients/end-to-end-tests/odsp-client/package.json index e50badceac5e..7395eda1b016 100644 --- a/packages/service-clients/end-to-end-tests/odsp-client/package.json +++ b/packages/service-clients/end-to-end-tests/odsp-client/package.json @@ -1,7 +1,6 @@ { "name": "@fluid-experimental/odsp-end-to-end-tests", "version": "2.0.0-internal.8.0.0", - "private": true, "description": "Odsp client end to end tests", "homepage": "https://fluidframework.com", "repository": { diff --git a/packages/service-clients/odsp-client/CHANGELOG.md b/packages/service-clients/odsp-client/CHANGELOG.md index 9b7cc7ae1dd4..d8da89979d11 100644 --- a/packages/service-clients/odsp-client/CHANGELOG.md +++ b/packages/service-clients/odsp-client/CHANGELOG.md @@ -1,3 +1,7 @@ # @fluid-experimental/odsp-client +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 diff --git a/packages/test/functional-tests/CHANGELOG.md b/packages/test/functional-tests/CHANGELOG.md index 5873b3bc9538..af2936d29bcc 100644 --- a/packages/test/functional-tests/CHANGELOG.md +++ b/packages/test/functional-tests/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/functional-tests +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/test/local-server-tests/CHANGELOG.md b/packages/test/local-server-tests/CHANGELOG.md index e788a8351534..ea33ee0dc752 100644 --- a/packages/test/local-server-tests/CHANGELOG.md +++ b/packages/test/local-server-tests/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/local-server-tests +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/test/mocha-test-setup/CHANGELOG.md b/packages/test/mocha-test-setup/CHANGELOG.md index 0ef70d744905..7fd52db49b6c 100644 --- a/packages/test/mocha-test-setup/CHANGELOG.md +++ b/packages/test/mocha-test-setup/CHANGELOG.md @@ -1,5 +1,21 @@ # @fluidframework/mocha-test-setup +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- azure-client: Deprecated FluidStatic Classes ([#18402](https://github.com/microsoft/FluidFramework/issues/18402)) [589ec39de5](https://github.com/microsoft/FluidFramework/commits/589ec39de52116c7f782319e6f6aa61bc5aa9964) + + Several FluidStatic classes were unnecessarily exposed. They have been replaced with creation functions. This helps us + keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the + public surface area of downstream packages. The deprecated classes are as follows: + + - `AzureAudience` (use `IAzureAudience` instead) + - `TinyliciousAudience` (use `ITinyliciousAudience` instead) + - `DOProviderContainerRuntimeFactory` + - `FluidContainer` + - `ServiceAudience` + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/test/snapshots/CHANGELOG.md b/packages/test/snapshots/CHANGELOG.md index 428927580f17..98bf08cbe5b6 100644 --- a/packages/test/snapshots/CHANGELOG.md +++ b/packages/test/snapshots/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/test-snapshots +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/test/stochastic-test-utils/CHANGELOG.md b/packages/test/stochastic-test-utils/CHANGELOG.md index 0ec03ba72ccc..f154251ccf93 100644 --- a/packages/test/stochastic-test-utils/CHANGELOG.md +++ b/packages/test/stochastic-test-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-private/stochastic-test-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 ### Minor Changes diff --git a/packages/test/test-app-insights-logger/CHANGELOG.md b/packages/test/test-app-insights-logger/CHANGELOG.md index 517775b7bb8d..69e32ecd2f5c 100644 --- a/packages/test/test-app-insights-logger/CHANGELOG.md +++ b/packages/test/test-app-insights-logger/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/test-app-insights-logger +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/test/test-driver-definitions/CHANGELOG.md b/packages/test/test-driver-definitions/CHANGELOG.md index d3f99d3a3541..31101e3c2356 100644 --- a/packages/test/test-driver-definitions/CHANGELOG.md +++ b/packages/test/test-driver-definitions/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/test-driver-definitions +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/test/test-drivers/CHANGELOG.md b/packages/test/test-drivers/CHANGELOG.md index 2771f7261a88..12ea6369dc0f 100644 --- a/packages/test/test-drivers/CHANGELOG.md +++ b/packages/test/test-drivers/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-private/test-drivers +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 ### Minor Changes diff --git a/packages/test/test-end-to-end-tests/CHANGELOG.md b/packages/test/test-end-to-end-tests/CHANGELOG.md index 6f95079e62ed..ffe82131086d 100644 --- a/packages/test/test-end-to-end-tests/CHANGELOG.md +++ b/packages/test/test-end-to-end-tests/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-private/test-end-to-end-tests +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/test/test-end-to-end-tests/src/test/gc/gcSweepAttachmentBlobs.spec.ts b/packages/test/test-end-to-end-tests/src/test/gc/gcSweepAttachmentBlobs.spec.ts index fcfad93d4235..faafaabb04e7 100644 --- a/packages/test/test-end-to-end-tests/src/test/gc/gcSweepAttachmentBlobs.spec.ts +++ b/packages/test/test-end-to-end-tests/src/test/gc/gcSweepAttachmentBlobs.spec.ts @@ -40,7 +40,7 @@ describeCompat("GC attachment blob sweep tests", "NoCompat", (getTestObjectProvi const settings = {}; const gcOptions: IGCRuntimeOptions = { inactiveTimeoutMs: 0, - gcSweepGeneration: 1, + enableGCSweep: true, sweepGracePeriodMs: 0, // Skip Tombstone, these tests focus on Sweep }; const testContainerConfig: ITestContainerConfig = { diff --git a/packages/test/test-end-to-end-tests/src/test/gc/gcSweepDataStores.spec.ts b/packages/test/test-end-to-end-tests/src/test/gc/gcSweepDataStores.spec.ts index 554763b7bac3..7746975a4573 100644 --- a/packages/test/test-end-to-end-tests/src/test/gc/gcSweepDataStores.spec.ts +++ b/packages/test/test-end-to-end-tests/src/test/gc/gcSweepDataStores.spec.ts @@ -48,7 +48,7 @@ describeCompat("GC data store sweep tests", "NoCompat", (getTestObjectProvider) const gcOptions: IGCRuntimeOptions = { inactiveTimeoutMs: 0, - gcSweepGeneration: 1, + enableGCSweep: true, sweepGracePeriodMs: 0, // Skip Tombstone, these tests focus on Sweep }; const testContainerConfig: ITestContainerConfig = { diff --git a/packages/test/test-end-to-end-tests/src/test/gc/gcSweepUnreferencePhases.spec.ts b/packages/test/test-end-to-end-tests/src/test/gc/gcSweepUnreferencePhases.spec.ts index 45b6a7b95d15..46e5bc591636 100644 --- a/packages/test/test-end-to-end-tests/src/test/gc/gcSweepUnreferencePhases.spec.ts +++ b/packages/test/test-end-to-end-tests/src/test/gc/gcSweepUnreferencePhases.spec.ts @@ -40,7 +40,7 @@ describeCompat("GC unreference phases", "NoCompat", (getTestObjectProvider) => { const settings = {}; const gcOptions: IGCRuntimeOptions = { inactiveTimeoutMs: sweepTimeoutMs / 2, // Required to avoid an error - gcSweepGeneration: 1, + enableGCSweep: true, sweepGracePeriodMs, }; const testContainerConfig: ITestContainerConfig = { diff --git a/packages/test/test-end-to-end-tests/src/test/gc/gcTombstoneDataStores.spec.ts b/packages/test/test-end-to-end-tests/src/test/gc/gcTombstoneDataStores.spec.ts index 11b4cdd2c404..c9e9124b70dc 100644 --- a/packages/test/test-end-to-end-tests/src/test/gc/gcTombstoneDataStores.spec.ts +++ b/packages/test/test-end-to-end-tests/src/test/gc/gcTombstoneDataStores.spec.ts @@ -57,17 +57,17 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid const testContainerConfig: ITestContainerConfig = { runtimeOptions: { - gcOptions: { inactiveTimeoutMs: 0 }, + gcOptions: { enableGCSweep: true, inactiveTimeoutMs: 0 }, }, loaderProps: { configProvider: mockConfigProvider(settings) }, }; - const testContainerConfigWithFutureMinGcOption: ITestContainerConfig = { + const testContainerConfigWithFutureGCGenerationOption: ITestContainerConfig = { runtimeOptions: { summaryOptions: testContainerConfig.runtimeOptions?.summaryOptions, gcOptions: { ...testContainerConfig.runtimeOptions?.gcOptions, // Different from undefined (the persisted value) so will disable GC enforcement - gcTombstoneGeneration: 2, + gcGeneration: 2, }, }, loaderProps: testContainerConfig.loaderProps, @@ -85,11 +85,11 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid async function loadContainer( summaryVersion: string, - disableTombstoneFailureViaOption: boolean = false, + disableTombstoneFailureViaGCGenerationOption: boolean = false, logger?: ITelemetryBaseLogger, ) { - const config = disableTombstoneFailureViaOption - ? testContainerConfigWithFutureMinGcOption + const config = disableTombstoneFailureViaGCGenerationOption + ? testContainerConfigWithFutureGCGenerationOption : testContainerConfig; const config2: ITestContainerConfig = { ...config, @@ -564,7 +564,7 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid ); itExpects( - "Requesting tombstoned datastores succeeds for legacy document given gcTombstoneGeneration option is defined", + "Requesting tombstoned datastores succeeds for legacy document given gcGeneration option is defined", [ // Interactive client's request that succeeds { @@ -584,11 +584,11 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid const logger = new MockLogger(); const container = await loadContainer( summaryVersion, - true /* disableTombstoneFailureViaOption */, + true /* disableTombstoneFailureViaGCGenerationOption */, logger, ); - // This request succeeds even though the datastore is tombstoned, on account of the later gcTombstoneGeneration passed in + // This request succeeds even though the datastore is tombstoned, on account of the later gcGeneration passed in const entryPoint = (await container.getEntryPoint()) as ITestDataObject; const tombstoneSuccessResponse = await ( entryPoint._context.containerRuntime as ContainerRuntime @@ -598,7 +598,7 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid assert.equal( tombstoneSuccessResponse.status, 200, - "Should be able to retrieve a tombstoned datastore given gcTombstoneGeneration", + "Should be able to retrieve a tombstoned datastore given gcGeneration", ); assert.notEqual( tombstoneSuccessResponse.headers?.[TombstoneResponseHeaderKey], @@ -609,7 +609,7 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid ); itExpects( - "Requesting tombstoned datastores succeeds with when gcTombstoneGeneration differs from persisted value", + "Requesting tombstoned datastores succeeds with when gcGeneration differs from persisted value", [ // Interactive client's request that succeeds { @@ -622,7 +622,7 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid // This will become the persisted value in the container(s) created below (except the one with disableTombstoneFailureViaOption) // NOTE: IT IS RESET AT THE END OF THE TEST // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - testContainerConfig.runtimeOptions!.gcOptions!.gcTombstoneGeneration = 1; + testContainerConfig.runtimeOptions!.gcOptions!.gcGeneration = 1; // Note: The Summarizers in this test don't use the "future" GC option - it only matters for the interactive client const { unreferencedId, summarizingContainer, summarizer } = @@ -633,10 +633,10 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid const { summaryVersion } = await summarize(summarizer); const container = await loadContainer( summaryVersion, - true /* disableTombstoneFailureViaOption */, + true /* disableTombstoneFailureViaGCGenerationOption */, ); - // This request succeeds even though the datastore is tombstoned, on account of the later gcTombstoneGeneration passed in + // This request succeeds even though the datastore is tombstoned, on account of the later gcGeneration passed in const entryPoint = (await container.getEntryPoint()) as ITestDataObject; const tombstoneSuccessResponse = await ( entryPoint._context.containerRuntime as ContainerRuntime @@ -646,7 +646,7 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid assert.equal( tombstoneSuccessResponse.status, 200, - "Should be able to retrieve a tombstoned datastore given gcTombstoneGeneration", + "Should be able to retrieve a tombstoned datastore given gcGeneration", ); assert.notEqual( tombstoneSuccessResponse.headers?.[TombstoneResponseHeaderKey], @@ -655,7 +655,7 @@ describeCompat("GC data store tombstone tests", "NoCompat", (getTestObjectProvid ); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - testContainerConfig.runtimeOptions!.gcOptions!.gcTombstoneGeneration = undefined; + testContainerConfig.runtimeOptions!.gcOptions!.gcGeneration = undefined; }, ); diff --git a/packages/test/test-pairwise-generator/CHANGELOG.md b/packages/test/test-pairwise-generator/CHANGELOG.md index 1da571584b89..7629e02e9ddb 100644 --- a/packages/test/test-pairwise-generator/CHANGELOG.md +++ b/packages/test/test-pairwise-generator/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-private/test-pairwise-generator +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 ### Minor Changes diff --git a/packages/test/test-service-load/CHANGELOG.md b/packages/test/test-service-load/CHANGELOG.md index 945f09962393..990245d26e14 100644 --- a/packages/test/test-service-load/CHANGELOG.md +++ b/packages/test/test-service-load/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/test-service-load +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/test/test-service-load/src/optionsMatrix.ts b/packages/test/test-service-load/src/optionsMatrix.ts index 29670738a664..e00e5ebe7323 100644 --- a/packages/test/test-service-load/src/optionsMatrix.ts +++ b/packages/test/test-service-load/src/optionsMatrix.ts @@ -67,6 +67,7 @@ const gcOptionsMatrix: OptionsMatrix = { gcAllowed: booleanCases, runFullGC: booleanCases, sessionExpiryTimeoutMs: [undefined], // Don't want sessions to expire at a fixed time + enableGCSweep: [undefined], // Don't need coverage here, GC sweep is tested separately sweepGracePeriodMs: [undefined], // Don't need coverage here, GC sweep is tested separately }; diff --git a/packages/test/test-utils/CHANGELOG.md b/packages/test/test-utils/CHANGELOG.md index a716c65d8106..b224d40a3b35 100644 --- a/packages/test/test-utils/CHANGELOG.md +++ b/packages/test/test-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/test-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/test/test-version-utils/CHANGELOG.md b/packages/test/test-version-utils/CHANGELOG.md index 61b9246f262d..d951b35a7c81 100644 --- a/packages/test/test-version-utils/CHANGELOG.md +++ b/packages/test/test-version-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-private/test-version-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 ### Minor Changes diff --git a/packages/tools/devtools/devtools-browser-extension/CHANGELOG.md b/packages/tools/devtools/devtools-browser-extension/CHANGELOG.md index e2692159f420..03720a35486c 100644 --- a/packages/tools/devtools/devtools-browser-extension/CHANGELOG.md +++ b/packages/tools/devtools/devtools-browser-extension/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/devtools-browser-extension +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/tools/devtools/devtools-core/CHANGELOG.md b/packages/tools/devtools/devtools-core/CHANGELOG.md index b25c40ead7c9..28b74480525e 100644 --- a/packages/tools/devtools/devtools-core/CHANGELOG.md +++ b/packages/tools/devtools/devtools-core/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/devtools-core +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/tools/devtools/devtools-example/CHANGELOG.md b/packages/tools/devtools/devtools-example/CHANGELOG.md index c56c03603a88..f80300678ea7 100644 --- a/packages/tools/devtools/devtools-example/CHANGELOG.md +++ b/packages/tools/devtools/devtools-example/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-example/devtools-example +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/tools/devtools/devtools-view/CHANGELOG.md b/packages/tools/devtools/devtools-view/CHANGELOG.md index 43e0f392b560..fd3001b30d43 100644 --- a/packages/tools/devtools/devtools-view/CHANGELOG.md +++ b/packages/tools/devtools/devtools-view/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-experimental/devtools-view +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/tools/devtools/devtools/CHANGELOG.md b/packages/tools/devtools/devtools/CHANGELOG.md index b31131549c18..6c796ae541c6 100644 --- a/packages/tools/devtools/devtools/CHANGELOG.md +++ b/packages/tools/devtools/devtools/CHANGELOG.md @@ -1,5 +1,21 @@ # @fluid-experimental/devtools +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- azure-client: Deprecated FluidStatic Classes ([#18402](https://github.com/microsoft/FluidFramework/issues/18402)) [589ec39de5](https://github.com/microsoft/FluidFramework/commits/589ec39de52116c7f782319e6f6aa61bc5aa9964) + + Several FluidStatic classes were unnecessarily exposed. They have been replaced with creation functions. This helps us + keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the + public surface area of downstream packages. The deprecated classes are as follows: + + - `AzureAudience` (use `IAzureAudience` instead) + - `TinyliciousAudience` (use `ITinyliciousAudience` instead) + - `DOProviderContainerRuntimeFactory` + - `FluidContainer` + - `ServiceAudience` + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/tools/fetch-tool/CHANGELOG.md b/packages/tools/fetch-tool/CHANGELOG.md index 9204d06d9eb6..ae93a7c6cd62 100644 --- a/packages/tools/fetch-tool/CHANGELOG.md +++ b/packages/tools/fetch-tool/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-tools/fetch-tool +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/tools/fluid-runner/CHANGELOG.md b/packages/tools/fluid-runner/CHANGELOG.md index a64ed633ae90..8d1ecb30a97d 100644 --- a/packages/tools/fluid-runner/CHANGELOG.md +++ b/packages/tools/fluid-runner/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/fluid-runner +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/tools/replay-tool/CHANGELOG.md b/packages/tools/replay-tool/CHANGELOG.md index 051cfc75479a..679677c1b0e2 100644 --- a/packages/tools/replay-tool/CHANGELOG.md +++ b/packages/tools/replay-tool/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-internal/replay-tool +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/tools/webpack-fluid-loader/CHANGELOG.md b/packages/tools/webpack-fluid-loader/CHANGELOG.md index 041d6ffd1214..35967a31da9a 100644 --- a/packages/tools/webpack-fluid-loader/CHANGELOG.md +++ b/packages/tools/webpack-fluid-loader/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluid-tools/webpack-fluid-loader +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/utils/odsp-doclib-utils/CHANGELOG.md b/packages/utils/odsp-doclib-utils/CHANGELOG.md index db7f52781635..5f6520c3fede 100644 --- a/packages/utils/odsp-doclib-utils/CHANGELOG.md +++ b/packages/utils/odsp-doclib-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/odsp-doclib-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/utils/telemetry-utils/CHANGELOG.md b/packages/utils/telemetry-utils/CHANGELOG.md index 525c43ab46aa..1f774b99abd4 100644 --- a/packages/utils/telemetry-utils/CHANGELOG.md +++ b/packages/utils/telemetry-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @fluidframework/telemetry-utils +## 2.0.0-internal.7.4.0 + +### Minor Changes + +- telemetry-utils: Deprecate ConfigTypes and IConfigProviderBase ([#18597](https://github.com/microsoft/FluidFramework/issues/18597)) [39b9ff57c0](https://github.com/microsoft/FluidFramework/commits/39b9ff57c0184b72f0e3f9425922dda944995265) + + The types `ConfigTypes` and `IConfigProviderBase` have been deprecated in the @fluidframework/telemetry-utils package. + The types can now be found in the @fluidframework/core-interfaces package. Please replace any uses with the types from + @fluidframework/core-interfaces. + +- telemetry-utils: Deprecated logIfFalse ([#18047](https://github.com/microsoft/FluidFramework/issues/18047)) [57614ffdc6](https://github.com/microsoft/FluidFramework/commits/57614ffdc6e3fbd22ddbe5ed589c75d3d195aa48) + + This functionality was not intended for export and will be removed in a future release. + No replacement API is offered because the logic is trivial to reproduce as needed. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/packages/utils/tool-utils/CHANGELOG.md b/packages/utils/tool-utils/CHANGELOG.md index 4e1f7478006c..2a92628bd051 100644 --- a/packages/utils/tool-utils/CHANGELOG.md +++ b/packages/utils/tool-utils/CHANGELOG.md @@ -1,5 +1,9 @@ # @fluidframework/tool-utils +## 2.0.0-internal.7.4.0 + +Dependency updates only. + ## 2.0.0-internal.7.3.0 Dependency updates only. diff --git a/server/gitrest/packages/gitrest-base/src/test/examples.ts b/server/gitrest/packages/gitrest-base/src/test/examples.ts new file mode 100644 index 000000000000..3f3fe13ec148 --- /dev/null +++ b/server/gitrest/packages/gitrest-base/src/test/examples.ts @@ -0,0 +1,1447 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import { + IWholeSummaryPayload, + IWholeFlatSummary, + IWriteSummaryResponse, +} from "@fluidframework/server-services-client"; +import { convertAllUtf8ToBase64 } from "./utils"; + +/* + * Samples generated with added logging in GitWholeSummaryManager while running + * [Fluid Chat](https://github.com/znewton/fluid-chat). + * Then, all UTF-8 blobs are converted to base64 for Sha consistency across various summary settings. + */ + +export const sampleInitialSummaryUpload: IWholeSummaryPayload = + convertAllUtf8ToBase64({ + message: "Initial Container Summary", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: '{"minimumSequenceNumber":0,"sequenceNumber":0}', + encoding: "utf-8", + }, + path: "attributes", + type: "blob", + }, + { + value: { type: "blob", content: "[]", encoding: "utf-8" }, + path: "quorumMembers", + type: "blob", + }, + { + value: { type: "blob", content: "[]", encoding: "utf-8" }, + path: "quorumProposals", + type: "blob", + }, + { + value: { + type: "blob", + content: + '[["code",{"key":"code","value":{"package":"no-dynamic-package","config":{}},"approvalSequenceNumber":0,"commitSequenceNumber":0,"sequenceNumber":0}]]', + encoding: "utf-8", + }, + path: "quorumValues", + type: "blob", + }, + ], + }, + path: ".protocol", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"ci":{"csn":0,"ccIds":[]},"subdirectories":{"initial-objects-key":{"ci":{"csn":0,"ccIds":["detached"]},"storage":{"map":{"type":"Plain","value":{"type":"__fluid_handle__","url":"/rootDOId/ab9706dc-ef6a-46c5-b728-6d1353cfe12b"}},"hiddenData":{"type":"Plain","value":{"type":"__fluid_handle__","url":"/rootDOId/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94"}},"signaler":{"type":"Plain","value":{"type":"__fluid_handle__","url":"/3a562a77-a987-4069-a7e6-7f6248e3670e"}}}}}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/directory","snapshotFormatVersion":"0.1","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "root", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"messages":{"type":"Plain","value":[{"id":"ba7cf17f-64cc-48d0-abb8-93d82b1c350e","handle":{"type":"__fluid_handle__","url":"/rootDOId/6c9a0944-cdc3-4877-89f1-2b514cc06940"},"sender":"test-user","type":"plain-large"},{"id":"e3e6e8cc-d403-49af-9e34-5b63bc62aff4","handle":{"type":"__fluid_handle__","url":"/rootDOId/59c55e26-781f-40de-a219-31dec25332aa"},"sender":"test-user","type":"plain-large"},{"id":"6729545b-5a50-4fb8-9229-eee097f0b772","handle":{"type":"__fluid_handle__","url":"/rootDOId/ca0e9520-c0eb-452d-848c-846da2405ee8"},"sender":"test-user","type":"plain-large"}]}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "ab9706dc-ef6a-46c5-b728-6d1353cfe12b", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "b0ed55c3-e5f6-41c5-bbbb-1f653a186e94", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"content":{"type":"Plain","value":"test message"}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "6c9a0944-cdc3-4877-89f1-2b514cc06940", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"content":{"type":"Plain","value":"test message"}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "59c55e26-781f-40de-a219-31dec25332aa", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"content":{"type":"Plain","value":"test message"}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "ca0e9520-c0eb-452d-848c-846da2405ee8", + type: "tree", + }, + ], + }, + path: ".channels", + type: "tree", + }, + { + value: { + type: "blob", + content: + '{"pkg":"[\\"rootDO\\"]","summaryFormatVersion":2,"isRootDataStore":true}', + encoding: "utf-8", + }, + path: ".component", + type: "blob", + }, + ], + }, + path: "rootDOId", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"ci":{"csn":0,"ccIds":[]}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/directory","snapshotFormatVersion":"0.1","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "root", + type: "tree", + }, + ], + }, + path: ".channels", + type: "tree", + }, + { + value: { + type: "blob", + content: + '{"pkg":"[\\"rootDO\\",\\"@fluid-example/signaler\\"]","summaryFormatVersion":2,"isRootDataStore":false}', + encoding: "utf-8", + }, + path: ".component", + type: "blob", + }, + ], + }, + path: "3a562a77-a987-4069-a7e6-7f6248e3670e", + type: "tree", + }, + ], + }, + path: ".channels", + type: "tree", + }, + { + value: { + type: "blob", + content: + '{"createContainerRuntimeVersion":"2.0.0-internal.7.1.0","createContainerTimestamp":1702330704065,"summaryNumber":1,"summaryFormatVersion":1,"gcFeature":3,"sessionExpiryTimeoutMs":2592000000,"sweepEnabled":false,"sweepTimeoutMs":3110400000,"telemetryDocumentId":"f71135ac-e201-4449-a580-234ba94e0af7"}', + encoding: "utf-8", + }, + path: ".metadata", + type: "blob", + }, + { + value: { + type: "blob", + content: '{"electionSequenceNumber":0}', + encoding: "utf-8", + }, + path: ".electedSummarizer", + type: "blob", + }, + ], + }, + path: ".app", + type: "tree", + }, + ], + sequenceNumber: 0, + type: "container", + }); +export const sampleInitialSummaryResponse: IWholeFlatSummary = + convertAllUtf8ToBase64({ + // This is a Commit ID and will vary with each run, because commits are calculated with timestamps. + id: "f79125fb1911b4c7e142e8ad539458d2f288e155", + trees: [ + { + id: "120239b2e0c608274b1ec792e31c210186965d8d", + entries: [ + { type: "tree", path: ".app" }, + { type: "tree", path: ".app/.channels" }, + { type: "tree", path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e" }, + { + type: "tree", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.channels", + }, + { + type: "tree", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.channels/root", + }, + { + type: "blob", + id: "faf720750d1bfe4304b808733b97f7495f6beedc", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.channels/root/.attributes", + }, + { + type: "blob", + id: "a8f0e0d709d42b998767dcc4a82a4e96bec819a2", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.channels/root/header", + }, + { + type: "blob", + id: "c0e6e1c73bfd42e2a47071489ad8a41a3b62af1c", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.component", + }, + { type: "tree", path: ".app/.channels/rootDOId" }, + { type: "tree", path: ".app/.channels/rootDOId/.channels" }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/59c55e26-781f-40de-a219-31dec25332aa", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/59c55e26-781f-40de-a219-31dec25332aa/.attributes", + }, + { + type: "blob", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + path: ".app/.channels/rootDOId/.channels/59c55e26-781f-40de-a219-31dec25332aa/header", + }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/6c9a0944-cdc3-4877-89f1-2b514cc06940", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/6c9a0944-cdc3-4877-89f1-2b514cc06940/.attributes", + }, + { + type: "blob", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + path: ".app/.channels/rootDOId/.channels/6c9a0944-cdc3-4877-89f1-2b514cc06940/header", + }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/ab9706dc-ef6a-46c5-b728-6d1353cfe12b", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/ab9706dc-ef6a-46c5-b728-6d1353cfe12b/.attributes", + }, + { + type: "blob", + id: "131a0ca80a1497425c09aa80ed86c632e503d066", + path: ".app/.channels/rootDOId/.channels/ab9706dc-ef6a-46c5-b728-6d1353cfe12b/header", + }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94/.attributes", + }, + { + type: "blob", + id: "f39311cc21cd0c2ebf40677800a8033b1fd02404", + path: ".app/.channels/rootDOId/.channels/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94/header", + }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/ca0e9520-c0eb-452d-848c-846da2405ee8", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/ca0e9520-c0eb-452d-848c-846da2405ee8/.attributes", + }, + { + type: "blob", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + path: ".app/.channels/rootDOId/.channels/ca0e9520-c0eb-452d-848c-846da2405ee8/header", + }, + { type: "tree", path: ".app/.channels/rootDOId/.channels/root" }, + { + type: "blob", + id: "faf720750d1bfe4304b808733b97f7495f6beedc", + path: ".app/.channels/rootDOId/.channels/root/.attributes", + }, + { + type: "blob", + id: "0564506cbb1091f7c2086a661db2571c4a4c194b", + path: ".app/.channels/rootDOId/.channels/root/header", + }, + { + type: "blob", + id: "c35bbe00f9cb9ee99c8af3d4757411abdda3d8f3", + path: ".app/.channels/rootDOId/.component", + }, + { + type: "blob", + id: "281a05982b6d4d03bc3df509ecdbc22a196cc69a", + path: ".app/.electedSummarizer", + }, + { + type: "blob", + id: "d846ce370ebb18c051776bd8959f491197100d24", + path: ".app/.metadata", + }, + { type: "tree", path: ".protocol" }, + { + type: "blob", + id: "0050eb3b8e41f9ecdf14c2aa21706018474c3b78", + path: ".protocol/attributes", + }, + { + type: "blob", + id: "0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc", + path: ".protocol/quorumMembers", + }, + { + type: "blob", + id: "0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc", + path: ".protocol/quorumProposals", + }, + { + type: "blob", + id: "c730f7a6ff8c606cc2b7d083e5a9705bff0d7029", + path: ".protocol/quorumValues", + }, + ], + sequenceNumber: undefined, + }, + ], + blobs: [ + { + content: + '{"type":"https://graph.microsoft.com/types/directory","snapshotFormatVersion":"0.1","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + id: "faf720750d1bfe4304b808733b97f7495f6beedc", + size: 124, + }, + { + content: '{"blobs":[],"content":{"ci":{"csn":0,"ccIds":[]}}}', + encoding: "utf-8", + id: "a8f0e0d709d42b998767dcc4a82a4e96bec819a2", + size: 50, + }, + { + content: + '{"pkg":"[\\"rootDO\\",\\"@fluid-example/signaler\\"]","summaryFormatVersion":2,"isRootDataStore":false}', + encoding: "utf-8", + id: "c0e6e1c73bfd42e2a47071489ad8a41a3b62af1c", + size: 99, + }, + { + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 118, + }, + { + content: + '{"blobs":[],"content":{"content":{"type":"Plain","value":"test message"}}}', + encoding: "utf-8", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + size: 74, + }, + { + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 118, + }, + { + content: + '{"blobs":[],"content":{"content":{"type":"Plain","value":"test message"}}}', + encoding: "utf-8", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + size: 74, + }, + { + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 118, + }, + { + content: + '{"blobs":[],"content":{"messages":{"type":"Plain","value":[{"id":"ba7cf17f-64cc-48d0-abb8-93d82b1c350e","handle":{"type":"__fluid_handle__","url":"/rootDOId/6c9a0944-cdc3-4877-89f1-2b514cc06940"},"sender":"test-user","type":"plain-large"},{"id":"e3e6e8cc-d403-49af-9e34-5b63bc62aff4","handle":{"type":"__fluid_handle__","url":"/rootDOId/59c55e26-781f-40de-a219-31dec25332aa"},"sender":"test-user","type":"plain-large"},{"id":"6729545b-5a50-4fb8-9229-eee097f0b772","handle":{"type":"__fluid_handle__","url":"/rootDOId/ca0e9520-c0eb-452d-848c-846da2405ee8"},"sender":"test-user","type":"plain-large"}]}}}', + encoding: "utf-8", + id: "131a0ca80a1497425c09aa80ed86c632e503d066", + size: 602, + }, + { + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 118, + }, + { + content: '{"blobs":[],"content":{}}', + encoding: "utf-8", + id: "f39311cc21cd0c2ebf40677800a8033b1fd02404", + size: 25, + }, + { + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 118, + }, + { + content: + '{"blobs":[],"content":{"content":{"type":"Plain","value":"test message"}}}', + encoding: "utf-8", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + size: 74, + }, + { + content: + '{"type":"https://graph.microsoft.com/types/directory","snapshotFormatVersion":"0.1","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + id: "faf720750d1bfe4304b808733b97f7495f6beedc", + size: 124, + }, + { + content: + '{"blobs":[],"content":{"ci":{"csn":0,"ccIds":[]},"subdirectories":{"initial-objects-key":{"ci":{"csn":0,"ccIds":["detached"]},"storage":{"map":{"type":"Plain","value":{"type":"__fluid_handle__","url":"/rootDOId/ab9706dc-ef6a-46c5-b728-6d1353cfe12b"}},"hiddenData":{"type":"Plain","value":{"type":"__fluid_handle__","url":"/rootDOId/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94"}},"signaler":{"type":"Plain","value":{"type":"__fluid_handle__","url":"/3a562a77-a987-4069-a7e6-7f6248e3670e"}}}}}}}', + encoding: "utf-8", + id: "0564506cbb1091f7c2086a661db2571c4a4c194b", + size: 486, + }, + { + content: '{"pkg":"[\\"rootDO\\"]","summaryFormatVersion":2,"isRootDataStore":true}', + encoding: "utf-8", + id: "c35bbe00f9cb9ee99c8af3d4757411abdda3d8f3", + size: 70, + }, + { + content: '{"electionSequenceNumber":0}', + encoding: "utf-8", + id: "281a05982b6d4d03bc3df509ecdbc22a196cc69a", + size: 28, + }, + { + content: + '{"createContainerRuntimeVersion":"2.0.0-internal.7.1.0","createContainerTimestamp":1702330704065,"summaryNumber":1,"summaryFormatVersion":1,"gcFeature":3,"sessionExpiryTimeoutMs":2592000000,"sweepEnabled":false,"sweepTimeoutMs":3110400000,"telemetryDocumentId":"f71135ac-e201-4449-a580-234ba94e0af7"}', + encoding: "utf-8", + id: "d846ce370ebb18c051776bd8959f491197100d24", + size: 300, + }, + { + content: '{"minimumSequenceNumber":0,"sequenceNumber":0}', + encoding: "utf-8", + id: "0050eb3b8e41f9ecdf14c2aa21706018474c3b78", + size: 46, + }, + { + content: "[]", + encoding: "utf-8", + id: "0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc", + size: 2, + }, + { + content: "[]", + encoding: "utf-8", + id: "0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc", + size: 2, + }, + { + content: + '[["code",{"key":"code","value":{"package":"no-dynamic-package","config":{}},"approvalSequenceNumber":0,"commitSequenceNumber":0,"sequenceNumber":0}]]', + encoding: "utf-8", + id: "c730f7a6ff8c606cc2b7d083e5a9705bff0d7029", + size: 149, + }, + ], + }); + +export const sampleChannelSummaryUpload: IWholeSummaryPayload = + convertAllUtf8ToBase64({ + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"ci":{"csn":0,"ccIds":[]}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/directory","snapshotFormatVersion":"0.1","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "root", + type: "tree", + }, + ], + }, + path: ".channels", + type: "tree", + }, + { + value: { + type: "blob", + content: + '{"pkg":"[\\"rootDO\\",\\"@fluid-example/signaler\\"]","summaryFormatVersion":2,"isRootDataStore":false}', + encoding: "utf-8", + }, + path: ".component", + type: "blob", + }, + ], + }, + path: "3a562a77-a987-4069-a7e6-7f6248e3670e", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"content":{"type":"Plain","value":"test message"}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "59c55e26-781f-40de-a219-31dec25332aa", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"content":{"type":"Plain","value":"test message"}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "6c9a0944-cdc3-4877-89f1-2b514cc06940", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"messages":{"type":"Plain","value":[{"id":"ba7cf17f-64cc-48d0-abb8-93d82b1c350e","handle":{"type":"__fluid_handle__","url":"/rootDOId/6c9a0944-cdc3-4877-89f1-2b514cc06940"},"sender":"test-user","type":"plain-large"},{"id":"e3e6e8cc-d403-49af-9e34-5b63bc62aff4","handle":{"type":"__fluid_handle__","url":"/rootDOId/59c55e26-781f-40de-a219-31dec25332aa"},"sender":"test-user","type":"plain-large"},{"id":"6729545b-5a50-4fb8-9229-eee097f0b772","handle":{"type":"__fluid_handle__","url":"/rootDOId/ca0e9520-c0eb-452d-848c-846da2405ee8"},"sender":"test-user","type":"plain-large"},{"id":"1a96fdda-c507-415d-b2e8-ed1380680959","sender":"criminal-maroon-sloth","type":"plain","content":"Aliqua magna amet adipisicing qui nostrud est adipisicing aliquip tempor excepteur incididunt ea. Et commodo velit anim ex est est ad elit sit ut."},{"id":"97d520a4-c400-40cf-ac51-52dc1ee31588","sender":"rational-magenta-kiwi","type":"plain","content":"Dolore esse et do eiusmod sint adipisicing."},{"id":"79170c50-10bd-4f5b-813a-694e8d382883","sender":"increasing-cyan-coyote","type":"plain","content":"Aute tempor adipisicing aliqua et consectetur."},{"id":"d1095d75-d34b-4129-a2fa-7963ac07a726","sender":"increasing-cyan-coyote","type":"plain","content":"In cillum proident fugiat duis minim consectetur laborum."},{"id":"3590a6cb-c17b-432a-8c16-2c34daef6942","sender":"rational-magenta-kiwi","type":"plain","content":"Sit exercitation qui cillum aute ut sunt pariatur labore commodo nulla aliquip tempor. Pariatur voluptate Lorem reprehenderit in labore tempor minim."},{"id":"137c1d54-e16a-49f6-8349-f28a8520e4a6","sender":"increasing-cyan-coyote","type":"plain","content":"Aute proident nostrud veniam non."},{"id":"7210c728-61b1-403c-8486-645f8c5ae298","sender":"increasing-cyan-coyote","type":"plain","content":"cillum laborum duis tempor commodo aliqua aliqua consequat anim in"},{"id":"1bfd6e5a-65d5-42ed-8005-b27511c21402","sender":"criminal-maroon-sloth","type":"plain","content":"Fugiat nostrud quis enim laborum velit irure id eiusmod nulla ullamco est ut. Sit ex et eiusmod pariatur."},{"id":"79f77a77-2b3b-45d3-9272-6096a4099462","sender":"increasing-cyan-coyote","type":"plain","content":"consequat non"},{"id":"e26d002b-3668-41d2-b3d4-23a001b71000","sender":"criminal-maroon-sloth","type":"plain","content":"Pariatur labore fugiat dolor sint dolor qui ullamco proident exercitation consequat amet nostrud."},{"id":"7502a55d-3aa0-47ec-bfa6-84ee19d555e9","sender":"dead-scarlet-walrus","type":"plain","content":"quis deserunt labore veniam sunt id"},{"id":"52e32674-c655-494b-974a-695444fa569c","sender":"increasing-cyan-coyote","type":"plain","content":"Officia incididunt magna tempor nostrud cupidatat exercitation exercitation qui nulla nulla."},{"id":"02dcdaa1-b518-429a-b119-1e2561a8f1fb","sender":"dead-scarlet-walrus","type":"plain","content":"ex duis veniam"}]}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "ab9706dc-ef6a-46c5-b728-6d1353cfe12b", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "b0ed55c3-e5f6-41c5-bbbb-1f653a186e94", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"content":{"type":"Plain","value":"test message"}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/map","snapshotFormatVersion":"0.2","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "ca0e9520-c0eb-452d-848c-846da2405ee8", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"blobs":[],"content":{"ci":{"csn":0,"ccIds":[]},"subdirectories":{"initial-objects-key":{"ci":{"csn":0,"ccIds":["detached"]},"storage":{"map":{"type":"Plain","value":{"type":"__fluid_handle__","url":"/rootDOId/ab9706dc-ef6a-46c5-b728-6d1353cfe12b"}},"hiddenData":{"type":"Plain","value":{"type":"__fluid_handle__","url":"/rootDOId/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94"}},"signaler":{"type":"Plain","value":{"type":"__fluid_handle__","url":"/3a562a77-a987-4069-a7e6-7f6248e3670e"}}}}}}}', + encoding: "utf-8", + }, + path: "header", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"type":"https://graph.microsoft.com/types/directory","snapshotFormatVersion":"0.1","packageVersion":"2.0.0-internal.7.1.0"}', + encoding: "utf-8", + }, + path: ".attributes", + type: "blob", + }, + ], + }, + path: "root", + type: "tree", + }, + ], + }, + path: ".channels", + type: "tree", + }, + { + value: { + type: "blob", + content: + '{"pkg":"[\\"rootDO\\"]","summaryFormatVersion":2,"isRootDataStore":true}', + encoding: "utf-8", + }, + path: ".component", + type: "blob", + }, + ], + }, + path: "rootDOId", + type: "tree", + }, + ], + }, + path: ".channels", + type: "tree", + }, + { + value: { + type: "blob", + content: + '{"createContainerRuntimeVersion":"2.0.0-internal.7.1.0","createContainerTimestamp":1702330704065,"summaryNumber":2,"summaryFormatVersion":1,"gcFeature":3,"sessionExpiryTimeoutMs":2592000000,"sweepEnabled":false,"sweepTimeoutMs":3110400000,"message":{"clientId":"c0f2f47c-293d-4134-8f45-d344006cd9fc","clientSequenceNumber":15,"minimumSequenceNumber":17,"referenceSequenceNumber":18,"sequenceNumber":19,"timestamp":1702330732456,"type":"noop"},"telemetryDocumentId":"f71135ac-e201-4449-a580-234ba94e0af7"}', + encoding: "utf-8", + }, + path: ".metadata", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"electedClientId":"b4fcb0b9-ed7f-464c-8520-0096d41100b3","electedParentId":"c0f2f47c-293d-4134-8f45-d344006cd9fc","electionSequenceNumber":2}', + encoding: "utf-8", + }, + path: ".electedSummarizer", + type: "blob", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"gcNodes":{"/":{"outboundRoutes":["/rootDOId"]},"/3a562a77-a987-4069-a7e6-7f6248e3670e":{"outboundRoutes":["/3a562a77-a987-4069-a7e6-7f6248e3670e/root"]},"/3a562a77-a987-4069-a7e6-7f6248e3670e/root":{"outboundRoutes":["/3a562a77-a987-4069-a7e6-7f6248e3670e"]},"/rootDOId":{"outboundRoutes":["/rootDOId/59c55e26-781f-40de-a219-31dec25332aa","/rootDOId/6c9a0944-cdc3-4877-89f1-2b514cc06940","/rootDOId/ab9706dc-ef6a-46c5-b728-6d1353cfe12b","/rootDOId/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94","/rootDOId/ca0e9520-c0eb-452d-848c-846da2405ee8","/rootDOId/root"]},"/rootDOId/59c55e26-781f-40de-a219-31dec25332aa":{"outboundRoutes":["/rootDOId"]},"/rootDOId/6c9a0944-cdc3-4877-89f1-2b514cc06940":{"outboundRoutes":["/rootDOId"]},"/rootDOId/ab9706dc-ef6a-46c5-b728-6d1353cfe12b":{"outboundRoutes":["/rootDOId","/rootDOId/59c55e26-781f-40de-a219-31dec25332aa","/rootDOId/6c9a0944-cdc3-4877-89f1-2b514cc06940","/rootDOId/ca0e9520-c0eb-452d-848c-846da2405ee8"]},"/rootDOId/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94":{"outboundRoutes":["/rootDOId"]},"/rootDOId/ca0e9520-c0eb-452d-848c-846da2405ee8":{"outboundRoutes":["/rootDOId"]},"/rootDOId/root":{"outboundRoutes":["/3a562a77-a987-4069-a7e6-7f6248e3670e","/rootDOId","/rootDOId/ab9706dc-ef6a-46c5-b728-6d1353cfe12b","/rootDOId/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94"]}}}', + encoding: "utf-8", + }, + path: "__gc_root", + type: "blob", + }, + ], + }, + path: "gc", + type: "tree", + }, + ], + message: "", + sequenceNumber: 0, + type: "channel", + }); +export const sampleChannelSummaryResult: IWriteSummaryResponse = { + id: "830f6e63212215df8651ef85bb0085f017bcab28", +}; +export const sampleContainerSummaryUpload: IWholeSummaryPayload = + convertAllUtf8ToBase64({ + message: "Container summary", + entries: [ + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '[["c0f2f47c-293d-4134-8f45-d344006cd9fc",{"client":{"details":{"capabilities":{"interactive":true},"environment":"; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0"},"permission":[],"scopes":["doc:read","doc:write"],"user":{"name":"increasing-cyan-coyote","id":"increasing-cyan-coyote","additionalDetails":{"id":"increasing-cyan-coyote","temp":true,"permissions":["read","write"]}},"mode":"write","timestamp":1702330706451},"sequenceNumber":1}],["b4fcb0b9-ed7f-464c-8520-0096d41100b3",{"client":{"details":{"capabilities":{"interactive":false},"environment":"; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0","type":"summarizer"},"permission":[],"scopes":["doc:read","doc:write","summary:write"],"user":{"name":"increasing-cyan-coyote","id":"increasing-cyan-coyote","additionalDetails":{"id":"increasing-cyan-coyote","temp":true,"permissions":["read","write"]}},"mode":"write","timestamp":1702330712699},"sequenceNumber":2}]]', + encoding: "utf-8", + }, + path: "quorumMembers", + type: "blob", + }, + { + value: { type: "blob", content: "[]", encoding: "utf-8" }, + path: "quorumProposals", + type: "blob", + }, + { + value: { + type: "blob", + content: + '[["code",{"key":"code","value":{"package":"no-dynamic-package","config":{}},"approvalSequenceNumber":0,"commitSequenceNumber":0,"sequenceNumber":0}]]', + encoding: "utf-8", + }, + path: "quorumValues", + type: "blob", + }, + { + value: { + type: "blob", + content: '{"minimumSequenceNumber":17,"sequenceNumber":19}', + encoding: "utf-8", + }, + path: "attributes", + type: "blob", + }, + ], + }, + path: ".protocol", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '[{"clientId":"b4fcb0b9-ed7f-464c-8520-0096d41100b3","clientSequenceNumber":3,"contents":"{\\"handle\\":\\"830f6e63212215df8651ef85bb0085f017bcab28\\",\\"head\\":\\"f79125fb1911b4c7e142e8ad539458d2f288e155\\",\\"message\\":\\"Summary @19:17\\",\\"parents\\":[\\"f79125fb1911b4c7e142e8ad539458d2f288e155\\"],\\"details\\":{\\"includesProtocolTree\\":false}}","minimumSequenceNumber":18,"referenceSequenceNumber":19,"sequenceNumber":20,"timestamp":1702330756322,"traces":[],"type":"summarize","additionalContent":"{\\"clients\\":[{\\"canEvict\\":true,\\"clientId\\":\\"c0f2f47c-293d-4134-8f45-d344006cd9fc\\",\\"clientSequenceNumber\\":15,\\"lastUpdate\\":1702330732456,\\"nack\\":false,\\"referenceSequenceNumber\\":18,\\"scopes\\":[\\"doc:read\\",\\"doc:write\\"]},{\\"canEvict\\":true,\\"clientId\\":\\"b4fcb0b9-ed7f-464c-8520-0096d41100b3\\",\\"clientSequenceNumber\\":3,\\"lastUpdate\\":1702330756322,\\"nack\\":false,\\"referenceSequenceNumber\\":19,\\"scopes\\":[\\"doc:read\\",\\"doc:write\\",\\"summary:write\\"]}],\\"durableSequenceNumber\\":0,\\"expHash1\\":\\"29ea9dcb\\",\\"logOffset\\":20,\\"sequenceNumber\\":20,\\"signalClientConnectionNumber\\":0,\\"lastSentMSN\\":17,\\"nackMessages\\":[],\\"successfullyStartedLambdas\\":[\\"Scribe\\"],\\"checkpointTimestamp\\":1702330756409}","expHash1":"-52ae219f"}]', + encoding: "utf-8", + }, + path: "logTail", + type: "blob", + }, + ], + }, + path: ".logTail", + type: "tree", + }, + { + value: { + type: "tree", + entries: [ + { + value: { + type: "blob", + content: + '{"clients":[{"canEvict":true,"clientId":"c0f2f47c-293d-4134-8f45-d344006cd9fc","clientSequenceNumber":15,"lastUpdate":1702330732456,"nack":false,"referenceSequenceNumber":18,"scopes":["doc:read","doc:write"]},{"canEvict":true,"clientId":"b4fcb0b9-ed7f-464c-8520-0096d41100b3","clientSequenceNumber":3,"lastUpdate":1702330756322,"nack":false,"referenceSequenceNumber":19,"scopes":["doc:read","doc:write","summary:write"]}],"durableSequenceNumber":0,"expHash1":"29ea9dcb","logOffset":20,"sequenceNumber":20,"signalClientConnectionNumber":0,"lastSentMSN":17,"nackMessages":[],"successfullyStartedLambdas":["Scribe"],"checkpointTimestamp":1702330756409}', + encoding: "utf-8", + }, + path: "deli", + type: "blob", + }, + { + value: { + type: "blob", + content: + '{"lastSummarySequenceNumber":0,"logOffset":19,"minimumSequenceNumber":18,"protocolState":{"sequenceNumber":19,"minimumSequenceNumber":17,"members":[["c0f2f47c-293d-4134-8f45-d344006cd9fc",{"client":{"details":{"capabilities":{"interactive":true},"environment":"; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0"},"permission":[],"scopes":["doc:read","doc:write"],"user":{"name":"increasing-cyan-coyote","id":"increasing-cyan-coyote","additionalDetails":{"id":"increasing-cyan-coyote","temp":true,"permissions":["read","write"]}},"mode":"write","timestamp":1702330706451},"sequenceNumber":1}],["b4fcb0b9-ed7f-464c-8520-0096d41100b3",{"client":{"details":{"capabilities":{"interactive":false},"environment":"; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0","type":"summarizer"},"permission":[],"scopes":["doc:read","doc:write","summary:write"],"user":{"name":"increasing-cyan-coyote","id":"increasing-cyan-coyote","additionalDetails":{"id":"increasing-cyan-coyote","temp":true,"permissions":["read","write"]}},"mode":"write","timestamp":1702330712699},"sequenceNumber":2}]],"proposals":[],"values":[["code",{"key":"code","value":{"package":"no-dynamic-package","config":{}},"approvalSequenceNumber":0,"commitSequenceNumber":0,"sequenceNumber":0}]]},"sequenceNumber":20,"validParentSummaries":["f79125fb1911b4c7e142e8ad539458d2f288e155"],"isCorrupt":false}', + encoding: "utf-8", + }, + path: "scribe", + type: "blob", + }, + ], + }, + path: ".serviceProtocol", + type: "tree", + }, + { path: ".app", type: "tree", id: "830f6e63212215df8651ef85bb0085f017bcab28" }, + ], + sequenceNumber: 19, + type: "container", + }); +export const sampleContainerSummaryResponse: IWholeFlatSummary = + convertAllUtf8ToBase64({ + // This is a Commit ID and will vary with each run, because commits are calculated with timestamps. + id: "249233823956b44862f7fa8b53c106f0520743ba", + trees: [ + { + id: "4fd5a75c3cd42f9d210775c5ae51031339b4811b", + entries: [ + { type: "tree", path: ".app" }, + { type: "tree", path: ".app/.channels" }, + { type: "tree", path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e" }, + { + type: "tree", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.channels", + }, + { + type: "tree", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.channels/root", + }, + { + type: "blob", + id: "faf720750d1bfe4304b808733b97f7495f6beedc", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.channels/root/.attributes", + }, + { + type: "blob", + id: "a8f0e0d709d42b998767dcc4a82a4e96bec819a2", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.channels/root/header", + }, + { + type: "blob", + id: "c0e6e1c73bfd42e2a47071489ad8a41a3b62af1c", + path: ".app/.channels/3a562a77-a987-4069-a7e6-7f6248e3670e/.component", + }, + { type: "tree", path: ".app/.channels/rootDOId" }, + { type: "tree", path: ".app/.channels/rootDOId/.channels" }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/59c55e26-781f-40de-a219-31dec25332aa", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/59c55e26-781f-40de-a219-31dec25332aa/.attributes", + }, + { + type: "blob", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + path: ".app/.channels/rootDOId/.channels/59c55e26-781f-40de-a219-31dec25332aa/header", + }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/6c9a0944-cdc3-4877-89f1-2b514cc06940", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/6c9a0944-cdc3-4877-89f1-2b514cc06940/.attributes", + }, + { + type: "blob", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + path: ".app/.channels/rootDOId/.channels/6c9a0944-cdc3-4877-89f1-2b514cc06940/header", + }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/ab9706dc-ef6a-46c5-b728-6d1353cfe12b", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/ab9706dc-ef6a-46c5-b728-6d1353cfe12b/.attributes", + }, + { + type: "blob", + id: "b4b873b0538629288cee91f8e6728104c2f319f0", + path: ".app/.channels/rootDOId/.channels/ab9706dc-ef6a-46c5-b728-6d1353cfe12b/header", + }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94/.attributes", + }, + { + type: "blob", + id: "f39311cc21cd0c2ebf40677800a8033b1fd02404", + path: ".app/.channels/rootDOId/.channels/b0ed55c3-e5f6-41c5-bbbb-1f653a186e94/header", + }, + { + type: "tree", + path: ".app/.channels/rootDOId/.channels/ca0e9520-c0eb-452d-848c-846da2405ee8", + }, + { + type: "blob", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + path: ".app/.channels/rootDOId/.channels/ca0e9520-c0eb-452d-848c-846da2405ee8/.attributes", + }, + { + type: "blob", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + path: ".app/.channels/rootDOId/.channels/ca0e9520-c0eb-452d-848c-846da2405ee8/header", + }, + { type: "tree", path: ".app/.channels/rootDOId/.channels/root" }, + { + type: "blob", + id: "faf720750d1bfe4304b808733b97f7495f6beedc", + path: ".app/.channels/rootDOId/.channels/root/.attributes", + }, + { + type: "blob", + id: "0564506cbb1091f7c2086a661db2571c4a4c194b", + path: ".app/.channels/rootDOId/.channels/root/header", + }, + { + type: "blob", + id: "c35bbe00f9cb9ee99c8af3d4757411abdda3d8f3", + path: ".app/.channels/rootDOId/.component", + }, + { + type: "blob", + id: "cac6366f2497ec6999751672e7887576ead833ec", + path: ".app/.electedSummarizer", + }, + { + type: "blob", + id: "07f3d7820e0c88f2ac3e4dc7aee7d6264c82119e", + path: ".app/.metadata", + }, + { type: "tree", path: ".app/gc" }, + { + type: "blob", + id: "de745834627c04ae87ce3b270900b43b3e8af243", + path: ".app/gc/__gc_root", + }, + { type: "tree", path: ".logTail" }, + { + type: "blob", + id: "444478e4c5a9716ca27f72e438af355e29d7f861", + path: ".logTail/logTail", + }, + { type: "tree", path: ".protocol" }, + { + type: "blob", + id: "d1530b02b5e324f650ace779d40a61e997669ca0", + path: ".protocol/attributes", + }, + { + type: "blob", + id: "582a5fde78ad55ddf83579edf003874c04aa2dc6", + path: ".protocol/quorumMembers", + }, + { + type: "blob", + id: "0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc", + path: ".protocol/quorumProposals", + }, + { + type: "blob", + id: "c730f7a6ff8c606cc2b7d083e5a9705bff0d7029", + path: ".protocol/quorumValues", + }, + { type: "tree", path: ".serviceProtocol" }, + { + type: "blob", + id: "b99120f9d38728469ef20acb96cb56e0f8774828", + path: ".serviceProtocol/deli", + }, + { + type: "blob", + id: "131d957174f195739d80a9d023209cce8e42ec4b", + path: ".serviceProtocol/scribe", + }, + ], + sequenceNumber: undefined, + }, + ], + blobs: [ + { + content: + "eyJ0eXBlIjoiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3R5cGVzL2RpcmVjdG9yeSIsInNuYXBzaG90Rm9ybWF0VmVyc2lvbiI6IjAuMSIsInBhY2thZ2VWZXJzaW9uIjoiMi4wLjAtaW50ZXJuYWwuNy4xLjAifQ==", + encoding: "base64", + id: "faf720750d1bfe4304b808733b97f7495f6beedc", + size: 168, + }, + { + content: "eyJibG9icyI6W10sImNvbnRlbnQiOnsiY2kiOnsiY3NuIjowLCJjY0lkcyI6W119fX0=", + encoding: "base64", + id: "a8f0e0d709d42b998767dcc4a82a4e96bec819a2", + size: 68, + }, + { + content: + "eyJwa2ciOiJbXCJyb290RE9cIixcIkBmbHVpZC1leGFtcGxlL3NpZ25hbGVyXCJdIiwic3VtbWFyeUZvcm1hdFZlcnNpb24iOjIsImlzUm9vdERhdGFTdG9yZSI6ZmFsc2V9", + encoding: "base64", + id: "c0e6e1c73bfd42e2a47071489ad8a41a3b62af1c", + size: 132, + }, + { + content: + "eyJ0eXBlIjoiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3R5cGVzL21hcCIsInNuYXBzaG90Rm9ybWF0VmVyc2lvbiI6IjAuMiIsInBhY2thZ2VWZXJzaW9uIjoiMi4wLjAtaW50ZXJuYWwuNy4xLjAifQ==", + encoding: "base64", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 160, + }, + { + content: + "eyJibG9icyI6W10sImNvbnRlbnQiOnsiY29udGVudCI6eyJ0eXBlIjoiUGxhaW4iLCJ2YWx1ZSI6InRlc3QgbWVzc2FnZSJ9fX0=", + encoding: "base64", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + size: 100, + }, + { + content: + "eyJ0eXBlIjoiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3R5cGVzL21hcCIsInNuYXBzaG90Rm9ybWF0VmVyc2lvbiI6IjAuMiIsInBhY2thZ2VWZXJzaW9uIjoiMi4wLjAtaW50ZXJuYWwuNy4xLjAifQ==", + encoding: "base64", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 160, + }, + { + content: + "eyJibG9icyI6W10sImNvbnRlbnQiOnsiY29udGVudCI6eyJ0eXBlIjoiUGxhaW4iLCJ2YWx1ZSI6InRlc3QgbWVzc2FnZSJ9fX0=", + encoding: "base64", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + size: 100, + }, + { + content: + "eyJ0eXBlIjoiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3R5cGVzL21hcCIsInNuYXBzaG90Rm9ybWF0VmVyc2lvbiI6IjAuMiIsInBhY2thZ2VWZXJzaW9uIjoiMi4wLjAtaW50ZXJuYWwuNy4xLjAifQ==", + encoding: "base64", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 160, + }, + { + content: + "eyJibG9icyI6W10sImNvbnRlbnQiOnsibWVzc2FnZXMiOnsidHlwZSI6IlBsYWluIiwidmFsdWUiOlt7ImlkIjoiYmE3Y2YxN2YtNjRjYy00OGQwLWFiYjgtOTNkODJiMWMzNTBlIiwiaGFuZGxlIjp7InR5cGUiOiJfX2ZsdWlkX2hhbmRsZV9fIiwidXJsIjoiL3Jvb3RET0lkLzZjOWEwOTQ0LWNkYzMtNDg3Ny04OWYxLTJiNTE0Y2MwNjk0MCJ9LCJzZW5kZXIiOiJ0ZXN0LXVzZXIiLCJ0eXBlIjoicGxhaW4tbGFyZ2UifSx7ImlkIjoiZTNlNmU4Y2MtZDQwMy00OWFmLTllMzQtNWI2M2JjNjJhZmY0IiwiaGFuZGxlIjp7InR5cGUiOiJfX2ZsdWlkX2hhbmRsZV9fIiwidXJsIjoiL3Jvb3RET0lkLzU5YzU1ZTI2LTc4MWYtNDBkZS1hMjE5LTMxZGVjMjUzMzJhYSJ9LCJzZW5kZXIiOiJ0ZXN0LXVzZXIiLCJ0eXBlIjoicGxhaW4tbGFyZ2UifSx7ImlkIjoiNjcyOTU0NWItNWE1MC00ZmI4LTkyMjktZWVlMDk3ZjBiNzcyIiwiaGFuZGxlIjp7InR5cGUiOiJfX2ZsdWlkX2hhbmRsZV9fIiwidXJsIjoiL3Jvb3RET0lkL2NhMGU5NTIwLWMwZWItNDUyZC04NDhjLTg0NmRhMjQwNWVlOCJ9LCJzZW5kZXIiOiJ0ZXN0LXVzZXIiLCJ0eXBlIjoicGxhaW4tbGFyZ2UifSx7ImlkIjoiMWE5NmZkZGEtYzUwNy00MTVkLWIyZTgtZWQxMzgwNjgwOTU5Iiwic2VuZGVyIjoiY3JpbWluYWwtbWFyb29uLXNsb3RoIiwidHlwZSI6InBsYWluIiwiY29udGVudCI6IkFsaXF1YSBtYWduYSBhbWV0IGFkaXBpc2ljaW5nIHF1aSBub3N0cnVkIGVzdCBhZGlwaXNpY2luZyBhbGlxdWlwIHRlbXBvciBleGNlcHRldXIgaW5jaWRpZHVudCBlYS4gRXQgY29tbW9kbyB2ZWxpdCBhbmltIGV4IGVzdCBlc3QgYWQgZWxpdCBzaXQgdXQuIn0seyJpZCI6Ijk3ZDUyMGE0LWM0MDAtNDBjZi1hYzUxLTUyZGMxZWUzMTU4OCIsInNlbmRlciI6InJhdGlvbmFsLW1hZ2VudGEta2l3aSIsInR5cGUiOiJwbGFpbiIsImNvbnRlbnQiOiJEb2xvcmUgZXNzZSBldCBkbyBlaXVzbW9kIHNpbnQgYWRpcGlzaWNpbmcuIn0seyJpZCI6Ijc5MTcwYzUwLTEwYmQtNGY1Yi04MTNhLTY5NGU4ZDM4Mjg4MyIsInNlbmRlciI6ImluY3JlYXNpbmctY3lhbi1jb3lvdGUiLCJ0eXBlIjoicGxhaW4iLCJjb250ZW50IjoiQXV0ZSB0ZW1wb3IgYWRpcGlzaWNpbmcgYWxpcXVhIGV0IGNvbnNlY3RldHVyLiJ9LHsiaWQiOiJkMTA5NWQ3NS1kMzRiLTQxMjktYTJmYS03OTYzYWMwN2E3MjYiLCJzZW5kZXIiOiJpbmNyZWFzaW5nLWN5YW4tY295b3RlIiwidHlwZSI6InBsYWluIiwiY29udGVudCI6IkluIGNpbGx1bSBwcm9pZGVudCBmdWdpYXQgZHVpcyBtaW5pbSBjb25zZWN0ZXR1ciBsYWJvcnVtLiJ9LHsiaWQiOiIzNTkwYTZjYi1jMTdiLTQzMmEtOGMxNi0yYzM0ZGFlZjY5NDIiLCJzZW5kZXIiOiJyYXRpb25hbC1tYWdlbnRhLWtpd2kiLCJ0eXBlIjoicGxhaW4iLCJjb250ZW50IjoiU2l0IGV4ZXJjaXRhdGlvbiBxdWkgY2lsbHVtIGF1dGUgdXQgc3VudCBwYXJpYXR1ciBsYWJvcmUgY29tbW9kbyBudWxsYSBhbGlxdWlwIHRlbXBvci4gUGFyaWF0dXIgdm9sdXB0YXRlIExvcmVtIHJlcHJlaGVuZGVyaXQgaW4gbGFib3JlIHRlbXBvciBtaW5pbS4ifSx7ImlkIjoiMTM3YzFkNTQtZTE2YS00OWY2LTgzNDktZjI4YTg1MjBlNGE2Iiwic2VuZGVyIjoiaW5jcmVhc2luZy1jeWFuLWNveW90ZSIsInR5cGUiOiJwbGFpbiIsImNvbnRlbnQiOiJBdXRlIHByb2lkZW50IG5vc3RydWQgdmVuaWFtIG5vbi4ifSx7ImlkIjoiNzIxMGM3MjgtNjFiMS00MDNjLTg0ODYtNjQ1ZjhjNWFlMjk4Iiwic2VuZGVyIjoiaW5jcmVhc2luZy1jeWFuLWNveW90ZSIsInR5cGUiOiJwbGFpbiIsImNvbnRlbnQiOiJjaWxsdW0gbGFib3J1bSBkdWlzIHRlbXBvciBjb21tb2RvIGFsaXF1YSBhbGlxdWEgY29uc2VxdWF0IGFuaW0gaW4ifSx7ImlkIjoiMWJmZDZlNWEtNjVkNS00MmVkLTgwMDUtYjI3NTExYzIxNDAyIiwic2VuZGVyIjoiY3JpbWluYWwtbWFyb29uLXNsb3RoIiwidHlwZSI6InBsYWluIiwiY29udGVudCI6IkZ1Z2lhdCBub3N0cnVkIHF1aXMgZW5pbSBsYWJvcnVtIHZlbGl0IGlydXJlIGlkIGVpdXNtb2QgbnVsbGEgdWxsYW1jbyBlc3QgdXQuIFNpdCBleCBldCBlaXVzbW9kIHBhcmlhdHVyLiJ9LHsiaWQiOiI3OWY3N2E3Ny0yYjNiLTQ1ZDMtOTI3Mi02MDk2YTQwOTk0NjIiLCJzZW5kZXIiOiJpbmNyZWFzaW5nLWN5YW4tY295b3RlIiwidHlwZSI6InBsYWluIiwiY29udGVudCI6ImNvbnNlcXVhdCBub24ifSx7ImlkIjoiZTI2ZDAwMmItMzY2OC00MWQyLWIzZDQtMjNhMDAxYjcxMDAwIiwic2VuZGVyIjoiY3JpbWluYWwtbWFyb29uLXNsb3RoIiwidHlwZSI6InBsYWluIiwiY29udGVudCI6IlBhcmlhdHVyIGxhYm9yZSBmdWdpYXQgZG9sb3Igc2ludCBkb2xvciBxdWkgdWxsYW1jbyBwcm9pZGVudCBleGVyY2l0YXRpb24gY29uc2VxdWF0IGFtZXQgbm9zdHJ1ZC4ifSx7ImlkIjoiNzUwMmE1NWQtM2FhMC00N2VjLWJmYTYtODRlZTE5ZDU1NWU5Iiwic2VuZGVyIjoiZGVhZC1zY2FybGV0LXdhbHJ1cyIsInR5cGUiOiJwbGFpbiIsImNvbnRlbnQiOiJxdWlzIGRlc2VydW50IGxhYm9yZSB2ZW5pYW0gc3VudCBpZCJ9LHsiaWQiOiI1MmUzMjY3NC1jNjU1LTQ5NGItOTc0YS02OTU0NDRmYTU2OWMiLCJzZW5kZXIiOiJpbmNyZWFzaW5nLWN5YW4tY295b3RlIiwidHlwZSI6InBsYWluIiwiY29udGVudCI6Ik9mZmljaWEgaW5jaWRpZHVudCBtYWduYSB0ZW1wb3Igbm9zdHJ1ZCBjdXBpZGF0YXQgZXhlcmNpdGF0aW9uIGV4ZXJjaXRhdGlvbiBxdWkgbnVsbGEgbnVsbGEuIn0seyJpZCI6IjAyZGNkYWExLWI1MTgtNDI5YS1iMTE5LTFlMjU2MWE4ZjFmYiIsInNlbmRlciI6ImRlYWQtc2NhcmxldC13YWxydXMiLCJ0eXBlIjoicGxhaW4iLCJjb250ZW50IjoiZXggZHVpcyB2ZW5pYW0ifV19fX0=", + encoding: "base64", + id: "b4b873b0538629288cee91f8e6728104c2f319f0", + size: 3856, + }, + { + content: + "eyJ0eXBlIjoiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3R5cGVzL21hcCIsInNuYXBzaG90Rm9ybWF0VmVyc2lvbiI6IjAuMiIsInBhY2thZ2VWZXJzaW9uIjoiMi4wLjAtaW50ZXJuYWwuNy4xLjAifQ==", + encoding: "base64", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 160, + }, + { + content: "eyJibG9icyI6W10sImNvbnRlbnQiOnt9fQ==", + encoding: "base64", + id: "f39311cc21cd0c2ebf40677800a8033b1fd02404", + size: 36, + }, + { + content: + "eyJ0eXBlIjoiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3R5cGVzL21hcCIsInNuYXBzaG90Rm9ybWF0VmVyc2lvbiI6IjAuMiIsInBhY2thZ2VWZXJzaW9uIjoiMi4wLjAtaW50ZXJuYWwuNy4xLjAifQ==", + encoding: "base64", + id: "8387d21005fb3ba204cb6b6855f08ac1d58947c4", + size: 160, + }, + { + content: + "eyJibG9icyI6W10sImNvbnRlbnQiOnsiY29udGVudCI6eyJ0eXBlIjoiUGxhaW4iLCJ2YWx1ZSI6InRlc3QgbWVzc2FnZSJ9fX0=", + encoding: "base64", + id: "948d9ce9db24abbfd53a11c871a94fd850974cbf", + size: 100, + }, + { + content: + "eyJ0eXBlIjoiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3R5cGVzL2RpcmVjdG9yeSIsInNuYXBzaG90Rm9ybWF0VmVyc2lvbiI6IjAuMSIsInBhY2thZ2VWZXJzaW9uIjoiMi4wLjAtaW50ZXJuYWwuNy4xLjAifQ==", + encoding: "base64", + id: "faf720750d1bfe4304b808733b97f7495f6beedc", + size: 168, + }, + { + content: + "eyJibG9icyI6W10sImNvbnRlbnQiOnsiY2kiOnsiY3NuIjowLCJjY0lkcyI6W119LCJzdWJkaXJlY3RvcmllcyI6eyJpbml0aWFsLW9iamVjdHMta2V5Ijp7ImNpIjp7ImNzbiI6MCwiY2NJZHMiOlsiZGV0YWNoZWQiXX0sInN0b3JhZ2UiOnsibWFwIjp7InR5cGUiOiJQbGFpbiIsInZhbHVlIjp7InR5cGUiOiJfX2ZsdWlkX2hhbmRsZV9fIiwidXJsIjoiL3Jvb3RET0lkL2FiOTcwNmRjLWVmNmEtNDZjNS1iNzI4LTZkMTM1M2NmZTEyYiJ9fSwiaGlkZGVuRGF0YSI6eyJ0eXBlIjoiUGxhaW4iLCJ2YWx1ZSI6eyJ0eXBlIjoiX19mbHVpZF9oYW5kbGVfXyIsInVybCI6Ii9yb290RE9JZC9iMGVkNTVjMy1lNWY2LTQxYzUtYmJiYi0xZjY1M2ExODZlOTQifX0sInNpZ25hbGVyIjp7InR5cGUiOiJQbGFpbiIsInZhbHVlIjp7InR5cGUiOiJfX2ZsdWlkX2hhbmRsZV9fIiwidXJsIjoiLzNhNTYyYTc3LWE5ODctNDA2OS1hN2U2LTdmNjI0OGUzNjcwZSJ9fX19fX19", + encoding: "base64", + id: "0564506cbb1091f7c2086a661db2571c4a4c194b", + size: 648, + }, + { + content: + "eyJwa2ciOiJbXCJyb290RE9cIl0iLCJzdW1tYXJ5Rm9ybWF0VmVyc2lvbiI6MiwiaXNSb290RGF0YVN0b3JlIjp0cnVlfQ==", + encoding: "base64", + id: "c35bbe00f9cb9ee99c8af3d4757411abdda3d8f3", + size: 96, + }, + { + content: + "eyJlbGVjdGVkQ2xpZW50SWQiOiJiNGZjYjBiOS1lZDdmLTQ2NGMtODUyMC0wMDk2ZDQxMTAwYjMiLCJlbGVjdGVkUGFyZW50SWQiOiJjMGYyZjQ3Yy0yOTNkLTQxMzQtOGY0NS1kMzQ0MDA2Y2Q5ZmMiLCJlbGVjdGlvblNlcXVlbmNlTnVtYmVyIjoyfQ==", + encoding: "base64", + id: "cac6366f2497ec6999751672e7887576ead833ec", + size: 192, + }, + { + content: + "eyJjcmVhdGVDb250YWluZXJSdW50aW1lVmVyc2lvbiI6IjIuMC4wLWludGVybmFsLjcuMS4wIiwiY3JlYXRlQ29udGFpbmVyVGltZXN0YW1wIjoxNzAyMzMwNzA0MDY1LCJzdW1tYXJ5TnVtYmVyIjoyLCJzdW1tYXJ5Rm9ybWF0VmVyc2lvbiI6MSwiZ2NGZWF0dXJlIjozLCJzZXNzaW9uRXhwaXJ5VGltZW91dE1zIjoyNTkyMDAwMDAwLCJzd2VlcEVuYWJsZWQiOmZhbHNlLCJzd2VlcFRpbWVvdXRNcyI6MzExMDQwMDAwMCwibWVzc2FnZSI6eyJjbGllbnRJZCI6ImMwZjJmNDdjLTI5M2QtNDEzNC04ZjQ1LWQzNDQwMDZjZDlmYyIsImNsaWVudFNlcXVlbmNlTnVtYmVyIjoxNSwibWluaW11bVNlcXVlbmNlTnVtYmVyIjoxNywicmVmZXJlbmNlU2VxdWVuY2VOdW1iZXIiOjE4LCJzZXF1ZW5jZU51bWJlciI6MTksInRpbWVzdGFtcCI6MTcwMjMzMDczMjQ1NiwidHlwZSI6Im5vb3AifSwidGVsZW1ldHJ5RG9jdW1lbnRJZCI6ImY3MTEzNWFjLWUyMDEtNDQ0OS1hNTgwLTIzNGJhOTRlMGFmNyJ9", + encoding: "base64", + id: "07f3d7820e0c88f2ac3e4dc7aee7d6264c82119e", + size: 672, + }, + { + content: + "eyJnY05vZGVzIjp7Ii8iOnsib3V0Ym91bmRSb3V0ZXMiOlsiL3Jvb3RET0lkIl19LCIvM2E1NjJhNzctYTk4Ny00MDY5LWE3ZTYtN2Y2MjQ4ZTM2NzBlIjp7Im91dGJvdW5kUm91dGVzIjpbIi8zYTU2MmE3Ny1hOTg3LTQwNjktYTdlNi03ZjYyNDhlMzY3MGUvcm9vdCJdfSwiLzNhNTYyYTc3LWE5ODctNDA2OS1hN2U2LTdmNjI0OGUzNjcwZS9yb290Ijp7Im91dGJvdW5kUm91dGVzIjpbIi8zYTU2MmE3Ny1hOTg3LTQwNjktYTdlNi03ZjYyNDhlMzY3MGUiXX0sIi9yb290RE9JZCI6eyJvdXRib3VuZFJvdXRlcyI6WyIvcm9vdERPSWQvNTljNTVlMjYtNzgxZi00MGRlLWEyMTktMzFkZWMyNTMzMmFhIiwiL3Jvb3RET0lkLzZjOWEwOTQ0LWNkYzMtNDg3Ny04OWYxLTJiNTE0Y2MwNjk0MCIsIi9yb290RE9JZC9hYjk3MDZkYy1lZjZhLTQ2YzUtYjcyOC02ZDEzNTNjZmUxMmIiLCIvcm9vdERPSWQvYjBlZDU1YzMtZTVmNi00MWM1LWJiYmItMWY2NTNhMTg2ZTk0IiwiL3Jvb3RET0lkL2NhMGU5NTIwLWMwZWItNDUyZC04NDhjLTg0NmRhMjQwNWVlOCIsIi9yb290RE9JZC9yb290Il19LCIvcm9vdERPSWQvNTljNTVlMjYtNzgxZi00MGRlLWEyMTktMzFkZWMyNTMzMmFhIjp7Im91dGJvdW5kUm91dGVzIjpbIi9yb290RE9JZCJdfSwiL3Jvb3RET0lkLzZjOWEwOTQ0LWNkYzMtNDg3Ny04OWYxLTJiNTE0Y2MwNjk0MCI6eyJvdXRib3VuZFJvdXRlcyI6WyIvcm9vdERPSWQiXX0sIi9yb290RE9JZC9hYjk3MDZkYy1lZjZhLTQ2YzUtYjcyOC02ZDEzNTNjZmUxMmIiOnsib3V0Ym91bmRSb3V0ZXMiOlsiL3Jvb3RET0lkIiwiL3Jvb3RET0lkLzU5YzU1ZTI2LTc4MWYtNDBkZS1hMjE5LTMxZGVjMjUzMzJhYSIsIi9yb290RE9JZC82YzlhMDk0NC1jZGMzLTQ4NzctODlmMS0yYjUxNGNjMDY5NDAiLCIvcm9vdERPSWQvY2EwZTk1MjAtYzBlYi00NTJkLTg0OGMtODQ2ZGEyNDA1ZWU4Il19LCIvcm9vdERPSWQvYjBlZDU1YzMtZTVmNi00MWM1LWJiYmItMWY2NTNhMTg2ZTk0Ijp7Im91dGJvdW5kUm91dGVzIjpbIi9yb290RE9JZCJdfSwiL3Jvb3RET0lkL2NhMGU5NTIwLWMwZWItNDUyZC04NDhjLTg0NmRhMjQwNWVlOCI6eyJvdXRib3VuZFJvdXRlcyI6WyIvcm9vdERPSWQiXX0sIi9yb290RE9JZC9yb290Ijp7Im91dGJvdW5kUm91dGVzIjpbIi8zYTU2MmE3Ny1hOTg3LTQwNjktYTdlNi03ZjYyNDhlMzY3MGUiLCIvcm9vdERPSWQiLCIvcm9vdERPSWQvYWI5NzA2ZGMtZWY2YS00NmM1LWI3MjgtNmQxMzUzY2ZlMTJiIiwiL3Jvb3RET0lkL2IwZWQ1NWMzLWU1ZjYtNDFjNS1iYmJiLTFmNjUzYTE4NmU5NCJdfX19", + encoding: "base64", + id: "de745834627c04ae87ce3b270900b43b3e8af243", + size: 1736, + }, + { + content: + '[{"clientId":"b4fcb0b9-ed7f-464c-8520-0096d41100b3","clientSequenceNumber":3,"contents":"{\\"handle\\":\\"830f6e63212215df8651ef85bb0085f017bcab28\\",\\"head\\":\\"f79125fb1911b4c7e142e8ad539458d2f288e155\\",\\"message\\":\\"Summary @19:17\\",\\"parents\\":[\\"f79125fb1911b4c7e142e8ad539458d2f288e155\\"],\\"details\\":{\\"includesProtocolTree\\":false}}","minimumSequenceNumber":18,"referenceSequenceNumber":19,"sequenceNumber":20,"timestamp":1702330756322,"traces":[],"type":"summarize","additionalContent":"{\\"clients\\":[{\\"canEvict\\":true,\\"clientId\\":\\"c0f2f47c-293d-4134-8f45-d344006cd9fc\\",\\"clientSequenceNumber\\":15,\\"lastUpdate\\":1702330732456,\\"nack\\":false,\\"referenceSequenceNumber\\":18,\\"scopes\\":[\\"doc:read\\",\\"doc:write\\"]},{\\"canEvict\\":true,\\"clientId\\":\\"b4fcb0b9-ed7f-464c-8520-0096d41100b3\\",\\"clientSequenceNumber\\":3,\\"lastUpdate\\":1702330756322,\\"nack\\":false,\\"referenceSequenceNumber\\":19,\\"scopes\\":[\\"doc:read\\",\\"doc:write\\",\\"summary:write\\"]}],\\"durableSequenceNumber\\":0,\\"expHash1\\":\\"29ea9dcb\\",\\"logOffset\\":20,\\"sequenceNumber\\":20,\\"signalClientConnectionNumber\\":0,\\"lastSentMSN\\":17,\\"nackMessages\\":[],\\"successfullyStartedLambdas\\":[\\"Scribe\\"],\\"checkpointTimestamp\\":1702330756409}","expHash1":"-52ae219f"}]', + encoding: "utf-8", + id: "444478e4c5a9716ca27f72e438af355e29d7f861", + size: 1232, + }, + { + content: '{"minimumSequenceNumber":17,"sequenceNumber":19}', + encoding: "utf-8", + id: "d1530b02b5e324f650ace779d40a61e997669ca0", + size: 48, + }, + { + content: + '[["c0f2f47c-293d-4134-8f45-d344006cd9fc",{"client":{"details":{"capabilities":{"interactive":true},"environment":"; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0"},"permission":[],"scopes":["doc:read","doc:write"],"user":{"name":"increasing-cyan-coyote","id":"increasing-cyan-coyote","additionalDetails":{"id":"increasing-cyan-coyote","temp":true,"permissions":["read","write"]}},"mode":"write","timestamp":1702330706451},"sequenceNumber":1}],["b4fcb0b9-ed7f-464c-8520-0096d41100b3",{"client":{"details":{"capabilities":{"interactive":false},"environment":"; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0","type":"summarizer"},"permission":[],"scopes":["doc:read","doc:write","summary:write"],"user":{"name":"increasing-cyan-coyote","id":"increasing-cyan-coyote","additionalDetails":{"id":"increasing-cyan-coyote","temp":true,"permissions":["read","write"]}},"mode":"write","timestamp":1702330712699},"sequenceNumber":2}]]', + encoding: "utf-8", + id: "582a5fde78ad55ddf83579edf003874c04aa2dc6", + size: 1332, + }, + { + content: "[]", + encoding: "utf-8", + id: "0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc", + size: 2, + }, + { + content: + '[["code",{"key":"code","value":{"package":"no-dynamic-package","config":{}},"approvalSequenceNumber":0,"commitSequenceNumber":0,"sequenceNumber":0}]]', + encoding: "utf-8", + id: "c730f7a6ff8c606cc2b7d083e5a9705bff0d7029", + size: 149, + }, + { + content: + '{"clients":[{"canEvict":true,"clientId":"c0f2f47c-293d-4134-8f45-d344006cd9fc","clientSequenceNumber":15,"lastUpdate":1702330732456,"nack":false,"referenceSequenceNumber":18,"scopes":["doc:read","doc:write"]},{"canEvict":true,"clientId":"b4fcb0b9-ed7f-464c-8520-0096d41100b3","clientSequenceNumber":3,"lastUpdate":1702330756322,"nack":false,"referenceSequenceNumber":19,"scopes":["doc:read","doc:write","summary:write"]}],"durableSequenceNumber":0,"expHash1":"29ea9dcb","logOffset":20,"sequenceNumber":20,"signalClientConnectionNumber":0,"lastSentMSN":17,"nackMessages":[],"successfullyStartedLambdas":["Scribe"],"checkpointTimestamp":1702330756409}', + encoding: "utf-8", + id: "b99120f9d38728469ef20acb96cb56e0f8774828", + size: 649, + }, + { + content: + '{"lastSummarySequenceNumber":0,"logOffset":19,"minimumSequenceNumber":18,"protocolState":{"sequenceNumber":19,"minimumSequenceNumber":17,"members":[["c0f2f47c-293d-4134-8f45-d344006cd9fc",{"client":{"details":{"capabilities":{"interactive":true},"environment":"; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0"},"permission":[],"scopes":["doc:read","doc:write"],"user":{"name":"increasing-cyan-coyote","id":"increasing-cyan-coyote","additionalDetails":{"id":"increasing-cyan-coyote","temp":true,"permissions":["read","write"]}},"mode":"write","timestamp":1702330706451},"sequenceNumber":1}],["b4fcb0b9-ed7f-464c-8520-0096d41100b3",{"client":{"details":{"capabilities":{"interactive":false},"environment":"; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0; loaderVersion:2.0.0-internal.7.1.0","type":"summarizer"},"permission":[],"scopes":["doc:read","doc:write","summary:write"],"user":{"name":"increasing-cyan-coyote","id":"increasing-cyan-coyote","additionalDetails":{"id":"increasing-cyan-coyote","temp":true,"permissions":["read","write"]}},"mode":"write","timestamp":1702330712699},"sequenceNumber":2}]],"proposals":[],"values":[["code",{"key":"code","value":{"package":"no-dynamic-package","config":{}},"approvalSequenceNumber":0,"commitSequenceNumber":0,"sequenceNumber":0}]]},"sequenceNumber":20,"validParentSummaries":["f79125fb1911b4c7e142e8ad539458d2f288e155"],"isCorrupt":false}', + encoding: "utf-8", + id: "131d957174f195739d80a9d023209cce8e42ec4b", + size: 1761, + }, + ], + }); diff --git a/server/gitrest/packages/gitrest-base/src/test/routes.spec.ts b/server/gitrest/packages/gitrest-base/src/test/routes.spec.ts index 0b9ba27a8b22..ae84944bd881 100644 --- a/server/gitrest/packages/gitrest-base/src/test/routes.spec.ts +++ b/server/gitrest/packages/gitrest-base/src/test/routes.spec.ts @@ -127,7 +127,7 @@ function normalizeMessage(gitLibrary: testUtils.gitLibType, message: string) { return message; } -const testModes: testUtils.ITestMode[] = [ +const testModes: testUtils.IRouteTestMode[] = [ { name: "Using isomorphic-git as RepoManager with repoPerDoc enabled", gitLibrary: "isomorphic-git", @@ -186,7 +186,7 @@ testModes.forEach((mode) => { const fileSystemManagerFactory = new NodeFsManagerFactory(); const externalStorageManager = new ExternalStorageManager(testUtils.defaultProvider); - const getRepoManagerFactory = (testMode: testUtils.ITestMode) => { + const getRepoManagerFactory = (testMode: testUtils.IRouteTestMode) => { // The other possibility is isomorphic-git. return new IsomorphicGitManagerFactory( testUtils.defaultProvider.get("storageDir"), diff --git a/server/gitrest/packages/gitrest-base/src/test/summaries.spec.ts b/server/gitrest/packages/gitrest-base/src/test/summaries.spec.ts new file mode 100644 index 000000000000..c66b8ec2c1fd --- /dev/null +++ b/server/gitrest/packages/gitrest-base/src/test/summaries.spec.ts @@ -0,0 +1,201 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import assert from "assert"; +import { v4 as uuid } from "uuid"; +import { ISummaryTestMode } from "./utils"; +import { GitWholeSummaryManager, IsomorphicGitManagerFactory, MemFsManagerFactory } from "../utils"; +import { NullExternalStorageManager } from "../externalStorageManager"; +import { + sampleChannelSummaryUpload, + sampleContainerSummaryUpload, + sampleContainerSummaryResponse, + sampleInitialSummaryResponse, + sampleInitialSummaryUpload, + sampleChannelSummaryResult, +} from "./examples"; +import { IWholeFlatSummary, LatestSummaryId } from "@fluidframework/server-services-client"; + +// Github Copilot wizardry. +function permuteFlags(obj: Record): Record[] { + const keys = Object.keys(obj); + const permutations: Record[] = []; + for (let i = 0; i < Math.pow(2, keys.length); i++) { + const permutation: Record = {}; + for (let j = 0; j < keys.length; j++) { + permutation[keys[j]] = (i & (1 << j)) !== 0; + } + permutations.push(permutation); + } + return permutations; +} + +function assertEqualSummaries( + actual: IWholeFlatSummary, + expected: IWholeFlatSummary, + message?: string | Error, +) { + // We cannot compare the container sha because it is generated by a commit which takes timestamp into account. + // We also cannot compare the root tree sha because low-io write alters how the root tree is stored. + assert.strictEqual( + JSON.stringify( + { + ...actual, + id: "test-commit-sha", + trees: [{ ...actual.trees[0], id: "test-tree-sha" }], + }, + null, + 2, + ), + JSON.stringify( + { + ...expected, + id: "test-commit-sha", + trees: [{ ...expected.trees[0], id: "test-tree-sha" }], + }, + null, + 2, + ), + message, + ); +} + +const testModes = permuteFlags({ + repoPerDocEnabled: false, + enableLowIoWrite: false, + enableOptimizedInitialSummary: false, + enableSlimGitInit: false, +}) as unknown as ISummaryTestMode[]; + +testModes.forEach((testMode) => { + describe(`Summaries (${JSON.stringify(testMode)})`, () => { + const memfsManagerFactory = new MemFsManagerFactory(); + const tenantId = "gitrest-summaries-test"; + let documentId: string; + let wholeSummaryManager: GitWholeSummaryManager; + beforeEach(async () => { + documentId = uuid(); + const repoManagerFactory = new IsomorphicGitManagerFactory( + { + useRepoOwner: true, + baseDir: `/${uuid()}/tmp`, + }, + { + defaultFileSystemManagerFactory: memfsManagerFactory, + }, + new NullExternalStorageManager(), + testMode.repoPerDocEnabled, + false /* enableRepositoryManagerMetrics */, + testMode.enableSlimGitInit, + undefined /* apiMetricsSamplingPeriod */, + ); + const repoManager = await repoManagerFactory.create({ + repoOwner: tenantId, + repoName: documentId, + storageRoutingId: { tenantId, documentId }, + }); + wholeSummaryManager = new GitWholeSummaryManager( + uuid(), + repoManager, + { documentId, tenantId }, + false /* externalStorageEnabled */, + { + enableLowIoWrite: testMode.enableLowIoWrite, + optimizeForInitialSummary: testMode.enableOptimizedInitialSummary, + }, + ); + }); + + afterEach(() => { + process.stdout.write( + `\nFinal storage size: ${Math.ceil( + JSON.stringify(memfsManagerFactory.volume.toJSON()).length / 1_024, + )}kb\n`, + ); + memfsManagerFactory.volume.reset(); + }); + + it("Can create and read an initial summary and a subsequent incremental summary", async () => { + const initialWriteResponse = await wholeSummaryManager.writeSummary( + sampleInitialSummaryUpload, + true, + ); + assert.strictEqual( + initialWriteResponse.isNew, + true, + "Initial summary write `isNew` should be `true`.", + ); + assertEqualSummaries( + initialWriteResponse.writeSummaryResponse as IWholeFlatSummary, + sampleInitialSummaryResponse, + "Initial summary write response should match expected response.", + ); + + const initialReadResponse = await wholeSummaryManager.readSummary(LatestSummaryId); + assertEqualSummaries( + initialReadResponse, + sampleInitialSummaryResponse, + "Initial summary read response should match expected response.", + ); + + const channelWriteResponse = await wholeSummaryManager.writeSummary( + sampleChannelSummaryUpload, + false, + ); + assert.strictEqual( + channelWriteResponse.isNew, + false, + "Channel summary write `isNew` should be `false`.", + ); + + // Latest should still be the initial summary. + const postChannelReadResponse = await wholeSummaryManager.readSummary(LatestSummaryId); + assertEqualSummaries( + postChannelReadResponse, + sampleInitialSummaryResponse, + "Channel summary read response should match expected initial container summary response.", + ); + + const containerWriteResponse = await wholeSummaryManager.writeSummary( + // Replace the referenced channel summary with the one we just wrote. + // This matters when low-io write is enabled, because it alters how the tree is stored. + JSON.parse( + JSON.stringify(sampleContainerSummaryUpload).replace( + sampleChannelSummaryResult.id, + channelWriteResponse.writeSummaryResponse.id, + ), + ), + false, + ); + assert.strictEqual( + containerWriteResponse.isNew, + false, + "Container summary write `isNew` should be `false`.", + ); + assertEqualSummaries( + containerWriteResponse.writeSummaryResponse as IWholeFlatSummary, + sampleContainerSummaryResponse, + "Container summary write response should match expected response.", + ); + + const containerReadResponse = await wholeSummaryManager.readSummary(LatestSummaryId); + assertEqualSummaries( + containerReadResponse, + sampleContainerSummaryResponse, + "Container summary read response should match expected response.", + ); + + // And we should still be able to read the initial summary when referenced by ID. + const initialLaterReadResponse = await wholeSummaryManager.readSummary( + initialWriteResponse.writeSummaryResponse.id, + ); + assertEqualSummaries( + initialLaterReadResponse, + sampleInitialSummaryResponse, + "Later initial summary read response should match expected initial summary response.", + ); + }); + }); +}); diff --git a/server/gitrest/packages/gitrest-base/src/test/utils.ts b/server/gitrest/packages/gitrest-base/src/test/utils.ts index 00468886bcbe..97c0f8aafaeb 100644 --- a/server/gitrest/packages/gitrest-base/src/test/utils.ts +++ b/server/gitrest/packages/gitrest-base/src/test/utils.ts @@ -9,11 +9,17 @@ import rimrafCallback from "rimraf"; import { IStorageDirectoryConfig } from "../utils"; export type gitLibType = "isomorphic-git"; -export interface ITestMode { +export interface IRouteTestMode { name: string; gitLibrary: gitLibType; repoPerDocEnabled: boolean; } +export interface ISummaryTestMode { + repoPerDocEnabled: boolean; + enableLowIoWrite: boolean; + enableOptimizedInitialSummary: boolean; + enableSlimGitInit: boolean; +} export const defaultProvider = new nconf.Provider({}).use("memory").defaults({ logger: { @@ -35,9 +41,22 @@ export const defaultProvider = new nconf.Provider({}).use("memory").defaults({ lib: { name: "isomorphic-git", }, + filesystem: { + name: "nodeFs", + }, + ephemeralfilesystem: { + name: "redisFs", + }, persistLatestFullSummary: false, - enableLowIoWrite: false, repoPerDocEnabled: false, + enableRepositoryManagerMetrics: false, + apiMetricsSamplingPeriod: 100, + enableLowIoWrite: false, + enableOptimizedInitialSummary: false, + enableSlimGitInit: false, + enableRedisFsMetrics: true, + redisApiMetricsSamplingPeriod: 0, + enforceStrictPersistedFullSummaryReads: false, }, }); @@ -49,3 +68,32 @@ export function initializeBeforeAfterTestHooks(provider: nconf.Provider) { return rimraf(storageDirConfig.baseDir); }); } + +export function convertAllUtf8ToBase64(obj: Record): T { + return JSON.parse( + JSON.stringify(obj, (key, value: any): any => { + // console.log(key, value); + if ( + typeof value === "object" && + value !== null && + value.encoding === "utf-8" && + value.content + ) { + const originalValue = value; + const newValue = { + content: Buffer.from(value.content, "utf-8").toString("base64"), + encoding: "base64", + size: undefined, + }; + if (originalValue.size !== undefined) { + newValue.size = newValue.content.length; + } + return { + ...originalValue, + ...newValue, + }; + } + return value; + }), + ) as unknown as T; +}