138 lines
6.1 KiB
JavaScript
138 lines
6.1 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.removeAttribute = exports.isStaticLiteral = exports.isReferencedByIds = exports.findReferencedScope = exports.rewriteExpression = exports.rewriteExpressionWithoutProperty = exports.parseExprWithRewriteClass = exports.parseExprWithRewrite = exports.rewirteWithHelper = exports.rewriteSpreadElement = exports.VIRTUAL_HOST_CLASS = exports.VIRTUAL_HOST_STYLE = exports.SCOPED_SLOT_IDENTIFIER = exports.ATTR_COM_TYPE = exports.ATTR_VUE_REF_IN_FOR = exports.ATTR_VUE_REF = exports.ATTR_VUE_PROPS = exports.ATTR_VUE_SLOTS = exports.ATTR_VUE_ID = void 0;
|
||
|
const types_1 = require("@babel/types");
|
||
|
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
|
||
|
const compiler_core_1 = require("@vue/compiler-core");
|
||
|
const estree_walker_1 = require("estree-walker");
|
||
|
const ast_1 = require("../ast");
|
||
|
const codegen_1 = require("../codegen");
|
||
|
const transform_1 = require("../transform");
|
||
|
// v-i,v-s 不能在 quickapp-webview 中使用,估计是内部处理成了指令之类的
|
||
|
exports.ATTR_VUE_ID = 'u-i';
|
||
|
exports.ATTR_VUE_SLOTS = 'u-s';
|
||
|
exports.ATTR_VUE_PROPS = 'u-p';
|
||
|
exports.ATTR_VUE_REF = 'u-' + uni_cli_shared_1.VUE_REF;
|
||
|
exports.ATTR_VUE_REF_IN_FOR = 'u-' + uni_cli_shared_1.VUE_REF_IN_FOR;
|
||
|
exports.ATTR_COM_TYPE = 'u-t';
|
||
|
exports.SCOPED_SLOT_IDENTIFIER = '__SCOPED_SLOT__';
|
||
|
exports.VIRTUAL_HOST_STYLE = 'virtualHostStyle';
|
||
|
exports.VIRTUAL_HOST_CLASS = 'virtualHostClass';
|
||
|
function rewriteSpreadElement(name, expr, loc, context) {
|
||
|
return rewirteWithHelper(name, expr.argument, loc, context);
|
||
|
}
|
||
|
exports.rewriteSpreadElement = rewriteSpreadElement;
|
||
|
function rewirteWithHelper(name, expr, loc, context) {
|
||
|
return parseExprWithRewrite(context.helperString(name) + '(' + (0, codegen_1.genBabelExpr)(expr) + ')', loc, context);
|
||
|
}
|
||
|
exports.rewirteWithHelper = rewirteWithHelper;
|
||
|
function parseExprWithRewrite(code, loc, context, node) {
|
||
|
return (0, ast_1.parseExpr)(rewriteExpression((0, compiler_core_1.createSimpleExpression)(code, false, loc), context, node), context);
|
||
|
}
|
||
|
exports.parseExprWithRewrite = parseExprWithRewrite;
|
||
|
function parseExprWithRewriteClass(code, loc, context, node) {
|
||
|
// a?1:0
|
||
|
return (0, ast_1.parseExpr)(rewriteExpression((0, compiler_core_1.createSimpleExpression)(code, false, loc), context, !(0, ast_1.isUndefined)(node)
|
||
|
? (0, types_1.conditionalExpression)(node, (0, types_1.numericLiteral)(1), (0, types_1.stringLiteral)(''))
|
||
|
: node), context);
|
||
|
}
|
||
|
exports.parseExprWithRewriteClass = parseExprWithRewriteClass;
|
||
|
function rewriteExpressionWithoutProperty(node, context, babelNode, scope = context.currentScope) {
|
||
|
return rewriteExpression(node, context, babelNode, scope, {
|
||
|
property: false,
|
||
|
ignoreLiteral: false,
|
||
|
});
|
||
|
}
|
||
|
exports.rewriteExpressionWithoutProperty = rewriteExpressionWithoutProperty;
|
||
|
function rewriteExpression(node, context, babelNode, scope = context.currentScope, { property, ignoreLiteral, referencedScope, } = {
|
||
|
property: true,
|
||
|
ignoreLiteral: false,
|
||
|
}) {
|
||
|
if (node.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ && node.isStatic) {
|
||
|
return node;
|
||
|
}
|
||
|
if (!babelNode) {
|
||
|
const code = (0, codegen_1.genExpr)(node);
|
||
|
babelNode = (0, ast_1.parseExpr)(code, context, node);
|
||
|
if (!babelNode) {
|
||
|
return (0, compiler_core_1.createSimpleExpression)(code);
|
||
|
}
|
||
|
}
|
||
|
if (!ignoreLiteral && isStaticLiteral(babelNode)) {
|
||
|
return node;
|
||
|
}
|
||
|
if ((0, ast_1.isUndefined)(babelNode)) {
|
||
|
return (0, compiler_core_1.createSimpleExpression)('undefined', false, node.loc);
|
||
|
}
|
||
|
// wxs 等表达式
|
||
|
if (context.filters?.length) {
|
||
|
if (isReferencedByIds(babelNode, context.filters)) {
|
||
|
return (0, compiler_core_1.createSimpleExpression)((0, codegen_1.genExpr)(node), false, node.loc);
|
||
|
}
|
||
|
}
|
||
|
referencedScope = referencedScope || findReferencedScope(babelNode, scope);
|
||
|
const id = referencedScope.id.next();
|
||
|
if (property) {
|
||
|
referencedScope.properties.push((0, types_1.objectProperty)((0, types_1.identifier)(id), babelNode));
|
||
|
}
|
||
|
// 在 v-for 中包含的 v-if 块,所有变量需要补充当前 v-for value 前缀
|
||
|
if ((0, transform_1.isVIfScope)(referencedScope)) {
|
||
|
if ((0, transform_1.isVForScope)(referencedScope.parentScope)) {
|
||
|
return (0, compiler_core_1.createSimpleExpression)(referencedScope.parentScope.valueAlias + '.' + id);
|
||
|
}
|
||
|
return (0, compiler_core_1.createSimpleExpression)(id);
|
||
|
}
|
||
|
else if ((0, transform_1.isVForScope)(referencedScope)) {
|
||
|
return (0, compiler_core_1.createSimpleExpression)(referencedScope.valueAlias + '.' + id);
|
||
|
}
|
||
|
return (0, compiler_core_1.createSimpleExpression)(id);
|
||
|
}
|
||
|
exports.rewriteExpression = rewriteExpression;
|
||
|
function findReferencedScope(node, scope, findReferenced = true) {
|
||
|
if ((0, transform_1.isVIfScope)(scope)) {
|
||
|
return scope;
|
||
|
}
|
||
|
else if ((0, transform_1.isVForScope)(scope)) {
|
||
|
if (!findReferenced) {
|
||
|
return scope;
|
||
|
}
|
||
|
if (isReferencedByIds(node, scope.locals)) {
|
||
|
return scope;
|
||
|
}
|
||
|
return findReferencedScope(node, scope.parent, findReferenced);
|
||
|
}
|
||
|
return scope;
|
||
|
}
|
||
|
exports.findReferencedScope = findReferencedScope;
|
||
|
function isReferencedByIds(node, knownIds) {
|
||
|
let referenced = false;
|
||
|
(0, estree_walker_1.walk)(node, {
|
||
|
enter(node, parent) {
|
||
|
if (referenced) {
|
||
|
return this.skip();
|
||
|
}
|
||
|
if (!(0, types_1.isIdentifier)(node)) {
|
||
|
return;
|
||
|
}
|
||
|
if (knownIds.includes(node.name) &&
|
||
|
(!parent || (0, types_1.isReferenced)(node, parent))) {
|
||
|
referenced = true;
|
||
|
return this.skip();
|
||
|
}
|
||
|
},
|
||
|
});
|
||
|
return referenced;
|
||
|
}
|
||
|
exports.isReferencedByIds = isReferencedByIds;
|
||
|
function isStaticLiteral(value) {
|
||
|
return (0, types_1.isLiteral)(value) && !(0, types_1.isTemplateLiteral)(value);
|
||
|
}
|
||
|
exports.isStaticLiteral = isStaticLiteral;
|
||
|
function removeAttribute(node, name) {
|
||
|
const index = node.props.findIndex((prop) => prop.name === name);
|
||
|
if (index > -1) {
|
||
|
node.props.splice(index, 1);
|
||
|
}
|
||
|
}
|
||
|
exports.removeAttribute = removeAttribute;
|