Skip to content

Commit ae7f273

Browse files
committed
fix(plugin-typescript): include extended options
1 parent 44e4934 commit ae7f273

File tree

5 files changed

+66
-34
lines changed

5 files changed

+66
-34
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"compilerOptions": {
3+
"rootDir": "./src",
4+
"verbatimModuleSyntax": false
5+
},
6+
"include": ["src/**/*.ts"]
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"extends": "./tsconfig.extends-base.json",
3+
"compilerOptions": {
4+
"verbatimModuleSyntax": true,
5+
"module": "CommonJS"
6+
},
7+
"exclude": ["src/*-errors/**/*.ts"]
8+
}

packages/plugin-typescript/src/lib/runner/ts-runner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export type DiagnosticsOptions = {
1313
export async function getTypeScriptDiagnostics({
1414
tsconfig,
1515
}: DiagnosticsOptions): Promise<readonly Diagnostic[]> {
16-
const { fileNames, options } = await loadTargetConfig(tsconfig);
16+
const { fileNames, options } = loadTargetConfig(tsconfig);
1717
try {
1818
const program = createProgram(fileNames, options);
1919
return getPreEmitDiagnostics(program);

packages/plugin-typescript/src/lib/runner/utils.int.test.ts

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,23 @@ import { describe, expect } from 'vitest';
33
import { loadTargetConfig } from './utils.js';
44

55
describe('loadTargetConfig', () => {
6-
const parseConfigFileTextToJsonSpy = vi.spyOn(
7-
tsModule,
8-
'parseConfigFileTextToJson',
9-
);
6+
const readConfigFileSpy = vi.spyOn(tsModule, 'readConfigFile');
107
const parseJsonConfigFileContentSpy = vi.spyOn(
118
tsModule,
129
'parseJsonConfigFileContent',
1310
);
1411

15-
it('should return the parsed content of a tsconfig file and ist TypeScript helper to parse it', async () => {
16-
await expect(
12+
it('should return the parsed content of a tsconfig file and ist TypeScript helper to parse it', () => {
13+
expect(
1714
loadTargetConfig(
1815
'packages/plugin-typescript/mocks/fixtures/basic-setup/tsconfig.init.json',
1916
),
20-
).resolves.toStrictEqual(
17+
).toStrictEqual(
2118
expect.objectContaining({
2219
fileNames: expect.any(Array),
2320
options: {
2421
module: 1,
25-
configFilePath: undefined,
22+
configFilePath: expect.stringContaining('tsconfig.init.json'),
2623
esModuleInterop: true,
2724
forceConsistentCasingInFileNames: true,
2825
skipLibCheck: true,
@@ -31,25 +28,40 @@ describe('loadTargetConfig', () => {
3128
},
3229
}),
3330
);
34-
expect(parseConfigFileTextToJsonSpy).toHaveBeenCalledTimes(1);
35-
expect(parseConfigFileTextToJsonSpy).toHaveBeenCalledWith(
36-
'packages/plugin-typescript/mocks/fixtures/basic-setup/tsconfig.init.json',
37-
expect.stringContaining('/* Projects */'),
31+
expect(readConfigFileSpy).toHaveBeenCalledTimes(1);
32+
expect(readConfigFileSpy).toHaveBeenCalledWith(
33+
expect.stringContaining('tsconfig.init.json'),
34+
expect.any(Function),
3835
);
3936
expect(parseJsonConfigFileContentSpy).toHaveBeenCalledTimes(1);
40-
expect(parseJsonConfigFileContentSpy).toHaveBeenCalledWith(
37+
// parseJsonConfigFileContent is called with complex internal objects
38+
});
39+
40+
it('should return the parsed content of a tsconfig file that extends another config', () => {
41+
expect(
42+
loadTargetConfig(
43+
'packages/plugin-typescript/mocks/fixtures/basic-setup/tsconfig.extends-extending.json',
44+
),
45+
).toStrictEqual(
4146
expect.objectContaining({
42-
compilerOptions: expect.objectContaining({
43-
esModuleInterop: true,
44-
forceConsistentCasingInFileNames: true,
45-
module: 'commonjs',
46-
skipLibCheck: true,
47-
strict: true,
48-
target: 'es2016',
47+
fileNames: expect.arrayContaining([
48+
// from tsconfig.extends-base.json#includes and tsconfig.extends-extending.json#excludes
49+
expect.stringContaining('src/0-no-diagnostics/'),
50+
]),
51+
options: expect.objectContaining({
52+
// Options from tsconfig.extends-base.json
53+
rootDir: expect.stringContaining('src'),
54+
// Options from tsconfig.extends-extending.json
55+
module: 1,
56+
configFilePath: expect.stringContaining(
57+
'tsconfig.extends-extending.json',
58+
),
59+
verbatimModuleSyntax: true, // Overrides base config's false
4960
}),
5061
}),
51-
expect.any(Object),
52-
expect.any(String),
5362
);
63+
64+
expect(readConfigFileSpy).toHaveBeenCalledTimes(1);
65+
expect(parseJsonConfigFileContentSpy).toHaveBeenCalledTimes(1);
5466
});
5567
});

packages/plugin-typescript/src/lib/runner/utils.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
// eslint-disable-next-line unicorn/import-style
2-
import { dirname } from 'node:path';
1+
import path from 'node:path';
32
import {
43
type Diagnostic,
54
DiagnosticCategory,
65
flattenDiagnosticMessageText,
7-
parseConfigFileTextToJson,
86
parseJsonConfigFileContent,
7+
readConfigFile,
98
sys,
109
} from 'typescript';
1110
import type { Issue } from '@code-pushup/models';
12-
import { readTextFile, truncateIssueMessage } from '@code-pushup/utils';
11+
import { truncateIssueMessage } from '@code-pushup/utils';
1312
import { TS_CODE_RANGE_NAMES } from './ts-error-codes.js';
1413
import type { CodeRangeName } from './types.js';
1514

@@ -84,7 +83,7 @@ export function getIssueFromDiagnostic(diag: Diagnostic) {
8483
return {
8584
...issue,
8685
source: {
87-
file: diag.file.fileName,
86+
file: path.relative(process.cwd(), diag.file.fileName),
8887
...(startLine
8988
? {
9089
position: {
@@ -96,16 +95,22 @@ export function getIssueFromDiagnostic(diag: Diagnostic) {
9695
} satisfies Issue;
9796
}
9897

99-
export async function loadTargetConfig(tsConfigPath: string) {
100-
const { config } = parseConfigFileTextToJson(
101-
tsConfigPath,
102-
await readTextFile(tsConfigPath),
103-
);
98+
export function loadTargetConfig(tsConfigPath: string) {
99+
const resolvedConfigPath = path.resolve(tsConfigPath);
100+
const { config, error } = readConfigFile(resolvedConfigPath, sys.readFile);
101+
102+
if (error) {
103+
throw new Error(
104+
`Error reading TypeScript config file: \n${error.messageText}`,
105+
);
106+
}
104107

105108
const parsedConfig = parseJsonConfigFileContent(
106109
config,
107110
sys,
108-
dirname(tsConfigPath),
111+
path.dirname(resolvedConfigPath),
112+
{},
113+
resolvedConfigPath,
109114
);
110115

111116
if (parsedConfig.fileNames.length === 0) {

0 commit comments

Comments
 (0)