UNPKG

woby

Version:

A high-performance framework with fine-grained observable/signal-based reactivity for building rich applications.

110 lines (109 loc) 4.23 kB
"use strict"; 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