nuclo 0.1.72 → 0.1.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"Element.d.ts","sourceRoot":"","sources":["../../src/polyfill/Element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAwBnC,qBAAa,YAAa,SAAQ,SAAS;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAM;IACvB,SAAS,EAAE,YAAY,CAAC;IACxB,WAAW,EAAE,MAAM,CAAM;IACzB,OAAO,CAAC,UAAU,CAAc;IAChC,UAAU,EAAE,OAAO,CAAQ;IAC3B,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAM;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,UAAU,CAAkC;IAEpD,IAAI,SAAS,IAAI,MAAM,CAGtB;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,EAE1B;IAED,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,gBAAgB;gBAsCZ,OAAO,EAAE,MAAM;IA+I3B,WAAW,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAQxC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAS/C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOnC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInC,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC;IAcvE,WAAW,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAWxC,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC;IAc5D,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAO7D,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAOhE,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAkBpC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAe/C,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,kBAAkB;IAmB1B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;IAiBvD,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,qBAAqB;CAa9B"}
1
+ {"version":3,"file":"Element.d.ts","sourceRoot":"","sources":["../../src/polyfill/Element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAwBnC,qBAAa,YAAa,SAAQ,SAAS;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAM;IACvB,SAAS,EAAE,YAAY,CAAC;IACxB,WAAW,EAAE,MAAM,CAAM;IACzB,OAAO,CAAC,UAAU,CAAc;IAChC,UAAU,EAAE,OAAO,CAAQ;IAC3B,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAM;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,UAAU,CAAkC;IAEpD,IAAI,SAAS,IAAI,MAAM,CAGtB;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,EAE1B;IAED,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,gBAAgB;gBAsCZ,OAAO,EAAE,MAAM;IA+I3B,WAAW,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAYxC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAS/C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOnC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInC,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC;IAqBvE,WAAW,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAWxC,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC;IAc5D,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAO7D,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAOhE,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAkBpC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAe/C,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,kBAAkB;IAmB1B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;IAiBvD,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,qBAAqB;CAa9B"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Server-Side Rendering (SSR) entry point for Nuclo
3
+ *
4
+ * This module provides utilities for rendering Nuclo components to HTML strings
5
+ * in Node.js environments for server-side rendering.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { renderToString } from 'nuclo/ssr';
10
+ * import '../polyfill'; // Load polyfills for Node.js
11
+ * import { div } from 'nuclo';
12
+ *
13
+ * const html = renderToString(div("Hello, World!"));
14
+ * console.log(html); // '<div>Hello, World!</div>'
15
+ * ```
16
+ */
17
+ export { renderToString, renderManyToString, renderToStringWithContainer } from './renderToString';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssr/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";function t(t){const e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};return t.replace(/[&<>"']/g,t=>e[t]||t)}function e(e,n){if(null==n||!1===n)return"";if(!0===n)return" "+e;if("style"===e&&"object"==typeof n){const e=Object.entries(n).map(([t,e])=>`${function(t){let e="";for(let n=0;t.length>n;n++){const r=t.charCodeAt(n);65>r||r>90?e+=t[n]:(n>0&&(e+="-"),e+=String.fromCharCode(r+32))}return e}(t)}:${e}`).join(";");return e?` style="${t(e)}"`:""}return` ${e}="${t(n+"")}"`}const n=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function r(t){if("childNodes"in t){const e=t.childNodes;if(e&&(Array.isArray(e)||void 0!==e.length))return e}if("children"in t){const e=t.children;if(e&&Array.isArray(e))return e}return[]}function i(o){if(3===o.nodeType)return t(o.textContent||"");if(8===o.nodeType)return`\x3c!--${o.textContent||""}--\x3e`;if(1===o.nodeType){const t=o,s=t.tagName.toLowerCase(),a=function(t){let n="";if("attributes"in t&&t.attributes instanceof Map){const r=t;r.id&&!t.attributes.has("id")&&(n+=e("id",r.id)),r.className&&!t.attributes.has("class")&&(n+=e("class",r.className));for(const[r,i]of t.attributes)n+=e(r,i);return n}if(t.attributes&&t.attributes.length)for(let r=0;t.attributes.length>r;r++){const i=t.attributes[r];i&&i.name&&(n+=e(i.name,i.value))}return n}(t);if(n.has(s))return`<${s}${a} />`;let c="";const u=r(t);if(u&&u.length>0)for(let t=0;u.length>t;t++){const e=u[t];e&&(c+=i(e))}return`<${s}${a}>${c}</${s}>`}if(11===o.nodeType){let t="";const e=r(o);if(e&&e.length>0)for(let n=0;e.length>n;n++){const r=e[n];r&&(t+=i(r))}return t}return""}function o(t){if(!t)return"";if("function"==typeof t)try{const e=globalThis.document?.createElement("div");if(!e)throw Error("Document is not available. Make sure polyfills are loaded.");const n=t(e,0);return n&&"object"==typeof n&&"nodeType"in n?i(n):""}catch(t){return""}return"nodeType"in t?i(t):""}exports.renderManyToString=function(t){return t.map(t=>o(t))},exports.renderToString=o,exports.renderToStringWithContainer=function(t,n="div",r={}){const i=o(t);return`<${n}${Object.entries(r).map(([t,n])=>e(t,n)).join("")}>${i}</${n}>`};
2
+ //# sourceMappingURL=nuclo.ssr.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuclo.ssr.cjs","sources":["../../src/utility/stringUtils.ts","../../src/ssr/renderToString.ts"],"sourcesContent":["/**\n * String utility functions\n */\n\n/**\n * Converts camelCase to kebab-case (optimized for performance)\n * Uses direct character code manipulation for maximum speed\n * @example camelToKebab('backgroundColor') => 'background-color'\n */\nexport function camelToKebab(str: string): string {\n let result = '';\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n // A-Z is 65-90, a-z is 97-122 (difference of 32)\n if (code >= 65 && code <= 90) {\n if (i > 0) result += '-';\n result += String.fromCharCode(code + 32);\n } else {\n result += str[i];\n }\n }\n return result;\n}\n\n/**\n * Escapes HTML special characters to prevent XSS\n */\nexport function escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#039;'\n };\n return text.replace(/[&<>\"']/g, char => map[char] || char);\n}\n","/**\n * Server-Side Rendering (SSR) utilities for Nuclo\n * Renders Nuclo components to HTML strings in Node.js environment\n */\n\nimport { escapeHtml, camelToKebab } from '../utility/stringUtils';\n\ntype RenderableInput =\n | NodeModFn<ElementTagName>\n | Element\n | Node\n | null\n | undefined;\n\n/**\n * Serializes a DOM attribute value\n */\nfunction serializeAttribute(name: string, value: unknown): string {\n if (value === null || value === undefined || value === false) {\n return '';\n }\n\n if (value === true) {\n return ` ${name}`;\n }\n\n if (name === 'style' && typeof value === 'object') {\n const styleStr = Object.entries(value)\n .map(([key, val]) => {\n const cssKey = camelToKebab(key);\n return `${cssKey}:${val}`;\n })\n .join(';');\n return styleStr ? ` style=\"${escapeHtml(styleStr)}\"` : '';\n }\n\n return ` ${name}=\"${escapeHtml(String(value))}\"`;\n}\n\n/**\n * Serializes DOM element attributes to HTML string\n */\nfunction serializeAttributes(element: Element): string {\n let result = '';\n\n // Handle polyfill elements with Map-based attributes\n if ('attributes' in element && element.attributes instanceof Map) {\n // First, handle special properties that might not be in the attributes Map\n const el = element as any;\n\n // Add id if it exists and is not already in attributes\n if (el.id && !element.attributes.has('id')) {\n result += serializeAttribute('id', el.id);\n }\n\n // Add class if it exists and is not already in attributes\n if (el.className && !element.attributes.has('class')) {\n result += serializeAttribute('class', el.className);\n }\n\n // Then add all attributes from the Map\n for (const [name, value] of element.attributes) {\n result += serializeAttribute(name, value);\n }\n return result;\n }\n\n // Handle browser elements with NamedNodeMap attributes\n if (element.attributes && element.attributes.length) {\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes[i];\n if (attr && attr.name) {\n result += serializeAttribute(attr.name, attr.value);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Self-closing HTML tags that don't have closing tags\n */\nconst VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n]);\n\n/**\n * Get child nodes from an element (handles both browser and polyfill elements)\n */\nfunction getChildNodes(node: Node): ArrayLike<Node> {\n // Check for childNodes first (document fragments and browser elements)\n if ('childNodes' in node) {\n const childNodes = (node as any).childNodes;\n if (childNodes && (Array.isArray(childNodes) || childNodes.length !== undefined)) {\n return childNodes;\n }\n }\n // Polyfill elements have children array\n if ('children' in node) {\n const children = (node as any).children;\n if (children && Array.isArray(children)) {\n return children as ArrayLike<Node>;\n }\n }\n return [] as ArrayLike<Node>;\n}\n\n/**\n * Serializes a DOM node to HTML string\n */\nfunction serializeNode(node: Node): string {\n // Text node\n if (node.nodeType === 3) { // Node.TEXT_NODE\n return escapeHtml(node.textContent || '');\n }\n\n // Comment node\n if (node.nodeType === 8) { // Node.COMMENT_NODE\n return `<!--${node.textContent || ''}-->`;\n }\n\n // Element node\n if (node.nodeType === 1) { // Node.ELEMENT_NODE\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n const attributes = serializeAttributes(element);\n\n // Self-closing tags\n if (VOID_ELEMENTS.has(tagName)) {\n return `<${tagName}${attributes} />`;\n }\n\n // Regular elements with children\n let childrenHtml = '';\n const childNodes = getChildNodes(element);\n if (childNodes && childNodes.length > 0) {\n for (let i = 0; i < childNodes.length; i++) {\n const child = childNodes[i];\n if (child) {\n childrenHtml += serializeNode(child);\n }\n }\n }\n\n return `<${tagName}${attributes}>${childrenHtml}</${tagName}>`;\n }\n\n // Document fragment\n if (node.nodeType === 11) { // Node.DOCUMENT_FRAGMENT_NODE\n let result = '';\n const childNodes = getChildNodes(node);\n if (childNodes && childNodes.length > 0) {\n for (let i = 0; i < childNodes.length; i++) {\n const child = childNodes[i];\n if (child) {\n result += serializeNode(child);\n }\n }\n }\n return result;\n }\n\n return '';\n}\n\n/**\n * Renders a Nuclo component to an HTML string for server-side rendering\n *\n * @param input - A Nuclo component function, DOM element, or node\n * @returns HTML string representation of the component\n *\n * @example\n * ```ts\n * import { renderToString } from 'nuclo/ssr';\n * import { div } from 'nuclo';\n *\n * const html = renderToString(\n * div(\"Hello, World!\")\n * );\n * // Returns: '<div>Hello, World!</div>'\n * ```\n */\nexport function renderToString(input: RenderableInput): string {\n if (!input) {\n return '';\n }\n\n // If it's a function (NodeModFn), call it to create the element\n if (typeof input === 'function') {\n try {\n // Create a temporary container to render into\n const container = globalThis.document?.createElement('div');\n if (!container) {\n throw new Error('Document is not available. Make sure polyfills are loaded.');\n }\n\n const element = input(container as ExpandedElement<ElementTagName>, 0);\n return element && typeof element === 'object' && 'nodeType' in element ? serializeNode(element as Node) : '';\n } catch (error) {\n console.error('Error rendering component to string:', error);\n return '';\n }\n }\n\n // If it's already a Node, serialize it directly\n if ('nodeType' in input) {\n return serializeNode(input as Node);\n }\n\n return '';\n}\n\n/**\n * Renders multiple Nuclo components to HTML strings\n *\n * @param inputs - Array of Nuclo components\n * @returns Array of HTML strings\n */\nexport function renderManyToString(inputs: RenderableInput[]): string[] {\n return inputs.map(input => renderToString(input));\n}\n\n/**\n * Renders a Nuclo component and wraps it in a container element\n *\n * @param input - A Nuclo component\n * @param containerTag - The tag name for the container (default: 'div')\n * @param containerAttrs - Attributes for the container element\n * @returns HTML string with container wrapper\n */\nexport function renderToStringWithContainer(\n input: RenderableInput,\n containerTag: string = 'div',\n containerAttrs: Record<string, string> = {}\n): string {\n const content = renderToString(input);\n const attrs = Object.entries(containerAttrs)\n .map(([key, value]) => serializeAttribute(key, value))\n .join('');\n\n return `<${containerTag}${attrs}>${content}</${containerTag}>`;\n}\n"],"names":["escapeHtml","text","map","replace","char","serializeAttribute","name","value","styleStr","Object","entries","key","val","str","result","i","length","code","charCodeAt","String","fromCharCode","camelToKebab","join","VOID_ELEMENTS","Set","getChildNodes","node","childNodes","Array","isArray","undefined","children","serializeNode","nodeType","textContent","element","tagName","toLowerCase","attributes","Map","el","id","has","className","attr","serializeAttributes","childrenHtml","child","renderToString","input","container","globalThis","document","createElement","Error","error","inputs","containerTag","containerAttrs","content"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function t(t){const e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};return t.replace(/[&<>"']/g,t=>e[t]||t)}function e(e,n){if(null==n||!1===n)return"";if(!0===n)return" "+e;if("style"===e&&"object"==typeof n){const e=Object.entries(n).map(([t,e])=>`${function(t){let e="";for(let n=0;t.length>n;n++){const r=t.charCodeAt(n);65>r||r>90?e+=t[n]:(n>0&&(e+="-"),e+=String.fromCharCode(r+32))}return e}(t)}:${e}`).join(";");return e?` style="${t(e)}"`:""}return` ${e}="${t(n+"")}"`}const n=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function r(t){if("childNodes"in t){const e=t.childNodes;if(e&&(Array.isArray(e)||void 0!==e.length))return e}if("children"in t){const e=t.children;if(e&&Array.isArray(e))return e}return[]}function i(o){if(3===o.nodeType)return t(o.textContent||"");if(8===o.nodeType)return`\x3c!--${o.textContent||""}--\x3e`;if(1===o.nodeType){const t=o,a=t.tagName.toLowerCase(),s=function(t){let n="";if("attributes"in t&&t.attributes instanceof Map){const r=t;r.id&&!t.attributes.has("id")&&(n+=e("id",r.id)),r.className&&!t.attributes.has("class")&&(n+=e("class",r.className));for(const[r,i]of t.attributes)n+=e(r,i);return n}if(t.attributes&&t.attributes.length)for(let r=0;t.attributes.length>r;r++){const i=t.attributes[r];i&&i.name&&(n+=e(i.name,i.value))}return n}(t);if(n.has(a))return`<${a}${s} />`;let c="";const u=r(t);if(u&&u.length>0)for(let t=0;u.length>t;t++){const e=u[t];e&&(c+=i(e))}return`<${a}${s}>${c}</${a}>`}if(11===o.nodeType){let t="";const e=r(o);if(e&&e.length>0)for(let n=0;e.length>n;n++){const r=e[n];r&&(t+=i(r))}return t}return""}function o(t){if(!t)return"";if("function"==typeof t)try{const e=globalThis.document?.createElement("div");if(!e)throw Error("Document is not available. Make sure polyfills are loaded.");const n=t(e,0);return n&&"object"==typeof n&&"nodeType"in n?i(n):""}catch(t){return""}return"nodeType"in t?i(t):""}function a(t){return t.map(t=>o(t))}function s(t,n="div",r={}){const i=o(t);return`<${n}${Object.entries(r).map(([t,n])=>e(t,n)).join("")}>${i}</${n}>`}export{a as renderManyToString,o as renderToString,s as renderToStringWithContainer};
2
+ //# sourceMappingURL=nuclo.ssr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuclo.ssr.js","sources":["../../src/utility/stringUtils.ts","../../src/ssr/renderToString.ts"],"sourcesContent":["/**\n * String utility functions\n */\n\n/**\n * Converts camelCase to kebab-case (optimized for performance)\n * Uses direct character code manipulation for maximum speed\n * @example camelToKebab('backgroundColor') => 'background-color'\n */\nexport function camelToKebab(str: string): string {\n let result = '';\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n // A-Z is 65-90, a-z is 97-122 (difference of 32)\n if (code >= 65 && code <= 90) {\n if (i > 0) result += '-';\n result += String.fromCharCode(code + 32);\n } else {\n result += str[i];\n }\n }\n return result;\n}\n\n/**\n * Escapes HTML special characters to prevent XSS\n */\nexport function escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#039;'\n };\n return text.replace(/[&<>\"']/g, char => map[char] || char);\n}\n","/**\n * Server-Side Rendering (SSR) utilities for Nuclo\n * Renders Nuclo components to HTML strings in Node.js environment\n */\n\nimport { escapeHtml, camelToKebab } from '../utility/stringUtils';\n\ntype RenderableInput =\n | NodeModFn<ElementTagName>\n | Element\n | Node\n | null\n | undefined;\n\n/**\n * Serializes a DOM attribute value\n */\nfunction serializeAttribute(name: string, value: unknown): string {\n if (value === null || value === undefined || value === false) {\n return '';\n }\n\n if (value === true) {\n return ` ${name}`;\n }\n\n if (name === 'style' && typeof value === 'object') {\n const styleStr = Object.entries(value)\n .map(([key, val]) => {\n const cssKey = camelToKebab(key);\n return `${cssKey}:${val}`;\n })\n .join(';');\n return styleStr ? ` style=\"${escapeHtml(styleStr)}\"` : '';\n }\n\n return ` ${name}=\"${escapeHtml(String(value))}\"`;\n}\n\n/**\n * Serializes DOM element attributes to HTML string\n */\nfunction serializeAttributes(element: Element): string {\n let result = '';\n\n // Handle polyfill elements with Map-based attributes\n if ('attributes' in element && element.attributes instanceof Map) {\n // First, handle special properties that might not be in the attributes Map\n const el = element as any;\n\n // Add id if it exists and is not already in attributes\n if (el.id && !element.attributes.has('id')) {\n result += serializeAttribute('id', el.id);\n }\n\n // Add class if it exists and is not already in attributes\n if (el.className && !element.attributes.has('class')) {\n result += serializeAttribute('class', el.className);\n }\n\n // Then add all attributes from the Map\n for (const [name, value] of element.attributes) {\n result += serializeAttribute(name, value);\n }\n return result;\n }\n\n // Handle browser elements with NamedNodeMap attributes\n if (element.attributes && element.attributes.length) {\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes[i];\n if (attr && attr.name) {\n result += serializeAttribute(attr.name, attr.value);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Self-closing HTML tags that don't have closing tags\n */\nconst VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n]);\n\n/**\n * Get child nodes from an element (handles both browser and polyfill elements)\n */\nfunction getChildNodes(node: Node): ArrayLike<Node> {\n // Check for childNodes first (document fragments and browser elements)\n if ('childNodes' in node) {\n const childNodes = (node as any).childNodes;\n if (childNodes && (Array.isArray(childNodes) || childNodes.length !== undefined)) {\n return childNodes;\n }\n }\n // Polyfill elements have children array\n if ('children' in node) {\n const children = (node as any).children;\n if (children && Array.isArray(children)) {\n return children as ArrayLike<Node>;\n }\n }\n return [] as ArrayLike<Node>;\n}\n\n/**\n * Serializes a DOM node to HTML string\n */\nfunction serializeNode(node: Node): string {\n // Text node\n if (node.nodeType === 3) { // Node.TEXT_NODE\n return escapeHtml(node.textContent || '');\n }\n\n // Comment node\n if (node.nodeType === 8) { // Node.COMMENT_NODE\n return `<!--${node.textContent || ''}-->`;\n }\n\n // Element node\n if (node.nodeType === 1) { // Node.ELEMENT_NODE\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n const attributes = serializeAttributes(element);\n\n // Self-closing tags\n if (VOID_ELEMENTS.has(tagName)) {\n return `<${tagName}${attributes} />`;\n }\n\n // Regular elements with children\n let childrenHtml = '';\n const childNodes = getChildNodes(element);\n if (childNodes && childNodes.length > 0) {\n for (let i = 0; i < childNodes.length; i++) {\n const child = childNodes[i];\n if (child) {\n childrenHtml += serializeNode(child);\n }\n }\n }\n\n return `<${tagName}${attributes}>${childrenHtml}</${tagName}>`;\n }\n\n // Document fragment\n if (node.nodeType === 11) { // Node.DOCUMENT_FRAGMENT_NODE\n let result = '';\n const childNodes = getChildNodes(node);\n if (childNodes && childNodes.length > 0) {\n for (let i = 0; i < childNodes.length; i++) {\n const child = childNodes[i];\n if (child) {\n result += serializeNode(child);\n }\n }\n }\n return result;\n }\n\n return '';\n}\n\n/**\n * Renders a Nuclo component to an HTML string for server-side rendering\n *\n * @param input - A Nuclo component function, DOM element, or node\n * @returns HTML string representation of the component\n *\n * @example\n * ```ts\n * import { renderToString } from 'nuclo/ssr';\n * import { div } from 'nuclo';\n *\n * const html = renderToString(\n * div(\"Hello, World!\")\n * );\n * // Returns: '<div>Hello, World!</div>'\n * ```\n */\nexport function renderToString(input: RenderableInput): string {\n if (!input) {\n return '';\n }\n\n // If it's a function (NodeModFn), call it to create the element\n if (typeof input === 'function') {\n try {\n // Create a temporary container to render into\n const container = globalThis.document?.createElement('div');\n if (!container) {\n throw new Error('Document is not available. Make sure polyfills are loaded.');\n }\n\n const element = input(container as ExpandedElement<ElementTagName>, 0);\n return element && typeof element === 'object' && 'nodeType' in element ? serializeNode(element as Node) : '';\n } catch (error) {\n console.error('Error rendering component to string:', error);\n return '';\n }\n }\n\n // If it's already a Node, serialize it directly\n if ('nodeType' in input) {\n return serializeNode(input as Node);\n }\n\n return '';\n}\n\n/**\n * Renders multiple Nuclo components to HTML strings\n *\n * @param inputs - Array of Nuclo components\n * @returns Array of HTML strings\n */\nexport function renderManyToString(inputs: RenderableInput[]): string[] {\n return inputs.map(input => renderToString(input));\n}\n\n/**\n * Renders a Nuclo component and wraps it in a container element\n *\n * @param input - A Nuclo component\n * @param containerTag - The tag name for the container (default: 'div')\n * @param containerAttrs - Attributes for the container element\n * @returns HTML string with container wrapper\n */\nexport function renderToStringWithContainer(\n input: RenderableInput,\n containerTag: string = 'div',\n containerAttrs: Record<string, string> = {}\n): string {\n const content = renderToString(input);\n const attrs = Object.entries(containerAttrs)\n .map(([key, value]) => serializeAttribute(key, value))\n .join('');\n\n return `<${containerTag}${attrs}>${content}</${containerTag}>`;\n}\n"],"names":["escapeHtml","text","map","replace","char","serializeAttribute","name","value","styleStr","Object","entries","key","val","str","result","i","length","code","charCodeAt","String","fromCharCode","camelToKebab","join","VOID_ELEMENTS","Set","getChildNodes","node","childNodes","Array","isArray","undefined","children","serializeNode","nodeType","textContent","element","tagName","toLowerCase","attributes","Map","el","id","has","className","attr","serializeAttributes","childrenHtml","child","renderToString","input","container","globalThis","document","createElement","Error","error","renderManyToString","inputs","renderToStringWithContainer","containerTag","containerAttrs","content"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Server-Side Rendering (SSR) utilities for Nuclo
3
+ * Renders Nuclo components to HTML strings in Node.js environment
4
+ */
5
+ type RenderableInput = NodeModFn<ElementTagName> | Element | Node | null | undefined;
6
+ /**
7
+ * Renders a Nuclo component to an HTML string for server-side rendering
8
+ *
9
+ * @param input - A Nuclo component function, DOM element, or node
10
+ * @returns HTML string representation of the component
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { renderToString } from 'nuclo/ssr';
15
+ * import { div } from 'nuclo';
16
+ *
17
+ * const html = renderToString(
18
+ * div("Hello, World!")
19
+ * );
20
+ * // Returns: '<div>Hello, World!</div>'
21
+ * ```
22
+ */
23
+ export declare function renderToString(input: RenderableInput): string;
24
+ /**
25
+ * Renders multiple Nuclo components to HTML strings
26
+ *
27
+ * @param inputs - Array of Nuclo components
28
+ * @returns Array of HTML strings
29
+ */
30
+ export declare function renderManyToString(inputs: RenderableInput[]): string[];
31
+ /**
32
+ * Renders a Nuclo component and wraps it in a container element
33
+ *
34
+ * @param input - A Nuclo component
35
+ * @param containerTag - The tag name for the container (default: 'div')
36
+ * @param containerAttrs - Attributes for the container element
37
+ * @returns HTML string with container wrapper
38
+ */
39
+ export declare function renderToStringWithContainer(input: RenderableInput, containerTag?: string, containerAttrs?: Record<string, string>): string;
40
+ export {};
41
+ //# sourceMappingURL=renderToString.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderToString.d.ts","sourceRoot":"","sources":["../../src/ssr/renderToString.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,KAAK,eAAe,GAChB,SAAS,CAAC,cAAc,CAAC,GACzB,OAAO,GACP,IAAI,GACJ,IAAI,GACJ,SAAS,CAAC;AA2Jd;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CA4B7D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAEtE;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,YAAY,GAAE,MAAc,EAC5B,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAC1C,MAAM,CAOR"}
@@ -1,10 +1,7 @@
1
- type BooleanCondition = () => boolean;
2
1
  type ZeroArityFunction = () => unknown;
3
2
  declare const modifierProbeCache: WeakMap<ZeroArityFunction, {
4
3
  value: unknown;
5
4
  error: boolean;
6
5
  }>;
7
- export declare function isConditionalModifier(modifier: unknown, allModifiers: unknown[], currentIndex: number): modifier is BooleanCondition;
8
- export declare function findConditionalModifier(modifiers: unknown[]): number;
9
6
  export { modifierProbeCache };
10
7
  //# sourceMappingURL=modifierPredicates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"modifierPredicates.d.ts","sourceRoot":"","sources":["../../src/utility/modifierPredicates.ts"],"names":[],"mappings":"AAEA,KAAK,gBAAgB,GAAG,MAAM,OAAO,CAAC;AACtC,KAAK,iBAAiB,GAAG,MAAM,OAAO,CAAC;AAEvC,QAAA,MAAM,kBAAkB;WAA2C,OAAO;WAAS,OAAO;EAAK,CAAC;AAyBhG,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,OAAO,EAAE,EACvB,YAAY,EAAE,MAAM,GACnB,QAAQ,IAAI,gBAAgB,CAqB9B;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAOpE;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"modifierPredicates.d.ts","sourceRoot":"","sources":["../../src/utility/modifierPredicates.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,GAAG,MAAM,OAAO,CAAC;AAEvC,QAAA,MAAM,kBAAkB;WAA2C,OAAO;WAAS,OAAO;EAAK,CAAC;AAEhG,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * String utility functions
3
+ */
4
+ /**
5
+ * Converts camelCase to kebab-case (optimized for performance)
6
+ * Uses direct character code manipulation for maximum speed
7
+ * @example camelToKebab('backgroundColor') => 'background-color'
8
+ */
9
+ export declare function camelToKebab(str: string): string;
10
+ /**
11
+ * Escapes HTML special characters to prevent XSS
12
+ */
13
+ export declare function escapeHtml(text: string): string;
14
+ //# sourceMappingURL=stringUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringUtils.d.ts","sourceRoot":"","sources":["../../src/utility/stringUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAahD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS/C"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuclo",
3
3
  "private": false,
4
- "version": "0.1.72",
4
+ "version": "0.1.76",
5
5
  "type": "module",
6
6
  "main": "./dist/nuclo.cjs",
7
7
  "module": "./dist/nuclo.js",
@@ -13,6 +13,11 @@
13
13
  "import": "./dist/nuclo.js",
14
14
  "require": "./dist/nuclo.cjs"
15
15
  },
16
+ "./ssr": {
17
+ "types": "./dist/ssr/index.d.ts",
18
+ "import": "./dist/ssr/nuclo.ssr.js",
19
+ "require": "./dist/ssr/nuclo.ssr.cjs"
20
+ },
16
21
  "./types": {
17
22
  "types": "./types/index.d.ts"
18
23
  }
@@ -28,15 +33,15 @@
28
33
  "@eslint/markdown": "^7.5.1",
29
34
  "@rollup/plugin-terser": "^0.4.4",
30
35
  "@rollup/plugin-typescript": "^12.3.0",
31
- "@types/node": "^24.10.1",
32
- "@vitest/coverage-v8": "4.0.14",
36
+ "@types/node": "^25.0.0",
37
+ "@vitest/coverage-v8": "4.0.15",
33
38
  "eslint": "^9.39.1",
34
39
  "globals": "^16.5.0",
35
- "jsdom": "^27.2.0",
40
+ "jsdom": "^27.3.0",
36
41
  "rollup": "^4.53.3",
37
42
  "tslib": "^2.8.1",
38
43
  "typescript": "^5.9.3",
39
- "typescript-eslint": "^8.48.1",
44
+ "typescript-eslint": "^8.49.0",
40
45
  "vitest": "^4.0.15"
41
46
  },
42
47
  "repository": {
@@ -56,7 +61,7 @@
56
61
  "build:types": "tsc --emitDeclarationOnly",
57
62
  "clean": "rm -rf dist *.tsbuildinfo",
58
63
  "test": "vitest run --coverage",
59
- "test:watch": "vitest --watch",
64
+ "test:watch": "vitest --watch --coverage",
60
65
  "lint": "eslint . --ext .ts,.js,.json,.jsonc,.json5,.md,.css"
61
66
  }
62
67
  }
@@ -1,7 +0,0 @@
1
- export declare function createHtmlConditionalElement<TTagName extends ElementTagName>(tagName: TTagName, condition: () => boolean, modifiers: Array<NodeMod<TTagName> | NodeModFn<TTagName>>): ExpandedElement<TTagName> | Comment;
2
- export declare function createSvgConditionalElement<TTagName extends keyof SVGElementTagNameMap>(tagName: TTagName, condition: () => boolean, modifiers: Array<unknown>): SVGElementTagNameMap[TTagName] | Comment;
3
- export declare function processConditionalModifiers<TTagName extends ElementTagName>(modifiers: Array<NodeMod<TTagName> | NodeModFn<TTagName>>): {
4
- condition: (() => boolean) | null;
5
- otherModifiers: Array<NodeMod<TTagName> | NodeModFn<TTagName>>;
6
- };
7
- //# sourceMappingURL=conditionalRenderer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conditionalRenderer.d.ts","sourceRoot":"","sources":["../../src/core/conditionalRenderer.ts"],"names":[],"mappings":"AAOA,wBAAgB,4BAA4B,CAAC,QAAQ,SAAS,cAAc,EAC1E,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,MAAM,OAAO,EACxB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,GACxD,eAAe,CAAC,QAAQ,CAAC,GAAG,OAAO,CAuBrC;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,SAAS,MAAM,oBAAoB,EACrF,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,MAAM,OAAO,EACxB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GACxB,oBAAoB,CAAC,QAAQ,CAAC,GAAG,OAAO,CA4B1C;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,SAAS,cAAc,EACzE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,GACxD;IACD,SAAS,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;CAChE,CAWA"}