"use strict";
|
Object.defineProperty(exports, "__esModule", { value: true });
|
const path_1 = require("path");
|
function parseTypeScriptConfiguration(typescript, configFileName, configFileContext, configOverwriteJSON, parseConfigFileHost) {
|
const parsedConfigFileJSON = typescript.readConfigFile(configFileName, parseConfigFileHost.readFile);
|
const overwrittenConfigFileJSON = Object.assign(Object.assign(Object.assign({}, (parsedConfigFileJSON.config || {})), configOverwriteJSON), { compilerOptions: Object.assign(Object.assign({}, ((parsedConfigFileJSON.config || {}).compilerOptions || {})), (configOverwriteJSON.compilerOptions || {})) });
|
const parsedConfigFile = typescript.parseJsonConfigFileContent(overwrittenConfigFileJSON, parseConfigFileHost, configFileContext);
|
return Object.assign(Object.assign({}, parsedConfigFile), { options: Object.assign(Object.assign({}, parsedConfigFile.options), { configFilePath: configFileName }), errors: parsedConfigFileJSON.error ? [parsedConfigFileJSON.error] : parsedConfigFile.errors });
|
}
|
exports.parseTypeScriptConfiguration = parseTypeScriptConfiguration;
|
function getDependenciesFromTypeScriptConfiguration(typescript, parsedConfiguration, configFileContext, parseConfigFileHost, processedConfigFiles = []) {
|
var _a;
|
const files = new Set(parsedConfiguration.fileNames);
|
const configFilePath = parsedConfiguration.options.configFilePath;
|
if (typeof configFilePath === 'string') {
|
files.add(configFilePath);
|
}
|
const dirs = new Set(Object.keys(parsedConfiguration.wildcardDirectories || {}));
|
const excluded = new Set((((_a = parsedConfiguration.raw) === null || _a === void 0 ? void 0 : _a.exclude) || []).map((path) => path_1.resolve(configFileContext, path)));
|
for (const projectReference of parsedConfiguration.projectReferences || []) {
|
const childConfigFilePath = typescript.resolveProjectReferencePath(projectReference);
|
const childConfigContext = path_1.dirname(childConfigFilePath);
|
if (processedConfigFiles.includes(childConfigFilePath)) {
|
// handle circular dependencies
|
continue;
|
}
|
const childParsedConfiguration = parseTypeScriptConfiguration(typescript, childConfigFilePath, childConfigContext, {}, parseConfigFileHost);
|
const childDependencies = getDependenciesFromTypeScriptConfiguration(typescript, childParsedConfiguration, childConfigContext, parseConfigFileHost, [...processedConfigFiles, childConfigFilePath]);
|
childDependencies.files.forEach((file) => {
|
files.add(file);
|
});
|
childDependencies.dirs.forEach((dir) => {
|
dirs.add(dir);
|
});
|
}
|
const extensions = [
|
typescript.Extension.Ts,
|
typescript.Extension.Tsx,
|
typescript.Extension.Js,
|
typescript.Extension.Jsx,
|
typescript.Extension.TsBuildInfo,
|
];
|
return {
|
files: Array.from(files).map((file) => path_1.normalize(file)),
|
dirs: Array.from(dirs).map((dir) => path_1.normalize(dir)),
|
excluded: Array.from(excluded).map((path) => path_1.normalize(path)),
|
extensions: extensions,
|
};
|
}
|
exports.getDependenciesFromTypeScriptConfiguration = getDependenciesFromTypeScriptConfiguration;
|
function isIncrementalCompilation(options) {
|
return Boolean((options.incremental || options.composite) && !options.outFile);
|
}
|
exports.isIncrementalCompilation = isIncrementalCompilation;
|
function removeJsonExtension(path) {
|
if (path.endsWith('.json')) {
|
return path.slice(0, -'.json'.length);
|
}
|
else {
|
return path;
|
}
|
}
|
function getTsBuildInfoEmitOutputFilePath(typescript, options) {
|
if (typeof typescript.getTsBuildInfoEmitOutputFilePath === 'function') {
|
// old TypeScript version doesn't provides this method
|
return typescript.getTsBuildInfoEmitOutputFilePath(options);
|
}
|
// based on the implementation from typescript
|
const configFile = options.configFilePath;
|
if (!isIncrementalCompilation(options)) {
|
return undefined;
|
}
|
if (options.tsBuildInfoFile) {
|
return options.tsBuildInfoFile;
|
}
|
const outPath = options.outFile || options.out;
|
let buildInfoExtensionLess;
|
if (outPath) {
|
buildInfoExtensionLess = removeJsonExtension(outPath);
|
}
|
else {
|
if (!configFile) {
|
return undefined;
|
}
|
const configFileExtensionLess = removeJsonExtension(configFile);
|
buildInfoExtensionLess = options.outDir
|
? options.rootDir
|
? path_1.resolve(options.outDir, path_1.relative(options.rootDir, configFileExtensionLess))
|
: path_1.resolve(options.outDir, path_1.basename(configFileExtensionLess))
|
: configFileExtensionLess;
|
}
|
return buildInfoExtensionLess + '.tsbuildinfo';
|
}
|
function getArtifactsFromTypeScriptConfiguration(typescript, parsedConfiguration, configFileContext, parseConfigFileHost, processedConfigFiles = []) {
|
const files = new Set();
|
const dirs = new Set();
|
if (parsedConfiguration.fileNames.length > 0) {
|
if (parsedConfiguration.options.outFile) {
|
files.add(path_1.resolve(configFileContext, parsedConfiguration.options.outFile));
|
}
|
const tsBuildInfoPath = getTsBuildInfoEmitOutputFilePath(typescript, parsedConfiguration.options);
|
if (tsBuildInfoPath) {
|
files.add(path_1.resolve(configFileContext, tsBuildInfoPath));
|
}
|
if (parsedConfiguration.options.outDir) {
|
dirs.add(path_1.resolve(configFileContext, parsedConfiguration.options.outDir));
|
}
|
}
|
for (const projectReference of parsedConfiguration.projectReferences || []) {
|
const configFile = typescript.resolveProjectReferencePath(projectReference);
|
if (processedConfigFiles.includes(configFile)) {
|
// handle circular dependencies
|
continue;
|
}
|
const parsedConfiguration = parseTypeScriptConfiguration(typescript, configFile, path_1.dirname(configFile), {}, parseConfigFileHost);
|
const childArtifacts = getArtifactsFromTypeScriptConfiguration(typescript, parsedConfiguration, configFileContext, parseConfigFileHost, [...processedConfigFiles, configFile]);
|
childArtifacts.files.forEach((file) => {
|
files.add(file);
|
});
|
childArtifacts.dirs.forEach((dir) => {
|
dirs.add(dir);
|
});
|
}
|
const extensions = [
|
typescript.Extension.Dts,
|
typescript.Extension.Js,
|
typescript.Extension.TsBuildInfo,
|
];
|
return {
|
files: Array.from(files).map((file) => path_1.normalize(file)),
|
dirs: Array.from(dirs).map((dir) => path_1.normalize(dir)),
|
excluded: [],
|
extensions,
|
};
|
}
|
exports.getArtifactsFromTypeScriptConfiguration = getArtifactsFromTypeScriptConfiguration;
|