@ 261107.24
current
import { execFileSync } from 'node:child_process';
import { mkdirSync, readdirSync } from 'node:fs';
import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';

const workspaceDir = resolve(dirname(fileURLToPath(import.meta.url)), '..');
const projectArg = process.argv[2];

if (!projectArg) {
    throw new Error('usage: node scripts/pack-napi-release.mjs <project-directory>');
}

const projectDir = resolve(workspaceDir, projectArg);
const projectRelativePath = relative(workspaceDir, projectDir);
if (isAbsolute(projectRelativePath) || projectRelativePath.startsWith('..')) {
    throw new Error(`project directory must be inside the workspace: ${projectArg}`);
}

const npmDir = join(projectDir, 'npm');
const releaseDir = join(projectDir, 'release');
const pnpm = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm';
const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';

function run(command, args) {
    execFileSync(command, args, { cwd: projectDir, stdio: 'inherit' });
}

run(pnpm, ['run', 'create:npm-dirs']);
run(pnpm, ['run', 'artifacts']);
run(pnpm, ['run', 'prepare-release']);

const platformPackageDirs = readdirSync(npmDir, { withFileTypes: true })
    .filter((entry) => entry.isDirectory())
    .sort((a, b) => a.name.localeCompare(b.name));

mkdirSync(releaseDir, { recursive: true });
run(pnpm, ['pack', '--pack-destination', releaseDir]);

for (const entry of platformPackageDirs) {
    run(npm, ['pack', join(npmDir, entry.name), '--pack-destination', releaseDir]);
}