chore: versioning
This commit is contained in:
+95
-13
@@ -1,21 +1,103 @@
|
||||
const fs = require('fs');
|
||||
|
||||
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8').toString());
|
||||
const lockFilePath = 'package-lock.json';
|
||||
const packageFilePath = 'package.json';
|
||||
const placeholderVersion = 'x.x.x';
|
||||
const command = process.argv[2];
|
||||
|
||||
const [major, minor] = pkg.version.split('.');
|
||||
const prefix = `${major}.${minor}.`;
|
||||
function readJson(path) {
|
||||
return JSON.parse(fs.readFileSync(path, 'utf8').toString());
|
||||
}
|
||||
|
||||
const now = new Date();
|
||||
const start = new Date(now.getFullYear(), 0, 0);
|
||||
const diff = now - start;
|
||||
const dayOfYear = Math.floor(diff / (1000 * 60 * 60 * 24));
|
||||
function writeJson(path, value, spaces) {
|
||||
fs.writeFileSync(path, `${JSON.stringify(value, null, spaces)}\n`);
|
||||
}
|
||||
|
||||
const hh = String(now.getHours()).padStart(2, '0');
|
||||
const mm = String(now.getMinutes()).padStart(2, '0');
|
||||
function getLockFile() {
|
||||
if (!fs.existsSync(lockFilePath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const newVersion = `${prefix}${String(dayOfYear).padStart(3, '0')}${hh}${mm}`;
|
||||
return readJson(lockFilePath);
|
||||
}
|
||||
|
||||
pkg.version = newVersion;
|
||||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
|
||||
function writeVersions(version) {
|
||||
const pkg = readJson(packageFilePath);
|
||||
pkg.version = version;
|
||||
writeJson(packageFilePath, pkg, 2);
|
||||
|
||||
console.log('Version set to: ', newVersion);
|
||||
const lock = getLockFile();
|
||||
|
||||
if (lock) {
|
||||
lock.version = version;
|
||||
|
||||
if (lock.packages?.['']) {
|
||||
lock.packages[''].version = version;
|
||||
}
|
||||
|
||||
writeJson(lockFilePath, lock, 4);
|
||||
}
|
||||
}
|
||||
|
||||
function checkPlaceholder() {
|
||||
const pkg = readJson(packageFilePath);
|
||||
const lock = getLockFile();
|
||||
const errors = [];
|
||||
|
||||
if (pkg.version !== placeholderVersion) {
|
||||
errors.push(`package.json version must be "${placeholderVersion}", got "${pkg.version}"`);
|
||||
}
|
||||
|
||||
if (lock && lock.version !== placeholderVersion) {
|
||||
errors.push(`package-lock.json version must be "${placeholderVersion}", got "${lock.version}"`);
|
||||
}
|
||||
|
||||
if (lock?.packages?.[''] && lock.packages[''].version !== placeholderVersion) {
|
||||
errors.push(
|
||||
`package-lock.json packages[""] version must be "${placeholderVersion}", got "${lock.packages[''].version}"`,
|
||||
);
|
||||
}
|
||||
|
||||
if (errors.length > 0) {
|
||||
for (const error of errors) {
|
||||
console.error(error);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`Version placeholder validated: ${placeholderVersion}`);
|
||||
}
|
||||
|
||||
function fixPlaceholder() {
|
||||
writeVersions(placeholderVersion);
|
||||
console.log(`Version placeholder set to: ${placeholderVersion}`);
|
||||
}
|
||||
|
||||
function getCiVersion() {
|
||||
const major = process.env.VERSION_MAJOR;
|
||||
const minor = process.env.VERSION_MINOR;
|
||||
const patch = process.env.VERSION_PATCH ?? process.env.GITHUB_RUN_NUMBER;
|
||||
const segments = { major, minor, patch };
|
||||
|
||||
for (const [name, value] of Object.entries(segments)) {
|
||||
if (!/^\d+$/.test(value ?? '')) {
|
||||
console.error(`Missing or invalid ${name} version segment: "${value ?? ''}"`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
return `${major}.${minor}.${patch}`;
|
||||
}
|
||||
|
||||
if (command === 'check-placeholder') {
|
||||
checkPlaceholder();
|
||||
} else if (command === 'fix-placeholder') {
|
||||
fixPlaceholder();
|
||||
} else if (command === 'set-ci-version') {
|
||||
const ciVersion = getCiVersion();
|
||||
writeVersions(ciVersion);
|
||||
console.log(`CI version set to: ${ciVersion}`);
|
||||
} else {
|
||||
console.error('Invalid command. Use one of: check-placeholder, fix-placeholder, set-ci-version');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user