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.
125 lines
4.2 KiB
125 lines
4.2 KiB
"use strict"; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
exports.rewriteRef = void 0; |
|
const types_1 = require("@babel/types"); |
|
const compiler_core_1 = require("@vue/compiler-core"); |
|
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared"); |
|
const utils_1 = require("./utils"); |
|
const runtimeHelpers_1 = require("../runtimeHelpers"); |
|
const codegen_1 = require("../codegen"); |
|
const ast_1 = require("../ast"); |
|
function rewriteRef(node, context) { |
|
const vueIdProp = (0, compiler_core_1.findProp)(node, utils_1.ATTR_VUE_ID); |
|
if (!vueIdProp) { |
|
return; |
|
} |
|
const refProp = (0, compiler_core_1.findProp)(node, 'u-' + uni_cli_shared_1.VUE_REF) || (0, compiler_core_1.findProp)(node, 'u-' + uni_cli_shared_1.VUE_REF_IN_FOR); |
|
if (!refProp) { |
|
return; |
|
} |
|
if ((0, compiler_core_1.findProp)(node, 'ref')) { |
|
// 支付宝小程序 |
|
const code = parseAlipayRefCode(refProp, context); |
|
if (code && context.inline && !(0, uni_cli_shared_1.isDirectiveNode)(refProp)) { |
|
refProp.value.content = code; |
|
const refPropIndex = node.props.findIndex((prop) => prop === refProp); |
|
node.props.splice(refPropIndex, 1, (0, uni_cli_shared_1.createBindDirectiveNode)(refProp.name, code)); |
|
} |
|
} |
|
else { |
|
rewriteRefProp(refProp, vueIdProp, context); |
|
} |
|
} |
|
exports.rewriteRef = rewriteRef; |
|
function parseRef(prop, context) { |
|
let expr; |
|
let refKey = ''; |
|
const isDir = (0, uni_cli_shared_1.isDirectiveNode)(prop); |
|
if (isDir) { |
|
if (prop.exp) { |
|
expr = (0, ast_1.parseExpr)(prop.exp, context, prop.exp); |
|
} |
|
} |
|
else { |
|
const { value } = prop; |
|
if (value && value.content) { |
|
if (context.inline && context.bindingMetadata[value.content]) { |
|
expr = (0, types_1.identifier)(value.content); |
|
refKey = value.content; |
|
} |
|
else { |
|
expr = (0, types_1.stringLiteral)(value.content); |
|
} |
|
} |
|
} |
|
return { expr, refKey }; |
|
} |
|
function parseRefCode(prop, context) { |
|
const { expr, refKey } = parseRef(prop, context); |
|
if (!expr) { |
|
return { code: '', refKey }; |
|
} |
|
return { code: (0, codegen_1.genBabelExpr)(expr), refKey }; |
|
} |
|
function rewriteRefProp(prop, vueIdProp, context) { |
|
let id = ''; |
|
if ((0, uni_cli_shared_1.isDirectiveNode)(vueIdProp)) { |
|
const vueIdExpr = (0, ast_1.parseExpr)(vueIdProp.exp, context, vueIdProp.exp); |
|
if (vueIdExpr) { |
|
id = (0, codegen_1.genBabelExpr)(vueIdExpr); |
|
} |
|
} |
|
else { |
|
id = `'${vueIdProp.value.content}'`; |
|
} |
|
if (!id) { |
|
return; |
|
} |
|
const { code, refKey } = parseRefCode(prop, context); |
|
const opts = Object.create(null); |
|
if (refKey) { |
|
opts.k = refKey; |
|
} |
|
if (context.inVFor) { |
|
opts.f = 1; |
|
} |
|
(0, utils_1.parseExprWithRewrite)(context.helperString(runtimeHelpers_1.SET_REF) + |
|
'(' + |
|
code + |
|
', ' + |
|
id + |
|
(Object.keys(opts).length ? ', ' + JSON.stringify(opts) : '') + |
|
')', prop.loc, context); |
|
} |
|
function parseAlipayRefCode(prop, context) { |
|
let expr; |
|
const isDir = (0, uni_cli_shared_1.isDirectiveNode)(prop); |
|
if (isDir) { |
|
if (prop.exp) { |
|
expr = (0, ast_1.parseExpr)(prop.exp, context, prop.exp); |
|
} |
|
} |
|
else { |
|
if (prop.value?.content) { |
|
expr = context.inline |
|
? processInlineRef(prop, context) |
|
: (0, types_1.stringLiteral)(prop.value.content); |
|
} |
|
} |
|
if (!expr) { |
|
return; |
|
} |
|
return (0, codegen_1.genBabelExpr)(expr); |
|
} |
|
function processInlineRef(prop, context) { |
|
const properties = []; |
|
const { refKey } = parseRef(prop, context); |
|
properties.push((0, types_1.objectProperty)((0, types_1.identifier)('r'), (0, types_1.identifier)(prop.value.content))); |
|
if (refKey) { |
|
properties.push((0, types_1.objectProperty)((0, types_1.identifier)('k'), (0, types_1.stringLiteral)(refKey))); |
|
} |
|
if (context.inVFor) { |
|
properties.push((0, types_1.objectProperty)((0, types_1.identifier)('f'), (0, types_1.numericLiteral)(1))); |
|
} |
|
return (0, types_1.arrowFunctionExpression)([], (0, types_1.objectExpression)(properties)); |
|
}
|
|
|