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.

121 lines
5.5 KiB

6 months ago
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformIdentifier = void 0;
const compiler_core_1 = require("@vue/compiler-core");
const utils_1 = require("./utils");
const transformClass_1 = require("./transformClass");
const transformStyle_1 = require("./transformStyle");
const runtimeHelpers_1 = require("../runtimeHelpers");
const transformSlot_1 = require("./transformSlot");
const vSlot_1 = require("./vSlot");
const transformRef_1 = require("./transformRef");
const transformComponent_1 = require("./transformComponent");
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
const shared_1 = require("@vue/shared");
const transformIdentifier = (node, context) => {
return function transformIdentifier() {
if (node.type === 5 /* NodeTypes.INTERPOLATION */) {
const content = node.content;
let isFilter = false;
if (content.type === 8 /* NodeTypes.COMPOUND_EXPRESSION */) {
const firstChild = content.children[0];
isFilter =
!(0, shared_1.isString)(firstChild) &&
!(0, shared_1.isSymbol)(firstChild) &&
firstChild.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&
context.filters.includes(firstChild.content);
}
if (!isFilter) {
node.content = (0, utils_1.rewriteExpression)((0, compiler_core_1.createCompoundExpression)([
`${context.helperString(runtimeHelpers_1.TO_DISPLAY_STRING)}(`,
content,
`)`,
]), context);
}
}
else if ((0, compiler_core_1.isSlotOutlet)(node)) {
(0, transformSlot_1.rewriteSlot)(node, context);
}
else if (node.type === 1 /* NodeTypes.ELEMENT */) {
let hasClassBinding = false;
let hasStyleBinding = false;
(0, transformRef_1.rewriteRef)(node, context);
if ((0, uni_cli_shared_1.isUserComponent)(node, context)) {
(0, transformComponent_1.rewriteBinding)(node, context);
}
const { props } = node;
const virtualHost = !!(context.miniProgram.component?.mergeVirtualHostAttributes &&
context.rootNode === node);
for (let i = 0; i < props.length; i++) {
const dir = props[i];
if (dir.type === 7 /* NodeTypes.DIRECTIVE */) {
const arg = dir.arg;
if (arg) {
// TODO 指令暂不不支持动态参数,v-bind:[arg] v-on:[event]
if (!(arg.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ && arg.isStatic)) {
// v-slot:[slotName] 支持
if (dir.name === 'slot') {
(0, vSlot_1.rewriteVSlot)(dir, context);
}
else {
props.splice(i, 1);
i--;
continue;
}
}
}
const exp = dir.exp;
if (exp) {
if (isBuiltIn(dir)) {
// noop
}
else if ((0, transformClass_1.isClassBinding)(dir)) {
hasClassBinding = true;
(0, transformClass_1.rewriteClass)(i, dir, props, virtualHost, context);
}
else if ((0, transformStyle_1.isStyleBinding)(dir)) {
hasStyleBinding = true;
(0, transformStyle_1.rewriteStyle)(i, dir, props, virtualHost, context);
}
else if ((0, transformComponent_1.isPropsBinding)(dir)) {
(0, transformComponent_1.rewritePropsBinding)(dir, node, context);
}
else {
dir.exp = (0, utils_1.rewriteExpression)(exp, context);
}
}
}
}
if (virtualHost) {
if (!hasClassBinding) {
hasClassBinding = true;
props.push((0, transformClass_1.createVirtualHostClass)(props, context));
}
if (!hasStyleBinding) {
hasStyleBinding = true;
props.push((0, transformStyle_1.createVirtualHostStyle)(props, context));
}
}
if (hasClassBinding) {
const staticClassIndex = (0, transformClass_1.findStaticClassIndex)(props);
if (staticClassIndex > -1) {
props.splice(staticClassIndex, 1);
}
}
if (hasStyleBinding) {
const staticStyleIndex = (0, transformStyle_1.findStaticStyleIndex)(props);
if (staticStyleIndex > -1) {
props.splice(staticStyleIndex, 1);
}
}
}
};
};
exports.transformIdentifier = transformIdentifier;
const builtInProps = [utils_1.ATTR_VUE_SLOTS];
function isBuiltIn({ arg, exp }) {
return (arg?.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&
builtInProps.includes(arg.content) &&
exp?.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */);
}