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.
92 lines
2.0 KiB
92 lines
2.0 KiB
"use strict"; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
exports.default = _default; |
|
|
|
var _t = require("@babel/types"); |
|
|
|
const { |
|
assignmentExpression, |
|
cloneNode, |
|
isIdentifier, |
|
isLiteral, |
|
isMemberExpression, |
|
isPrivateName, |
|
isPureish, |
|
isSuper, |
|
memberExpression, |
|
toComputedKey |
|
} = _t; |
|
|
|
function getObjRef(node, nodes, scope) { |
|
let ref; |
|
|
|
if (isIdentifier(node)) { |
|
if (scope.hasBinding(node.name)) { |
|
return node; |
|
} else { |
|
ref = node; |
|
} |
|
} else if (isMemberExpression(node)) { |
|
ref = node.object; |
|
|
|
if (isSuper(ref) || isIdentifier(ref) && scope.hasBinding(ref.name)) { |
|
return ref; |
|
} |
|
} else { |
|
throw new Error(`We can't explode this node type ${node["type"]}`); |
|
} |
|
|
|
const temp = scope.generateUidIdentifierBasedOnNode(ref); |
|
scope.push({ |
|
id: temp |
|
}); |
|
nodes.push(assignmentExpression("=", cloneNode(temp), cloneNode(ref))); |
|
return temp; |
|
} |
|
|
|
function getPropRef(node, nodes, scope) { |
|
const prop = node.property; |
|
|
|
if (isPrivateName(prop)) { |
|
throw new Error("We can't generate property ref for private name, please install `@babel/plugin-proposal-class-properties`"); |
|
} |
|
|
|
const key = toComputedKey(node, prop); |
|
if (isLiteral(key) && isPureish(key)) return key; |
|
const temp = scope.generateUidIdentifierBasedOnNode(prop); |
|
scope.push({ |
|
id: temp |
|
}); |
|
nodes.push(assignmentExpression("=", cloneNode(temp), cloneNode(prop))); |
|
return temp; |
|
} |
|
|
|
function _default(node, nodes, file, scope, allowedSingleIdent) { |
|
let obj; |
|
|
|
if (isIdentifier(node) && allowedSingleIdent) { |
|
obj = node; |
|
} else { |
|
obj = getObjRef(node, nodes, scope); |
|
} |
|
|
|
let ref, uid; |
|
|
|
if (isIdentifier(node)) { |
|
ref = cloneNode(node); |
|
uid = obj; |
|
} else { |
|
const prop = getPropRef(node, nodes, scope); |
|
const computed = node.computed || isLiteral(prop); |
|
uid = memberExpression(cloneNode(obj), cloneNode(prop), computed); |
|
ref = memberExpression(cloneNode(obj), cloneNode(prop), computed); |
|
} |
|
|
|
return { |
|
uid: uid, |
|
ref: ref |
|
}; |
|
} |