// Copies the one real runtime dependency the CLI bundle can't statically // inline (libsodium-wrappers, and its own dependency libsodium) next to // the bundle, so dist-bundle/ is a small, complete, self-contained // directory -- no npm install needed wherever it ends up. // // Why not just bundle it: libsodium-wrappers' published ESM build follows // a relative import ("./libsodium.mjs") that's broken in that package's // own dist layout -- the exact bug crypto.ts's own comment documents. // Forcing static inlining via a literal require() (the only way to route // esbuild's resolver to the *working* CJS build instead) was tried and // technically resolved, but produced "No secure random number generator // found" at runtime -- inlining the WASM engine breaks its own Node // crypto feature-detection. Shipping the real, unmodified package files // is more reliable than fighting that. import { cpSync, mkdirSync, existsSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const root = join(dirname(fileURLToPath(import.meta.url)), '..'); const outDir = join(root, 'dist-bundle', 'node_modules'); mkdirSync(outDir, { recursive: true }); for (const pkg of ['libsodium-wrappers', 'libsodium']) { const src = join(root, 'node_modules', pkg); if (!existsSync(src)) { console.error(`missing node_modules/${pkg} -- run npm install first`); process.exit(1); } cpSync(src, join(outDir, pkg), { recursive: true }); } console.log('dist-bundle/node_modules populated (libsodium-wrappers, libsodium)');