setup-typescript-monorepo
Version:
Convert Workspaces to TypeScript's Project References
161 lines • 7.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.toProjectReferences = exports.UNSET_FLAG = void 0;
var tslib_1 = require("tslib");
var fs_1 = tslib_1.__importStar(require("fs"));
var path_1 = tslib_1.__importDefault(require("path"));
var comment_json_1 = tslib_1.__importDefault(require("comment-json"));
var workspaces_1 = require("./manager/workspaces");
var assert_1 = tslib_1.__importDefault(require("assert"));
exports.UNSET_FLAG = "__unset__";
exports.toProjectReferences = function (options) {
options.onlyPackages = options.onlyPackages || [];
options.indentation = options.indentation || 2;
var plugins = Array.isArray(options.plugins) && options.plugins.length > 0 ? options.plugins : [workspaces_1.plugin];
var pluginImplementations = plugins.map(function (plugin) { return plugin(options); });
// use first plugin
var supportPlugin = pluginImplementations.find(function (plugin) {
return plugin.supports();
});
if (!supportPlugin) {
throw new Error("Not found supported plugin");
}
var relativeName = function (pkgPath) {
return path_1.default.relative(options.rootDir, pkgPath);
};
var allPackages = supportPlugin.getAllPackages();
var onlyPackagesDeps = flatten(options.onlyPackages
.map(function (x) { return allPackages.find(function (y) { return y.packageJSON.name === x; }); })
.map(function (x) { return getDependencies(x.packageJSON).filter(function (k) { return allPackages.find(function (x) { return x.packageJSON.name === k; }); }); }));
var errors = [];
allPackages.forEach(function (packageInfo) {
var _a, _b, _c, _d, _e;
// TODO add the package.json script
// skip if not in onlyPackages
if ((_a = options.onlyPackages) === null || _a === void 0 ? void 0 : _a.length) {
var name = packageInfo.packageJSON.name;
if (!options.onlyPackages.includes(name) && !onlyPackagesDeps.includes(name)) {
return;
}
}
var tsconfigFilePath = (_c = (_b = options.tsConfigPathFinder) === null || _b === void 0 ? void 0 : _b.call(options, packageInfo.location)) !== null && _c !== void 0 ? _c : path_1.default.join(packageInfo.location, "tsconfig.json");
if (!fs_1.default.existsSync(tsconfigFilePath)) {
// Skip has not tsconfig.json
return;
}
if (options.onlyOnPath && !isChildOf(path_1.default.resolve(packageInfo.location), path_1.default.resolve(options.onlyOnPath))) {
return;
}
// NO MORE CHECKS ///////////////////////////////
if (!options.checkOnly && options.addEsmTsconfig) {
if (options.addEsmTsconfig === true) {
options.addEsmTsconfig = "tsconfig.esm.json";
}
if (!fs_1.existsSync(options.addEsmTsconfig)) {
var esmTsconfig = JSON.stringify({
extends: "./tsconfig.json",
compilerOptions: {
module: "ESNext",
moduleResolution: "Node",
outDir: "./esm"
}
}, null, options.indentation);
fs_1.writeFileSync(path_1.default.resolve(packageInfo.location, options.addEsmTsconfig), esmTsconfig);
}
}
var tsconfigJSON = comment_json_1.default.parse(fs_1.default.readFileSync(tsconfigFilePath, "utf-8"));
var newTsconfigJSON = comment_json_1.default.parse(comment_json_1.default.stringify(tsconfigJSON), undefined, true);
if (options.addComposite) {
setCompilerOption(newTsconfigJSON, "composite", true);
}
if (options.addRootDir) {
setCompilerOption(newTsconfigJSON, "rootDir", options.addRootDir);
}
if (options.addExtends) {
newTsconfigJSON["extends"] = path_1.default.relative(path_1.default.resolve(packageInfo.location), path_1.default.resolve(options.addExtends));
}
if ((_d = options.addInclude) === null || _d === void 0 ? void 0 : _d.length) {
if (!newTsconfigJSON["include"]) {
newTsconfigJSON["include"] = [];
}
var includes_1 = newTsconfigJSON["include"];
options.addInclude.forEach(function (x) {
if (!includes_1.includes(x)) {
includes_1.push(x);
}
});
}
var references = supportPlugin.getDependencies(packageInfo.packageJSON);
var newProjectReferences = references
.map(function (reference) {
var absolutePathOrNull = supportPlugin.resolve(reference);
if (!absolutePathOrNull) {
return;
}
if (!path_1.default.isAbsolute(absolutePathOrNull)) {
throw new Error("Plugin#resolve should return absolute path: " + absolutePathOrNull + ", plugin: " + supportPlugin);
}
if (packageInfo.location === absolutePathOrNull) {
var selfName = relativeName(packageInfo.location);
throw new Error("[" + selfName + "] Self dependencies is something wrong: " + selfName + " refer to " + relativeName(absolutePathOrNull));
}
return {
path: path_1.default.relative(packageInfo.location, absolutePathOrNull)
};
})
.filter(function (r) { return Boolean(r); });
newTsconfigJSON["references"] = newProjectReferences;
if (options.checkOnly) {
// console.log(newTsconfigJSON, tsconfigJSON);
try {
assert_1.default.deepStrictEqual(pureObject(tsconfigJSON), pureObject(newTsconfigJSON));
}
catch (e) {
// console.log("tsconfig different than expected");
errors.push(e.message);
}
}
else {
// update
var indentation = (_e = options.indentation) !== null && _e !== void 0 ? _e : 2;
fs_1.default.writeFileSync(tsconfigFilePath, options.removeComments
? JSON.stringify(newTsconfigJSON, null, indentation)
: comment_json_1.default.stringify(newTsconfigJSON, null, indentation), "utf-8");
}
});
if (errors.length) {
return {
ok: false,
errors: errors
};
}
return {
ok: true
};
};
function pureObject(x) {
return JSON.parse(JSON.stringify(comment_json_1.default.parse(comment_json_1.default.stringify(x), undefined, true)));
}
function flatten(arr) {
return arr.reduce(function (flat, toFlatten) {
return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
}, []);
}
function setCompilerOption(newTsconfigJSON, k, v) {
var compilerOptions = newTsconfigJSON["compilerOptions"];
if (!compilerOptions) {
newTsconfigJSON["compilerOptions"] = {};
}
newTsconfigJSON["compilerOptions"][k] = v;
}
function getDependencies(packageJSON) {
return tslib_1.__spreadArrays(Object.keys(packageJSON.dependencies || {}), Object.keys(packageJSON.devDependencies || {}));
}
var isChildOf = function (child, parent) {
if (child === parent)
return false;
var parentTokens = parent.split("/").filter(function (i) { return i.length; });
var childTokens = child.split("/").filter(function (i) { return i.length; });
return parentTokens.every(function (t, i) { return childTokens[i] === t; });
};
//# sourceMappingURL=index.js.map