import { resolve, dirname } from 'node:path' import { fileURLToPath } from 'node:url' import { mkdirSync, cpSync } from 'node:fs' import { execSync } from 'node:child_process' const filename = fileURLToPath(import.meta.url) const directory = dirname(filename) /** * NPM workspaces does not appear to use `--install-strategy=nested` * correctly. There are still hoisted dependencies. * * This moves the installed dependencies from the various node_module * locations into one directory for distribution. */ const build = (pkg) => { const rootDeps = resolve(directory, './node_modules') const rootDepPkg = resolve(directory, rootDeps, pkg) const pkgDeps = resolve(directory, `./packages/${pkg}/node_modules`) const output = resolve(`./dist/${pkg}`) execSync('npm run clean', { stdio: 'inherit' }) execSync(`npm ci --install-strategy=nested --omit=dev --workspace=${pkg}`, { stdio: 'inherit' }) execSync('rm -rf ./dist', { stdio: 'inherit' }) mkdirSync(output, { recursive: true }) cpSync(rootDeps, output, {recursive: true, filter: (src) => { // Skip the symlinked pkg directory created by npm workspaces if (src !== rootDepPkg) { return true } }}) cpSync(pkgDeps, output, { recursive: true }) } build(process.argv[2])