Minor tweak to builtin plugins generation (#18566)

This commit is contained in:
fisker Cheung authored and GitHub committed 2026-01-05 05:20:16 +08:00
1 parent ae0e00df55
commit d696f899ac
5 files changed
+270 -255

No files matched your search

+46 -38
View File
@@ -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);
}
@@ -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"],
},
);
@@ -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"],
},
);
+21 -12
View File
@@ -1,22 +1,24 @@
/**
@param {{
@typedef {{
name: string,
importPlugin: () => Promise<any>,
load: () => Promise<any>,
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 };
+4 -10
View File
@@ -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() {