From fc576f78458201f6331089a924c655b667645ef7 Mon Sep 17 00:00:00 2001 From: Graham Langford Date: Tue, 24 Sep 2024 12:56:24 -0500 Subject: [PATCH 1/3] removes no-unnecessary-type-assertion eslint disables that are not necessary post-strictNullChecks --- src/analysis/analysisSlice.ts | 6 ++---- src/analysis/analysisVisitors/varAnalysis/varAnalysis.ts | 4 ++-- src/background/auth/codeGrantFlow.ts | 7 +++---- src/background/auth/implicitGrantFlow.ts | 4 ++-- src/contrib/google/sheets/core/useSpreadsheetId.ts | 3 +-- src/integrations/store/integrationsSlice.ts | 3 +-- src/utils/extensionUtils.ts | 6 ++---- src/utils/parseDomTable.ts | 3 +-- src/vendors/reactPerformanceTesting/getPatchedComponent.ts | 2 +- 9 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/analysis/analysisSlice.ts b/src/analysis/analysisSlice.ts index 10d55e7fbc..3760d96510 100644 --- a/src/analysis/analysisSlice.ts +++ b/src/analysis/analysisSlice.ts @@ -65,17 +65,15 @@ const analysisSlice = createSlice({ // Clear out any existing annotations for this analysis. if (state.extensionAnnotations[modComponentId]) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- validated by if check state.extensionAnnotations[modComponentId] = state.extensionAnnotations[ modComponentId - ]!.filter((x) => x.analysisId !== analysisId); + ].filter((x) => x.analysisId !== analysisId); } else { state.extensionAnnotations[modComponentId] = []; } state.extensionAnnotations[modComponentId] = [ - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- validated above - ...state.extensionAnnotations[modComponentId]!, + ...state.extensionAnnotations[modComponentId], ...annotations, ]; }, diff --git a/src/analysis/analysisVisitors/varAnalysis/varAnalysis.ts b/src/analysis/analysisVisitors/varAnalysis/varAnalysis.ts index 7bc8f95b45..c3fc6db9ed 100644 --- a/src/analysis/analysisVisitors/varAnalysis/varAnalysis.ts +++ b/src/analysis/analysisVisitors/varAnalysis/varAnalysis.ts @@ -437,8 +437,8 @@ class VarAnalysis extends PipelineExpressionVisitor implements Analysis { // Be defensive if getOutputSchema errors due to nested variables, etc. try { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- wrapped in try/catch - return block!.getOutputSchema!(blockConfig) ?? {}; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- wrapped in try/catch + return block.getOutputSchema!(blockConfig) ?? {}; } catch { // NOP } diff --git a/src/background/auth/codeGrantFlow.ts b/src/background/auth/codeGrantFlow.ts index 4e40874fbe..fa7b6acb72 100644 --- a/src/background/auth/codeGrantFlow.ts +++ b/src/background/auth/codeGrantFlow.ts @@ -179,14 +179,13 @@ async function codeGrantFlow( } const json = Object.fromEntries(parsed.entries()); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- TODO: Fix IntegrationConfig types - await setCachedAuthData(integrationConfig.id!, json); + + await setCachedAuthData(integrationConfig.id, json); return json as AuthData; } if (typeof data === "object") { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- TODO: Fix IntegrationConfig types - await setCachedAuthData(integrationConfig.id!, data); + await setCachedAuthData(integrationConfig.id, data); return data as AuthData; } diff --git a/src/background/auth/implicitGrantFlow.ts b/src/background/auth/implicitGrantFlow.ts index faf1449d80..fe64797987 100644 --- a/src/background/auth/implicitGrantFlow.ts +++ b/src/background/auth/implicitGrantFlow.ts @@ -98,8 +98,8 @@ async function implicitGrantFlow( } const data: AuthData = { access_token, ...rest } as unknown as AuthData; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- TODO: Fix IntegrationConfig types - await setCachedAuthData(auth.id!, data); + + await setCachedAuthData(auth.id, data); return data; } diff --git a/src/contrib/google/sheets/core/useSpreadsheetId.ts b/src/contrib/google/sheets/core/useSpreadsheetId.ts index f0973fd876..55c18800b9 100644 --- a/src/contrib/google/sheets/core/useSpreadsheetId.ts +++ b/src/contrib/google/sheets/core/useSpreadsheetId.ts @@ -96,8 +96,7 @@ async function findSpreadsheetIdFromFieldValue( const sanitizedIntegrationConfig = await integrationConfigLocator.findSanitizedIntegrationConfig( integrationId, - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion,@typescript-eslint/no-non-null-assertion -- just checked above - configId!, + configId, ); const configSpreadsheetId = sanitizedIntegrationConfig.config?.spreadsheetId; diff --git a/src/integrations/store/integrationsSlice.ts b/src/integrations/store/integrationsSlice.ts index 1d1a4e9ed8..eabac663cb 100644 --- a/src/integrations/store/integrationsSlice.ts +++ b/src/integrations/store/integrationsSlice.ts @@ -55,8 +55,7 @@ const integrationsSlice = createSlice({ state, { payload: integrationConfig }: PayloadAction, ) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- The ID is always provided in this operation - state.configured[integrationConfig.id!] = integrationConfig; + state.configured[integrationConfig.id] = integrationConfig; }, }, extraReducers(builder) { diff --git a/src/utils/extensionUtils.ts b/src/utils/extensionUtils.ts index d1e00ca83e..688568d071 100644 --- a/src/utils/extensionUtils.ts +++ b/src/utils/extensionUtils.ts @@ -116,10 +116,8 @@ export async function getTabsWithAccess(): Promise< }); return ( tabs - /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- - The type isn't tight enough for tabs.query() */ - .filter((tab) => isScriptableUrl(tab.url!)) - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- same as above + .filter((tab) => isScriptableUrl(tab.url)) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- The type isn't tight enough for tabs.query() .map((tab) => ({ tabId: tab.id!, url: tab.url! })) ); } diff --git a/src/utils/parseDomTable.ts b/src/utils/parseDomTable.ts index 105151e652..f29910f5fa 100644 --- a/src/utils/parseDomTable.ts +++ b/src/utils/parseDomTable.ts @@ -87,8 +87,7 @@ function flattenTableContent(table: HTMLTableElement): RawTableContent { const row = rowIndex + rowSpanIndex; const col = cellIndex + colSpanIndex; flattened[row] ??= []; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- It was just created - flattened[row]![col] = { + flattened[row][col] = { type: tagName === "TH" ? "header" : "value", value: textContent.trim(), }; diff --git a/src/vendors/reactPerformanceTesting/getPatchedComponent.ts b/src/vendors/reactPerformanceTesting/getPatchedComponent.ts index 093e3fa29f..cbd91401a8 100644 --- a/src/vendors/reactPerformanceTesting/getPatchedComponent.ts +++ b/src/vendors/reactPerformanceTesting/getPatchedComponent.ts @@ -45,7 +45,7 @@ const updateRenderCount = ( if (Array.isArray(field)) { const formattedIndex = index === -1 ? 0 : index; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion -- index check above + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- index check above field[formattedIndex]!.value += 1; return; } From 3741e3b2a6b91469fc4808d4472748ba0e7c4c22 Mon Sep 17 00:00:00 2001 From: Graham Langford Date: Tue, 24 Sep 2024 13:00:30 -0500 Subject: [PATCH 2/3] remove the test file disabling of no-unnecessary-type-assertion --- .eslintrc.js | 1 - 1 file changed, 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index cdeb60cf7c..628b8ab41d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -327,7 +327,6 @@ module.exports = { { files: ["**/*.test.ts?(x)", "**/*.spec.ts"], rules: { - "@typescript-eslint/no-unnecessary-type-assertion": "off", "@typescript-eslint/no-non-null-assertion": "off", }, }, From 571a7a0357ffb3c7d9205d75a6c724f6c69b1318 Mon Sep 17 00:00:00 2001 From: Graham Langford Date: Tue, 24 Sep 2024 15:37:09 -0500 Subject: [PATCH 3/3] fixed more unnecessary assertions --- .../varAnalysis/varAnalysis.test.ts | 4 ++-- .../launchAuthIntegration.test.ts | 2 +- src/background/modUpdater.test.ts | 4 ++-- .../pages/mods/ModsPageActions.test.tsx | 2 +- src/pageEditor/panes/save/saveHelpers.test.ts | 14 +++++++------- src/store/editorMigrations.test.ts | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/analysis/analysisVisitors/varAnalysis/varAnalysis.test.ts b/src/analysis/analysisVisitors/varAnalysis/varAnalysis.test.ts index d3fcfa7443..4d94b571ac 100644 --- a/src/analysis/analysisVisitors/varAnalysis/varAnalysis.test.ts +++ b/src/analysis/analysisVisitors/varAnalysis/varAnalysis.test.ts @@ -777,7 +777,7 @@ describe("Collecting available vars", () => { analysis .getKnownVars() .get(blockPath)! - .isVariableDefined("@ifOutput")!, + .isVariableDefined("@ifOutput"), ).toBeFalse(); }, ); @@ -1114,7 +1114,7 @@ describe("Collecting available vars", () => { "modComponent.brickPipeline.0.config.body.__value__.0", "modComponent.brickPipeline.0.config.body.__value__.1", ])("source of the @element key if the For-Each block (%s)", (blockPath) => { - const blockVars = analysis.getKnownVars()!.get(blockPath)!.getMap(); + const blockVars = analysis.getKnownVars().get(blockPath)!.getMap(); const expectedForEachBlockPath = "modComponent.brickPipeline.0"; diff --git a/src/background/auth/partnerIntegrations/launchAuthIntegration.test.ts b/src/background/auth/partnerIntegrations/launchAuthIntegration.test.ts index 251cd2d3b1..e490f7f43b 100644 --- a/src/background/auth/partnerIntegrations/launchAuthIntegration.test.ts +++ b/src/background/auth/partnerIntegrations/launchAuthIntegration.test.ts @@ -33,7 +33,7 @@ import { API_PATHS } from "@/data/service/urlPaths"; jest.mock("@/integrations/util/readRawConfigurations"); const readRawConfigurationsMock = jest.mocked(readRawConfigurations); -const integrationMetaData = oauth2IntegrationDefinition!.metadata as Metadata; +const integrationMetaData = oauth2IntegrationDefinition.metadata as Metadata; const integrationId = validateRegistryId(integrationMetaData.id); jest.mocked(registry.find).mockResolvedValue({ diff --git a/src/background/modUpdater.test.ts b/src/background/modUpdater.test.ts index cb62e5c3d2..1622b45790 100644 --- a/src/background/modUpdater.test.ts +++ b/src/background/modUpdater.test.ts @@ -170,8 +170,8 @@ describe("getActivatedMarketplaceModVersions function", () => { expect(result).toEqual([ { - name: onePublicActivatedMod!._recipe!.id, - version: onePublicActivatedMod!._recipe!.version, + name: onePublicActivatedMod._recipe!.id, + version: onePublicActivatedMod._recipe!.version, }, ]); expect(reportError).toHaveBeenCalled(); diff --git a/src/extensionConsole/pages/mods/ModsPageActions.test.tsx b/src/extensionConsole/pages/mods/ModsPageActions.test.tsx index f98621f0cf..dced241c73 100644 --- a/src/extensionConsole/pages/mods/ModsPageActions.test.tsx +++ b/src/extensionConsole/pages/mods/ModsPageActions.test.tsx @@ -143,7 +143,7 @@ describe("ModsPageActions", () => { // Expect to find a link on the page with text "View Mod Details", an anchor element with role="menuitem" const viewDetailsLink = screen.getByRole("menuitem", { name: "View Mod Details", - }) as HTMLAnchorElement; + }); expect(viewDetailsLink).toBeInTheDocument(); }); diff --git a/src/pageEditor/panes/save/saveHelpers.test.ts b/src/pageEditor/panes/save/saveHelpers.test.ts index 85af44cac0..fc90f9a39e 100644 --- a/src/pageEditor/panes/save/saveHelpers.test.ts +++ b/src/pageEditor/panes/save/saveHelpers.test.ts @@ -101,7 +101,7 @@ describe("replaceModComponent round trip", () => { test("single mod component with versioned starter brick", async () => { const starterBrick = starterBrickDefinitionFactory(); const modDefinition = modDefinitionWithVersionedStarterBrickFactory({ - extensionPointId: starterBrick.metadata!.id!, + extensionPointId: starterBrick.metadata!.id, })(); const state = modComponentSlice.reducer( @@ -144,7 +144,7 @@ describe("replaceModComponent round trip", () => { const starterBrick = starterBrickDefinitionFactory(); const modDefinition = modDefinitionWithVersionedStarterBrickFactory({ - extensionPointId: starterBrick.metadata!.id!, + extensionPointId: starterBrick.metadata!.id, })(); modDefinition.extensionPoints.push({ @@ -404,7 +404,7 @@ describe("replaceModComponent round trip", () => { apiVersion: "v2", }); - const starterBrickId = starterBrick.metadata!.id!; + const starterBrickId = starterBrick.metadata!.id; const modDefinition = innerStarterBrickModDefinitionFactory({ extensionPointRef: starterBrickId as any, })({ @@ -444,7 +444,7 @@ describe("replaceModComponent round trip", () => { produce(modDefinition, (draft) => { draft.apiVersion = "v3"; castDraft(draft.metadata).id = newId; - draft.definitions![starterBrick.metadata!.id!]!.apiVersion = "v3"; + draft.definitions![starterBrick.metadata!.id]!.apiVersion = "v3"; draft.extensionPoints[0]!.label = "New Label"; // `variableDefinition` is required on mod component form state, so it gets populated on the mod definition @@ -456,12 +456,12 @@ describe("replaceModComponent round trip", () => { test("throws when API version mismatch and cannot update mod", async () => { const starterBrick = starterBrickDefinitionFactory(); const modDefinition = modDefinitionWithVersionedStarterBrickFactory({ - extensionPointId: starterBrick.metadata!.id!, + extensionPointId: starterBrick.metadata!.id, })({ apiVersion: "v2", extensionPoints: [ modComponentDefinitionFactory({ - id: starterBrick.metadata!.id!, + id: starterBrick.metadata!.id, }), modComponentDefinitionFactory(), ], @@ -797,7 +797,7 @@ describe("buildNewMod", () => { integrationDependencies: [ integrationDependencyFactory({ integrationId, outputKey }), ], - extensionPointId: starterBrick.metadata!.id!, + extensionPointId: starterBrick.metadata!.id, }) as SerializedModComponent; const { fromModComponent } = adapter(starterBrick.definition.type); diff --git a/src/store/editorMigrations.test.ts b/src/store/editorMigrations.test.ts index ca1ee3ed11..591a118f48 100644 --- a/src/store/editorMigrations.test.ts +++ b/src/store/editorMigrations.test.ts @@ -659,7 +659,7 @@ describe("editor state migrations", () => { initial.brickPipelineUIStateById[componentId] = makeInitialBrickPipelineUIState(); - initial.brickPipelineUIStateById[componentId]!.nodeUIStates[ + initial.brickPipelineUIStateById[componentId].nodeUIStates[ FOUNDATION_NODE_ID ]!.dataPanel = { // Exact shape doesn't matter here. Just testing that the migration resets the state