diff --git a/common/changes/@rushstack/heft-typescript-plugin/fix-sarif-logs_2025-11-11-23-06.json b/common/changes/@rushstack/heft-typescript-plugin/fix-sarif-logs_2025-11-11-23-06.json new file mode 100644 index 00000000000..1793cbd9b44 --- /dev/null +++ b/common/changes/@rushstack/heft-typescript-plugin/fix-sarif-logs_2025-11-11-23-06.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@rushstack/heft-typescript-plugin", + "comment": "Support \"${configDir}\" token in tsconfig when using file copier.", + "type": "patch" + } + ], + "packageName": "@rushstack/heft-typescript-plugin" +} \ No newline at end of file diff --git a/heft-plugins/heft-typescript-plugin/src/TypeScriptPlugin.ts b/heft-plugins/heft-typescript-plugin/src/TypeScriptPlugin.ts index d0e40e5edb9..cd47dfc1b89 100644 --- a/heft-plugins/heft-typescript-plugin/src/TypeScriptPlugin.ts +++ b/heft-plugins/heft-typescript-plugin/src/TypeScriptPlugin.ts @@ -32,6 +32,12 @@ import { getTsconfigFilePath } from './tsconfigLoader'; */ export const PLUGIN_NAME: 'typescript-plugin' = 'typescript-plugin'; +/** + * The ${configDir} token supported in TypeScript 5.5 + * @see {@link https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html#the-configdir-template-variable-for-configuration-files} + */ +const CONFIG_DIR_TOKEN: '${configDir}' = '${configDir}'; + /** * @beta */ @@ -203,7 +209,20 @@ export async function loadPartialTsconfigFileAsync( }, jsonPathMetadata: { '$.compilerOptions.outDir': { - pathResolutionMethod: PathResolutionMethod.resolvePathRelativeToConfigurationFile + pathResolutionMethod: PathResolutionMethod.custom, + customResolver( + resolverOptions: ConfigurationFile.IJsonPathMetadataResolverOptions + ): string { + if (resolverOptions.propertyValue.includes(CONFIG_DIR_TOKEN)) { + // Typescript 5.5. introduced the `${configDir}` token to refer to the directory containing the root tsconfig + const configDir: string = path.dirname(tsconfigFilePath); + // The token is an absolute path, so it should occur at most once. + return path.resolve(resolverOptions.propertyValue.replace(CONFIG_DIR_TOKEN, configDir)); + } else { + const thisConfigDir: string = path.dirname(resolverOptions.configurationFilePath); + return path.resolve(thisConfigDir, resolverOptions.propertyValue); + } + } } } }); diff --git a/rigs/local-node-rig/profiles/default/tsconfig-base.json b/rigs/local-node-rig/profiles/default/tsconfig-base.json index dff2ef99dc1..418d1448e6f 100644 --- a/rigs/local-node-rig/profiles/default/tsconfig-base.json +++ b/rigs/local-node-rig/profiles/default/tsconfig-base.json @@ -8,11 +8,11 @@ "isolatedModules": true, "target": "es2018", - "outDir": "../../../../lib", - "rootDir": "../../../../src", + "outDir": "${configDir}/lib", + "rootDir": "${configDir}/src", "types": ["heft-jest", "node"], - "typeRoots": ["../../../../node_modules/@types", "../../node_modules/@types"] + "typeRoots": ["${configDir}/node_modules/@types", "../../node_modules/@types"] }, - "include": ["../../../../src/**/*.ts", "../../../../src/**/*.tsx"] + "include": ["${configDir}/src/**/*.ts", "${configDir}/src/**/*.tsx"] } diff --git a/rigs/local-web-rig/profiles/app/tsconfig-base.json b/rigs/local-web-rig/profiles/app/tsconfig-base.json index 79e596dfb8f..03bbe4b704b 100644 --- a/rigs/local-web-rig/profiles/app/tsconfig-base.json +++ b/rigs/local-web-rig/profiles/app/tsconfig-base.json @@ -10,12 +10,12 @@ "target": "es2017", "lib": ["es2017", "scripthost", "es2015.collection", "es2015.promise", "es2015.iterable", "dom"], - "outDir": "../../../../lib", - "rootDir": "../../../../src", - "rootDirs": ["../../../../src", "../../../../temp/sass-ts"], + "outDir": "${configDir}/lib", + "rootDir": "${configDir}/src", + "rootDirs": ["${configDir}/src", "${configDir}/temp/sass-ts"], "types": ["heft-jest", "webpack-env"], - "typeRoots": ["../../../../node_modules/@types", "../../node_modules/@types"] + "typeRoots": ["${configDir}/node_modules/@types", "../../node_modules/@types"] }, - "include": ["../../../../src/**/*.ts", "../../../../src/**/*.tsx"] + "include": ["${configDir}/src/**/*.ts", "${configDir}/src/**/*.tsx"] } diff --git a/rigs/local-web-rig/profiles/library/tsconfig-base.json b/rigs/local-web-rig/profiles/library/tsconfig-base.json index 5a3404cad09..b3568c82cdb 100644 --- a/rigs/local-web-rig/profiles/library/tsconfig-base.json +++ b/rigs/local-web-rig/profiles/library/tsconfig-base.json @@ -7,12 +7,12 @@ "resolveJsonModule": true, "isolatedModules": true, - "outDir": "../../../../lib", - "rootDir": "../../../../src", - "rootDirs": ["../../../../src", "../../../../temp/sass-ts"], + "outDir": "${configDir}/lib", + "rootDir": "${configDir}/src", + "rootDirs": ["${configDir}/src", "${configDir}/temp/sass-ts"], "types": ["heft-jest", "webpack-env"], - "typeRoots": ["../../../../node_modules/@types", "../../node_modules/@types"] + "typeRoots": ["${configDir}/node_modules/@types", "../../node_modules/@types"] }, - "include": ["../../../../src/**/*.ts", "../../../../src/**/*.tsx"] + "include": ["${configDir}/src/**/*.ts", "${configDir}/src/**/*.tsx"] }