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 diff --git a/packages/tsconfck/src/parse.js b/packages/tsconfck/src/parse.js index 48ac090..0c51ce8 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); @@ -134,11 +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)) { - 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 replaceTokens(tsconfig, dir); + return tsconfig; } /** 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/parse-native.js b/packages/tsconfck/tests/parse-native.js index deea123..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.slice(3).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/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) { 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 58a641e..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 @@ -3,17 +3,18 @@ "../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" + "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 58a641e..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 @@ -3,17 +3,18 @@ "../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" + "baseUrl": "/parse/valid/configDir/b/src", + "outDir": "/parse/valid/configDir/b/build" } } \ No newline at end of file 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) { 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); diff --git a/packages/tsconfck/types/index.d.ts.map b/packages/tsconfck/types/index.d.ts.map index a4bb954..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;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;cA6VdC,kBAAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC7VTC,WAAWA;cAkOpBC,wBAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;WC5PpBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAkCnBC,oBAAoBA;;;;WAIpBC,sBAAsBA;;;;;;;;;;;;;;;WAetBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BnBC,0BAA0BA;;;;;;;;;;;;WAY1BC,yBAAyBA" } \ No newline at end of file