diff --git a/eslintrc.base.js b/eslintrc.base.js index 7e581e94b02..6afecef0334 100644 --- a/eslintrc.base.js +++ b/eslintrc.base.js @@ -10,17 +10,18 @@ module.exports = { 'eslint:recommended', 'plugin:react/recommended', 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'plugin:@typescript-eslint/recommended-type-checked', // v8: renamed from recommended-requiring-type-checking 'plugin:security/recommended', ], parser: '@typescript-eslint/parser', parserOptions: { sourceType: 'module', // Allows for the use of imports - project: './tsconfig.json', + projectService: true, // v8: replaces 'project' option + tsconfigRootDir: __dirname, // v8: required for projectService ecmaFeatures: { jsx: true, }, - ecmaVersion: 8, + ecmaVersion: 2020, // v8: updated from 8 to 2020 }, plugins: ['react', '@typescript-eslint', 'security', 'import'], settings: { @@ -64,12 +65,16 @@ module.exports = { '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/ban-types': 'off', + // v8: ban-types removed, replaced with more specific rules (all off to maintain current behavior) + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-unsafe-function-type': 'off', + '@typescript-eslint/no-wrapper-object-types': 'off', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-empty-function': 'off', - '@typescript-eslint/no-empty-interface': 'off', + // v8: no-empty-interface replaced with no-empty-object-type (already off above) '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-var-requires': 'off', + // v8: no-var-requires replaced with no-require-imports + '@typescript-eslint/no-require-imports': 'off', '@typescript-eslint/no-inferrable-types': 'off', '@typescript-eslint/no-unsafe-argument': 'off', '@typescript-eslint/no-unsafe-assignment': 'off', @@ -85,6 +90,8 @@ module.exports = { '@typescript-eslint/no-implied-eval': 'off', '@typescript-eslint/prefer-regexp-exec': 'off', '@typescript-eslint/await-thenable': 'off', + // v8: Temporarily disabled due to potential issues during migration + '@typescript-eslint/no-duplicate-enum-values': 'off', 'react/prop-types': 'off', 'react/display-name': 'off', 'react/no-unescaped-entities': 'off', @@ -93,6 +100,11 @@ module.exports = { 'no-prototype-builtins': 'off', }, overrides: [ + { + // Disable type-checked rules for JS files not in tsconfig + files: ['*.js', '*.mjs', '*.cjs'], + extends: ['plugin:@typescript-eslint/disable-type-checked'], + }, { files: ['src/tests/**/*', 'tools/**/*', 'pipeline/**/*', 'deploy/**/*', 'Gruntfile.js'], rules: { diff --git a/package.json b/package.json index a3ae7ff190d..241cd4ac962 100644 --- a/package.json +++ b/package.json @@ -95,8 +95,8 @@ "@types/ua-parser-js": "^0.7.39", "@types/uuid": "^9.0.7", "@types/webextension-polyfill": "^0.10.7", - "@typescript-eslint/eslint-plugin": "^5.61.0", - "@typescript-eslint/parser": "^6.18.1", + "@typescript-eslint/eslint-plugin": "^8.46.2", + "@typescript-eslint/parser": "^8.46.2", "case-sensitive-paths-webpack-plugin": "^2.4.0", "codecov": "^3.8.3", "commander": "^11.1.0", diff --git a/src/DetailsView/components/left-nav/get-left-nav-selected-key.ts b/src/DetailsView/components/left-nav/get-left-nav-selected-key.ts index b3aade534be..208dfd83fdf 100644 --- a/src/DetailsView/components/left-nav/get-left-nav-selected-key.ts +++ b/src/DetailsView/components/left-nav/get-left-nav-selected-key.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import { AssessmentsProvider } from 'assessments/types/assessments-provider'; -import { GettingStarted, RequirementName } from 'common/types/store-data/assessment-result-data'; +import { RequirementName } from 'common/types/store-data/assessment-result-data'; import { FeatureFlagStoreData } from 'common/types/store-data/feature-flag-store-data'; import { assessmentTestKeyGenerator } from 'DetailsView/components/left-nav/left-nav-link-builder'; import { VisualizationType } from '../../../common/types/visualization-type'; @@ -15,7 +15,7 @@ export type GetLeftNavSelectedKeyProps = { visualizationType: VisualizationType; assessmentsProvider: AssessmentsProvider; featureFlagStoreData: FeatureFlagStoreData; - selectedSubview: RequirementName | GettingStarted; + selectedSubview: RequirementName; // GettingStarted is redundant as RequirementName is string }; export function getOverviewKey(): string { diff --git a/src/DetailsView/components/tab-stops/tab-stops-choice-group.tsx b/src/DetailsView/components/tab-stops/tab-stops-choice-group.tsx index e365bec3fc4..f088c1fd5c0 100644 --- a/src/DetailsView/components/tab-stops/tab-stops-choice-group.tsx +++ b/src/DetailsView/components/tab-stops/tab-stops-choice-group.tsx @@ -49,7 +49,7 @@ export class TabStopsChoiceGroup extends React.Component { const currentInstance: AssessmentJsonExportFailureInstance = {}; instance.props.forEach(prop => { - const propValueStr = prop.value?.toString() ?? ''; + const propValueStr = + typeof prop.value === 'string' || typeof prop.value === 'number' + ? String(prop.value) + : prop.value + ? JSON.stringify(prop.value) + : ''; if (prop.key === 'Comment') { currentInstance.comment = propValueStr; } else if (prop.key === 'Path') { diff --git a/src/reports/components/report-sections/report-section-factory.tsx b/src/reports/components/report-sections/report-section-factory.tsx index 12cdde2f0c1..d7a621a79a9 100644 --- a/src/reports/components/report-sections/report-section-factory.tsx +++ b/src/reports/components/report-sections/report-section-factory.tsx @@ -16,10 +16,7 @@ import { IncompleteChecksSectionDeps } from './incomplete-checks-section'; import { NotApplicableChecksSectionDeps } from './not-applicable-checks-section'; import { PassedChecksSectionDeps } from './passed-checks-section'; -export type SectionDeps = NotApplicableChecksSectionDeps & - CommonInstancesSectionDeps & - PassedChecksSectionDeps & - IncompleteChecksSectionDeps; +export type SectionDeps = NotApplicableChecksSectionDeps & CommonInstancesSectionDeps; export type SectionProps = { deps: SectionDeps; diff --git a/src/tests/common/typemoq-snapshot-serializer.ts b/src/tests/common/typemoq-snapshot-serializer.ts index f64ed49476f..fa2f23514c4 100644 --- a/src/tests/common/typemoq-snapshot-serializer.ts +++ b/src/tests/common/typemoq-snapshot-serializer.ts @@ -17,7 +17,7 @@ const typemoqProxyIdValue = 'BCDF5CE5-F0DF-40B7-8BA0-69DF395033C8'; function readingPropertyThrowsMockException(val: Function): boolean { try { - val['___any_property']; + void val['___any_property']; } catch (e: any) { if (e instanceof MockException) { return true; diff --git a/src/tests/end-to-end/tests/details-view/overview.test.ts b/src/tests/end-to-end/tests/details-view/overview.test.ts index 0944fb7d7df..f3532d6e81a 100644 --- a/src/tests/end-to-end/tests/details-view/overview.test.ts +++ b/src/tests/end-to-end/tests/details-view/overview.test.ts @@ -138,10 +138,9 @@ describe('Details View -> Overview Page', () => { it.each([true, false])( 'should show correct number of items in export dropdown menu with codepen feature flag = %s', async codepenFlag => { - codepenFlag + void (codepenFlag ? await backgroundContext.enableFeatureFlag('exportReportOptions') - : await backgroundContext.disableFeatureFlag('exportReportOptions'); - + : await backgroundContext.disableFeatureFlag('exportReportOptions')); await overviewPage.openExportDropdown(); const items = (await overviewPage.countMenuItems()).valueOf(); await overviewPage.closeExportDialog(); diff --git a/src/tests/end-to-end/tests/popup/hamburger-menu.test.ts b/src/tests/end-to-end/tests/popup/hamburger-menu.test.ts index f19a74504db..e7c08cc7ef6 100644 --- a/src/tests/end-to-end/tests/popup/hamburger-menu.test.ts +++ b/src/tests/end-to-end/tests/popup/hamburger-menu.test.ts @@ -28,9 +28,9 @@ describe('Popup -> Hamburger menu', () => { 'should have content matching snapshot when quickAssess feature flag is %s', async quickAssessFeatureFlag => { const backgroundContext = await browser.background(); - quickAssessFeatureFlag === true + void (quickAssessFeatureFlag === true ? await backgroundContext.enableFeatureFlag('quickAssess') - : await backgroundContext.disableFeatureFlag('quickAssess'); + : await backgroundContext.disableFeatureFlag('quickAssess')); const button = await popupPage.getSelectorElement( popupPageElementIdentifiers.hamburgerMenuButton, ); @@ -57,9 +57,9 @@ describe('Popup -> Hamburger menu', () => { async ({ highContrastMode, quickAssessFeatureFlag }) => { await browser.setHighContrastMode(highContrastMode); const backgroundContext = await browser.background(); - quickAssessFeatureFlag === true + void (quickAssessFeatureFlag === true ? await backgroundContext.enableFeatureFlag('quickAssess') - : await backgroundContext.disableFeatureFlag('quickAssess'); + : await backgroundContext.disableFeatureFlag('quickAssess')); await popupPage.waitForHighContrastMode(highContrastMode); const button = await popupPage.getSelectorElement( diff --git a/src/tests/end-to-end/tests/popup/launchpad.test.ts b/src/tests/end-to-end/tests/popup/launchpad.test.ts index 3fbd06c47ab..b501c31c085 100644 --- a/src/tests/end-to-end/tests/popup/launchpad.test.ts +++ b/src/tests/end-to-end/tests/popup/launchpad.test.ts @@ -28,9 +28,9 @@ describe('Popup -> Launch Pad', () => { 'content should match snapshot when quick assess feature flag is %s', async quickAssessFeatureFlag => { const backgroundContext = await browser.background(); - quickAssessFeatureFlag === true + void (quickAssessFeatureFlag === true ? await backgroundContext.enableFeatureFlag('quickAssess') - : await backgroundContext.disableFeatureFlag('quickAssess'); + : await backgroundContext.disableFeatureFlag('quickAssess')); const element = await formatPageElementForSnapshot( popupPage, popupPageElementIdentifiers.launchPad, @@ -49,9 +49,9 @@ describe('Popup -> Launch Pad', () => { 'should pass accessibility validation with highContrastMode=%s and quickAssessFeatureFlag=%s', async ({ highContrastMode, quickAssessFeatureFlag }) => { const backgroundContext = await browser.background(); - quickAssessFeatureFlag === true + void (quickAssessFeatureFlag === true ? await backgroundContext.enableFeatureFlag('quickAssess') - : await backgroundContext.disableFeatureFlag('quickAssess'); + : await backgroundContext.disableFeatureFlag('quickAssess')); await browser.setHighContrastMode(highContrastMode); await popupPage.waitForHighContrastMode(highContrastMode); diff --git a/src/tests/end-to-end/tests/target-page/post-message.test.ts b/src/tests/end-to-end/tests/target-page/post-message.test.ts index 36de57d5cd2..02f83167389 100644 --- a/src/tests/end-to-end/tests/target-page/post-message.test.ts +++ b/src/tests/end-to-end/tests/target-page/post-message.test.ts @@ -246,7 +246,7 @@ describe('Target Page window.postMessage behavior', () => { ); } - function tryJsonParse(maybeJsonString: any): any | null { + function tryJsonParse(maybeJsonString: any): any { if (typeof maybeJsonString !== 'string') { return null; } diff --git a/src/tests/unit/mock-helpers/mock-module-helpers.tsx b/src/tests/unit/mock-helpers/mock-module-helpers.tsx index 35a720aab51..0d2ed761c41 100644 --- a/src/tests/unit/mock-helpers/mock-module-helpers.tsx +++ b/src/tests/unit/mock-helpers/mock-module-helpers.tsx @@ -97,9 +97,9 @@ export function mockReactComponent, P = any>( } function expectMockedComponentPropsToMatchSnapshot(component: any, snapshotName?: string) { - snapshotName !== undefined + void (snapshotName !== undefined ? expect(getMockComponentClassPropsForCall(component as any)).toMatchSnapshot(snapshotName) - : expect(getMockComponentClassPropsForCall(component as any)).toMatchSnapshot(); + : expect(getMockComponentClassPropsForCall(component as any)).toMatchSnapshot()); } function mockReactElement

(elementName: string) { diff --git a/src/tests/unit/tests/DetailsView/components/assessment-instance-details-column.test.tsx b/src/tests/unit/tests/DetailsView/components/assessment-instance-details-column.test.tsx index 0375e97e2f9..249e89ccd65 100644 --- a/src/tests/unit/tests/DetailsView/components/assessment-instance-details-column.test.tsx +++ b/src/tests/unit/tests/DetailsView/components/assessment-instance-details-column.test.tsx @@ -79,7 +79,7 @@ describe('AssessmentInstanceDetailsColumn', () => { }), ); - props.labelText ? expect(hasLabel).toEqual(true) : expect(hasLabel).toEqual(false); + void (props.labelText ? expect(hasLabel).toEqual(true) : expect(hasLabel).toEqual(false)); expect(!isNull(wrapper.container.querySelector('.ms-TooltipHost'))).toBe(true); expect( !isNull(wrapper.container.querySelector(`.${styles.assessmentInstanceTextContent}`)), diff --git a/src/tests/unit/tests/DetailsView/components/details-view-command-bar.test.tsx b/src/tests/unit/tests/DetailsView/components/details-view-command-bar.test.tsx index 280b613949e..3e3e470a2a6 100644 --- a/src/tests/unit/tests/DetailsView/components/details-view-command-bar.test.tsx +++ b/src/tests/unit/tests/DetailsView/components/details-view-command-bar.test.tsx @@ -452,7 +452,7 @@ describe('DetailsViewCommandBar', () => { useOriginalReactElements('DetailsView/components/quick-assess-to-assessment-dialog', [ 'QuickAssessToAssessmentDialog', ]); - useOriginalReactElements; + void useOriginalReactElements; const props = getProps(['CommandBar']); let setRef; transferToAssessmentButtonFactoryMock diff --git a/src/tests/unit/tests/DetailsView/components/failure-instance-panel-control.test.tsx b/src/tests/unit/tests/DetailsView/components/failure-instance-panel-control.test.tsx index 0d2ae412574..aa1acfad78a 100644 --- a/src/tests/unit/tests/DetailsView/components/failure-instance-panel-control.test.tsx +++ b/src/tests/unit/tests/DetailsView/components/failure-instance-panel-control.test.tsx @@ -181,7 +181,7 @@ describe('FailureInstancePanelControlTest', () => { expectMockedComponentPropsToMatchSnapshots([ActionButton, FlaggedComponent]); fireEvent.click(renderResult.getByRole('button')); - expect(renderResult.container.querySelector('.failureInstancePanel')).not.toBeNull; + expect(renderResult.container.querySelector('.failureInstancePanel')).not.toBeNull(); const failureDescription = renderResult.getByLabelText('Comment') as HTMLInputElement; expect(failureDescription.value).toEqual(props.failureInstance.failureDescription); const pathField = renderResult.getByLabelText('CSS Selector') as HTMLInputElement; @@ -212,7 +212,7 @@ describe('FailureInstancePanelControlTest', () => { const textField = renderResult.getByRole('textbox') as HTMLInputElement; fireEvent.change(textField, { target: { value: description } }); fireEvent.click(renderResult.getByText('Save')); - expect(renderResult.container.querySelector('.failureInstancePanel')).not.toBeNull; + expect(renderResult.container.querySelector('.failureInstancePanel')).not.toBeNull(); editInstanceMock.verifyAll(); clearPathSnippetDataMock.verify(handler => handler(), Times.exactly(2)); }); @@ -237,7 +237,7 @@ describe('FailureInstancePanelControlTest', () => { const textField = renderResult.getByRole('textbox') as HTMLInputElement; fireEvent.change(textField, { target: { value: description } }); fireEvent.click(renderResult.getByText('Add failed instance')); - expect(renderResult.container.querySelector('.failureInstancePanel')).not.toBeNull; + expect(renderResult.container.querySelector('.failureInstancePanel')).not.toBeNull(); addInstanceMock.verifyAll(); clearPathSnippetDataMock.verify(handler => handler(), Times.exactly(2)); }); diff --git a/src/tests/unit/tests/assessments/report-instance-field.test.ts b/src/tests/unit/tests/assessments/report-instance-field.test.ts index 8f2c689eaa9..b633dbd969a 100644 --- a/src/tests/unit/tests/assessments/report-instance-field.test.ts +++ b/src/tests/unit/tests/assessments/report-instance-field.test.ts @@ -99,11 +99,11 @@ describe('ReportInstanceField', () => { }); describe('fromPropertyBagFunction', () => { - const field = ReportInstanceField.fromPropertyBagFunction( - 'Three', - 'three', - b => b.one + ' + ' + b.two, - ); + const field = ReportInstanceField.fromPropertyBagFunction('Three', 'three', b => { + const oneStr = typeof b.one === 'object' ? JSON.stringify(b.one) : String(b.one ?? ''); + const twoStr = typeof b.two === 'object' ? JSON.stringify(b.two) : String(b.two ?? ''); + return oneStr + ' + ' + twoStr; + }); it('returns key', () => { expect(field.key).toEqual('three'); diff --git a/src/tests/unit/tests/background/actions/action-creator.test.ts b/src/tests/unit/tests/background/actions/action-creator.test.ts index fbaa2d939b9..d54b714c12d 100644 --- a/src/tests/unit/tests/background/actions/action-creator.test.ts +++ b/src/tests/unit/tests/background/actions/action-creator.test.ts @@ -551,10 +551,7 @@ describe('ActionCreatorTest', () => { 'PreviewFeatures', ) .setupTelemetrySend(TelemetryEvents.PIVOT_CHILD_SELECTED, actionCreatorPayload, 1) - .setupShowDetailsView( - tabId, - Promise.reject({ message: showDetailsViewErrorMessage }), - ) + .setupShowDetailsView(tabId, Promise.reject(new Error(showDetailsViewErrorMessage))) .setupLogError(showDetailsViewErrorMessage); const actionCreator = validator.buildActionCreator(); diff --git a/src/tests/unit/tests/background/actions/content-action-creator.test.ts b/src/tests/unit/tests/background/actions/content-action-creator.test.ts index 1b69e2c519f..3e65ca4cb88 100644 --- a/src/tests/unit/tests/background/actions/content-action-creator.test.ts +++ b/src/tests/unit/tests/background/actions/content-action-creator.test.ts @@ -63,7 +63,7 @@ describe('ContentActionMessageCreator', () => { const errorMessage = 'error on showDetailsView'; detailsViewControllerMock .setup(controller => controller.showDetailsView(tabId)) - .returns(() => Promise.reject(errorMessage)) + .returns(() => Promise.reject(new Error(errorMessage))) .verifiable(Times.once()); testSubject.registerCallbacks(); diff --git a/src/tests/unit/tests/background/actions/details-view-action-creator.test.ts b/src/tests/unit/tests/background/actions/details-view-action-creator.test.ts index bb02e3dd2da..127a4999623 100644 --- a/src/tests/unit/tests/background/actions/details-view-action-creator.test.ts +++ b/src/tests/unit/tests/background/actions/details-view-action-creator.test.ts @@ -100,7 +100,7 @@ describe('DetailsViewActionCreatorTest', () => { detailsViewControllerMock .setup(controller => controller.showDetailsView(tabId)) - .returns(() => Promise.reject(errorMessage)) + .returns(() => Promise.reject(new Error(errorMessage))) .verifiable(Times.once()); const loggerMock = Mock.ofType(); diff --git a/src/tests/unit/tests/background/actions/inspect-action-creator.test.ts b/src/tests/unit/tests/background/actions/inspect-action-creator.test.ts index 45c99278436..c403eb1d3a3 100644 --- a/src/tests/unit/tests/background/actions/inspect-action-creator.test.ts +++ b/src/tests/unit/tests/background/actions/inspect-action-creator.test.ts @@ -95,7 +95,7 @@ describe('InspectActionCreator', () => { const dummyError = 'test-dummy-error'; browserAdapterMock .setup(adapter => adapter.switchToTab(tabId)) - .returns(() => Promise.reject(dummyError)); + .returns(() => Promise.reject(new Error(dummyError))); testSubject.registerCallbacks(); diff --git a/src/tests/unit/tests/background/actions/shortcuts-page-action-creator.test.ts b/src/tests/unit/tests/background/actions/shortcuts-page-action-creator.test.ts index c8be334b725..9d62db2eb01 100644 --- a/src/tests/unit/tests/background/actions/shortcuts-page-action-creator.test.ts +++ b/src/tests/unit/tests/background/actions/shortcuts-page-action-creator.test.ts @@ -83,10 +83,9 @@ describe('ShortcutsPageActionCreator', () => { const errorMessage = 'dummy error'; shortcutsPageControllerMock .setup(controller => controller.openShortcutsTab()) - .returns(() => Promise.reject(errorMessage)); + .returns(() => Promise.reject(new Error(errorMessage))); testSubject.registerCallbacks(); - await flushSettledPromises(); telemetryHandlerMock.verify( diff --git a/src/tests/unit/tests/background/actions/tab-action-creator.test.ts b/src/tests/unit/tests/background/actions/tab-action-creator.test.ts index a2b41829b43..ee522bc5b9f 100644 --- a/src/tests/unit/tests/background/actions/tab-action-creator.test.ts +++ b/src/tests/unit/tests/background/actions/tab-action-creator.test.ts @@ -183,7 +183,7 @@ describe(TabActionCreator, () => { const dummyError = 'switch to tab dummy error'; browserAdapterMock .setup(adapter => adapter.switchToTab(tabIdStub)) - .returns(() => Promise.reject(dummyError)); + .returns(() => Promise.reject(new Error(dummyError))); testSubject.registerCallbacks(); diff --git a/src/tests/unit/tests/background/browser-message-broadcaster-factory.test.ts b/src/tests/unit/tests/background/browser-message-broadcaster-factory.test.ts index e0a78532949..a60f01c6d7e 100644 --- a/src/tests/unit/tests/background/browser-message-broadcaster-factory.test.ts +++ b/src/tests/unit/tests/background/browser-message-broadcaster-factory.test.ts @@ -60,7 +60,7 @@ describe('BrowserMessageBroadcasterFactory', () => { .returns(() => Promise.resolve([{ id: 1 } as Tabs.Tab])); browserAdapterMock .setup(ba => ba.sendMessageToFrames(It.isAny())) - .returns(() => Promise.reject(testError)); + .returns(() => Promise.reject(new Error(testError.message))); browserAdapterMock .setup(ba => ba.sendMessageToTab(It.isAny(), It.isAny())) .returns(() => Promise.resolve()); @@ -86,7 +86,7 @@ describe('BrowserMessageBroadcasterFactory', () => { .returns(() => Promise.resolve()); browserAdapterMock .setup(ba => ba.sendMessageToTab(It.isAny(), It.isAny())) - .returns(() => Promise.reject(testError)); + .returns(() => Promise.reject(new Error(testError.message))); loggerMock.setup(m => m.error(expectedMessage, It.isAny())).verifiable(Times.once()); @@ -107,7 +107,7 @@ describe('BrowserMessageBroadcasterFactory', () => { .returns(() => Promise.resolve()); browserAdapterMock .setup(ba => ba.sendMessageToTab(It.isAny(), It.isAny())) - .returns(() => Promise.reject(testError)); + .returns(() => Promise.reject(new Error(testError.message))); loggerMock.setup(m => m.error(It.isAny(), It.isAny())).verifiable(Times.never()); @@ -145,7 +145,7 @@ describe('BrowserMessageBroadcasterFactory', () => { browserAdapterMock .setup(ba => ba.sendMessageToFrames(It.isAny())) - .returns(() => Promise.reject(testError)); + .returns(() => Promise.reject(new Error(testError.message))); browserAdapterMock .setup(ba => ba.sendMessageToTab(It.isAny(), It.isAny())) .returns(() => Promise.resolve()); @@ -168,7 +168,7 @@ describe('BrowserMessageBroadcasterFactory', () => { .returns(() => Promise.resolve()); browserAdapterMock .setup(ba => ba.sendMessageToTab(It.isAny(), It.isAny())) - .returns(() => Promise.reject(testError)); + .returns(() => Promise.reject(new Error(testError.message))); loggerMock.setup(m => m.error(expectedMessage, It.isAny())).verifiable(Times.once()); diff --git a/src/tests/unit/tests/background/browser-permissions-tracker.test.ts b/src/tests/unit/tests/background/browser-permissions-tracker.test.ts index 3d4e548ce48..9a03f325b93 100644 --- a/src/tests/unit/tests/background/browser-permissions-tracker.test.ts +++ b/src/tests/unit/tests/background/browser-permissions-tracker.test.ts @@ -73,7 +73,7 @@ describe('BrowserPermissionsTracker', () => { const browserPermissions = false; await testSubject.initialize(); - setupBrowserAdapterMock(Promise.reject()); + setupBrowserAdapterMock(Promise.reject(new Error('Permission request rejected'))); await browserAdapterMock.addPermissions(); @@ -101,7 +101,7 @@ describe('BrowserPermissionsTracker', () => { const browserPermissions = false; await testSubject.initialize(); - setupBrowserAdapterMock(Promise.reject()); + setupBrowserAdapterMock(Promise.reject(new Error('Permission request rejected'))); await browserAdapterMock.removePermissions(); diff --git a/src/tests/unit/tests/background/extension-details-view-controller.test.ts b/src/tests/unit/tests/background/extension-details-view-controller.test.ts index edf723559cf..1700255ab33 100644 --- a/src/tests/unit/tests/background/extension-details-view-controller.test.ts +++ b/src/tests/unit/tests/background/extension-details-view-controller.test.ts @@ -189,7 +189,7 @@ describe('ExtensionDetailsViewController', () => { const errorMessage = 'switchToTab failed with dummy error'; browserAdapterMock .setup(adapter => adapter.switchToTab(detailsViewTabId)) - .returns(() => Promise.reject(errorMessage)); + .returns(() => Promise.reject(new Error(errorMessage))); await expect(testSubject.showDetailsView(targetTabId)).rejects.toEqual( errorMessage, @@ -211,7 +211,7 @@ describe('ExtensionDetailsViewController', () => { '/DetailsView/detailsView.html?tabId=' + targetTabId, ), ) - .returns(() => Promise.reject(errorMessage)) + .returns(() => Promise.reject(new Error(errorMessage))) .verifiable(Times.once()); await expect(testSubject.showDetailsView(targetTabId)).rejects.toEqual( diff --git a/src/tests/unit/tests/background/initial-visualization-store-data-generator.test.ts b/src/tests/unit/tests/background/initial-visualization-store-data-generator.test.ts index e4743614722..4b29f1eae59 100644 --- a/src/tests/unit/tests/background/initial-visualization-store-data-generator.test.ts +++ b/src/tests/unit/tests/background/initial-visualization-store-data-generator.test.ts @@ -24,7 +24,7 @@ describe('InitialVisualizationStoreDataGenerator.generateInitialState', () => { } as VisualizationConfiguration; }; const typeToTestModeMap = visualizationTypes.map(vt => - vt < 5 ? 'adhoc' : vt > 10 ? 'assessments' : 'quickAssess', + (vt as number) < 5 ? 'adhoc' : (vt as number) > 10 ? 'assessments' : 'quickAssess', ); beforeEach(() => { diff --git a/src/tests/unit/tests/background/shortcuts-page-controller.test.ts b/src/tests/unit/tests/background/shortcuts-page-controller.test.ts index c0c13b97536..bd427894f82 100644 --- a/src/tests/unit/tests/background/shortcuts-page-controller.test.ts +++ b/src/tests/unit/tests/background/shortcuts-page-controller.test.ts @@ -35,7 +35,7 @@ describe('ShortcutsPageController', () => { .setup(adapter => adapter.createActiveTab(ShortcutsPageController.configureCommandTabUrl), ) - .returns(() => Promise.reject(errorMessage)) + .returns(() => Promise.reject(new Error(errorMessage))) .verifiable(Times.once()); await expect(testSubject.openShortcutsTab()).rejects.toEqual(errorMessage); diff --git a/src/tests/unit/tests/background/target-tab-controller.test.ts b/src/tests/unit/tests/background/target-tab-controller.test.ts index f0cee937e01..cff25cc86e8 100644 --- a/src/tests/unit/tests/background/target-tab-controller.test.ts +++ b/src/tests/unit/tests/background/target-tab-controller.test.ts @@ -71,7 +71,7 @@ describe('TargetTabControllerTest', () => { const errorMessage = 'switchToTab failed error message'; browserAdapterMock .setup(adapter => adapter.switchToTab(tabId)) - .returns(() => Promise.reject(errorMessage)); + .returns(() => Promise.reject(new Error(errorMessage))); await expect(testSubject.showTargetTab(tabId, test, step)).rejects.toEqual( errorMessage, diff --git a/src/tests/unit/tests/background/telemetry/debug-tools-telemetry-client.test.ts b/src/tests/unit/tests/background/telemetry/debug-tools-telemetry-client.test.ts index 347b339f621..d1e502eeb77 100644 --- a/src/tests/unit/tests/background/telemetry/debug-tools-telemetry-client.test.ts +++ b/src/tests/unit/tests/background/telemetry/debug-tools-telemetry-client.test.ts @@ -111,7 +111,7 @@ describe('DebugToolsTelemetryClient', () => { telemetryDataFactoryMock.setup(factory => factory.getData()).returns(() => stubAppData); browserAdapterMock .setup(b => b.sendRuntimeMessage(It.isAny())) - .returns(() => Promise.reject('error from sendRuntimeMessage')) + .returns(() => Promise.reject(new Error('error from sendRuntimeMessage'))) .verifiable(); testSubject.trackEvent(eventName, eventProperties); diff --git a/src/tests/unit/tests/background/usage-logger.test.ts b/src/tests/unit/tests/background/usage-logger.test.ts index 010155d0920..7a300cc9159 100644 --- a/src/tests/unit/tests/background/usage-logger.test.ts +++ b/src/tests/unit/tests/background/usage-logger.test.ts @@ -51,7 +51,7 @@ describe('UsageLoggerTest', () => { storageAdapterMock .setup(m => m.setUserData(It.isValue(expected))) - .returns(_ => Promise.reject({ message: errorMessage })); + .returns(_ => Promise.reject(new Error(errorMessage))); usageLogger.record(); diff --git a/src/tests/unit/tests/common/components/copy-issue-details-button.test.tsx b/src/tests/unit/tests/common/components/copy-issue-details-button.test.tsx index def94409438..1c334ad89e6 100644 --- a/src/tests/unit/tests/common/components/copy-issue-details-button.test.tsx +++ b/src/tests/unit/tests/common/components/copy-issue-details-button.test.tsx @@ -90,10 +90,9 @@ describe('CopyIssueDetailsButtonTest', () => { navigatorUtilsMock .setup(navigatorUtils => navigatorUtils.copyToClipboard(issueDetailsText)) .returns(() => { - return Promise.reject(); + return Promise.reject(new Error('Copy to clipboard failed')); }) .verifiable(Times.once()); - useOriginalReactElements('@fluentui/react', ['DefaultButton']); const renderResult = render(); onClickMock.setup(m => m(It.isAny())).verifiable(Times.once()); @@ -110,11 +109,10 @@ describe('CopyIssueDetailsButtonTest', () => { navigatorUtilsMock .setup(navigatorUtils => navigatorUtils.copyToClipboard(issueDetailsText)) .returns(() => { - return Promise.reject(); + return Promise.reject(new Error('Copy to clipboard failed')); }) .verifiable(Times.once()); props.hasSecureTargetPage = false; - useOriginalReactElements('@fluentui/react', ['DefaultButton']); const renderResult = render(); onClickMock.setup(m => m(It.isAny())).verifiable(Times.once()); diff --git a/src/tests/unit/tests/common/enum-helper.test.ts b/src/tests/unit/tests/common/enum-helper.test.ts index b110f444b99..3aeaac1c081 100644 --- a/src/tests/unit/tests/common/enum-helper.test.ts +++ b/src/tests/unit/tests/common/enum-helper.test.ts @@ -26,6 +26,6 @@ describe('EnumHelperTest', () => { test('string enum', () => { const action = () => EnumHelper.getNumericValues(TestStringEnum); - expect(action).toThrowError(`No 'number' key found on ${TestStringEnum}`); + expect(action).toThrowError(`No 'number' key found on ${JSON.stringify(TestStringEnum)}`); }); }); diff --git a/src/tests/unit/tests/common/message-creators/remote-action-message-dispatcher.test.ts b/src/tests/unit/tests/common/message-creators/remote-action-message-dispatcher.test.ts index edee2265edf..2ddbaac73e9 100644 --- a/src/tests/unit/tests/common/message-creators/remote-action-message-dispatcher.test.ts +++ b/src/tests/unit/tests/common/message-creators/remote-action-message-dispatcher.test.ts @@ -53,7 +53,9 @@ describe('RemoteActionMessageDispatcher', () => { it('propagates errors from postMessage to logger.error', () => { const expectedError = 'expected error'; postMessageMock.reset(); - postMessageMock.setup(m => m(It.isAny())).returns(() => Promise.reject(expectedError)); + postMessageMock + .setup(m => m(It.isAny())) + .returns(() => Promise.reject(new Error(expectedError))); const testObject = new RemoteActionMessageDispatcher( postMessageMock.object, null, @@ -96,7 +98,9 @@ describe('RemoteActionMessageDispatcher', () => { it('propagates errors from postMessage to logger.error', async () => { const expectedError = 'expected error'; postMessageMock.reset(); - postMessageMock.setup(m => m(It.isAny())).returns(() => Promise.reject(expectedError)); + postMessageMock + .setup(m => m(It.isAny())) + .returns(() => Promise.reject(new Error(expectedError))); const testObject = new RemoteActionMessageDispatcher( postMessageMock.object, null, diff --git a/src/tests/unit/tests/common/notification-creator.test.ts b/src/tests/unit/tests/common/notification-creator.test.ts index 74174e73eab..375fde0329c 100644 --- a/src/tests/unit/tests/common/notification-creator.test.ts +++ b/src/tests/unit/tests/common/notification-creator.test.ts @@ -86,7 +86,7 @@ describe('NotificationCreator', () => { browserAdapterMock .setup(adapter => adapter.createNotification(It.isValue(notificationOptions))) - .returns(() => Promise.reject(errorMessage)) + .returns(() => Promise.reject(new Error(errorMessage))) .verifiable(Times.once()); testObject.createNotification(notificationMessage); diff --git a/src/tests/unit/tests/common/promises/promise-factory.test.ts b/src/tests/unit/tests/common/promises/promise-factory.test.ts index b7cd38c307d..f4659279c3d 100644 --- a/src/tests/unit/tests/common/promises/promise-factory.test.ts +++ b/src/tests/unit/tests/common/promises/promise-factory.test.ts @@ -29,7 +29,7 @@ describe(`promiseFactory`, () => { it("propagates an underlying Promise's reject", async () => { const reason = 'rejecting!'; - const rejecting = testObject.timeout(Promise.reject(reason), 10); + const rejecting = testObject.timeout(Promise.reject(new Error(reason)), 10); await expect(rejecting).rejects.toEqual(reason); }); @@ -75,11 +75,11 @@ describe(`promiseFactory`, () => { const reason = 'rejecting!'; const rejecting = new Promise((resolve, reject) => { setTimeout(() => { - reject(reason); + reject(new Error(reason)); }, 10); }).catch(error => { //jest expects caught rejections - expect(error).toEqual(reason); + expect(error).toEqual(new Error(reason)); return reason; }); const result = testObject.delay(rejecting, 20); diff --git a/src/tests/unit/tests/common/state-dispatcher.test.ts b/src/tests/unit/tests/common/state-dispatcher.test.ts index 1a5079669e8..38c34323745 100644 --- a/src/tests/unit/tests/common/state-dispatcher.test.ts +++ b/src/tests/unit/tests/common/state-dispatcher.test.ts @@ -157,7 +157,9 @@ describe('StateDispatcherTest', () => { stateDispatcher.initialize(); broadcastMock.reset(); - broadcastMock.setup(m => m(It.isAny())).returns(() => Promise.reject(expectedError)); + broadcastMock + .setup(m => m(It.isAny())) + .returns(() => Promise.reject(new Error(expectedError))); privateDispatcher.call(stateDispatcher); await flushSettledPromises(); diff --git a/src/tests/unit/tests/common/store-update-message-hub.test.ts b/src/tests/unit/tests/common/store-update-message-hub.test.ts index fbeb99efea1..549e6775130 100644 --- a/src/tests/unit/tests/common/store-update-message-hub.test.ts +++ b/src/tests/unit/tests/common/store-update-message-hub.test.ts @@ -46,7 +46,7 @@ describe(StoreUpdateMessageHub, () => { testSubject = new StoreUpdateMessageHub(mockDispatcher.object, tabId); // Simulating setting up the listener to avoid error check in registerStoreUpdateListener - testSubject.handleBrowserMessage; + void testSubject.handleBrowserMessage; testSubject.registerStoreUpdateListener(storeId, registeredListener); }); @@ -120,7 +120,7 @@ describe(StoreUpdateMessageHub, () => { it('Calls registered listener if not created with a tab id', async () => { testSubject = new StoreUpdateMessageHub(mockDispatcher.object); - testSubject.handleBrowserMessage; + void testSubject.handleBrowserMessage; testSubject.registerStoreUpdateListener(storeId, registeredListener); const response = testSubject.handleBrowserMessage(tabContextMessage); diff --git a/src/tests/unit/tests/injected/frameCommunicators/backchannel-window-message-translator.test.ts b/src/tests/unit/tests/injected/frameCommunicators/backchannel-window-message-translator.test.ts index 7f9dc71bfa4..5a15fdf8b30 100644 --- a/src/tests/unit/tests/injected/frameCommunicators/backchannel-window-message-translator.test.ts +++ b/src/tests/unit/tests/injected/frameCommunicators/backchannel-window-message-translator.test.ts @@ -92,7 +92,7 @@ describe('BackchannelWindowMessageTranslator', () => { test('tryCreateBackchannelReceiveMessage with valid input', () => { const backchannelRequestMessage = testSubject.tryCreateBackchannelReceiveMessage(`{ "messageId": "${validMessageId}", - "message": "${validMessageProperty}", + "message": "${JSON.stringify(validMessageProperty)}", "messageStableSignature": "${MESSAGE_STABLE_SIGNATURE}", "messageSourceId": "${translatorSourceId}", "messageVersion": "${messageVersion}" @@ -115,53 +115,53 @@ describe('BackchannelWindowMessageTranslator', () => { ${'message with only messageVersion present'} | ${`{ "messageVersion": "${messageVersion}" }`} ${'message with only messageStableSignature present'} | ${`{ "messageStableSignature": "${MESSAGE_STABLE_SIGNATURE}" }`} ${'message with only messageId missing'} | ${`{ - "message": "${validMessageProperty}", + "message": "${JSON.stringify(validMessageProperty)}", "messageStableSignature": "${MESSAGE_STABLE_SIGNATURE}", "messageSourceId": "${translatorSourceId}", "messageVersion": "${messageVersion}" }`} ${'message with messageStableSignature missing'} | ${`{ "messageId": "${validMessageId}", - "message": "${validMessageProperty}", + "message": "${JSON.stringify(validMessageProperty)}", "messageSourceId": "${translatorSourceId}", "messageVersion": "${messageVersion}" }`} ${'message with messageSourceId missing'} | ${`{ "messageId": "${validMessageId}", - "message": "${validMessageProperty}", + "message": "${JSON.stringify(validMessageProperty)}", "messageStableSignature": "${MESSAGE_STABLE_SIGNATURE}", "messageVersion": "${messageVersion}" }`} ${'message with messageVersion missing'} | ${`{ "messageId": "${validMessageId}", - "message": "${validMessageProperty}", + "message": "${JSON.stringify(validMessageProperty)}", "messageStableSignature": "${MESSAGE_STABLE_SIGNATURE}", "messageSourceId": "${translatorSourceId}" }`} ${'message with messageId malformed'} | ${`{ "messageId": 0, - "message": "${validMessageProperty}", + "message": "${JSON.stringify(validMessageProperty)}", "messageStableSignature": "${MESSAGE_STABLE_SIGNATURE}", "messageSourceId": "${translatorSourceId}", "messageVersion": "${messageVersion}" }`} ${'message with messageStableSignature malformed'} | ${`{ "messageId": "${validMessageId}", - "message": "${validMessageProperty}", + "message": "${JSON.stringify(validMessageProperty)}", "messageStableSignature": "unknown stable signature", "messageSourceId": "${translatorSourceId}", "messageVersion": "${messageVersion}" }`} ${'message with unknown messageSourceId'} | ${`{ "messageId": "${validMessageId}", - "message": "${validMessageProperty}", + "message": "${JSON.stringify(validMessageProperty)}", "messageStableSignature": "${MESSAGE_STABLE_SIGNATURE}", "messageSourceId": "unknown source id", "messageVersion": "${messageVersion}" }`} ${'message with unknown messageVersion'} | ${`{ "messageId": "${validMessageId}", - "message": "${validMessageProperty}", + "message": "${JSON.stringify(validMessageProperty)}", "messageStableSignature": "${MESSAGE_STABLE_SIGNATURE}", "messageSourceId": "${translatorSourceId}", "messageVersion": "unknown version" diff --git a/src/tests/unit/tests/injected/path-snippet-controller.test.ts b/src/tests/unit/tests/injected/path-snippet-controller.test.ts index a805339cf09..64a2236e535 100644 --- a/src/tests/unit/tests/injected/path-snippet-controller.test.ts +++ b/src/tests/unit/tests/injected/path-snippet-controller.test.ts @@ -94,7 +94,7 @@ describe('InspectControllerTests', () => { elementFinderMock .setup(finder => finder.processRequest(expectedMessage)) - .returns(() => Promise.reject()) + .returns(() => Promise.reject(new Error('Element finder rejected'))) .verifiable(Times.once()); addCorrespondingSnippetMock.setup(sm => sm(errorMessage)).verifiable(Times.once()); diff --git a/src/tests/unit/tests/injected/visualization/svg-solid-shadow-filter-factory.test.ts b/src/tests/unit/tests/injected/visualization/svg-solid-shadow-filter-factory.test.ts index 522176fbd53..f72d8872a1d 100644 --- a/src/tests/unit/tests/injected/visualization/svg-solid-shadow-filter-factory.test.ts +++ b/src/tests/unit/tests/injected/visualization/svg-solid-shadow-filter-factory.test.ts @@ -170,7 +170,15 @@ class FeElementAsserter { ): void { forOwn(this.expectedParams, (value, name) => { const actualValue = actualElement.getAttributeNS(null, name); - expect(actualValue).toEqual(value.toString()); + let expectedValue: string; + if (value == null) { + expectedValue = ''; + } else if (typeof value === 'object') { + expectedValue = JSON.stringify(value); + } else { + expectedValue = String(value as string | number | boolean); + } + expect(actualValue).toEqual(expectedValue); }); } diff --git a/src/tests/unit/tests/issue-filing/common/create-file-issue-handler.test.ts b/src/tests/unit/tests/issue-filing/common/create-file-issue-handler.test.ts index 40442667dfd..3e3cd7cdea1 100644 --- a/src/tests/unit/tests/issue-filing/common/create-file-issue-handler.test.ts +++ b/src/tests/unit/tests/issue-filing/common/create-file-issue-handler.test.ts @@ -74,7 +74,7 @@ describe('createFileIssueHandler', () => { browserAdapterMock .setup(adapter => adapter.createActiveTab(urlStub)) - .returns(() => Promise.reject(errorMessage)); + .returns(() => Promise.reject(new Error(errorMessage))); const testSubject = createFileIssueHandler( urlProviderMock.object, diff --git a/src/views/content/content-page.tsx b/src/views/content/content-page.tsx index c2ef83f455d..440e15ff0c3 100644 --- a/src/views/content/content-page.tsx +++ b/src/views/content/content-page.tsx @@ -66,9 +66,7 @@ export function ContentProvider(root: ContentTree): ContentProvider { const notFoundPage = (path?: string) => create(() =>

Cannot find {path}

); - function isContentPageComponent( - leaf: any | ContentPageComponent, - ): leaf is ContentPageComponent { + function isContentPageComponent(leaf: any): leaf is ContentPageComponent { return ( leaf && (leaf as ContentPageComponent).displayName && diff --git a/yarn.lock b/yarn.lock index 26a824b8f90..2bb03fc7d36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1150,7 +1150,25 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/eslint-utils@npm:^4.7.0": + version: 4.9.0 + resolution: "@eslint-community/eslint-utils@npm:4.9.0" + dependencies: + eslint-visitor-keys: ^3.4.3 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: ae9b98eea006d1354368804b0116b8b45017a4e47b486d1b9cfa048a8ed3dc69b9b074eb2b2acb14034e6897c24048fd42b6a6816d9dc8bb9daad79db7d478d2 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.10.0": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.6.1": version: 4.10.0 resolution: "@eslint-community/regexpp@npm:4.10.0" checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b @@ -2512,13 +2530,6 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 - languageName: node - linkType: hard - "@types/send@npm:*": version: 0.17.4 resolution: "@types/send@npm:0.17.4" @@ -2600,171 +2611,140 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.61.0": - version: 5.62.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" +"@typescript-eslint/eslint-plugin@npm:^8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/eslint-plugin@npm:8.46.2" dependencies: - "@eslint-community/regexpp": ^4.4.0 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/type-utils": 5.62.0 - "@typescript-eslint/utils": 5.62.0 - debug: ^4.3.4 + "@eslint-community/regexpp": ^4.10.0 + "@typescript-eslint/scope-manager": 8.46.2 + "@typescript-eslint/type-utils": 8.46.2 + "@typescript-eslint/utils": 8.46.2 + "@typescript-eslint/visitor-keys": 8.46.2 graphemer: ^1.4.0 - ignore: ^5.2.0 - natural-compare-lite: ^1.4.0 - semver: ^7.3.7 - tsutils: ^3.21.0 + ignore: ^7.0.0 + natural-compare: ^1.4.0 + ts-api-utils: ^2.1.0 peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: fc104b389c768f9fa7d45a48c86d5c1ad522c1d0512943e782a56b1e3096b2cbcc1eea3fcc590647bf0658eef61aac35120a9c6daf979bf629ad2956deb516a1 + "@typescript-eslint/parser": ^8.46.2 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 9292f1f984f50166a7d7b17d73df6a05263b40f18c88be62830f90ae3836ea7f94d15bbc035d85ddbc4793b27d9ea15829bf1b3d35771bdb1bd1cd41f0760ddb languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.18.1": - version: 6.21.0 - resolution: "@typescript-eslint/parser@npm:6.21.0" +"@typescript-eslint/parser@npm:^8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/parser@npm:8.46.2" dependencies: - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/scope-manager": 8.46.2 + "@typescript-eslint/types": 8.46.2 + "@typescript-eslint/typescript-estree": 8.46.2 + "@typescript-eslint/visitor-keys": 8.46.2 debug: ^4.3.4 peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" - dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 - checksum: 6062d6b797fe1ce4d275bb0d17204c827494af59b5eaf09d8a78cdd39dadddb31074dded4297aaf5d0f839016d601032857698b0e4516c86a41207de606e9573 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: fc65446e11cc2d21550c1848526458f1dc0ea02bad6454d6a1477f5fa997bbf2a64b4e00b289128e17c69a8b41840367091650075810b458a3cae4a9ab8736cd languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/scope-manager@npm:6.21.0" +"@typescript-eslint/project-service@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/project-service@npm:8.46.2" dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/type-utils@npm:5.62.0" - dependencies: - "@typescript-eslint/typescript-estree": 5.62.0 - "@typescript-eslint/utils": 5.62.0 + "@typescript-eslint/tsconfig-utils": ^8.46.2 + "@typescript-eslint/types": ^8.46.2 debug: ^4.3.4 - tsutils: ^3.21.0 peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: fc41eece5f315dfda14320be0da78d3a971d650ea41300be7196934b9715f3fe1120a80207551eb71d39568275dbbcf359bde540d1ca1439d8be15e9885d2739 + typescript: ">=4.8.4 <6.0.0" + checksum: 9fb4d2eafd949f430b498a12b886cf6b5414108c84490e7906b877be711ff7e8db996f94861d47ad1bb4c0d323adbc9522100766094a47f5bc8671f1bf820368 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670 +"@typescript-eslint/scope-manager@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/scope-manager@npm:8.46.2" + dependencies: + "@typescript-eslint/types": 8.46.2 + "@typescript-eslint/visitor-keys": 8.46.2 + checksum: 2df38694957a1f4a440f97c39839989bb99871a2cb2e10d715b4c91b64cb08377b57fe39122a3d8fe8e90a9eadd48655093316c8372253db724696446c441a96 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/types@npm:6.21.0" - checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 +"@typescript-eslint/tsconfig-utils@npm:8.46.2, @typescript-eslint/tsconfig-utils@npm:^8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.46.2" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 4a8caad6e6d27d1cc5f35db201906d3b008edacea0dd880cd0a3e62cbbdcf84907c231862acfbfa5c326516d6c043f185f1db190d8d8f48f90f2bb0e699fdf8d languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" +"@typescript-eslint/type-utils@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/type-utils@npm:8.46.2" dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 + "@typescript-eslint/types": 8.46.2 + "@typescript-eslint/typescript-estree": 8.46.2 + "@typescript-eslint/utils": 8.46.2 debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52 + ts-api-utils: ^2.1.0 + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: b16aa99d3517de0b138a5d89d5dd06ccf19f7f522fc8bb205db05c7bcef47bbbb206bb694b57feb7e8102c61d3ce580a1a6c8d3efdd788d42566b718edea97dd languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" - dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - minimatch: 9.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 +"@typescript-eslint/types@npm:8.46.2, @typescript-eslint/types@npm:^8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/types@npm:8.46.2" + checksum: c1c1c3a99b62ed51784d35c47547c2fa30c1896edf9843dcff3d39571b18b04daab1093f4ff59ae5f65a94fe78f2e7c73d3903b68c51d195204016ba909ca0d3 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" +"@typescript-eslint/typescript-estree@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/typescript-estree@npm:8.46.2" dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 - eslint-scope: ^5.1.1 - semver: ^7.3.7 + "@typescript-eslint/project-service": 8.46.2 + "@typescript-eslint/tsconfig-utils": 8.46.2 + "@typescript-eslint/types": 8.46.2 + "@typescript-eslint/visitor-keys": 8.46.2 + debug: ^4.3.4 + fast-glob: ^3.3.2 + is-glob: ^4.0.3 + minimatch: ^9.0.4 + semver: ^7.6.0 + ts-api-utils: ^2.1.0 peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: ee9398c8c5db6d1da09463ca7bf36ed134361e20131ea354b2da16a5fdb6df9ba70c62a388d19f6eebb421af1786dbbd79ba95ddd6ab287324fc171c3e28d931 + typescript: ">=4.8.4 <6.0.0" + checksum: e86da0546983e7e46a388af90fbd04ba19192d5f0c32b907d684890e0b363abbcdaf24a6f9a9909d5671ecefd67f3b1bc9e867e69dbca888aa6fc6554430d9e9 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" +"@typescript-eslint/utils@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/utils@npm:8.46.2" dependencies: - "@typescript-eslint/types": 5.62.0 - eslint-visitor-keys: ^3.3.0 - checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 + "@eslint-community/eslint-utils": ^4.7.0 + "@typescript-eslint/scope-manager": 8.46.2 + "@typescript-eslint/types": 8.46.2 + "@typescript-eslint/typescript-estree": 8.46.2 + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: dd3492454015340ae61e41b83ced7fe3fdcb47eeba3add1bd1ddb8a4b0551dcaf1479b4f74675074a48a36007a13dffa159258a6407fcb7aadfa637c27117b7b languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" +"@typescript-eslint/visitor-keys@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/visitor-keys@npm:8.46.2" dependencies: - "@typescript-eslint/types": 6.21.0 - eslint-visitor-keys: ^3.4.1 - checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 + "@typescript-eslint/types": 8.46.2 + eslint-visitor-keys: ^4.2.1 + checksum: 0f3a79175521c3bd99c6f000e8ec2211b8e24440a71526ae7aa2a02bea4e5226192df14c13c57fe3e6d6d568960f09f7138380e8b7cc89c9fac39fcb51ac0be8 languageName: node linkType: hard @@ -3084,8 +3064,8 @@ __metadata: "@types/ua-parser-js": ^0.7.39 "@types/uuid": ^9.0.7 "@types/webextension-polyfill": ^0.10.7 - "@typescript-eslint/eslint-plugin": ^5.61.0 - "@typescript-eslint/parser": ^6.18.1 + "@typescript-eslint/eslint-plugin": ^8.46.2 + "@typescript-eslint/parser": ^8.46.2 ajv: ^8.12.0 axe-core: 4.10.2 case-sensitive-paths-webpack-plugin: ^2.4.0 @@ -5475,7 +5455,7 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": +"eslint-scope@npm:5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" dependencies: @@ -5502,6 +5482,13 @@ __metadata: languageName: node linkType: hard +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 3a77e3f99a49109f6fb2c5b7784bc78f9743b834d238cdba4d66c602c6b52f19ed7bcd0a5c5dbbeae3a8689fd785e76c001799f53d2228b278282cf9f699fff5 + languageName: node + linkType: hard + "eslint@npm:^8.57.0": version: 8.57.0 resolution: "eslint@npm:8.57.0" @@ -5776,6 +5763,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.3.2": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.8 + checksum: 0704d7b85c0305fd2cef37777337dfa26230fdd072dce9fb5c82a4b03156f3ffb8ed3e636033e65d45d2a5805a4e475825369a27404c0307f2db0c8eb3366fbd + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -6981,6 +6981,13 @@ __metadata: languageName: node linkType: hard +"ignore@npm:^7.0.0": + version: 7.0.5 + resolution: "ignore@npm:7.0.5" + checksum: d0862bf64d3d58bf34d5fb0a9f725bec9ca5ce8cd1aecc8f28034269e8f69b8009ffd79ca3eda96962a6a444687781cd5efdb8c7c8ddc0a6996e36d31c217f14 + languageName: node + linkType: hard + "immutable@npm:^4.0.0": version: 4.3.6 resolution: "immutable@npm:4.3.6" @@ -8701,7 +8708,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.7": +"micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.7, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -8762,15 +8769,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.3": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - "minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -8789,6 +8787,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: ^2.0.1 + checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 + languageName: node + linkType: hard + "minimatch@npm:~3.0.2, minimatch@npm:~3.0.4": version: 3.0.8 resolution: "minimatch@npm:3.0.8" @@ -8948,13 +8955,6 @@ __metadata: languageName: node linkType: hard -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 - languageName: node - linkType: hard - "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -10690,7 +10690,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4": +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.6.2 resolution: "semver@npm:7.6.2" bin: @@ -10699,6 +10699,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.0": + version: 7.7.3 + resolution: "semver@npm:7.7.3" + bin: + semver: bin/semver.js + checksum: f013a3ee4607857bcd3503b6ac1d80165f7f8ea94f5d55e2d3e33df82fce487aa3313b987abf9b39e0793c83c9fc67b76c36c067625141a9f6f704ae0ea18db2 + languageName: node + linkType: hard + "send@npm:0.19.0": version: 0.19.0 resolution: "send@npm:0.19.0" @@ -11780,12 +11789,12 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" +"ts-api-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "ts-api-utils@npm:2.1.0" peerDependencies: - typescript: ">=4.2.0" - checksum: c746ddabfdffbf16cb0b0db32bb287236a19e583057f8649ee7c49995bb776e1d3ef384685181c11a1a480369e022ca97512cb08c517b2d2bd82c83754c97012 + typescript: ">=4.8.4" + checksum: 5b1ef89105654d93d67582308bd8dfe4bbf6874fccbcaa729b08fbb00a940fd4c691ca6d0d2b18c3c70878d9a7e503421b7cc473dbc3d0d54258b86401d4b15d languageName: node linkType: hard @@ -11817,13 +11826,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.8.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd - languageName: node - linkType: hard - "tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -11831,17 +11833,6 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: ^1.8.1 - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 - languageName: node - linkType: hard - "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0"