From d696f899acd51cc1890ae3732ac8cefdee3a0ef1 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Mon, 5 Jan 2026 05:20:16 +0800 Subject: [PATCH] Minor tweak to builtin plugins generation (#18566) --- scripts/generate-builtin-plugins.js | 84 +++---- .../builtin-plugins/development-plugins.js | 182 +++++++-------- .../builtin-plugins/production-plugins.js | 212 +++++++++--------- src/main/plugins/builtin-plugins/utilities.js | 33 ++- src/main/plugins/load-builtin-plugins.js | 14 +- 5 files changed, 270 insertions(+), 255 deletions(-) diff --git a/scripts/generate-builtin-plugins.js b/scripts/generate-builtin-plugins.js index 993402aeb..f3287061b 100644 --- a/scripts/generate-builtin-plugins.js +++ b/scripts/generate-builtin-plugins.js @@ -54,10 +54,10 @@ async function getPluginData(file, pluginFile, getPluginName) { const pluginData = { name: pluginName, url, - parserNames: Object.hasOwn(implementation, "parsers") + parsers: Object.hasOwn(implementation, "parsers") ? Object.keys(implementation.parsers) : undefined, - printerNames: Object.hasOwn(implementation, "printers") + printers: Object.hasOwn(implementation, "printers") ? Object.keys(implementation.printers) : undefined, }; @@ -94,40 +94,48 @@ function getImportStatements(plugins, file) { .join("\n"); } -function getPluginExportStatement(plugin, file) { - const properties = { - name: JSON.stringify(plugin.name), - importPlugin: `() => import("${getImportSource(file, plugin.url)}")`, - }; +function getExportStatements(plugins, file) { + const codes = sortByUrl(plugins).map((plugin) => { + const properties = { + name: JSON.stringify(plugin.name), + load: `() => import("${getImportSource(file, plugin.url)}")`, + }; - for (const property of ["options", "languages"]) { - if (!plugin[property]) { - continue; + for (const property of ["options", "languages"]) { + if (!plugin[property]) { + continue; + } + const variableNames = plugin[property].entries.map( + ({ variableName }) => variableName, + ); + const isArray = property === "languages"; + properties[property] = + variableNames.length === 1 + ? variableNames + : `${isArray ? "[" : "{"}${variableNames.map((variableName) => `...${variableName},`).join("")}${isArray ? "]" : "}"}`; } - const variableNames = plugin[property].entries.map( - ({ variableName }) => variableName, - ); - const isArray = property === "languages"; - properties[property] = - variableNames.length === 1 - ? variableNames - : `${isArray ? "[" : "{"}${variableNames.map((variableName) => `...${variableName},`).join("")}${isArray ? "]" : "}"}`; - } - if (plugin.parserNames) { - properties.parserNames = JSON.stringify(plugin.parserNames); - } + if (plugin.parsers) { + properties.parsers = JSON.stringify(plugin.parsers); + } - if (plugin.printerNames) { - properties.printerNames = JSON.stringify(plugin.printerNames); - } + if (plugin.printers) { + properties.printers = JSON.stringify(plugin.printers); + } + + return outdent` + { + ${Object.entries(properties) + .map(([property, code]) => `${property}: ${code},`) + .join("\n")} + }, + `; + }); return outdent` - export const ${plugin.name} = /* @__PURE__ */ toLazyLoadPlugin({ - ${Object.entries(properties) - .map(([property, code]) => `${property}: ${code},`) - .join("\n")} - }); + export const plugins = /* @__PURE__ */ toLazyLoadPlugins( + ${codes.join("\n")} + ); `; } @@ -143,8 +151,8 @@ async function buildPlugins({ kind, file, pattern, getPluginName }) { const estreePlugin = { ...jsPlugin, name: "estree" }; delete estreePlugin.languages; delete estreePlugin.options; - delete estreePlugin.parserNames; - delete jsPlugin.printerNames; + delete estreePlugin.parsers; + delete jsPlugin.printers; plugins.push(estreePlugin); } @@ -155,15 +163,15 @@ async function buildPlugins({ kind, file, pattern, getPluginName }) { */ ${getImportStatements(plugins, file)} - import {toLazyLoadPlugin} from "./utilities.js"; + import {toLazyLoadPlugins} from "./utilities.js"; - - ${sortByUrl(plugins) - .map((plugin) => getPluginExportStatement(plugin, file)) - .join("\n")} + ${getExportStatements(plugins, file)} `; - const formatted = await format(code, { parser: "meriyah" }); + const formatted = await format(code, { + parser: "meriyah", + objectWrap: "collapse", + }); await fs.writeFile(file, formatted); } diff --git a/src/main/plugins/builtin-plugins/development-plugins.js b/src/main/plugins/builtin-plugins/development-plugins.js index c7b6f6e53..683c979d7 100644 --- a/src/main/plugins/builtin-plugins/development-plugins.js +++ b/src/main/plugins/builtin-plugins/development-plugins.js @@ -17,94 +17,96 @@ import markdownLanguages from "../../../language-markdown/languages.evaluate.js" import markdownOptions from "../../../language-markdown/options.js"; import yamlLanguages from "../../../language-yaml/languages.evaluate.js"; import yamlOptions from "../../../language-yaml/options.js"; -import { toLazyLoadPlugin } from "./utilities.js"; +import { toLazyLoadPlugins } from "./utilities.js"; -export const css = /* @__PURE__ */ toLazyLoadPlugin({ - name: "css", - importPlugin: () => import("../../../language-css/index.js"), - options: cssOptions, - languages: cssLanguages, - parserNames: ["css", "less", "scss"], - printerNames: ["postcss"], -}); -export const graphql = /* @__PURE__ */ toLazyLoadPlugin({ - name: "graphql", - importPlugin: () => import("../../../language-graphql/index.js"), - options: graphqlOptions, - languages: graphqlLanguages, - parserNames: ["graphql"], - printerNames: ["graphql"], -}); -export const handlebars = /* @__PURE__ */ toLazyLoadPlugin({ - name: "handlebars", - importPlugin: () => import("../../../language-handlebars/index.js"), - languages: handlebarsLanguages, - parserNames: ["glimmer"], - printerNames: ["glimmer"], -}); -export const html = /* @__PURE__ */ toLazyLoadPlugin({ - name: "html", - importPlugin: () => import("../../../language-html/index.js"), - options: htmlOptions, - languages: htmlLanguages, - parserNames: ["angular", "html", "lwc", "mjml", "vue"], - printerNames: ["html"], -}); -export const js = /* @__PURE__ */ toLazyLoadPlugin({ - name: "js", - importPlugin: () => import("../../../language-js/index.js"), - options: jsOptions, - languages: jsLanguages, - parserNames: [ - "__babel_estree", - "__js_expression", - "__ng_action", - "__ng_binding", - "__ng_directive", - "__ng_interpolation", - "__ts_expression", - "__vue_event_binding", - "__vue_expression", - "__vue_ts_event_binding", - "__vue_ts_expression", - "acorn", - "babel", - "babel-flow", - "babel-ts", - "espree", - "flow", - "hermes", - "meriyah", - "oxc", - "oxc-ts", - "typescript", - ], -}); -export const estree = /* @__PURE__ */ toLazyLoadPlugin({ - name: "estree", - importPlugin: () => import("../../../language-js/index.js"), - printerNames: ["estree"], -}); -export const json = /* @__PURE__ */ toLazyLoadPlugin({ - name: "json", - importPlugin: () => import("../../../language-json/index.js"), - languages: jsonLanguages, - parserNames: ["json", "json-stringify", "json5", "jsonc"], - printerNames: ["estree", "estree-json"], -}); -export const markdown = /* @__PURE__ */ toLazyLoadPlugin({ - name: "markdown", - importPlugin: () => import("../../../language-markdown/index.js"), - options: markdownOptions, - languages: markdownLanguages, - parserNames: ["markdown", "mdx", "remark"], - printerNames: ["mdast"], -}); -export const yaml = /* @__PURE__ */ toLazyLoadPlugin({ - name: "yaml", - importPlugin: () => import("../../../language-yaml/index.js"), - options: yamlOptions, - languages: yamlLanguages, - parserNames: ["yaml"], - printerNames: ["yaml"], -}); +export const plugins = /* @__PURE__ */ toLazyLoadPlugins( + { + name: "css", + load: () => import("../../../language-css/index.js"), + options: cssOptions, + languages: cssLanguages, + parsers: ["css", "less", "scss"], + printers: ["postcss"], + }, + { + name: "graphql", + load: () => import("../../../language-graphql/index.js"), + options: graphqlOptions, + languages: graphqlLanguages, + parsers: ["graphql"], + printers: ["graphql"], + }, + { + name: "handlebars", + load: () => import("../../../language-handlebars/index.js"), + languages: handlebarsLanguages, + parsers: ["glimmer"], + printers: ["glimmer"], + }, + { + name: "html", + load: () => import("../../../language-html/index.js"), + options: htmlOptions, + languages: htmlLanguages, + parsers: ["angular", "html", "lwc", "mjml", "vue"], + printers: ["html"], + }, + { + name: "js", + load: () => import("../../../language-js/index.js"), + options: jsOptions, + languages: jsLanguages, + parsers: [ + "__babel_estree", + "__js_expression", + "__ng_action", + "__ng_binding", + "__ng_directive", + "__ng_interpolation", + "__ts_expression", + "__vue_event_binding", + "__vue_expression", + "__vue_ts_event_binding", + "__vue_ts_expression", + "acorn", + "babel", + "babel-flow", + "babel-ts", + "espree", + "flow", + "hermes", + "meriyah", + "oxc", + "oxc-ts", + "typescript", + ], + }, + { + name: "estree", + load: () => import("../../../language-js/index.js"), + printers: ["estree"], + }, + { + name: "json", + load: () => import("../../../language-json/index.js"), + languages: jsonLanguages, + parsers: ["json", "json-stringify", "json5", "jsonc"], + printers: ["estree", "estree-json"], + }, + { + name: "markdown", + load: () => import("../../../language-markdown/index.js"), + options: markdownOptions, + languages: markdownLanguages, + parsers: ["markdown", "mdx", "remark"], + printers: ["mdast"], + }, + { + name: "yaml", + load: () => import("../../../language-yaml/index.js"), + options: yamlOptions, + languages: yamlLanguages, + parsers: ["yaml"], + printers: ["yaml"], + }, +); diff --git a/src/main/plugins/builtin-plugins/production-plugins.js b/src/main/plugins/builtin-plugins/production-plugins.js index f4dfc73a1..bd77dc8f8 100644 --- a/src/main/plugins/builtin-plugins/production-plugins.js +++ b/src/main/plugins/builtin-plugins/production-plugins.js @@ -17,109 +17,111 @@ import markdownLanguages from "../../../language-markdown/languages.evaluate.js" import markdownOptions from "../../../language-markdown/options.js"; import yamlLanguages from "../../../language-yaml/languages.evaluate.js"; import yamlOptions from "../../../language-yaml/options.js"; -import { toLazyLoadPlugin } from "./utilities.js"; +import { toLazyLoadPlugins } from "./utilities.js"; -export const acorn = /* @__PURE__ */ toLazyLoadPlugin({ - name: "acorn", - importPlugin: () => import("../../../plugins/acorn.js"), - parserNames: ["acorn", "espree"], -}); -export const angular = /* @__PURE__ */ toLazyLoadPlugin({ - name: "angular", - importPlugin: () => import("../../../plugins/angular.js"), - parserNames: [ - "__ng_action", - "__ng_binding", - "__ng_directive", - "__ng_interpolation", - ], -}); -export const babel = /* @__PURE__ */ toLazyLoadPlugin({ - name: "babel", - importPlugin: () => import("../../../plugins/babel.js"), - parserNames: [ - "__babel_estree", - "__js_expression", - "__ts_expression", - "__vue_event_binding", - "__vue_expression", - "__vue_ts_event_binding", - "__vue_ts_expression", - "babel", - "babel-flow", - "babel-ts", - "json", - "json-stringify", - "json5", - "jsonc", - ], -}); -export const estree = /* @__PURE__ */ toLazyLoadPlugin({ - name: "estree", - importPlugin: () => import("../../../plugins/estree.js"), - options: jsOptions, - languages: [...jsonLanguages, ...jsLanguages], - printerNames: ["estree", "estree-json"], -}); -export const flow = /* @__PURE__ */ toLazyLoadPlugin({ - name: "flow", - importPlugin: () => import("../../../plugins/flow.js"), - parserNames: ["flow"], -}); -export const glimmer = /* @__PURE__ */ toLazyLoadPlugin({ - name: "glimmer", - importPlugin: () => import("../../../plugins/glimmer.js"), - languages: handlebarsLanguages, - parserNames: ["glimmer"], - printerNames: ["glimmer"], -}); -export const graphql = /* @__PURE__ */ toLazyLoadPlugin({ - name: "graphql", - importPlugin: () => import("../../../plugins/graphql.js"), - options: graphqlOptions, - languages: graphqlLanguages, - parserNames: ["graphql"], - printerNames: ["graphql"], -}); -export const html = /* @__PURE__ */ toLazyLoadPlugin({ - name: "html", - importPlugin: () => import("../../../plugins/html.js"), - options: htmlOptions, - languages: htmlLanguages, - parserNames: ["angular", "html", "lwc", "mjml", "vue"], - printerNames: ["html"], -}); -export const markdown = /* @__PURE__ */ toLazyLoadPlugin({ - name: "markdown", - importPlugin: () => import("../../../plugins/markdown.js"), - options: markdownOptions, - languages: markdownLanguages, - parserNames: ["markdown", "mdx", "remark"], - printerNames: ["mdast"], -}); -export const meriyah = /* @__PURE__ */ toLazyLoadPlugin({ - name: "meriyah", - importPlugin: () => import("../../../plugins/meriyah.js"), - parserNames: ["meriyah"], -}); -export const postcss = /* @__PURE__ */ toLazyLoadPlugin({ - name: "postcss", - importPlugin: () => import("../../../plugins/postcss.js"), - options: cssOptions, - languages: cssLanguages, - parserNames: ["css", "less", "scss"], - printerNames: ["postcss"], -}); -export const typescript = /* @__PURE__ */ toLazyLoadPlugin({ - name: "typescript", - importPlugin: () => import("../../../plugins/typescript.js"), - parserNames: ["typescript"], -}); -export const yaml = /* @__PURE__ */ toLazyLoadPlugin({ - name: "yaml", - importPlugin: () => import("../../../plugins/yaml.js"), - options: yamlOptions, - languages: yamlLanguages, - parserNames: ["yaml"], - printerNames: ["yaml"], -}); +export const plugins = /* @__PURE__ */ toLazyLoadPlugins( + { + name: "acorn", + load: () => import("../../../plugins/acorn.js"), + parsers: ["acorn", "espree"], + }, + { + name: "angular", + load: () => import("../../../plugins/angular.js"), + parsers: [ + "__ng_action", + "__ng_binding", + "__ng_directive", + "__ng_interpolation", + ], + }, + { + name: "babel", + load: () => import("../../../plugins/babel.js"), + parsers: [ + "__babel_estree", + "__js_expression", + "__ts_expression", + "__vue_event_binding", + "__vue_expression", + "__vue_ts_event_binding", + "__vue_ts_expression", + "babel", + "babel-flow", + "babel-ts", + "json", + "json-stringify", + "json5", + "jsonc", + ], + }, + { + name: "estree", + load: () => import("../../../plugins/estree.js"), + options: jsOptions, + languages: [...jsonLanguages, ...jsLanguages], + printers: ["estree", "estree-json"], + }, + { + name: "flow", + load: () => import("../../../plugins/flow.js"), + parsers: ["flow"], + }, + { + name: "glimmer", + load: () => import("../../../plugins/glimmer.js"), + languages: handlebarsLanguages, + parsers: ["glimmer"], + printers: ["glimmer"], + }, + { + name: "graphql", + load: () => import("../../../plugins/graphql.js"), + options: graphqlOptions, + languages: graphqlLanguages, + parsers: ["graphql"], + printers: ["graphql"], + }, + { + name: "html", + load: () => import("../../../plugins/html.js"), + options: htmlOptions, + languages: htmlLanguages, + parsers: ["angular", "html", "lwc", "mjml", "vue"], + printers: ["html"], + }, + { + name: "markdown", + load: () => import("../../../plugins/markdown.js"), + options: markdownOptions, + languages: markdownLanguages, + parsers: ["markdown", "mdx", "remark"], + printers: ["mdast"], + }, + { + name: "meriyah", + load: () => import("../../../plugins/meriyah.js"), + parsers: ["meriyah"], + }, + { + name: "postcss", + load: () => import("../../../plugins/postcss.js"), + options: cssOptions, + languages: cssLanguages, + parsers: ["css", "less", "scss"], + printers: ["postcss"], + }, + { + name: "typescript", + load: () => import("../../../plugins/typescript.js"), + parsers: ["typescript"], + }, + { + name: "yaml", + load: () => import("../../../plugins/yaml.js"), + options: yamlOptions, + languages: yamlLanguages, + parsers: ["yaml"], + printers: ["yaml"], + }, +); diff --git a/src/main/plugins/builtin-plugins/utilities.js b/src/main/plugins/builtin-plugins/utilities.js index b43beb267..b89365bab 100644 --- a/src/main/plugins/builtin-plugins/utilities.js +++ b/src/main/plugins/builtin-plugins/utilities.js @@ -1,22 +1,24 @@ /** -@param {{ +@typedef {{ name: string, - importPlugin: () => Promise, + load: () => Promise, options?: any, languages?: any[], - parserNames?: string[], - printerNames?: string[], -}} param0 -@returns + parsers?: string[], + printers?: string[], +}} PluginInformation */ +/** +@param {PluginInformation} param0 +*/ function toLazyLoadPlugin({ name, - importPlugin, + load, options, languages, - parserNames, - printerNames, + parsers: parserNames, + printers: printerNames, }) { const plugin = { name }; if (options) { @@ -37,12 +39,12 @@ function toLazyLoadPlugin({ name, process.env.NODE_ENV === "production" ? async () => { - const loaded = await importPlugin(); + const loaded = await load(); Object.assign(plugin, loaded); return loaded[property][name]; } : async () => { - const loaded = await importPlugin(); + const loaded = await load(); // Hide `estree` printer in js plugin plugin[property] = loaded[property]; return loaded[property][name]; @@ -55,4 +57,11 @@ function toLazyLoadPlugin({ return plugin; } -export { toLazyLoadPlugin }; +/** +@param {...PluginInformation} plugins +*/ +function toLazyLoadPlugins(...plugins) { + return plugins.map((plugin) => toLazyLoadPlugin(plugin)); +} + +export { toLazyLoadPlugins }; diff --git a/src/main/plugins/load-builtin-plugins.js b/src/main/plugins/load-builtin-plugins.js index 021865fdc..9f7947372 100644 --- a/src/main/plugins/load-builtin-plugins.js +++ b/src/main/plugins/load-builtin-plugins.js @@ -1,15 +1,9 @@ const loadBuiltinPluginsWithoutCache = process.env.NODE_ENV === "production" - ? async function () { - return Object.values( - await import("./builtin-plugins/production-plugins.js"), - ); - } - : async function () { - return Object.values( - await import("./builtin-plugins/development-plugins.js"), - ); - }; + ? async () => + (await import("./builtin-plugins/production-plugins.js")).plugins + : async () => + (await import("./builtin-plugins/development-plugins.js")).plugins; let cache; function loadBuiltinPlugins() {