@builder.io/mitosis
Version:
Write components once, run everywhere. Compiles to Vue, React, Solid, and Liquid. Import code from Figma and Builder.io
52 lines (51 loc) • 2.08 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.processClassComponentBinding = void 0;
const strip_state_and_props_refs_1 = require("../helpers/strip-state-and-props-refs");
const event_handlers_1 = require("./event-handlers");
/**
* We need to "emit" events those can be on multiple places, so we do it as post step
*/
const appendEmits = (str, { name }, { events, props, target, skipAppendEmit }) => {
let code = str;
if (events.length) {
for (const event of events) {
const eventWithoutOn = (0, event_handlers_1.getEventNameWithoutOn)(event);
if (props.includes(eventWithoutOn)) {
console.error(`
Component ${name} has an event ${event} that conflicts with prop ${eventWithoutOn} for target ${target}.
Please rename the prop or the event.
`);
}
if (!skipAppendEmit) {
code = code.replaceAll(`props.${event}(`, `props.${eventWithoutOn}.emit(`);
}
code = code.replaceAll(`props.${event}`, `props.${eventWithoutOn}`);
}
}
return code;
};
/**
* We use this for generators like stencil and angular
*/
const processClassComponentBinding = (json, code, processBindingOptions) => {
const { replaceWith = 'this.' } = processBindingOptions;
let resolvedCode = (0, strip_state_and_props_refs_1.stripStateAndPropsRefs)(appendEmits(code, json, processBindingOptions), {
replaceWith,
});
if (json.exports) {
// We need to use local exports with `this.` in stencil and angular
Object.entries(json.exports)
.filter(([, value]) => value.usedInLocal)
.forEach(([key]) => {
resolvedCode = resolvedCode.replaceAll(key, `${replaceWith}${key}`);
});
}
if (json.context.get) {
for (const key of Object.keys(json.context.get)) {
resolvedCode = resolvedCode.replaceAll(key, `${replaceWith}${key}`);
}
}
return resolvedCode;
};
exports.processClassComponentBinding = processClassComponentBinding;
;