UNPKG

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
//#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;