@jwpkg/gitversion
Version:
Gitversion is a complete customizable git-based release management system
207 lines • 15.4 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.NodeProject = exports.NodeWorkspace = exports.isNodeManifest = void 0;
exports.loadManifest = loadManifest;
exports.persistManifest = persistManifest;
const colorize_node_1 = require("colorize-node");
const promises_1 = require("fs/promises");
const fs_1 = require("fs");
const glob_1 = require("glob");
const path_1 = require("path");
const t = __importStar(require("typanion"));
const bump_utils_1 = require("../../../core/bump-utils");
const changelog_1 = require("../../../core/changelog");
const constants_1 = require("../../../core/constants");
const conventional_commmit_utils_1 = require("../../../core/conventional-commmit-utils");
const version_utils_1 = require("../../../core/version-utils");
exports.isNodeManifest = t.isPartial({
version: t.isOptional(t.isString()),
name: t.isString(),
private: t.isOptional(t.isBoolean()),
workspaces: t.isOptional(t.isArray(t.isString())),
});
const NODE_MANIFEST_NAME = 'package.json';
async function loadManifest(folder) {
const manifestLocation = (0, path_1.join)(folder, NODE_MANIFEST_NAME);
if (!(0, fs_1.existsSync)(manifestLocation)) {
return null;
}
const stringContent = await (0, promises_1.readFile)(manifestLocation, 'utf-8');
const content = JSON.parse(stringContent);
const errors = [];
if ((0, exports.isNodeManifest)(content, { errors })) {
return {
eofInEnd: stringContent.endsWith('\n'),
manifest: content,
};
}
return null;
}
async function persistManifest(folder, manifestContent) {
let stringContent = JSON.stringify(manifestContent.manifest, null, 2);
if (manifestContent.eofInEnd) {
stringContent += '\n';
}
await (0, promises_1.writeFile)((0, path_1.join)(folder, NODE_MANIFEST_NAME), stringContent, 'utf-8');
}
class NodeWorkspace {
_project;
manifestContent;
get manifest() {
return this.manifestContent.manifest;
}
relativeCwd;
get cwd() {
return (0, path_1.join)(this.project.cwd, this.relativeCwd);
}
get version() {
return this.manifest.version ?? constants_1.DEFAULT_PACKAGE_VERSION;
}
get private() {
return this.manifest.private ?? false;
}
get config() {
return this.project.config;
}
get packageName() {
return this.manifest.name;
}
get project() {
return this._project;
}
get tagPrefix() {
if (this.config.options.independentVersioning) {
return `${this.config.options.versionTagPrefix}${this.packageName}@`;
}
else {
return this.config.options.versionTagPrefix;
}
}
constructor(project, relativeCwd, manifestContent) {
this.manifestContent = manifestContent;
if (!this.manifest.name) {
throw new Error(`Invalid manifest. Package at '${relativeCwd}' does not have a name`);
}
this.relativeCwd = relativeCwd;
this._project = project;
}
async updateChangelog(entry) {
const changeLogFile = (0, path_1.join)(this.cwd, 'CHANGELOG.md');
let changeLog = '';
if ((0, fs_1.existsSync)(changeLogFile)) {
changeLog = await (0, promises_1.readFile)(changeLogFile, 'utf-8');
}
changeLog = (0, changelog_1.addToChangelog)(entry, changeLog);
await (0, promises_1.writeFile)(changeLogFile, changeLog, 'utf-8');
return changeLogFile;
}
async updateVersion(version) {
const newManifest = {
...this.manifest,
version,
};
this.manifestContent.manifest = newManifest;
await persistManifest(this.cwd, this.manifestContent);
}
async detectBumpType(configuration, versionBranch, gitPlatform, logger) {
const tags = await this.project.git.versionTags(this.tagPrefix);
const currentVersion = (0, version_utils_1.determineCurrentVersion)(tags, versionBranch, this.tagPrefix);
const logs = await this.project.git.logs(currentVersion.hash, this.relativeCwd);
const commits = (0, conventional_commmit_utils_1.parseConventionalCommits)(logs, gitPlatform);
logger?.reportInfo(`Found ${colorize_node_1.colorize.cyan(commits.length)} commits following conventional commit standard for version`);
const bumpType = (0, bump_utils_1.validateBumpType)((0, bump_utils_1.detectBumpType)(commits), logs, configuration, versionBranch, logger);
return bumpType;
}
}
exports.NodeWorkspace = NodeWorkspace;
class NodeProject extends NodeWorkspace {
name = 'Node project';
_cwd;
_config;
_git;
get cwd() {
return this._cwd;
}
get config() {
return this._config;
}
get git() {
return this._git;
}
childWorkspaces = [];
get workspaces() {
return [
this,
...this.childWorkspaces,
];
}
get project() {
return this;
}
static async initialize(initialize) {
const manifestContent = await loadManifest(initialize.cwd);
if (!manifestContent) {
return null;
}
const project = new NodeProject(initialize.cwd, manifestContent, initialize, initialize.git);
if (project.manifest.workspaces && Array.isArray(project.manifest.workspaces)) {
const paths = await (0, glob_1.glob)(project.manifest.workspaces, {
cwd: initialize.cwd,
});
const workspacePromises = paths.map(async (path) => {
const worspaceManifestContent = await loadManifest((0, path_1.join)(initialize.cwd, path));
if (worspaceManifestContent && worspaceManifestContent.manifest.private !== true) {
return new NodeWorkspace(project, path, worspaceManifestContent);
}
else {
return undefined;
}
});
const workspaces = await Promise.all(workspacePromises);
project.childWorkspaces = workspaces.filter((w) => !!w);
}
return project;
}
constructor(cwd, manifestContent, config, git) {
super(undefined, '.', manifestContent);
this._project = this;
this._cwd = cwd;
this._config = config;
this._git = git;
}
}
exports.NodeProject = NodeProject;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvZW1iZWRkZWQvbm9kZS9ub2RlLXByb2plY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0NBLG9DQWdCQztBQUVELDBDQU1DO0FBMURELGlEQUF5QztBQUN6QywwQ0FBa0Q7QUFDbEQsMkJBQWdDO0FBQ2hDLCtCQUE0QjtBQUM1QiwrQkFBNEI7QUFDNUIsNENBQThCO0FBRTlCLHlEQUFzRjtBQUN0Rix1REFBeUU7QUFFekUsdURBQWtFO0FBQ2xFLHlGQUFvRjtBQUdwRiwrREFBc0U7QUFJekQsUUFBQSxjQUFjLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDbEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3BDLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Q0FDbEQsQ0FBQyxDQUFDO0FBU0gsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLENBQUM7QUFFbkMsS0FBSyxVQUFVLFlBQVksQ0FBQyxNQUFjO0lBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxXQUFJLEVBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLElBQUEsZUFBVSxFQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUEsbUJBQVEsRUFB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