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