const fs = require('fs'); const pkg = require('../package.json'); const dir = `${__dirname}/..`; // Add `libc` fields only to platforms that have libc(Standard C library). const triples = [ { name: 'x86_64-apple-darwin', }, { name: 'x86_64-unknown-linux-gnu', libc: 'glibc', }, { name: 'x86_64-pc-windows-msvc', }, { name: 'aarch64-pc-windows-msvc' }, { name: 'aarch64-apple-darwin', }, { name: 'aarch64-unknown-linux-gnu', libc: 'glibc', }, { name: 'armv7-unknown-linux-gnueabihf', }, { name: 'aarch64-unknown-linux-musl', libc: 'musl', }, { name: 'x86_64-unknown-linux-musl', libc: 'musl', }, { name: 'x86_64-unknown-freebsd' } ]; const cpuToNodeArch = { x86_64: 'x64', aarch64: 'arm64', i686: 'ia32', armv7: 'arm', }; const sysToNodePlatform = { linux: 'linux', freebsd: 'freebsd', darwin: 'darwin', windows: 'win32', }; let optionalDependencies = {}; let cliOptionalDependencies = {}; try { fs.mkdirSync(dir + '/npm'); } catch (err) { } for (let triple of triples) { // Add the libc field to package.json to avoid downloading both // `gnu` and `musl` packages in Linux. const libc = triple.libc; let [cpu, , os, abi] = triple.name.split('-'); cpu = cpuToNodeArch[cpu] || cpu; os = sysToNodePlatform[os] || os; let t = `${os}-${cpu}`; if (abi) { t += '-' + abi; } buildNode(triple.name, cpu, os, libc, t); buildCLI(triple.name, cpu, os, libc, t); } pkg.optionalDependencies = optionalDependencies; fs.writeFileSync(`${dir}/package.json`, JSON.stringify(pkg, false, 2) + '\n'); let cliPkg = { ...pkg }; cliPkg.name += '-cli'; cliPkg.bin = { 'lightningcss': 'lightningcss' }; delete cliPkg.main; delete cliPkg.napi; delete cliPkg.exports; delete cliPkg.devDependencies; delete cliPkg.targets; delete cliPkg.types; cliPkg.files = ['lightningcss', 'postinstall.js']; cliPkg.optionalDependencies = cliOptionalDependencies; cliPkg.scripts = { postinstall: 'node postinstall.js' }; fs.writeFileSync(`${dir}/cli/package.json`, JSON.stringify(cliPkg, false, 2) + '\n'); fs.copyFileSync(`${dir}/README.md`, `${dir}/cli/README.md`); fs.copyFileSync(`${dir}/LICENSE`, `${dir}/cli/LICENSE`); function buildNode(triple, cpu, os, libc, t) { let name = `lightningcss.${t}.node`; let pkg2 = { ...pkg }; pkg2.name += '-' + t; pkg2.os = [os]; pkg2.cpu = [cpu]; if (libc) { pkg2.libc = [libc]; } pkg2.main = name; pkg2.files = [name]; delete pkg2.exports; delete pkg2.napi; delete pkg2.devDependencies; delete pkg2.dependencies; delete pkg2.optionalDependencies; delete pkg2.targets; delete pkg2.scripts; delete pkg2.types; optionalDependencies[pkg2.name] = pkg.version; try { fs.mkdirSync(dir + '/npm/node-' + t); } catch (err) { } fs.writeFileSync(`${dir}/npm/node-${t}/package.json`, JSON.stringify(pkg2, false, 2) + '\n'); fs.copyFileSync(`${dir}/artifacts/bindings-${triple}/${name}`, `${dir}/npm/node-${t}/${name}`); fs.writeFileSync(`${dir}/npm/node-${t}/README.md`, `This is the ${triple} build of lightningcss. See https://github.com/parcel-bundler/lightningcss for details.`); fs.copyFileSync(`${dir}/LICENSE`, `${dir}/npm/node-${t}/LICENSE`); } function buildCLI(triple, cpu, os, libc, t) { let binary = os === 'win32' ? 'lightningcss.exe' : 'lightningcss'; let pkg2 = { ...pkg }; pkg2.name += '-cli-' + t; pkg2.os = [os]; pkg2.cpu = [cpu]; pkg2.files = [binary]; if (libc) { pkg2.libc = [libc]; } delete pkg2.main; delete pkg2.exports; delete pkg2.napi; delete pkg2.devDependencies; delete pkg2.dependencies; delete pkg2.optionalDependencies; delete pkg2.targets; delete pkg2.scripts; delete pkg2.types; cliOptionalDependencies[pkg2.name] = pkg.version; try { fs.mkdirSync(dir + '/npm/cli-' + t); } catch (err) { } fs.writeFileSync(`${dir}/npm/cli-${t}/package.json`, JSON.stringify(pkg2, false, 2) + '\n'); fs.copyFileSync(`${dir}/artifacts/bindings-${triple}/${binary}`, `${dir}/npm/cli-${t}/${binary}`); fs.chmodSync(`${dir}/npm/cli-${t}/${binary}`, 0o755); // Ensure execute bit is set. fs.writeFileSync(`${dir}/npm/cli-${t}/README.md`, `This is the ${triple} build of lightningcss-cli. See https://github.com/parcel-bundler/lightningcss for details.`); fs.copyFileSync(`${dir}/LICENSE`, `${dir}/npm/cli-${t}/LICENSE`); }