woby
Version:
A high-performance framework with fine-grained observable/signal-based reactivity for building rich applications.
110 lines (109 loc) • 4.23 kB
JavaScript
;
const setters = require("./setters-CMvyty0B.cjs");
const SYMBOL_STACK = Symbol("STACK");
const wrapElement = (element) => {
element[setters.SYMBOL_UNTRACKED_UNWRAPPED] = true;
if (setters.DEBUGGER.test)
element[SYMBOL_STACK] = new setters.Stack("createElement");
return element;
};
const Fragment = ({ children, ...props }) => {
return children;
};
const wrapCloneElement = (target, component, props) => {
target[setters.SYMBOL_CLONE] = { Component: component, props };
return target;
};
const wrapJsx = (props) => {
if (props[setters.SYMBOL_JSX]) return props;
props[setters.SYMBOL_JSX] = true;
return props;
};
const unwrapJsx = (props) => {
delete props[setters.SYMBOL_JSX];
return props;
};
const isJsx = (props) => !!props[setters.SYMBOL_JSX];
function getProps(component, props) {
var _a;
if (typeof component === "string") {
const ce = customElements.get(component);
if (!!ce) {
const defaultPropsFn = (_a = ce.__component__) == null ? void 0 : _a[setters.SYMBOL_DEFAULT];
if (!defaultPropsFn) {
console.error(`Component ${component} is missing default props. Please use the 'defaults' helper function to provide default props.`);
}
if (!props) props = defaultPropsFn() ?? {};
}
}
if (!props) props = {};
return wrapJsx(props);
}
function jsx(component, props, ...children) {
if (typeof children === "string")
return wrapCloneElement(createElement(component, props ?? {}, children), component, props);
props = getProps(component, props);
if (typeof children === "string")
Object.assign(props, { children });
return wrapCloneElement(createElement(component, props, props == null ? void 0 : props.key), component, props);
}
const jsxDEV = (component, props, key, isStatic, source, self) => {
props = getProps(component, props);
if (key)
Object.assign(props, { key });
return wrapCloneElement(createElement(component, props), component, props);
};
const getMeta = (target) => target == null ? void 0 : target[setters.SYMBOL_CLONE];
const jsxs = jsx;
const createElement = (component, _props, ..._children) => {
const children = _children.length > 1 ? _children : _children.length > 0 ? _children[0] : void 0;
const hasChildren = !setters.isVoidChild(children);
const { ...rest } = _props ?? {};
if (hasChildren && setters.isObject(_props) && "children" in _props) {
throw new Error('Providing "children" both as a prop and as rest arguments is forbidden');
}
if (setters.isFunction(component)) {
const props = hasChildren ? Object.assign(_props, { children }) : _props;
return wrapElement(() => {
return setters.untrack(() => setters.isClass(component) ? new component(props) : component.call(component, props));
});
} else if (setters.isString(component)) {
const isSVG = setters.isSVGElement(component);
const isComment = component === "comment";
const isText = component === "text";
const createNode = isSVG ? setters.createSVGNode : setters.createHTMLNode;
const create = isComment ? () => setters.createComment(_props.data ?? "") : isText ? () => setters.createText(_props.data ?? "") : createNode;
return wrapElement(() => {
const ce = customElements.get(component);
const child = !!ce ? new ce(_props) : create(component);
if (isSVG) child["isSVG"] = true;
const stack = new setters.Stack();
setters.untrack(() => {
if (_props) {
if (!!ce) {
const { children: children2, ...np } = _props;
setters.setProps(child, np, stack);
} else
setters.setProps(child, _props, stack);
}
});
return child;
});
} else if (setters.isNode(component)) {
return wrapElement(() => component);
} else {
throw new Error("Invalid component");
}
};
exports.Fragment = Fragment;
exports.SYMBOL_STACK = SYMBOL_STACK;
exports.createElement = createElement;
exports.getMeta = getMeta;
exports.isJsx = isJsx;
exports.jsx = jsx;
exports.jsxDEV = jsxDEV;
exports.jsxs = jsxs;
exports.unwrapJsx = unwrapJsx;
exports.wrapCloneElement = wrapCloneElement;
exports.wrapElement = wrapElement;
//# sourceMappingURL=create_element-BUG6undN.cjs.map