UNPKG

@jwpkg/gitversion

Version:

Gitversion is a complete customizable git-based release management system

231 lines 22.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PackCommand = void 0; const clipanion_1 = require("clipanion"); const colorize_node_1 = require("colorize-node"); const promises_1 = require("fs/promises"); const os_1 = require("os"); const path_1 = require("path"); const queue_promise_1 = __importDefault(require("queue-promise")); const typanion_1 = require("typanion"); const application_1 = require("../core/application"); const bump_manifest_1 = require("../core/bump-manifest"); const format_utils_1 = require("../core/format-utils"); const pack_artifact_1 = require("../core/pack-artifact"); const context_1 = require("./context"); class PackCommand extends context_1.GitVersionCommand { static paths = [ ['pack'], ]; maxConcurrency = clipanion_1.Option.String('-m,--max-concurrency', { validator: (0, typanion_1.cascade)((0, typanion_1.isNumber)(), (0, typanion_1.isAtLeast)(1)), }); republish = clipanion_1.Option.Boolean('--republish', false, { description: 'Also pack workspaces with no version bump at their current version, republishing them' }); async execute() { const application = await application_1.Application.init(this.context.application); const { project, git, configuration, logger } = application; if (!project) { return 1; } const section = logger.beginSection('Pack step'); const bumpManifest = await bump_manifest_1.BumpManifest.load(application); if (!bumpManifest && !this.republish) { logger.reportError('No valid bump file found. Please run bump first'); return 1; } const gitStatus = bumpManifest?.gitStatus ?? (() => { // No bump manifest: synthetic status where all hashes are the current hash. // gitStatusHash() is called again inside PackArtifact.new() for prePack, so we // just need a placeholder here; we'll re-read it synchronously below. return null; })(); let resolvedGitStatus; if (gitStatus) { resolvedGitStatus = gitStatus; } else { const currentHash = await git.gitStatusHash(); resolvedGitStatus = { preBump: currentHash, postBump: currentHash }; } const packManifest = await pack_artifact_1.PackArtifact.new(configuration, git, resolvedGitStatus, this.republish); let hasErrors = false; let hasSomethingToPack = false; // --- Bumped workspaces (normal flow) --- if (bumpManifest && bumpManifest.bumps.length > 0) { if (!packManifest.validateGitStatusWithBump()) { logger.reportWarning(`Git status has changed between ${colorize_node_1.colorize.blue('gitversion bump')} and ${colorize_node_1.colorize.blue('gitversion pack')}. This could be an error`, true); } hasSomethingToPack = true; const projectBump = bumpManifest.bumps.find(b => b.packageRelativeCwd === '.'); if (projectBump && project.childWorkspaces.length > 0) { packManifest.add(projectBump); } const packFolder = (0, path_1.join)(configuration.stagingFolder, 'pack'); await (0, promises_1.mkdir)(packFolder, { recursive: true }); const queue = new queue_promise_1.default({ concurrent: this.maxConcurrency ?? (0, os_1.cpus)().length, start: false, }); bumpManifest.bumps.forEach(bump => { if (bump.packageRelativeCwd === '.' && project.childWorkspaces.length > 0) { // Root project workspace is already added directly via packManifest.add(projectBump) above. // Only update its version/changelog on disk; do not pack it again. const rootWorkspace = project.workspaces.find(w => w.relativeCwd === '.'); if (rootWorkspace) { queue.enqueue(async () => { try { await rootWorkspace.updateVersion(bump.version); await rootWorkspace.updateChangelog(bump.changeLog); } catch (error) { hasErrors = true; throw error; } }); } return; } queue.enqueue(async () => { try { const workspace = project.workspaces.find(w => w.relativeCwd === bump.packageRelativeCwd); if (workspace) { await workspace.updateVersion(bump.version); await workspace.updateChangelog(bump.changeLog); await this.execPackCommand(application, workspace, bump, packManifest, false); } } catch (error) { hasErrors = true; throw error; } }); }); while (queue.shouldRun) { await queue.dequeue(); } } // --- Republish workspaces (workspaces not covered by the bump manifest) --- if (this.republish) { const bumpedCwds = new Set(bumpManifest?.bumps.map(b => b.packageRelativeCwd) ?? []); const republishWorkspaces = project.workspaces.filter(w => !w.private && !bumpedCwds.has(w.relativeCwd)); if (republishWorkspaces.length > 0) { hasSomethingToPack = true; const packFolder = (0, path_1.join)(configuration.stagingFolder, 'pack'); await (0, promises_1.mkdir)(packFolder, { recursive: true }); const queue = new queue_promise_1.default({ concurrent: this.maxConcurrency ?? (0, os_1.cpus)().length, start: false, }); republishWorkspaces.forEach(workspace => { queue.enqueue(async () => { try { const syntheticBump = { packageRelativeCwd: workspace.relativeCwd, packageName: workspace.packageName, version: workspace.version, previousVersion: workspace.version, tag: workspace.tagPrefix + workspace.version, private: false, commits: [], changeLog: { version: workspace.version, headerLine: '', body: '' }, }; await this.execPackCommand(application, workspace, syntheticBump, packManifest, true); } catch (error) { hasErrors = true; throw error; } }); }); while (queue.shouldRun) { await queue.dequeue(); } } } if (!hasSomethingToPack) { logger.reportWarning('Nothing to pack'); } if (hasErrors) { logger.reportError('Errors occurred during packing process', true); return 1; } await packManifest.persist(); if (!packManifest.validateGitStatusDuringPack()) { logger.reportWarning(`Git status has changed during ${colorize_node_1.colorize.blue('gitversion pack')} you should make sure your build artifacts (including gitversion.out) are correctly ignored in .gitignore`, true); } logger.endSection(section); return 0; } async execPackCommand(application, workspace, bump, packManifest, republish = false) { return application.logger.runSection(`Packing ${(0, format_utils_1.formatPackageName)(bump.packageName)}`, async (logger) => { try { const packCommands = application.packManagers.map(async (packManager) => { const folder = (0, path_1.join)(application.configuration.packFolder, packManager.ident); await (0, promises_1.mkdir)(folder, { recursive: true, }); const packFile = await packManager.pack(workspace, folder); if (packFile) { if (Array.isArray(packFile)) { for (const file of packFile) { const fullName = (0, path_1.join)(folder, file); const stats = await (0, promises_1.stat)(fullName); logger.reportInfo(`Generated package: ./${(0, path_1.relative)(application.cwd, fullName)} (${(0, format_utils_1.formatFileSize)(stats.size)})`); } return { [packManager.ident]: packFile, }; } if (typeof packFile === 'string') { const fullName = (0, path_1.join)(folder, packFile); const stats = await (0, promises_1.stat)(fullName); logger.reportInfo(`Generated package: ./${(0, path_1.relative)(application.cwd, fullName)} (${(0, format_utils_1.formatFileSize)(stats.size)})`); return { [packManager.ident]: packFile, }; } else if (typeof packFile === 'object' && packFile !== null) { // If packFile is an object, we assume it's a record of files const files = {}; for (const [key, value] of Object.entries(packFile)) { const fullName = (0, path_1.join)(folder, value); const stats = await (0, promises_1.stat)(fullName); logger.reportInfo(`Generated package: ./${(0, path_1.relative)(application.cwd, fullName)} (${(0, format_utils_1.formatFileSize)(stats.size)})`); files[key] = value; } return { [packManager.ident]: files, }; } else { return {}; } } else { return {}; } }); const files = (await Promise.all(packCommands)).reduce((p, c) => { return { ...p, ...c, }; }, {}); packManifest.add({ packFiles: files, ...bump, republish: republish || undefined, }); } catch (error) { logger.reportError(`Error during pack: ${colorize_node_1.colorize.redBright(`${error}`)}`); throw error; } }); } } exports.PackCommand = PackCommand; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlDQUFtQztBQUNuQyxpREFBeUM7QUFDekMsMENBQTBDO0FBQzFDLDJCQUEwQjtBQUMxQiwrQkFBc0M7QUFDdEMsa0VBQWtDO0FBQ2xDLHVDQUF3RDtBQUV4RCxxREFBZ0U7QUFDaEUseURBQTJEO0FBQzNELHVEQUF5RTtBQUN6RSx5REFBcUQ7QUFHckQsdUNBQThDO0FBRTlDLE1BQWEsV0FBWSxTQUFRLDJCQUFpQjtJQUNoRCxNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsQ0FBQyxNQUFNLENBQUM7S0FDVCxDQUFDO0lBRUYsY0FBYyxHQUFHLGtCQUFNLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFO1FBQ3JELFNBQVMsRUFBRSxJQUFBLGtCQUFPLEVBQUMsSUFBQSxtQkFBUSxHQUFFLEVBQUUsSUFBQSxvQkFBUyxFQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdDLENBQUMsQ0FBQztJQUVILFNBQVMsR0FBRyxrQkFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLHVGQUF1RixFQUFFLENBQUMsQ0FBQztJQUUzSixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sV0FBVyxHQUFHLE1BQU0seUJBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDO1FBQzVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFakQsTUFBTSxZQUFZ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