#!/usr/bin/env zx import { $, fs, glob } from "zx"; import { ast_grep } from "./ast_grep.js"; import { errors } from "./errors.js"; import { root } from "./utils.js"; // clear generated content await Promise.all([ fs.remove(root("cjs")), fs.remove(root("_")), fs.remove(root("src")), ]); let modules = await glob("*.js", { cwd: root("esm") }); const task_queue = []; const NO_MODIFY = [ "/* This file is automatically generated and should not be manually edited. */", "/* To modify this file, please run the `npm run build` command instead. */", ]; // generate index.js const indexESM = [...NO_MODIFY, ""]; const indexCJS = [`"use strict";`, "", ...NO_MODIFY, ""]; const cjs_export_list = []; const cjs_module_lexer = []; const main_package_json = fs.readJSONSync(root("package.json")); main_package_json.exports = { "./package.json": "./package.json", "./esm/*": "./esm/*", "./cjs/*": "./cjs/*", "./src/*": "./src/*", ".": { import: "./esm/index.js", default: "./cjs/index.cjs" }, "./_": { import: "./esm/index.js", default: "./cjs/index.cjs" }, }; modules.forEach((p) => { const importBinding = p.slice(0, -3); main_package_json.exports[`./_/${importBinding}`] = { import: `./esm/${importBinding}.js`, default: `./cjs/${importBinding}.cjs`, }; const alias_package = { main: `../../cjs/${importBinding}.cjs`, module: `../../esm/${importBinding}.js`, }; task_queue.push( fs.outputJSON(root("_", importBinding, "package.json"), alias_package, { encoding: "utf-8", spaces: 4, }), ); if (importBinding === "index") { return; } task_queue.push( fs.outputFile(root("src", `${importBinding}.mjs`), re_export_esm(importBinding), { encoding: "utf-8", }), ); indexESM.push(`export { ${importBinding} } from "./${importBinding}.js";`); cjs_module_lexer.push(`${importBinding}: null,`); cjs_export_list.push(`get ${importBinding}() { return require("./${importBinding}.cjs")._; },`); }); indexCJS.push( `0 && (module.exports = {`, "/* @Annotate_start: the CommonJS named exports for ESM import in node */", ...cjs_module_lexer, "/* @Annotate_end */", `});`, `module.exports = {`, ...cjs_export_list, `};`, ); task_queue.push( fs.outputJSON(root("package.json"), main_package_json, { spaces: 4 }), fs.outputFile(root("esm", "index.js"), indexESM.join("\n") + "\n", { encoding: "utf-8", }), fs.outputFile(root("cjs", "index.cjs"), indexCJS.join("\n") + "\n", { encoding: "utf-8", }), fs.outputFile(root("src", "index.mjs"), `export * from "../esm/index.js"`, { "encoding": "utf-8", }), ); task_queue.push(...ast_grep()); await Promise.all(task_queue); if (errors.length > 0) { errors.forEach((e) => { console.error(e); }); process.exitCode = 1; } else { $.cwd = root("."); await $`dprint fmt`; await $`dprint fmt "scripts/*.js" -c scripts/.dprint.json`; } function re_export_esm(importBinding) { return `export { _ as default } from "../esm/${importBinding}.js"`; }