diff --git a/changelog_unreleased/api/12740.md b/changelog_unreleased/api/12740.md index 2ddd147e4..770dc6a10 100644 --- a/changelog_unreleased/api/12740.md +++ b/changelog_unreleased/api/12740.md @@ -1,19 +1,5 @@ #### [BREAKING] npm package file structures changed (#12740 by @fisker, #13530 by @fisker, #14570 by @fisker) -Export style changes: - -The ESM version standalone entry has changed export style from default export to named export. - -```diff -- import prettier from "https://unpkg.com/prettier@2.7.1/esm/standalone.mjs"; -+ import * as prettier from "https://unpkg.com/prettier@3.0.0/standalone.mjs"; -``` - -```diff -- import prettier from "https://unpkg.com/prettier@2.7.1/esm/standalone.mjs"; -+ import { format } from "https://unpkg.com/prettier@3.0.0/standalone.mjs"; -``` - File structures changes: - `bin-prettier.js` -> `bin/prettier.cjs` diff --git a/changelog_unreleased/api/13268.md b/changelog_unreleased/api/13268.md index 64c94612d..62d1448a1 100644 --- a/changelog_unreleased/api/13268.md +++ b/changelog_unreleased/api/13268.md @@ -17,7 +17,7 @@ The second argument `parsers` has been removed, if you still need other parser d 1. Import the plugin yourself (recommended) ```js - import pluginBabel from "prettier/plugins/babel"; + import * as pluginBabel from "prettier/plugins/babel"; const myCustomPlugin = { parsers: { diff --git a/scripts/build/build-javascript-module.js b/scripts/build/build-javascript-module.js index 0bb9ab301..5e28e3cb8 100644 --- a/scripts/build/build-javascript-module.js +++ b/scripts/build/build-javascript-module.js @@ -14,6 +14,7 @@ import esbuildPluginStripNodeProtocol from "./esbuild-plugins/strip-node-protoco import esbuildPluginThrowWarnings from "./esbuild-plugins/throw-warnings.js"; import esbuildPluginShimCommonjsObjects from "./esbuild-plugins/shim-commonjs-objects.js"; import esbuildPluginPrimitiveDefine from "./esbuild-plugins/primitive-define.js"; +import esbuildPluginAddDefaultExport from "./esbuild-plugins/add-default-export.js"; import transform from "./transform/index.js"; import { getPackageFile } from "./utils.js"; @@ -209,6 +210,7 @@ function getEsbuildOptions({ file, files, shouldCollectLicenses, cliOptions }) { allowDynamicRequire: file.platform === "node", allowDynamicImport: file.platform === "node", }), + buildOptions.addDefaultExport && esbuildPluginAddDefaultExport(), ].filter(Boolean), minify: shouldMinify, legalComments: "none", diff --git a/scripts/build/config.js b/scripts/build/config.js index d08a0c63e..5132d9588 100644 --- a/scripts/build/config.js +++ b/scripts/build/config.js @@ -65,6 +65,7 @@ function getTypesFileConfig({ input: jsFileInput, outputBaseName, isPlugin }) { * @property {"node" | "universal"} platform - ESBuild platform * @property {BuildOptions} buildOptions - ESBuild options * @property {boolean?} isPlugin - file is a plugin + * @property {boolean?} addDefaultExport - add default export to bundle */ /* @@ -434,7 +435,10 @@ const universalFiles = [...nonPluginUniversalFiles, ...pluginFiles].flatMap( input, output, platform: "universal", - buildOptions, + buildOptions: { + addDefaultExport: output.format === "esm", + ...buildOptions, + }, isPlugin, build: buildJavascriptModule, kind: "javascript", @@ -472,6 +476,7 @@ const nodejsFiles = [ }, replaceDiffPackageEntry("lib/diff/array.js"), ], + addDefaultExport: true, }, { input: "src/index.cjs", diff --git a/scripts/build/esbuild-plugins/add-default-export.js b/scripts/build/esbuild-plugins/add-default-export.js new file mode 100644 index 000000000..9b15b730b --- /dev/null +++ b/scripts/build/esbuild-plugins/add-default-export.js @@ -0,0 +1,42 @@ +import path from "node:path"; + +const namespace = "with-default-export"; +export default function esbuildPluginAddDefaultExport() { + return { + name: "addDefaultExport", + setup(build) { + const { initialOptions } = build; + if (initialOptions.format !== "esm") { + return; + } + + let entry; + + build.onResolve({ filter: /./ }, (module) => { + if (module.kind === "entry-point") { + const relativePath = module.path + .slice(module.resolveDir.length + 1) + .replaceAll("\\", "/"); + + entry = module.path; + return { path: relativePath, namespace }; + } + }); + + build.onLoad({ filter: /./, namespace }, () => { + const directory = path.dirname(entry); + const source = `./${path.basename(entry)}`; + + return { + contents: /* indent */ ` + import * as namespace from "${source}"; + + export * from "${source}"; + export default namespace; + `, + resolveDir: directory, + }; + }); + }, + }; +} diff --git a/src/plugins/acorn.js b/src/plugins/acorn.js index fff470190..48f00945a 100644 --- a/src/plugins/acorn.js +++ b/src/plugins/acorn.js @@ -2,4 +2,3 @@ import { acorn } from "../language-js/parse/acorn.js"; import { espree } from "../language-js/parse/espree.js"; export const parsers = { acorn, espree }; -export default { parsers }; diff --git a/src/plugins/angular.js b/src/plugins/angular.js index 17e250188..d2e532d74 100644 --- a/src/plugins/angular.js +++ b/src/plugins/angular.js @@ -1,4 +1 @@ -import * as parsers from "../language-js/parse/angular.js"; - -export { parsers }; -export default { parsers }; +export * as parsers from "../language-js/parse/angular.js"; diff --git a/src/plugins/babel.js b/src/plugins/babel.js index 6bc1571a4..7bdb629ea 100644 --- a/src/plugins/babel.js +++ b/src/plugins/babel.js @@ -3,4 +3,3 @@ import babelParsers from "../language-js/parse/babel.js"; import jsonParsers from "../language-json/parser-json.js"; export const parsers = { ...babelParsers, ...jsonParsers }; -export default { parsers }; diff --git a/src/plugins/estree.js b/src/plugins/estree.js index 682c470b2..e14eacb5c 100644 --- a/src/plugins/estree.js +++ b/src/plugins/estree.js @@ -2,12 +2,10 @@ import * as estreePrinter from "../language-js/printer-estree.js"; import jsLanguages from "../language-js/languages.evaluate.js"; import * as estreeJsonPrinter from "../language-json/printer-estree-json.js"; import jsonLanguages from "../language-json/languages.evaluate.js"; -import options from "../language-js/options.js"; export const printers = { estree: estreePrinter, "estree-json": estreeJsonPrinter, }; export const languages = [...jsLanguages, ...jsonLanguages]; -export { options }; -export default { printers, languages, options }; +export { default as options } from "../language-js/options.js"; diff --git a/src/plugins/flow.js b/src/plugins/flow.js index cdc6099f8..eed12b647 100644 --- a/src/plugins/flow.js +++ b/src/plugins/flow.js @@ -1,4 +1 @@ -import * as parsers from "../language-js/parse/flow.js"; - -export { parsers }; -export default { parsers }; +export * as parsers from "../language-js/parse/flow.js"; diff --git a/src/plugins/glimmer.js b/src/plugins/glimmer.js index 86f4d64d7..bac40853f 100644 --- a/src/plugins/glimmer.js +++ b/src/plugins/glimmer.js @@ -1,2 +1 @@ export * from "../language-handlebars/index.js"; -export * as default from "../language-handlebars/index.js"; diff --git a/src/plugins/graphql.js b/src/plugins/graphql.js index 1279f5de1..dc20ed3d0 100644 --- a/src/plugins/graphql.js +++ b/src/plugins/graphql.js @@ -1,2 +1 @@ export * from "../language-graphql/index.js"; -export * as default from "../language-graphql/index.js"; diff --git a/src/plugins/html.js b/src/plugins/html.js index 22fd2f977..8f592a289 100644 --- a/src/plugins/html.js +++ b/src/plugins/html.js @@ -1,2 +1 @@ export * from "../language-html/index.js"; -export * as default from "../language-html/index.js"; diff --git a/src/plugins/markdown.js b/src/plugins/markdown.js index 97ac2f4a5..a161a556d 100644 --- a/src/plugins/markdown.js +++ b/src/plugins/markdown.js @@ -1,2 +1 @@ export * from "../language-markdown/index.js"; -export * as default from "../language-markdown/index.js"; diff --git a/src/plugins/meriyah.js b/src/plugins/meriyah.js index b46568fbc..fcab3c9d3 100644 --- a/src/plugins/meriyah.js +++ b/src/plugins/meriyah.js @@ -1,4 +1 @@ -import * as parsers from "../language-js/parse/meriyah.js"; - -export { parsers }; -export default { parsers }; +export * as parsers from "../language-js/parse/meriyah.js"; diff --git a/src/plugins/postcss.js b/src/plugins/postcss.js index 96e4e90f6..71ed453c6 100644 --- a/src/plugins/postcss.js +++ b/src/plugins/postcss.js @@ -1,2 +1 @@ export * from "../language-css/index.js"; -export * as default from "../language-css/index.js"; diff --git a/src/plugins/typescript.js b/src/plugins/typescript.js index 0876cb729..fb7e95370 100644 --- a/src/plugins/typescript.js +++ b/src/plugins/typescript.js @@ -1,4 +1 @@ -import * as parsers from "../language-js/parse/typescript.js"; - -export { parsers }; -export default { parsers }; +export * as parsers from "../language-js/parse/typescript.js"; diff --git a/src/plugins/yaml.js b/src/plugins/yaml.js index 62da32e91..1cd45dd48 100644 --- a/src/plugins/yaml.js +++ b/src/plugins/yaml.js @@ -1,2 +1 @@ export * from "../language-yaml/index.js"; -export * as default from "../language-yaml/index.js"; diff --git a/tests/integration/__tests__/bundle.js b/tests/integration/__tests__/bundle.js index 3acd4d137..50675ddc0 100644 --- a/tests/integration/__tests__/bundle.js +++ b/tests/integration/__tests__/bundle.js @@ -103,13 +103,13 @@ test("Commonjs version", () => { expect(Object.keys(prettierCommonjsVersion).sort()).toEqual( Object.keys(prettier) - .filter((key) => key !== "__internal") + .filter((key) => key !== "default" && key !== "__internal") .sort() ); expect(typeof prettierCommonjsVersion.format).toBe("function"); expect(Object.keys(prettierCommonjsVersion.doc)).toEqual( - Object.keys(prettier.doc) + Object.keys(prettier.doc).filter((key) => key !== "default") ); expect(typeof prettierCommonjsVersion.doc.builders.fill).toBe("function");