summaryrefslogtreecommitdiff
path: root/node_modules/@babel/helpers/scripts/generate-helpers.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2024-08-30 17:21:18 +0800
committerlittleblack111 <littleblack11111@gmail.com>2024-08-30 17:21:18 +0800
commitefbc2ffe6a1ee5ec38a4396305561d6515d0943e (patch)
tree2b4c94f18f2c792dfda813050755d5c0273fae22 /node_modules/@babel/helpers/scripts/generate-helpers.js
parent43acceb75957c880a5ba5a31aae221394a36d5f6 (diff)
node fixes, updates
Diffstat (limited to 'node_modules/@babel/helpers/scripts/generate-helpers.js')
-rw-r--r--node_modules/@babel/helpers/scripts/generate-helpers.js108
1 files changed, 93 insertions, 15 deletions
diff --git a/node_modules/@babel/helpers/scripts/generate-helpers.js b/node_modules/@babel/helpers/scripts/generate-helpers.js
index 45182c95..9eeb95a2 100644
--- a/node_modules/@babel/helpers/scripts/generate-helpers.js
+++ b/node_modules/@babel/helpers/scripts/generate-helpers.js
@@ -3,13 +3,17 @@ import fs from "fs";
import { join } from "path";
import { URL, fileURLToPath } from "url";
import { minify } from "terser";
-import { transformSync } from "@babel/core";
-import presetTypescript from "@babel/preset-typescript";
-import { gzipSync } from "zlib";
+import { babel, presetTypescript } from "$repo-utils/babel-top-level";
import { IS_BABEL_8 } from "$repo-utils";
+import { gzipSync } from "zlib";
+
+import {
+ getHelperMetadata,
+ stringifyMetadata,
+} from "./build-helper-metadata.js";
const HELPERS_FOLDER = new URL("../src/helpers", import.meta.url);
-const IGNORED_FILES = new Set(["package.json"]);
+const IGNORED_FILES = new Set(["package.json", "tsconfig.json"]);
export default async function generateHelpers() {
let output = `/*
@@ -18,17 +22,37 @@ export default async function generateHelpers() {
*/
import template from "@babel/template";
+import type * as t from "@babel/types";
+
+interface Helper {
+ minVersion: string;
+ ast: () => t.Program;
+ metadata: HelperMetadata;
+}
+
+export interface HelperMetadata {
+ globals: string[];
+ locals: { [name: string]: string[] };
+ dependencies: { [name: string]: string[] };
+ exportBindingAssignments: string[];
+ exportName: string;
+}
-function helper(minVersion: string, source: string) {
+function helper(minVersion: string, source: string, metadata: HelperMetadata): Helper {
return Object.freeze({
minVersion,
ast: () => template.program.ast(source, { preserveComments: true }),
+ metadata,
})
}
-export default Object.freeze({
+export { helpers as default };
+const helpers: Record<string, Helper> = {
+ __proto__: null,
`;
+ let babel7extraOutput = "";
+
for (const file of (await fs.promises.readdir(HELPERS_FOLDER)).sort()) {
if (IGNORED_FILES.has(file)) continue;
if (file.startsWith(".")) continue; // ignore e.g. vim swap files
@@ -52,14 +76,11 @@ export default Object.freeze({
}
const { minVersion } = minVersionMatch.groups;
- if (IS_BABEL_8() && code.includes("@onlyBabel7")) {
- continue;
- }
-
+ const onlyBabel7 = code.includes("@onlyBabel7");
const mangleFns = code.includes("@mangleFns");
const noMangleFns = [];
- code = transformSync(code, {
+ code = babel.transformSync(code, {
configFile: false,
babelrc: false,
filename: filePath,
@@ -76,7 +97,41 @@ export default Object.freeze({
/**
* @type {import("@babel/core").PluginObj}
*/
- {
+ ({ types: t }) => ({
+ // These pre/post hooks are needed because the TS transform is,
+ // when building in the old Babel e2e test, removing the
+ // `export { OverloadYield as default }` in the OverloadYield helper.
+ // TODO: Remove in Babel 8.
+ pre(file) {
+ if (!process.env.IS_BABEL_OLD_E2E) return;
+ file.metadata.exportName = null;
+ file.path.traverse({
+ ExportSpecifier(path) {
+ if (path.node.exported.name === "default") {
+ file.metadata.exportName = path.node.local.name;
+ }
+ },
+ });
+ },
+ post(file) {
+ if (!process.env.IS_BABEL_OLD_E2E) return;
+ if (!file.metadata.exportName) return;
+ file.path.traverse({
+ ExportNamedDeclaration(path) {
+ if (
+ !path.node.declaration &&
+ path.node.specifiers.length === 0
+ ) {
+ path.node.specifiers.push(
+ t.exportSpecifier(
+ t.identifier(file.metadata.exportName),
+ t.identifier("default")
+ )
+ );
+ }
+ },
+ });
+ },
visitor: {
ImportDeclaration(path) {
const source = path.node.source;
@@ -96,7 +151,7 @@ export default Object.freeze({
}
},
},
- },
+ }),
],
}).code;
code = (
@@ -115,15 +170,38 @@ export default Object.freeze({
})
).code;
- output += `\
+ let metadata;
+ // eslint-disable-next-line prefer-const
+ [code, metadata] = getHelperMetadata(babel, code, helperName);
+
+ const helperStr = `\
// size: ${code.length}, gzip size: ${gzipSync(code).length}
${JSON.stringify(helperName)}: helper(
${JSON.stringify(minVersion)},
${JSON.stringify(code)},
+ ${stringifyMetadata(metadata)}
),
`;
+
+ if (onlyBabel7) {
+ if (!IS_BABEL_8()) babel7extraOutput += helperStr;
+ } else {
+ output += helperStr;
+ }
+ }
+
+ output += "};";
+
+ if (babel7extraOutput) {
+ output += `
+
+if (!process.env.BABEL_8_BREAKING) {
+ Object.assign(helpers, {
+ ${babel7extraOutput}
+ });
+}
+`;
}
- output += "});";
return output;
}