UNPKG

@process-engine/ci_tools

Version:
115 lines (114 loc) 5.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.printHelp = exports.getShortDoc = exports.run = void 0; const yargsParser = require("yargs-parser"); const fs_1 = require("fs"); const chalk = require("chalk"); const git_1 = require("../git/git"); const tag_1 = require("../npm/tag"); const package_version_1 = require("../versions/package_version"); const printMultiLineString_1 = require("../cli/printMultiLineString"); const setup_git_and_npm_connections_1 = require("./internal/setup-git-and-npm-connections"); const shell_1 = require("../cli/shell"); const retry_run_1 = require("../versions/retry_run"); const parse_version_1 = require("../versions/parse_version"); const COMMAND_NAME = 'publish-npm-package'; const BADGE = `[${COMMAND_NAME}]\t`; const DEFAULT_MODE = 'node'; const DOC = ` Publishes the current package to npm. Does not complain if re-run (providing idempotency for CI). `; // DOC: see above async function run(...args) { const argv = yargsParser(args, { default: { mode: DEFAULT_MODE } }); const isDryRun = argv.dry === true; const createTagFromBranchName = argv.createTagFromBranchName === true; const mode = argv.mode; const packageName = getPackageName(); const packageVersion = await (0, package_version_1.getPackageVersion)(mode); const npmPublishShellCommand = getNpmPublishShellCommand(createTagFromBranchName, isDryRun, packageVersion); (0, setup_git_and_npm_connections_1.setupNpm)(); const npmPublishShellCommandOutput = annotatedSh(npmPublishShellCommand); const lines = npmPublishShellCommandOutput.trim().split('\n'); const expectedMessage = `+ ${packageName}@${packageVersion}`; const publishCommandSuccessful = lines[lines.length - 1] === expectedMessage; if (publishCommandSuccessful) { await ensureVersionIsAvailable(packageName, packageVersion, isDryRun); } else { const isAlreadyPublished = npmPublishShellCommandOutput.match(/You cannot publish over the previously published versions/gi) != null; if (isAlreadyPublished) { console.log(chalk.yellow(`${BADGE}This package version was already published: '${packageVersion}'.`)); } if (await (0, retry_run_1.isRedundantRunTriggeredBySystemUserPush)(mode)) { console.error(chalk.yellowBright(`${BADGE}Nothing to do here!`)); process.exit(0); } } return publishCommandSuccessful; } exports.run = run; function getShortDoc() { return DOC.trim().split('\n')[0]; } exports.getShortDoc = getShortDoc; function printHelp() { console.log(`Usage: ci_tools ${COMMAND_NAME} [--create-tag-from-branch-name] [--dry]`); console.log(''); console.log(DOC.trim()); } exports.printHelp = printHelp; function getNpmPublishShellCommand(useBranchForTag, isDryRun, packageVersion) { const dryRun = isDryRun ? '--dry-run ' : ''; const gitBranch = (0, git_1.getGitBranch)(); const parsedVersion = (0, parse_version_1.parseVersion)(packageVersion); const branchName = gitBranch || (0, git_1.mapReleaseChannelNameToBranch)(parsedVersion.releaseChannelName); const npmTag = (0, tag_1.getNpmTag)(branchName); const tag = useBranchForTag && npmTag ? `--tag ${npmTag} ` : ''; return `npm publish ${dryRun}${tag}`.trim(); } function annotatedSh(cmd) { console.log(`${BADGE}|>>> ${cmd}`); const output = (0, shell_1.sh)(cmd); (0, printMultiLineString_1.printMultiLineString)(output, `${BADGE}| `); return output; } function getPackageName() { const content = (0, fs_1.readFileSync)('package.json').toString(); const json = JSON.parse(content); return json.name; } async function ensureVersionIsAvailable(packageName, packageVersion, isDryRun = false) { if (isDryRun) { console.log(chalk.green(`${BADGE}Successfully published version '${packageVersion}'.`)); return; } const viewCommand = `npm view ${packageName} versions --json`; let packageVersionFound = false; // TODO: It is certainly debatable on what the best settings would be here. // For now, a window of 30 minutes is granted, before the publishing is regarded as failure. const maxNumberOfRetries = 3600; const timeoutBetweenRetriesInMs = 500; let currentTry = 0; while (packageVersionFound === false && currentTry < maxNumberOfRetries) { const versions = (0, shell_1.sh)(viewCommand); packageVersionFound = versions.includes(packageVersion); if (packageVersionFound) { break; } else { console.log(chalk.yellow(`${BADGE}Version '${packageVersion}' not found. Retrying in ${timeoutBetweenRetriesInMs}ms...`)); currentTry++; await new Promise((resolve) => setTimeout(resolve, timeoutBetweenRetriesInMs)); } } if (packageVersionFound) { console.log(chalk.green(`${BADGE}Successfully published version '${packageVersion}'.`)); } else { console.error(chalk.red(`${BADGE}Version '${packageVersion}' is not reported by 'npm view'.`)); process.exit(1); } } //# sourceMappingURL=publish-npm-package.js.map