@jwpkg/gitversion
Version:
Gitversion is a complete customizable git-based release management system
110 lines • 9.32 kB
JavaScript
;
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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