Files
test-repo/scripts/build/transform/index.js
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

135 lines
3.1 KiB
JavaScript
Raw Normal View History

import path from "node:path";
2025-09-24 04:31:22 +02:00
import generate 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";
2025-12-01 07:25:25 +08:00
import { PROJECT_ROOT, SOURCE_DIR } from "../../utilities/index.js";
import * as transforms from "./transforms/index.js";
2022-09-18 17:50:14 +08:00
const packageTransforms = new Map([
/* spell-checker: disable */
[
transforms["method-replace-all"],
[
"@prettier/cli",
"@typescript-eslint/typescript-estree",
"camelcase",
"fast-ignore",
"fast-string-truncated-width",
"hashery",
"hermes-parser",
"jest-docblock",
"kasi",
"meriyah",
],
],
[
transforms["method-at"],
["@glimmer/syntax", "angular-estree-parser", "espree"],
],
[transforms["object-has-own"], ["@babel/parser", "meriyah"]],
[transforms["string-raw"], ["camelcase", "@angular/compiler"]],
[transforms["method-is-well-formed"], ["meriyah"]],
/* spell-checker: enable */
]);
2022-09-18 17:50:14 +08:00
const allTransforms = Object.values(transforms);
const sourceTransforms = allTransforms.filter(
(transform) => transform !== transforms["method-is-well-formed"],
);
const isPackageFile = (file, packageName) =>
file.startsWith(path.join(PROJECT_ROOT, `node_modules/${packageName}/`));
2025-11-03 04:54:10 +08:00
function getTransforms(original, file) {
if (file.startsWith(SOURCE_DIR)) {
return sourceTransforms;
}
const transforms = [];
for (const [transform, packageNames] of packageTransforms) {
if (packageNames.some((packageName) => isPackageFile(file, packageName))) {
transforms.push(transform);
}
}
return transforms;
2025-11-03 04:54:10 +08:00
}
function transform(original, file, buildOptions) {
const transforms = // For test
(
buildOptions.__isSyntaxTransformUnitTest
? allTransforms
: getTransforms(original, file, buildOptions)
).filter(
(transform) => !transform.shouldSkip(original, file, buildOptions),
);
if (transforms.length === 0) {
2022-09-18 17:50:14 +08:00
return original;
}
let changed = false;
const injected = new Set();
const ast = parse(original, {
filename: file,
sourceType: "module",
tokens: true,
createParenthesizedExpressions: true,
});
2022-09-18 17:50:14 +08:00
traverse(ast, (node) => {
for (const transform of transforms) {
2025-11-03 04:54:10 +08:00
if (!transform.test(node, file)) {
continue;
}
2022-09-18 17:50:14 +08:00
2025-10-27 23:24:02 +08:00
changed ||= true;
if (transform.inject) {
injected.add(transform.inject);
}
2025-11-03 04:54:10 +08:00
const replacement = transform.transform(node, file);
2025-10-27 23:24:02 +08:00
if (replacement && replacement !== node) {
replaceNode(node, replacement);
}
}
2022-09-18 17:50:14 +08:00
});
if (!changed) {
return original;
}
let { code } = generate(
ast,
{
sourceFileName: file,
comments: true,
jsescOption: null,
minified: false,
compact: false,
},
original,
);
2022-09-18 17:50:14 +08:00
if (injected.size > 0) {
2022-09-18 17:50:14 +08:00
code = outdent`
${[...injected].join("\n")}
2022-09-18 17:50:14 +08:00
${code}
`;
}
return code;
}
2025-10-27 23:24:02 +08:00
function replaceNode(original, object) {
for (const key of Object.keys(original)) {
delete original[key];
}
Object.assign(original, object);
}
2022-09-18 17:50:14 +08:00
export default transform;