2023-08-15 09:20:40 +08:00
|
|
|
import path from "node:path";
|
2023-12-17 19:34:12 +00:00
|
|
|
import babelGenerator from "@babel/generator";
|
2022-09-18 17:50:14 +08:00
|
|
|
import { parse } from "@babel/parser";
|
|
|
|
|
import { traverseFast as traverse } from "@babel/types";
|
|
|
|
|
import { outdent } from "outdent";
|
2023-12-17 19:34:12 +00:00
|
|
|
import { PROJECT_ROOT, SOURCE_DIR } from "../../utils/index.js";
|
2022-11-15 18:26:06 +08:00
|
|
|
import allTransforms from "./transforms/index.js";
|
2022-09-18 17:50:14 +08:00
|
|
|
|
|
|
|
|
const generate = babelGenerator.default;
|
|
|
|
|
|
2022-09-26 22:54:17 +08:00
|
|
|
/* Doesn't work for dependencies, optional call, computed property, and spread arguments */
|
2022-09-18 17:50:14 +08:00
|
|
|
|
|
|
|
|
function transform(original, file) {
|
2023-08-15 09:20:40 +08:00
|
|
|
if (
|
2023-11-09 13:24:49 +08:00
|
|
|
!(
|
|
|
|
|
file.startsWith(SOURCE_DIR) ||
|
|
|
|
|
file.startsWith(path.join(PROJECT_ROOT, "node_modules/camelcase/")) ||
|
|
|
|
|
file.startsWith(
|
|
|
|
|
path.join(PROJECT_ROOT, "node_modules/angular-estree-parser/"),
|
2024-06-14 16:34:05 +08:00
|
|
|
) ||
|
2024-06-21 14:09:17 +08:00
|
|
|
file.startsWith(path.join(PROJECT_ROOT, "node_modules/jest-docblock/")) ||
|
2024-09-08 19:24:22 +08:00
|
|
|
file.startsWith(path.join(PROJECT_ROOT, "node_modules/espree/")) ||
|
|
|
|
|
file.startsWith(
|
|
|
|
|
path.join(
|
|
|
|
|
PROJECT_ROOT,
|
|
|
|
|
"node_modules/@typescript-eslint/typescript-estree/",
|
|
|
|
|
),
|
2024-09-18 19:48:57 +08:00
|
|
|
) ||
|
2025-01-30 20:12:29 +08:00
|
|
|
file.startsWith(path.join(PROJECT_ROOT, "node_modules/meriyah/")) ||
|
|
|
|
|
file.startsWith(path.join(PROJECT_ROOT, "node_modules/@glimmer/"))
|
2023-11-09 13:24:49 +08:00
|
|
|
)
|
2023-08-15 09:20:40 +08:00
|
|
|
) {
|
2022-11-15 18:26:06 +08:00
|
|
|
return original;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const transforms = allTransforms.filter(
|
|
|
|
|
(transform) => !transform.shouldSkip(original, file),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (transforms.length === 0) {
|
2022-09-18 17:50:14 +08:00
|
|
|
return original;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let changed = false;
|
2022-11-15 18:26:06 +08:00
|
|
|
const injected = new Set();
|
2022-11-06 19:55:24 +08:00
|
|
|
|
2024-10-31 00:05:28 +08:00
|
|
|
const ast = parse(original, {
|
|
|
|
|
filename: file,
|
|
|
|
|
sourceType: "module",
|
|
|
|
|
tokens: true,
|
|
|
|
|
createParenthesizedExpressions: true,
|
|
|
|
|
});
|
2022-09-18 17:50:14 +08:00
|
|
|
traverse(ast, (node) => {
|
2022-11-15 18:26:06 +08:00
|
|
|
for (const transform of transforms) {
|
|
|
|
|
if (!transform.test(node)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2022-09-18 17:50:14 +08:00
|
|
|
|
2022-11-15 18:26:06 +08:00
|
|
|
transform.transform(node);
|
2022-11-06 19:55:24 +08:00
|
|
|
|
2022-11-15 18:26:06 +08:00
|
|
|
if (transform.inject) {
|
|
|
|
|
injected.add(transform.inject);
|
|
|
|
|
}
|
2022-11-06 19:55:24 +08:00
|
|
|
|
2022-11-15 18:26:06 +08:00
|
|
|
changed ||= true;
|
|
|
|
|
}
|
2022-09-18 17:50:14 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!changed) {
|
|
|
|
|
return original;
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-31 00:05:28 +08:00
|
|
|
let { code } = generate(
|
|
|
|
|
ast,
|
|
|
|
|
{
|
|
|
|
|
sourceFileName: file,
|
|
|
|
|
experimental_preserveFormat: true,
|
|
|
|
|
retainLines: true,
|
|
|
|
|
comments: true,
|
|
|
|
|
jsescOption: null,
|
|
|
|
|
minified: false,
|
|
|
|
|
compact: false,
|
|
|
|
|
},
|
|
|
|
|
original,
|
|
|
|
|
);
|
2022-09-18 17:50:14 +08:00
|
|
|
|
2022-11-15 18:26:06 +08:00
|
|
|
if (injected.size > 0) {
|
2022-09-18 17:50:14 +08:00
|
|
|
code = outdent`
|
2022-11-15 18:26:06 +08:00
|
|
|
${[...injected].join("\n")}
|
2022-09-18 17:50:14 +08:00
|
|
|
|
|
|
|
|
${code}
|
|
|
|
|
`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return code;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default transform;
|