From 88caebd330d8b44221ba4b011398a9c8218d38b5 Mon Sep 17 00:00:00 2001 From: Rishhi Balakrishnan <107130183+RishhiB@users.noreply.github.com> Date: Mon, 6 Jan 2025 12:25:34 -0500 Subject: [PATCH] Prefix trivial issues when enabling no-unchecked-record-access for client packages (#23432) Prefix trivial issues when enabling no-unchecked-record-access for client packages [AB#25378](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/25378) --------- Co-authored-by: Abram Sanderson --- .../dds/attributable-map/src/mapKernel.ts | 2 +- packages/dds/map/src/directory.ts | 2 +- packages/dds/map/src/mapKernel.ts | 2 +- .../dds/map/src/test/mocha/directory.spec.ts | 20 +++++++++---------- .../dds/merge-tree/src/test/beastTest.spec.ts | 2 +- packages/dds/sequence/src/revertibles.ts | 12 +++++------ .../odsp-driver/src/WriteBufferUtils.ts | 6 +++--- .../odsp-driver/src/compactSnapshotParser.ts | 10 +++++----- .../src/odspDocumentStorageServiceBase.ts | 5 +++-- .../odsp-driver/src/odspDriverUrlResolver.ts | 2 +- .../src/test/createNewUtilsTests.spec.ts | 14 ++++++++----- .../src/test/getUrlAndHeadersWithAuth.spec.ts | 2 +- .../src/test/prefetchSnapshotTests.spec.ts | 8 ++++---- .../src/storageImplementations.ts | 4 ++-- .../src/documentService.ts | 6 +++--- .../src/documentServiceFactory.ts | 8 ++++---- .../test/summaryCompresssionTester.spec.ts | 6 +++--- .../src/test/containerRuntime.spec.ts | 5 +++-- .../src/test/gc/gcStats.spec.ts | 2 +- .../src/test/idCompressor.spec.ts | 5 ++--- .../src/test/summaryUtils.spec.ts | 10 +++++----- .../test/test-drivers/src/odspTestDriver.ts | 3 +-- .../src/routerliciousTestDriver.ts | 3 ++- .../test/test-service-load/src/FileLogger.ts | 2 +- .../data-visualization/DataVisualization.ts | 3 ++- .../graphs/DynamicComposedChart.tsx | 2 +- .../fetch-tool/src/fluidFetchSnapshot.ts | 6 ++---- 27 files changed, 78 insertions(+), 74 deletions(-) diff --git a/experimental/dds/attributable-map/src/mapKernel.ts b/experimental/dds/attributable-map/src/mapKernel.ts index 512ae72ceedb..4d95cfd61b37 100644 --- a/experimental/dds/attributable-map/src/mapKernel.ts +++ b/experimental/dds/attributable-map/src/mapKernel.ts @@ -216,7 +216,7 @@ export class AttributableMapKernel { return nextVal.done ? { value: undefined, done: true } : // Unpack the stored value - { value: [nextVal.value[0], nextVal.value[1].value], done: false }; + { value: [nextVal.value[0], nextVal.value[1]?.value], done: false }; }, [Symbol.iterator](): IterableIterator<[string, unknown]> { return this; diff --git a/packages/dds/map/src/directory.ts b/packages/dds/map/src/directory.ts index c867e3907db6..98a79eed4217 100644 --- a/packages/dds/map/src/directory.ts +++ b/packages/dds/map/src/directory.ts @@ -1607,7 +1607,7 @@ class SubDirectory extends TypedEventEmitter implements IDirec const nextVal = localEntriesIterator.next(); return nextVal.done ? { value: undefined, done: true } - : { value: [nextVal.value[0], nextVal.value[1].value], done: false }; + : { value: [nextVal.value[0], nextVal.value[1]?.value], done: false }; }, [Symbol.iterator](): IterableIterator<[string, unknown]> { return this; diff --git a/packages/dds/map/src/mapKernel.ts b/packages/dds/map/src/mapKernel.ts index f1f41f7c7d82..e3e183108a03 100644 --- a/packages/dds/map/src/mapKernel.ts +++ b/packages/dds/map/src/mapKernel.ts @@ -208,7 +208,7 @@ export class MapKernel { return nextVal.done ? { value: undefined, done: true } : // Unpack the stored value - { value: [nextVal.value[0], nextVal.value[1].value], done: false }; + { value: [nextVal.value[0], nextVal.value[1]?.value], done: false }; }, [Symbol.iterator](): IterableIterator<[string, unknown]> { return this; diff --git a/packages/dds/map/src/test/mocha/directory.spec.ts b/packages/dds/map/src/test/mocha/directory.spec.ts index 7b8d46a87b2f..86daac63b7be 100644 --- a/packages/dds/map/src/test/mocha/directory.spec.ts +++ b/packages/dds/map/src/test/mocha/directory.spec.ts @@ -104,12 +104,12 @@ function serialize(directory1: ISharedDirectory): string { assert.strictEqual(summaryObjectKeys.length, 1, "summary tree should only have one blob"); assert.strictEqual(summaryObjectKeys[0], "header", "summary should have a header blob"); assert.strictEqual( - summaryTree.tree.header.type, + summaryTree.tree.header?.type, SummaryType.Blob, "header is not of SummaryType.Blob", ); - const content = summaryTree.tree.header.content as string; + const content = summaryTree.tree.header?.content as string; return JSON.stringify((JSON.parse(content) as IDirectoryNewStorageFormat).content); } @@ -1725,15 +1725,15 @@ describe("Directory", () => { const fooSubDirIterator = fooSubDir.entries(); const fooSubDirResult1 = fooSubDirIterator.next(); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - assert.equal(fooSubDirResult1.value[0], "testKey"); + assert.equal(fooSubDirResult1.value?.[0], "testKey"); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - assert.equal(fooSubDirResult1.value[1], "testValue"); + assert.equal(fooSubDirResult1.value?.[1], "testValue"); assert.equal(fooSubDirResult1.done, false); const fooSubDirResult2 = fooSubDirIterator.next(); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - assert.equal(fooSubDirResult2.value[0], "testKey2"); + assert.equal(fooSubDirResult2.value?.[0], "testKey2"); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - assert.equal(fooSubDirResult2.value[1], "testValue2"); + assert.equal(fooSubDirResult2.value?.[1], "testValue2"); assert.equal(fooSubDirResult2.done, false); const fooSubDirResult3 = fooSubDirIterator.next(); assert.equal(fooSubDirResult3.value, undefined); @@ -1755,15 +1755,15 @@ describe("Directory", () => { const fooSubDir2Iterator = fooSubDir2.entries(); const fooSubDir2Result1 = fooSubDir2Iterator.next(); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - assert.equal(fooSubDir2Result1.value[0], "testKey"); + assert.equal(fooSubDir2Result1.value?.[0], "testKey"); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - assert.equal(fooSubDir2Result1.value[1], "testValue"); + assert.equal(fooSubDir2Result1.value?.[1], "testValue"); assert.equal(fooSubDir2Result1.done, false); const fooSubDir2Result2 = fooSubDir2Iterator.next(); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - assert.equal(fooSubDir2Result2.value[0], "testKey2"); + assert.equal(fooSubDir2Result2.value?.[0], "testKey2"); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - assert.equal(fooSubDir2Result2.value[1], "testValue2"); + assert.equal(fooSubDir2Result2.value?.[1], "testValue2"); assert.equal(fooSubDir2Result2.done, false); const fooSubDir2Result3 = fooSubDir2Iterator.next(); assert.equal(fooSubDir2Result3.value, undefined); diff --git a/packages/dds/merge-tree/src/test/beastTest.spec.ts b/packages/dds/merge-tree/src/test/beastTest.spec.ts index 79785684dfc7..191f5df31cdc 100644 --- a/packages/dds/merge-tree/src/test/beastTest.spec.ts +++ b/packages/dds/merge-tree/src/test/beastTest.spec.ts @@ -1432,7 +1432,7 @@ export class DocumentTree { }); this.pos++; } else { - const trid = docNode.name + this.ids[docNode.name].toString(); + const trid = docNode.name + this.ids[docNode.name]!.toString(); docNode.id = trid; id = this.ids[docNode.name]++; const props = { diff --git a/packages/dds/sequence/src/revertibles.ts b/packages/dds/sequence/src/revertibles.ts index 0b595a9141c7..b2ef1c68f2a1 100644 --- a/packages/dds/sequence/src/revertibles.ts +++ b/packages/dds/sequence/src/revertibles.ts @@ -340,7 +340,7 @@ export function appendSharedStringDeltaToRevertibles( revertible.intervals.push({ intervalId: interval.getIntervalId(), - label: interval.properties.referenceRangeLabels[0], + label: interval.properties.referenceRangeLabels?.[0], startOffset: offset, endOffset, }); @@ -350,7 +350,7 @@ export function appendSharedStringDeltaToRevertibles( endIntervals.forEach(({ interval, offset }) => { revertible.intervals.push({ intervalId: interval.getIntervalId(), - label: interval.properties.referenceRangeLabels[0], + label: interval.properties.referenceRangeLabels?.[0], endOffset: offset, }); }); @@ -432,7 +432,7 @@ function revertLocalAdd( revertible: TypedRevertible, ) { const id = getUpdatedIdFromInterval(revertible.interval); - const label = revertible.interval.properties.referenceRangeLabels[0]; + const label = revertible.interval.properties.referenceRangeLabels?.[0]; string.getIntervalCollection(label).removeIntervalById(id); } @@ -460,7 +460,7 @@ function revertLocalDelete( string: ISharedString, revertible: TypedRevertible, ) { - const label = revertible.interval.properties.referenceRangeLabels[0]; + const label = revertible.interval.properties.referenceRangeLabels?.[0]; const collection = string.getIntervalCollection(label); const start = string.localReferencePositionToPosition(revertible.start); const startSlidePos = getSlidePosition(string, revertible.start, start); @@ -499,7 +499,7 @@ function revertLocalChange( string: ISharedString, revertible: TypedRevertible, ) { - const label = revertible.interval.properties.referenceRangeLabels[0]; + const label = revertible.interval.properties.referenceRangeLabels?.[0]; const collection = string.getIntervalCollection(label); const id = getUpdatedIdFromInterval(revertible.interval); const start = string.localReferencePositionToPosition(revertible.start); @@ -539,7 +539,7 @@ function revertLocalPropertyChanged( string: ISharedString, revertible: TypedRevertible, ) { - const label = revertible.interval.properties.referenceRangeLabels[0]; + const label = revertible.interval.properties.referenceRangeLabels?.[0]; const id = getUpdatedIdFromInterval(revertible.interval); const newProps = revertible.propertyDeltas; string.getIntervalCollection(label).change(id, { props: newProps }); diff --git a/packages/drivers/odsp-driver/src/WriteBufferUtils.ts b/packages/drivers/odsp-driver/src/WriteBufferUtils.ts index c5e3c3883a21..09fcbf0f3fb0 100644 --- a/packages/drivers/odsp-driver/src/WriteBufferUtils.ts +++ b/packages/drivers/odsp-driver/src/WriteBufferUtils.ts @@ -32,7 +32,7 @@ export class WriteBuffer { let index = 0; const oldData = this.data; while (index < length) { - newData[index] = oldData[index]; + newData[index] = oldData[index]!; index++; } this.data = newData; @@ -233,8 +233,8 @@ function serializeNodeCore( for (const child of nodeCore.nodes) { if (child instanceof NodeCore) { // For a tree node start and end with set/list start and end marker codes. - const startCode = MarkerCodesStart[child.type]; - const endCode = MarkerCodesEnd[child.type]; + const startCode: MarkerCodesStart | undefined = MarkerCodesStart[child.type]; + const endCode: MarkerCodesEnd | undefined = MarkerCodesEnd[child.type]; assert(startCode !== undefined, 0x285 /* "Start code should not undefined" */); assert(endCode !== undefined, 0x286 /* "End code should not undefined" */); buffer.write(startCode); diff --git a/packages/drivers/odsp-driver/src/compactSnapshotParser.ts b/packages/drivers/odsp-driver/src/compactSnapshotParser.ts index 9bb774a90df0..113181ff2b98 100644 --- a/packages/drivers/odsp-driver/src/compactSnapshotParser.ts +++ b/packages/drivers/odsp-driver/src/compactSnapshotParser.ts @@ -72,7 +72,7 @@ function readBlobSection(node: NodeTypes): { const records = getNodeProps(blob); assertBlobCoreInstance(records.data, "data should be of BlobCore type"); const id = getStringInstance(records.id, "blob id should be string"); - blobContents.set(id, records.data.arrayBuffer); + blobContents.set(id, records.data?.arrayBuffer); } } return { blobContents, slowBlobStructureCount }; @@ -88,15 +88,15 @@ function readOpsSection(node: NodeTypes): ISequencedDocumentMessage[] { const records = getNodeProps(node); assertNumberInstance(records.firstSequenceNumber, "Seq number should be a number"); assertNodeCoreInstance(records.deltas, "Deltas should be a Node"); - for (let i = 0; i < records.deltas.length; ++i) { + for (let i = 0; i < records.deltas?.length; ++i) { // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - ops.push(JSON.parse(records.deltas.getString(i))); + ops.push(JSON.parse(records.deltas?.getString(i))); } // Due to a bug at service side, in an edge case service was serializing deltas even // when there are no ops. So just make the code resilient to that bug. Service has also // fixed that bug. assert( - ops.length === 0 || records.firstSequenceNumber.valueOf() === ops[0].sequenceNumber, + ops.length === 0 || records.firstSequenceNumber?.valueOf() === ops[0].sequenceNumber, 0x280 /* "Validate first op seq number" */, ); return ops; @@ -244,7 +244,7 @@ function readSnapshotSection(node: NodeTypes): { const { snapshotTree, slowTreeStructureCount, treeStructureCountWithGroupId } = readTreeSection(records.treeNodes); snapshotTree.id = getStringInstance(records.id, "snapshotId should be string"); - const sequenceNumber = records.sequenceNumber.valueOf(); + const sequenceNumber = records.sequenceNumber?.valueOf(); return { sequenceNumber, snapshotTree, diff --git a/packages/drivers/odsp-driver/src/odspDocumentStorageServiceBase.ts b/packages/drivers/odsp-driver/src/odspDocumentStorageServiceBase.ts index 39fdb72e3645..738a49092d99 100644 --- a/packages/drivers/odsp-driver/src/odspDocumentStorageServiceBase.ts +++ b/packages/drivers/odsp-driver/src/odspDocumentStorageServiceBase.ts @@ -257,8 +257,9 @@ export abstract class OdspDocumentStorageServiceBase implements IDocumentStorage protected combineProtocolAndAppSnapshotTree(snapshotTree: ISnapshotTree): ISnapshotTree { // When we upload the container snapshot, we upload appTree in ".app" and protocol tree in ".protocol" // So when we request the snapshot we get ".app" as tree and not as commit node as in the case just above. - const hierarchicalAppTree = snapshotTree.trees[".app"]; - const hierarchicalProtocolTree = snapshotTree.trees[".protocol"]; + const hierarchicalAppTree: ISnapshotTree | undefined = snapshotTree.trees[".app"]; + const hierarchicalProtocolTree: ISnapshotTree | undefined = + snapshotTree.trees[".protocol"]; const summarySnapshotTree: ISnapshotTree = { blobs: { ...hierarchicalAppTree.blobs, diff --git a/packages/drivers/odsp-driver/src/odspDriverUrlResolver.ts b/packages/drivers/odsp-driver/src/odspDriverUrlResolver.ts index 6392ffaf8ff9..3222e57606c2 100644 --- a/packages/drivers/odsp-driver/src/odspDriverUrlResolver.ts +++ b/packages/drivers/odsp-driver/src/odspDriverUrlResolver.ts @@ -108,7 +108,7 @@ export class OdspDriverUrlResolver implements IUrlResolver { const searchParams = new URLSearchParams(queryString); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access - const fileName: string = request.headers[DriverHeader.createNew].fileName; + const fileName: string = request.headers[DriverHeader.createNew]?.fileName; const driveID = searchParams.get("driveId"); const filePath = searchParams.get("path"); const packageName = searchParams.get("containerPackageName"); diff --git a/packages/drivers/odsp-driver/src/test/createNewUtilsTests.spec.ts b/packages/drivers/odsp-driver/src/test/createNewUtilsTests.spec.ts index 2dfed6c5e796..335db33bf581 100644 --- a/packages/drivers/odsp-driver/src/test/createNewUtilsTests.spec.ts +++ b/packages/drivers/odsp-driver/src/test/createNewUtilsTests.spec.ts @@ -7,7 +7,11 @@ import { strict as assert } from "node:assert"; import { bufferToString, fromBase64ToUtf8 } from "@fluid-internal/client-utils"; import { ISummaryTree, SummaryType } from "@fluidframework/driver-definitions"; -import { ISnapshot, IDocumentAttributes } from "@fluidframework/driver-definitions/internal"; +import { + ISnapshot, + IDocumentAttributes, + type ISnapshotTree, +} from "@fluidframework/driver-definitions/internal"; import { IFileEntry, IOdspResolvedUrl, @@ -139,18 +143,18 @@ describe("Create New Utils Tests", () => { ); assert.strictEqual(snapshot.blobContents.size, 2, "2 blobs should be there"); - const appTree = snapshotTree.trees[".app"]; - const protocolTree = snapshotTree.trees[".protocol"]; + const appTree: ISnapshotTree | undefined = snapshotTree.trees[".app"]; + const protocolTree: ISnapshotTree | undefined = snapshotTree.trees[".protocol"]; assert(appTree !== undefined, "App tree should be there"); assert(protocolTree !== undefined, "Protocol tree should be there"); - const appTreeBlobId = appTree.blobs.attributes; + const appTreeBlobId: string | undefined = appTree.blobs.attributes; const appTreeBlobValBuffer = snapshot.blobContents.get(appTreeBlobId); assert(appTreeBlobValBuffer !== undefined, "app blob value should exist"); const appTreeBlobVal = bufferToString(appTreeBlobValBuffer, "utf8"); assert(appTreeBlobVal === blobContent, "Blob content should match"); - const docAttributesBlobId = protocolTree.blobs.attributes; + const docAttributesBlobId: string | undefined = protocolTree.blobs.attributes; const docAttributesBuffer = snapshot.blobContents.get(docAttributesBlobId); assert(docAttributesBuffer !== undefined, "protocol attributes blob value should exist"); const docAttributesBlobValue = bufferToString(docAttributesBuffer, "utf8"); diff --git a/packages/drivers/odsp-driver/src/test/getUrlAndHeadersWithAuth.spec.ts b/packages/drivers/odsp-driver/src/test/getUrlAndHeadersWithAuth.spec.ts index 661cecb3b2d9..efb67adb25b8 100644 --- a/packages/drivers/odsp-driver/src/test/getUrlAndHeadersWithAuth.spec.ts +++ b/packages/drivers/odsp-driver/src/test/getUrlAndHeadersWithAuth.spec.ts @@ -24,7 +24,7 @@ describe("getHeadersWithAuth", () => { result: { [index: string]: string }, ): void => { assert.strictEqual( - result.Authorization.endsWith(token), + result.Authorization?.endsWith(token), true, "Returned header must contain token", ); diff --git a/packages/drivers/odsp-driver/src/test/prefetchSnapshotTests.spec.ts b/packages/drivers/odsp-driver/src/test/prefetchSnapshotTests.spec.ts index 051cd324accf..dea58cc7a1ef 100644 --- a/packages/drivers/odsp-driver/src/test/prefetchSnapshotTests.spec.ts +++ b/packages/drivers/odsp-driver/src/test/prefetchSnapshotTests.spec.ts @@ -626,9 +626,9 @@ describe("Tests for prefetching snapshot", () => { }; const odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId); const snapshotTreeWithGroupIdToCompare: ISnapshotTree = { - blobs: { ...snapshotTreeWithGroupId.trees[".app"].blobs }, + blobs: { ...snapshotTreeWithGroupId.trees[".app"]?.blobs }, trees: { - ...snapshotTreeWithGroupId.trees[".app"].trees, + ...snapshotTreeWithGroupId.trees[".app"]?.trees, ".protocol": snapshotTreeWithGroupId.trees[".protocol"], }, id: "SnapshotId", @@ -866,9 +866,9 @@ describe("Tests for prefetching snapshot", () => { }; const odspCompactSnapshotWithGroupId = convertToCompactSnapshot(snapshotWithGroupId); const snapshotTreeWithGroupIdToCompare: ISnapshotTree = { - blobs: { ...snapshotTreeWithGroupId.trees[".app"].blobs }, + blobs: { ...snapshotTreeWithGroupId.trees[".app"]?.blobs }, trees: { - ...snapshotTreeWithGroupId.trees[".app"].trees, + ...snapshotTreeWithGroupId.trees[".app"]?.trees, ".protocol": snapshotTreeWithGroupId.trees[".protocol"], }, id: "SnapshotId", diff --git a/packages/drivers/replay-driver/src/storageImplementations.ts b/packages/drivers/replay-driver/src/storageImplementations.ts index 63c8c02d4102..9ba488ee2b0a 100644 --- a/packages/drivers/replay-driver/src/storageImplementations.ts +++ b/packages/drivers/replay-driver/src/storageImplementations.ts @@ -80,9 +80,9 @@ export class FileSnapshotReader throw new Error(`Unknown version id: ${versionRequested}`); } - let snapshotTree = this.trees[versionRequested.id]; + let snapshotTree: ISnapshotTree | undefined = this.trees[versionRequested.id]; if (snapshotTree === undefined) { - const tree = this.commits[versionRequested.id]; + const tree: ITree | undefined = this.commits[versionRequested.id]; if (tree === undefined) { throw new Error(`Can't find version ${versionRequested.id}`); } diff --git a/packages/drivers/routerlicious-driver/src/documentService.ts b/packages/drivers/routerlicious-driver/src/documentService.ts index 71642c821f85..8cd7245f8f20 100644 --- a/packages/drivers/routerlicious-driver/src/documentService.ts +++ b/packages/drivers/routerlicious-driver/src/documentService.ts @@ -302,9 +302,9 @@ export class DocumentService } const fluidResolvedUrl = response.resolvedUrl; this._resolvedUrl = fluidResolvedUrl; - this.storageUrl = fluidResolvedUrl.endpoints.storageUrl; - this.ordererUrl = fluidResolvedUrl.endpoints.ordererUrl; - this.deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl; + this.storageUrl = fluidResolvedUrl.endpoints?.storageUrl; + this.ordererUrl = fluidResolvedUrl.endpoints?.ordererUrl; + this.deltaStorageUrl = fluidResolvedUrl.endpoints?.deltaStorageUrl; this.deltaStreamUrl = fluidResolvedUrl.endpoints.deltaStreamUrl ?? this.ordererUrl; return true; } diff --git a/packages/drivers/routerlicious-driver/src/documentServiceFactory.ts b/packages/drivers/routerlicious-driver/src/documentServiceFactory.ts index 0fb133dc4833..70f1492939e0 100644 --- a/packages/drivers/routerlicious-driver/src/documentServiceFactory.ts +++ b/packages/drivers/routerlicious-driver/src/documentServiceFactory.ts @@ -213,7 +213,7 @@ export class RouterliciousDocumentServiceFactory implements IDocumentServiceFact } parsedUrl.pathname = replaceDocumentIdInPath(parsedUrl.pathname, documentId); - const deltaStorageUrl = resolvedUrl.endpoints.deltaStorageUrl; + const deltaStorageUrl = resolvedUrl.endpoints?.deltaStorageUrl; if (!deltaStorageUrl) { throw new Error( `All endpoints urls must be provided. [deltaStorageUrl:${deltaStorageUrl}]`, @@ -303,9 +303,9 @@ export class RouterliciousDocumentServiceFactory implements IDocumentServiceFact }, ); - const storageUrl = fluidResolvedUrl.endpoints.storageUrl; - const ordererUrl = fluidResolvedUrl.endpoints.ordererUrl; - const deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl; + const storageUrl = fluidResolvedUrl.endpoints?.storageUrl; + const ordererUrl = fluidResolvedUrl.endpoints?.ordererUrl; + const deltaStorageUrl = fluidResolvedUrl.endpoints?.deltaStorageUrl; const deltaStreamUrl = fluidResolvedUrl.endpoints.deltaStreamUrl || ordererUrl; // backward compatibility if (!ordererUrl || !deltaStorageUrl) { throw new Error( diff --git a/packages/loader/driver-utils/src/test/summaryCompresssionTester.spec.ts b/packages/loader/driver-utils/src/test/summaryCompresssionTester.spec.ts index dd62b57e4094..f802dd7afbe1 100644 --- a/packages/loader/driver-utils/src/test/summaryCompresssionTester.spec.ts +++ b/packages/loader/driver-utils/src/test/summaryCompresssionTester.spec.ts @@ -69,7 +69,7 @@ function generateSummaryWithContent(contentSize: number) { ".channels" ] as ISummaryTree ).tree["7a99532d-94ec-43ac-8a53-d9f978ad4ae9"] as ISummaryTree - ).tree.header; + ).tree?.header; let contentString = ""; while (contentString.length < contentSize) { if (contentString.length + 10 > contentSize) { @@ -91,7 +91,7 @@ function generateSummaryWithBinaryContent(startsWith: number, contentSize: numbe ".channels" ] as ISummaryTree ).tree["7a99532d-94ec-43ac-8a53-d9f978ad4ae9"] as ISummaryTree - ).tree.header; + ).tree?.header; const content = new Uint8Array(contentSize); content[0] = startsWith; for (let i = 1; i < contentSize; i = i + 10) { @@ -621,7 +621,7 @@ function getHeaderContent(summary: ISummaryTree) { } function getHeader(summary: ISummaryTree) { - return getHeaderHolder(summary).tree.header; + return getHeaderHolder(summary).tree?.header; } function getHeaderHolder(summary: ISummaryTree) { diff --git a/packages/runtime/container-runtime/src/test/containerRuntime.spec.ts b/packages/runtime/container-runtime/src/test/containerRuntime.spec.ts index f195841000d6..0d0445cd8d4b 100644 --- a/packages/runtime/container-runtime/src/test/containerRuntime.spec.ts +++ b/packages/runtime/container-runtime/src/test/containerRuntime.spec.ts @@ -31,6 +31,7 @@ import { type FetchSource, type IDocumentAttributes, SummaryType, + type SummaryObject, } from "@fluidframework/driver-definitions/internal"; import { ISummaryTreeWithStats, @@ -2093,7 +2094,7 @@ describe("Runtime", () => { false, ); const { summary } = await containerRuntime.summarize({ fullTree: true }); - const blob = summary.tree[recentBatchInfoBlobName]; + const blob: SummaryObject | undefined = summary.tree[recentBatchInfoBlobName]; assert(blob.type === SummaryType.Blob, "Expected blob"); assert.equal(blob.content, '[[123,"batchId1"]]', "Expected single batchId mapping"); @@ -2423,7 +2424,7 @@ describe("Runtime", () => { ["missingDataStore"], ); assert.deepStrictEqual( - snapshotTree.trees[".channels"].trees.missingDataStore, + snapshotTree.trees[".channels"]?.trees.missingDataStore, snapshot.snapshotTree, "snapshot should be equal", ); 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 5c80af22601b..ec8b1b66741c 100644 --- a/packages/runtime/container-runtime/src/test/gc/gcStats.spec.ts +++ b/packages/runtime/container-runtime/src/test/gc/gcStats.spec.ts @@ -276,7 +276,7 @@ describe("Garbage Collection Stats", () => { ); // Add 2 new nodes and make one of them unreferenced. - defaultGCData.gcNodes["/"].push(nodes[4]); + defaultGCData.gcNodes["/"]?.push(nodes[4]); defaultGCData.gcNodes[nodes[4]] = []; defaultGCData.gcNodes[nodes[5]] = []; diff --git a/packages/runtime/id-compressor/src/test/idCompressor.spec.ts b/packages/runtime/id-compressor/src/test/idCompressor.spec.ts index 07f5356d6f0b..acc2e659efe3 100644 --- a/packages/runtime/id-compressor/src/test/idCompressor.spec.ts +++ b/packages/runtime/id-compressor/src/test/idCompressor.spec.ts @@ -1113,10 +1113,9 @@ describe("IdCompressor", () => { const compressor2 = network.getCompressor(client2); const ids = new Set(); const uuids = new Set(); - for (let i = 0; i < log1.length; i++) { - const data1 = log1[i]; + for (const [i, data1] of log1.entries()) { const id1 = compressor1.normalizeToOpSpace(data1.id); - const id2 = compressor2.normalizeToOpSpace(log2[i].id); + const id2 = compressor2.normalizeToOpSpace(log2[i]?.id); assert(isFinalId(id1)); ids.add(id1); assert.equal(id1, id2); diff --git a/packages/runtime/runtime-utils/src/test/summaryUtils.spec.ts b/packages/runtime/runtime-utils/src/test/summaryUtils.spec.ts index 17527dcdbd03..a6cc900b63f6 100644 --- a/packages/runtime/runtime-utils/src/test/summaryUtils.spec.ts +++ b/packages/runtime/runtime-utils/src/test/summaryUtils.spec.ts @@ -411,7 +411,7 @@ describe("Summary Utils", () => { const blobContent = "testBlobContent"; summaryTreeBuilder.addBlob("testBlob", blobContent); const summaryTree = summaryTreeBuilder.summary; - const blob = summaryTree.tree.testBlob; + const blob: SummaryObject | undefined = summaryTree.tree.testBlob; assert.strictEqual(blob.type, SummaryType.Blob); assert.strictEqual(blob.content, blobContent); }); @@ -432,7 +432,7 @@ describe("Summary Utils", () => { const handle = "testHandle"; summaryTreeBuilder.addHandle("testHandleKey", SummaryType.Tree, handle); const summaryTree = summaryTreeBuilder.summary; - const handleObject = summaryTree.tree.testHandleKey; + const handleObject: SummaryObject | undefined = summaryTree.tree.testHandleKey; assert.strictEqual(handleObject.type, SummaryType.Handle); assert.strictEqual(handleObject.handleType, SummaryType.Tree); assert.strictEqual(handleObject.handle, handle); @@ -453,7 +453,7 @@ describe("Summary Utils", () => { const attachmentId = "testAttachmentId"; summaryTreeBuilder.addAttachment(attachmentId); const summaryTree = summaryTreeBuilder.summary; - const attachment = summaryTree.tree["0"]; + const attachment: SummaryObject | undefined = summaryTree.tree["0"]; assert.strictEqual(attachment.type, SummaryType.Attachment); assert.strictEqual(attachment.id, attachmentId); }); @@ -473,7 +473,7 @@ describe("Summary Utils", () => { }; summaryTreeBuilder.addWithStats("testKey", summarizeResult); const summaryTree = summaryTreeBuilder.summary; - const subTree = summaryTree.tree.testKey; + const subTree: SummaryObject | undefined = summaryTree.tree.testKey; assert.strictEqual(subTree.type, SummaryType.Tree); const stats = summaryTreeBuilder.stats; assert.strictEqual(stats.blobNodeCount, 1); @@ -491,7 +491,7 @@ describe("Summary Utils", () => { const stats = summaryTreeWithStats.stats; assert.strictEqual(stats.blobNodeCount, 1); assert.strictEqual(stats.totalBlobSize, blobContent.length); - assert.strictEqual(summaryTree.tree.testBlob.type, SummaryType.Blob); + assert.strictEqual(summaryTree.tree.testBlob?.type, SummaryType.Blob); }); }); }); diff --git a/packages/test/test-drivers/src/odspTestDriver.ts b/packages/test/test-drivers/src/odspTestDriver.ts index 3e53ca3a0e6d..ac08cd4cfd3d 100644 --- a/packages/test/test-drivers/src/odspTestDriver.ts +++ b/packages/test/test-drivers/src/odspTestDriver.ts @@ -100,9 +100,8 @@ export function getOdspCredentials( const tenants: LoginTenants = JSON.parse(loginTenants); const tenantNames = Object.keys(tenants); const tenant = tenantNames[tenantIndex % tenantNames.length]; - const tenantInfo = tenants[tenant]; // Translate all the user from that user to the full user principle name by appending the tenant domain - const range = tenantInfo.range; + const range = tenants[tenant]?.range; // Return the set of account to choose from a single tenant for (let i = 0; i < range.count; i++) { diff --git a/packages/test/test-drivers/src/routerliciousTestDriver.ts b/packages/test/test-drivers/src/routerliciousTestDriver.ts index 5136522289de..9aab0f4916af 100644 --- a/packages/test/test-drivers/src/routerliciousTestDriver.ts +++ b/packages/test/test-drivers/src/routerliciousTestDriver.ts @@ -87,7 +87,8 @@ function getLegacyConfigFromEnv() { } function getEndpointConfigFromEnv(r11sEndpointName: RouterliciousEndpoint) { - const configStr = process.env[`fluid__test__driver__${r11sEndpointName}`]; + const configStr: string | undefined = + process.env[`fluid__test__driver__${r11sEndpointName}`]; if (r11sEndpointName === "docker") { const dockerDriverPolicies = configStr === undefined ? configStr : JSON.parse(configStr).driverPolicies; diff --git a/packages/test/test-service-load/src/FileLogger.ts b/packages/test/test-service-load/src/FileLogger.ts index 5050a6f7c85b..b015f3e8ef84 100644 --- a/packages/test/test-service-load/src/FileLogger.ts +++ b/packages/test/test-service-load/src/FileLogger.ts @@ -89,7 +89,7 @@ class FileLogger implements ITelemetryBufferedLogger { event.category = event.testCategoryOverride; } else if ( typeof event.message === "string" && - event.message.includes("FaultInjectionNack") + event.message?.includes("FaultInjectionNack") ) { event.category = "generic"; } diff --git a/packages/tools/devtools/devtools-core/src/data-visualization/DataVisualization.ts b/packages/tools/devtools/devtools-core/src/data-visualization/DataVisualization.ts index 9d425a008a3c..01670ad64af9 100644 --- a/packages/tools/devtools/devtools-core/src/data-visualization/DataVisualization.ts +++ b/packages/tools/devtools/devtools-core/src/data-visualization/DataVisualization.ts @@ -263,7 +263,8 @@ export class DataVisualizerGraph this.visualizers[sharedObject.attributes.type] ?? visualizeUnknownSharedObject; // Create visualizer node for the shared object - const editorFunction = this.editors[sharedObject.attributes.type]; + const editorFunction: EditSharedObject | undefined = + this.editors[sharedObject.attributes.type]; const visualizerNode = new VisualizerNode( sharedObject, diff --git a/packages/tools/devtools/devtools-view/src/components/graphs/DynamicComposedChart.tsx b/packages/tools/devtools/devtools-view/src/components/graphs/DynamicComposedChart.tsx index 10adcfa87645..9b00b58cc79b 100644 --- a/packages/tools/devtools/devtools-view/src/components/graphs/DynamicComposedChart.tsx +++ b/packages/tools/devtools/devtools-view/src/components/graphs/DynamicComposedChart.tsx @@ -62,7 +62,7 @@ const mergeDataSets = (dataSets: GraphDataSet[]): DataPoint[] => { for (const dataSet of dataSets) { const { yAxisDataKey, xAxisDataKey, uuid } = dataSet.schema; for (const dataPoint of dataSet.data) { - const xAxisDataPoint = dataPoint[xAxisDataKey]; + const xAxisDataPoint: string | number | undefined = dataPoint[xAxisDataKey]; xAxisDataPointToYAxisDataPointMap[xAxisDataPoint] = { ...xAxisDataPointToYAxisDataPointMap[xAxisDataPoint], [uuid]: dataPoint[yAxisDataKey], diff --git a/packages/tools/fetch-tool/src/fluidFetchSnapshot.ts b/packages/tools/fetch-tool/src/fluidFetchSnapshot.ts index 08a6d0aa7ce4..430852de1cee 100644 --- a/packages/tools/fetch-tool/src/fluidFetchSnapshot.ts +++ b/packages/tools/fetch-tool/src/fluidFetchSnapshot.ts @@ -68,9 +68,8 @@ function fetchBlobs( blobIdMap: Map, ) { const result: IFetchedBlob[] = []; - for (const item of Object.keys(tree.blobs)) { + for (const [item, blobId] of Object.entries(tree.blobs)) { const treePath = `${prefix}${item}`; - const blobId = tree.blobs[item]; if (blobId !== null) { let reused = true; let blob = blobCachePrevious.get(blobId); @@ -134,8 +133,7 @@ async function fetchBlobsFromSnapshotTree( const blobIdMap = parentBlobIdMap ?? new Map(); let result: IFetchedData[] = fetchBlobs(prefix, tree, storage, blobIdMap); - for (const subtreeId of Object.keys(tree.trees)) { - const subtree = tree.trees[subtreeId]; + for (const [subtreeId, subtree] of Object.entries(tree.trees)) { const dataStoreBlobs = await fetchBlobsFromSnapshotTree( storage, subtree,