From 8fdc653aeb1c791d3a6d851b51550e7f9c77204d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Pernod?= Date: Wed, 26 Jun 2024 11:57:15 +0200 Subject: [PATCH 01/10] Fix normalizeSnapshot when repository path contains special characters --- packages/tsconfck/tests/util/expect.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tsconfck/tests/util/expect.js b/packages/tsconfck/tests/util/expect.js index 95acf63..a0d5871 100644 --- a/packages/tsconfck/tests/util/expect.js +++ b/packages/tsconfck/tests/util/expect.js @@ -2,7 +2,7 @@ import { expect } from 'vitest'; import { fixtures, snapName } from './fixture-paths.js'; const fixtureDirRegex = new RegExp( - fixtures.replace(/[.*+?^${}()|[\]]/g, '\\$&').replace(/[/\\]/g, '[/\\\\]'), + fixtures.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/(\/|\\\\)/g, '[/\\\\]'), 'g' ); function normalizeSnapshot(str) { From 472cf875c6255474eb64c31559a0bda07c81d6b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Pernod?= Date: Wed, 26 Jun 2024 16:08:35 +0200 Subject: [PATCH 02/10] Fix check for TS 5.5 --- packages/tsconfck/tests/parse-native.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tsconfck/tests/parse-native.js b/packages/tsconfck/tests/parse-native.js index deea123..4c9cd65 100644 --- a/packages/tsconfck/tests/parse-native.js +++ b/packages/tsconfck/tests/parse-native.js @@ -12,8 +12,8 @@ import { transform as esbuildTransform } from 'esbuild'; import ts from 'typescript'; import { TSConfckCache } from '../src/cache.js'; -const ts_ver = ts.version.slice(3).split('.'); -const IS_TS_5_5 = ts_ver[0] >= 5 && ts_ver[1] >= 5; +const ts_ver = ts.version.split('.'); +const IS_TS_5_5 = +ts_ver[0] >= 5 && +ts_ver[1] >= 5; describe('parse', () => { it('should be a function', () => { From e7efaf678b72cb195a0e58e1069fcb07323e79f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Pernod?= Date: Wed, 26 Jun 2024 16:30:35 +0200 Subject: [PATCH 03/10] Fix configDir tests --- packages/tsconfck/src/parse.js | 3 ++- .../parse/valid/configDir/a/tsconfig.json.parse.json | 8 ++++---- .../parse/valid/configDir/b/tsconfig.json.parse.json | 8 ++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/tsconfck/src/parse.js b/packages/tsconfck/src/parse.js index 48ac090..6ce01a1 100644 --- a/packages/tsconfck/src/parse.js +++ b/packages/tsconfck/src/parse.js @@ -53,6 +53,7 @@ export async function parse(filename, options) { result = await parseFile(tsconfigFile, cache, filename === tsconfigFile); await Promise.all([parseExtends(result, cache), parseReferences(result, options)]); } + result.tsconfig = replaceTokens(result.tsconfig, path.dirname(tsconfigFile)); resolve(resolveSolutionTSConfig(filename, result)); } catch (e) { reject(e); @@ -138,7 +139,7 @@ function normalizeTSConfig(tsconfig, dir) { tsconfig.compilerOptions.baseUrl = resolve2posix(dir, tsconfig.compilerOptions.baseUrl); } - return replaceTokens(tsconfig, dir); + return tsconfig; } /** diff --git a/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse.json b/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse.json index 58a641e..b26f32a 100644 --- a/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse.json +++ b/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse.json @@ -3,17 +3,17 @@ "../tsconfig.base.json" ], "include": [ - "/parse/valid/configDir/**/*" + "/parse/valid/configDir/a/**/*" ], "exclude": [ - "/parse/valid/configDir/src/**/*.spec.ts" + "/parse/valid/configDir/a/src/**/*.spec.ts" ], "compilerOptions": { "paths": { "$src": [ - "/parse/valid/configDir/src/**/*" + "/parse/valid/configDir/a/src/**/*" ] }, - "outDir": "/parse/valid/configDir/build" + "outDir": "/parse/valid/configDir/a/build" } } \ No newline at end of file diff --git a/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse.json b/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse.json index 58a641e..de0ba58 100644 --- a/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse.json +++ b/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse.json @@ -3,17 +3,17 @@ "../tsconfig.base.json" ], "include": [ - "/parse/valid/configDir/**/*" + "/parse/valid/configDir/b/**/*" ], "exclude": [ - "/parse/valid/configDir/src/**/*.spec.ts" + "/parse/valid/configDir/b/src/**/*.spec.ts" ], "compilerOptions": { "paths": { "$src": [ - "/parse/valid/configDir/src/**/*" + "/parse/valid/configDir/b/src/**/*" ] }, - "outDir": "/parse/valid/configDir/build" + "outDir": "/parse/valid/configDir/b/build" } } \ No newline at end of file From 46b9cf3d517a9c090ee2aa05161bbbc2b07d3201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Pernod?= Date: Wed, 26 Jun 2024 16:49:52 +0200 Subject: [PATCH 04/10] Add support for baseUrl --- packages/tsconfck/src/parse.js | 6 +++++- .../tests/fixtures/parse/valid/configDir/tsconfig.base.json | 1 + .../parse/valid/configDir/a/tsconfig.json.parse-native.json | 1 + .../parse/valid/configDir/a/tsconfig.json.parse.json | 1 + .../parse/valid/configDir/b/tsconfig.json.parse-native.json | 1 + .../parse/valid/configDir/b/tsconfig.json.parse.json | 1 + 6 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/tsconfck/src/parse.js b/packages/tsconfck/src/parse.js index 6ce01a1..d7c57cb 100644 --- a/packages/tsconfck/src/parse.js +++ b/packages/tsconfck/src/parse.js @@ -135,7 +135,11 @@ async function parseFile(tsconfigFile, cache, skipCache) { */ function normalizeTSConfig(tsconfig, dir) { // set baseUrl to absolute path - if (tsconfig.compilerOptions?.baseUrl && !path.isAbsolute(tsconfig.compilerOptions.baseUrl)) { + if ( + tsconfig.compilerOptions?.baseUrl && + !tsconfig.compilerOptions.baseUrl.startsWith('${configDir}') && + !path.isAbsolute(tsconfig.compilerOptions.baseUrl) + ) { tsconfig.compilerOptions.baseUrl = resolve2posix(dir, tsconfig.compilerOptions.baseUrl); } diff --git a/packages/tsconfck/tests/fixtures/parse/valid/configDir/tsconfig.base.json b/packages/tsconfck/tests/fixtures/parse/valid/configDir/tsconfig.base.json index c1a48dc..8d3596c 100644 --- a/packages/tsconfck/tests/fixtures/parse/valid/configDir/tsconfig.base.json +++ b/packages/tsconfck/tests/fixtures/parse/valid/configDir/tsconfig.base.json @@ -5,6 +5,7 @@ "paths": { "$src": ["${configDir}/src/**/*"] }, + "baseUrl": "${configDir}/src", "outDir": "${configDir}/build" } } \ No newline at end of file diff --git a/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse-native.json b/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse-native.json index b26f32a..396eb32 100644 --- a/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse-native.json +++ b/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse-native.json @@ -14,6 +14,7 @@ "/parse/valid/configDir/a/src/**/*" ] }, + "baseUrl": "/parse/valid/configDir/a/src", "outDir": "/parse/valid/configDir/a/build" } } \ No newline at end of file diff --git a/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse.json b/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse.json index b26f32a..396eb32 100644 --- a/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse.json +++ b/packages/tsconfck/tests/snapshots/parse/valid/configDir/a/tsconfig.json.parse.json @@ -14,6 +14,7 @@ "/parse/valid/configDir/a/src/**/*" ] }, + "baseUrl": "/parse/valid/configDir/a/src", "outDir": "/parse/valid/configDir/a/build" } } \ No newline at end of file diff --git a/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse-native.json b/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse-native.json index de0ba58..2e9a390 100644 --- a/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse-native.json +++ b/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse-native.json @@ -14,6 +14,7 @@ "/parse/valid/configDir/b/src/**/*" ] }, + "baseUrl": "/parse/valid/configDir/b/src", "outDir": "/parse/valid/configDir/b/build" } } \ No newline at end of file diff --git a/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse.json b/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse.json index de0ba58..2e9a390 100644 --- a/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse.json +++ b/packages/tsconfck/tests/snapshots/parse/valid/configDir/b/tsconfig.json.parse.json @@ -14,6 +14,7 @@ "/parse/valid/configDir/b/src/**/*" ] }, + "baseUrl": "/parse/valid/configDir/b/src", "outDir": "/parse/valid/configDir/b/build" } } \ No newline at end of file From c44024b563e44d6060f807b3080e9f72548d8f95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Pernod?= Date: Wed, 26 Jun 2024 17:37:53 +0200 Subject: [PATCH 05/10] Fix index.d.ts.map file --- packages/tsconfck/types/index.d.ts.map | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tsconfck/types/index.d.ts.map b/packages/tsconfck/types/index.d.ts.map index a4bb954..3a8f2d4 100644 --- a/packages/tsconfck/types/index.d.ts.map +++ b/packages/tsconfck/types/index.d.ts.map @@ -38,5 +38,5 @@ null, null ], - "mappings": ";;;;;;;;iBAUsBA,IAAIA;;;;;;;;iBCYJC,OAAOA;;;;;;;iBCTbC,MAAMA;;;;;;;;;;iBCDAC,UAAUA;cCXnBC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC2BJC,KAAKA;cA4VdC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC5VTC,WAAWA;cAkOpBC,wBAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;WC5PpBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkCnBC,oBAAoBA;;;;WAIpBC,sBAAsBA;;;;;;;;;;;;;;;WAetBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BnBC,0BAA0BA;;;;;;;;;;;;WAY1BC,yBAAyBA" + "mappings": ";;;;;;;;iBAUsBA,IAAIA;;;;;;;;iBCYJC,OAAOA;;;;;;;iBCTbC,MAAMA;;;;;;;;;;iBCDAC,UAAUA;cCXnBC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC2BJC,KAAKA;cAiWdC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCjWTC,WAAWA;cAkOpBC,wBAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;WC5PpBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkCnBC,oBAAoBA;;;;WAIpBC,sBAAsBA;;;;;;;;;;;;;;;WAetBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BnBC,0BAA0BA;;;;;;;;;;;;WAY1BC,yBAAyBA" } \ No newline at end of file From 9732cf49cfd73b1110a10df98d6b01fdf9247cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Pernod?= Date: Wed, 26 Jun 2024 18:01:56 +0200 Subject: [PATCH 06/10] Add changeset --- .changeset/cyan-pumas-dream.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/cyan-pumas-dream.md diff --git a/.changeset/cyan-pumas-dream.md b/.changeset/cyan-pumas-dream.md new file mode 100644 index 0000000..1fd3cbd --- /dev/null +++ b/.changeset/cyan-pumas-dream.md @@ -0,0 +1,5 @@ +--- +'tsconfck': patch +--- + +Fix ts 5.5 `${configDir}` expansion From 8bbf4bc53fd4e37823bbb580d0fd8b0a7fcc7455 Mon Sep 17 00:00:00 2001 From: dominikg Date: Wed, 26 Jun 2024 19:02:50 +0200 Subject: [PATCH 07/10] test: add testcase for configDir replacement to avoid regressions on correct path expansion --- packages/tsconfck/tests/parse.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/tsconfck/tests/parse.js b/packages/tsconfck/tests/parse.js index fc7d192..ec28cc4 100644 --- a/packages/tsconfck/tests/parse.js +++ b/packages/tsconfck/tests/parse.js @@ -11,6 +11,7 @@ import { promises as fs } from 'node:fs'; import { transform as esbuildTransform } from 'esbuild'; import ts from 'typescript'; import { TSConfckCache } from '../src/cache.js'; +import { native2posix } from '../src/util.js'; describe('parse', () => { it('should be a function', () => { @@ -56,6 +57,17 @@ describe('parse', () => { } }); + it('should replace configDir', async () => { + const samples = await globFixtures('parse/valid/configDir/**/tsconfig.json'); + for (const filename of samples) { + const actual = await parse(filename); + expect(actual.tsconfigFile).toBe(filename); + expect(actual.tsconfig.compilerOptions.outDir).toBe( + native2posix(path.dirname(filename) + '/build') + ); + } + }); + it('should resolve with expected valid jsconfig.json with configName=jsconfig.json', async () => { const samples = await globFixtures('parse/valid/**/jsconfig.json'); for (const filename of samples) { From b0421f22c4c315f797ccbc338acc5125dd4a67e6 Mon Sep 17 00:00:00 2001 From: dominikg Date: Wed, 26 Jun 2024 19:10:15 +0200 Subject: [PATCH 08/10] chore: refactor version detection in tests --- packages/tsconfck/tests/parse-native.js | 5 ++--- packages/tsconfck/tests/util/features.js | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 packages/tsconfck/tests/util/features.js diff --git a/packages/tsconfck/tests/parse-native.js b/packages/tsconfck/tests/parse-native.js index 4c9cd65..484de5c 100644 --- a/packages/tsconfck/tests/parse-native.js +++ b/packages/tsconfck/tests/parse-native.js @@ -12,8 +12,7 @@ import { transform as esbuildTransform } from 'esbuild'; import ts from 'typescript'; import { TSConfckCache } from '../src/cache.js'; -const ts_ver = ts.version.split('.'); -const IS_TS_5_5 = +ts_ver[0] >= 5 && +ts_ver[1] >= 5; +import { FEAT_$CONFIGDIR } from './util/features.js'; describe('parse', () => { it('should be a function', () => { @@ -54,7 +53,7 @@ describe('parse', () => { it('should resolve with expected valid tsconfig.json', async () => { const samples = await globFixtures('parse/valid/**/tsconfig.json'); for (const filename of samples) { - if (!IS_TS_5_5 && filename.includes('configDir')) { + if (!FEAT_$CONFIGDIR && filename.includes('configDir')) { continue; // configDir doesn't work in 5.4 } const actual = await parseNative(filename); diff --git a/packages/tsconfck/tests/util/features.js b/packages/tsconfck/tests/util/features.js new file mode 100644 index 0000000..93b180c --- /dev/null +++ b/packages/tsconfck/tests/util/features.js @@ -0,0 +1,4 @@ +import ts from 'typescript'; + +const [major, minor] = ts.version.split('.', 3).map((n) => Number(n)); +export const FEAT_$CONFIGDIR = major > 5 || (major === 5 && minor >= 5); From 8b291aa185dcdfa856e5d5a1d3a9892cf7e71f27 Mon Sep 17 00:00:00 2001 From: dominikg Date: Wed, 26 Jun 2024 19:11:06 +0200 Subject: [PATCH 09/10] refactor: shorten baseUrl resolve code --- packages/tsconfck/src/parse.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/tsconfck/src/parse.js b/packages/tsconfck/src/parse.js index d7c57cb..0c51ce8 100644 --- a/packages/tsconfck/src/parse.js +++ b/packages/tsconfck/src/parse.js @@ -135,14 +135,10 @@ async function parseFile(tsconfigFile, cache, skipCache) { */ function normalizeTSConfig(tsconfig, dir) { // set baseUrl to absolute path - if ( - tsconfig.compilerOptions?.baseUrl && - !tsconfig.compilerOptions.baseUrl.startsWith('${configDir}') && - !path.isAbsolute(tsconfig.compilerOptions.baseUrl) - ) { - tsconfig.compilerOptions.baseUrl = resolve2posix(dir, tsconfig.compilerOptions.baseUrl); + const baseUrl = tsconfig.compilerOptions?.baseUrl; + if (baseUrl && !baseUrl.startsWith('${') && !path.isAbsolute(baseUrl)) { + tsconfig.compilerOptions.baseUrl = resolve2posix(dir, baseUrl); } - return tsconfig; } From d0b180490519c02d80a3f213a9bbf40a1e49f5b3 Mon Sep 17 00:00:00 2001 From: dominikg Date: Wed, 26 Jun 2024 19:11:28 +0200 Subject: [PATCH 10/10] chore: generate types map --- packages/tsconfck/types/index.d.ts.map | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tsconfck/types/index.d.ts.map b/packages/tsconfck/types/index.d.ts.map index 3a8f2d4..eb00355 100644 --- a/packages/tsconfck/types/index.d.ts.map +++ b/packages/tsconfck/types/index.d.ts.map @@ -38,5 +38,5 @@ null, null ], - "mappings": ";;;;;;;;iBAUsBA,IAAIA;;;;;;;;iBCYJC,OAAOA;;;;;;;iBCTbC,MAAMA;;;;;;;;;;iBCDAC,UAAUA;cCXnBC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC2BJC,KAAKA;cAiWdC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCjWTC,WAAWA;cAkOpBC,wBAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;WC5PpBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkCnBC,oBAAoBA;;;;WAIpBC,sBAAsBA;;;;;;;;;;;;;;;WAetBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BnBC,0BAA0BA;;;;;;;;;;;;WAY1BC,yBAAyBA" + "mappings": ";;;;;;;;iBAUsBA,IAAIA;;;;;;;;iBCYJC,OAAOA;;;;;;;iBCTbC,MAAMA;;;;;;;;;;iBCDAC,UAAUA;cCXnBC,aAAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC2BJC,KAAKA;cA6VdC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC7VTC,WAAWA;cAkOpBC,wBAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;WC5PpBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkCnBC,oBAAoBA;;;;WAIpBC,sBAAsBA;;;;;;;;;;;;;;;WAetBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BnBC,0BAA0BA;;;;;;;;;;;;WAY1BC,yBAAyBA" } \ No newline at end of file