preversion
Version:
A tiny cli helps you to publish alpha/beta versions to npm before releasing the final latest version
106 lines (103 loc) • 4.79 kB
JavaScript
//#region rolldown:runtime
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 __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
key = keys[i];
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: ((k) => from[k]).bind(null, key),
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
//#endregion
const node_child_process = __toESM(require("node:child_process"));
const node_fs = __toESM(require("node:fs"));
const node_os = __toESM(require("node:os"));
const node_path = __toESM(require("node:path"));
const __pkgr_core = __toESM(require("@pkgr/core"));
const semver = __toESM(require("semver"));
//#region src/index.ts
const PREVERSION_TAGS = ["alpha", "beta"];
const getPreversionTag = (version) => PREVERSION_TAGS.find((tag) => version === tag || (/* @__PURE__ */ new RegExp(`[._-]${tag}[._-]?\\d*$`)).test(version));
const pkgPath = (0, __pkgr_core.findUp)(process.cwd());
const pkgContent = node_fs.default.readFileSync(pkgPath, "utf8");
const pkg = JSON.parse(pkgContent);
const jsonRegex = /[[{](?:[\d\t\n\r +,.:[\]aeflnr-u{}-]|".*?")+[\]}]/gis;
const createStdioError = (error) => new Error(error.stderr?.toString() || error.stdout?.toString() || error.message, { cause: error });
const getPreversion = (tag, version) => {
version ||= tag;
if (version.startsWith("v")) version = version.slice(1);
else if (version === tag) {
let distTags;
try {
distTags = JSON.parse((0, node_child_process.execSync)(`npm info ${pkg.name} dist-tags --json`).toString());
} catch (err) {
const error = err;
if (error.stdout) {
const content = error.stdout.toString();
const matched = content.match(jsonRegex);
if (matched?.[0]) {
const { error: { code } = {} } = JSON.parse(matched[0]);
if (code === "E404") distTags = {};
}
}
if (!distTags) throw createStdioError(error);
}
const { [tag]: preTag, latest } = distTags;
if (preTag != null && latest != null && semver.default.gt(preTag, latest)) version = preTag.endsWith(`-${tag}`) ? preTag + ".0" : preTag.replace(/* @__PURE__ */ new RegExp(`(-${tag}\\.)(\\d+)$`), (_, $0, $1) => $0 + (+$1 + 1));
else version = (latest == null ? "0.0.0" : semver.default.minVersion(`>${latest}`).format()) + `-${tag}`;
}
return version;
};
const preversion = ({ branch, message, preversion: preversion$1, tag }) => {
tag ||= preversion$1 && getPreversionTag(preversion$1) || PREVERSION_TAGS[1];
console.debug("[preversion] branch:", JSON.stringify(branch), ", message:", JSON.stringify(message), ", preversion:", JSON.stringify(preversion$1), ", tag:", JSON.stringify(tag));
if (tag === "latest") {
console.error("Publish `latest` tag via this script is not permitted.");
process.exitCode = 1;
return;
}
const { HOME = (0, node_os.homedir)(), NPM_TOKEN } = process.env;
const npmrcPath = node_path.default.resolve(HOME, ".npmrc");
if (node_fs.default.existsSync(npmrcPath)) console.log("Found existing `.npmrc` file");
else if (NPM_TOKEN != null) {
console.log("No `.npmrc` file found, creating one");
node_fs.default.writeFileSync(npmrcPath, `//registry.npmjs.org/:_authToken=${NPM_TOKEN}`);
}
const newPkg = { ...pkg };
newPkg.version = preversion$1 = getPreversion(tag, preversion$1);
node_fs.default.writeFileSync(pkgPath, JSON.stringify(newPkg, null, 2));
try {
(0, node_child_process.execSync)("npx clean-pkg-json");
(0, node_child_process.execSync)(`npm publish${pkg.publishConfig?.directory ? ` ./${pkg.publishConfig.directory} ` : " "}--tag ${tag}`, {
encoding: "utf8",
stdio: "inherit"
});
} catch (err) {
const error = err;
node_fs.default.writeFileSync(pkgPath, pkgContent);
throw createStdioError(error);
}
if (!branch) {
node_fs.default.writeFileSync(pkgPath, pkgContent);
return;
}
const commitMessage = message.replaceAll(/{{\s*version\s*}}/g, preversion$1);
(0, node_child_process.execSync)(`git commit -am "${commitMessage}"`);
(0, node_child_process.execSync)(`git push --follow-tags origin "${branch}"`);
};
//#endregion
exports.getPreversion = getPreversion;
exports.getPreversionTag = getPreversionTag;
exports.pkg = pkg;
exports.preversion = preversion;