diff --git a/mkshims.ts b/mkshims.ts index 4adcd62f..82849d9f 100644 --- a/mkshims.ts +++ b/mkshims.ts @@ -22,6 +22,7 @@ async function main() { fs.writeFileSync(corepackPath, [ `#!/usr/bin/env node`, `process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='0';`, + `require('module').enableCompileCache?.();`, `require('./lib/corepack.cjs').runMain(process.argv.slice(2));`, ].join(`\n`)); fs.chmodSync(corepackPath, 0o755); @@ -34,6 +35,7 @@ async function main() { const entryScript = [ `#!/usr/bin/env node`, `process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1'`, + `require('module').enableCompileCache?.();`, `require('./lib/corepack.cjs').runMain(['${binaryName}', ...process.argv.slice(2)]);`, ].join(`\n`); diff --git a/sources/corepackUtils.ts b/sources/corepackUtils.ts index 15e84056..c84b7c7e 100644 --- a/sources/corepackUtils.ts +++ b/sources/corepackUtils.ts @@ -400,12 +400,15 @@ export async function runVersion(locator: Locator, installSpec: InstallSpec & {s if (!binPath) throw new Error(`Assertion failed: Unable to locate path for bin '${binName}'`); - // Node.js segfaults when using npm@>=9.7.0 and v8-compile-cache - // $ docker run -it node:20.3.0-slim corepack npm@9.7.1 --version - // [SIGSEGV] - if (locator.name !== `npm` || semverLt(locator.reference, `9.7.0`)) - // @ts-expect-error - No types - await import(`v8-compile-cache`); + // @ts-expect-error - Missing types + if (!Module.enableCompileCache) { + // Node.js segfaults when using npm@>=9.7.0 and v8-compile-cache + // $ docker run -it node:20.3.0-slim corepack npm@9.7.1 --version + // [SIGSEGV] + if (locator.name !== `npm` || semverLt(locator.reference, `9.7.0`)) + // @ts-expect-error - No types + await import(`v8-compile-cache`); + } // We load the binary into the current process, // while making it think it was spawned. @@ -429,6 +432,12 @@ export async function runVersion(locator: Locator, installSpec: InstallSpec & {s // Use nextTick to unwind the stack, and consequently remove Corepack from // the stack trace of the package manager. process.nextTick(Module.runMain, binPath); + + // @ts-expect-error - No types + if (Module.flushCompileCache) { + // @ts-expect-error - No types + setImmediate(Module.flushCompileCache); + } } export function shouldSkipIntegrityCheck() {