From 9901829477d6b3226d4d47e0cb9bb0400279fa67 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Sat, 14 Dec 2024 09:37:27 -0500 Subject: [PATCH] feat(parser): add standalone isolatedDeclarations option --- docs/packages/Parser.mdx | 8 ++++++++ packages/parser/src/parser.ts | 1 + packages/scope-manager/src/analyze.ts | 2 +- packages/types/src/parser-options.ts | 2 ++ .../src/createParserServices.ts | 2 ++ .../typescript-estree/src/parser-options.ts | 1 + .../tests/lib/__snapshots__/parse.test.ts.snap | 18 ++++++++++++++++++ .../src/components/linter/createParser.ts | 1 + packages/website/src/vendor/sandbox.d.ts | 1 + 9 files changed, 35 insertions(+), 1 deletion(-) diff --git a/docs/packages/Parser.mdx b/docs/packages/Parser.mdx index edfdca41cb8e..cd2ecaa19cc0 100644 --- a/docs/packages/Parser.mdx +++ b/docs/packages/Parser.mdx @@ -46,6 +46,7 @@ interface ParserOptions { ecmaVersion?: number | 'latest'; emitDecoratorMetadata?: boolean; experimentalDecorators?: boolean; + isolatedDeclarations?: boolean; extraFileExtensions?: string[]; jsDocParsingMode?: 'all' | 'none' | 'type-info'; jsxFragmentName?: string | null; @@ -156,6 +157,13 @@ Add extensions starting with `.`, followed by the file extension. E.g. for a `.v See [Changes to `extraFileExtensions` with `projectService`](../troubleshooting/typed-linting/Performance.mdx#changes-to-extrafileextensions-with-projectservice) to avoid performance issues. ::: +### `isolatedDeclarations` + +> Default `undefined`. + +This option allow you to tell parser to act as if `isolatedDeclarations: true` is set in `tsconfig.json`, but without [type-aware linting](../getting-started/Typed_Linting.mdx). +In other words, you don't have to specify `parserOptions.project` in this case, making the linting process faster. + ### `jsDocParsingMode` > Default if `parserOptions.project` is set, then `'all'`, otherwise `'none'` diff --git a/packages/parser/src/parser.ts b/packages/parser/src/parser.ts index 467df75a2e59..48227be93965 100644 --- a/packages/parser/src/parser.ts +++ b/packages/parser/src/parser.ts @@ -182,6 +182,7 @@ function parseForESLint( parserOptions.emitDecoratorMetadata === true; services.experimentalDecorators ??= parserOptions.experimentalDecorators === true; + services.isolatedDeclarations ??= parserOptions.isolatedDeclarations === true; return { ast, scopeManager, services, visitorKeys }; } diff --git a/packages/scope-manager/src/analyze.ts b/packages/scope-manager/src/analyze.ts index 157d7f569589..abe537d1c5e0 100644 --- a/packages/scope-manager/src/analyze.ts +++ b/packages/scope-manager/src/analyze.ts @@ -59,7 +59,7 @@ interface AnalyzeOptions { */ sourceType?: SourceType; - // TODO - remove this in v8 + // TODO - remove this in v10 /** * @deprecated This option never did what it was intended for and will be removed in a future major release. */ diff --git a/packages/types/src/parser-options.ts b/packages/types/src/parser-options.ts index b2257ebb91a6..cf056281d150 100644 --- a/packages/types/src/parser-options.ts +++ b/packages/types/src/parser-options.ts @@ -96,6 +96,8 @@ interface ParserOptions { experimentalDecorators?: boolean; extraFileExtensions?: string[]; filePath?: string; + // use isolatedDeclarations without specifying parserOptions.project + isolatedDeclarations?: boolean; jsDocParsingMode?: JSDocParsingMode; jsxFragmentName?: string | null; // scope-manager specific diff --git a/packages/typescript-estree/src/createParserServices.ts b/packages/typescript-estree/src/createParserServices.ts index b9a23477c23c..ee6f18915d9c 100644 --- a/packages/typescript-estree/src/createParserServices.ts +++ b/packages/typescript-estree/src/createParserServices.ts @@ -11,6 +11,7 @@ export function createParserServices( return { emitDecoratorMetadata: undefined, experimentalDecorators: undefined, + isolatedDeclarations: undefined, program, // we always return the node maps because // (a) they don't require type info and @@ -27,6 +28,7 @@ export function createParserServices( // not set in the config is the same as off emitDecoratorMetadata: compilerOptions.emitDecoratorMetadata ?? false, experimentalDecorators: compilerOptions.experimentalDecorators ?? false, + isolatedDeclarations: compilerOptions.isolatedDeclarations ?? false, ...astMaps, getSymbolAtLocation: node => checker.getSymbolAtLocation(astMaps.esTreeNodeToTSNodeMap.get(node)), diff --git a/packages/typescript-estree/src/parser-options.ts b/packages/typescript-estree/src/parser-options.ts index 48cbf0b8da1c..d3f8c8649fc5 100644 --- a/packages/typescript-estree/src/parser-options.ts +++ b/packages/typescript-estree/src/parser-options.ts @@ -240,6 +240,7 @@ export interface ParserWeakMapESTreeToTSNode< export interface ParserServicesBase { emitDecoratorMetadata: boolean | undefined; experimentalDecorators: boolean | undefined; + isolatedDeclarations: boolean | undefined; } export interface ParserServicesNodeMaps { esTreeNodeToTSNodeMap: ParserWeakMapESTreeToTSNode; diff --git a/packages/typescript-estree/tests/lib/__snapshots__/parse.test.ts.snap b/packages/typescript-estree/tests/lib/__snapshots__/parse.test.ts.snap index b20bb4029974..c32074f04e33 100644 --- a/packages/typescript-estree/tests/lib/__snapshots__/parse.test.ts.snap +++ b/packages/typescript-estree/tests/lib/__snapshots__/parse.test.ts.snap @@ -290,6 +290,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .js file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -586,6 +587,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .js file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -772,6 +774,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .js file - witho "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -958,6 +961,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .js file - witho "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -1180,6 +1184,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .json file - wit "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -1476,6 +1481,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .jsx file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -1772,6 +1778,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .jsx file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -1958,6 +1965,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .jsx file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -2144,6 +2152,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .jsx file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -2330,6 +2339,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .ts file - witho "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -2516,6 +2526,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .ts file - witho "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -2812,6 +2823,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .tsx file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -3108,6 +3120,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .tsx file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -3294,6 +3307,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .tsx file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -3480,6 +3494,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .tsx file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -3776,6 +3791,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .vue file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -3962,6 +3978,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .vue file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, @@ -4148,6 +4165,7 @@ exports[`parseAndGenerateServices isolated parsing should parse .vue file - with "emitDecoratorMetadata": undefined, "esTreeNodeToTSNodeMap": WeakMap {}, "experimentalDecorators": undefined, + "isolatedDeclarations": undefined, "program": "No Program", "tsNodeToESTreeNodeMap": WeakMap {}, }, diff --git a/packages/website/src/components/linter/createParser.ts b/packages/website/src/components/linter/createParser.ts index 6af8e0af3b85..89bc7a44735e 100644 --- a/packages/website/src/components/linter/createParser.ts +++ b/packages/website/src/components/linter/createParser.ts @@ -101,6 +101,7 @@ export function createParser( checker.getTypeAtLocation( converted.astMaps.esTreeNodeToTSNodeMap.get(node), ), + isolatedDeclarations: compilerOptions.isolatedDeclarations ?? false, program, tsNodeToESTreeNodeMap: converted.astMaps.tsNodeToESTreeNodeMap, }, diff --git a/packages/website/src/vendor/sandbox.d.ts b/packages/website/src/vendor/sandbox.d.ts index 8760842cc6c8..b69804b12550 100644 --- a/packages/website/src/vendor/sandbox.d.ts +++ b/packages/website/src/vendor/sandbox.d.ts @@ -246,6 +246,7 @@ export declare const createTypeScriptSandbox: ( importHelpers?: boolean; inlineSourceMap?: boolean; inlineSources?: boolean; + isolatedDeclarations?: boolean; isolatedModules?: boolean; jsx?: MonacoEditor.languages.typescript.JsxEmit; keyofStringsOnly?: boolean;