UNPKG

oao

Version:

A Yarn-based, opinionated monorepo management tool

282 lines (211 loc) 9.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _timm = require("timm"); var _storyboard = require("storyboard"); var _kebabCase = _interopRequireDefault(require("kebab-case")); var _readSpecs = require("./utils/readSpecs"); var _constants = require("./utils/constants"); var _helpers = require("./utils/helpers"); var _removeInternalLinks2 = _interopRequireDefault(require("./utils/removeInternalLinks")); var _writeSpecs = _interopRequireDefault(require("./utils/writeSpecs")); var _shell = require("./utils/shell"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } const PASS_THROUGH_OPTS = ['dev', 'peer', 'optional', 'exact', 'tilde', 'ignoreEngines']; const run = /*#__PURE__*/ function () { var _ref = _asyncToGenerator(function* (pkgName0, op, deps, opts) { const src = opts.src, ignoreSrc = opts.ignoreSrc, linkPattern = opts.link; const pkgName = pkgName0 === '.' || pkgName0 === 'ROOT' ? _readSpecs.ROOT_PACKAGE : pkgName0; const allSpecs = yield (0, _readSpecs.readAllSpecs)(src, ignoreSrc); if (!allSpecs[pkgName]) { _storyboard.mainStory.error(`No such package: ${pkgName}`); process.exit(1); } const _allSpecs$pkgName = allSpecs[pkgName], pkgPath = _allSpecs$pkgName.pkgPath, specPath = _allSpecs$pkgName.specPath, prevSpecs = _allSpecs$pkgName.specs; // Very little to do when using yarn workspaces ;) if (opts.workspaces) { _storyboard.mainStory.info('Using yarn workspaces...'); const cmd = getYarnCommand(op, deps, opts); yield (0, _shell.exec)(cmd, { cwd: pkgPath }); return; } // Proceed, the old way const pkgNames = Object.keys(allSpecs); // Add/remove/upgrade EXTERNAL dependencies: // 1. Remove internal links from package.json // 2. Run `yarn add/remove/upgrade` as needed (if it fails, revert to original specs and abort) // 3. Add the original internal links back to package.json const externalDeps = deps.filter(dep => !isLinked(pkgNames, linkPattern, dep)); const externalOperation = externalDeps.length || op === 'upgrade' && !deps.length; if (externalOperation) { const _removeInternalLinks = (0, _removeInternalLinks2.default)(prevSpecs, pkgNames, linkPattern), nextSpecs = _removeInternalLinks.nextSpecs, removedPackagesByType = _removeInternalLinks.removedPackagesByType; let succeeded = false; try { if (nextSpecs !== prevSpecs) (0, _writeSpecs.default)(specPath, nextSpecs); _storyboard.mainStory.info(`Executing 'yarn ${op}'...`); const cmd = getYarnCommand(op, externalDeps, opts); yield (0, _shell.exec)(cmd, { cwd: pkgPath }); succeeded = true; } catch (err) {} /* ignore */ // If unsuccessful, revert to the original specs if (!succeeded) { if (prevSpecs != null) (0, _writeSpecs.default)(specPath, prevSpecs); return; } // Read the updated package.json, and add the internal deps const _readOneSpec = (0, _readSpecs.readOneSpec)(pkgPath), updatedSpecs = _readOneSpec.specs; let finalSpecs = updatedSpecs; Object.keys(removedPackagesByType).forEach(type => { const removedPackages = removedPackagesByType[type]; const nextDeps = (0, _timm.merge)(updatedSpecs[type] || {}, removedPackages); finalSpecs = (0, _timm.set)(finalSpecs, type, nextDeps); }); (0, _writeSpecs.default)(specPath, finalSpecs); } // Add/remove/upgrade INTERNAL dependencies: const internalDeps = deps.filter(dep => isLinked(pkgNames, linkPattern, dep)); const internalOperation = internalDeps.length || op === 'upgrade' && !deps.length; if (internalOperation) { _storyboard.mainStory.info(`Processing '${op}' on internal dependencies...`); const _readOneSpec2 = (0, _readSpecs.readOneSpec)(pkgPath), specs = _readOneSpec2.specs; let nextSpecs; switch (op) { case 'add': nextSpecs = yield addInternal(specs, internalDeps, pkgPath, allSpecs, opts); break; case 'remove': nextSpecs = yield removeInternal(specs, internalDeps, pkgPath); break; case 'upgrade': nextSpecs = upgradeInternal(specs, internalDeps, allSpecs, linkPattern); break; default: throw new Error('INVALID_ADD_REMOVE_UPGRADE_COMMAND'); } if (nextSpecs !== prevSpecs) (0, _writeSpecs.default)(specPath, nextSpecs); } }); return function run(_x, _x2, _x3, _x4) { return _ref.apply(this, arguments); }; }(); const addInternal = /*#__PURE__*/ function () { var _ref2 = _asyncToGenerator(function* (prevSpecs, deps, pkgPath, allSpecs, opts) { let nextSpecs = prevSpecs; for (let i = 0; i < deps.length; i++) { const _parseDep = (0, _helpers.parseDep)(deps[i]), depName = _parseDep.name, depVersion0 = _parseDep.version; try { _storyboard.mainStory.info(`Linking ${_storyboard.chalk.cyan.bold(depName)}...`); yield (0, _shell.exec)(`yarn link ${depName}`, { cwd: pkgPath, logLevel: 'trace', errorLogLevel: 'trace' }); } catch (err) { /* ignore unlink errors */ } let depType; if (opts.dev) depType = 'devDependencies';else if (opts.peer) depType = 'peerDependencies';else if (opts.optional) depType = 'optionalDependencies';else depType = 'dependencies'; let depVersion = depVersion0; if (!depVersion) { depVersion = allSpecs[depName] ? allSpecs[depName].specs.version : '*'; if (depVersion !== '*') { if (opts.tilde) depVersion = `~${depVersion}`;else if (!opts.exact) depVersion = `^${depVersion}`; } } nextSpecs = (0, _timm.setIn)(nextSpecs, [depType, depName], depVersion); } return nextSpecs; }); return function addInternal(_x5, _x6, _x7, _x8, _x9) { return _ref2.apply(this, arguments); }; }(); const removeInternal = /*#__PURE__*/ function () { var _ref3 = _asyncToGenerator(function* (prevSpecs, deps, pkgPath) { let nextSpecs = prevSpecs; for (let i = 0; i < deps.length; i++) { const _parseDep2 = (0, _helpers.parseDep)(deps[i]), depName = _parseDep2.name; try { _storyboard.mainStory.info(`Unlinking ${_storyboard.chalk.cyan.bold(depName)}...`); yield (0, _shell.exec)(`yarn unlink ${depName}`, { cwd: pkgPath, logLevel: 'trace', errorLogLevel: 'trace' }); } catch (err) { /* ignore unlink errors */ } for (let k = 0; k < _constants.DEP_TYPES.length; k++) { const type = _constants.DEP_TYPES[k]; if (!nextSpecs[type]) continue; nextSpecs = (0, _timm.setIn)(nextSpecs, [type, depName], undefined); } } return nextSpecs; }); return function removeInternal(_x10, _x11, _x12) { return _ref3.apply(this, arguments); }; }(); const upgradeInternal = (prevSpecs, deps, allSpecs, linkPattern) => { const pkgNames = Object.keys(allSpecs); let nextSpecs = prevSpecs; const targetVersions = {}; deps.forEach(dep => { const _parseDep3 = (0, _helpers.parseDep)(dep), name = _parseDep3.name, version = _parseDep3.version; targetVersions[name] = version; }); _constants.DEP_TYPES.forEach(type => { Object.keys(nextSpecs[type] || {}).forEach(depName => { if (!isLinked(pkgNames, linkPattern, depName)) return; let depVersion = targetVersions[depName]; if (!depVersion && allSpecs[depName]) { depVersion = `^${allSpecs[depName].specs.version}`; } nextSpecs = (0, _timm.setIn)(nextSpecs, [type, depName], depVersion); }); }); return nextSpecs; }; const isLinked = (pkgNames, linkPattern, dep) => { const _parseDep4 = (0, _helpers.parseDep)(dep), pkgName = _parseDep4.name; if (pkgNames.indexOf(pkgName) >= 0) return true; if (linkPattern && new RegExp(linkPattern).test(pkgName)) return true; return false; }; const getYarnCommand = (op, dependencies, options) => { let cmd = `yarn ${op}`; if (dependencies.length) cmd += ` ${dependencies.join(' ')}`; PASS_THROUGH_OPTS.forEach(key => { if (options[key]) cmd += ` --${(0, _kebabCase.default)(key)}`; }); return cmd; }; var _default = run; exports.default = _default;