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
JavaScript
"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 = _