UNPKG

@jwpkg/gitversion

Version:

Gitversion is a complete customizable git-based release management system

110 lines 9.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NpmPlugin = void 0; const promises_1 = require("fs/promises"); const fs_1 = require("fs"); const os_1 = require("os"); const path_1 = require("path"); const node_project_1 = require("./node-project"); class NpmPlugin { application; name = 'NPM package manager plugin'; ident = 'npm'; get packManager() { return this; } constructor(application) { this.application = application; } static initialize(initialize) { if ((0, fs_1.existsSync)((0, path_1.join)(initialize.cwd, 'package-lock.json'))) { return new NpmPlugin(initialize); } return null; } async pack(workspace, outputFolder) { if (!(workspace instanceof node_project_1.NodeWorkspace)) { return null; } if (workspace.private) { return null; } let tmpDir; try { tmpDir = await (0, promises_1.mkdtemp)((0, path_1.join)((0, os_1.tmpdir)(), 'gitversion-npm')); const result = await this.application.executor.exec(['npm', 'pack', '--pack-destination', tmpDir, '--json'], { cwd: workspace.cwd, }); const files = JSON.parse(result); if (files.length == 1) { if (files[0].filename) { const outfile = (0, path_1.join)(tmpDir, files[0].filename); if ((0, fs_1.existsSync)((0, path_1.join)(outfile))) { await (0, promises_1.cp)(outfile, (0, path_1.join)(outputFolder, files[0].filename)); return files[0].filename; } } } throw new Error('Invalid npm output'); } finally { try { if (tmpDir) { await (0, promises_1.rm)(tmpDir, { recursive: true }); } } catch (_e) { } } } async publish(packedPackage, fileName, releaseTag, dryRun) { if (dryRun) { this.application.logger.reportDryrun(`Would be publishing ${packedPackage.packageName} using release tag ${releaseTag}`); return; } // Check if running in CI environment const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true' || process.env.GITLAB_CI === 'true' || process.env.CIRCLECI === 'true' || process.env.TRAVIS === 'true' || process.env.JENKINS_URL !== undefined || process.env.BUILDKITE === 'true'; if (isCI && !process.stdin.isTTY) { // In CI without TTY, we need to ensure npm doesn't prompt for OTP // Check if we have an automation token by verifying the token type this.application.logger.reportInfo('Running in CI environment - ensuring non-interactive mode'); try { await this.application.executor.exec(['npm', 'publish', fileName, '--tag', releaseTag, '--access', 'public', '--verbose'], { cwd: this.application.packFolder, }); } catch (error) { // Check if error is related to OTP const errorMessage = error instanceof Error ? error.message : String(error); if (errorMessage.includes('one-time password') || errorMessage.includes('OTP')) { throw new Error('Publishing failed: npm is requesting a one-time password (OTP) in CI environment.\n' + 'This typically happens when:\n' + ' 1. Your npm account has 2FA enabled (good!)\n' + ' 2. The NPM_AUTH_TOKEN is a "Classic" token that requires OTP\n' + '\n' + 'To fix this:\n' + ' 1. Log in to npmjs.com\n' + ' 2. Go to Access Tokens → Generate New Token\n' + ' 3. Select "Automation" token type (bypasses OTP for CI/CD)\n' + ' 4. Update your NPM_AUTH_TOKEN secret with this new token\n' + '\n' + `Original error: ${errorMessage}`); } throw error; } } else { await this.application.executor.exec(['npm', 'publish', fileName, '--tag', releaseTag, '--access', 'public', '--verbose'], { cwd: this.application.packFolder, }); } } } exports.NpmPlugin = NpmPlugin; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvZW1iZWRkZWQvbm9kZS9ucG0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMENBQThDO0FBQzlDLDJCQUFnQztBQUNoQywyQkFBNEI7QUFDNUIsK0JBQTRCO0FBTTVCLGlEQUErQztBQUUvQyxNQUFhLFNBQVM7SUFRUTtJQVA1QixJQUFJLEdBQUcsNEJBQTRCLENBQUM7SUFDcEMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUVkLElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQTRCLFdBQThCO1FBQTlCLGdCQUFXLEdBQVgsV0FBVyxDQUFtQjtJQUFJLENBQUM7SUFFL0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUE2QjtRQUM3QyxJQUFJLElBQUEsZUFBVSxFQUFDLElBQUEsV0FBSSxFQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFxQixFQUFFLFlBQW9CO1FBQ3BELElBQUksQ0FBQyxDQUFDLFNBQVMsWUFBWSw0QkFBYSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLE1BQTBCLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBQSxrQkFBTyxFQUFDLElBQUEsV0FBSSxFQUFDLElBQUEsV0FBTSxHQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3pELE1B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