Spaces:
Sleeping
Sleeping
; | |
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"); | |
{ | |
var 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 = exports.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, obj, prop) { | |
const type = prop.kind; | |
const key = !prop.computed && _core.types.isIdentifier(prop.key) ? _core.types.stringLiteral(prop.key.name) : prop.key; | |
const fn = getValue(prop); | |
{ | |
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 pushComputedPropsLoose(info) { | |
const { | |
computedProps, | |
state, | |
initPropExpression, | |
objId, | |
body | |
} = info; | |
for (const prop of computedProps) { | |
if (_core.types.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set")) { | |
if (computedProps.length === 1) { | |
return buildDefineAccessor(state, initPropExpression, prop); | |
} else { | |
body.push(_core.types.expressionStatement(buildDefineAccessor(state, _core.types.cloneNode(objId), prop))); | |
} | |
} else { | |
pushAssign(_core.types.cloneNode(objId), prop, body); | |
} | |
} | |
} | |
function pushComputedPropsSpec(info) { | |
const { | |
objId, | |
body, | |
computedProps, | |
state | |
} = info; | |
const CHUNK_LENGTH_CAP = 10; | |
let currentChunk = null; | |
const computedPropsChunks = []; | |
for (const prop of computedProps) { | |
if (!currentChunk || currentChunk.length === CHUNK_LENGTH_CAP) { | |
currentChunk = []; | |
computedPropsChunks.push(currentChunk); | |
} | |
currentChunk.push(prop); | |
} | |
for (const chunk of computedPropsChunks) { | |
const single = computedPropsChunks.length === 1; | |
let node = single ? info.initPropExpression : _core.types.cloneNode(objId); | |
for (const prop of chunk) { | |
if (_core.types.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set")) { | |
node = buildDefineAccessor(info.state, node, prop); | |
} else { | |
node = _core.types.callExpression(state.addHelper("defineProperty"), [node, _core.types.toComputedKey(prop), getValue(prop)]); | |
} | |
} | |
if (single) return node; | |
body.push(_core.types.expressionStatement(node)); | |
} | |
} | |
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 { | |
if (setComputedProperties) { | |
body.push(_core.types.expressionStatement(_core.types.cloneNode(objId))); | |
} | |
path.replaceWithMultiple(body); | |
} | |
} | |
} | |
} | |
}; | |
}); | |
//# sourceMappingURL=index.js.map | |