98 lines
3.4 KiB
JavaScript
98 lines
3.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.STRINGIFY_JSON = exports.ATTR_DATASET_EVENT_OPTS = exports.addEventOpts = exports.createCustomEventExpr = exports.createTransformOn = exports.defaultMatch = void 0;
|
|
const uni_shared_1 = require("@dcloudio/uni-shared");
|
|
const compiler_core_1 = require("@vue/compiler-core");
|
|
const utils_1 = require("../utils");
|
|
function defaultMatch(name, node, context) {
|
|
return isCustomEvent(name) && (0, utils_1.isUserComponent)(node, context);
|
|
}
|
|
exports.defaultMatch = defaultMatch;
|
|
/**
|
|
* 百度、快手小程序的自定义组件,不支持动态事件绑定,故转换为静态事件 + dataset
|
|
* @param baseTransformOn
|
|
* @returns
|
|
*/
|
|
function createTransformOn(baseTransformOn, { match } = {
|
|
match: defaultMatch,
|
|
}) {
|
|
return (dir, node, context, augmentor) => {
|
|
const res = baseTransformOn(dir, node, context, augmentor);
|
|
const { name, arg, exp } = dir;
|
|
if (name !== 'on' || !arg || !exp || !(0, compiler_core_1.isStaticExp)(arg)) {
|
|
return res;
|
|
}
|
|
if (!match(arg.content, node, context)) {
|
|
return res;
|
|
}
|
|
const value = res.props[0].value;
|
|
res.props[0].value = createCustomEventExpr();
|
|
addEventOpts(node.tagType === 1 /* ElementTypes.COMPONENT */
|
|
? (0, uni_shared_1.customizeEvent)(arg.content)
|
|
: arg.content, value, node, context);
|
|
return res;
|
|
};
|
|
}
|
|
exports.createTransformOn = createTransformOn;
|
|
function createCustomEventExpr() {
|
|
return (0, compiler_core_1.createSimpleExpression)('__e', true);
|
|
}
|
|
exports.createCustomEventExpr = createCustomEventExpr;
|
|
function addEventOpts(event, value, node, context) {
|
|
const attrName = node.tagType === 1 /* ElementTypes.COMPONENT */
|
|
? ATTR_DATA_EVENT_OPTS
|
|
: exports.ATTR_DATASET_EVENT_OPTS;
|
|
const opts = (0, compiler_core_1.findProp)(node, attrName, true);
|
|
if (!opts) {
|
|
node.props.push(createDataEventOptsProp(attrName, event, value, context));
|
|
}
|
|
else {
|
|
const children = opts.exp.children;
|
|
children.splice(children.length - 2, 0, createDataEventOptsProperty(event, value));
|
|
}
|
|
}
|
|
exports.addEventOpts = addEventOpts;
|
|
const ATTR_DATA_EVENT_OPTS = 'eO';
|
|
exports.ATTR_DATASET_EVENT_OPTS = 'data-e-o';
|
|
function createDataEventOptsProperty(event, exp) {
|
|
return (0, compiler_core_1.createCompoundExpression)([`'${event}'`, ': ', exp, ',']);
|
|
}
|
|
exports.STRINGIFY_JSON = Symbol(`stringifyJson`);
|
|
function createDataEventOptsProp(name, event, exp, context) {
|
|
const children = [];
|
|
const stringify = name === ATTR_DATA_EVENT_OPTS;
|
|
if (stringify) {
|
|
children.push(context.helperString(exports.STRINGIFY_JSON) + '(');
|
|
}
|
|
children.push('{', createDataEventOptsProperty(event, exp), '}');
|
|
if (stringify) {
|
|
children.push(')');
|
|
}
|
|
return {
|
|
type: 7 /* NodeTypes.DIRECTIVE */,
|
|
name: 'bind',
|
|
loc: compiler_core_1.locStub,
|
|
modifiers: [],
|
|
arg: (0, compiler_core_1.createSimpleExpression)(name, true),
|
|
exp: (0, compiler_core_1.createCompoundExpression)(children),
|
|
};
|
|
}
|
|
const builtInEvents = [
|
|
'__l',
|
|
'tap',
|
|
'longtap',
|
|
'longpress',
|
|
'touchstart',
|
|
'touchmove',
|
|
'touchcancel',
|
|
'touchend',
|
|
'touchforcechange',
|
|
'transitionend',
|
|
'animationstart',
|
|
'animationiteration',
|
|
'animationend',
|
|
];
|
|
function isCustomEvent(name) {
|
|
return !builtInEvents.includes(name);
|
|
}
|