UNPKG

@builder.io/mitosis

Version:

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

92 lines (91 loc) 3.81 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.mapRefs = void 0; const core_1 = require("@babel/core"); const legacy_1 = __importDefault(require("neotraverse/legacy")); const babel_transform_1 = require("./babel-transform"); const get_refs_1 = require("./get-refs"); const is_mitosis_node_1 = require("./is-mitosis-node"); const patterns_1 = require("./patterns"); const replaceRefsInString = (code, refs, mapper, type) => { return (0, babel_transform_1.babelTransformExpression)(code, { Identifier(path) { var _a; const name = path.node.name; const isRef = refs.includes(name); if (isRef && !((_a = path.node.extra) === null || _a === void 0 ? void 0 : _a.replaced)) { path.replaceWith(core_1.types.identifier(mapper(name, { type, path, }))); path.node.extra = { replaced: true }; } }, }); }; const mapRefs = (component, mapper) => { const refSet = (0, get_refs_1.getRefs)(component); // grab refs not used for bindings Object.keys(component.refs).forEach((ref) => refSet.add(ref)); const refs = Array.from(refSet); for (const key of Object.keys(component.state)) { const stateVal = component.state[key]; if (typeof (stateVal === null || stateVal === void 0 ? void 0 : stateVal.code) === 'string') { const value = stateVal.code; switch (stateVal.type) { case 'method': case 'getter': const isGet = stateVal.type === 'getter'; const isSet = Boolean(value.match(patterns_1.SETTER)); component.state[key] = { ...stateVal, code: replaceRefsInString(value.replace(/^(get |set )?/, 'function '), refs, mapper).replace(/^function /, isGet ? 'get ' : isSet ? 'set ' : ''), }; break; case 'function': component.state[key] = { ...stateVal, code: replaceRefsInString(value, refs, mapper), type: 'function', }; break; default: break; } } } (0, legacy_1.default)(component).forEach(function (item) { if ((0, is_mitosis_node_1.isMitosisNode)(item)) { for (const key of Object.keys(item.bindings)) { const value = item.bindings[key]; if (typeof value === 'object' && key !== 'ref') { item.bindings[key] = { ...value, code: replaceRefsInString(value.code, refs, mapper, 'bindings'), }; } } } }); for (const key of Object.keys(component.hooks)) { const _hook = component.hooks[key]; const hooks = Array.isArray(_hook) ? _hook : [_hook]; for (const hook of hooks) { if (!hook) continue; if (hook.code) { hook.code = replaceRefsInString(hook.code, refs, mapper); } if (hook.deps) { hook.deps = replaceRefsInString(hook.deps, refs, mapper, 'hooks-deps'); } if (hook === null || hook === void 0 ? void 0 : hook.depsArray) { hook.depsArray = hook.depsArray.map((dep) => replaceRefsInString(dep, refs, mapper, 'hooks-deps-array')); } } } }; exports.mapRefs = mapRefs;