From 2052ce5cb8f1b26098d69376746ae2f7a848210b Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Thu, 11 Aug 2022 14:08:08 +0800 Subject: [PATCH] Bundle CLI as ES Module (#13091) --- bin/prettier.cjs | 12 ++----- scripts/build/build.mjs | 2 +- scripts/build/bundler.mjs | 14 ++++++-- scripts/build/config.mjs | 10 +++++- .../esbuild-plugins/shim-commonjs-objects.mjs | 36 +++++++++++++++++++ 5 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 scripts/build/esbuild-plugins/shim-commonjs-objects.mjs diff --git a/bin/prettier.cjs b/bin/prettier.cjs index ee8bd4ed2..4aec3f4ee 100755 --- a/bin/prettier.cjs +++ b/bin/prettier.cjs @@ -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); diff --git a/scripts/build/build.mjs b/scripts/build/build.mjs index 378343519..3d665bbbb 100644 --- a/scripts/build/build.mjs +++ b/scripts/build/build.mjs @@ -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"]) { diff --git a/scripts/build/bundler.mjs b/scripts/build/bundler.mjs index 02a700ca6..326eb603e 100644 --- a/scripts/build/bundler.mjs +++ b/scripts/build/bundler.mjs @@ -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", }; } } diff --git a/scripts/build/config.mjs b/scripts/build/config.mjs index e519face4..2e79dcfdb 100644 --- a/scripts/build/config.mjs +++ b/scripts/build/config.mjs @@ -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")], diff --git a/scripts/build/esbuild-plugins/shim-commonjs-objects.mjs b/scripts/build/esbuild-plugins/shim-commonjs-objects.mjs new file mode 100644 index 000000000..11e708379 --- /dev/null +++ b/scripts/build/esbuild-plugins/shim-commonjs-objects.mjs @@ -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} + ` + ); + }); + }, + }; +}