From 6c9ba400fa947af500a40699ab75f0753d2f19d4 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Mon, 13 Mar 2023 09:20:12 +0800 Subject: [PATCH] Bundle printers in plugins (#14354) --- scripts/build-website.mjs | 10 ++++--- scripts/build/build-javascript-module.js | 6 ---- scripts/build/config.mjs | 19 +++++++------ src/standalone.js | 5 ++-- src/utils/create-parsers.js | 35 +++++++++++++----------- tests/integration/__tests__/bundle.js | 5 +++- website/static/worker.js | 30 ++++---------------- 7 files changed, 49 insertions(+), 61 deletions(-) diff --git a/scripts/build-website.mjs b/scripts/build-website.mjs index 842baf679..5ca11608a 100644 --- a/scripts/build-website.mjs +++ b/scripts/build-website.mjs @@ -50,10 +50,12 @@ async function buildPrettier() { } async function buildPlaygroundFiles() { - const patterns = IS_PULL_REQUEST - ? ["standalone.js", "plugins/*.js"] - : // TODO: Remove this after we release v3 - ["standalone.js", "parser-*.js"]; + const patterns = [ + "standalone.js", + "plugins/*.js", + // TODO: Remove this after we release v3 + "parser-*.js", + ]; const files = await fastGlob(patterns, { cwd: PRETTIER_DIR, diff --git a/scripts/build/build-javascript-module.js b/scripts/build/build-javascript-module.js index 1bfac69c8..f0abf1f31 100644 --- a/scripts/build/build-javascript-module.js +++ b/scripts/build/build-javascript-module.js @@ -175,13 +175,7 @@ function getEsbuildOptions({ file, files, shouldCollectLicenses, cliOptions }) { // Replace parser getters with `undefined` for (const file of [ - "src/language-css/parsers.js", - "src/language-graphql/parsers.js", - "src/language-html/parsers.js", - "src/language-handlebars/parsers.js", "src/language-js/parse/parsers.js", - "src/language-markdown/parsers.js", - "src/language-yaml/parsers.js", // This module requires file access, should not include in universal bundle "src/utils/get-interpreter.js", ]) { diff --git a/scripts/build/config.mjs b/scripts/build/config.mjs index 96cd52352..640123fc1 100644 --- a/scripts/build/config.mjs +++ b/scripts/build/config.mjs @@ -267,7 +267,8 @@ const pluginFiles = [ ], }, { - input: "src/language-css/parser-postcss.js", + input: "src/language-css/index.js", + outputBaseName: "postcss", replaceModule: [ // The following two replacements prevent load `source-map` module { @@ -307,9 +308,9 @@ const pluginFiles = [ }, ], }, - "src/language-graphql/parser-graphql.js", + "src/language-graphql/index.js", { - input: "src/language-markdown/parser-markdown.js", + input: "src/language-markdown/index.js", replaceModule: [ { module: getPackageFile("parse-entities/decode-entity.browser.js"), @@ -318,7 +319,8 @@ const pluginFiles = [ ], }, { - input: "src/language-handlebars/parser-glimmer.js", + input: "src/language-handlebars/index.js", + outputBaseName: "glimmer", replaceModule: [ // See comment in `src/language-handlebars/parser-glimmer.js` file { @@ -343,8 +345,8 @@ const pluginFiles = [ }, ], }, - "src/language-html/parser-html.js", - "src/language-yaml/parser-yaml.js", + "src/language-html/index.js", + "src/language-yaml/index.js", ].map((file) => { if (typeof file === "string") { file = { input: file }; @@ -352,8 +354,9 @@ const pluginFiles = [ let { input, umdPropertyName, outputBaseName, ...buildOptions } = file; - outputBaseName ??= input.match( - /(?:parser-|parse\/)(?.*?)\.js$/ + outputBaseName ??= ( + input.match(/\/(?:parser-|parse\/)(?.*?)\.js$/) ?? + input.match(/\/language-(?.*?)\/index\.js$/) ).groups.outputBaseName; const umdVariableName = `prettierPlugins.${ diff --git a/src/standalone.js b/src/standalone.js index b32ef0e30..6233e4053 100644 --- a/src/standalone.js +++ b/src/standalone.js @@ -1,8 +1,9 @@ import * as core from "./main/core.js"; import { getSupportInfo as getSupportInfoWithoutPlugins } from "./main/support.js"; -import * as languages from "./languages.js"; +import * as prettierPluginJs from "./language-js/index.js"; +import * as prettierPluginJson from "./language-json/index.js"; -const builtinPlugins = Object.values(languages); +const builtinPlugins = [prettierPluginJs, prettierPluginJson]; function withPlugins( fn, diff --git a/src/utils/create-parsers.js b/src/utils/create-parsers.js index 3d8195705..6408f2d9c 100644 --- a/src/utils/create-parsers.js +++ b/src/utils/create-parsers.js @@ -1,21 +1,24 @@ -const createParsers = - process.env.PRETTIER_TARGET === "universal" - ? () => {} - : function (modules) { - const parsers = Object.create(null); +function createParsers(modules) { + /* c8 ignore start */ + if (!modules) { + return; + } + /* c8 ignore end */ - for (const { importPlugin, parserNames } of modules) { - for (const parserName of parserNames) { - parsers[parserName] = async () => { - const { - default: { parsers: pluginParsers }, - } = await importPlugin(); - return Object.assign(parsers, pluginParsers)[parserName]; - }; - } - } + const parsers = Object.create(null); - return parsers; + for (const { importPlugin, parserNames } of modules) { + for (const parserName of parserNames) { + parsers[parserName] = async () => { + const { + default: { parsers: pluginParsers }, + } = await importPlugin(); + return Object.assign(parsers, pluginParsers)[parserName]; }; + } + } + + return parsers; +} export default createParsers; diff --git a/tests/integration/__tests__/bundle.js b/tests/integration/__tests__/bundle.js index 63c40243b..de20a7e9b 100644 --- a/tests/integration/__tests__/bundle.js +++ b/tests/integration/__tests__/bundle.js @@ -48,7 +48,10 @@ describe("standalone", () => { esmPlugins = await Promise.all( fastGlob .sync(["plugins/*.mjs"], { cwd: distDirectory, absolute: true }) - .map(async (file) => (await importModule(file)).default) + .map(async (file) => { + const plugin = await importModule(file); + return plugin.default ?? plugin; + }) ); }); diff --git a/website/static/worker.js b/website/static/worker.js index fbc6fdde5..1a22f85d0 100644 --- a/website/static/worker.js +++ b/website/static/worker.js @@ -2,29 +2,12 @@ "use strict"; -const imported = Object.create(null); -function importScriptOnce(url) { - if (!imported[url]) { - imported[url] = true; - importScripts(url); - } -} - importScripts("lib/parsers-location.js"); importScripts("lib/standalone.js"); -// this is required to only load parsers when we need them -const parsers = Object.create(null); -for (const [parser, file] of Object.entries(parsersLocation)) { - Object.defineProperty(parsers, parser, { - get() { - const url = `lib/${file}`; - importScriptOnce(url); - return Object.values(prettierPlugins).find((plugin) => - Object.hasOwn(plugin.parsers, parser) - ).parsers[parser]; - }, - }); +// TODO[@fisker]: Lazy load plugins +for (const file of new Set(Object.values(parsersLocation))) { + importScripts(`lib/${file}`); } const docExplorerPlugin = { @@ -46,6 +29,8 @@ const docExplorerPlugin = { languages: [{ name: "doc-explorer", parsers: ["doc-explorer"] }], }; +const plugins = [...Object.values(prettierPlugins), docExplorerPlugin]; + self.onmessage = async function (event) { self.postMessage({ uid: event.data.uid, @@ -78,9 +63,7 @@ function handleMessage(message) { } async function handleMetaMessage() { - const supportInfo = await prettier.getSupportInfo({ - plugins: [docExplorerPlugin], - }); + const supportInfo = await prettier.getSupportInfo({ plugins }); return { type: "meta", @@ -90,7 +73,6 @@ async function handleMetaMessage() { } async function handleFormatMessage(message) { - const plugins = [{ parsers }, docExplorerPlugin]; const options = { ...message.options, plugins }; delete options.ast;