woby
Version:
A high-performance framework with fine-grained observable/signal-based reactivity for building rich applications.
105 lines (104 loc) • 3.15 kB
JavaScript
;
const wrap_clone_element = require("./wrap_clone_element-C4XivH3I.cjs");
const setters = require("./setters-CyO2VUT6.cjs");
const emptyTags = [
"area",
"base",
"br",
"col",
"command",
"embed",
"hr",
"img",
"input",
"keygen",
"link",
"meta",
"param",
"source",
"track",
"wbr"
];
let esc = (str) => String(str).replace(/[&<>"']/g, (s) => `&${map[s]};`);
let map = { "&": "amp", "<": "lt", ">": "gt", '"': "quot", "'": "apos" };
let setInnerHTMLAttr = "dangerouslySetInnerHTML";
let DOMAttributeNames = {
className: "class",
htmlFor: "for"
};
let sanitized = {};
function h(name, attrs) {
let stack = [], s = "";
attrs = attrs || {};
for (let i = arguments.length; i-- > 2; ) {
stack.push(arguments[i]);
}
if (typeof name === "function") {
attrs.children = stack.reverse();
return name(attrs);
}
if (name) {
s += "<" + name;
if (attrs) for (let i in attrs) {
if (attrs[i] !== false && attrs[i] != null && i !== setInnerHTMLAttr) {
s += ` ${DOMAttributeNames[i] ? DOMAttributeNames[i] : esc(i)}="${esc(attrs[i])}"`;
}
}
s += ">";
}
if (emptyTags.indexOf(name) === -1) {
if (attrs[setInnerHTMLAttr]) {
s += attrs[setInnerHTMLAttr].__html;
} else while (stack.length) {
let child = stack.pop();
if (child) {
if (child.pop) {
for (let i = child.length; i--; ) stack.push(child[i]);
} else {
s += sanitized[child] === true ? child : esc(child);
}
}
}
s += name ? `</${name}>` : "";
}
sanitized[s] = true;
return s;
}
const createHTMLNode = h;
const createSVGNode = h;
const createElement = (component, _props, ..._children) => {
const children = _children.length > 1 ? _children : _children.length > 0 ? _children[0] : void 0;
const hasChildren = !setters.isVoidChild(children);
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 ? { ..._props, children } : _props;
return wrap_clone_element.wrapElement(() => {
return setters.untrack(() => component.call(component, props));
});
} else if (setters.isString(component)) {
const isSVG = setters.isSVGElement(component);
const createNode = isSVG ? createSVGNode : createHTMLNode;
const stack = new Error();
return wrap_clone_element.wrapElement(() => {
const p = { children: null };
setters.untrack(() => {
if (_props) {
setters.setProps(p, _props, stack);
}
if (hasChildren) {
setters.setProps(p, children2, stack);
}
});
const { children: children2, ...pp } = p;
return createNode(component, pp, ...[children2].flat(Infinity));
});
} else if (setters.isNode(component)) {
return wrap_clone_element.wrapElement(() => component);
} else {
throw new Error("Invalid component");
}
};
exports.createElement = createElement;
//# sourceMappingURL=create_element.ssr-B13vRb_y.cjs.map