@dev-build-deploy/version-it
Version:
Version Management Library
103 lines (102 loc) • 3.58 kB
JavaScript
;
/*
* SPDX-FileCopyrightText: 2024 Kevin de Jong <monkaii@hotmail.com>
* SPDX-License-Identifier: MIT
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getModifiers = getModifiers;
exports.incrementModifier = incrementModifier;
exports.compareModifiers = compareModifiers;
exports.modifiersToString = modifiersToString;
/**
* Parses the provided string into a list of modifiers; i.e.:
* - alpha.1 => [{ identifier: "alpha", value: 1, length: 1 }]
* - beta.01 => [{ identifier: "beta", value: 1, length: 2 }]
* - alpha.beta.2 => [{ identifier: "alpha", value: 0, length: 0 }, { identifier: "beta", value: 2, length: 1 }]
* - 1.0.0 => []
* @param value String containing zero or more modifiers
* @returns List of modifiers
* @internal
*/
function getModifiers(value) {
const modifiers = [];
let nextModifier = undefined;
for (const element of value ? value.split(".") : []) {
if (isNaN(Number(element))) {
if (nextModifier) {
modifiers.push(nextModifier);
}
nextModifier = { identifier: element, value: 0, length: 0 };
}
else if (!nextModifier) {
modifiers.push({ identifier: undefined, value: Number(element), length: element.length });
}
else {
nextModifier.value = Number(element);
nextModifier.length = element.length;
modifiers.push(nextModifier);
nextModifier = undefined;
}
}
if (nextModifier)
modifiers.push(nextModifier);
return modifiers;
}
/**
* Increments the modifier with the provided identifier
* @param modifiers list of modifiers
* @param identifier identifier to increment
* @returns List of modifiers with the incremented identifier
* @internal
*/
function incrementModifier(modifiers, identifier) {
const modifiersCopy = [...modifiers];
const element = modifiersCopy.findIndex(m => m.identifier === identifier);
if (element === -1) {
return [...modifiersCopy, { identifier, value: 1, length: 1 }];
}
const nextVersion = modifiersCopy[element].value + 1;
modifiersCopy[element] = {
...modifiersCopy[element],
value: nextVersion,
length: nextVersion.toString().length,
};
return modifiersCopy;
}
/**
* Compares to lists of Modifiers
* @param a Left side of comparison
* @param b Right side of comparison
* @returns 1 if a is greater than b, -1 if a is less than b, 0 if a is equal to b
*/
function compareModifiers(a, b) {
if (a.length < b.length)
return 1;
if (a.length > b.length)
return -1;
// 1.0.0.alpha.1 < 1.0.0.alpha.2 < 1.0.0
for (let idx = 0; idx < a.length; idx++) {
const identifierComp = (a[idx].identifier ?? "").localeCompare(b[idx].identifier ?? "");
if (identifierComp !== 0)
return identifierComp;
if (a[idx].value === b[idx].value)
continue;
return a[idx].value > b[idx].value ? 1 : -1;
}
return 0;
}
/**
* Converts a list of modifiers to a string
* @param modifiers List of modifiers
* @returns String representation of the modifiers
* @internal
*/
function modifiersToString(modifiers) {
const elements = modifiers.map(modifier => modifier.identifier
? (() => {
const valuePart = modifier.length > 0 ? "." + modifier.value : "";
return `${modifier.identifier}${valuePart}`;
})()
: `${modifier.value}`);
return modifiers.length > 0 ? "-" + elements.join(".") : "";
}