Bundle CLI as ES Module (#13091)

This commit is contained in:
fisker Cheung authored and GitHub committed 2022-08-11 14:08:08 +08:00
1 parent a6661e850c
commit 2052ce5cb8
5 files changed
+60 -14

No files matched your search

+2 -10
View File
@@ -11,14 +11,6 @@ function runCli(cli) {
return cli.run(process.argv.slice(2));
}
module.exports.promise = (function () {
if (process.env.NODE_ENV !== "production") {
var dynamicImport = new Function("module", "return import(module)");
var dynamicImport = new Function("module", "return import(module)");
return dynamicImport("../src/cli/index.js").then(runCli);
}
var cli = require("../src/cli/index.js");
return runCli(cli);
})();
module.exports.promise = dynamicImport("../src/cli/index.js").then(runCli);
+1 -1
View File
@@ -145,7 +145,7 @@ async function preparePackage() {
prepublishOnly:
"node -e \"assert.equal(require('.').version, require('..').version)\"",
};
packageJson.files = ["*.js", "esm/*.mjs"];
packageJson.files = ["*.js", "*.mjs", "esm/*.mjs"];
await writeJson(path.join(DIST_DIR, "package.json"), packageJson);
for (const file of ["README.md", "LICENSE"]) {
+12 -2
View File
@@ -12,6 +12,7 @@ import esbuildPluginInteropDefault from "./esbuild-plugins/interop-default.mjs";
import esbuildPluginVisualizer from "./esbuild-plugins/visualizer.mjs";
import esbuildPluginStripNodeProtocol from "./esbuild-plugins/strip-node-protocol.mjs";
import esbuildPluginThrowWarnings from "./esbuild-plugins/throw-warnings.mjs";
import esbuildPluginShimCommonjsObjects from "./esbuild-plugins/shim-commonjs-objects.mjs";
import bundles from "./config.mjs";
const { dirname, readJsonSync, require } = createEsmUtils(import.meta);
@@ -89,8 +90,12 @@ function* getEsbuildOptions(bundle, buildOptions) {
// Replace other bundled files
if (bundle.target === "node") {
// Replace bundled files and `package.json` with dynamic `require()`
// Replace other bundled files and `package.json` with dynamic `require()`
for (const { input, output } of bundledFiles) {
if (input === path.join(PROJECT_ROOT, bundle.input)) {
continue;
}
replaceModule.push({ module: input, external: output });
}
@@ -241,10 +246,15 @@ function* getEsbuildOptions(bundle, buildOptions) {
esbuildOptions.plugins.push(esbuildPluginInteropDefault());
}
// https://github.com/evanw/esbuild/issues/1921
if (bundle.format === "esm") {
esbuildOptions.plugins.push(esbuildPluginShimCommonjsObjects());
}
yield {
...esbuildOptions,
outfile: bundle.output,
format: "cjs",
format: bundle.format ?? "cjs",
};
}
}
+9 -1
View File
@@ -1,6 +1,7 @@
import path from "node:path";
import { createRequire } from "node:module";
import createEsmUtils from "esm-utils";
import { PROJECT_ROOT } from "../utils/index.mjs";
const { require, dirname } = createEsmUtils(import.meta);
@@ -340,10 +341,17 @@ const coreBundles = [
input: "bin/prettier.cjs",
output: "bin-prettier.js",
esbuildTarget: ["node0.10"],
replaceModule: [
{
module: path.join(PROJECT_ROOT, "bin/prettier.cjs"),
process: (text) => text.replace('"../src/cli/index.js"', '"./cli.mjs"'),
},
],
},
{
input: "src/cli/index.js",
output: "cli.js",
output: "cli.mjs",
format: "esm",
external: ["benchmark"],
interopDefault: false,
replaceModule: [replaceDiffPackageEntry("lib/patch/create.js")],
@@ -0,0 +1,36 @@
import fs from "node:fs";
import { outdent } from "outdent";
export default function esbuildPluginShimCommonjsObjects() {
return {
name: "shim-commonjs-objects",
setup(build) {
const { onEnd, initialOptions: esbuildOptions } = build;
onEnd(() => {
const file = esbuildOptions.outfile;
if (!fs.existsSync(file)) {
throw new Error(`${file} not exists`);
}
const text = fs.readFileSync(file, "utf8");
// Use `__prettier` prefix to avoid possible conflicts
fs.writeFileSync(
file,
outdent`
import { createRequire as __prettierCreateRequire } from "module";
import { fileURLToPath as __prettierFileUrlToPath } from "url";
import { dirname as __prettierDirname } from "path";
const require = __prettierCreateRequire(import.meta.url);
const __filename = __prettierFileUrlToPath(import.meta.url);
const __dirname = __prettierDirname(__filename);
${text}
`
);
});
},
};
}