UNPKG

@esmx/rspack

Version:

A high-performance Rspack integration for Esmx microfrontend framework, providing Module Linking and SSR capabilities.

78 lines (77 loc) 2.32 kB
import crypto from "node:crypto"; import Arborist from "@npmcli/arborist"; import pacote from "pacote"; export async function pack(esmx) { const { packConfig } = esmx; const pkgJson = await packConfig.packageJson( esmx, await buildPackageJson(esmx) ); esmx.writeSync( esmx.resolvePath("dist/package.json"), JSON.stringify(pkgJson, null, 4) ); if (!packConfig.enable) { return true; } await packConfig.onBefore(esmx, pkgJson); const data = await pacote.tarball(esmx.resolvePath("dist"), { Arborist }); const hash = contentHash(data); packConfig.outputs.forEach((file) => { const tgz = esmx.resolvePath("./", file); const txt = tgz.replace(/\.tgz$/, ".txt"); esmx.writeSync(tgz, data); esmx.writeSync(txt, hash); }); await packConfig.onAfter(esmx, pkgJson, data); return true; } export function generateExports(options) { const { client, server, base = {} } = options; const exports = { ...base }; const set = /* @__PURE__ */ new Set([...Object.keys(client), ...Object.keys(server)]); set.forEach((name) => { const clientExport = client[name]; const serverExport = server[name]; const exportName = name === "index" ? "." : `./${name}`; if (clientExport && serverExport) { exports[exportName] = { default: `./server/${serverExport.file}`, browser: `./client/${clientExport.file}` }; } else if (clientExport) { exports[exportName] = `./client/${clientExport.file}`; } else if (serverExport) { exports[exportName] = `./server/${serverExport.file}`; } }); return exports; } async function buildPackageJson(esmx) { const [clientJson, serverJson, curJson] = await Promise.all([ esmx.readJson( esmx.resolvePath("dist/client/manifest.json") ), esmx.readJson( esmx.resolvePath("dist/server/manifest.json") ), esmx.readJson(esmx.resolvePath("package.json")) ]); const exports = generateExports({ client: clientJson.exports, server: serverJson.exports, base: curJson?.exports }); const buildJson = { ...curJson, exports }; return buildJson; } export function contentHash(buffer, algorithm = "sha256") { const hash = crypto.createHash(algorithm); hash.update(buffer); return `${algorithm}-${hash.digest("hex")}`; }