UNPKG

lerna

Version:

Lerna is a fast, modern build system for managing and publishing multiple JavaScript/TypeScript packages from the same repository

1,526 lines (1,504 loc) 90.8 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __esm = (fn, res) => function __init() { return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; }; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // libs/child-process/src/set-exit-code.ts function setExitCode(code) { process.exitCode = code; } var init_set_exit_code = __esm({ "libs/child-process/src/set-exit-code.ts"() { "use strict"; } }); // libs/child-process/src/index.ts var src_exports = {}; __export(src_exports, { exec: () => exec, execSync: () => execSync, getChildProcessCount: () => getChildProcessCount, getExitCode: () => getExitCode, spawn: () => spawn, spawnStreaming: () => spawnStreaming }); function exec(command, args, opts) { const options = Object.assign({ stdio: "pipe" }, opts); const spawned = spawnProcess(command, args, options); return wrapError(spawned); } function execSync(command, args, opts) { return import_execa.default.sync(command, args, opts).stdout; } function spawn(command, args, opts) { const options = Object.assign({}, opts, { stdio: "inherit" }); const spawned = spawnProcess(command, args, options); return wrapError(spawned); } function spawnStreaming(command, args, opts, prefix) { const options = Object.assign({}, opts); options.stdio = ["ignore", "pipe", "pipe"]; const spawned = spawnProcess(command, args, options); const stdoutOpts = {}; const stderrOpts = {}; if (prefix) { const colorName = colorWheel[currentColor % NUM_COLORS]; const color = colorName; currentColor += 1; stdoutOpts.tag = `${color.bold(prefix)}:`; stderrOpts.tag = `${color(prefix)}:`; } if (children.size > process.stdout.listenerCount("close")) { process.stdout.setMaxListeners(children.size); process.stderr.setMaxListeners(children.size); } spawned.stdout?.pipe((0, import_strong_log_transformer.default)(stdoutOpts)).pipe(process.stdout); spawned.stderr?.pipe((0, import_strong_log_transformer.default)(stderrOpts)).pipe(process.stderr); return wrapError(spawned); } function getChildProcessCount() { return children.size; } function getExitCode(result) { if (result.exitCode) { return result.exitCode; } if (typeof result.code === "number") { return result.code; } if (typeof result.code === "string") { return import_os.default.constants.errno[result.code]; } return process.exitCode; } function spawnProcess(command, args, opts) { const child = (0, import_execa.default)(command, args, opts); const drain = (exitCode, signal) => { children.delete(child); if (signal === void 0) { child.removeListener("exit", drain); } if (exitCode) { setExitCode(exitCode); } }; child.once("exit", drain); child.once("error", drain); if (opts?.pkg) { child.pkg = opts.pkg; } children.add(child); return child; } function wrapError(spawned) { if (spawned.pkg) { return spawned.catch((err) => { err.exitCode = getExitCode(err); err.pkg = spawned.pkg; throw err; }); } return spawned; } var import_os, import_chalk, import_execa, import_strong_log_transformer, children, colorWheel, NUM_COLORS, currentColor; var init_src = __esm({ "libs/child-process/src/index.ts"() { "use strict"; import_os = __toESM(require("os")); import_chalk = __toESM(require("chalk")); import_execa = __toESM(require("execa")); import_strong_log_transformer = __toESM(require("strong-log-transformer")); init_set_exit_code(); children = /* @__PURE__ */ new Set(); colorWheel = [import_chalk.default.cyan, import_chalk.default.magenta, import_chalk.default.blue, import_chalk.default.yellow, import_chalk.default.green, import_chalk.default.blueBright]; NUM_COLORS = colorWheel.length; currentColor = 0; } }); // libs/core/src/lib/npm-conf/env-replace.ts function envReplace(str) { if (typeof str !== "string" || !str) { return str; } const regex = /(\\*)\$\{([^}]+)\}/g; return str.replace(regex, (orig, esc, name) => { esc = esc.length > 0 && esc.length % 2; if (esc) { return orig; } if (process.env[name] === void 0) { throw new Error(`Failed to replace env in config: ${orig}`); } return process.env[name]; }); } var init_env_replace = __esm({ "libs/core/src/lib/npm-conf/env-replace.ts"() { "use strict"; } }); // libs/core/src/lib/npm-conf/find-prefix.ts function findPrefix(start) { let dir = import_path7.default.resolve(start); let walkedUp = false; while (import_path7.default.basename(dir) === "node_modules") { dir = import_path7.default.dirname(dir); walkedUp = true; } if (walkedUp) { return dir; } return find(dir, dir); } function find(name, original) { if (name === "/" || process.platform === "win32" && /^[a-zA-Z]:(\\|\/)?$/.test(name)) { return original; } try { const files = import_fs3.default.readdirSync(name); if (files.indexOf("node_modules") !== -1 || files.indexOf("package.json") !== -1) { return name; } const dirname = import_path7.default.dirname(name); if (dirname === name) { return original; } return find(dirname, original); } catch (err) { if (name === original) { if (err.code === "ENOENT") { return original; } throw err; } return original; } } var import_fs3, import_path7; var init_find_prefix = __esm({ "libs/core/src/lib/npm-conf/find-prefix.ts"() { "use strict"; import_fs3 = __toESM(require("fs")); import_path7 = __toESM(require("path")); } }); // libs/core/src/lib/npm-conf/types.ts var require_types = __commonJS({ "libs/core/src/lib/npm-conf/types.ts"(exports) { "use strict"; var import_path11 = __toESM(require("path")); var import_stream = require("stream"); var import_url2 = __toESM(require("url")); var Umask = () => { }; var getLocalAddresses = () => []; var semver4 = () => { }; exports.types = { access: [null, "restricted", "public"], "allow-same-version": Boolean, "always-auth": Boolean, also: [null, "dev", "development"], audit: Boolean, "audit-level": ["low", "moderate", "high", "critical"], "auth-type": ["legacy", "sso", "saml", "oauth"], "bin-links": Boolean, browser: [null, String], ca: [null, String, Array], cafile: import_path11.default, cache: import_path11.default, "cache-lock-stale": Number, "cache-lock-retries": Number, "cache-lock-wait": Number, "cache-max": Number, "cache-min": Number, cert: [null, String], cidr: [null, String, Array], color: ["always", Boolean], depth: Number, description: Boolean, dev: Boolean, "dry-run": Boolean, editor: String, "engine-strict": Boolean, force: Boolean, "fetch-retries": Number, "fetch-retry-factor": Number, "fetch-retry-mintimeout": Number, "fetch-retry-maxtimeout": Number, git: String, "git-tag-version": Boolean, "commit-hooks": Boolean, global: Boolean, globalconfig: import_path11.default, "global-style": Boolean, group: [Number, String], "https-proxy": [null, import_url2.default], "user-agent": String, "ham-it-up": Boolean, heading: String, "if-present": Boolean, "ignore-prepublish": Boolean, "ignore-scripts": Boolean, "init-module": import_path11.default, "init-author-name": String, "init-author-email": String, "init-author-url": ["", import_url2.default], "init-license": String, "init-version": semver4, json: Boolean, key: [null, String], "legacy-bundling": Boolean, link: Boolean, "local-address": getLocalAddresses(), loglevel: ["silent", "error", "warn", "notice", "http", "timing", "info", "verbose", "silly"], logstream: import_stream.Stream, "logs-max": Number, long: Boolean, maxsockets: Number, message: String, "metrics-registry": [null, String], "node-options": [null, String], "node-version": [null, semver4], noproxy: [null, String, Array], offline: Boolean, "onload-script": [null, String], only: [null, "dev", "development", "prod", "production"], optional: Boolean, "package-lock": Boolean, otp: [null, String], "package-lock-only": Boolean, parseable: Boolean, "prefer-offline": Boolean, "prefer-online": Boolean, prefix: import_path11.default, preid: String, production: Boolean, progress: Boolean, // allow proxy to be disabled explicitly proxy: [null, false, import_url2.default], "read-only": Boolean, "rebuild-bundle": Boolean, registry: [null, import_url2.default], rollback: Boolean, save: Boolean, "save-bundle": Boolean, "save-dev": Boolean, "save-exact": Boolean, "save-optional": Boolean, "save-prefix": String, "save-prod": Boolean, scope: String, "script-shell": [null, String], "scripts-prepend-node-path": [false, true, "auto", "warn-only"], searchopts: String, searchexclude: [null, String], searchlimit: Number, searchstaleness: Number, "send-metrics": Boolean, shell: String, shrinkwrap: Boolean, "sign-git-commit": Boolean, "sign-git-tag": Boolean, "sso-poll-frequency": Number, "sso-type": [null, "oauth", "saml"], "strict-ssl": Boolean, tag: String, timing: Boolean, tmp: import_path11.default, unicode: Boolean, "unsafe-perm": Boolean, "update-notifier": Boolean, usage: Boolean, user: [Number, String], userconfig: import_path11.default, umask: Umask, version: Boolean, "tag-version-prefix": String, versions: Boolean, viewer: String, _exit: Boolean }; } }); // libs/core/src/lib/npm-conf/parse-field.ts function parseField(input, key) { if (typeof input !== "string") { return input; } const typeList = [].concat(types[key]); const isPath = typeList.indexOf(import_path8.default) !== -1; const isBool = typeList.indexOf(Boolean) !== -1; const isString = typeList.indexOf(String) !== -1; const isNumber = typeList.indexOf(Number) !== -1; let field = `${input}`.trim(); if (/^".*"$/.test(field)) { try { field = JSON.parse(field); } catch (err) { throw new Error(`Failed parsing JSON config key ${key}: ${field}`); } } if (isBool && !isString && field === "") { return true; } switch (field) { case "true": { return true; } case "false": { return false; } case "null": { return null; } case "undefined": { return void 0; } } field = envReplace(field); if (isPath) { const regex = process.platform === "win32" ? /^~(\/|\\)/ : /^~\//; if (regex.test(field) && process.env["HOME"]) { field = import_path8.default.resolve(process.env["HOME"], field.substr(2)); } field = import_path8.default.resolve(field); } if (isNumber && !Number.isNaN(field)) { field = Number(field); } return field; } var import_path8, types; var init_parse_field = __esm({ "libs/core/src/lib/npm-conf/parse-field.ts"() { "use strict"; import_path8 = __toESM(require("path")); init_env_replace(); ({ types } = require_types()); } }); // libs/core/src/lib/npm-conf/nerf-dart.ts function toNerfDart(uri) { const parsed = import_url.default.parse(uri); delete parsed.protocol; delete parsed.auth; delete parsed.query; delete parsed.search; delete parsed.hash; return import_url.default.resolve(import_url.default.format(parsed), "."); } var import_url; var init_nerf_dart = __esm({ "libs/core/src/lib/npm-conf/nerf-dart.ts"() { "use strict"; import_url = __toESM(require("url")); } }); // libs/core/src/lib/npm-conf/config-chain/proto-list.ts var require_proto_list = __commonJS({ "libs/core/src/lib/npm-conf/config-chain/proto-list.ts"(exports, module2) { "use strict"; module2.exports = ProtoList; function setProto(obj, proto) { if (typeof Object.setPrototypeOf === "function") return Object.setPrototypeOf(obj, proto); else obj.__proto__ = proto; } function ProtoList() { this.list = []; var root = null; Object.defineProperty(this, "root", { get: function() { return root; }, set: function(r) { root = r; if (this.list.length) { setProto(this.list[this.list.length - 1], r); } }, enumerable: true, configurable: true }); } ProtoList.prototype = { get length() { return this.list.length; }, get keys() { var k = []; for (var i in this.list[0]) k.push(i); return k; }, get snapshot() { var o2 = {}; this.keys.forEach(function(k) { o2[k] = this.get(k); }, this); return o2; }, get store() { return this.list[0]; }, push: function(obj) { if (typeof obj !== "object") obj = { valueOf: obj }; if (this.list.length >= 1) { setProto(this.list[this.list.length - 1], obj); } setProto(obj, this.root); return this.list.push(obj); }, pop: function() { if (this.list.length >= 2) { setProto(this.list[this.list.length - 2], this.root); } return this.list.pop(); }, unshift: function(obj) { setProto(obj, this.list[0] || this.root); return this.list.unshift(obj); }, shift: function() { if (this.list.length === 1) { setProto(this.list[0], this.root); } return this.list.shift(); }, get: function(key) { return this.list[0][key]; }, set: function(key, val, save) { if (!this.length) this.push({}); if (save && this.list[0].hasOwnProperty(key)) this.push({}); return this.list[0][key] = val; }, forEach: function(fn, thisp) { for (var key in this.list[0]) fn.call(thisp, key, this.list[0][key]); }, slice: function() { return this.list.slice.apply(this.list, arguments); }, splice: function() { var ret = this.list.splice.apply(this.list, arguments); for (var i = 0, l = this.list.length; i < l; i++) { setProto(this.list[i], this.list[i + 1] || this.root); } return ret; } }; } }); // libs/core/src/lib/npm-conf/config-chain/index.ts var require_config_chain = __commonJS({ "libs/core/src/lib/npm-conf/config-chain/index.ts"(exports, module2) { "use strict"; var ProtoList = require_proto_list(); var path9 = require("path"); var fs12 = require("fs"); var ini = require("ini"); var EE = require("events").EventEmitter; var url2 = require("url"); var http = require("http"); var exports = module2.exports = function() { var args = [].slice.call(arguments), conf = new ConfigChain2(); while (args.length) { var a = args.shift(); if (a) conf.push("string" === typeof a ? json(a) : a); } return conf; }; var find2 = exports.find = function() { var rel = path9.join.apply(null, [].slice.call(arguments)); function find3(start, rel2) { var file = path9.join(start, rel2); try { fs12.statSync(file); return file; } catch (err) { if (path9.dirname(start) !== start) return find3(path9.dirname(start), rel2); } } return find3(__dirname, rel); }; var parse = exports.parse = function(content, file, type) { content = "" + content; if (!type) { try { return JSON.parse(content); } catch (er) { return ini.parse(content); } } else if (type === "json") { if (this.emit) { try { return JSON.parse(content); } catch (er) { this.emit("error", er); } } else { return JSON.parse(content); } } else { return ini.parse(content); } }; var json = exports.json = function() { var args = [].slice.call(arguments).filter(function(arg) { return arg != null; }); var file = path9.join.apply(null, args); var content; try { content = fs12.readFileSync(file, "utf-8"); } catch (err) { return; } return parse(content, file, "json"); }; var env = exports.env = function(prefix, env2) { env2 = env2 || process.env; var obj = {}; var l = prefix.length; for (var k in env2) { if (k.indexOf(prefix) === 0) obj[k.substring(l)] = env2[k]; } return obj; }; exports.ConfigChain = ConfigChain2; function ConfigChain2() { EE.apply(this); ProtoList.apply(this, arguments); this._awaiting = 0; this._saving = 0; this.sources = {}; } var extras = { constructor: { value: ConfigChain2 } }; Object.keys(EE.prototype).forEach(function(k) { extras[k] = Object.getOwnPropertyDescriptor(EE.prototype, k); }); ConfigChain2.prototype = Object.create(ProtoList.prototype, extras); ConfigChain2.prototype.del = function(key, where) { if (where) { var target = this.sources[where]; target = target && target.data; if (!target) { return this.emit("error", new Error("not found " + where)); } delete target[key]; } else { for (var i = 0, l = this.list.length; i < l; i++) { delete this.list[i][key]; } } return this; }; ConfigChain2.prototype.set = function(key, value, where) { var target; if (where) { target = this.sources[where]; target = target && target.data; if (!target) { return this.emit("error", new Error("not found " + where)); } } else { target = this.list[0]; if (!target) { return this.emit("error", new Error("cannot set, no confs!")); } } target[key] = value; return this; }; ConfigChain2.prototype.get = function(key, where) { if (where) { where = this.sources[where]; if (where) where = where.data; if (where && Object.hasOwnProperty.call(where, key)) return where[key]; return void 0; } return this.list[0][key]; }; ConfigChain2.prototype.save = function(where, type, cb) { if (typeof type === "function") cb = type, type = null; var target = this.sources[where]; if (!target || !(target.path || target.source) || !target.data) { return this.emit("error", new Error("bad save target: " + where)); } if (target.source) { var pref = target.prefix || ""; Object.keys(target.data).forEach(function(k) { target.source[pref + k] = target.data[k]; }); return this; } var type = type || target.type; var data = target.data; if (target.type === "json") { data = JSON.stringify(data); } else { data = ini.stringify(data); } this._saving++; fs12.writeFile( target.path, data, "utf8", function(er) { this._saving--; if (er) { if (cb) return cb(er); else return this.emit("error", er); } if (this._saving === 0) { if (cb) cb(); this.emit("save"); } }.bind(this) ); return this; }; ConfigChain2.prototype.addFile = function(file, type, name) { name = name || file; var marker = { __source__: name }; this.sources[name] = { path: file, type }; this.push(marker); this._await(); fs12.readFile( file, "utf8", function(er, data) { if (er) this.emit("error", er); this.addString(data, file, type, marker); }.bind(this) ); return this; }; ConfigChain2.prototype.addEnv = function(prefix, env2, name) { name = name || "env"; var data = exports.env(prefix, env2); this.sources[name] = { data, source: env2, prefix }; return this.add(data, name); }; ConfigChain2.prototype.addUrl = function(req, type, name) { this._await(); var href = url2.format(req); name = name || href; var marker = { __source__: name }; this.sources[name] = { href, type }; this.push(marker); http.request( req, function(res) { var c = []; var ct = res.headers["content-type"]; if (!type) { type = ct.indexOf("json") !== -1 ? "json" : ct.indexOf("ini") !== -1 ? "ini" : href.match(/\.json$/) ? "json" : href.match(/\.ini$/) ? "ini" : null; marker.type = type; } res.on("data", c.push.bind(c)).on( "end", function() { this.addString(Buffer.concat(c), href, type, marker); }.bind(this) ).on("error", this.emit.bind(this, "error")); }.bind(this) ).on("error", this.emit.bind(this, "error")).end(); return this; }; ConfigChain2.prototype.addString = function(data, file, type, marker) { data = this.parse(data, file, type); this.add(data, marker); return this; }; ConfigChain2.prototype.add = function(data, marker) { if (marker && typeof marker === "object") { var i = this.list.indexOf(marker); if (i === -1) { return this.emit("error", new Error("bad marker")); } this.splice(i, 1, data); marker = marker.__source__; this.sources[marker] = this.sources[marker] || {}; this.sources[marker].data = data; this._resolve(); } else { if (typeof marker === "string") { this.sources[marker] = this.sources[marker] || {}; this.sources[marker].data = data; } this._await(); this.push(data); process.nextTick(this._resolve.bind(this)); } return this; }; ConfigChain2.prototype.parse = exports.parse; ConfigChain2.prototype._await = function() { this._awaiting++; }; ConfigChain2.prototype._resolve = function() { this._awaiting--; if (this._awaiting === 0) this.emit("load", this); }; } }); // libs/core/src/lib/npm-conf/conf.ts var import_assert, import_fs4, import_path9, ConfigChain, Conf; var init_conf = __esm({ "libs/core/src/lib/npm-conf/conf.ts"() { "use strict"; import_assert = __toESM(require("assert")); import_fs4 = __toESM(require("fs")); import_path9 = __toESM(require("path")); init_env_replace(); init_find_prefix(); init_parse_field(); init_nerf_dart(); ({ ConfigChain } = require_config_chain()); Conf = class extends ConfigChain { // https://github.com/npm/npm/blob/latest/lib/config/core.js#L208-L222 constructor(base) { super(base); this.root = base; } // https://github.com/npm/npm/blob/latest/lib/config/core.js#L332-L342 add(data, marker) { try { for (const x of Object.keys(data)) { const newKey = envReplace(x); const newField = parseField(data[x], newKey); delete data[x]; data[newKey] = newField; } } catch (err) { throw err; } return super.add(data, marker); } // https://github.com/npm/npm/blob/latest/lib/config/core.js#L312-L325 addFile(file, name = file) { const marker = { __source__: name }; this["sources"][name] = { path: file, type: "ini" }; this["push"](marker); this["_await"](); try { const contents = import_fs4.default.readFileSync(file, "utf8"); this["addString"](contents, file, "ini", marker); } catch (err) { this["add"]({}, marker); } return this; } // https://github.com/npm/npm/blob/latest/lib/config/core.js#L344-L360 addEnv(env = process.env) { const conf = {}; Object.keys(env).filter((x) => /^npm_config_/i.test(x)).forEach((x) => { if (!env[x]) { return; } const p = x.toLowerCase().replace(/^npm_config_/, "").replace(/(?!^)_/g, "-"); conf[p] = env[x]; }); return super.addEnv("", conf, "env"); } // https://github.com/npm/npm/blob/latest/lib/config/load-prefix.js loadPrefix() { const cli = this["list"][0]; Object.defineProperty(this, "prefix", { enumerable: true, set: (prefix) => { const g = this["get"]("global"); this[g ? "globalPrefix" : "localPrefix"] = prefix; }, get: () => { const g = this["get"]("global"); return g ? this["globalPrefix"] : this["localPrefix"]; } }); Object.defineProperty(this, "globalPrefix", { enumerable: true, set: (prefix) => { this["set"]("prefix", prefix); }, get: () => import_path9.default.resolve(this["get"]("prefix")) }); let p; Object.defineProperty(this, "localPrefix", { enumerable: true, set: (prefix) => { p = prefix; }, get: () => p }); if (Object.prototype.hasOwnProperty.call(cli, "prefix")) { p = import_path9.default.resolve(cli.prefix); } else { try { p = findPrefix(process.cwd()); } catch (err) { throw err; } } return p; } // https://github.com/npm/npm/blob/latest/lib/config/load-cafile.js loadCAFile(file) { if (!file) { return; } try { const contents = import_fs4.default.readFileSync(file, "utf8"); const delim = "-----END CERTIFICATE-----"; const output2 = contents.split(delim).filter((x) => Boolean(x.trim())).map((x) => x.trimLeft() + delim); this["set"]("ca", output2); } catch (err) { if (err.code === "ENOENT") { return; } throw err; } } // https://github.com/npm/npm/blob/latest/lib/config/set-user.js loadUser() { const defConf = this.root; if (this["get"]("global")) { return; } if (process.env["SUDO_UID"]) { defConf.user = Number(process.env["SUDO_UID"]); return; } const prefix = import_path9.default.resolve(this["get"]("prefix")); try { const stats = import_fs4.default.statSync(prefix); defConf.user = stats.uid; } catch (err) { if (err.code === "ENOENT") { return; } throw err; } } // https://github.com/npm/npm/blob/24ec9f2/lib/config/get-credentials-by-uri.js getCredentialsByURI(uri) { (0, import_assert.default)(uri && typeof uri === "string", "registry URL is required"); const nerfed = toNerfDart(uri); const defnerf = toNerfDart(this["get"]("registry")); const c = { scope: nerfed, token: void 0, password: void 0, username: void 0, email: void 0, auth: void 0, alwaysAuth: void 0 }; if (this["get"](`${nerfed}:always-auth`) !== void 0) { const val = this["get"](`${nerfed}:always-auth`); c.alwaysAuth = val === "false" ? false : !!val; } else if (this["get"]("always-auth") !== void 0) { c.alwaysAuth = this["get"]("always-auth"); } if (this["get"](`${nerfed}:_authToken`)) { c.token = this["get"](`${nerfed}:_authToken`); return c; } let authDef = this["get"]("_auth"); let userDef = this["get"]("username"); let passDef = this["get"]("_password"); if (authDef && !(userDef && passDef)) { authDef = Buffer.from(authDef, "base64").toString(); authDef = authDef.split(":"); userDef = authDef.shift(); passDef = authDef.join(":"); } if (this["get"](`${nerfed}:_password`)) { c.password = Buffer.from(this["get"](`${nerfed}:_password`), "base64").toString("utf8"); } else if (nerfed === defnerf && passDef) { c.password = passDef; } if (this["get"](`${nerfed}:username`)) { c.username = this["get"](`${nerfed}:username`); } else if (nerfed === defnerf && userDef) { c.username = userDef; } if (this["get"](`${nerfed}:email`)) { c.email = this["get"](`${nerfed}:email`); } else if (this["get"]("email")) { c.email = this["get"]("email"); } if (c.username && c.password) { c.auth = Buffer.from(`${c.username}:${c.password}`).toString("base64"); } return c; } // https://github.com/npm/npm/blob/24ec9f2/lib/config/set-credentials-by-uri.js setCredentialsByURI(uri, c) { (0, import_assert.default)(uri && typeof uri === "string", "registry URL is required"); (0, import_assert.default)(c && typeof c === "object", "credentials are required"); const nerfed = toNerfDart(uri); if (c.token) { this["set"](`${nerfed}:_authToken`, c.token, "user"); this["del"](`${nerfed}:_password`, "user"); this["del"](`${nerfed}:username`, "user"); this["del"](`${nerfed}:email`, "user"); this["del"](`${nerfed}:always-auth`, "user"); } else if (c.username || c.password || c.email) { (0, import_assert.default)(c.username, "must include username"); (0, import_assert.default)(c.password, "must include password"); (0, import_assert.default)(c.email, "must include email address"); this["del"](`${nerfed}:_authToken`, "user"); const encoded = Buffer.from(c.password, "utf8").toString("base64"); this["set"](`${nerfed}:_password`, encoded, "user"); this["set"](`${nerfed}:username`, c.username, "user"); this["set"](`${nerfed}:email`, c.email, "user"); if (c.alwaysAuth !== void 0) { this["set"](`${nerfed}:always-auth`, c.alwaysAuth, "user"); } else { this["del"](`${nerfed}:always-auth`, "user"); } } else { throw new Error("No credentials to set."); } } }; } }); // libs/core/src/lib/prompt.ts function promptTextInput(message, { filter, validate } = {}) { import_npmlog23.default.pause(); return import_inquirer.default.prompt([ { type: "input", name: "input", message, filter, validate } ]).then((answers) => { import_npmlog23.default.resume(); return answers["input"]; }); } var import_inquirer, import_npmlog23; var init_prompt = __esm({ "libs/core/src/lib/prompt.ts"() { "use strict"; import_inquirer = __toESM(require("inquirer")); import_npmlog23 = __toESM(require("npmlog")); } }); // libs/core/src/lib/otplease.ts function otplease(fn, _opts, otpCache) { const opts = { ...otpCache, ..._opts }; return attempt(fn, opts, otpCache); } function attempt(fn, opts, otpCache) { return new Promise((resolve3) => { resolve3(fn(opts)); }).catch((err) => { if (err.code !== "EOTP" && !(err.code === "E401" && /one-time pass/.test(err.body))) { throw err; } else if (!process.stdin.isTTY || !process.stdout.isTTY) { throw err; } else { if (otpCache != null && otpCache.otp != null && otpCache.otp !== opts["otp"]) { return attempt(fn, { ...opts, ...otpCache }, otpCache); } return semaphore.wait().then(() => { if (otpCache != null && otpCache.otp != null && otpCache.otp !== opts["otp"]) { semaphore.release(); return attempt(fn, { ...opts, ...otpCache }, otpCache); } return getOneTimePassword().then( (otp) => { if (otpCache != null) { otpCache.otp = otp; } semaphore.release(); return otp; }, (promptError) => { semaphore.release(); return Promise.reject(promptError); } ).then((otp) => { return fn({ ...opts, otp }); }); }); } }); } function getOneTimePassword(message = "This operation requires a one-time password:") { return promptTextInput(message, { filter: (otp) => otp.replace(/\s+/g, ""), validate: (otp) => otp && /^[\d ]+$|^[A-Fa-f0-9]{64,64}$/.test(otp) || "Must be a valid one-time-password. See https://docs.npmjs.com/getting-started/using-two-factor-authentication" }); } var semaphore; var init_otplease = __esm({ "libs/core/src/lib/otplease.ts"() { "use strict"; init_prompt(); semaphore = { _promise: void 0, _resolve: void 0, wait() { return new Promise((resolve3) => { if (!this._promise) { this._promise = new Promise((release) => { this._resolve = release; }); resolve3(void 0); } else { resolve3(this._promise.then(() => this.wait())); } }); }, release() { const resolve3 = this._resolve; if (resolve3) { this._resolve = void 0; this._promise = void 0; resolve3(); } } }; } }); // libs/core/src/lib/npm-conf/defaults.ts var require_defaults = __commonJS({ "libs/core/src/lib/npm-conf/defaults.ts"(exports) { "use strict"; var import_os3 = __toESM(require("os")); var import_path11 = __toESM(require("path")); var temp = import_os3.default.tmpdir(); var uidOrPid = process.getuid ? process.getuid() : process.pid; var hasUnicode2 = () => true; var isWindows = process.platform === "win32"; var osenv = { editor: () => process.env["EDITOR"] || process.env["VISUAL"] || (isWindows ? "notepad.exe" : "vi"), shell: () => isWindows ? process.env["COMSPEC"] || "cmd.exe" : process.env["SHELL"] || "/bin/bash" }; var umask = { fromString: () => process.umask() }; var home = import_os3.default.homedir(); if (home) { process.env["HOME"] = home; } else { home = import_path11.default.resolve(temp, `npm-${uidOrPid}`); } var cacheExtra = process.platform === "win32" ? "npm-cache" : ".npm"; var cacheRoot = process.platform === "win32" && process.env["APPDATA"] || home; var cache = import_path11.default.resolve(cacheRoot, cacheExtra); var defaults; var globalPrefix; Object.defineProperty(exports, "defaults", { get() { if (defaults) { return defaults; } if (process.env["PREFIX"]) { globalPrefix = process.env["PREFIX"]; } else if (process.platform === "win32") { globalPrefix = import_path11.default.dirname(process.execPath); } else { globalPrefix = import_path11.default.dirname(import_path11.default.dirname(process.execPath)); if (process.env["DESTDIR"]) { globalPrefix = import_path11.default.join(process.env["DESTDIR"], globalPrefix); } } defaults = { access: null, "allow-same-version": false, "always-auth": false, also: null, audit: true, "audit-level": "low", "auth-type": "legacy", "bin-links": true, browser: null, ca: null, cafile: null, cache, "cache-lock-stale": 6e4, "cache-lock-retries": 10, "cache-lock-wait": 1e4, "cache-max": Infinity, "cache-min": 10, cert: null, cidr: null, color: process.env["NO_COLOR"] == null, depth: Infinity, description: true, dev: false, "dry-run": false, editor: osenv.editor(), "engine-strict": false, force: false, "fetch-retries": 2, "fetch-retry-factor": 10, "fetch-retry-mintimeout": 1e4, "fetch-retry-maxtimeout": 6e4, git: "git", "git-tag-version": true, "commit-hooks": true, global: false, globalconfig: import_path11.default.resolve(globalPrefix, "etc", "npmrc"), "global-style": false, group: process.platform === "win32" ? 0 : process.env["SUDO_GID"] || process.getgid && process.getgid(), "ham-it-up": false, heading: "npm", "if-present": false, "ignore-prepublish": false, "ignore-scripts": false, "init-module": import_path11.default.resolve(home, ".npm-init.js"), "init-author-name": "", "init-author-email": "", "init-author-url": "", "init-version": "1.0.0", "init-license": "ISC", json: false, key: null, "legacy-bundling": false, link: false, "local-address": void 0, loglevel: "notice", logstream: process.stderr, "logs-max": 10, long: false, maxsockets: 50, message: "%s", "metrics-registry": null, "node-options": null, "node-version": process.version, offline: false, "onload-script": false, only: null, optional: true, otp: void 0, "package-lock": true, "package-lock-only": false, parseable: false, "prefer-offline": false, "prefer-online": false, prefix: globalPrefix, preid: "", production: process.env["NODE_ENV"] === "production", progress: !process.env["TRAVIS"] && !process.env["CI"], proxy: null, "https-proxy": null, noproxy: null, "user-agent": "npm/{npm-version} node/{node-version} {platform} {arch}", "read-only": false, "rebuild-bundle": true, registry: "https://registry.npmjs.org/", rollback: true, save: true, "save-bundle": false, "save-dev": false, "save-exact": false, "save-optional": false, "save-prefix": "^", "save-prod": false, scope: "", "script-shell": void 0, "scripts-prepend-node-path": "warn-only", searchopts: "", searchexclude: null, searchlimit: 20, searchstaleness: 15 * 60, "send-metrics": false, shell: osenv.shell(), shrinkwrap: true, "sign-git-commit": false, "sign-git-tag": false, "sso-poll-frequency": 500, "sso-type": "oauth", "strict-ssl": true, tag: "latest", "tag-version-prefix": "v", timing: false, tmp: temp, unicode: hasUnicode2(), "unsafe-perm": process.platform === "win32" || process.platform === "cygwin" || // TODO: refactor based on TS feedback // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore !(process.getuid && process.setuid && process.getgid && process.setgid) || process.getuid() !== 0, "update-notifier": true, usage: false, user: process.platform === "win32" || import_os3.default.type() === "OS400" ? 0 : "nobody", userconfig: import_path11.default.resolve(home, ".npmrc"), // TODO: refactor based on TS feedback // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore umask: process.umask ? process.umask() : umask.fromString("022"), version: false, versions: false, viewer: process.platform === "win32" ? "browser" : "man", _exit: true }; return defaults; } }); } }); // libs/core/src/lib/npm-conf/index.ts var require_npm_conf = __commonJS({ "libs/core/src/lib/npm-conf/index.ts"(exports, module2) { "use strict"; var import_path11 = __toESM(require("path")); init_conf(); init_nerf_dart(); var { defaults } = require_defaults(); module2.exports = npmConf3; module2.exports.Conf = Conf; module2.exports.defaults = Object.assign({}, defaults); module2.exports.toNerfDart = toNerfDart; function npmConf3(opts) { const conf = new Conf(Object.assign({}, defaults)); const cleanOpts = opts ? Object.keys(opts).reduce((acc, key) => { if (opts[key] !== void 0) { acc[key] = opts[key]; } return acc; }, {}) : {}; conf.add(cleanOpts, "cli"); conf.addEnv(); conf.loadPrefix(); const projectConf = import_path11.default.resolve(conf["localPrefix"], ".npmrc"); const userConf = conf["get"]("userconfig"); if (!conf["get"]("global") && projectConf !== userConf) { conf.addFile(projectConf, "project"); } else { conf.add({}, "project"); } conf.addFile(conf["get"]("userconfig"), "user"); if (conf["get"]("prefix")) { const etc = import_path11.default.resolve(conf["get"]("prefix"), "etc"); conf.root.globalconfig = import_path11.default.resolve(etc, "npmrc"); conf.root.globalignorefile = import_path11.default.resolve(etc, "npmignore"); } conf.addFile(conf["get"]("globalconfig"), "global"); conf.loadUser(); const caFile = conf["get"]("cafile"); if (caFile) { conf.loadCAFile(caFile); } return conf; } } }); // libs/core/src/lib/npm-dist-tag.ts var npm_dist_tag_exports = {}; __export(npm_dist_tag_exports, { add: () => add, list: () => list, remove: () => remove }); function add(spec, tag, options, otpCache) { const opts = { log: import_npmlog35.default, ...options, spec: (0, import_npm_package_arg6.default)(spec) }; const cleanTag = (tag || opts.defaultTag || opts.tag).trim(); const { name, rawSpec: version } = opts.spec; opts.log.verbose("dist-tag", `adding "${cleanTag}" to ${name}@${version}`); if (opts.dryRun) { opts.log.silly("dist-tag", "dry-run configured, bailing now"); return Promise.resolve(); } return fetchTags(opts).then((tags) => { if (tags[cleanTag] === version) { opts.log.warn("dist-tag", `${name}@${cleanTag} already set to ${version}`); return tags; } const uri = `/-/package/${opts.spec.escapedName}/dist-tags/${encodeURIComponent(cleanTag)}`; const payload = { ...opts, method: "PUT", body: JSON.stringify(version), headers: { // cannot use fetch.json() due to HTTP 204 response, // so we manually set the required content-type "content-type": "application/json" }, spec: opts.spec }; return otplease((wrappedPayload) => (0, import_npm_registry_fetch.default)(uri, wrappedPayload), payload, otpCache).then(() => { opts.log.verbose("dist-tag", `added "${cleanTag}" to ${name}@${version}`); tags[cleanTag] = version; return tags; }); }); } function remove(spec, tag, options, otpCache) { const opts = { log: import_npmlog35.default, ...options, spec: (0, import_npm_package_arg6.default)(spec) }; opts.log.verbose("dist-tag", `removing "${tag}" from ${opts.spec.name}`); if (opts.dryRun) { opts.log.silly("dist-tag", "dry-run configured, bailing now"); return Promise.resolve(); } return fetchTags(opts).then((tags) => { const version = tags[tag]; if (!version) { opts.log.info("dist-tag", `"${tag}" is not a dist-tag on ${opts.spec.name}`); return tags; } const uri = `/-/package/${opts.spec.escapedName}/dist-tags/${encodeURIComponent(tag)}`; const payload = { ...opts, method: "DELETE", spec: opts.spec }; return otplease((wrappedPayload) => (0, import_npm_registry_fetch.default)(uri, wrappedPayload), payload, otpCache).then(() => { opts.log.verbose("dist-tag", `removed "${tag}" from ${opts.spec.name}@${version}`); delete tags[tag]; return tags; }); }); } function list(spec, options) { const opts = { log: import_npmlog35.default, ...options, spec: (0, import_npm_package_arg6.default)(spec) }; if (opts.dryRun) { opts.log.silly("dist-tag", "dry-run configured, bailing now"); return Promise.resolve(); } return fetchTags(opts); } function fetchTags(opts) { return import_npm_registry_fetch.default.json(`/-/package/${opts.spec.escapedName}/dist-tags`, { ...opts, preferOnline: true, spec: opts.spec }).then((data) => { if (data && typeof data === "object") { delete data["_etag"]; } return data || {}; }); } var import_npm_package_arg6, import_npm_registry_fetch, import_npmlog35; var init_npm_dist_tag = __esm({ "libs/core/src/lib/npm-dist-tag.ts"() { "use strict"; import_npm_package_arg6 = __toESM(require("npm-package-arg")); import_npm_registry_fetch = __toESM(require("npm-registry-fetch")); import_npmlog35 = __toESM(require("npmlog")); init_otplease(); } }); // packages/lerna/src/utils/index.ts var utils_exports = {}; __export(utils_exports, { detectProjects: () => detectProjects2 }); module.exports = __toCommonJS(utils_exports); // libs/core/src/lib/add-dependents.ts var import_lodash = require("lodash"); // libs/core/src/lib/collect-uncommitted.ts var import_chalk2 = __toESM(require("chalk")); var import_npmlog = __toESM(require("npmlog")); var childProcess = (init_src(), __toCommonJS(src_exports)); var maybeColorize = (colorize) => (s) => s !== " " ? colorize(s) : s; var cRed = maybeColorize(import_chalk2.default.red); var cGreen = maybeColorize(import_chalk2.default.green); var replaceStatus = (_, maybeGreen, maybeRed) => `${cGreen(maybeGreen)}${cRed(maybeRed)}`; var colorizeStats = (stats) => stats.replace(/^([^U]| )([A-Z]| )/gm, replaceStatus).replace(/^\?{2}|U{2}/gm, cRed("$&")); var splitOnNewLine = (str) => str.split("\n"); var filterEmpty = (lines) => lines.filter((line) => line.length); var o = (l, r) => (x) => l(r(x)); var transformOutput = o(filterEmpty, o(splitOnNewLine, colorizeStats)); function collectUncommitted({ cwd, log: log34 = import_npmlog.default }) { log34.silly("collect-uncommitted", "git status --porcelain (async)"); return childProcess.exec("git", ["status", "--porcelain"], { cwd }).then(({ stdout }) => transformOutput(stdout)); } // libs/core/src/lib/describe-ref.ts var import_npmlog2 = __toESM(require("npmlog")); var childProcess2 = (init_src(), __toCommonJS(src_exports)); // libs/core/src/lib/validation-error.ts var import_npmlog3 = __toESM(require("npmlog")); var ValidationError = class extends Error { constructor(prefix, message, ...rest) { super(message); this.name = "ValidationError"; this.prefix = prefix; import_npmlog3.default.resume(); import_npmlog3.default.error(prefix, message, ...rest); } }; // libs/core/src/lib/check-working-tree.ts var EUNCOMMIT_MSG = "Working tree has uncommitted changes, please commit or remove the following changes before continuing:\n"; function mkThrowIfUncommitted(options = {}) { return function throwIfUncommitted2(opts) { if (opts.isDirty) { return collectUncommitted(options).then((uncommitted) => { throw new ValidationError("EUNCOMMIT", `${EUNCOMMIT_MSG}${uncommitted.join("\n")}`); }); } }; } var throwIfUncommitted = mkThrowIfUncommitted(); // libs/core/src/lib/cli.ts var import_dedent = __toESM(require("dedent")); var import_npmlog4 = __toESM(require("npmlog")); var import_yargs = _