diff --git a/scripts/generate-lockfiles.mjs b/scripts/generate-lockfiles.mjs index b23e2d45c..e1981efbc 100644 --- a/scripts/generate-lockfiles.mjs +++ b/scripts/generate-lockfiles.mjs @@ -1,4 +1,4 @@ -import { existsSync } from 'node:fs'; +import { existsSync, readFileSync } from 'node:fs'; import { join } from 'node:path'; import { spawnSync } from 'node:child_process'; import { getExampleDirs } from './common-lockfiles.mjs'; @@ -11,6 +11,15 @@ if (dirs.length === 0) { process.exit(1); } +const pnpmVersion = getPnpmVersionFromPath(); +console.log(`Using pnpm version: ${pnpmVersion}`); +const expectedVersion = getExpectedVersionFromPackageJson(); +// assert pnpm V +if (pnpmVersion !== expectedVersion) { + console.error(`Expected pnpm version ${expectedVersion}, got ${pnpmVersion}`); + process.exit(1); +} + let failures = 0; for (const pkgDir of dirs) { console.log(`\n[lockfile] ${pkgDir}`); @@ -43,3 +52,25 @@ if (failures) { } console.log('\nDone.'); + +function getExpectedVersionFromPackageJson() { + const packageJson = JSON.parse(readFileSync(join(process.cwd(), 'package.json'), 'utf8')); + const packageManager = packageJson.packageManager; + if (!packageManager?.startsWith('pnpm@')) { + throw new Error(`Invalid packageManager: ${packageManager || 'missing'}. Expected format: "pnpm@x.y.z"`); + } + return packageManager.slice(5); // Remove "pnpm@" prefix +} + +function getPnpmVersionFromPath() { + const { status, stdout, error } = spawnSync('pnpm', ['--version'], { encoding: 'utf8' }); + if (status !== 0) { + const hint = error?.code === 'ENOENT' ? 'pnpm is not on PATH.' : 'failed to run "pnpm --version".'; + throw new Error(`Could not determine pnpm version: ${hint}`); + } + const version = stdout.trim(); + if (!version) { + throw new Error('Empty version output from "pnpm --version".'); + } + return version; +}