diff --git a/scripts/tasks/api-extractor.ts b/scripts/tasks/api-extractor.ts index cb01c326fe5d65..2d30e3575aaee6 100644 --- a/scripts/tasks/api-extractor.ts +++ b/scripts/tasks/api-extractor.ts @@ -13,21 +13,27 @@ const apiExtractorConfigs = glob const localBuild = !process.env.TF_BUILD; export function apiExtractor() { - console.log({ configPath: path.join(process.cwd(), 'config/api-extractor*.json'), apiExtractorConfigs }); - return apiExtractorConfigs.length ? series( ...apiExtractorConfigs.map(([configPath, configName]) => { - const { modified, original } = backportTsAliasedPackages({ apiExtractorConfigPath: configPath }); + // note we have `"strictNullChecks": false,` turned off - so from TS point of view this always returns API 🚨 + const overrideApi = overrideExtractorConfigForPackagesWithTsPathAliases({ + apiExtractorConfigPath: configPath, + tsConfigPath: resolveCwd('./tsconfig.json'), + }); const taskName = `api-extractor:${configName}`; task( taskName, series( - () => modified(), + () => { + overrideApi && overrideApi.overrideConfig(); + }, apiExtractorVerifyTask({ configJsonFilePath: configPath, localBuild }), - () => original(), + () => { + overrideApi && overrideApi.resetConfig(); + }, ), ); @@ -39,43 +45,50 @@ export function apiExtractor() { interface TsConfig { extends?: string; - // typescript doesn't provide a correct type for the compiler options file - // (typescript.CompilerOptions has enum values instead of raw options in some cases) + + /** + * typescript doesn't provide a correct type for the compiler options file + * -> (typescript.CompilerOptions has enum values instead of raw options in some cases) + */ compilerOptions: TscTaskOptions; include?: string[]; exclude?: string[]; } -function backportTsAliasedPackages(options: { apiExtractorConfigPath: string }) { - console.log({ options }); - const tsConfigFilePath = resolveCwd('./tsconfig.json'); - const tsConfig: TsConfig = jju.parse(fs.readFileSync(tsConfigFilePath, 'utf-8')); - - const normalizedOptions = { ...tsConfig }; +function overrideExtractorConfigForPackagesWithTsPathAliases(options: { + tsConfigPath: string; + apiExtractorConfigPath: string; +}) { + const tsConfig: TsConfig = jju.parse(fs.readFileSync(options.tsConfigPath, 'utf-8')); + const overriddenTsConfig = { ...tsConfig }; + const shouldOverrideConfig = Boolean(overriddenTsConfig.extends); - if (normalizedOptions.extends) { - logger.info(`package is using TS path aliases. Overriding ts compiler settings for api-extractor.`); - normalizedOptions.compilerOptions.baseUrl = '.'; + if (!shouldOverrideConfig) { + return null; } - const originalContent = fs.readFileSync(options.apiExtractorConfigPath, 'utf-8'); + logger.info(`📣 API-EXTRACTOR: package is using TS path aliases. Overriding ts compiler settings for api-extractor.`); + const originalContent = fs.readFileSync(options.apiExtractorConfigPath, 'utf-8'); const apiExtractorConfigOriginal = jju.parse(originalContent, { mode: 'json' }); - console.log({ apiExtractorConfigOriginal }); + + overriddenTsConfig.compilerOptions.baseUrl = '.'; apiExtractorConfigOriginal.compiler = { - overrideTsconfig: normalizedOptions, + overrideTsconfig: overriddenTsConfig, }; - const writeConfig = { - modified: () => { - // console.log(jju.stringify(apiExtractorConfigNew, { mode: 'json' })); + console.log({ apiExtractorConfigOriginal }); + + const api = { + overrideConfig: () => { const newContent = jju.update(originalContent, apiExtractorConfigOriginal, { mode: 'json', indent: 2 }); + fs.writeFileSync(options.apiExtractorConfigPath, newContent, 'utf-8'); }, - original: () => { + resetConfig: () => { fs.writeFileSync(options.apiExtractorConfigPath, originalContent, 'utf-8'); }, }; - return writeConfig; + return api; }