diff --git a/.eslintplugin/code-amd-node-module.ts b/.eslint-plugin-local/code-amd-node-module.ts similarity index 98% rename from .eslintplugin/code-amd-node-module.ts rename to .eslint-plugin-local/code-amd-node-module.ts index 35c89dcb219..ff7ef6ab33b 100644 --- a/.eslintplugin/code-amd-node-module.ts +++ b/.eslint-plugin-local/code-amd-node-module.ts @@ -12,7 +12,8 @@ export = new class ApiProviderNaming implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { messages: { amdX: 'Use `import type` for import declarations, use `amdX#importAMDNodeModule` for import expressions' - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-declare-service-brand.ts b/.eslint-plugin-local/code-declare-service-brand.ts similarity index 96% rename from .eslintplugin/code-declare-service-brand.ts rename to .eslint-plugin-local/code-declare-service-brand.ts index 402d3638e7a..f2d28bbfc01 100644 --- a/.eslintplugin/code-declare-service-brand.ts +++ b/.eslint-plugin-local/code-declare-service-brand.ts @@ -8,7 +8,8 @@ import * as eslint from 'eslint'; export = new class DeclareServiceBrand implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { - fixable: 'code' + fixable: 'code', + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-ensure-no-disposables-leak-in-test.ts b/.eslint-plugin-local/code-ensure-no-disposables-leak-in-test.ts similarity index 97% rename from .eslintplugin/code-ensure-no-disposables-leak-in-test.ts rename to .eslint-plugin-local/code-ensure-no-disposables-leak-in-test.ts index 9d3044f50f4..56a1d4a70ad 100644 --- a/.eslintplugin/code-ensure-no-disposables-leak-in-test.ts +++ b/.eslint-plugin-local/code-ensure-no-disposables-leak-in-test.ts @@ -13,7 +13,8 @@ export = new class EnsureNoDisposablesAreLeakedInTestSuite implements eslint.Rul messages: { ensure: 'Suites should include a call to `ensureNoDisposablesAreLeakedInTestSuite()` to ensure no disposables are leaked in tests.' }, - fixable: 'code' + fixable: 'code', + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-import-patterns.ts b/.eslint-plugin-local/code-import-patterns.ts similarity index 99% rename from .eslintplugin/code-import-patterns.ts rename to .eslint-plugin-local/code-import-patterns.ts index 460409514bc..399e1a2a281 100644 --- a/.eslintplugin/code-import-patterns.ts +++ b/.eslint-plugin-local/code-import-patterns.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; import * as path from 'path'; import minimatch from 'minimatch'; import { createImportRuleListener } from './utils'; @@ -50,7 +50,8 @@ export = new class implements eslint.Rule.RuleModule { }, docs: { url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization' - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-layering.ts b/.eslint-plugin-local/code-layering.ts similarity index 93% rename from .eslintplugin/code-layering.ts rename to .eslint-plugin-local/code-layering.ts index cca72eeec71..f8b769a1bf6 100644 --- a/.eslintplugin/code-layering.ts +++ b/.eslint-plugin-local/code-layering.ts @@ -20,7 +20,18 @@ export = new class implements eslint.Rule.RuleModule { }, docs: { url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization' - } + }, + schema: [ + { + type: 'object', + additionalProperties: { + type: 'array', + items: { + type: 'string' + } + } + } + ] }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-limited-top-functions.ts b/.eslint-plugin-local/code-limited-top-functions.ts similarity index 100% rename from .eslintplugin/code-limited-top-functions.ts rename to .eslint-plugin-local/code-limited-top-functions.ts diff --git a/.eslintplugin/code-must-use-result.ts b/.eslint-plugin-local/code-must-use-result.ts similarity index 91% rename from .eslintplugin/code-must-use-result.ts rename to .eslint-plugin-local/code-must-use-result.ts index 2127206f8c4..e59b1920f2e 100644 --- a/.eslintplugin/code-must-use-result.ts +++ b/.eslint-plugin-local/code-must-use-result.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; const VALID_USES = new Set([ TSESTree.AST_NODE_TYPES.AwaitExpression, @@ -12,6 +12,9 @@ const VALID_USES = new Set([ ]); export = new class MustUseResults implements eslint.Rule.RuleModule { + readonly meta: eslint.Rule.RuleMetaData = { + schema: false + } create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-must-use-super-dispose.ts b/.eslint-plugin-local/code-must-use-super-dispose.ts similarity index 100% rename from .eslintplugin/code-must-use-super-dispose.ts rename to .eslint-plugin-local/code-must-use-super-dispose.ts diff --git a/.eslintplugin/code-no-dangerous-type-assertions.ts b/.eslint-plugin-local/code-no-dangerous-type-assertions.ts similarity index 95% rename from .eslintplugin/code-no-dangerous-type-assertions.ts rename to .eslint-plugin-local/code-no-dangerous-type-assertions.ts index eecd4048e43..233fae02c82 100644 --- a/.eslintplugin/code-no-dangerous-type-assertions.ts +++ b/.eslint-plugin-local/code-no-dangerous-type-assertions.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; export = new class NoDangerousTypeAssertions implements eslint.Rule.RuleModule { diff --git a/.eslintplugin/code-no-global-document-listener.ts b/.eslint-plugin-local/code-no-global-document-listener.ts similarity index 100% rename from .eslintplugin/code-no-global-document-listener.ts rename to .eslint-plugin-local/code-no-global-document-listener.ts diff --git a/.eslintplugin/code-no-native-private.ts b/.eslint-plugin-local/code-no-native-private.ts similarity index 98% rename from .eslintplugin/code-no-native-private.ts rename to .eslint-plugin-local/code-no-native-private.ts index 4d6be23b8f3..e2d20694ca8 100644 --- a/.eslintplugin/code-no-native-private.ts +++ b/.eslint-plugin-local/code-no-native-private.ts @@ -10,7 +10,8 @@ export = new class ApiProviderNaming implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { messages: { slow: 'Native private fields are much slower and should only be used when needed. Ignore this warning if you know what you are doing, use compile-time private otherwise. See https://github.com/microsoft/vscode/issues/185991#issuecomment-1614468158 for details', - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-no-nls-in-standalone-editor.ts b/.eslint-plugin-local/code-no-nls-in-standalone-editor.ts similarity index 98% rename from .eslintplugin/code-no-nls-in-standalone-editor.ts rename to .eslint-plugin-local/code-no-nls-in-standalone-editor.ts index 90c80dee70c..19ad65ee871 100644 --- a/.eslintplugin/code-no-nls-in-standalone-editor.ts +++ b/.eslint-plugin-local/code-no-nls-in-standalone-editor.ts @@ -12,7 +12,8 @@ export = new class NoNlsInStandaloneEditorRule implements eslint.Rule.RuleModule readonly meta: eslint.Rule.RuleMetaData = { messages: { noNls: 'Not allowed to import vs/nls in standalone editor modules. Use standaloneStrings.ts' - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-no-potentially-unsafe-disposables.ts b/.eslint-plugin-local/code-no-potentially-unsafe-disposables.ts similarity index 100% rename from .eslintplugin/code-no-potentially-unsafe-disposables.ts rename to .eslint-plugin-local/code-no-potentially-unsafe-disposables.ts diff --git a/.eslintplugin/code-no-runtime-import.ts b/.eslint-plugin-local/code-no-runtime-import.ts similarity index 100% rename from .eslintplugin/code-no-runtime-import.ts rename to .eslint-plugin-local/code-no-runtime-import.ts diff --git a/.eslintplugin/code-no-standalone-editor.ts b/.eslint-plugin-local/code-no-standalone-editor.ts similarity index 98% rename from .eslintplugin/code-no-standalone-editor.ts rename to .eslint-plugin-local/code-no-standalone-editor.ts index 898886d17d2..3fad6719581 100644 --- a/.eslintplugin/code-no-standalone-editor.ts +++ b/.eslint-plugin-local/code-no-standalone-editor.ts @@ -15,7 +15,8 @@ export = new class NoNlsInStandaloneEditorRule implements eslint.Rule.RuleModule }, docs: { url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization' - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-no-static-self-ref.ts b/.eslint-plugin-local/code-no-static-self-ref.ts similarity index 86% rename from .eslintplugin/code-no-static-self-ref.ts rename to .eslint-plugin-local/code-no-static-self-ref.ts index 7c6e13032ae..52edfb254f6 100644 --- a/.eslintplugin/code-no-static-self-ref.ts +++ b/.eslint-plugin-local/code-no-static-self-ref.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; /** * WORKAROUND for https://github.com/evanw/esbuild/issues/3823 @@ -15,7 +15,7 @@ export = new class implements eslint.Rule.RuleModule { function checkProperty(inNode: any) { - const classDeclaration = context.getAncestors().find(node => node.type === 'ClassDeclaration'); + const classDeclaration = context.sourceCode.getAncestors(inNode).find(node => node.type === 'ClassDeclaration'); const propertyDefinition = inNode; if (!classDeclaration || !classDeclaration.id?.name) { @@ -33,7 +33,7 @@ export = new class implements eslint.Rule.RuleModule { } const name = classDeclaration.id.name; - const valueText = context.getSourceCode().getText(propertyDefinition.value) + const valueText = context.sourceCode.getText(propertyDefinition.value) if (valueText.includes(name + '.')) { diff --git a/.eslintplugin/code-no-test-async-suite.ts b/.eslint-plugin-local/code-no-test-async-suite.ts similarity index 94% rename from .eslintplugin/code-no-test-async-suite.ts rename to .eslint-plugin-local/code-no-test-async-suite.ts index 41d15d28636..7d5fadfad0d 100644 --- a/.eslintplugin/code-no-test-async-suite.ts +++ b/.eslint-plugin-local/code-no-test-async-suite.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; import * as eslint from 'eslint'; function isCallExpression(node: TSESTree.Node): node is TSESTree.CallExpression { diff --git a/.eslintplugin/code-no-test-only.ts b/.eslint-plugin-local/code-no-test-only.ts similarity index 100% rename from .eslintplugin/code-no-test-only.ts rename to .eslint-plugin-local/code-no-test-only.ts diff --git a/.eslintplugin/code-no-unexternalized-strings.ts b/.eslint-plugin-local/code-no-unexternalized-strings.ts similarity index 98% rename from .eslintplugin/code-no-unexternalized-strings.ts rename to .eslint-plugin-local/code-no-unexternalized-strings.ts index 17a8f900efd..abb3980eb54 100644 --- a/.eslintplugin/code-no-unexternalized-strings.ts +++ b/.eslint-plugin-local/code-no-unexternalized-strings.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils'; +import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/utils'; function isStringLiteral(node: TSESTree.Node | null | undefined): node is TSESTree.StringLiteral { return !!node && node.type === AST_NODE_TYPES.Literal && typeof node.value === 'string'; @@ -24,7 +24,8 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule { badKey: 'The key \'{{key}}\' doesn\'t conform to a valid localize identifier.', duplicateKey: 'Duplicate key \'{{key}}\' with different message value.', badMessage: 'Message argument to \'{{message}}\' must be a string literal.' - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/code-no-unused-expressions.ts b/.eslint-plugin-local/code-no-unused-expressions.ts similarity index 97% rename from .eslintplugin/code-no-unused-expressions.ts rename to .eslint-plugin-local/code-no-unused-expressions.ts index 450365de2c6..14f2f53d47f 100644 --- a/.eslintplugin/code-no-unused-expressions.ts +++ b/.eslint-plugin-local/code-no-unused-expressions.ts @@ -12,7 +12,7 @@ */ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; import * as ESTree from 'estree'; //------------------------------------------------------------------------------ @@ -141,7 +141,7 @@ module.exports = { return { ExpressionStatement(node: TSESTree.ExpressionStatement) { - if (!isValidExpression(node.expression) && !isDirective(node, context.getAncestors())) { + if (!isValidExpression(node.expression) && !isDirective(node, context.sourceCode.getAncestors(node))) { context.report({ node: node, message: `Expected an assignment or function call and instead saw an expression. ${node.expression}` }); } } diff --git a/.eslintplugin/code-parameter-properties-must-have-explicit-accessibility.ts b/.eslint-plugin-local/code-parameter-properties-must-have-explicit-accessibility.ts similarity index 95% rename from .eslintplugin/code-parameter-properties-must-have-explicit-accessibility.ts rename to .eslint-plugin-local/code-parameter-properties-must-have-explicit-accessibility.ts index 458afd5b0ba..c9837052fa5 100644 --- a/.eslintplugin/code-parameter-properties-must-have-explicit-accessibility.ts +++ b/.eslint-plugin-local/code-parameter-properties-must-have-explicit-accessibility.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; /** * Enforces that all parameter properties have an explicit access modifier (public, protected, private). diff --git a/.eslintplugin/code-translation-remind.ts b/.eslint-plugin-local/code-translation-remind.ts similarity index 96% rename from .eslintplugin/code-translation-remind.ts rename to .eslint-plugin-local/code-translation-remind.ts index 1ce01107a72..cceaba4c419 100644 --- a/.eslintplugin/code-translation-remind.ts +++ b/.eslint-plugin-local/code-translation-remind.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; import { readFileSync } from 'fs'; import { createImportRuleListener } from './utils'; @@ -16,7 +16,8 @@ export = new class TranslationRemind implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { messages: { missing: 'Please add \'{{resource}}\' to ./build/lib/i18n.resources.json file to use translations here.' - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/index.js b/.eslint-plugin-local/index.js similarity index 100% rename from .eslintplugin/index.js rename to .eslint-plugin-local/index.js diff --git a/.eslintplugin/package.json b/.eslint-plugin-local/package.json similarity index 100% rename from .eslintplugin/package.json rename to .eslint-plugin-local/package.json diff --git a/.eslintplugin/tsconfig.json b/.eslint-plugin-local/tsconfig.json similarity index 100% rename from .eslintplugin/tsconfig.json rename to .eslint-plugin-local/tsconfig.json diff --git a/.eslintplugin/utils.ts b/.eslint-plugin-local/utils.ts similarity index 95% rename from .eslintplugin/utils.ts rename to .eslint-plugin-local/utils.ts index 428832e9cf9..b7457884f85 100644 --- a/.eslintplugin/utils.ts +++ b/.eslint-plugin-local/utils.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; export function createImportRuleListener(validateImport: (node: TSESTree.Literal, value: string) => any): eslint.Rule.RuleListener { diff --git a/.eslintplugin/vscode-dts-cancellation.ts b/.eslint-plugin-local/vscode-dts-cancellation.ts similarity index 92% rename from .eslintplugin/vscode-dts-cancellation.ts rename to .eslint-plugin-local/vscode-dts-cancellation.ts index 6e253a898ca..5e8e875af21 100644 --- a/.eslintplugin/vscode-dts-cancellation.ts +++ b/.eslint-plugin-local/vscode-dts-cancellation.ts @@ -4,14 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { AST_NODE_TYPES, TSESTree } from '@typescript-eslint/experimental-utils'; +import { AST_NODE_TYPES, TSESTree } from '@typescript-eslint/utils'; export = new class ApiProviderNaming implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { messages: { noToken: 'Function lacks a cancellation token, preferable as last argument', - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/vscode-dts-create-func.ts b/.eslint-plugin-local/vscode-dts-create-func.ts similarity index 91% rename from .eslintplugin/vscode-dts-create-func.ts rename to .eslint-plugin-local/vscode-dts-create-func.ts index 295d099da7c..01db244ce76 100644 --- a/.eslintplugin/vscode-dts-create-func.ts +++ b/.eslint-plugin-local/vscode-dts-create-func.ts @@ -4,13 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils'; +import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/utils'; export = new class ApiLiteralOrTypes implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { docs: { url: 'https://github.com/microsoft/vscode/wiki/Extension-API-guidelines#creating-objects' }, - messages: { sync: '`createXYZ`-functions are constructor-replacements and therefore must return sync', } + messages: { sync: '`createXYZ`-functions are constructor-replacements and therefore must return sync', }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/vscode-dts-event-naming.ts b/.eslint-plugin-local/vscode-dts-event-naming.ts similarity index 96% rename from .eslintplugin/vscode-dts-event-naming.ts rename to .eslint-plugin-local/vscode-dts-event-naming.ts index 5e767c6e257..c27d934f4f9 100644 --- a/.eslintplugin/vscode-dts-event-naming.ts +++ b/.eslint-plugin-local/vscode-dts-event-naming.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils'; +import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/utils'; export = new class ApiEventNaming implements eslint.Rule.RuleModule { @@ -19,7 +19,8 @@ export = new class ApiEventNaming implements eslint.Rule.RuleModule { verb: 'Unknown verb \'{{verb}}\' - is this really a verb? Iff so, then add this verb to the configuration', subject: 'Unknown subject \'{{subject}}\' - This subject has not been used before but it should refer to something in the API', unknown: 'UNKNOWN event declaration, lint-rule needs tweaking' - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/vscode-dts-interface-naming.ts b/.eslint-plugin-local/vscode-dts-interface-naming.ts similarity index 92% rename from .eslintplugin/vscode-dts-interface-naming.ts rename to .eslint-plugin-local/vscode-dts-interface-naming.ts index 59112bcb29d..6b33f9c5343 100644 --- a/.eslintplugin/vscode-dts-interface-naming.ts +++ b/.eslint-plugin-local/vscode-dts-interface-naming.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; export = new class ApiInterfaceNaming implements eslint.Rule.RuleModule { @@ -13,7 +13,8 @@ export = new class ApiInterfaceNaming implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { messages: { naming: 'Interfaces must not be prefixed with uppercase `I`', - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/vscode-dts-literal-or-types.ts b/.eslint-plugin-local/vscode-dts-literal-or-types.ts similarity index 87% rename from .eslintplugin/vscode-dts-literal-or-types.ts rename to .eslint-plugin-local/vscode-dts-literal-or-types.ts index 01d1d1d8586..44ef0fd2a7c 100644 --- a/.eslintplugin/vscode-dts-literal-or-types.ts +++ b/.eslint-plugin-local/vscode-dts-literal-or-types.ts @@ -4,13 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; export = new class ApiLiteralOrTypes implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { docs: { url: 'https://github.com/microsoft/vscode/wiki/Extension-API-guidelines#enums' }, - messages: { useEnum: 'Use enums, not literal-or-types', } + messages: { useEnum: 'Use enums, not literal-or-types', }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/vscode-dts-provider-naming.ts b/.eslint-plugin-local/vscode-dts-provider-naming.ts similarity index 94% rename from .eslintplugin/vscode-dts-provider-naming.ts rename to .eslint-plugin-local/vscode-dts-provider-naming.ts index 284f123420f..db8350dd9bc 100644 --- a/.eslintplugin/vscode-dts-provider-naming.ts +++ b/.eslint-plugin-local/vscode-dts-provider-naming.ts @@ -4,14 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; export = new class ApiProviderNaming implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { messages: { naming: 'A provider should only have functions like provideXYZ or resolveXYZ', - } + }, + schema: false, }; private static _providerFunctionNames = /^(provide|resolve|prepare).+/; diff --git a/.eslintplugin/vscode-dts-region-comments.ts b/.eslint-plugin-local/vscode-dts-region-comments.ts similarity index 98% rename from .eslintplugin/vscode-dts-region-comments.ts rename to .eslint-plugin-local/vscode-dts-region-comments.ts index 63139a50e3b..b08dc6357bb 100644 --- a/.eslintplugin/vscode-dts-region-comments.ts +++ b/.eslint-plugin-local/vscode-dts-region-comments.ts @@ -10,7 +10,8 @@ export = new class ApiEventNaming implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { messages: { comment: 'region comments should start with a camel case identifier, `:`, then either a GH issue link or owner, e.g #region myProposalName: https://github.com/microsoft/vscode/issues/', - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/vscode-dts-string-type-literals.ts b/.eslint-plugin-local/vscode-dts-string-type-literals.ts similarity index 79% rename from .eslintplugin/vscode-dts-string-type-literals.ts rename to .eslint-plugin-local/vscode-dts-string-type-literals.ts index 8c3ead14427..bca084c4af6 100644 --- a/.eslintplugin/vscode-dts-string-type-literals.ts +++ b/.eslint-plugin-local/vscode-dts-string-type-literals.ts @@ -4,21 +4,21 @@ *--------------------------------------------------------------------------------------------*/ import * as eslint from 'eslint'; -import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { TSESTree } from '@typescript-eslint/utils'; export = new class ApiTypeDiscrimination implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { docs: { url: 'https://github.com/microsoft/vscode/wiki/Extension-API-guidelines' }, messages: { - noTypeDiscrimination: 'Do not use type descrimination properties' - } + noTypeDiscrimination: 'Do not use type discrimination properties' + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { return { - ['TSPropertySignature[optional=undefined] TSTypeAnnotation TSLiteralType Literal']: (node: any) => { - + ['TSPropertySignature[optional=false] TSTypeAnnotation TSLiteralType Literal']: (node: any) => { const raw = String((node).raw) if (/^('|").*\1$/.test(raw)) { diff --git a/.eslintplugin/vscode-dts-use-thenable.ts b/.eslint-plugin-local/vscode-dts-use-thenable.ts similarity index 97% rename from .eslintplugin/vscode-dts-use-thenable.ts rename to .eslint-plugin-local/vscode-dts-use-thenable.ts index 51112482099..683394ad115 100644 --- a/.eslintplugin/vscode-dts-use-thenable.ts +++ b/.eslint-plugin-local/vscode-dts-use-thenable.ts @@ -10,7 +10,8 @@ export = new class ApiEventNaming implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { messages: { usage: 'Use the Thenable-type instead of the Promise type', - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintplugin/vscode-dts-vscode-in-comments.ts b/.eslint-plugin-local/vscode-dts-vscode-in-comments.ts similarity index 98% rename from .eslintplugin/vscode-dts-vscode-in-comments.ts rename to .eslint-plugin-local/vscode-dts-vscode-in-comments.ts index 8ced8eb25fd..80d3b7003d7 100644 --- a/.eslintplugin/vscode-dts-vscode-in-comments.ts +++ b/.eslint-plugin-local/vscode-dts-vscode-in-comments.ts @@ -11,7 +11,8 @@ export = new class ApiVsCodeInComments implements eslint.Rule.RuleModule { readonly meta: eslint.Rule.RuleMetaData = { messages: { comment: `Don't use the term 'vs code' in comments` - } + }, + schema: false, }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index a742b0ae304..00000000000 --- a/.eslintignore +++ /dev/null @@ -1,37 +0,0 @@ -**/build/*/**/*.js -**/dist/**/*.js -**/extensions/**/*.d.ts -**/extensions/**/build/** -**/extensions/**/colorize-fixtures/** -**/extensions/css-language-features/server/test/pathCompletionFixtures/** -**/extensions/html-language-features/server/lib/jquery.d.ts -**/extensions/html-language-features/server/src/test/pathCompletionFixtures/** -**/extensions/ipynb/notebook-out/** -**/extensions/markdown-language-features/media/** -**/extensions/markdown-language-features/notebook-out/** -**/extensions/markdown-math/notebook-out/** -**/extensions/notebook-renderers/renderer-out/index.js -**/extensions/simple-browser/media/index.js -**/extensions/typescript-language-features/test-workspace/** -**/extensions/typescript-language-features/extension.webpack.config.js -**/extensions/typescript-language-features/extension-browser.webpack.config.js -**/extensions/typescript-language-features/package-manager/node-maintainer/** -**/extensions/vscode-api-tests/testWorkspace/** -**/extensions/vscode-api-tests/testWorkspace2/** -**/fixtures/** -**/node_modules/** -**/out-*/**/*.js -**/out-editor-*/** -**/out/**/*.js -**/src/**/dompurify.js -**/src/**/marked.js -**/src/**/semver.js -**/src/typings/**/*.d.ts -**/src/vs/*/**/*.d.ts -**/src/vs/base/test/common/filters.perf.data.js -**/src/vs/loader.js -**/test/unit/assert.js -**/test/unit/assert-esm.js -**/test/automation/out/** -**/typings/** -!.vscode diff --git a/.eslintignore.json b/.eslintignore.json new file mode 100644 index 00000000000..2a09758cc55 --- /dev/null +++ b/.eslintignore.json @@ -0,0 +1,39 @@ +[ + "**/build/*/**/*.js", + "**/dist/**/*.js", + "**/extensions/**/*.d.ts", + "**/extensions/**/build/**", + "**/extensions/**/colorize-fixtures/**", + "**/extensions/css-language-features/server/test/pathCompletionFixtures/**", + "**/extensions/html-language-features/server/lib/jquery.d.ts", + "**/extensions/html-language-features/server/src/test/pathCompletionFixtures/**", + "**/extensions/ipynb/notebook-out/**", + "**/extensions/markdown-language-features/media/**", + "**/extensions/markdown-language-features/notebook-out/**", + "**/extensions/markdown-math/notebook-out/**", + "**/extensions/notebook-renderers/renderer-out/index.js", + "**/extensions/simple-browser/media/index.js", + "**/extensions/typescript-language-features/test-workspace/**", + "**/extensions/typescript-language-features/extension.webpack.config.js", + "**/extensions/typescript-language-features/extension-browser.webpack.config.js", + "**/extensions/typescript-language-features/package-manager/node-maintainer/**", + "**/extensions/vscode-api-tests/testWorkspace/**", + "**/extensions/vscode-api-tests/testWorkspace2/**", + "**/fixtures/**", + "**/node_modules/**", + "**/out-*/**/*.js", + "**/out-editor-*/**", + "**/out/**/*.js", + "**/src/**/dompurify.js", + "**/src/**/marked.js", + "**/src/**/semver.js", + "**/src/typings/**/*.d.ts", + "**/src/vs/*/**/*.d.ts", + "**/src/vs/base/test/common/filters.perf.data.js", + "**/src/vs/loader.js", + "**/test/unit/assert.js", + "**/test/unit/assert-esm.js", + "**/test/automation/out/**", + "**/typings/**", + "!.vscode" +] diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 9eb9f6fa6bc..00000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,1236 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint", - "jsdoc", - "header", - "local" - ], - "rules": { - "constructor-super": "warn", - "curly": "warn", - "eqeqeq": "warn", - "prefer-const": [ - "warn", - { - "destructuring": "all" - } - ], - "no-buffer-constructor": "warn", - "no-caller": "warn", - "no-case-declarations": "warn", - "no-debugger": "warn", - "no-duplicate-case": "warn", - "no-duplicate-imports": "warn", - "no-eval": "warn", - "no-async-promise-executor": "warn", - "no-extra-semi": "warn", - "no-new-wrappers": "warn", - "no-redeclare": "off", - "no-sparse-arrays": "warn", - "no-throw-literal": "warn", - "no-unsafe-finally": "warn", - "no-unused-labels": "warn", - "no-restricted-globals": [ - "warn", - "name", - "length", - "event", - "closed", - "external", - "status", - "origin", - "orientation", - "context" - ], // non-complete list of globals that are easy to access unintentionally - "no-var": "warn", - "jsdoc/no-types": "warn", - "semi": "off", - "@typescript-eslint/semi": "warn", - "@typescript-eslint/member-delimiter-style": "warn", - "@typescript-eslint/naming-convention": [ - "warn", - { - "selector": "class", - "format": [ - "PascalCase" - ] - } - ], - "local/code-no-unused-expressions": [ - "warn", - { - "allowTernary": true - } - ], - "local/code-translation-remind": "warn", - "local/code-no-native-private": "warn", - "local/code-parameter-properties-must-have-explicit-accessibility": "warn", - "local/code-no-nls-in-standalone-editor": "warn", - "local/code-no-potentially-unsafe-disposables": "warn", - "local/code-no-dangerous-type-assertions": "off", - "local/code-no-standalone-editor": "warn", - "local/code-no-unexternalized-strings": "warn", - "local/code-must-use-super-dispose": "warn", - "local/code-declare-service-brand": "warn", - "local/code-layering": [ - "warn", - { - "common": [], - "node": [ - "common" - ], - "browser": [ - "common" - ], - "electron-sandbox": [ - "common", - "browser" - ], - "electron-utility": [ - "common", - "node" - ], - "electron-main": [ - "common", - "node", - "electron-utility" - ] - } - ], - "header/header": [ - 2, - "block", - [ - "---------------------------------------------------------------------------------------------", - " * Copyright (c) Microsoft Corporation. All rights reserved.", - " * Licensed under the MIT License. See License.txt in the project root for license information.", - " *--------------------------------------------------------------------------------------------" - ] - ] - }, - "overrides": [ - { - "files": [ - "*.js" - ], - "rules": { - "jsdoc/no-types": "off" - } - }, - { - "files": [ - "**/*.test.ts" - ], - "rules": { - "local/code-must-use-super-dispose": "off", - "local/code-no-test-only": "error", - "local/code-no-test-async-suite": "warn", - "local/code-no-unexternalized-strings": "off", - "local/code-must-use-result": [ - "warn", - [ - { - "message": "Expression must be awaited", - "functions": [ - "assertSnapshot", - "assertHeap" - ] - } - ] - ] - } - }, - { - "files": [ - "src/**/*.ts" - ], - "rules": { - "local/code-no-static-self-ref": "warn" - } - }, - { - "files": [ - "src/vs/**/*.test.ts" - ], - "rules": { - "local/code-ensure-no-disposables-leak-in-test": [ - "warn", - { - // Files should (only) be removed from the list they adopt the leak detector - "exclude": [ - "src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts", - "src/vs/platform/configuration/test/common/configuration.test.ts", - "src/vs/platform/opener/test/common/opener.test.ts", - "src/vs/platform/registry/test/common/platform.test.ts", - "src/vs/platform/workspace/test/common/workspace.test.ts", - "src/vs/platform/workspaces/test/electron-main/workspaces.test.ts", - "src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts", - "src/vs/workbench/api/test/node/extHostTunnelService.test.ts", - "src/vs/workbench/contrib/bulkEdit/test/browser/bulkCellEdits.test.ts", - "src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts", - "src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts", - "src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts", - "src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts", - "src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts", - "src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts", - "src/vs/workbench/contrib/tasks/test/common/taskConfiguration.test.ts", - "src/vs/workbench/services/commands/test/common/commandService.test.ts", - "src/vs/workbench/services/userActivity/test/browser/domActivityTracker.test.ts", - "src/vs/workbench/test/browser/quickAccess.test.ts" - ] - } - ] - } - }, - { - "files": [ - "**/vscode.d.ts", - "**/vscode.proposed.*.d.ts" - ], - "rules": { - "local/vscode-dts-create-func": "warn", - "local/vscode-dts-literal-or-types": "warn", - "local/vscode-dts-string-type-literals": "warn", - "local/vscode-dts-interface-naming": "warn", - "local/vscode-dts-cancellation": "warn", - "local/vscode-dts-use-thenable": "warn", - "local/vscode-dts-region-comments": "warn", - "local/vscode-dts-vscode-in-comments": "warn", - "local/vscode-dts-provider-naming": [ - "warn", - { - "allowed": [ - "FileSystemProvider", - "TreeDataProvider", - "TestProvider", - "CustomEditorProvider", - "CustomReadonlyEditorProvider", - "TerminalLinkProvider", - "AuthenticationProvider", - "NotebookContentProvider" - ] - } - ], - "local/vscode-dts-event-naming": [ - "warn", - { - "allowed": [ - "onCancellationRequested", - "event" - ], - "verbs": [ - "accept", - "change", - "close", - "collapse", - "create", - "delete", - "discover", - "dispose", - "drop", - "edit", - "end", - "execute", - "expand", - "grant", - "hide", - "invalidate", - "open", - "override", - "perform", - "receive", - "register", - "remove", - "rename", - "save", - "send", - "start", - "terminate", - "trigger", - "unregister", - "write" - ] - } - ] - } - }, - { - "files": [ - "**/vscode.d.ts" - ], - "rules": { - "jsdoc/tag-lines": "off", - "jsdoc/valid-types": "off", - "jsdoc/no-multi-asterisks": [ - "warn", - { - "allowWhitespace": true - } - ], - "jsdoc/require-jsdoc": [ - "warn", - { - "enableFixer": false, - "contexts": [ - "TSInterfaceDeclaration", - "TSPropertySignature", - "TSMethodSignature", - "TSDeclareFunction", - "ClassDeclaration", - "MethodDefinition", - "PropertyDeclaration", - "TSEnumDeclaration", - "TSEnumMember", - "ExportNamedDeclaration" - ] - } - ], - "jsdoc/check-param-names": [ - "warn", - { - "enableFixer": false, - "checkDestructured": false - } - ], - "jsdoc/require-returns": "warn" - } - }, - { - "files": [ - "src/**/{common,browser}/**/*.ts" - ], - "rules": { - "local/code-amd-node-module": "warn" - } - }, - { - "files": [ - "src/**/{browser,electron-sandbox}/**/*.ts" - ], - "rules": { - "local/code-no-global-document-listener": "warn", - "no-restricted-syntax": [ - "warn", - { - "selector": "BinaryExpression[operator='instanceof'][right.name='MouseEvent']", - "message": "Use DOM.isMouseEvent() to support multi-window scenarios." - }, - { - "selector": "BinaryExpression[operator='instanceof'][right.name=/^HTML\\w+/]", - "message": "Use DOM.isHTMLElement() and related methods to support multi-window scenarios." - }, - { - "selector": "BinaryExpression[operator='instanceof'][right.name='KeyboardEvent']", - "message": "Use DOM.isKeyboardEvent() to support multi-window scenarios." - }, - { - "selector": "BinaryExpression[operator='instanceof'][right.name='PointerEvent']", - "message": "Use DOM.isPointerEvent() to support multi-window scenarios." - }, - { - "selector": "BinaryExpression[operator='instanceof'][right.name='DragEvent']", - "message": "Use DOM.isDragEvent() to support multi-window scenarios." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='activeElement']", - "message": "Use .document.activeElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='contains']", - "message": "Use .document.contains to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='styleSheets']", - "message": "Use .document.styleSheets to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='fullscreenElement']", - "message": "Use .document.fullscreenElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='body']", - "message": "Use .document.body to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='addEventListener']", - "message": "Use .document.addEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='removeEventListener']", - "message": "Use .document.removeEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='hasFocus']", - "message": "Use .document.hasFocus to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='head']", - "message": "Use .document.head to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='exitFullscreen']", - "message": "Use .document.exitFullscreen to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='getElementById']", - "message": "Use .document.getElementById to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='getElementsByClassName']", - "message": "Use .document.getElementsByClassName to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='getElementsByName']", - "message": "Use .document.getElementsByName to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='getElementsByTagName']", - "message": "Use .document.getElementsByTagName to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='getElementsByTagNameNS']", - "message": "Use .document.getElementsByTagNameNS to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='getSelection']", - "message": "Use .document.getSelection to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='open']", - "message": "Use .document.open to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='close']", - "message": "Use .document.close to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='documentElement']", - "message": "Use .document.documentElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='visibilityState']", - "message": "Use .document.visibilityState to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='querySelector']", - "message": "Use .document.querySelector to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='querySelectorAll']", - "message": "Use .document.querySelectorAll to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='elementFromPoint']", - "message": "Use .document.elementFromPoint to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='elementsFromPoint']", - "message": "Use .document.elementsFromPoint to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='onkeydown']", - "message": "Use .document.onkeydown to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='onkeyup']", - "message": "Use .document.onkeyup to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='onmousedown']", - "message": "Use .document.onmousedown to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='onmouseup']", - "message": "Use .document.onmouseup to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "selector": "MemberExpression[object.name='document'][property.name='execCommand']", - "message": "Use .document.execCommand to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - } - ], - "no-restricted-globals": [ - "warn", - "name", - "length", - "event", - "closed", - "external", - "status", - "origin", - "orientation", - "context", - { - "name": "setInterval", - "message": "Use .setInterval to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "clearInterval", - "message": "Use .clearInterval to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "requestAnimationFrame", - "message": "Use .requestAnimationFrame to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "cancelAnimationFrame", - "message": "Use .cancelAnimationFrame to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "requestIdleCallback", - "message": "Use .requestIdleCallback to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "cancelIdleCallback", - "message": "Use .cancelIdleCallback to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "window", - "message": "Use to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "addEventListener", - "message": "Use .addEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "removeEventListener", - "message": "Use .removeEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "getComputedStyle", - "message": "Use .getComputedStyle to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "focus", - "message": "Use .focus to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "blur", - "message": "Use .blur to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "close", - "message": "Use .close to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "dispatchEvent", - "message": "Use .dispatchEvent to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "getSelection", - "message": "Use .getSelection to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "matchMedia", - "message": "Use .matchMedia to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "open", - "message": "Use .open to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "parent", - "message": "Use .parent to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "postMessage", - "message": "Use .postMessage to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "devicePixelRatio", - "message": "Use .devicePixelRatio to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "frames", - "message": "Use .frames to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "frameElement", - "message": "Use .frameElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "innerHeight", - "message": "Use .innerHeight to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "innerWidth", - "message": "Use .innerWidth to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "outerHeight", - "message": "Use .outerHeight to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "outerWidth", - "message": "Use .outerWidth to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "opener", - "message": "Use .opener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "origin", - "message": "Use .origin to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "screen", - "message": "Use .screen to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "screenLeft", - "message": "Use .screenLeft to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "screenTop", - "message": "Use .screenTop to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "screenX", - "message": "Use .screenX to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "screenY", - "message": "Use .screenY to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "scrollX", - "message": "Use .scrollX to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "scrollY", - "message": "Use .scrollY to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "top", - "message": "Use .top to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - }, - { - "name": "visualViewport", - "message": "Use .visualViewport to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant." - } - ] - } - }, - { - "files": [ - "src/**/electron-utility/**/*.ts" - ], - "rules": { - "no-restricted-imports": [ - "warn", - { - "paths": [ - { - "name": "electron", - "importNames": [ - "app", - "autoUpdater", - "BaseWindow", - "BrowserWindow", - "contentTracing", - "desktopCapturer", - "dialog", - "globalShortcut", - "inAppPurchase", - "ipcMain", - "Menu", - "MenuItem", - "MessageChannelMain", - "MessagePortMain", - "nativeTheme", - "netLog", - "Notification", - "powerMonitor", - "powerSaveBlocker", - "protocol", - "pushNotifications", - "safeStorage", - "screen", - "session", - "ShareMenu", - "TouchBar", - "Tray", - "utilityProcess", - "View", - "webContents", - "webFrameMain", - "webContentsView", - "default" - ], - "message": "Only net and system-preferences are allowed to be imported from electron" - } - ] - } - ] - } - }, - { - "files": [ - "src/**/*.ts" - ], - "rules": { - "local/code-import-patterns": [ - "warn", - { - // imports that are allowed in all files of layers: - // - browser - // - electron-sandbox - "when": "hasBrowser", - "allow": [] - }, - { - // imports that are allowed in all files of layers: - // - node - // - electron-utility - // - electron-main - "when": "hasNode", - "allow": [ - "@parcel/watcher", - "@vscode/sqlite3", - "@vscode/vscode-languagedetection", - "@vscode/ripgrep", - "@vscode/iconv-lite-umd", - "@vscode/policy-watcher", - "@vscode/proxy-agent", - "@vscode/spdlog", - "@vscode/windows-process-tree", - "assert", - "child_process", - "console", - "cookie", - "crypto", - "dns", - "events", - "fs", - "fs/promises", - "http", - "https", - "minimist", - "node:module", - "native-keymap", - "native-watchdog", - "net", - "node-pty", - "os", - "path", - "perf_hooks", - "readline", - "stream", - "string_decoder", - "tas-client-umd", - "tls", - "url", - "util", - "v8-inspect-profiler", - "vscode-regexpp", - "vscode-textmate", - "worker_threads", - "@xterm/addon-clipboard", - "@xterm/addon-image", - "@xterm/addon-search", - "@xterm/addon-serialize", - "@xterm/addon-unicode11", - "@xterm/addon-webgl", - "@xterm/headless", - "@xterm/xterm", - "yauzl", - "yazl", - "zlib" - ] - }, - { - // imports that are allowed in all files of layers: - // - electron-utility - // - electron-main - "when": "hasElectron", - "allow": [ - "electron" - ] - }, - { - // imports that are allowed in all /test/ files - "when": "test", - "allow": [ - "assert", - "sinon", - "sinon-test" - ] - }, - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // !!! Do not relax these rules !!! - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // - // A path ending in /~ has a special meaning. It indicates a template position - // which will be substituted with one or more layers. - // - // When /~ is used in the target, the rule will be expanded to 14 distinct rules. - // e.g. "src/vs/base/~" will be expanded to: - // - src/vs/base/common - // - src/vs/base/worker - // - src/vs/base/browser - // - src/vs/base/electron-sandbox - // - src/vs/base/node - // - src/vs/base/electron-main - // - src/vs/base/test/common - // - src/vs/base/test/worker - // - src/vs/base/test/browser - // - src/vs/base/test/electron-sandbox - // - src/vs/base/test/node - // - src/vs/base/test/electron-main - // - // When /~ is used in the restrictions, it will be replaced with the correct - // layers that can be used e.g. "src/vs/base/electron-sandbox" will be able - // to import "{common,browser,electron-sanbox}", etc. - // - // It is possible to use /~ in the restrictions property even without using it in - // the target property by adding a layer property. - { - "target": "src/vs/base/~", - "restrictions": [ - "vs/base/~" - ] - }, - { - "target": "src/vs/base/parts/*/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~" - ] - }, - { - "target": "src/vs/platform/*/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "tas-client-umd", // node module allowed even in /common/ - "@microsoft/1ds-core-js", // node module allowed even in /common/ - "@microsoft/1ds-post-js", // node module allowed even in /common/ - "@xterm/headless" // node module allowed even in /common/ - ] - }, - { - "target": "src/vs/editor/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "@vscode/tree-sitter-wasm" // node module allowed even in /common/ - ] - }, - { - "target": "src/vs/editor/contrib/*/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~" - ] - }, - { - "target": "src/vs/editor/standalone/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/editor/standalone/~", - "@vscode/tree-sitter-wasm" // type import - ] - }, - { - "target": "src/vs/editor/editor.all.ts", - "layer": "browser", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~" - ] - }, - { - "target": "src/vs/editor/editor.worker.ts", - "layer": "worker", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~" - ] - }, - { - "target": "src/vs/editor/{editor.api.ts,editor.main.ts}", - "layer": "browser", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/editor/standalone/~", - "vs/editor/*" - ] - }, - { - "target": "src/vs/workbench/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/workbench/~", - "vs/workbench/services/*/~", - "assert", - { - "when": "test", - "pattern": "vs/workbench/contrib/*/~" - } // TODO@layers - ] - }, - { - "target": "src/vs/workbench/api/~", - "restrictions": [ - "vscode", - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/workbench/api/~", - "vs/workbench/~", - "vs/workbench/services/*/~", - "vs/workbench/contrib/*/~", - "vs/workbench/contrib/terminalContrib/*/~" - ] - }, - { - "target": "src/vs/workbench/services/*/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/workbench/~", - "vs/workbench/services/*/~", - { - "when": "test", - "pattern": "vs/workbench/contrib/*/~" - }, // TODO@layers - "tas-client-umd", // node module allowed even in /common/ - "vscode-textmate", // node module allowed even in /common/ - "@vscode/vscode-languagedetection", // node module allowed even in /common/ - "@vscode/tree-sitter-wasm", // type import - { - "when": "hasBrowser", - "pattern": "@xterm/xterm" - } // node module allowed even in /browser/ - ] - }, - { - "target": "src/vs/workbench/contrib/*/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/workbench/~", - "vs/workbench/services/*/~", - "vs/workbench/contrib/*/~", - "vs/workbench/contrib/terminal/terminalContribChatExports*", - "vs/workbench/contrib/terminal/terminalContribExports*", - "vscode-notebook-renderer", // Type only import - "@vscode/tree-sitter-wasm", // type import - { - "when": "hasBrowser", - "pattern": "@xterm/xterm" - }, // node module allowed even in /browser/ - { - "when": "hasBrowser", - "pattern": "@xterm/addon-*" - }, // node module allowed even in /browser/ - { - "when": "hasBrowser", - "pattern": "vscode-textmate" - } // node module allowed even in /browser/ - ] - }, - { - "target": "src/vs/workbench/contrib/terminalContrib/*/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/workbench/~", - "vs/workbench/services/*/~", - "vs/workbench/contrib/*/~", - // Only allow terminalContrib to import from itself, this works because - // terminalContrib is one extra folder deep - "vs/workbench/contrib/terminalContrib/*/~", - "vscode-notebook-renderer", // Type only import - { - "when": "hasBrowser", - "pattern": "@xterm/xterm" - }, // node module allowed even in /browser/ - { - "when": "hasBrowser", - "pattern": "@xterm/addon-*" - }, // node module allowed even in /browser/ - { - "when": "hasBrowser", - "pattern": "vscode-textmate" - }, // node module allowed even in /browser/ - "@xterm/headless" // node module allowed even in /common/ and /browser/ - ] - }, - { - "target": "src/vs/code/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/code/~", - { - "when": "hasBrowser", - "pattern": "vs/workbench/workbench.web.main.js" - }, - { - "when": "hasBrowser", - "pattern": "vs/workbench/workbench.web.main.internal.js" - }, - { - "when": "hasBrowser", - "pattern": "vs/workbench/~" - }, - { - "when": "hasBrowser", - "pattern": "vs/workbench/services/*/~" - } - ] - }, - { - "target": "src/vs/server/~", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/workbench/~", - "vs/workbench/api/~", - "vs/workbench/services/*/~", - "vs/workbench/contrib/*/~", - "vs/server/~" - ] - }, - { - "target": "src/vs/workbench/contrib/terminal/terminal.all.ts", - "layer": "browser", - "restrictions": [ - "vs/workbench/contrib/**" - ] - }, - { - "target": "src/vs/workbench/contrib/terminal/terminalContribChatExports.ts", - "layer": "browser", - "restrictions": [ - "vs/workbench/contrib/terminalContrib/*/~" - ] - }, - { - "target": "src/vs/workbench/contrib/terminal/terminalContribExports.ts", - "layer": "browser", - "restrictions": [ - "vs/platform/*/~", - "vs/workbench/contrib/terminalContrib/*/~" - ] - }, - { - "target": "src/vs/workbench/workbench.common.main.ts", - "layer": "browser", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/editor/editor.all.js", - "vs/workbench/~", - "vs/workbench/api/~", - "vs/workbench/services/*/~", - "vs/workbench/contrib/*/~", - "vs/workbench/contrib/terminal/terminal.all.js" - ] - }, - { - "target": "src/vs/workbench/workbench.web.main.ts", - "layer": "browser", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/editor/editor.all.js", - "vs/workbench/~", - "vs/workbench/api/~", - "vs/workbench/services/*/~", - "vs/workbench/contrib/*/~", - "vs/workbench/workbench.common.main.js" - ] - }, - { - "target": "src/vs/workbench/workbench.web.main.internal.ts", - "layer": "browser", - "restrictions": [ - "vs/base/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/editor/editor.all.js", - "vs/workbench/~", - "vs/workbench/api/~", - "vs/workbench/services/*/~", - "vs/workbench/contrib/*/~", - "vs/workbench/workbench.common.main.js" - ] - }, - { - "target": "src/vs/workbench/workbench.desktop.main.ts", - "layer": "electron-sandbox", - "restrictions": [ - "vs/base/*/~", - "vs/base/parts/*/~", - "vs/platform/*/~", - "vs/editor/~", - "vs/editor/contrib/*/~", - "vs/editor/editor.all.js", - "vs/workbench/~", - "vs/workbench/api/~", - "vs/workbench/services/*/~", - "vs/workbench/contrib/*/~", - "vs/workbench/workbench.common.main.js" - ] - }, - { - "target": "src/vs/amdX.ts", - "restrictions": [ - "vs/base/common/*" - ] - }, - { - "target": "src/vs/{loader.d.ts,monaco.d.ts,nls.ts,nls.messages.ts}", - "restrictions": [] - }, - { - "target": "src/vscode-dts/**", - "restrictions": [] - }, - { - "target": "src/bootstrap-window.ts", - "restrictions": [] - }, - { - "target": "src/{bootstrap-cli.ts,bootstrap-esm.ts,bootstrap-fork.ts,bootstrap-import.ts,bootstrap-meta.ts,bootstrap-node.ts,bootstrap-server.ts,cli.ts,main.ts,server-cli.ts,server-main.ts}", - "restrictions": [ - "vs/**/common/*", - "vs/**/node/*", - "vs/nls.js", - "src/*.js", - "*" // node.js - ] - } - ] - } - }, - { - "files": [ - "test/**/*.ts" - ], - "rules": { - "local/code-import-patterns": [ - "warn", - { - "target": "test/smoke/**", - "restrictions": [ - "test/automation", - "test/smoke/**", - "@vscode/*", - "@parcel/*", - "@playwright/*", - "*" // node modules - ] - }, - { - "target": "test/automation/**", - "restrictions": [ - "test/automation/**", - "@vscode/*", - "@parcel/*", - "playwright-core/**", - "@playwright/*", - "*" // node modules - ] - }, - { - "target": "test/integration/**", - "restrictions": [ - "test/integration/**", - "@vscode/*", - "@parcel/*", - "@playwright/*", - "*" // node modules - ] - }, - { - "target": "test/monaco/**", - "restrictions": [ - "test/monaco/**", - "@vscode/*", - "@parcel/*", - "@playwright/*", - "*" // node modules - ] - } - ] - } - }, - { - "files": [ - "src/vs/workbench/contrib/notebook/browser/view/renderers/*.ts" - ], - "rules": { - "local/code-no-runtime-import": [ - "error", - { - "src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts": [ - "**/*" - ] - } - ], - "local/code-limited-top-functions": [ - "error", - { - "src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts": [ - "webviewPreloads", - "preloadsScriptStr" - ] - } - ] - } - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json index 14236b479e2..75cbca16260 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -168,5 +168,6 @@ }, "css.format.spaceAroundSelectorSeparator": true, "typescript.enablePromptUseWorkspaceTsdk": true, - "chat.commandCenter.enabled": true + "chat.commandCenter.enabled": true, + "eslint.useFlatConfig": true } diff --git a/build/filters.js b/build/filters.js index 4e5049f23f0..6759f6680df 100644 --- a/build/filters.js +++ b/build/filters.js @@ -196,10 +196,7 @@ module.exports.tsFormattingFilter = [ module.exports.eslintFilter = [ '**/*.js', '**/*.ts', - ...readFileSync(join(__dirname, '../.eslintignore')) - .toString().split(/\r\n|\n/) - .filter(line => !line.startsWith('#')) - .filter(line => !!line) + ...require(join(__dirname, '..', '.eslintignore.json')) .map(line => line.startsWith('!') ? line.slice(1) : `!${line}`) ]; diff --git a/eslint.config.cjs b/eslint.config.cjs new file mode 100644 index 00000000000..4e61e737d67 --- /dev/null +++ b/eslint.config.cjs @@ -0,0 +1,1311 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check +const fs = require('fs'); +const path = require('path'); +const tseslint = require('typescript-eslint'); +const stylisticTs = require('@stylistic/eslint-plugin-ts'); + +const pluginHeader = require('eslint-plugin-header'); +pluginHeader.rules.header.meta.schema = false; + +const ignores = JSON.parse(fs.readFileSync(path.join(__dirname, '.eslintignore.json'), 'utf8').toString()); + +module.exports = tseslint.config( + // Global ignores + { + ignores, + }, + { + files: [ + 'src/**/*.ts', + ], + languageOptions: { + parser: tseslint.parser, + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module', + project: path.join(__dirname, 'src', 'tsconfig.json'), + } + }, + plugins: { + '@stylistic/ts': stylisticTs, + '@typescript-eslint': tseslint.plugin, + 'local': require('eslint-plugin-local'), + 'header': pluginHeader, + 'jsdoc': require('eslint-plugin-jsdoc'), + }, + rules: { + '@stylistic/ts/semi': 'warn', + '@stylistic/ts/member-delimiter-style': 'warn', + '@typescript-eslint/naming-convention': [ + 'warn', + { + 'selector': 'class', + 'format': [ + 'PascalCase' + ] + } + ], + 'local/code-no-unused-expressions': [ + 'warn', + { + 'allowTernary': true + } + ], + 'jsdoc/no-types': 'warn', + 'local/code-no-static-self-ref': 'warn' + } + }, + { + plugins: { + 'local': require('eslint-plugin-local'), + 'header': pluginHeader, + }, + rules: { + 'constructor-super': 'warn', + 'curly': 'warn', + 'eqeqeq': 'warn', + 'prefer-const': [ + 'warn', + { + 'destructuring': 'all' + } + ], + 'no-buffer-constructor': 'warn', + 'no-caller': 'warn', + 'no-case-declarations': 'warn', + 'no-debugger': 'warn', + 'no-duplicate-case': 'warn', + 'no-duplicate-imports': 'warn', + 'no-eval': 'warn', + 'no-async-promise-executor': 'warn', + 'no-extra-semi': 'warn', + 'no-new-wrappers': 'warn', + 'no-redeclare': 'off', + 'no-sparse-arrays': 'warn', + 'no-throw-literal': 'warn', + 'no-unsafe-finally': 'warn', + 'no-unused-labels': 'warn', + 'no-control-regex': 'warn', + 'no-misleading-character-class': 'warn', + 'no-restricted-globals': [ + 'warn', + 'name', + 'length', + 'event', + 'closed', + 'external', + 'status', + 'origin', + 'orientation', + 'context' + ], // non-complete list of globals that are easy to access unintentionally + 'no-var': 'warn', + 'semi': 'off', + 'local/code-translation-remind': 'warn', + 'local/code-no-native-private': 'warn', + 'local/code-parameter-properties-must-have-explicit-accessibility': 'warn', + 'local/code-no-nls-in-standalone-editor': 'warn', + 'local/code-no-potentially-unsafe-disposables': 'warn', + 'local/code-no-dangerous-type-assertions': 'warn', + 'local/code-no-standalone-editor': 'warn', + 'local/code-no-unexternalized-strings': 'warn', + 'local/code-must-use-super-dispose': 'warn', + 'local/code-declare-service-brand': 'warn', + 'local/code-layering': [ + 'warn', + { + 'common': [], + 'node': [ + 'common' + ], + 'browser': [ + 'common' + ], + 'electron-sandbox': [ + 'common', + 'browser' + ], + 'electron-utility': [ + 'common', + 'node' + ], + 'electron-main': [ + 'common', + 'node', + 'electron-utility' + ] + } + ], + 'header/header': [ + 2, + 'block', + [ + '---------------------------------------------------------------------------------------------', + ' * Copyright (c) Microsoft Corporation. All rights reserved.', + ' * Licensed under the MIT License. See License.txt in the project root for license information.', + ' *--------------------------------------------------------------------------------------------' + ] + ] + }, + }, + { + files: [ + '**/*.test.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + plugins: { + 'local': require('eslint-plugin-local'), + }, + rules: { + 'local/code-must-use-super-dispose': 'off', + 'local/code-no-test-only': 'error', + 'local/code-no-test-async-suite': 'warn', + 'local/code-no-unexternalized-strings': 'off', + 'local/code-must-use-result': [ + 'warn', + [ + { + 'message': 'Expression must be awaited', + 'functions': [ + 'assertSnapshot', + 'assertHeap' + ] + } + ] + ] + } + }, + { + files: [ + 'src/vs/**/*.test.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + plugins: { + 'local': require('eslint-plugin-local'), + }, + rules: { + 'local/code-ensure-no-disposables-leak-in-test': [ + 'warn', + { + // Files should (only) be removed from the list they adopt the leak detector + 'exclude': [ + 'src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts', + 'src/vs/platform/configuration/test/common/configuration.test.ts', + 'src/vs/platform/opener/test/common/opener.test.ts', + 'src/vs/platform/registry/test/common/platform.test.ts', + 'src/vs/platform/workspace/test/common/workspace.test.ts', + 'src/vs/platform/workspaces/test/electron-main/workspaces.test.ts', + 'src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts', + 'src/vs/workbench/api/test/node/extHostTunnelService.test.ts', + 'src/vs/workbench/contrib/bulkEdit/test/browser/bulkCellEdits.test.ts', + 'src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts', + 'src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts', + 'src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts', + 'src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts', + 'src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts', + 'src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts', + 'src/vs/workbench/contrib/tasks/test/common/taskConfiguration.test.ts', + 'src/vs/workbench/services/commands/test/common/commandService.test.ts', + 'src/vs/workbench/services/userActivity/test/browser/domActivityTracker.test.ts', + 'src/vs/workbench/test/browser/quickAccess.test.ts' + ] + } + ] + } + }, + { + files: [ + '**/vscode.d.ts', + '**/vscode.proposed.*.d.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + plugins: { + 'local': require('eslint-plugin-local'), + }, + rules: { + 'local/vscode-dts-create-func': 'warn', + 'local/vscode-dts-literal-or-types': 'warn', + 'local/vscode-dts-string-type-literals': 'warn', + 'local/vscode-dts-interface-naming': 'warn', + 'local/vscode-dts-cancellation': 'warn', + 'local/vscode-dts-use-thenable': 'warn', + 'local/vscode-dts-region-comments': 'warn', + 'local/vscode-dts-vscode-in-comments': 'warn', + 'local/vscode-dts-provider-naming': [ + 'warn', + { + 'allowed': [ + 'FileSystemProvider', + 'TreeDataProvider', + 'TestProvider', + 'CustomEditorProvider', + 'CustomReadonlyEditorProvider', + 'TerminalLinkProvider', + 'AuthenticationProvider', + 'NotebookContentProvider' + ] + } + ], + 'local/vscode-dts-event-naming': [ + 'warn', + { + 'allowed': [ + 'onCancellationRequested', + 'event' + ], + 'verbs': [ + 'accept', + 'change', + 'close', + 'collapse', + 'create', + 'delete', + 'discover', + 'dispose', + 'drop', + 'edit', + 'end', + 'execute', + 'expand', + 'grant', + 'hide', + 'invalidate', + 'open', + 'override', + 'perform', + 'receive', + 'register', + 'remove', + 'rename', + 'save', + 'send', + 'start', + 'terminate', + 'trigger', + 'unregister', + 'write' + ] + } + ] + } + }, + { + files: [ + '**/vscode.d.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + rules: { + 'jsdoc/tag-lines': 'off', + 'jsdoc/valid-types': 'off', + 'jsdoc/no-multi-asterisks': [ + 'warn', + { + 'allowWhitespace': true + } + ], + 'jsdoc/require-jsdoc': [ + 'warn', + { + 'enableFixer': false, + 'contexts': [ + 'TSInterfaceDeclaration', + 'TSPropertySignature', + 'TSMethodSignature', + 'TSDeclareFunction', + 'ClassDeclaration', + 'MethodDefinition', + 'PropertyDeclaration', + 'TSEnumDeclaration', + 'TSEnumMember', + 'ExportNamedDeclaration' + ] + } + ], + 'jsdoc/check-param-names': [ + 'warn', + { + 'enableFixer': false, + 'checkDestructured': false + } + ], + 'jsdoc/require-returns': 'warn' + } + }, + { + files: [ + 'src/**/{common,browser}/**/*.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + plugins: { + 'local': require('eslint-plugin-local'), + }, + rules: { + 'local/code-amd-node-module': 'warn' + } + }, + { + files: [ + 'src/**/{browser,electron-sandbox}/**/*.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + plugins: { + 'local': require('eslint-plugin-local'), + }, + rules: { + 'local/code-no-global-document-listener': 'warn', + 'no-restricted-syntax': [ + 'warn', + { + 'selector': `BinaryExpression[operator='instanceof'][right.name='MouseEvent']`, + 'message': 'Use DOM.isMouseEvent() to support multi-window scenarios.' + }, + { + 'selector': `BinaryExpression[operator='instanceof'][right.name=/^HTML\\w+/]`, + 'message': 'Use DOM.isHTMLElement() and related methods to support multi-window scenarios.' + }, + { + 'selector': `BinaryExpression[operator='instanceof'][right.name='KeyboardEvent']`, + 'message': 'Use DOM.isKeyboardEvent() to support multi-window scenarios.' + }, + { + 'selector': `BinaryExpression[operator='instanceof'][right.name='PointerEvent']`, + 'message': 'Use DOM.isPointerEvent() to support multi-window scenarios.' + }, + { + 'selector': `BinaryExpression[operator='instanceof'][right.name='DragEvent']`, + 'message': 'Use DOM.isDragEvent() to support multi-window scenarios.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='activeElement']`, + 'message': 'Use .document.activeElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='contains']`, + 'message': 'Use .document.contains to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='styleSheets']`, + 'message': 'Use .document.styleSheets to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='fullscreenElement']`, + 'message': 'Use .document.fullscreenElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='body']`, + 'message': 'Use .document.body to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='addEventListener']`, + 'message': 'Use .document.addEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='removeEventListener']`, + 'message': 'Use .document.removeEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='hasFocus']`, + 'message': 'Use .document.hasFocus to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='head']`, + 'message': 'Use .document.head to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='exitFullscreen']`, + 'message': 'Use .document.exitFullscreen to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='getElementById']`, + 'message': 'Use .document.getElementById to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='getElementsByClassName']`, + 'message': 'Use .document.getElementsByClassName to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='getElementsByName']`, + 'message': 'Use .document.getElementsByName to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='getElementsByTagName']`, + 'message': 'Use .document.getElementsByTagName to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='getElementsByTagNameNS']`, + 'message': 'Use .document.getElementsByTagNameNS to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='getSelection']`, + 'message': 'Use .document.getSelection to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='open']`, + 'message': 'Use .document.open to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='close']`, + 'message': 'Use .document.close to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='documentElement']`, + 'message': 'Use .document.documentElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='visibilityState']`, + 'message': 'Use .document.visibilityState to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='querySelector']`, + 'message': 'Use .document.querySelector to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='querySelectorAll']`, + 'message': 'Use .document.querySelectorAll to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='elementFromPoint']`, + 'message': 'Use .document.elementFromPoint to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='elementsFromPoint']`, + 'message': 'Use .document.elementsFromPoint to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='onkeydown']`, + 'message': 'Use .document.onkeydown to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='onkeyup']`, + 'message': 'Use .document.onkeyup to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='onmousedown']`, + 'message': 'Use .document.onmousedown to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='onmouseup']`, + 'message': 'Use .document.onmouseup to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': `MemberExpression[object.name='document'][property.name='execCommand']`, + 'message': 'Use .document.execCommand to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + } + ], + 'no-restricted-globals': [ + 'warn', + 'name', + 'length', + 'event', + 'closed', + 'external', + 'status', + 'origin', + 'orientation', + 'context', + { + 'name': 'setInterval', + 'message': 'Use .setInterval to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'clearInterval', + 'message': 'Use .clearInterval to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'requestAnimationFrame', + 'message': 'Use .requestAnimationFrame to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'cancelAnimationFrame', + 'message': 'Use .cancelAnimationFrame to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'requestIdleCallback', + 'message': 'Use .requestIdleCallback to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'cancelIdleCallback', + 'message': 'Use .cancelIdleCallback to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'window', + 'message': 'Use to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'addEventListener', + 'message': 'Use .addEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'removeEventListener', + 'message': 'Use .removeEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'getComputedStyle', + 'message': 'Use .getComputedStyle to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'focus', + 'message': 'Use .focus to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'blur', + 'message': 'Use .blur to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'close', + 'message': 'Use .close to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'dispatchEvent', + 'message': 'Use .dispatchEvent to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'getSelection', + 'message': 'Use .getSelection to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'matchMedia', + 'message': 'Use .matchMedia to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'open', + 'message': 'Use .open to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'parent', + 'message': 'Use .parent to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'postMessage', + 'message': 'Use .postMessage to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'devicePixelRatio', + 'message': 'Use .devicePixelRatio to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'frames', + 'message': 'Use .frames to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'frameElement', + 'message': 'Use .frameElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'innerHeight', + 'message': 'Use .innerHeight to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'innerWidth', + 'message': 'Use .innerWidth to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'outerHeight', + 'message': 'Use .outerHeight to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'outerWidth', + 'message': 'Use .outerWidth to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'opener', + 'message': 'Use .opener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'origin', + 'message': 'Use .origin to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'screen', + 'message': 'Use .screen to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'screenLeft', + 'message': 'Use .screenLeft to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'screenTop', + 'message': 'Use .screenTop to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'screenX', + 'message': 'Use .screenX to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'screenY', + 'message': 'Use .screenY to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'scrollX', + 'message': 'Use .scrollX to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'scrollY', + 'message': 'Use .scrollY to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'top', + 'message': 'Use .top to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'name': 'visualViewport', + 'message': 'Use .visualViewport to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + } + ] + } + }, + { + files: [ + 'src/**/electron-utility/**/*.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + rules: { + 'no-restricted-imports': [ + 'warn', + { + 'paths': [ + { + 'name': 'electron', + 'importNames': [ + 'app', + 'autoUpdater', + 'BaseWindow', + 'BrowserWindow', + 'contentTracing', + 'desktopCapturer', + 'dialog', + 'globalShortcut', + 'inAppPurchase', + 'ipcMain', + 'Menu', + 'MenuItem', + 'MessageChannelMain', + 'MessagePortMain', + 'nativeTheme', + 'netLog', + 'Notification', + 'powerMonitor', + 'powerSaveBlocker', + 'protocol', + 'pushNotifications', + 'safeStorage', + 'screen', + 'session', + 'ShareMenu', + 'TouchBar', + 'Tray', + 'utilityProcess', + 'View', + 'webContents', + 'webFrameMain', + 'webContentsView', + 'default' + ], + 'message': 'Only net and system-preferences are allowed to be imported from electron' + } + ] + } + ] + } + }, + { + files: [ + 'src/**/*.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + plugins: { + 'local': require('eslint-plugin-local'), + }, + rules: { + 'local/code-import-patterns': [ + 'warn', + { + // imports that are allowed in all files of layers: + // - browser + // - electron-sandbox + 'when': 'hasBrowser', + 'allow': [] + }, + { + // imports that are allowed in all files of layers: + // - node + // - electron-utility + // - electron-main + 'when': 'hasNode', + 'allow': [ + '@parcel/watcher', + '@vscode/sqlite3', + '@vscode/vscode-languagedetection', + '@vscode/ripgrep', + '@vscode/iconv-lite-umd', + '@vscode/policy-watcher', + '@vscode/proxy-agent', + '@vscode/spdlog', + '@vscode/windows-process-tree', + 'assert', + 'child_process', + 'console', + 'cookie', + 'crypto', + 'dns', + 'events', + 'fs', + 'fs/promises', + 'http', + 'https', + 'minimist', + 'node:module', + 'native-keymap', + 'native-watchdog', + 'net', + 'node-pty', + 'os', + 'path', + 'perf_hooks', + 'readline', + 'stream', + 'string_decoder', + 'tas-client-umd', + 'tls', + 'url', + 'util', + 'v8-inspect-profiler', + 'vscode-regexpp', + 'vscode-textmate', + 'worker_threads', + '@xterm/addon-clipboard', + '@xterm/addon-image', + '@xterm/addon-search', + '@xterm/addon-serialize', + '@xterm/addon-unicode11', + '@xterm/addon-webgl', + '@xterm/headless', + '@xterm/xterm', + 'yauzl', + 'yazl', + 'zlib' + ] + }, + { + // imports that are allowed in all files of layers: + // - electron-utility + // - electron-main + 'when': 'hasElectron', + 'allow': [ + 'electron' + ] + }, + { + // imports that are allowed in all /test/ files + 'when': 'test', + 'allow': [ + 'assert', + 'sinon', + 'sinon-test' + ] + }, + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! Do not relax these rules !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // + // A path ending in /~ has a special meaning. It indicates a template position + // which will be substituted with one or more layers. + // + // When /~ is used in the target, the rule will be expanded to 14 distinct rules. + // e.g. 'src/vs/base/~' will be expanded to: + // - src/vs/base/common + // - src/vs/base/worker + // - src/vs/base/browser + // - src/vs/base/electron-sandbox + // - src/vs/base/node + // - src/vs/base/electron-main + // - src/vs/base/test/common + // - src/vs/base/test/worker + // - src/vs/base/test/browser + // - src/vs/base/test/electron-sandbox + // - src/vs/base/test/node + // - src/vs/base/test/electron-main + // + // When /~ is used in the restrictions, it will be replaced with the correct + // layers that can be used e.g. 'src/vs/base/electron-sandbox' will be able + // to import '{common,browser,electron-sanbox}', etc. + // + // It is possible to use /~ in the restrictions property even without using it in + // the target property by adding a layer property. + { + 'target': 'src/vs/base/~', + 'restrictions': [ + 'vs/base/~' + ] + }, + { + 'target': 'src/vs/base/parts/*/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~' + ] + }, + { + 'target': 'src/vs/platform/*/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'tas-client-umd', // node module allowed even in /common/ + '@microsoft/1ds-core-js', // node module allowed even in /common/ + '@microsoft/1ds-post-js', // node module allowed even in /common/ + '@xterm/headless' // node module allowed even in /common/ + ] + }, + { + 'target': 'src/vs/editor/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + '@vscode/tree-sitter-wasm' // node module allowed even in /common/ + ] + }, + { + 'target': 'src/vs/editor/contrib/*/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~' + ] + }, + { + 'target': 'src/vs/editor/standalone/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/editor/standalone/~', + '@vscode/tree-sitter-wasm' // type import + ] + }, + { + 'target': 'src/vs/editor/editor.all.ts', + 'layer': 'browser', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~' + ] + }, + { + 'target': 'src/vs/editor/editor.worker.ts', + 'layer': 'worker', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~' + ] + }, + { + 'target': 'src/vs/editor/{editor.api.ts,editor.main.ts}', + 'layer': 'browser', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/editor/standalone/~', + 'vs/editor/*' + ] + }, + { + 'target': 'src/vs/workbench/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/workbench/~', + 'vs/workbench/services/*/~', + 'assert', + { + 'when': 'test', + 'pattern': 'vs/workbench/contrib/*/~' + } // TODO@layers + ] + }, + { + 'target': 'src/vs/workbench/api/~', + 'restrictions': [ + 'vscode', + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/workbench/api/~', + 'vs/workbench/~', + 'vs/workbench/services/*/~', + 'vs/workbench/contrib/*/~', + 'vs/workbench/contrib/terminalContrib/*/~' + ] + }, + { + 'target': 'src/vs/workbench/services/*/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/workbench/~', + 'vs/workbench/services/*/~', + { + 'when': 'test', + 'pattern': 'vs/workbench/contrib/*/~' + }, // TODO@layers + 'tas-client-umd', // node module allowed even in /common/ + 'vscode-textmate', // node module allowed even in /common/ + '@vscode/vscode-languagedetection', // node module allowed even in /common/ + '@vscode/tree-sitter-wasm', // type import + { + 'when': 'hasBrowser', + 'pattern': '@xterm/xterm' + } // node module allowed even in /browser/ + ] + }, + { + 'target': 'src/vs/workbench/contrib/*/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/workbench/~', + 'vs/workbench/services/*/~', + 'vs/workbench/contrib/*/~', + 'vs/workbench/contrib/terminal/terminalContribChatExports*', + 'vs/workbench/contrib/terminal/terminalContribExports*', + 'vscode-notebook-renderer', // Type only import + '@vscode/tree-sitter-wasm', // type import + { + 'when': 'hasBrowser', + 'pattern': '@xterm/xterm' + }, // node module allowed even in /browser/ + { + 'when': 'hasBrowser', + 'pattern': '@xterm/addon-*' + }, // node module allowed even in /browser/ + { + 'when': 'hasBrowser', + 'pattern': 'vscode-textmate' + } // node module allowed even in /browser/ + ] + }, + { + 'target': 'src/vs/workbench/contrib/terminalContrib/*/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/workbench/~', + 'vs/workbench/services/*/~', + 'vs/workbench/contrib/*/~', + // Only allow terminalContrib to import from itself, this works because + // terminalContrib is one extra folder deep + 'vs/workbench/contrib/terminalContrib/*/~', + 'vscode-notebook-renderer', // Type only import + { + 'when': 'hasBrowser', + 'pattern': '@xterm/xterm' + }, // node module allowed even in /browser/ + { + 'when': 'hasBrowser', + 'pattern': '@xterm/addon-*' + }, // node module allowed even in /browser/ + { + 'when': 'hasBrowser', + 'pattern': 'vscode-textmate' + }, // node module allowed even in /browser/ + '@xterm/headless' // node module allowed even in /common/ and /browser/ + ] + }, + { + 'target': 'src/vs/code/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/code/~', + { + 'when': 'hasBrowser', + 'pattern': 'vs/workbench/workbench.web.main.js' + }, + { + 'when': 'hasBrowser', + 'pattern': 'vs/workbench/workbench.web.main.internal.js' + }, + { + 'when': 'hasBrowser', + 'pattern': 'vs/workbench/~' + }, + { + 'when': 'hasBrowser', + 'pattern': 'vs/workbench/services/*/~' + } + ] + }, + { + 'target': 'src/vs/server/~', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/workbench/~', + 'vs/workbench/api/~', + 'vs/workbench/services/*/~', + 'vs/workbench/contrib/*/~', + 'vs/server/~' + ] + }, + { + 'target': 'src/vs/workbench/contrib/terminal/terminal.all.ts', + 'layer': 'browser', + 'restrictions': [ + 'vs/workbench/contrib/**' + ] + }, + { + 'target': 'src/vs/workbench/contrib/terminal/terminalContribChatExports.ts', + 'layer': 'browser', + 'restrictions': [ + 'vs/workbench/contrib/terminalContrib/*/~' + ] + }, + { + 'target': 'src/vs/workbench/contrib/terminal/terminalContribExports.ts', + 'layer': 'browser', + 'restrictions': [ + 'vs/platform/*/~', + 'vs/workbench/contrib/terminalContrib/*/~' + ] + }, + { + 'target': 'src/vs/workbench/workbench.common.main.ts', + 'layer': 'browser', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/editor/editor.all.js', + 'vs/workbench/~', + 'vs/workbench/api/~', + 'vs/workbench/services/*/~', + 'vs/workbench/contrib/*/~', + 'vs/workbench/contrib/terminal/terminal.all.js' + ] + }, + { + 'target': 'src/vs/workbench/workbench.web.main.ts', + 'layer': 'browser', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/editor/editor.all.js', + 'vs/workbench/~', + 'vs/workbench/api/~', + 'vs/workbench/services/*/~', + 'vs/workbench/contrib/*/~', + 'vs/workbench/workbench.common.main.js' + ] + }, + { + 'target': 'src/vs/workbench/workbench.web.main.internal.ts', + 'layer': 'browser', + 'restrictions': [ + 'vs/base/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/editor/editor.all.js', + 'vs/workbench/~', + 'vs/workbench/api/~', + 'vs/workbench/services/*/~', + 'vs/workbench/contrib/*/~', + 'vs/workbench/workbench.common.main.js' + ] + }, + { + 'target': 'src/vs/workbench/workbench.desktop.main.ts', + 'layer': 'electron-sandbox', + 'restrictions': [ + 'vs/base/*/~', + 'vs/base/parts/*/~', + 'vs/platform/*/~', + 'vs/editor/~', + 'vs/editor/contrib/*/~', + 'vs/editor/editor.all.js', + 'vs/workbench/~', + 'vs/workbench/api/~', + 'vs/workbench/services/*/~', + 'vs/workbench/contrib/*/~', + 'vs/workbench/workbench.common.main.js' + ] + }, + { + 'target': 'src/vs/amdX.ts', + 'restrictions': [ + 'vs/base/common/*' + ] + }, + { + 'target': 'src/vs/{loader.d.ts,monaco.d.ts,nls.ts,nls.messages.ts}', + 'restrictions': [] + }, + { + 'target': 'src/vscode-dts/**', + 'restrictions': [] + }, + { + 'target': 'src/bootstrap-window.ts', + 'restrictions': [] + }, + { + 'target': 'src/{bootstrap-cli.ts,bootstrap-esm.ts,bootstrap-fork.ts,bootstrap-import.ts,bootstrap-meta.ts,bootstrap-node.ts,bootstrap-server.ts,cli.ts,main.ts,server-cli.ts,server-main.ts}', + 'restrictions': [ + 'vs/**/common/*', + 'vs/**/node/*', + 'vs/nls.js', + 'src/*.js', + '*' // node.js + ] + } + ] + } + }, + { + files: [ + 'test/**/*.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + plugins: { + 'local': require('eslint-plugin-local'), + }, + rules: { + 'local/code-import-patterns': [ + 'warn', + { + 'target': 'test/smoke/**', + 'restrictions': [ + 'test/automation', + 'test/smoke/**', + '@vscode/*', + '@parcel/*', + '@playwright/*', + '*' // node modules + ] + }, + { + 'target': 'test/automation/**', + 'restrictions': [ + 'test/automation/**', + '@vscode/*', + '@parcel/*', + 'playwright-core/**', + '@playwright/*', + '*' // node modules + ] + }, + { + 'target': 'test/integration/**', + 'restrictions': [ + 'test/integration/**', + '@vscode/*', + '@parcel/*', + '@playwright/*', + '*' // node modules + ] + }, + { + 'target': 'test/monaco/**', + 'restrictions': [ + 'test/monaco/**', + '@vscode/*', + '@parcel/*', + '@playwright/*', + '*' // node modules + ] + } + ] + } + }, + { + files: [ + 'src/vs/workbench/contrib/notebook/browser/view/renderers/*.ts' + ], + languageOptions: { + parser: tseslint.parser, + }, + plugins: { + 'local': require('eslint-plugin-local'), + }, + rules: { + 'local/code-no-runtime-import': [ + 'error', + { + 'src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts': [ + '**/*' + ] + } + ], + 'local/code-limited-top-functions': [ + 'error', + { + 'src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts': [ + 'webviewPreloads', + 'preloadsScriptStr' + ] + } + ] + } + } +); diff --git a/package-lock.json b/package-lock.json index a02da2958b1..c7f75bbf968 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,10 +54,11 @@ }, "devDependencies": { "@playwright/test": "^1.46.1", + "@stylistic/eslint-plugin-ts": "^2.8.0", "@swc/core": "1.3.62", "@types/cookie": "^0.3.3", "@types/debug": "^4.1.5", - "@types/eslint": "^8.56.10", + "@types/eslint": "^9.6.1", "@types/gulp-svgmin": "^1.2.1", "@types/http-proxy-agent": "^2.0.1", "@types/kerberos": "^1.1.2", @@ -74,9 +75,7 @@ "@types/winreg": "^1.2.30", "@types/yauzl": "^2.10.0", "@types/yazl": "^2.4.2", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/experimental-utils": "^5.57.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/utils": "^8.8.0", "@vscode/gulp-electron": "^1.36.0", "@vscode/l10n-dev": "0.0.35", "@vscode/telemetry-extractor": "^1.10.2", @@ -96,10 +95,11 @@ "debounce": "^1.0.0", "deemon": "^1.8.0", "electron": "30.5.1", - "eslint": "8.36.0", + "eslint": "^9.11.1", + "eslint-formatter-compact": "^8.40.0", "eslint-plugin-header": "3.1.1", - "eslint-plugin-jsdoc": "^46.5.0", - "eslint-plugin-local": "^1.0.0", + "eslint-plugin-jsdoc": "^50.3.1", + "eslint-plugin-local": "^6.0.0", "event-stream": "3.3.4", "fancy-log": "^1.3.3", "file-loader": "^6.2.0", @@ -155,6 +155,7 @@ "tsec": "0.2.7", "tslib": "^2.6.3", "typescript": "^5.7.0-dev.20240927", + "typescript-eslint": "^8.8.0", "util": "^0.12.4", "webpack": "^5.94.0", "webpack-cli": "^5.1.4", @@ -1065,14 +1066,14 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.40.1.tgz", - "integrity": "sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz", + "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==", "dev": true, "dependencies": { - "comment-parser": "1.4.0", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" }, "engines": { "node": ">=16" @@ -1102,16 +1103,39 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1119,19 +1143,40 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", + "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@gulp-sourcemaps/identity-map": { @@ -1235,21 +1280,6 @@ "xtend": "~4.0.1" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1263,12 +1293,18 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -1719,6 +1755,18 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@playwright/browser-chromium": { "version": "1.47.0", "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.47.0.tgz", @@ -1794,6 +1842,35 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.8.0.tgz", + "integrity": "sha512-VukJqkRlC2psLKoIHJ+4R3ZxLJfWeizGGX+X5ZxunjXo4MbxRNtwu5UvXuerABg4s2RV6Z3LFTdm0WvI4+RAMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^8.4.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@swc/core": { "version": "1.3.62", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.62.tgz", @@ -2000,6 +2077,18 @@ "node": ">=10" } }, + "node_modules/@thisismanta/pessimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@thisismanta/pessimist/-/pessimist-1.2.0.tgz", + "integrity": "sha512-rm8/zjNMuO9hPYhEMavVIIxmvawJJB8mthvbVXd74XUW7V/SbgmtDBQjICbCWKjluvA+gh+cqi7dv85/jexknA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@tootallnate/once": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-3.0.0.tgz", @@ -2126,9 +2215,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2278,12 +2367,6 @@ "@types/node": "*" } }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, "node_modules/@types/sinon": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.2.tgz", @@ -2386,261 +2469,30 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.57.0.tgz", - "integrity": "sha512-0RnrwGQ7MmgtOSnzB/rSGYr2iXENi6L+CtPzX3g5ovo0HlruLukSEKcc4s+q0IEc+DLTDc7Edan0Y4WSQ/bFhw==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.57.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", - "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", - "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", - "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/utils": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", - "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", - "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "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", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", + "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", + "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2648,22 +2500,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", + "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2685,9 +2537,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -2700,41 +2552,38 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", + "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/typescript-estree": "8.8.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", + "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "8.8.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4010,15 +3859,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", @@ -4496,18 +4336,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -5205,9 +5033,9 @@ } }, "node_modules/comment-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.0.tgz", - "integrity": "sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, "engines": { "node": ">= 12.0.0" @@ -5991,18 +5819,6 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -6341,9 +6157,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/es-to-primitive": { @@ -6447,60 +6263,74 @@ } }, "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", + "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.11.1", + "@eslint/plugin-kit": "^0.2.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", - "esquery": "^1.4.2", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-formatter-compact": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-compact/-/eslint-formatter-compact-8.40.0.tgz", + "integrity": "sha512-cwGUs113TgmTQXecx5kfRjB7m0y2wkDLSadPTE2pK6M/wO4N8PjmUaoWOFNCP9MHgsiZwgqd5bZFnDCnszC56Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint-plugin-header": { @@ -6513,45 +6343,91 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "46.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.5.0.tgz", - "integrity": "sha512-aulXdA4I1dyWpzyS1Nh/GNoS6PavzeucxEapnMR4JUERowWvaEk2Y4A5irpHAcdXtBBHLVe8WIhdXNjoAlGQgA==", + "version": "50.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.3.1.tgz", + "integrity": "sha512-SY9oUuTMr6aWoJggUS40LtMjsRzJPB5ZT7F432xZIHK3EfHF+8i48GbUBpwanrtlL9l1gILNTHK9o8gEhYLcKA==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.40.1", + "@es-joy/jsdoccomment": "~0.48.0", "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.0", - "debug": "^4.3.4", + "comment-parser": "1.4.1", + "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.4", - "spdx-expression-parse": "^3.0.1" + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "node_modules/eslint-plugin-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-local/-/eslint-plugin-local-1.0.0.tgz", - "integrity": "sha512-bcwcQnKL/Iw5Vi/F2lG1he5oKD2OGjhsLmrcctkWrWq5TujgiaYb0cj3pZgr3XI54inNVnneOFdAx1daLoYLJQ==", - "dev": true + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-local/-/eslint-plugin-local-6.0.0.tgz", + "integrity": "sha512-pvy/pTTyanEKAqpYqy/SLfd4TdiAQ/yFO+GRXDGvGQa2vEUGtmlEjmWQXBDGSk790j4nrAB/7ipqPQY3nLduDg==", + "deprecated": "Since the coming of ESLint flat config file, you can specify local rules without the need of this package. For running ESLint rule unit tests, use eslint-rule-tester instead", + "dev": true, + "dependencies": { + "@thisismanta/pessimist": "^1.2.0", + "chalk": "^4.0.0" + }, + "bin": { + "eslint-plugin-local": "executable.js" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6569,6 +6445,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -6603,26 +6491,38 @@ "dev": true }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -6989,9 +6889,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -7040,15 +6940,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-loader": { @@ -7340,54 +7240,16 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { @@ -8201,15 +8063,12 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8231,26 +8090,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/glogg": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", @@ -8305,12 +8144,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -10363,21 +10196,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-callable": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", @@ -10996,16 +10814,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/js-sdsl": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -11039,9 +10847,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, "engines": { "node": ">=12.0.0" @@ -13587,6 +13395,19 @@ "node": ">=0.8" } }, + "node_modules/parse-imports": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", + "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "dev": true, + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -15629,9 +15450,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -15946,14 +15767,11 @@ "node": ">=8" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true }, "node_modules/smart-buffer": { "version": "4.2.0", @@ -16921,6 +16739,22 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tapable": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", @@ -17546,27 +17380,6 @@ "node": ">=0.6.x" } }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", @@ -17614,18 +17427,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -17658,6 +17459,114 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.8.0.tgz", + "integrity": "sha512-BjIT/VwJ8+0rVO01ZQ2ZVnjE1svFBiRczcpr1t1Yxt7sT25VSbPfrJtDsQ8uQTy2pilX5nI9gwxhUyLULNentw==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.8.0", + "@typescript-eslint/parser": "8.8.0", + "@typescript-eslint/utils": "8.8.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz", + "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/type-utils": "8.8.0", + "@typescript-eslint/utils": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.0.tgz", + "integrity": "sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/typescript-estree": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz", + "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.8.0", + "@typescript-eslint/utils": "8.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/typical": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", diff --git a/package.json b/package.json index c3924ca1441..10e5b7fc3f0 100644 --- a/package.json +++ b/package.json @@ -112,10 +112,11 @@ }, "devDependencies": { "@playwright/test": "^1.46.1", + "@stylistic/eslint-plugin-ts": "^2.8.0", "@swc/core": "1.3.62", "@types/cookie": "^0.3.3", "@types/debug": "^4.1.5", - "@types/eslint": "^8.56.10", + "@types/eslint": "^9.6.1", "@types/gulp-svgmin": "^1.2.1", "@types/http-proxy-agent": "^2.0.1", "@types/kerberos": "^1.1.2", @@ -132,9 +133,7 @@ "@types/winreg": "^1.2.30", "@types/yauzl": "^2.10.0", "@types/yazl": "^2.4.2", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/experimental-utils": "^5.57.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/utils": "^8.8.0", "@vscode/gulp-electron": "^1.36.0", "@vscode/l10n-dev": "0.0.35", "@vscode/telemetry-extractor": "^1.10.2", @@ -154,10 +153,11 @@ "debounce": "^1.0.0", "deemon": "^1.8.0", "electron": "30.5.1", - "eslint": "8.36.0", + "eslint": "^9.11.1", + "eslint-formatter-compact": "^8.40.0", "eslint-plugin-header": "3.1.1", - "eslint-plugin-jsdoc": "^46.5.0", - "eslint-plugin-local": "^1.0.0", + "eslint-plugin-jsdoc": "^50.3.1", + "eslint-plugin-local": "^6.0.0", "event-stream": "3.3.4", "fancy-log": "^1.3.3", "file-loader": "^6.2.0", @@ -213,6 +213,7 @@ "tsec": "0.2.7", "tslib": "^2.6.3", "typescript": "^5.7.0-dev.20240927", + "typescript-eslint": "^8.8.0", "util": "^0.12.4", "webpack": "^5.94.0", "webpack-cli": "^5.1.4", diff --git a/src/vs/base/common/types.ts b/src/vs/base/common/types.ts index 6025a90c711..6ad28eaece0 100644 --- a/src/vs/base/common/types.ts +++ b/src/vs/base/common/types.ts @@ -196,7 +196,7 @@ export function validateConstraint(arg: unknown, constraint: TypeConstraint | un * This can be used to make sure the argument correctly conforms to the subtype while still being able to pass it * to contexts that expects the supertype. */ -export function upcast(x: Sub): Base { +export function upcast(x: Sub): Base { return x; } diff --git a/src/vs/platform/extensionManagement/node/extensionSignatureVerificationService.ts b/src/vs/platform/extensionManagement/node/extensionSignatureVerificationService.ts index 9af60c96ddc..fe7b99e5f99 100644 --- a/src/vs/platform/extensionManagement/node/extensionSignatureVerificationService.ts +++ b/src/vs/platform/extensionManagement/node/extensionSignatureVerificationService.ts @@ -24,11 +24,11 @@ export interface IExtensionSignatureVerificationService { /** * Verifies an extension file (.vsix) against a signature archive file. - * @param { string } extensionId The extension identifier. - * @param { string } version The extension version. - * @param { string } vsixFilePath The extension file path. - * @param { string } signatureArchiveFilePath The signature archive file path. - * @returns { Promise } returns the verification result or undefined if the verification was not executed. + * @param extensionId The extension identifier. + * @param version The extension version. + * @param vsixFilePath The extension file path. + * @param signatureArchiveFilePath The signature archive file path. + * @returns returns the verification result or undefined if the verification was not executed. */ verify(extensionId: string, version: string, vsixFilePath: string, signatureArchiveFilePath: string, clientTargetPlatform?: TargetPlatform): Promise; } diff --git a/src/vs/platform/update/common/update.ts b/src/vs/platform/update/common/update.ts index 2b0253285aa..199f433a462 100644 --- a/src/vs/platform/update/common/update.ts +++ b/src/vs/platform/update/common/update.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from '../../../base/common/event.js'; +import { upcast } from '../../../base/common/types.js'; import { createDecorator } from '../../instantiation/common/instantiation.js'; export interface IUpdate { @@ -73,12 +74,12 @@ export type Ready = { type: StateType.Ready; update: IUpdate }; export type State = Uninitialized | Disabled | Idle | CheckingForUpdates | AvailableForDownload | Downloading | Downloaded | Updating | Ready; export const State = { - Uninitialized: { type: StateType.Uninitialized } as Uninitialized, - Disabled: (reason: DisablementReason) => ({ type: StateType.Disabled, reason }) as Disabled, - Idle: (updateType: UpdateType, error?: string) => ({ type: StateType.Idle, updateType, error }) as Idle, + Uninitialized: upcast({ type: StateType.Uninitialized }), + Disabled: (reason: DisablementReason): Disabled => ({ type: StateType.Disabled, reason }), + Idle: (updateType: UpdateType, error?: string): Idle => ({ type: StateType.Idle, updateType, error }), CheckingForUpdates: (explicit: boolean): CheckingForUpdates => ({ type: StateType.CheckingForUpdates, explicit }), AvailableForDownload: (update: IUpdate): AvailableForDownload => ({ type: StateType.AvailableForDownload, update }), - Downloading: { type: StateType.Downloading } as Downloading, + Downloading: upcast({ type: StateType.Downloading }), Downloaded: (update: IUpdate): Downloaded => ({ type: StateType.Downloaded, update }), Updating: (update: IUpdate): Updating => ({ type: StateType.Updating, update }), Ready: (update: IUpdate): Ready => ({ type: StateType.Ready, update }), diff --git a/src/vscode-dts/vscode.proposed.notebookExecution.d.ts b/src/vscode-dts/vscode.proposed.notebookExecution.d.ts index 59f9174768f..0b8f8b82546 100644 --- a/src/vscode-dts/vscode.proposed.notebookExecution.d.ts +++ b/src/vscode-dts/vscode.proposed.notebookExecution.d.ts @@ -31,7 +31,7 @@ declare module 'vscode' { * a cell execution or another NotebookExecution is created while another is still active. * * This should be used to indicate the {@link NotebookController notebook controller} is busy even though user may not have executed any cell though the UI. - * @param {NotebookDocument} notebook + * @param notebook * @returns A notebook execution. */ createNotebookExecution(notebook: NotebookDocument): NotebookExecution;