You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					159 lines
				
				5.4 KiB
			
		
		
			
		
	
	
					159 lines
				
				5.4 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = void 0; | ||
|  | var _core = require("@babel/core"); | ||
|  | var _helperPluginUtils = require("@babel/helper-plugin-utils"); | ||
|  | var _template = require("@babel/template"); | ||
|  | const DefineAccessorHelper = _template.default.expression.ast`
 | ||
|  | function (type, obj, key, fn) { | ||
|  |   var desc = { configurable: true, enumerable: true }; | ||
|  |   desc[type] = fn; | ||
|  |   return Object.defineProperty(obj, key, desc); | ||
|  | }`;
 | ||
|  | DefineAccessorHelper._compact = true; | ||
|  | var _default = (0, _helperPluginUtils.declare)((api, options) => { | ||
|  |   var _api$assumption; | ||
|  |   api.assertVersion(7); | ||
|  |   const setComputedProperties = (_api$assumption = api.assumption("setComputedProperties")) != null ? _api$assumption : options.loose; | ||
|  |   const pushComputedProps = setComputedProperties ? pushComputedPropsLoose : pushComputedPropsSpec; | ||
|  |   function buildDefineAccessor(state, type, obj, key, fn) { | ||
|  |     let helper; | ||
|  |     if (state.availableHelper("defineAccessor")) { | ||
|  |       helper = state.addHelper("defineAccessor"); | ||
|  |     } else { | ||
|  |       const file = state.file; | ||
|  |       helper = file.get("fallbackDefineAccessorHelper"); | ||
|  |       if (!helper) { | ||
|  |         const id = file.scope.generateUidIdentifier("defineAccessor"); | ||
|  |         file.scope.push({ | ||
|  |           id, | ||
|  |           init: DefineAccessorHelper | ||
|  |         }); | ||
|  |         file.set("fallbackDefineAccessorHelper", helper = id); | ||
|  |       } | ||
|  |       helper = _core.types.cloneNode(helper); | ||
|  |     } | ||
|  |     return _core.types.callExpression(helper, [_core.types.stringLiteral(type), obj, key, fn]); | ||
|  |   } | ||
|  | 
 | ||
|  |   function getValue(prop) { | ||
|  |     if (_core.types.isObjectProperty(prop)) { | ||
|  |       return prop.value; | ||
|  |     } else if (_core.types.isObjectMethod(prop)) { | ||
|  |       return _core.types.functionExpression(null, prop.params, prop.body, prop.generator, prop.async); | ||
|  |     } | ||
|  |   } | ||
|  |   function pushAssign(objId, prop, body) { | ||
|  |     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)))); | ||
|  |   } | ||
|  |   function pushAccessorDefine({ | ||
|  |     body, | ||
|  |     computedProps, | ||
|  |     initPropExpression, | ||
|  |     objId, | ||
|  |     state | ||
|  |   }, prop) { | ||
|  |     const kind = prop.kind; | ||
|  |     const key = !prop.computed && _core.types.isIdentifier(prop.key) ? _core.types.stringLiteral(prop.key.name) : prop.key; | ||
|  |     const value = getValue(prop); | ||
|  |     if (computedProps.length === 1) { | ||
|  |       return buildDefineAccessor(state, kind, initPropExpression, key, value); | ||
|  |     } else { | ||
|  |       body.push(_core.types.expressionStatement(buildDefineAccessor(state, kind, _core.types.cloneNode(objId), key, value))); | ||
|  |     } | ||
|  |   } | ||
|  |   function pushComputedPropsLoose(info) { | ||
|  |     for (const prop of info.computedProps) { | ||
|  |       if (_core.types.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set")) { | ||
|  |         const single = pushAccessorDefine(info, prop); | ||
|  |         if (single) return single; | ||
|  |       } else { | ||
|  |         pushAssign(_core.types.cloneNode(info.objId), prop, info.body); | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  |   function pushComputedPropsSpec(info) { | ||
|  |     const { | ||
|  |       objId, | ||
|  |       body, | ||
|  |       computedProps, | ||
|  |       state | ||
|  |     } = info; | ||
|  |     for (const prop of computedProps) { | ||
|  |       const key = _core.types.toComputedKey(prop); | ||
|  |       if (_core.types.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set")) { | ||
|  |         const single = pushAccessorDefine(info, prop); | ||
|  |         if (single) return single; | ||
|  |       } else { | ||
|  |         const value = getValue(prop); | ||
|  |         if (computedProps.length === 1) { | ||
|  |           return _core.types.callExpression(state.addHelper("defineProperty"), [info.initPropExpression, key, value]); | ||
|  |         } else { | ||
|  |           body.push(_core.types.expressionStatement(_core.types.callExpression(state.addHelper("defineProperty"), [_core.types.cloneNode(objId), key, value]))); | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  |   return { | ||
|  |     name: "transform-computed-properties", | ||
|  |     visitor: { | ||
|  |       ObjectExpression: { | ||
|  |         exit(path, state) { | ||
|  |           const { | ||
|  |             node, | ||
|  |             parent, | ||
|  |             scope | ||
|  |           } = path; | ||
|  |           let hasComputed = false; | ||
|  |           for (const prop of node.properties) { | ||
|  |             hasComputed = prop.computed === true; | ||
|  |             if (hasComputed) break; | ||
|  |           } | ||
|  |           if (!hasComputed) return; | ||
|  | 
 | ||
|  |           const initProps = []; | ||
|  |           const computedProps = []; | ||
|  |           let foundComputed = false; | ||
|  |           for (const prop of node.properties) { | ||
|  |             if (_core.types.isSpreadElement(prop)) { | ||
|  |               continue; | ||
|  |             } | ||
|  |             if (prop.computed) { | ||
|  |               foundComputed = true; | ||
|  |             } | ||
|  |             if (foundComputed) { | ||
|  |               computedProps.push(prop); | ||
|  |             } else { | ||
|  |               initProps.push(prop); | ||
|  |             } | ||
|  |           } | ||
|  |           const objId = scope.generateUidIdentifierBasedOnNode(parent); | ||
|  |           const initPropExpression = _core.types.objectExpression(initProps); | ||
|  |           const body = []; | ||
|  |           body.push(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(objId, initPropExpression)])); | ||
|  |           const single = pushComputedProps({ | ||
|  |             scope, | ||
|  |             objId, | ||
|  |             body, | ||
|  |             computedProps, | ||
|  |             initPropExpression, | ||
|  |             state | ||
|  |           }); | ||
|  |           if (single) { | ||
|  |             path.replaceWith(single); | ||
|  |           } else { | ||
|  |             body.push(_core.types.expressionStatement(_core.types.cloneNode(objId))); | ||
|  |             path.replaceWithMultiple(body); | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }; | ||
|  | }); | ||
|  | exports.default = _default; | ||
|  | 
 | ||
|  | //# sourceMappingURL=index.js.map
 |