blob: 45c0d7f98ac1f3f487c1d3b898374e42e5c67d5d [file]
#!/usr/bin/env node
// Applies patches/ during the root postinstall.
//
// patch-package is a root devDependency, so `npm ci --workspace <name>` and
// `npm ci --omit=dev` install a tree without it while still running the root
// postinstall. Failing there would break install modes that work on main, so a
// missing patch-package is reported and skipped; a patch that exists but no
// longer applies still fails the install via --error-on-fail.
//
// Skipping is safe because those trees are not what ships: every release and CI
// lane runs a plain root `npm ci`, and an unpatched tree turns
// packages/runtime/src/__tests__/model-factory-tool-call-index.test.ts red.
import { spawnSync } from 'node:child_process';
import { existsSync, readdirSync } from 'node:fs';
import { createRequire } from 'node:module';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
const repoRoot = dirname(dirname(fileURLToPath(import.meta.url)));
const patchesDirectory = join(repoRoot, 'patches');
if (
!existsSync(patchesDirectory) ||
!readdirSync(patchesDirectory).some((entry) => entry.endsWith('.patch'))
) {
process.exit(0);
}
let patchPackageEntry;
try {
patchPackageEntry = createRequire(import.meta.url).resolve('patch-package/index.js');
} catch {
console.warn(
'patch-package is not installed; skipping patches/. Run a plain `npm ci` from the repo root before building or packaging.',
);
process.exit(0);
}
const result = spawnSync(process.execPath, [patchPackageEntry, '--error-on-fail'], {
cwd: repoRoot,
stdio: 'inherit',
});
process.exit(result.status ?? 1);