Skip to content

Commit

Permalink
fix(scripts): resolve api-extractor execution issue within packages w…
Browse files Browse the repository at this point in the history
…ith new DX
  • Loading branch information
Hotell committed Aug 13, 2021
1 parent 2cf6ef0 commit 5a674b9
Showing 1 changed file with 82 additions and 2 deletions.
84 changes: 82 additions & 2 deletions scripts/tasks/api-extractor.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import fs from 'fs';
import * as glob from 'glob';
import * as path from 'path';
import { apiExtractorVerifyTask, task, series } from 'just-scripts';
import jju from 'jju';
import { apiExtractorVerifyTask, task, series, resolveCwd, logger, TscTaskOptions } from 'just-scripts';

const noop = () => {};

const apiExtractorConfigs = glob
.sync(path.join(process.cwd(), 'config/api-extractor*.json'))
Expand All @@ -14,10 +18,86 @@ export function apiExtractor() {
return apiExtractorConfigs.length
? series(
...apiExtractorConfigs.map(([configPath, configName]) => {
// 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 cleanupOverrides = overrideApi ? overrideApi.resetConfig : () => noop;

const taskName = `api-extractor:${configName}`;
task(taskName, apiExtractorVerifyTask({ configJsonFilePath: configPath, localBuild }));

task(
taskName,
series(
() => {
overrideApi && overrideApi.overrideConfig();
},
() => {
try {
return apiExtractorVerifyTask({ configJsonFilePath: configPath, localBuild });
} catch (err) {
cleanupOverrides();
console.error(err);
process.exit(1);
}
},
() => {
cleanupOverrides();
},
),
);

return taskName;
}),
)
: 'no-op';
}

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)
*/
compilerOptions: TscTaskOptions;
include?: string[];
exclude?: string[];
}

function overrideExtractorConfigForPackagesWithTsPathAliases(options: {
tsConfigPath: string;
apiExtractorConfigPath: string;
}) {
const tsConfig: TsConfig = jju.parse(fs.readFileSync(options.tsConfigPath, 'utf-8'));
const shouldOverrideConfig = Boolean(tsConfig.extends);

if (!shouldOverrideConfig) {
return null;
}

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' });

tsConfig.compilerOptions.baseUrl = '.';
apiExtractorConfigOriginal.compiler = {
overrideTsconfig: tsConfig,
};

const api = {
overrideConfig: () => {
const newContent = jju.update(originalContent, apiExtractorConfigOriginal, { mode: 'json', indent: 2 });

fs.writeFileSync(options.apiExtractorConfigPath, newContent, 'utf-8');
},
resetConfig: () => {
fs.writeFileSync(options.apiExtractorConfigPath, originalContent, 'utf-8');
},
};

return api;
}

0 comments on commit 5a674b9

Please sign in to comment.