@lerna/publish
Version:
Publish packages in the current project
280 lines (279 loc) • 10.4 kB
JavaScript
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 __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);
var command_exports = {};
__export(command_exports, {
Command: () => Command
});
module.exports = __toCommonJS(command_exports);
var import_clone_deep = __toESM(require("clone-deep"));
var import_dedent = __toESM(require("dedent"));
var import_execa = __toESM(require("execa"));
var import_npmlog = __toESM(require("npmlog"));
var import_os = __toESM(require("os"));
var import_package_graph = require("../package-graph");
var import_project = require("../project");
var import_validation_error = require("../validation-error");
var import_write_log_file = require("../write-log-file");
var import_clean_stack = require("./clean-stack");
var import_default_options = require("./default-options");
var import_log_package_error = require("./log-package-error");
var import_warn_if_hanging = require("./warn-if-hanging");
const DEFAULT_CONCURRENCY = import_os.default.cpus().length;
class Command {
name;
composed;
options = {};
runner;
concurrency;
toposort = false;
execOpts;
packageGraph;
logger;
_project;
get project() {
if (this._project === void 0) {
throw new import_validation_error.ValidationError("ENOPROJECT", "Lerna Project not initialized!");
}
return this._project;
}
set project(project) {
this._project = project;
}
constructor(_argv, { skipValidations } = { skipValidations: false }) {
import_npmlog.default.pause();
import_npmlog.default.heading = "lerna";
const argv = (0, import_clone_deep.default)(_argv);
import_npmlog.default.silly("argv", argv);
this.name = this.constructor.name.replace(/Command$/, "").toLowerCase();
this.composed = typeof argv.composed === "string" && argv.composed !== this.name;
if (!this.composed) {
import_npmlog.default.notice("cli", `v${argv.lernaVersion}`);
}
let runner = new Promise((resolve, reject) => {
let chain = Promise.resolve();
chain = chain.then(() => {
this.project = new import_project.Project(argv.cwd);
});
chain = chain.then(() => this.configureEnvironment());
chain = chain.then(() => this.configureOptions());
chain = chain.then(() => this.configureProperties());
chain = chain.then(() => this.configureLogging());
if (!skipValidations) {
chain = chain.then(() => this.runValidations());
}
chain = chain.then(() => this.runPreparations());
chain = chain.then(() => this.runCommand());
chain.then(
(result) => {
(0, import_warn_if_hanging.warnIfHanging)();
resolve(result);
},
(err) => {
if (err.pkg) {
(0, import_log_package_error.logPackageError)(err, this.options.stream);
} else if (err.name !== "ValidationError") {
import_npmlog.default.error("", (0, import_clean_stack.cleanStack)(err, this.constructor.name));
}
if (err.name !== "ValidationError" && !err.pkg) {
(0, import_write_log_file.writeLogFile)(this.project.rootPath);
}
(0, import_warn_if_hanging.warnIfHanging)();
reject(err);
}
);
});
if (argv.onResolved || argv.onRejected) {
runner = runner.then(argv.onResolved, argv.onRejected);
delete argv.onResolved;
delete argv.onRejected;
}
for (const key of ["cwd", "$0"]) {
Object.defineProperty(argv, key, { enumerable: false });
}
Object.defineProperty(this, "argv", {
value: Object.freeze(argv)
});
this.runner = runner;
}
// proxy "Promise" methods to "private" instance
then(onResolved, onRejected) {
return this.runner.then(onResolved, onRejected);
}
/* istanbul ignore next */
catch(onRejected) {
return this.runner.catch(onRejected);
}
get requiresGit() {
return true;
}
// Override this to inherit config from another command.
// For example `changed` inherits config from `publish`.
get otherCommandConfigs() {
return [];
}
configureEnvironment() {
const ci = require("is-ci");
let loglevel;
let progress;
if (ci || !process.stderr.isTTY) {
import_npmlog.default.disableColor();
progress = false;
} else if (!process.stdout.isTTY) {
progress = false;
loglevel = "error";
} else if (process.stderr.isTTY) {
import_npmlog.default.enableColor();
import_npmlog.default.enableUnicode();
}
Object.defineProperty(this, "envDefaults", {
value: {
ci,
progress,
loglevel
}
});
}
configureOptions() {
const commandConfig = this.project.config.command || {};
const overrides = [this.name, ...this.otherCommandConfigs].map((key) => commandConfig[key]);
this.options = (0, import_default_options.defaultOptions)(
// CLI flags, which if defined overrule subsequent values
this.argv,
...overrides,
// Global options from `lerna.json`
this.project.config,
// Environmental defaults prepared in previous step
this.envDefaults
);
if (this.options.verbose && this.options.loglevel !== "silly") {
this.options.loglevel = "verbose";
}
}
argv(argv, arg1, config, envDefaults) {
throw new Error("Method not implemented.");
}
envDefaults(argv, arg1, config, envDefaults) {
throw new Error("Method not implemented.");
}
configureProperties() {
const { concurrency = 0, sort, maxBuffer } = this.options;
this.concurrency = Math.max(1, +concurrency || DEFAULT_CONCURRENCY);
this.toposort = sort === void 0 || sort;
this.execOpts = {
cwd: this.project.rootPath,
maxBuffer
};
}
configureLogging() {
const { loglevel } = this.options;
if (loglevel) {
import_npmlog.default.level = loglevel;
}
import_npmlog.default.addLevel("success", 3001, { fg: "green", bold: true });
Object.defineProperty(this, "logger", {
value: import_npmlog.default["newGroup"](this.name)
});
import_npmlog.default.resume();
}
enableProgressBar() {
if (this.options.progress !== false) {
import_npmlog.default.enableProgress();
}
}
gitInitialized() {
const opts = {
cwd: this.project.rootPath,
// don't throw, just want boolean
reject: false,
// only return code, no stdio needed
stdio: "ignore"
};
return import_execa.default.sync("git", ["rev-parse"], opts).exitCode === 0;
}
runValidations() {
if ((this.options.since !== void 0 || this.requiresGit) && !this.gitInitialized()) {
throw new import_validation_error.ValidationError("ENOGIT", "The git binary was not found, or this is not a git repository.");
}
if (!this.project.manifest) {
throw new import_validation_error.ValidationError("ENOPKG", "`package.json` does not exist, have you run `lerna init`?");
}
if (this.project.configNotFound) {
throw new import_validation_error.ValidationError("ENOLERNA", "`lerna.json` does not exist, have you run `lerna init`?");
}
if (!this.project.version) {
throw new import_validation_error.ValidationError("ENOVERSION", "Required property version does not exist in `lerna.json`");
}
if (this.options.independent && !this.project.isIndependent()) {
throw new import_validation_error.ValidationError(
"EVERSIONMODE",
import_dedent.default`
You ran lerna with --independent or -i, but the repository is not set to independent mode.
To use independent mode you need to set lerna.json's "version" property to "independent".
Then you won't need to pass the --independent or -i flags.
`
);
}
if (this.options.npmClient === "pnpm" && !this.options.useWorkspaces) {
throw new import_validation_error.ValidationError(
"ENOWORKSPACES",
"Usage of pnpm without workspaces is not supported. To use pnpm with lerna, set useWorkspaces to true in lerna.json and configure pnpm to use workspaces: https://pnpm.io/workspaces."
);
}
}
runPreparations() {
if (!this.composed && this.project.isIndependent()) {
import_npmlog.default.info("versioning", "independent");
}
if (!this.composed && this.options.ci) {
import_npmlog.default.info("ci", "enabled");
}
let chain = Promise.resolve();
chain = chain.then(() => this.project.getPackages());
chain = chain.then((packages) => {
this.packageGraph = new import_package_graph.PackageGraph(packages);
});
return chain;
}
runCommand() {
return Promise.resolve().then(() => this.initialize()).then((proceed) => {
if (proceed !== false) {
return this.execute();
}
});
}
initialize() {
throw new import_validation_error.ValidationError(this.name, "initialize() needs to be implemented.");
}
execute() {
throw new import_validation_error.ValidationError(this.name, "execute() needs to be implemented.");
}
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
Command
});