Skip to content

Commit 8222326

Browse files
Copilotmjbvz
andcommitted
Add js/ts.implicitProjectConfig.strict setting for implicit projects
- Add strict property to ImplicitProjectConfiguration class - Update inferredProjectCompilerOptions to handle strict setting - Add configuration setting to package.json with default true - Add localization string for the new setting - Create unit tests for the new functionality This enables strict mode by default in implicit JS/TS projects, aligning with TS 6.0. Co-authored-by: mjbvz <12821956+mjbvz@users.noreply.github.com>
1 parent 5bccc90 commit 8222326

File tree

6 files changed

+139
-0
lines changed

6 files changed

+139
-0
lines changed

extensions/typescript-language-features/package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,12 @@
302302
"markdownDescription": "%configuration.implicitProjectConfig.strictFunctionTypes%",
303303
"scope": "window"
304304
},
305+
"js/ts.implicitProjectConfig.strict": {
306+
"type": "boolean",
307+
"default": true,
308+
"markdownDescription": "%configuration.implicitProjectConfig.strict%",
309+
"scope": "window"
310+
},
305311
"typescript.tsc.autoDetect": {
306312
"type": "string",
307313
"default": "on",

extensions/typescript-language-features/package.nls.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
"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.",
8787
"configuration.implicitProjectConfig.strictNullChecks": "Enable/disable [strict null checks](https://www.typescriptlang.org/tsconfig#strictNullChecks) in JavaScript and TypeScript files that are not part of a project. Existing `jsconfig.json` or `tsconfig.json` files override this setting.",
8888
"configuration.implicitProjectConfig.strictFunctionTypes": "Enable/disable [strict function types](https://www.typescriptlang.org/tsconfig#strictFunctionTypes) in JavaScript and TypeScript files that are not part of a project. Existing `jsconfig.json` or `tsconfig.json` files override this setting.",
89+
"configuration.implicitProjectConfig.strict": "Enable/disable [strict mode](https://www.typescriptlang.org/tsconfig#strict) in JavaScript and TypeScript files that are not part of a project. Existing `jsconfig.json` or `tsconfig.json` files override this setting.",
8990
"configuration.suggest.jsdoc.generateReturns": "Enable/disable generating `@returns` annotations for JSDoc templates.",
9091
"configuration.suggest.autoImports": "Enable/disable auto import suggestions.",
9192
"configuration.preferGoToSourceDefinition": "Makes `Go to Definition` avoid type declaration files when possible by triggering `Go to Source Definition` instead. This allows `Go to Source Definition` to be triggered with the mouse gesture.",

extensions/typescript-language-features/src/configuration/configuration.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export class ImplicitProjectConfiguration {
6464
public readonly experimentalDecorators: boolean;
6565
public readonly strictNullChecks: boolean;
6666
public readonly strictFunctionTypes: boolean;
67+
public readonly strict: boolean;
6768

6869
constructor(configuration: vscode.WorkspaceConfiguration) {
6970
this.target = ImplicitProjectConfiguration.readTarget(configuration);
@@ -72,6 +73,7 @@ export class ImplicitProjectConfiguration {
7273
this.experimentalDecorators = ImplicitProjectConfiguration.readExperimentalDecorators(configuration);
7374
this.strictNullChecks = ImplicitProjectConfiguration.readImplicitStrictNullChecks(configuration);
7475
this.strictFunctionTypes = ImplicitProjectConfiguration.readImplicitStrictFunctionTypes(configuration);
76+
this.strict = ImplicitProjectConfiguration.readImplicitStrict(configuration);
7577
}
7678

7779
public isEqualTo(other: ImplicitProjectConfiguration): boolean {
@@ -101,6 +103,10 @@ export class ImplicitProjectConfiguration {
101103
private static readImplicitStrictFunctionTypes(configuration: vscode.WorkspaceConfiguration): boolean {
102104
return configuration.get<boolean>('js/ts.implicitProjectConfig.strictFunctionTypes', true);
103105
}
106+
107+
private static readImplicitStrict(configuration: vscode.WorkspaceConfiguration): boolean {
108+
return configuration.get<boolean>('js/ts.implicitProjectConfig.strict', true);
109+
}
104110
}
105111

106112
export interface TypeScriptServiceConfiguration {
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import * as assert from 'assert';
7+
import 'mocha';
8+
import { ImplicitProjectConfiguration } from '../../configuration/configuration';
9+
10+
suite('ImplicitProjectConfiguration', () => {
11+
12+
test('should default strict to true', () => {
13+
const mockConfiguration = {
14+
get: <T>(key: string, defaultValue?: T): T => {
15+
// Return default values for all settings except when explicitly overridden
16+
if (key === 'js/ts.implicitProjectConfig.strict') {
17+
return (true as any) as T;
18+
}
19+
return defaultValue as T;
20+
}
21+
} as any;
22+
23+
const config = new ImplicitProjectConfiguration(mockConfiguration);
24+
assert.strictEqual(config.strict, true);
25+
});
26+
27+
test('should respect user setting for strict', () => {
28+
const mockConfiguration = {
29+
get: <T>(key: string, defaultValue?: T): T => {
30+
if (key === 'js/ts.implicitProjectConfig.strict') {
31+
return (false as any) as T;
32+
}
33+
return defaultValue as T;
34+
}
35+
} as any;
36+
37+
const config = new ImplicitProjectConfiguration(mockConfiguration);
38+
assert.strictEqual(config.strict, false);
39+
});
40+
41+
test('should include strict in equality comparison', () => {
42+
const mockConfigurationTrue = {
43+
get: <T>(key: string, defaultValue?: T): T => {
44+
if (key === 'js/ts.implicitProjectConfig.strict') {
45+
return (true as any) as T;
46+
}
47+
return defaultValue as T;
48+
}
49+
} as any;
50+
51+
const mockConfigurationFalse = {
52+
get: <T>(key: string, defaultValue?: T): T => {
53+
if (key === 'js/ts.implicitProjectConfig.strict') {
54+
return (false as any) as T;
55+
}
56+
return defaultValue as T;
57+
}
58+
} as any;
59+
60+
const configTrue1 = new ImplicitProjectConfiguration(mockConfigurationTrue);
61+
const configTrue2 = new ImplicitProjectConfiguration(mockConfigurationTrue);
62+
const configFalse = new ImplicitProjectConfiguration(mockConfigurationFalse);
63+
64+
assert.strictEqual(configTrue1.isEqualTo(configTrue2), true);
65+
assert.strictEqual(configTrue1.isEqualTo(configFalse), false);
66+
});
67+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import * as assert from 'assert';
7+
import 'mocha';
8+
import { ImplicitProjectConfiguration } from '../../configuration/configuration';
9+
import { API } from '../../tsServer/api';
10+
import { inferredProjectCompilerOptions, ProjectType } from '../../tsconfig';
11+
12+
suite('inferredProjectCompilerOptions', () => {
13+
14+
function createMockServiceConfig(strictValue: boolean) {
15+
const mockConfiguration = {
16+
get: <T>(key: string, defaultValue?: T): T => {
17+
if (key === 'js/ts.implicitProjectConfig.strict') {
18+
return (strictValue as any) as T;
19+
}
20+
return defaultValue as T;
21+
}
22+
} as any;
23+
24+
return {
25+
implicitProjectConfiguration: new ImplicitProjectConfiguration(mockConfiguration)
26+
} as any;
27+
}
28+
29+
test('should include strict: true when setting is enabled', () => {
30+
const serviceConfig = createMockServiceConfig(true);
31+
const version = API.fromVersionString('4.0.0');
32+
33+
const options = inferredProjectCompilerOptions(version, ProjectType.TypeScript, serviceConfig);
34+
35+
assert.strictEqual(options.strict, true);
36+
});
37+
38+
test('should not include strict when setting is disabled', () => {
39+
const serviceConfig = createMockServiceConfig(false);
40+
const version = API.fromVersionString('4.0.0');
41+
42+
const options = inferredProjectCompilerOptions(version, ProjectType.TypeScript, serviceConfig);
43+
44+
assert.strictEqual(options.strict, undefined);
45+
});
46+
47+
test('should work for JavaScript projects', () => {
48+
const serviceConfig = createMockServiceConfig(true);
49+
const version = API.fromVersionString('4.0.0');
50+
51+
const options = inferredProjectCompilerOptions(version, ProjectType.JavaScript, serviceConfig);
52+
53+
assert.strictEqual(options.strict, true);
54+
});
55+
});

extensions/typescript-language-features/src/tsconfig.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ export function inferredProjectCompilerOptions(
5555
projectConfig.strictFunctionTypes = true;
5656
}
5757

58+
if (serviceConfig.implicitProjectConfiguration.strict) {
59+
projectConfig.strict = true;
60+
}
61+
5862
if (serviceConfig.implicitProjectConfiguration.module) {
5963
projectConfig.module = serviceConfig.implicitProjectConfiguration.module as Proto.ModuleKind;
6064
}

0 commit comments

Comments
 (0)