name: PR Validation
on:
pull_request:
branches: [ main ]
push:
branches: [ main ]
permissions:
contents: read
jobs:
validate:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '20.x'
cache: 'npm'
- name: Show Node and npm versions
run: |
node -v
npm -v
- name: Install dependencies
run: npm ci
- name: Validate version is greater than published
shell: bash
run: |
set -euo pipefail
pkg_name=$(node -p "require('./package.json').name")
pkg_version=$(node -p "require('./package.json').version")
published_version=$(npm view "$pkg_name" version 2>/dev/null || echo "0.0.0")
echo "Package: $pkg_name"
echo "Local version: $pkg_version"
echo "Published version: $published_version"
# Use Node.js built-in functionality to compare semantic versions
node -e "
const localVer = '$pkg_version';
const publishedVer = '$published_version';
// Basic semantic version validation (x.y.z format)
const versionPattern = /^(\d+)\.(\d+)\.(\d+)$/;
if (!versionPattern.test(localVer)) {
console.error('Invalid local version format:', localVer);
process.exit(1);
}
if (publishedVer !== '0.0.0' && !versionPattern.test(publishedVer)) {
console.error('Invalid published version format:', publishedVer);
process.exit(1);
}
// Parse versions into comparable numbers
const parseVersion = (v) => {
const [, major, minor, patch] = v.match(versionPattern);
return [parseInt(major), parseInt(minor), parseInt(patch)];
};
const [localMajor, localMinor, localPatch] = parseVersion(localVer);
const [pubMajor, pubMinor, pubPatch] = parseVersion(publishedVer);
// Compare versions
const isGreater = localMajor > pubMajor ||
(localMajor === pubMajor && localMinor > pubMinor) ||
(localMajor === pubMajor && localMinor === pubMinor && localPatch > pubPatch);
if (isGreater) {
console.log('✅ Version validation passed: ' + localVer + ' > ' + publishedVer);
process.exit(0);
} else {
console.error('❌ Version validation failed: ' + localVer + ' is not greater than ' + publishedVer);
console.error('Please increment the version in package.json');
process.exit(1);
}
"
- name: Build
run: npm run build
- name: Test
run: npm test