UNPKG

5.64 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7var _core = require("@babel/core");
8var _helperPluginUtils = require("@babel/helper-plugin-utils");
9var _template = require("@babel/template");
10{
11 var DefineAccessorHelper = _template.default.expression.ast`
12 function (type, obj, key, fn) {
13 var desc = { configurable: true, enumerable: true };
14 desc[type] = fn;
15 return Object.defineProperty(obj, key, desc);
16 }
17 `;
18 DefineAccessorHelper._compact = true;
19}
20var _default = (0, _helperPluginUtils.declare)((api, options) => {
21 var _api$assumption;
22 api.assertVersion(7);
23 const setComputedProperties = (_api$assumption = api.assumption("setComputedProperties")) != null ? _api$assumption : options.loose;
24 const pushComputedProps = setComputedProperties ? pushComputedPropsLoose : pushComputedPropsSpec;
25 function buildDefineAccessor(state, type, obj, key, fn) {
26 {
27 let helper;
28 if (state.availableHelper("defineAccessor")) {
29 helper = state.addHelper("defineAccessor");
30 } else {
31 const file = state.file;
32 helper = file.get("fallbackDefineAccessorHelper");
33 if (!helper) {
34 const id = file.scope.generateUidIdentifier("defineAccessor");
35 file.scope.push({
36 id,
37 init: DefineAccessorHelper
38 });
39 file.set("fallbackDefineAccessorHelper", helper = id);
40 }
41 helper = _core.types.cloneNode(helper);
42 }
43 return _core.types.callExpression(helper, [_core.types.stringLiteral(type), obj, key, fn]);
44 }
45 }
46 function getValue(prop) {
47 if (_core.types.isObjectProperty(prop)) {
48 return prop.value;
49 } else if (_core.types.isObjectMethod(prop)) {
50 return _core.types.functionExpression(null, prop.params, prop.body, prop.generator, prop.async);
51 }
52 }
53 function pushAssign(objId, prop, body) {
54 body.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.memberExpression(_core.types.cloneNode(objId), prop.key, prop.computed || _core.types.isLiteral(prop.key)), getValue(prop))));
55 }
56 function pushAccessorDefine({
57 body,
58 computedProps,
59 initPropExpression,
60 objId,
61 state
62 }, prop) {
63 const kind = prop.kind;
64 const key = !prop.computed && _core.types.isIdentifier(prop.key) ? _core.types.stringLiteral(prop.key.name) : prop.key;
65 const value = getValue(prop);
66 if (computedProps.length === 1) {
67 return buildDefineAccessor(state, kind, initPropExpression, key, value);
68 } else {
69 body.push(_core.types.expressionStatement(buildDefineAccessor(state, kind, _core.types.cloneNode(objId), key, value)));
70 }
71 }
72 function pushComputedPropsLoose(info) {
73 for (const prop of info.computedProps) {
74 if (_core.types.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set")) {
75 const single = pushAccessorDefine(info, prop);
76 if (single) return single;
77 } else {
78 pushAssign(_core.types.cloneNode(info.objId), prop, info.body);
79 }
80 }
81 }
82 function pushComputedPropsSpec(info) {
83 const {
84 objId,
85 body,
86 computedProps,
87 state
88 } = info;
89 for (const prop of computedProps) {
90 const key = _core.types.toComputedKey(prop);
91 if (_core.types.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set")) {
92 const single = pushAccessorDefine(info, prop);
93 if (single) return single;
94 } else {
95 const value = getValue(prop);
96 if (computedProps.length === 1) {
97 return _core.types.callExpression(state.addHelper("defineProperty"), [info.initPropExpression, key, value]);
98 } else {
99 body.push(_core.types.expressionStatement(_core.types.callExpression(state.addHelper("defineProperty"), [_core.types.cloneNode(objId), key, value])));
100 }
101 }
102 }
103 }
104 return {
105 name: "transform-computed-properties",
106 visitor: {
107 ObjectExpression: {
108 exit(path, state) {
109 const {
110 node,
111 parent,
112 scope
113 } = path;
114 let hasComputed = false;
115 for (const prop of node.properties) {
116 hasComputed = prop.computed === true;
117 if (hasComputed) break;
118 }
119 if (!hasComputed) return;
120 const initProps = [];
121 const computedProps = [];
122 let foundComputed = false;
123 for (const prop of node.properties) {
124 if (_core.types.isSpreadElement(prop)) {
125 continue;
126 }
127 if (prop.computed) {
128 foundComputed = true;
129 }
130 if (foundComputed) {
131 computedProps.push(prop);
132 } else {
133 initProps.push(prop);
134 }
135 }
136 const objId = scope.generateUidIdentifierBasedOnNode(parent);
137 const initPropExpression = _core.types.objectExpression(initProps);
138 const body = [];
139 body.push(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(objId, initPropExpression)]));
140 const single = pushComputedProps({
141 scope,
142 objId,
143 body,
144 computedProps,
145 initPropExpression,
146 state
147 });
148 if (single) {
149 path.replaceWith(single);
150 } else {
151 body.push(_core.types.expressionStatement(_core.types.cloneNode(objId)));
152 path.replaceWithMultiple(body);
153 }
154 }
155 }
156 }
157 };
158});
159exports.default = _default;
160
161//# sourceMappingURL=index.js.map