diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index d5b9bb4df3c..15e218f5683 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -636,6 +636,46 @@ "%format.semicolons.remove%" ] }, + "js/ts.implicitProjectConfig.module": { + "type": "string", + "markdownDescription": "%configuration.implicitProjectConfig.module%", + "default": "ESNext", + "enum": [ + "CommonJS", + "AMD", + "System", + "UMD", + "ES6", + "ES2015", + "ES2020", + "ESNext", + "None", + "ES2022", + "Node12", + "NodeNext" + ], + "scope": "window" + }, + "js/ts.implicitProjectConfig.target": { + "type": "string", + "default": "ES2020", + "markdownDescription": "%configuration.implicitProjectConfig.target%", + "enum": [ + "ES3", + "ES5", + "ES6", + "ES2015", + "ES2016", + "ES2017", + "ES2018", + "ES2019", + "ES2020", + "ES2021", + "ES2022", + "ESNext" + ], + "scope": "window" + }, "javascript.implicitProjectConfig.checkJs": { "type": "boolean", "default": false, diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json index dd7d6b209f5..fa0230320ec 100644 --- a/extensions/typescript-language-features/package.nls.json +++ b/extensions/typescript-language-features/package.nls.json @@ -71,6 +71,8 @@ "configuration.tsserver.maxTsServerMemory": "The maximum amount of memory (in MB) to allocate to the TypeScript server process.", "configuration.tsserver.experimental.enableProjectDiagnostics": "(Experimental) Enables project wide error reporting.", "typescript.locale": "Sets the locale used to report JavaScript and TypeScript errors. Defaults to use VS Code's locale.", + "configuration.implicitProjectConfig.module": "Sets the module system for the program. See more: https://www.typescriptlang.org/tsconfig#module.", + "configuration.implicitProjectConfig.target": "Set target JavaScript language version for emitted JavaScript and include library declarations. See more: https://www.typescriptlang.org/tsconfig#target.", "configuration.implicitProjectConfig.checkJs": "Enable/disable semantic checking of JavaScript files. Existing `jsconfig.json` or `tsconfig.json` files override this setting.", "configuration.javascript.checkJs.checkJs.deprecation": "This setting has been deprecated in favor of `js/ts.implicitProjectConfig.checkJs`.", "configuration.implicitProjectConfig.experimentalDecorators": "Enable/disable `experimentalDecorators` in JavaScript files that are not part of a project. Existing `jsconfig.json` or `tsconfig.json` files override this setting.", diff --git a/extensions/typescript-language-features/src/utils/configuration.ts b/extensions/typescript-language-features/src/utils/configuration.ts index 1249cd5b6ba..c69b8fde758 100644 --- a/extensions/typescript-language-features/src/utils/configuration.ts +++ b/extensions/typescript-language-features/src/utils/configuration.ts @@ -52,12 +52,16 @@ export const enum SyntaxServerConfiguration { export class ImplicitProjectConfiguration { + public readonly target: string | undefined; + public readonly module: string | undefined; public readonly checkJs: boolean; public readonly experimentalDecorators: boolean; public readonly strictNullChecks: boolean; public readonly strictFunctionTypes: boolean; constructor(configuration: vscode.WorkspaceConfiguration) { + this.target = ImplicitProjectConfiguration.readTarget(configuration); + this.module = ImplicitProjectConfiguration.readModule(configuration); this.checkJs = ImplicitProjectConfiguration.readCheckJs(configuration); this.experimentalDecorators = ImplicitProjectConfiguration.readExperimentalDecorators(configuration); this.strictNullChecks = ImplicitProjectConfiguration.readImplicitStrictNullChecks(configuration); @@ -68,6 +72,14 @@ export class ImplicitProjectConfiguration { return objects.equals(this, other); } + private static readTarget(configuration: vscode.WorkspaceConfiguration): string | undefined { + return configuration.get('js/ts.implicitProjectConfig.target'); + } + + private static readModule(configuration: vscode.WorkspaceConfiguration): string | undefined { + return configuration.get('js/ts.implicitProjectConfig.module'); + } + private static readCheckJs(configuration: vscode.WorkspaceConfiguration): boolean { return configuration.get('js/ts.implicitProjectConfig.checkJs') ?? configuration.get('javascript.implicitProjectConfig.checkJs', false); diff --git a/extensions/typescript-language-features/src/utils/tsconfig.ts b/extensions/typescript-language-features/src/utils/tsconfig.ts index d72d7489e33..463f0f7114a 100644 --- a/extensions/typescript-language-features/src/utils/tsconfig.ts +++ b/extensions/typescript-language-features/src/utils/tsconfig.ts @@ -22,15 +22,18 @@ export function isImplicitProjectConfigFile(configFileName: string) { return configFileName.startsWith('/dev/null/'); } +const defaultProjectConfig = Object.freeze({ + module: 'ESNext' as Proto.ModuleKind, + moduleResolution: 'Node' as Proto.ModuleResolutionKind, + target: 'ES2020' as Proto.ScriptTarget, + jsx: 'Preserve' as Proto.JsxEmit, +}); + export function inferredProjectCompilerOptions( projectType: ProjectType, serviceConfig: TypeScriptServiceConfiguration, ): Proto.ExternalProjectCompilerOptions { - const projectConfig: Proto.ExternalProjectCompilerOptions = { - module: 'commonjs' as Proto.ModuleKind, - target: 'es2020' as Proto.ScriptTarget, - jsx: 'preserve' as Proto.JsxEmit, - }; + const projectConfig = { ...defaultProjectConfig }; if (serviceConfig.implicitProjectConfiguration.checkJs) { projectConfig.checkJs = true; @@ -51,6 +54,15 @@ export function inferredProjectCompilerOptions( projectConfig.strictFunctionTypes = true; } + + if (serviceConfig.implicitProjectConfiguration.module) { + projectConfig.module = serviceConfig.implicitProjectConfiguration.module as Proto.ModuleKind; + } + + if (serviceConfig.implicitProjectConfiguration.target) { + projectConfig.target = serviceConfig.implicitProjectConfiguration.target as Proto.ScriptTarget; + } + if (projectType === ProjectType.TypeScript) { projectConfig.sourceMap = true; }