55 lines
1.6 KiB
JavaScript
55 lines
1.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import { readFile } from 'node:fs/promises';
|
|
import { chmodSync, statSync } from 'node:fs';
|
|
import { dirname, resolve } from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
const repoRoot = resolve(__dirname, '..');
|
|
const packageJsonPath = resolve(repoRoot, 'package.json');
|
|
|
|
function normalizeBinPaths(binField) {
|
|
if (!binField) return [];
|
|
if (typeof binField === 'string') return [binField];
|
|
if (typeof binField === 'object') return Object.values(binField).filter((v) => typeof v === 'string');
|
|
return [];
|
|
}
|
|
|
|
function ensureExecutable(filePath) {
|
|
const stat = statSync(filePath);
|
|
const nextMode = stat.mode | 0o111;
|
|
if (nextMode !== stat.mode) {
|
|
chmodSync(filePath, nextMode);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
async function main() {
|
|
const pkgRaw = await readFile(packageJsonPath, 'utf8');
|
|
const pkg = JSON.parse(pkgRaw);
|
|
const binPaths = normalizeBinPaths(pkg.bin);
|
|
|
|
if (binPaths.length === 0) {
|
|
console.warn('[postbuild] No bin entries found in package.json');
|
|
return;
|
|
}
|
|
|
|
let changed = 0;
|
|
for (const relativeBinPath of binPaths) {
|
|
const cleanRelPath = relativeBinPath.replace(/^\.\//, '');
|
|
const absolutePath = resolve(repoRoot, cleanRelPath);
|
|
const didChange = ensureExecutable(absolutePath);
|
|
if (didChange) changed += 1;
|
|
}
|
|
|
|
console.log(`[postbuild] Ensured executable bit on ${binPaths.length} bin file(s); updated ${changed}.`);
|
|
}
|
|
|
|
main().catch((error) => {
|
|
console.error('[postbuild] Failed to fix bin permissions:', error);
|
|
process.exit(1);
|
|
});
|