@akashjs/runtime 0.1.33 → 0.1.34

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.
package/dist/ssr.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunk2X7GUBTG_cjs=require('./chunk-2X7GUBTG.cjs');require('./chunk-RTJ6UDGV.cjs');Object.defineProperty(exports,"escapeHtml",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.a}});Object.defineProperty(exports,"isServerRendering",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.b}});Object.defineProperty(exports,"nodeToHtml",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.i}});Object.defineProperty(exports,"renderNodes",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.j}});Object.defineProperty(exports,"renderToStream",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.e}});Object.defineProperty(exports,"renderToString",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.c}});Object.defineProperty(exports,"renderToStringSync",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.d}});Object.defineProperty(exports,"ssrElement",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.f}});Object.defineProperty(exports,"ssrRaw",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.h}});Object.defineProperty(exports,"ssrText",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.g}});//# sourceMappingURL=ssr.cjs.map
1
+ 'use strict';var chunkZEFTGYOU_cjs=require('./chunk-ZEFTGYOU.cjs');require('./chunk-RTJ6UDGV.cjs');Object.defineProperty(exports,"escapeHtml",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.a}});Object.defineProperty(exports,"isServerRendering",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.b}});Object.defineProperty(exports,"nodeToHtml",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.i}});Object.defineProperty(exports,"renderNodes",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.j}});Object.defineProperty(exports,"renderToStream",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.e}});Object.defineProperty(exports,"renderToString",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.c}});Object.defineProperty(exports,"renderToStringSync",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.d}});Object.defineProperty(exports,"ssrElement",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.f}});Object.defineProperty(exports,"ssrRaw",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.h}});Object.defineProperty(exports,"ssrText",{enumerable:true,get:function(){return chunkZEFTGYOU_cjs.g}});//# sourceMappingURL=ssr.cjs.map
2
2
  //# sourceMappingURL=ssr.cjs.map
package/dist/ssr.js CHANGED
@@ -1,2 +1,2 @@
1
- export{a as escapeHtml,b as isServerRendering,i as nodeToHtml,j as renderNodes,e as renderToStream,c as renderToString,d as renderToStringSync,f as ssrElement,h as ssrRaw,g as ssrText}from'./chunk-3HWR5MIF.js';import'./chunk-TWA4T6PX.js';//# sourceMappingURL=ssr.js.map
1
+ export{a as escapeHtml,b as isServerRendering,i as nodeToHtml,j as renderNodes,e as renderToStream,c as renderToString,d as renderToStringSync,f as ssrElement,h as ssrRaw,g as ssrText}from'./chunk-LQOOWFIN.js';import'./chunk-TWA4T6PX.js';//# sourceMappingURL=ssr.js.map
2
2
  //# sourceMappingURL=ssr.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akashjs/runtime",
3
- "version": "0.1.33",
3
+ "version": "0.1.34",
4
4
  "description": "AkashJS core runtime — signals, components, DOM rendering",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -1,2 +0,0 @@
1
- 'use strict';var S={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function p(e){return e.replace(/[&<>"']/g,t=>S[t])}var i=false;function m(){return i}async function f(e,t){i=true;try{let r=c(e,t??{});return a(r)}finally{i=false;}}function d(e,t){i=true;try{let r=c(e,t??{});return a(r)}finally{i=false;}}function g(e,t){return new ReadableStream({start(r){i=true;try{let o=c(e,t??{}),n=a(o);r.enqueue(n),r.close();}catch(o){r.error(o);}finally{i=false;}}})}function c(e,t){return {type:"raw",html:`<!-- SSR placeholder for ${e.name||"component"} -->`}}function R(e,t,r){let o={};if(t)for(let[n,s]of Object.entries(t))s===true?o[n]="":s!==false&&s!=null&&(o[n]=String(s));return {type:"element",tag:e,attrs:o,children:r??[]}}function x(e){return {type:"text",content:e}}function y(e){return {type:"raw",html:e}}var u=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function a(e){switch(e.type){case "text":return p(e.content);case "raw":return e.html;case "element":{let{tag:t,attrs:r,children:o}=e,n=`<${t}`;for(let[s,l]of Object.entries(r))l===""?n+=` ${s}`:n+=` ${s}="${p(l)}"`;if(u.has(t))return n+=" />",n;n+=">";for(let s of o)n+=a(s);return n+=`</${t}>`,n}}}function P(e){return e.map(a).join("")}exports.a=p;exports.b=m;exports.c=f;exports.d=d;exports.e=g;exports.f=R;exports.g=x;exports.h=y;exports.i=a;exports.j=P;//# sourceMappingURL=chunk-2X7GUBTG.cjs.map
2
- //# sourceMappingURL=chunk-2X7GUBTG.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ssr.ts"],"names":["ESCAPE_MAP","escapeHtml","str","ch","isSSR","isServerRendering","renderToString","component","props","node","renderComponent","nodeToHtml","renderToStringSync","renderToStream","controller","html","err","ssrElement","tag","attrs","children","processedAttrs","key","value","ssrText","content","ssrRaw","VOID_ELEMENTS","child","renderNodes","nodes"],"mappings":"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","file":"chunk-2X7GUBTG.cjs","sourcesContent":["/**\n * Server-Side Rendering.\n *\n * Renders components to HTML strings (or streams) on the server.\n * No DOM APIs are used — everything is string concatenation.\n *\n * - Effects do NOT run on the server (they are DOM-side only)\n * - Signals and computeds work synchronously\n * - Components run their setup + initial render, producing HTML\n */\n\nimport { signal, computed, untrack } from './signals.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\n\n// --- Escape helpers ---\n\nconst ESCAPE_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\nexport function escapeHtml(str: string): string {\n return str.replace(/[&<>\"']/g, (ch) => ESCAPE_MAP[ch]);\n}\n\n// --- SSR context ---\n\nlet isSSR = false;\n\n/** Check if we're currently in an SSR render */\nexport function isServerRendering(): boolean {\n return isSSR;\n}\n\n// --- renderToString ---\n\n/**\n * Render a component to an HTML string on the server.\n *\n * ```ts\n * import { renderToString } from '@akashjs/runtime/ssr';\n * const html = await renderToString(App, { title: 'Home' });\n * ```\n */\nexport async function renderToString<P extends Record<string, unknown>>(\n component: Component<P>,\n props?: P,\n): Promise<string> {\n isSSR = true;\n try {\n const node = renderComponent(component, props ?? ({} as P));\n return nodeToHtml(node);\n } finally {\n isSSR = false;\n }\n}\n\n/**\n * Synchronous version of renderToString.\n */\nexport function renderToStringSync<P extends Record<string, unknown>>(\n component: Component<P>,\n props?: P,\n): string {\n isSSR = true;\n try {\n const node = renderComponent(component, props ?? ({} as P));\n return nodeToHtml(node);\n } finally {\n isSSR = false;\n }\n}\n\n// --- renderToStream ---\n\n/**\n * Render a component to a ReadableStream of HTML chunks.\n *\n * Useful for streaming SSR — flush HTML as data becomes available.\n *\n * ```ts\n * const stream = renderToStream(App, { title: 'Home' });\n * // Pipe to HTTP response\n * ```\n */\nexport function renderToStream<P extends Record<string, unknown>>(\n component: Component<P>,\n props?: P,\n): ReadableStream<string> {\n return new ReadableStream<string>({\n start(controller) {\n isSSR = true;\n try {\n const node = renderComponent(component, props ?? ({} as P));\n const html = nodeToHtml(node);\n\n // For now, emit as a single chunk.\n // With Suspense boundaries, each resolved boundary\n // would flush a separate chunk.\n controller.enqueue(html);\n controller.close();\n } catch (err) {\n controller.error(err);\n } finally {\n isSSR = false;\n }\n },\n });\n}\n\n// --- SSR rendering internals ---\n\n/** Render a component, getting back the AkashNode tree */\nfunction renderComponent<P extends Record<string, unknown>>(\n component: Component<P>,\n props: P,\n): SSRNode {\n // In SSR mode, component() would try to use DOM APIs.\n // Instead, we intercept and build a virtual tree.\n // For now, we rely on the server-mode compiler output\n // which generates string concatenation instead of DOM calls.\n //\n // This runtime renderToString works with components that\n // return SSRNode trees (from server-compiled code).\n\n // Create a lightweight SSR node\n return { type: 'raw', html: `<!-- SSR placeholder for ${component.name || 'component'} -->` };\n}\n\n// --- SSR Node types ---\n\nexport interface SSRElement {\n type: 'element';\n tag: string;\n attrs: Record<string, string>;\n children: SSRNode[];\n selfClosing?: boolean;\n}\n\nexport interface SSRText {\n type: 'text';\n content: string;\n}\n\nexport interface SSRRaw {\n type: 'raw';\n html: string;\n}\n\nexport type SSRNode = SSRElement | SSRText | SSRRaw;\n\n// --- SSR DOM-less helpers ---\n\n/**\n * Create an SSR element (replaces document.createElement on the server).\n */\nexport function ssrElement(\n tag: string,\n attrs?: Record<string, string | boolean>,\n children?: SSRNode[],\n): SSRElement {\n const processedAttrs: Record<string, string> = {};\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value === true) {\n processedAttrs[key] = '';\n } else if (value !== false && value != null) {\n processedAttrs[key] = String(value);\n }\n }\n }\n\n return {\n type: 'element',\n tag,\n attrs: processedAttrs,\n children: children ?? [],\n };\n}\n\n/**\n * Create an SSR text node.\n */\nexport function ssrText(content: string): SSRText {\n return { type: 'text', content };\n}\n\n/**\n * Create a raw HTML SSR node (no escaping).\n */\nexport function ssrRaw(html: string): SSRRaw {\n return { type: 'raw', html };\n}\n\n// --- Serialization ---\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 * Serialize an SSR node tree to an HTML string.\n */\nexport function nodeToHtml(node: SSRNode): string {\n switch (node.type) {\n case 'text':\n return escapeHtml(node.content);\n\n case 'raw':\n return node.html;\n\n case 'element': {\n const { tag, attrs, children } = node;\n let html = `<${tag}`;\n\n for (const [key, value] of Object.entries(attrs)) {\n if (value === '') {\n html += ` ${key}`;\n } else {\n html += ` ${key}=\"${escapeHtml(value)}\"`;\n }\n }\n\n if (VOID_ELEMENTS.has(tag)) {\n html += ' />';\n return html;\n }\n\n html += '>';\n\n for (const child of children) {\n html += nodeToHtml(child);\n }\n\n html += `</${tag}>`;\n return html;\n }\n }\n}\n\n/**\n * Render a tree of SSR nodes (convenience for arrays).\n */\nexport function renderNodes(nodes: SSRNode[]): string {\n return nodes.map(nodeToHtml).join('');\n}\n"]}
@@ -1,2 +0,0 @@
1
- var S={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function p(e){return e.replace(/[&<>"']/g,t=>S[t])}var i=false;function m(){return i}async function f(e,t){i=true;try{let r=c(e,t??{});return a(r)}finally{i=false;}}function d(e,t){i=true;try{let r=c(e,t??{});return a(r)}finally{i=false;}}function g(e,t){return new ReadableStream({start(r){i=true;try{let o=c(e,t??{}),n=a(o);r.enqueue(n),r.close();}catch(o){r.error(o);}finally{i=false;}}})}function c(e,t){return {type:"raw",html:`<!-- SSR placeholder for ${e.name||"component"} -->`}}function R(e,t,r){let o={};if(t)for(let[n,s]of Object.entries(t))s===true?o[n]="":s!==false&&s!=null&&(o[n]=String(s));return {type:"element",tag:e,attrs:o,children:r??[]}}function x(e){return {type:"text",content:e}}function y(e){return {type:"raw",html:e}}var u=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function a(e){switch(e.type){case "text":return p(e.content);case "raw":return e.html;case "element":{let{tag:t,attrs:r,children:o}=e,n=`<${t}`;for(let[s,l]of Object.entries(r))l===""?n+=` ${s}`:n+=` ${s}="${p(l)}"`;if(u.has(t))return n+=" />",n;n+=">";for(let s of o)n+=a(s);return n+=`</${t}>`,n}}}function P(e){return e.map(a).join("")}export{p as a,m as b,f as c,d,g as e,R as f,x as g,y as h,a as i,P as j};//# sourceMappingURL=chunk-3HWR5MIF.js.map
2
- //# sourceMappingURL=chunk-3HWR5MIF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ssr.ts"],"names":["ESCAPE_MAP","escapeHtml","str","ch","isSSR","isServerRendering","renderToString","component","props","node","renderComponent","nodeToHtml","renderToStringSync","renderToStream","controller","html","err","ssrElement","tag","attrs","children","processedAttrs","key","value","ssrText","content","ssrRaw","VOID_ELEMENTS","child","renderNodes","nodes"],"mappings":"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","file":"chunk-3HWR5MIF.js","sourcesContent":["/**\n * Server-Side Rendering.\n *\n * Renders components to HTML strings (or streams) on the server.\n * No DOM APIs are used — everything is string concatenation.\n *\n * - Effects do NOT run on the server (they are DOM-side only)\n * - Signals and computeds work synchronously\n * - Components run their setup + initial render, producing HTML\n */\n\nimport { signal, computed, untrack } from './signals.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\n\n// --- Escape helpers ---\n\nconst ESCAPE_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\nexport function escapeHtml(str: string): string {\n return str.replace(/[&<>\"']/g, (ch) => ESCAPE_MAP[ch]);\n}\n\n// --- SSR context ---\n\nlet isSSR = false;\n\n/** Check if we're currently in an SSR render */\nexport function isServerRendering(): boolean {\n return isSSR;\n}\n\n// --- renderToString ---\n\n/**\n * Render a component to an HTML string on the server.\n *\n * ```ts\n * import { renderToString } from '@akashjs/runtime/ssr';\n * const html = await renderToString(App, { title: 'Home' });\n * ```\n */\nexport async function renderToString<P extends Record<string, unknown>>(\n component: Component<P>,\n props?: P,\n): Promise<string> {\n isSSR = true;\n try {\n const node = renderComponent(component, props ?? ({} as P));\n return nodeToHtml(node);\n } finally {\n isSSR = false;\n }\n}\n\n/**\n * Synchronous version of renderToString.\n */\nexport function renderToStringSync<P extends Record<string, unknown>>(\n component: Component<P>,\n props?: P,\n): string {\n isSSR = true;\n try {\n const node = renderComponent(component, props ?? ({} as P));\n return nodeToHtml(node);\n } finally {\n isSSR = false;\n }\n}\n\n// --- renderToStream ---\n\n/**\n * Render a component to a ReadableStream of HTML chunks.\n *\n * Useful for streaming SSR — flush HTML as data becomes available.\n *\n * ```ts\n * const stream = renderToStream(App, { title: 'Home' });\n * // Pipe to HTTP response\n * ```\n */\nexport function renderToStream<P extends Record<string, unknown>>(\n component: Component<P>,\n props?: P,\n): ReadableStream<string> {\n return new ReadableStream<string>({\n start(controller) {\n isSSR = true;\n try {\n const node = renderComponent(component, props ?? ({} as P));\n const html = nodeToHtml(node);\n\n // For now, emit as a single chunk.\n // With Suspense boundaries, each resolved boundary\n // would flush a separate chunk.\n controller.enqueue(html);\n controller.close();\n } catch (err) {\n controller.error(err);\n } finally {\n isSSR = false;\n }\n },\n });\n}\n\n// --- SSR rendering internals ---\n\n/** Render a component, getting back the AkashNode tree */\nfunction renderComponent<P extends Record<string, unknown>>(\n component: Component<P>,\n props: P,\n): SSRNode {\n // In SSR mode, component() would try to use DOM APIs.\n // Instead, we intercept and build a virtual tree.\n // For now, we rely on the server-mode compiler output\n // which generates string concatenation instead of DOM calls.\n //\n // This runtime renderToString works with components that\n // return SSRNode trees (from server-compiled code).\n\n // Create a lightweight SSR node\n return { type: 'raw', html: `<!-- SSR placeholder for ${component.name || 'component'} -->` };\n}\n\n// --- SSR Node types ---\n\nexport interface SSRElement {\n type: 'element';\n tag: string;\n attrs: Record<string, string>;\n children: SSRNode[];\n selfClosing?: boolean;\n}\n\nexport interface SSRText {\n type: 'text';\n content: string;\n}\n\nexport interface SSRRaw {\n type: 'raw';\n html: string;\n}\n\nexport type SSRNode = SSRElement | SSRText | SSRRaw;\n\n// --- SSR DOM-less helpers ---\n\n/**\n * Create an SSR element (replaces document.createElement on the server).\n */\nexport function ssrElement(\n tag: string,\n attrs?: Record<string, string | boolean>,\n children?: SSRNode[],\n): SSRElement {\n const processedAttrs: Record<string, string> = {};\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value === true) {\n processedAttrs[key] = '';\n } else if (value !== false && value != null) {\n processedAttrs[key] = String(value);\n }\n }\n }\n\n return {\n type: 'element',\n tag,\n attrs: processedAttrs,\n children: children ?? [],\n };\n}\n\n/**\n * Create an SSR text node.\n */\nexport function ssrText(content: string): SSRText {\n return { type: 'text', content };\n}\n\n/**\n * Create a raw HTML SSR node (no escaping).\n */\nexport function ssrRaw(html: string): SSRRaw {\n return { type: 'raw', html };\n}\n\n// --- Serialization ---\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 * Serialize an SSR node tree to an HTML string.\n */\nexport function nodeToHtml(node: SSRNode): string {\n switch (node.type) {\n case 'text':\n return escapeHtml(node.content);\n\n case 'raw':\n return node.html;\n\n case 'element': {\n const { tag, attrs, children } = node;\n let html = `<${tag}`;\n\n for (const [key, value] of Object.entries(attrs)) {\n if (value === '') {\n html += ` ${key}`;\n } else {\n html += ` ${key}=\"${escapeHtml(value)}\"`;\n }\n }\n\n if (VOID_ELEMENTS.has(tag)) {\n html += ' />';\n return html;\n }\n\n html += '>';\n\n for (const child of children) {\n html += nodeToHtml(child);\n }\n\n html += `</${tag}>`;\n return html;\n }\n }\n}\n\n/**\n * Render a tree of SSR nodes (convenience for arrays).\n */\nexport function renderNodes(nodes: SSRNode[]): string {\n return nodes.map(nodeToHtml).join('');\n}\n"]}