UNPKG

@builder.io/mitosis

Version:

Write components once, run everywhere. Compiles to Vue, React, Solid, and Liquid. Import code from Figma and Builder.io

53 lines (52 loc) 2.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processOnEventHooksPlugin = exports.getOnEventHooksForNode = exports.getOnEventHandlerName = void 0; const bindings_1 = require("./bindings"); const capitalize_1 = require("./capitalize"); const traverse_nodes_1 = require("./traverse-nodes"); const checkIsEventHandlerNode = (node, hook) => { var _a; return hook.refName === ((_a = node.bindings.ref) === null || _a === void 0 ? void 0 : _a.code); }; const getBindingName = (hook) => { return `on${(0, capitalize_1.capitalize)(hook.eventName)}`; }; const getOnEventHandlerName = (hook) => { return `${hook.refName}_${getBindingName(hook)}`; }; exports.getOnEventHandlerName = getOnEventHandlerName; const getOnEventHooksForNode = ({ node, component, }) => { return component.hooks.onEvent.filter((hook) => checkIsEventHandlerNode(node, hook)); }; exports.getOnEventHooksForNode = getOnEventHooksForNode; /** * Adds event handlers from `onEvent` hooks to the appropriate node's bindings. * Only works with frameworks that support custom events in their templates. */ const processOnEventHooksPlugin = (args = {}) => () => ({ json: { pre: (component) => { const { setBindings = true, includeRootEvents = true } = args; (0, traverse_nodes_1.traverseNodes)(component, (node) => { (0, exports.getOnEventHooksForNode)({ node, component }).forEach((hook) => { if (!includeRootEvents && hook.isRoot) return; const handlerName = getBindingName(hook); const fnName = (0, exports.getOnEventHandlerName)(hook); component.state[fnName] = { code: `${fnName}(${hook.eventArgName}) { ${hook.code} }`, type: 'method', }; if (setBindings) { node.bindings[handlerName] = (0, bindings_1.createSingleBinding)({ code: `state.${fnName}(${hook.eventArgName})`, arguments: [hook.eventArgName], bindingType: 'function', }); } }); }); }, }, }); exports.processOnEventHooksPlugin = processOnEventHooksPlugin;