123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- var _helperPluginUtils = require("@babel/helper-plugin-utils");
- var _helperCreateClassFeaturesPlugin = require("@babel/helper-create-class-features-plugin");
- function generateUid(scope, denyList) {
- const name = "";
- let uid;
- let i = 1;
- do {
- uid = `_${name}`;
- if (i > 1) uid += i;
- i++;
- } while (denyList.has(uid));
- return uid;
- }
- function mapLast(arr, fn) {
- if (arr.length === 0) return arr;
- return [...arr.slice(0, -1), fn(arr[arr.length - 1])];
- }
- var _default = exports.default = (0, _helperPluginUtils.declare)(({
- types: t,
- template,
- traverse,
- assertVersion
- }) => {
- assertVersion("^7.12.0 || >8.0.0-alpha <8.0.0-beta");
- const rawNamedEvaluationVisitor = (0, _helperCreateClassFeaturesPlugin.buildNamedEvaluationVisitor)(path => {
- if (!path.isClassExpression()) return false;
- for (let i = path.node.body.body.length - 1; i >= 0; i--) {
- const el = path.node.body.body[i];
- if (t.isStaticBlock(el)) {
- return true;
- }
- if ((t.isClassProperty(el) || t.isClassPrivateProperty(el)) && el.static) {
- break;
- }
- }
- return false;
- }, (classPath, state, name) => {
- const nameNode = typeof name === "string" ? t.stringLiteral(name) : name;
- classPath.get("body").unshiftContainer("body", t.staticBlock([template.statement.ast`
- ${state.addHelper("setFunctionName")}(this, ${nameNode});
- `]));
- });
- if (!t.classAccessorProperty) {
- delete rawNamedEvaluationVisitor.ClassAccessorProperty;
- }
- const namedEvaluationVisitor = traverse.visitors.explode(rawNamedEvaluationVisitor);
- const maybeSequenceExpression = expressions => {
- if (expressions.length === 1) {
- return expressions[0];
- } else {
- return t.sequenceExpression(expressions);
- }
- };
- const blocksToExpressions = blocks => blocks.map(block => {
- const {
- body
- } = block;
- if (body.length === 1 && t.isExpressionStatement(body[0])) {
- return t.inheritsComments(t.inheritsComments(body[0].expression, body[0]), block);
- }
- return t.inheritsComments(template.expression.ast`(() => { ${body} })()`, block);
- });
- const prependToInitializer = (prop, expressions) => {
- prop.value = prop.value ? t.sequenceExpression([...expressions, prop.value]) : maybeSequenceExpression(mapLast(expressions, expr => t.unaryExpression("void", expr)));
- };
- return {
- name: "transform-class-static-block",
- manipulateOptions: (_, parser) => parser.plugins.push("classStaticBlock"),
- pre() {
- (0, _helperCreateClassFeaturesPlugin.enableFeature)(this.file, _helperCreateClassFeaturesPlugin.FEATURES.staticBlocks, false);
- },
- visitor: {
- ClassBody(classBody) {
- const {
- scope
- } = classBody;
- let parentPath = classBody.parentPath;
- if (parentPath.isClassExpression() && !parentPath.node.id) {
- do ({
- parentPath
- } = parentPath); while (parentPath && !namedEvaluationVisitor[parentPath.type] && !parentPath.isStatement());
- if (parentPath) {
- var _namedEvaluationVisit;
- (_namedEvaluationVisit = namedEvaluationVisitor[parentPath.type]) == null || _namedEvaluationVisit.enter.forEach(f => f.call(this, parentPath, this));
- }
- }
- const pendingStaticBlocks = [];
- let lastStaticProp = null;
- for (const path of classBody.get("body")) {
- if (path.isStaticBlock()) {
- pendingStaticBlocks.push(path.node);
- path.remove();
- } else if (path.isClassProperty({
- static: true
- }) || path.isClassPrivateProperty({
- static: true
- })) {
- lastStaticProp = path;
- if (pendingStaticBlocks.length > 0) {
- prependToInitializer(path.node, blocksToExpressions(pendingStaticBlocks));
- pendingStaticBlocks.length = 0;
- }
- }
- }
- if (pendingStaticBlocks.length > 0) {
- const tmp = scope.generateDeclaredUidIdentifier("staticBlock");
- let arrowBody;
- const needsCompletionValue = classBody.parentPath.isExpression();
- if (pendingStaticBlocks.length > 1 || pendingStaticBlocks[0].body.length === 1 && t.isExpressionStatement(pendingStaticBlocks[0].body[0])) {
- const expressions = blocksToExpressions(pendingStaticBlocks);
- if (needsCompletionValue) {
- expressions.push(t.thisExpression());
- }
- arrowBody = maybeSequenceExpression(expressions);
- } else {
- arrowBody = t.blockStatement(pendingStaticBlocks[0].body);
- if (needsCompletionValue) {
- arrowBody.body.push(t.returnStatement(t.thisExpression()));
- }
- }
- const init = template.expression.ast`${tmp} = () => ${arrowBody}`;
- if (lastStaticProp) {
- prependToInitializer(lastStaticProp.node, [init]);
- } else {
- const privateNames = new Set();
- for (const path of classBody.get("body")) {
- if (path.isPrivate()) {
- privateNames.add(path.get("key.id").node.name);
- }
- }
- const staticBlockPrivateId = generateUid(scope, privateNames);
- const staticBlockRef = t.privateName(t.identifier(staticBlockPrivateId));
- classBody.pushContainer("body", [t.classPrivateProperty(staticBlockRef, init, [], true)]);
- }
- const staticBlockClosureCall = t.callExpression(t.cloneNode(tmp), []);
- if (classBody.parentPath.isClassExpression()) {
- classBody.parentPath.replaceWith(t.sequenceExpression([classBody.parent, staticBlockClosureCall]));
- } else {
- classBody.parentPath.insertAfter(t.expressionStatement(staticBlockClosureCall));
- }
- }
- }
- }
- };
- });
- //# sourceMappingURL=index.js.map
|