UNPKG

setup-typescript-monorepo

Version:

Convert Workspaces to TypeScript's Project References

161 lines 7.62 kB
"use strict"; 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