@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
JavaScript
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;
;