From a1c6c5f28dc0fff593f0c220ba3052254181caae Mon Sep 17 00:00:00 2001 From: Mark Fields Date: Thu, 29 Jun 2023 13:17:07 -0700 Subject: [PATCH 01/10] Summarizer: Rename setting to flight it to new code only (#16187) --- packages/runtime/container-runtime/src/containerRuntime.ts | 2 +- .../test-end-to-end-tests/src/test/summarizeRestart.spec.ts | 2 +- .../src/test/summarizerWithLocalChanges.spec.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/runtime/container-runtime/src/containerRuntime.ts b/packages/runtime/container-runtime/src/containerRuntime.ts index acdaccc8bc37..f6046f38d152 100644 --- a/packages/runtime/container-runtime/src/containerRuntime.ts +++ b/packages/runtime/container-runtime/src/containerRuntime.ts @@ -1378,7 +1378,7 @@ export class ContainerRuntime }); this.summaryStateUpdateMethod = this.mc.config.getString( - "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethod", + "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethodV2", ); const closeSummarizerDelayOverride = this.mc.config.getNumber( "Fluid.ContainerRuntime.Test.CloseSummarizerDelayOverrideMs", diff --git a/packages/test/test-end-to-end-tests/src/test/summarizeRestart.spec.ts b/packages/test/test-end-to-end-tests/src/test/summarizeRestart.spec.ts index c0466551e350..4df10740bdbe 100644 --- a/packages/test/test-end-to-end-tests/src/test/summarizeRestart.spec.ts +++ b/packages/test/test-end-to-end-tests/src/test/summarizeRestart.spec.ts @@ -32,7 +32,7 @@ describeNoCompat("Summarizer closes instead of refreshing", (getTestObjectProvid beforeEach(async () => { provider = getTestObjectProvider({ syncSummarizer: true }); - settings["Fluid.ContainerRuntime.Test.SummaryStateUpdateMethod"] = "restart"; + settings["Fluid.ContainerRuntime.Test.SummaryStateUpdateMethodV2"] = "restart"; settings["Fluid.ContainerRuntime.Test.CloseSummarizerDelayOverrideMs"] = 100; }); diff --git a/packages/test/test-end-to-end-tests/src/test/summarizerWithLocalChanges.spec.ts b/packages/test/test-end-to-end-tests/src/test/summarizerWithLocalChanges.spec.ts index 65147c651680..49299b9494f4 100644 --- a/packages/test/test-end-to-end-tests/src/test/summarizerWithLocalChanges.spec.ts +++ b/packages/test/test-end-to-end-tests/src/test/summarizerWithLocalChanges.spec.ts @@ -189,7 +189,7 @@ describeNoCompat("Summarizer with local data stores", (getTestObjectProvider) => beforeEach(async () => { provider = getTestObjectProvider({ syncSummarizer: true }); settings = []; - settings["Fluid.ContainerRuntime.Test.SummaryStateUpdateMethod"] = "restart"; + settings["Fluid.ContainerRuntime.Test.SummaryStateUpdateMethodV2"] = "restart"; settings["Fluid.ContainerRuntime.Test.CloseSummarizerDelayOverrideMs"] = 0; }); From 3874a93586fd5af4dd8f7718e7a7ad7e6ded60b1 Mon Sep 17 00:00:00 2001 From: Navin Agarwal <45832642+agarwal-navin@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:44:18 -0700 Subject: [PATCH 02/10] Add missing export SummaryStage introduced by #15988 (#16192) #15988 added a type `SummaryStage` but it was not exported as expected. This PR exports the missing symbol removing the warning in the container-runtime.api.md file. --- api-report/container-runtime.api.md | 5 +++-- packages/runtime/container-runtime/src/index.ts | 1 + packages/runtime/container-runtime/src/summary/index.ts | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/api-report/container-runtime.api.md b/api-report/container-runtime.api.md index 90419e12ddfc..4a6387bd2a85 100644 --- a/api-report/container-runtime.api.md +++ b/api-report/container-runtime.api.md @@ -655,8 +655,6 @@ export enum RuntimeMessage { // @public export interface SubmitSummaryFailureData { - // Warning: (ae-forgotten-export) The symbol "SummaryStage" needs to be exported by the entry point index.d.ts - // // (undocumented) stage: SummaryStage; } @@ -752,6 +750,9 @@ export class SummaryCollection extends TypedEventEmitter; } +// @public +export type SummaryStage = SubmitSummaryResult["stage"] | "unknown"; + // @public export const TombstoneResponseHeaderKey = "isTombstoned"; diff --git a/packages/runtime/container-runtime/src/index.ts b/packages/runtime/container-runtime/src/index.ts index c1aaa9918e84..4c6045eb29a1 100644 --- a/packages/runtime/container-runtime/src/index.ts +++ b/packages/runtime/container-runtime/src/index.ts @@ -68,6 +68,7 @@ export { OpActionEventName, ICancellableSummarizerController, SubmitSummaryFailureData, + SummaryStage, } from "./summary"; export { IChunkedOp, unpackRuntimeMessage } from "./opLifecycle"; export { generateStableId, isStableId, assertIsStableId } from "./id-compressor"; diff --git a/packages/runtime/container-runtime/src/summary/index.ts b/packages/runtime/container-runtime/src/summary/index.ts index 4fef66c42780..5147dac1d8b7 100644 --- a/packages/runtime/container-runtime/src/summary/index.ts +++ b/packages/runtime/container-runtime/src/summary/index.ts @@ -63,6 +63,7 @@ export { IUploadSummaryResult, SummarizeResultPart, SubmitSummaryFailureData, + SummaryStage, } from "./summarizerTypes"; export { IAckedSummary, From e61e7a26ca5349835c2870dc203db28a3df52a25 Mon Sep 17 00:00:00 2001 From: Ji Kim <111468570+jikim-msft@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:48:27 -0700 Subject: [PATCH 03/10] fix(devtools-view): Fix container typemetadata and metadata color on hover (#16185) #### Description https://dev.azure.com/fluidframework/internal/_workitems/edit/4677/ Screenshot 2023-06-29 at 10 46 05 AM #### Change - High contrast theme should only have `white` as its font color when not hovered, and `black` when hovered over the row. - Conditionally apply the color based on the `themeInfo.name`. --- .../data-visualization/TreeHeader.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/tools/devtools/devtools-view/src/components/data-visualization/TreeHeader.tsx b/packages/tools/devtools/devtools-view/src/components/data-visualization/TreeHeader.tsx index 384e24c8a842..608d33e865be 100644 --- a/packages/tools/devtools/devtools-view/src/components/data-visualization/TreeHeader.tsx +++ b/packages/tools/devtools/devtools-view/src/components/data-visualization/TreeHeader.tsx @@ -4,7 +4,7 @@ */ import React from "react"; import { tokens } from "@fluentui/react-components"; - +import { ThemeContext } from "../../ThemeHelper"; import { HasLabel } from "./CommonInterfaces"; /** @@ -31,15 +31,26 @@ export interface TreeHeaderProps extends HasLabel { export function TreeHeader(props: TreeHeaderProps): React.ReactElement { const { label, nodeTypeMetadata, inlineValue, metadata } = props; + const { themeInfo } = React.useContext(ThemeContext); + return (
{`${label}`} - + {nodeTypeMetadata === undefined ? "" : ` (${nodeTypeMetadata})`} Date: Thu, 29 Jun 2023 15:15:44 -0700 Subject: [PATCH 04/10] Add backpressure to stress test runner load (#16196) ## Description Makes the stress test runner retry loop respect `ThrottlingError`s thrown by waiting for the retryAfter duration before starting a new container. This should hopefully dramatically decrease the frequency of throttling errors we see from odsp, which is currently the largest cause of `RunnerFailed`. --- packages/test/test-service-load/package.json | 1 + packages/test/test-service-load/src/runner.ts | 10 +++++++++- pnpm-lock.yaml | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/test/test-service-load/package.json b/packages/test/test-service-load/package.json index 73dad474c663..873acbf51d95 100644 --- a/packages/test/test-service-load/package.json +++ b/packages/test/test-service-load/package.json @@ -88,6 +88,7 @@ "@fluidframework/counter": "workspace:~", "@fluidframework/datastore-definitions": "workspace:~", "@fluidframework/driver-definitions": "workspace:~", + "@fluidframework/driver-utils": "workspace:~", "@fluidframework/map": "workspace:~", "@fluidframework/protocol-definitions": "^1.1.0", "@fluidframework/runtime-definitions": "workspace:~", diff --git a/packages/test/test-service-load/src/runner.ts b/packages/test/test-service-load/src/runner.ts index a2d2608cc6aa..93d67f3d3ed5 100644 --- a/packages/test/test-service-load/src/runner.ts +++ b/packages/test/test-service-load/src/runner.ts @@ -15,7 +15,8 @@ import { requestFluidObject } from "@fluidframework/runtime-utils"; import { IRequestHeader } from "@fluidframework/core-interfaces"; import { IContainer, LoaderHeader } from "@fluidframework/container-definitions"; import { IDocumentServiceFactory } from "@fluidframework/driver-definitions"; -import { assert } from "@fluidframework/common-utils"; +import { getRetryDelayFromError } from "@fluidframework/driver-utils"; +import { assert, delay } from "@fluidframework/common-utils"; import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils"; import { IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions"; import { IInboundSignalMessage } from "@fluidframework/runtime-definitions"; @@ -307,6 +308,13 @@ async function runnerProcess( }, error, ); + // Add a little backpressure: + // if the runner closed with some sort of throttling error, avoid running into a throttling loop + // by respecting that delay before starting the load process for a new container. + const delayMs = getRetryDelayFromError(error); + if (delayMs !== undefined) { + await delay(delayMs); + } } finally { if (container?.closed === false) { container?.close(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index df4fbb259d53..bfab9e204449 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10253,6 +10253,7 @@ importers: '@fluidframework/counter': workspace:~ '@fluidframework/datastore-definitions': workspace:~ '@fluidframework/driver-definitions': workspace:~ + '@fluidframework/driver-utils': workspace:~ '@fluidframework/eslint-config-fluid': ^2.0.0 '@fluidframework/map': workspace:~ '@fluidframework/mocha-test-setup': workspace:~ @@ -10292,6 +10293,7 @@ importers: '@fluidframework/counter': link:../../dds/counter '@fluidframework/datastore-definitions': link:../../runtime/datastore-definitions '@fluidframework/driver-definitions': link:../../common/driver-definitions + '@fluidframework/driver-utils': link:../../loader/driver-utils '@fluidframework/map': link:../../dds/map '@fluidframework/protocol-definitions': 1.2.0 '@fluidframework/runtime-definitions': link:../../runtime/runtime-definitions From fd559d6861567df677fa7bb69acf309ea5f54d5a Mon Sep 17 00:00:00 2001 From: Mark Fields Date: Thu, 29 Jun 2023 15:41:26 -0700 Subject: [PATCH 05/10] Stress Test Config: Adjust summarizer-based flights for stress tests (#16193) We renamed the flight name to differentiate new v. old code in the flight system (#16187). But I forgot to update the stress tests to use the new flight value. Furthermore, we want to enable another setting in tandem, so add that too. --- packages/test/test-service-load/testConfig.json | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/test/test-service-load/testConfig.json b/packages/test/test-service-load/testConfig.json index d3e1646add5f..a04e341807a2 100644 --- a/packages/test/test-service-load/testConfig.json +++ b/packages/test/test-service-load/testConfig.json @@ -28,18 +28,21 @@ "optionOverrides": { "odsp": { "configurations": { - "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethod": ["restart", "default"] + "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethodV2": ["restart", "default"], + "Fluid.ContainerRuntime.Test.ValidateSummaryBeforeUpload": [true, false] } }, "odsp-odsp-df": { "configurations": { "Fluid.Driver.Odsp.snapshotFormatFetchType": [2], - "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethod": ["restart", "default"] + "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethodV2": ["restart", "default"], + "Fluid.ContainerRuntime.Test.ValidateSummaryBeforeUpload": [true, false] } }, "tinylicious": { "configurations": { - "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethod": ["restart", "default"] + "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethodV2": ["restart", "default"], + "Fluid.ContainerRuntime.Test.ValidateSummaryBeforeUpload": [true, false] } } }, @@ -69,7 +72,8 @@ "optionOverrides": { "routerlicious": { "configurations": { - "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethod": ["restart", "default"] + "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethodV2": ["restart", "default"], + "Fluid.ContainerRuntime.Test.ValidateSummaryBeforeUpload": [true, false] } } } @@ -98,7 +102,8 @@ "optionOverrides": { "odsp": { "configurations": { - "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethod": ["restart", "default"] + "Fluid.ContainerRuntime.Test.SummaryStateUpdateMethodV2": ["restart", "default"], + "Fluid.ContainerRuntime.Test.ValidateSummaryBeforeUpload": [true, false] } } } From c4519dac58ce43d20ce23cc81e3e5ddd3211ec8a Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Thu, 29 Jun 2023 16:05:28 -0700 Subject: [PATCH 06/10] build(bundle-size-tools): Remove unneeded @types (#16198) The jszip package includes types, making the separate package superfluous. --- .../packages/bundle-size-tools/package.json | 1 - build-tools/pnpm-lock.yaml | 42 +++++++------------ 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/build-tools/packages/bundle-size-tools/package.json b/build-tools/packages/bundle-size-tools/package.json index 7816c749e423..4899ab4144fc 100644 --- a/build-tools/packages/bundle-size-tools/package.json +++ b/build-tools/packages/bundle-size-tools/package.json @@ -42,7 +42,6 @@ "@fluidframework/build-common": "^2.0.0", "@fluidframework/eslint-config-fluid": "^2.0.0", "@microsoft/api-extractor": "^7.35.3", - "@types/jszip": "^3.4.1", "@types/msgpack-lite": "^0.1.8", "@types/node": "^14.18.51", "@types/pako": "^2.0.0", diff --git a/build-tools/pnpm-lock.yaml b/build-tools/pnpm-lock.yaml index 79e2d83e1120..ba33bfdf00f2 100644 --- a/build-tools/pnpm-lock.yaml +++ b/build-tools/pnpm-lock.yaml @@ -312,7 +312,6 @@ importers: '@fluidframework/build-common': ^2.0.0 '@fluidframework/eslint-config-fluid': ^2.0.0 '@microsoft/api-extractor': ^7.35.3 - '@types/jszip': ^3.4.1 '@types/msgpack-lite': ^0.1.8 '@types/node': ^14.18.51 '@types/pako': ^2.0.0 @@ -341,7 +340,6 @@ importers: '@fluidframework/build-common': 2.0.0 '@fluidframework/eslint-config-fluid': 2.0.0_kufnqfq7tb5rpdawkdb6g5smma '@microsoft/api-extractor': 7.35.3_@types+node@14.18.51 - '@types/jszip': 3.4.1 '@types/msgpack-lite': 0.1.8 '@types/node': 14.18.51 '@types/pako': 2.0.0 @@ -685,7 +683,7 @@ packages: deprecated: 🚨 This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information. dependencies: core-js: 2.6.12 - regenerator-runtime: 0.13.9 + regenerator-runtime: 0.13.11 dev: false /@babel/runtime/7.22.5: @@ -2581,7 +2579,7 @@ packages: resolution: {integrity: sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==} engines: {node: '>= 14'} dependencies: - '@octokit/types': 9.0.0 + '@octokit/types': 9.3.2 /@octokit/core/3.6.0: resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} @@ -2639,7 +2637,7 @@ packages: engines: {node: '>= 14'} dependencies: '@octokit/request': 6.2.3 - '@octokit/types': 9.0.0 + '@octokit/types': 9.3.2 universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding @@ -2741,7 +2739,7 @@ packages: resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} engines: {node: '>= 14'} dependencies: - '@octokit/types': 9.0.0 + '@octokit/types': 9.3.2 deprecation: 2.3.1 once: 1.4.0 @@ -2763,7 +2761,7 @@ packages: dependencies: '@octokit/endpoint': 7.0.5 '@octokit/request-error': 3.0.3 - '@octokit/types': 9.0.0 + '@octokit/types': 9.3.2 is-plain-object: 5.0.0 node-fetch: 2.6.9 universal-user-agent: 6.0.0 @@ -3128,13 +3126,6 @@ packages: json5: 2.2.3 dev: true - /@types/jszip/3.4.1: - resolution: {integrity: sha512-TezXjmf3lj+zQ651r6hPqvSScqBLvyPI9FxdXBqpEwBijNGQ2NXpaFW/7joGzveYkKQUil7iiDHLo6LV71Pc0A==} - deprecated: This is a stub types definition. jszip provides its own type definitions, so you do not need this installed. - dependencies: - jszip: 3.10.1 - dev: true - /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: @@ -5159,7 +5150,7 @@ packages: http-proxy-agent: 2.1.0 https-proxy-agent: 2.2.4 hyperlinker: 1.0.0 - json5: 2.2.1 + json5: 2.2.3 jsonpointer: 5.0.1 jsonwebtoken: 8.5.1 lodash.find: 4.6.0 @@ -7364,6 +7355,7 @@ packages: /immediate/3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -7970,12 +7962,6 @@ packages: minimist: 1.2.8 dev: true - /json5/2.2.1: - resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} - engines: {node: '>=6'} - hasBin: true - dev: false - /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -8076,6 +8062,7 @@ packages: pako: 1.0.11 readable-stream: 2.3.7 setimmediate: 1.0.5 + dev: false /just-diff-apply/5.5.0: resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} @@ -8225,6 +8212,7 @@ packages: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} dependencies: immediate: 3.0.6 + dev: false /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -8474,8 +8462,8 @@ packages: es5-ext: 0.10.62 dev: false - /macos-release/2.5.0: - resolution: {integrity: sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==} + /macos-release/2.5.1: + resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} engines: {node: '>=6'} dev: false @@ -9770,7 +9758,7 @@ packages: resolution: {integrity: sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==} engines: {node: '>=6'} dependencies: - macos-release: 2.5.0 + macos-release: 2.5.1 windows-release: 3.3.3 dev: false @@ -10038,6 +10026,7 @@ packages: /pako/1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false /pako/2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} @@ -10632,10 +10621,6 @@ packages: /regenerator-runtime/0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regenerator-runtime/0.13.9: - resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} - dev: false - /regexp-tree/0.1.24: resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==} hasBin: true @@ -10962,6 +10947,7 @@ packages: /setimmediate/1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false /shallow-clone/3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} From ccb3450d2168d62332d6055f426e5b9033ae9eec Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Thu, 29 Jun 2023 18:00:03 -0700 Subject: [PATCH 07/10] fix(upcoming): Don't output the changeset dates (#16204) The dates apparently can sometimes differ when running in CI. While we figure out exactly what's happening, remove the date from the UPCOMING output. --- .../packages/build-cli/src/commands/generate/upcoming.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build-tools/packages/build-cli/src/commands/generate/upcoming.ts b/build-tools/packages/build-cli/src/commands/generate/upcoming.ts index 14af314097cf..f85e86ddbfbd 100644 --- a/build-tools/packages/build-cli/src/commands/generate/upcoming.ts +++ b/build-tools/packages/build-cli/src/commands/generate/upcoming.ts @@ -76,9 +76,7 @@ export default class GenerateUpcomingCommand extends BaseCommand Date: Thu, 29 Jun 2023 18:52:10 -0700 Subject: [PATCH 08/10] Return the first consecutive sub block of ops for frs driver instead of 0 ops on violation (#16172) ## Description Item: https://dev.azure.com/fluidframework/internal/_workitems/edit/4668 When we fetch ops for frs through delta storage or through snapshot, it could happen that the ops are not contiguous. In that case, return the first set of contiguous ops so that we can make at least some progress. It's an issue service needs to address, but this change is a temp experiment to see if it mitigates issues for users while we are waiting for proper fix. --------- Co-authored-by: Jatin Garg --- api-report/driver-base.api.md | 2 +- packages/drivers/driver-base/.eslintrc.js | 3 + packages/drivers/driver-base/.mocharc.js | 12 ++ packages/drivers/driver-base/package.json | 34 ++++++ .../drivers/driver-base/src/driverUtils.ts | 37 ++++-- .../src/test/driverUtilsTests.spec.ts | 111 ++++++++++++++++++ .../driver-base/src/test/tsconfig.json | 16 +++ packages/drivers/driver-base/tsconfig.json | 3 +- .../src/deltaStorageService.ts | 4 +- pnpm-lock.yaml | 16 +++ 10 files changed, 221 insertions(+), 17 deletions(-) create mode 100644 packages/drivers/driver-base/.mocharc.js create mode 100644 packages/drivers/driver-base/src/test/driverUtilsTests.spec.ts create mode 100644 packages/drivers/driver-base/src/test/tsconfig.json diff --git a/api-report/driver-base.api.md b/api-report/driver-base.api.md index 88b5bb2501fc..ddbf17f38f42 100644 --- a/api-report/driver-base.api.md +++ b/api-report/driver-base.api.md @@ -105,7 +105,7 @@ export function promiseRaceWithWinner(promises: Promise[]): Promise<{ }>; // @public (undocumented) -export function validateMessages(reason: string, messages: ISequencedDocumentMessage[], from: number, logger: ITelemetryLoggerExt): void; +export function validateMessages(reason: string, messages: ISequencedDocumentMessage[], from: number, logger: ITelemetryLoggerExt, strict?: boolean): void; // (No @packageDocumentation comment for this package) diff --git a/packages/drivers/driver-base/.eslintrc.js b/packages/drivers/driver-base/.eslintrc.js index 9b1916668a6e..c3573c72dc1d 100644 --- a/packages/drivers/driver-base/.eslintrc.js +++ b/packages/drivers/driver-base/.eslintrc.js @@ -5,6 +5,9 @@ module.exports = { extends: [require.resolve("@fluidframework/eslint-config-fluid/minimal"), "prettier"], + parserOptions: { + project: ["./tsconfig.json", "./src/test/tsconfig.json"], + }, rules: { "@typescript-eslint/strict-boolean-expressions": "off", }, diff --git a/packages/drivers/driver-base/.mocharc.js b/packages/drivers/driver-base/.mocharc.js new file mode 100644 index 000000000000..81dd8e6fb139 --- /dev/null +++ b/packages/drivers/driver-base/.mocharc.js @@ -0,0 +1,12 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +"use strict"; + +const getFluidTestMochaConfig = require("@fluidframework/mocha-test-setup/mocharc-common"); + +const packageDir = __dirname; +const config = getFluidTestMochaConfig(packageDir); +module.exports = config; diff --git a/packages/drivers/driver-base/package.json b/packages/drivers/driver-base/package.json index 5b065ee996ce..0f124c59d0f6 100644 --- a/packages/drivers/driver-base/package.json +++ b/packages/drivers/driver-base/package.json @@ -21,6 +21,7 @@ "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:genver": "gen-version", + "build:test": "tsc --project ./src/test/tsconfig.json", "ci:build:docs": "api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/* ../../../_api-extractor-temp/", "clean": "rimraf dist lib *.tsbuildinfo *.build.log", "eslint": "eslint --format stylish src", @@ -30,10 +31,35 @@ "lint:fix": "npm run prettier:fix && npm run eslint:fix", "prettier": "prettier --check . --ignore-path ../../../.prettierignore", "prettier:fix": "prettier --write . --ignore-path ../../../.prettierignore", + "test": "npm run test:mocha", + "test:coverage": "nyc npm test -- --reporter xunit --reporter-option output=nyc/junit-report.xml", + "test:mocha": "mocha --ignore 'dist/test/types/*' --recursive dist/test -r node_modules/@fluidframework/mocha-test-setup --unhandled-rejections=strict", + "test:mocha:multireport": "cross-env FLUID_TEST_MULTIREPORT=1 npm run test:mocha", + "test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha", "tsc": "tsc", "typetests:gen": "fluid-type-test-generator", "typetests:prepare": "flub generate typetests --prepare --dir . --pin" }, + "nyc": { + "all": true, + "cache-dir": "nyc/.cache", + "exclude": [ + "src/test/**/*.ts", + "dist/test/**/*.js" + ], + "exclude-after-remap": false, + "include": [ + "src/**/*.ts", + "dist/**/*.js" + ], + "report-dir": "nyc/report", + "reporter": [ + "cobertura", + "html", + "text" + ], + "temp-directory": "nyc/.nyc_output" + }, "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^1.1.1", @@ -48,11 +74,19 @@ "@fluidframework/build-tools": "^0.20.0-169245", "@fluidframework/driver-base-previous": "npm:@fluidframework/driver-base@2.0.0-internal.5.0.0", "@fluidframework/eslint-config-fluid": "^2.0.0", + "@fluidframework/mocha-test-setup": "workspace:~", "@microsoft/api-extractor": "^7.34.4", + "@types/mocha": "^9.1.1", "@types/node": "^14.18.38", "concurrently": "^7.6.0", "copyfiles": "^2.4.1", + "cross-env": "^7.0.3", "eslint": "~8.6.0", + "mocha": "^10.2.0", + "mocha-json-output-reporter": "^2.0.1", + "mocha-multi-reporters": "^1.5.1", + "moment": "^2.21.0", + "nyc": "^15.1.0", "prettier": "~2.6.2", "rimraf": "^4.4.0", "socket.io-client": "^4.6.1", diff --git a/packages/drivers/driver-base/src/driverUtils.ts b/packages/drivers/driver-base/src/driverUtils.ts index f2aa7a361cf7..cc3498099634 100644 --- a/packages/drivers/driver-base/src/driverUtils.ts +++ b/packages/drivers/driver-base/src/driverUtils.ts @@ -111,23 +111,28 @@ export function validateMessages( messages: ISequencedDocumentMessage[], from: number, logger: ITelemetryLoggerExt, + strict: boolean = true, ) { if (messages.length !== 0) { const start = messages[0].sequenceNumber; const length = messages.length; const last = messages[length - 1].sequenceNumber; - if (start !== from) { - logger.sendErrorEvent({ - eventName: "OpsFetchViolation", - reason, - from, - start, - last, - length, - }); - messages.length = 0; - } if (last + 1 !== from + length) { + // If not strict, then return the first consecutive sub-block. If strict or start + // seq number is not what we expected, then return no ops. + if (strict || from !== start) { + messages.length = 0; + } else { + let validOpsCount = 1; + while ( + validOpsCount < messages.length && + messages[validOpsCount].sequenceNumber === + messages[validOpsCount - 1].sequenceNumber + 1 + ) { + validOpsCount++; + } + messages.length = Math.min(messages.length, validOpsCount); + } logger.sendErrorEvent({ eventName: "OpsFetchViolation", reason, @@ -135,9 +140,15 @@ export function validateMessages( start, last, length, + details: JSON.stringify({ + validLength: messages.length, + lastValidOpSeqNumber: + messages.length > 0 + ? messages[messages.length - 1].sequenceNumber + : undefined, + strict, + }), }); - // we can do better here by finding consecutive sub-block and return it - messages.length = 0; } } } diff --git a/packages/drivers/driver-base/src/test/driverUtilsTests.spec.ts b/packages/drivers/driver-base/src/test/driverUtilsTests.spec.ts new file mode 100644 index 000000000000..89ad059bf0fe --- /dev/null +++ b/packages/drivers/driver-base/src/test/driverUtilsTests.spec.ts @@ -0,0 +1,111 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import { assert } from "@fluidframework/common-utils"; +import { MockLogger } from "@fluidframework/telemetry-utils"; +import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"; +import { validateMessages } from "../driverUtils"; + +describe("driver utils tests", () => { + describe("validateMessagesTests", () => { + const mockLogger = new MockLogger(); + const generateOps = (start: number, count: number) => { + const ops: ISequencedDocumentMessage[] = []; + let i = 0; + while (i < count) { + ops.push({ sequenceNumber: start + i } as any as ISequencedDocumentMessage); + i++; + } + return ops; + }; + + beforeEach(() => { + mockLogger.clear(); + }); + + it("from not equal to start", () => { + const ops = generateOps(1, 5); + validateMessages("test1", ops, 0, mockLogger, true); + assert(ops.length === 0, "no ops should be returned"); + assert( + mockLogger.matchEventStrict([ + { + eventName: "OpsFetchViolation", + reason: "test1", + from: 0, + start: 1, + last: 5, + length: 5, + details: JSON.stringify({ + validLength: 0, + lastValidOpSeqNumber: undefined, + strict: true, + }), + }, + ]), + "Ops fetch violation event not correctly recorded", + ); + }); + + it("contiguous ops", () => { + const ops = generateOps(1, 5); + validateMessages("test2", ops, 1, mockLogger, true); + assert(ops.length === 5, "ops should be returned"); + assert(mockLogger.events.length === 0, "no events should be there"); + }); + + it("non contiguous ops: strict = true", () => { + const ops = generateOps(1, 5); + // Change seq number of last op + ops[4].sequenceNumber = 7; + validateMessages("test", ops, 1, mockLogger, true); + assert(ops.length === 0, "no ops should be returned as strict == true"); + assert( + mockLogger.matchEventStrict([ + { + eventName: "OpsFetchViolation", + reason: "test", + from: 1, + start: 1, + last: 7, + length: 5, + details: JSON.stringify({ + validLength: 0, + lastValidOpSeqNumber: undefined, + strict: true, + }), + }, + ]), + "Ops fetch violation event not correctly recorded", + ); + }); + + it("non contiguous ops: strict = false", () => { + const ops = generateOps(1, 5); + // Change seq number of last op + ops[4].sequenceNumber = 7; + validateMessages("test", ops, 1, mockLogger, false); + assert(ops.length === 4, "some should be returned as strict == false"); + assert( + mockLogger.matchEventStrict([ + { + eventName: "OpsFetchViolation", + reason: "test", + from: 1, + start: 1, + last: 7, + length: 5, + details: JSON.stringify({ + validLength: 4, + lastValidOpSeqNumber: 4, + strict: false, + }), + }, + ]), + "Ops fetch violation event not correctly recorded", + ); + }); + }); +}); diff --git a/packages/drivers/driver-base/src/test/tsconfig.json b/packages/drivers/driver-base/src/test/tsconfig.json new file mode 100644 index 000000000000..f338eb89a63c --- /dev/null +++ b/packages/drivers/driver-base/src/test/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "@fluidframework/build-common/ts-common-config.json", + "compilerOptions": { + "rootDir": "./", + "outDir": "../../dist/test", + "types": ["mocha"], + "declaration": false, + "declarationMap": false, + }, + "include": ["./**/*"], + "references": [ + { + "path": "../..", + }, + ], +} diff --git a/packages/drivers/driver-base/tsconfig.json b/packages/drivers/driver-base/tsconfig.json index 4c4c04fe6144..9f03e2b6e02c 100644 --- a/packages/drivers/driver-base/tsconfig.json +++ b/packages/drivers/driver-base/tsconfig.json @@ -1,9 +1,10 @@ { "extends": "@fluidframework/build-common/ts-common-config.json", - "exclude": ["dist", "node_modules"], + "exclude": ["src/test/**/*"], "compilerOptions": { "rootDir": "./src", "outDir": "./dist", + "composite": true, }, "include": ["src/**/*"], } diff --git a/packages/drivers/routerlicious-driver/src/deltaStorageService.ts b/packages/drivers/routerlicious-driver/src/deltaStorageService.ts index 7100c6ced330..b9aee78db821 100644 --- a/packages/drivers/routerlicious-driver/src/deltaStorageService.ts +++ b/packages/drivers/routerlicious-driver/src/deltaStorageService.ts @@ -73,7 +73,7 @@ export class DocumentDeltaStorageService implements IDocumentDeltaStorageService const messages = this.snapshotOps.filter( (op) => op.sequenceNumber >= from && op.sequenceNumber < to, ); - validateMessages("snapshotOps", messages, from, this.logger); + validateMessages("snapshotOps", messages, from, this.logger, false /* strict */); if (messages.length > 0 && messages[0].sequenceNumber === from) { this.snapshotOps = this.snapshotOps.filter((op) => op.sequenceNumber >= to); opsFromSnapshot += messages.length; @@ -83,7 +83,7 @@ export class DocumentDeltaStorageService implements IDocumentDeltaStorageService } const ops = await this.deltaStorageService.get(this.tenantId, this.id, from, to); - validateMessages("storage", ops.messages, from, this.logger); + validateMessages("storage", ops.messages, from, this.logger, false /* strict */); opsFromStorage += ops.messages.length; return ops; }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfab9e204449..58ef470cf8ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7137,13 +7137,21 @@ importers: '@fluidframework/driver-definitions': workspace:~ '@fluidframework/driver-utils': workspace:~ '@fluidframework/eslint-config-fluid': ^2.0.0 + '@fluidframework/mocha-test-setup': workspace:~ '@fluidframework/protocol-definitions': ^1.1.0 '@fluidframework/telemetry-utils': workspace:~ '@microsoft/api-extractor': ^7.34.4 + '@types/mocha': ^9.1.1 '@types/node': ^14.18.38 concurrently: ^7.6.0 copyfiles: ^2.4.1 + cross-env: ^7.0.3 eslint: ~8.6.0 + mocha: ^10.2.0 + mocha-json-output-reporter: ^2.0.1 + mocha-multi-reporters: ^1.5.1 + moment: ^2.21.0 + nyc: ^15.1.0 prettier: ~2.6.2 rimraf: ^4.4.0 socket.io-client: ^4.6.1 @@ -7161,11 +7169,19 @@ importers: '@fluidframework/build-tools': 0.20.0-171385_@types+node@14.18.47 '@fluidframework/driver-base-previous': /@fluidframework/driver-base/2.0.0-internal.5.0.0 '@fluidframework/eslint-config-fluid': 2.0.0_kufnqfq7tb5rpdawkdb6g5smma + '@fluidframework/mocha-test-setup': link:../../test/mocha-test-setup '@microsoft/api-extractor': 7.34.9_@types+node@14.18.47 + '@types/mocha': 9.1.1 '@types/node': 14.18.47 concurrently: 7.6.0 copyfiles: 2.4.1 + cross-env: 7.0.3 eslint: 8.6.0 + mocha: 10.2.0 + mocha-json-output-reporter: 2.1.0_mocha@10.2.0+moment@2.29.4 + mocha-multi-reporters: 1.5.1_mocha@10.2.0 + moment: 2.29.4 + nyc: 15.1.0 prettier: 2.6.2 rimraf: 4.4.1 socket.io-client: 4.6.1 From d061f184a03f6ce76f397f7fba313aa972c64309 Mon Sep 17 00:00:00 2001 From: Curtis Man Date: Thu, 29 Jun 2023 19:29:44 -0700 Subject: [PATCH 09/10] Add tool version changes as incremental rebuild trigger (#16200) For tsc, add a version check with the tsBuildInfo file to trigger incremental rebuild trigger. For the following tools, add the tool version in the done log files to serve as an incremental rebuild trigger when it changes. - api-extractor - tslint - eslint - prettier Fixes [AB#4809](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/4809) --- .../build-tools/src/common/npmPackage.ts | 1 - .../build-tools/src/common/taskUtils.ts | 15 +++++++++++ .../fluidBuild/tasks/leaf/apiExtractorTask.ts | 5 ++++ .../src/fluidBuild/tasks/leaf/lintTasks.ts | 10 +++++++- .../src/fluidBuild/tasks/leaf/prettierTask.ts | 8 ++++-- .../src/fluidBuild/tasks/leaf/tscTask.ts | 25 ++++++++++++++++++- .../src/fluidBuild/tasks/workers/tscWorker.ts | 1 - 7 files changed, 59 insertions(+), 6 deletions(-) diff --git a/build-tools/packages/build-tools/src/common/npmPackage.ts b/build-tools/packages/build-tools/src/common/npmPackage.ts index 99c66ebae267..8ebeaa1883fb 100644 --- a/build-tools/packages/build-tools/src/common/npmPackage.ts +++ b/build-tools/packages/build-tools/src/common/npmPackage.ts @@ -8,7 +8,6 @@ import * as chalk from "chalk"; import detectIndent from "detect-indent"; import * as fs from "fs"; import { readFileSync, readJsonSync, writeJsonSync } from "fs-extra"; -import { sync as globSync, hasMagic } from "glob"; import * as path from "path"; import sortPackageJson from "sort-package-json"; diff --git a/build-tools/packages/build-tools/src/common/taskUtils.ts b/build-tools/packages/build-tools/src/common/taskUtils.ts index ec54aa4a3da9..45ef730f7ac3 100644 --- a/build-tools/packages/build-tools/src/common/taskUtils.ts +++ b/build-tools/packages/build-tools/src/common/taskUtils.ts @@ -4,6 +4,7 @@ */ import * as path from "path"; import { existsSync } from "fs"; +import { lookUpDirSync, readFileAsync } from "./utils"; export function getEsLintConfigFilePath(dir: string) { // TODO: we currently don't support .yaml and .yml, or config in package.json @@ -16,3 +17,17 @@ export function getEsLintConfigFilePath(dir: string) { } return undefined; } + +export async function getInstalledPackageVersion(packageName: string, cwd: string) { + const resolvedPath = require.resolve(packageName, { paths: [cwd] }); + const packageJsonPath = await lookUpDirSync(resolvedPath, (currentDir) => { + return existsSync(path.join(currentDir, "package.json")); + }); + if (packageJsonPath === undefined) { + throw new Error(`Unable to find package ${packageName} from ${cwd}`); + } + const packageJson = JSON.parse( + await readFileAsync(path.join(packageJsonPath, "package.json"), "utf8"), + ); + return packageJson.version; +} diff --git a/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/apiExtractorTask.ts b/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/apiExtractorTask.ts index 751e7be26bb3..f8723afa3030 100644 --- a/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/apiExtractorTask.ts +++ b/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/apiExtractorTask.ts @@ -2,10 +2,15 @@ * Copyright (c) Microsoft Corporation and contributors. All rights reserved. * Licensed under the MIT License. */ +import { getInstalledPackageVersion } from "../../../common/taskUtils"; import { TscDependentTask } from "./tscTask"; export class ApiExtractorTask extends TscDependentTask { protected get configFileFullPath() { return this.getPackageFileFullPath("api-extractor.json"); } + + protected async getToolVersion() { + return getInstalledPackageVersion("@microsoft/api-extractor", this.node.pkg.directory); + } } diff --git a/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/lintTasks.ts b/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/lintTasks.ts index 99602d623ce4..1582142f2a30 100644 --- a/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/lintTasks.ts +++ b/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/lintTasks.ts @@ -2,13 +2,17 @@ * Copyright (c) Microsoft Corporation and contributors. All rights reserved. * Licensed under the MIT License. */ -import { getEsLintConfigFilePath } from "../../../common/taskUtils"; +import { getEsLintConfigFilePath, getInstalledPackageVersion } from "../../../common/taskUtils"; import { TscDependentTask } from "./tscTask"; export class TsLintTask extends TscDependentTask { protected get configFileFullPath() { return this.getPackageFileFullPath("tslint.json"); } + + protected async getToolVersion() { + return getInstalledPackageVersion("tslint", this.node.pkg.directory); + } } export class EsLintTask extends TscDependentTask { @@ -30,4 +34,8 @@ export class EsLintTask extends TscDependentTask { } return false; } + + protected async getToolVersion() { + return getInstalledPackageVersion("eslint", this.node.pkg.directory); + } } diff --git a/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/prettierTask.ts b/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/prettierTask.ts index abc0bfa8348e..e8b79017701d 100644 --- a/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/prettierTask.ts +++ b/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/prettierTask.ts @@ -8,7 +8,8 @@ import * as path from "path"; import { existsSync, globFn, readFileAsync, statAsync } from "../../../common/utils"; import { BuildPackage } from "../../buildGraph"; -import { LeafTask, LeafWithDoneFileTask } from "./leafTask"; +import { LeafWithDoneFileTask } from "./leafTask"; +import { getInstalledPackageVersion } from "../../../common/taskUtils"; export class PrettierTask extends LeafWithDoneFileTask { private parsed: boolean = false; @@ -104,7 +105,10 @@ export class PrettierTask extends LeafWithDoneFileTask { return { name, hash }; }); const hashes = await Promise.all(hashesP); - return JSON.stringify(hashes); + return JSON.stringify({ + version: await getInstalledPackageVersion("prettier", this.node.pkg.directory), + hashes, + }); } catch (e) { this.traceExec(`error generating done file content. ${e}`); return undefined; diff --git a/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/tscTask.ts b/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/tscTask.ts index f5df29339523..cb9018d62aef 100644 --- a/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/tscTask.ts +++ b/build-tools/packages/build-tools/src/fluidBuild/tasks/leaf/tscTask.ts @@ -9,6 +9,7 @@ import * as ts from "typescript"; import { defaultLogger } from "../../../common/logging"; import { existsSync, readFileAsync } from "../../../common/utils"; +import { getInstalledPackageVersion } from "../../../common/taskUtils"; import * as TscUtils from "../../../common/tscUtils"; import { LeafTask, LeafWithDoneFileTask } from "./leafTask"; @@ -23,6 +24,7 @@ interface ITsBuildInfo { semanticDiagnosticsPerFile?: any[]; options: any; }; + version: string; } export class TscTask extends LeafTask { @@ -103,6 +105,22 @@ export class TscTask extends LeafTask { this.traceTrigger(`new file detected ${[...configFileNames.values()].join(",")}`); return false; } + try { + const tsVersion = await getInstalledPackageVersion( + "typescript", + this.node.pkg.directory, + ); + + if (tsVersion !== tsBuildInfo.version) { + this.traceTrigger("previous build error"); + return false; + } + } catch (e) { + this.traceTrigger( + `Unable to get installed package version for typescript from ${this.node.pkg.directory}`, + ); + return false; + } // Check tsconfig.json return this.checkTsConfig(tsBuildInfoFileDirectory, tsBuildInfo, config); @@ -384,11 +402,16 @@ export abstract class TscDependentTask extends LeafWithDoneFileTask { config = await readFileAsync(this.configFileFullPath, "utf8"); } - return JSON.stringify({ tsBuildInfoFiles, config }); + return JSON.stringify({ + version: await this.getToolVersion(), + config, + tsBuildInfoFiles, + }); } catch (e) { this.traceExec(`error generating done file content ${e}`); return undefined; } } protected abstract get configFileFullPath(): string; + protected abstract getToolVersion(): Promise; } diff --git a/build-tools/packages/build-tools/src/fluidBuild/tasks/workers/tscWorker.ts b/build-tools/packages/build-tools/src/fluidBuild/tasks/workers/tscWorker.ts index 18d61d41df55..56c04843eb66 100644 --- a/build-tools/packages/build-tools/src/fluidBuild/tasks/workers/tscWorker.ts +++ b/build-tools/packages/build-tools/src/fluidBuild/tasks/workers/tscWorker.ts @@ -11,7 +11,6 @@ import type { WorkerExecResult, WorkerMessage } from "./worker"; export async function compile(msg: WorkerMessage): Promise { const { command, cwd } = msg; // Load the typescript version that is in the cwd scope - // Load the eslint version that is in the cwd scope const tsPath = require.resolve("typescript", { paths: [cwd] }); const ts: typeof tsLib = require(tsPath); From 3a7bfcb7b8b53cf1b53a6f42a5dba296e9e89495 Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Fri, 30 Jun 2023 10:36:57 -0700 Subject: [PATCH 10/10] [bump] build-tools: 0.20.0 => 0.21.0 (minor) (#16209) Bumped build-tools from 0.20.0 to 0.21.0. Commands used: ```shell flub release -g build-tools ``` --- build-tools/lerna.json | 2 +- build-tools/package.json | 2 +- build-tools/packages/build-cli/package.json | 2 +- build-tools/packages/build-tools/package.json | 2 +- build-tools/packages/bundle-size-tools/package.json | 2 +- build-tools/packages/readme-command/package.json | 2 +- build-tools/packages/version-tools/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build-tools/lerna.json b/build-tools/lerna.json index 23c501ed0ab6..19eeb20f6e01 100644 --- a/build-tools/lerna.json +++ b/build-tools/lerna.json @@ -1,5 +1,5 @@ { - "version": "0.20.0", + "version": "0.21.0", "npmClient": "pnpm", "useWorkspaces": true } diff --git a/build-tools/package.json b/build-tools/package.json index a445bbfca88b..482f3c8a777f 100644 --- a/build-tools/package.json +++ b/build-tools/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "0.20.0", + "version": "0.21.0", "private": true, "homepage": "https://fluidframework.com", "repository": { diff --git a/build-tools/packages/build-cli/package.json b/build-tools/packages/build-cli/package.json index ab38a5d3ab13..32d48fd4bc5a 100644 --- a/build-tools/packages/build-cli/package.json +++ b/build-tools/packages/build-cli/package.json @@ -1,6 +1,6 @@ { "name": "@fluid-tools/build-cli", - "version": "0.20.0", + "version": "0.21.0", "description": "Build tools for the Fluid Framework", "homepage": "https://fluidframework.com", "repository": { diff --git a/build-tools/packages/build-tools/package.json b/build-tools/packages/build-tools/package.json index 410a9e31bad7..c39cd210de7d 100644 --- a/build-tools/packages/build-tools/package.json +++ b/build-tools/packages/build-tools/package.json @@ -1,6 +1,6 @@ { "name": "@fluidframework/build-tools", - "version": "0.20.0", + "version": "0.21.0", "description": "Fluid Build tools", "homepage": "https://fluidframework.com", "repository": { diff --git a/build-tools/packages/bundle-size-tools/package.json b/build-tools/packages/bundle-size-tools/package.json index 4899ab4144fc..cf7921af5d25 100644 --- a/build-tools/packages/bundle-size-tools/package.json +++ b/build-tools/packages/bundle-size-tools/package.json @@ -1,6 +1,6 @@ { "name": "@fluidframework/bundle-size-tools", - "version": "0.20.0", + "version": "0.21.0", "description": "Utility for analyzing bundle size regressions", "homepage": "https://fluidframework.com", "repository": { diff --git a/build-tools/packages/readme-command/package.json b/build-tools/packages/readme-command/package.json index e04e9630e2e2..b90ca684a4a1 100644 --- a/build-tools/packages/readme-command/package.json +++ b/build-tools/packages/readme-command/package.json @@ -1,6 +1,6 @@ { "name": "@fluid-internal/readme-command", - "version": "0.20.0", + "version": "0.21.0", "private": true, "description": "CLI to generate readmes for Fluid build-tools", "homepage": "https://fluidframework.com", diff --git a/build-tools/packages/version-tools/package.json b/build-tools/packages/version-tools/package.json index 1435bbc31e30..e2dc149c29ec 100644 --- a/build-tools/packages/version-tools/package.json +++ b/build-tools/packages/version-tools/package.json @@ -1,6 +1,6 @@ { "name": "@fluid-tools/version-tools", - "version": "0.20.0", + "version": "0.21.0", "description": "Versioning tools for Fluid Framework", "homepage": "https://fluidframework.com", "repository": {