@oomfware/jsx 0.1.5 → 0.1.7

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/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as SVGAttributes, c as JSXElement, i as JSX, l as JSXNode, o as Component, r as HTMLAttributes, s as FC, t as Fragment } from "./jsx-runtime-CcUWZKzW.mjs";
1
+ import { a as JSX, c as FC, i as HTMLAttributes, l as JSXElement, o as SVGAttributes, r as ClassValue, s as Component, t as Fragment, u as JSXNode } from "./jsx-runtime-DNOsJEgZ.mjs";
2
2
 
3
3
  //#region src/lib/create-element.d.ts
4
4
 
@@ -134,5 +134,5 @@ declare function renderToString(node: JSXNode, options?: RenderOptions): Promise
134
134
  */
135
135
  declare function render(node: JSXNode, init?: ResponseInit): Response;
136
136
  //#endregion
137
- export { type Component, type Context, ErrorBoundary, type ErrorBoundaryProps, type FC, Fragment, type HTMLAttributes, type JSX, type JSXElement, type JSXNode, type RenderOptions, type SVGAttributes, Suspense, type SuspenseProps, cloneElement, createContext, createElement, createElement as h, render, renderToStream, renderToString, use };
137
+ export { type ClassValue, type Component, type Context, ErrorBoundary, type ErrorBoundaryProps, type FC, Fragment, type HTMLAttributes, type JSX, type JSXElement, type JSXNode, type RenderOptions, type SVGAttributes, Suspense, type SuspenseProps, cloneElement, createContext, createElement, createElement as h, render, renderToStream, renderToString, use };
138
138
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -334,9 +334,28 @@ function renderAttributes(props) {
334
334
  const value = props[key];
335
335
  if (value === void 0 || value === null || value === false) continue;
336
336
  if (typeof value === "function") continue;
337
- if (key === "style" && typeof value === "object") {
338
- const styleStr = serializeStyle(value);
339
- if (styleStr) attrs += ` style="${escapeHtml(styleStr, true)}"`;
337
+ if (key === "class") {
338
+ if (!Array.isArray(value)) {
339
+ attrs = ` class="${escapeHtml(value, true)}"`;
340
+ continue;
341
+ }
342
+ const len = value.length;
343
+ let idx = 0;
344
+ let str = "";
345
+ let val;
346
+ for (; idx < len; idx++) if (val = value[idx]) str = str ? str + " " + val : val;
347
+ if (str) attrs += ` class="${escapeHtml(str, true)}"`;
348
+ continue;
349
+ }
350
+ if (key === "style") {
351
+ if (typeof value !== "object") {
352
+ attrs += ` style="${escapeHtml(value, true)}"`;
353
+ continue;
354
+ }
355
+ let str = "";
356
+ let val;
357
+ for (const key$1 in value) if ((val = value[key$1]) != null) str = str ? str + "; " + key$1 + ":" + val : key$1 + ":" + val;
358
+ if (str) attrs += ` style="${escapeHtml(str, true)}"`;
340
359
  continue;
341
360
  }
342
361
  if (value === true) attrs += ` ${key}`;
@@ -344,14 +363,6 @@ function renderAttributes(props) {
344
363
  }
345
364
  return attrs;
346
365
  }
347
- function serializeStyle(style) {
348
- const parts = [];
349
- for (const [key, value] of Object.entries(style)) {
350
- if (value == null) continue;
351
- parts.push(`${key}:${value}`);
352
- }
353
- return parts.join(";");
354
- }
355
366
  function buildComponentSegment(type, props, ctx, path) {
356
367
  const result = type(props);
357
368
  const hadFrame = pushContextFrame();
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["finalProps: Record<string, unknown>","activeRenderContext: RenderContext | null","context: Context<T | undefined>","context: RenderContext","parts: Segment[]","parts: string[]","seg: Segment","asyncCtx: RenderContext","resolvedSegment: Segment"],"sources":["../src/lib/create-element.ts","../src/lib/render-context.ts","../src/lib/context.ts","../src/lib/suspense.ts","../src/lib/render.ts"],"sourcesContent":["import type { JSX } from './intrinsic-elements.ts';\nimport type { Component, JSXElement, JSXNode } from './types.ts';\n\n// #region createElement\n\n/**\n * creates a JSX element for an intrinsic element\n * @param type element tag name\n * @param props element properties\n * @param children child elements\n * @returns JSX element\n */\nexport function createElement<T extends keyof JSX.IntrinsicElements>(\n\ttype: T,\n\tprops?: JSX.IntrinsicElements[T] | null,\n\t...children: JSXNode[]\n): JSXElement<JSX.IntrinsicElements[T], T>;\n\n/**\n * creates a JSX element for a function component\n * @param type component function\n * @param props component properties\n * @param children child elements\n * @returns JSX element\n */\nexport function createElement<P extends {}>(\n\ttype: Component<P>,\n\tprops?: P | null,\n\t...children: JSXNode[]\n): JSXElement<P, Component<P>>;\n\n/**\n * creates a JSX element (classic API)\n * @param type element tag name or component function\n * @param props element properties\n * @param children child elements\n * @returns JSX element\n */\nexport function createElement<P extends {}>(\n\ttype: string | Component<P>,\n\tprops?: P | null,\n\t...children: JSXNode[]\n): JSXElement<P>;\n\nexport function createElement(\n\ttype: string | Component<any>,\n\tprops?: Record<string, unknown> | null,\n\t...children: JSXNode[]\n): JSXElement {\n\tconst finalProps: Record<string, unknown> = { ...props };\n\n\tif (children.length === 1) {\n\t\tfinalProps.children = children[0];\n\t} else if (children.length > 1) {\n\t\tfinalProps.children = children;\n\t}\n\n\treturn { type, props: finalProps };\n}\n\n// #endregion\n\n// #region cloneElement\n\n/**\n * clones a JSX element for an intrinsic element with new props\n * @param element element to clone\n * @param props props to merge (overrides original)\n * @param children children to replace (if provided)\n * @returns cloned JSX element\n */\nexport function cloneElement<T extends keyof JSX.IntrinsicElements>(\n\telement: JSXElement<JSX.IntrinsicElements[T], T>,\n\tprops?: Partial<JSX.IntrinsicElements[T]> | null,\n\t...children: JSXNode[]\n): JSXElement<JSX.IntrinsicElements[T], T>;\n\n/**\n * clones a JSX element for a function component with new props\n * @param element element to clone\n * @param props props to merge (overrides original)\n * @param children children to replace (if provided)\n * @returns cloned JSX element\n */\nexport function cloneElement<P>(\n\telement: JSXElement<P, Component<P>>,\n\tprops?: Partial<P> | null,\n\t...children: JSXNode[]\n): JSXElement<P, Component<P>>;\n\n/**\n * clones a JSX element with new props\n * @param element element to clone\n * @param props props to merge (overrides original)\n * @param children children to replace (if provided)\n * @returns cloned JSX element\n */\nexport function cloneElement<P>(\n\telement: JSXElement<P>,\n\tprops?: Partial<P> | null,\n\t...children: JSXNode[]\n): JSXElement<P>;\n\nexport function cloneElement(\n\telement: JSXElement,\n\tprops?: Record<string, unknown> | null,\n\t...children: JSXNode[]\n): JSXElement {\n\tconst finalProps: Record<string, unknown> = { ...(element.props as Record<string, unknown>), ...props };\n\n\tif (children.length === 1) {\n\t\tfinalProps.children = children[0];\n\t} else if (children.length > 1) {\n\t\tfinalProps.children = children;\n\t}\n\n\treturn { type: element.type, props: finalProps };\n}\n\n// #endregion\n","import type { Context } from './context.ts';\nimport type { JSXNode } from './types.ts';\n\n/** stack of context frames */\ntype ContextFrame = Map<Context<unknown>, unknown>;\n\n// #region Segment types\n\nexport type Segment =\n\t| {\n\t\t\treadonly kind: 'static';\n\t\t\treadonly html: string;\n\t }\n\t| {\n\t\t\treadonly kind: 'composite';\n\t\t\treadonly parts: readonly Segment[];\n\t }\n\t| {\n\t\t\treadonly kind: 'suspense';\n\t\t\treadonly id: string;\n\t\t\treadonly fallback: Segment;\n\t\t\tpending?: Promise<void>;\n\t\t\tcontent: Segment | null;\n\t }\n\t| {\n\t\t\treadonly kind: 'error-boundary';\n\t\t\treadonly children: Segment;\n\t\t\treadonly fallbackFn: (error: unknown) => JSXNode;\n\t\t\treadonly renderContext: RenderContext;\n\t\t\treadonly path: string;\n\t\t\tfallbackSegment: Segment | null;\n\t };\n\n// #endregion\n\n/** render context passed through the render tree */\nexport interface RenderContext {\n\tcontextStack: ContextFrame[];\n\tcurrentFrame: ContextFrame | null;\n\theadElements: string[];\n\tidsByPath: Map<string, number>;\n\tinsideHead: boolean;\n\tinsideSvg: boolean;\n\tonError: (error: unknown) => void;\n\tpendingSuspense: Array<{ id: string; promise: Promise<Segment> }>;\n}\n\n/** active render context (set by renderer) */\nlet activeRenderContext: RenderContext | null = null;\n\n/**\n * sets the active render context\n * @param ctx render context to activate, or null to clear\n * @returns the previous render context\n */\nexport function setActiveRenderContext(ctx: RenderContext | null): RenderContext | null {\n\tconst prev = activeRenderContext;\n\tactiveRenderContext = ctx;\n\treturn prev;\n}\n\n/**\n * provides a value for the context during the current component's render\n * @param context context key from createContext()\n * @param value value to provide\n */\nexport function provide<T>(context: Context<T>, value: T): void {\n\tconst ctx = activeRenderContext!;\n\tif (!ctx.currentFrame) {\n\t\t// lazily create frame, copying from previous\n\t\tconst prev = ctx.contextStack[ctx.contextStack.length - 1];\n\t\tctx.currentFrame = prev ? new Map(prev) : new Map();\n\t}\n\tctx.currentFrame.set(context as Context<unknown>, value);\n}\n\n/**\n * returns current provided value, or the default value\n * @param context context key from createContext()\n */\nexport function inject<T>(context: Context<T>): T {\n\tconst ctx = activeRenderContext!;\n\t// check current frame first, then stack\n\tconst frame = ctx.currentFrame ?? ctx.contextStack[ctx.contextStack.length - 1];\n\tif (frame?.has(context as Context<unknown>)) {\n\t\treturn frame.get(context as Context<unknown>) as T;\n\t}\n\treturn context.defaultValue;\n}\n\n/**\n * pushes current frame to stack (called before rendering children)\n * @returns whether a frame was pushed (needed for popContextFrame)\n */\nexport function pushContextFrame(): boolean {\n\tconst ctx = activeRenderContext!;\n\tif (ctx.currentFrame) {\n\t\tctx.contextStack.push(ctx.currentFrame);\n\t\tctx.currentFrame = null;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * pops context frame (called after rendering children)\n * @param hadFrame whether pushContextFrame returned true\n */\nexport function popContextFrame(hadFrame: boolean): void {\n\tconst ctx = activeRenderContext!;\n\tif (hadFrame) {\n\t\tctx.contextStack.pop();\n\t}\n\tctx.currentFrame = null;\n}\n","import { Fragment, jsx } from '../jsx-runtime.ts';\n\nimport { provide } from './render-context.ts';\nimport type { JSXElement, JSXNode } from './types.ts';\n\n/** context object returned by createContext() */\nexport interface Context<T> {\n\tdefaultValue: T;\n\tProvider: (props: { value: T; children?: JSXNode }) => JSXElement;\n}\n\n/** internal provider props */\ninterface ProviderProps<T> {\n\tcontext: Context<T>;\n\tvalue: T;\n\tchildren?: JSXNode;\n}\n\n/** internal provider component */\nfunction Provider<T>({ context, value, children }: ProviderProps<T>): JSXElement {\n\tprovide(context, value);\n\treturn jsx(Fragment, { children });\n}\n\n/**\n * creates a context with a Provider component\n * @param defaultValue value returned by use() when no Provider is above\n * @example\n * const ThemeContext = createContext('light');\n *\n * <ThemeContext.Provider value=\"dark\">\n * <App />\n * </ThemeContext.Provider>\n *\n * function App() {\n * const theme = use(ThemeContext);\n * return <div>{theme}</div>;\n * }\n */\nexport function createContext<T>(defaultValue: T): Context<T>;\nexport function createContext<T>(): Context<T | undefined>;\nexport function createContext<T>(defaultValue?: T): Context<T | undefined> {\n\tconst context: Context<T | undefined> = {\n\t\tdefaultValue,\n\t\tProvider: ({ value, children }) => Provider({ context, value, children }),\n\t};\n\n\treturn context;\n}\n","import { Fragment, jsx } from '../jsx-runtime.js';\n\nimport type { Context } from './context.js';\nimport { inject } from './render-context.js';\nimport type { JSXElement, JSXNode } from './types.js';\n\nexport interface SuspenseProps {\n\tfallback: JSXNode;\n\tchildren?: JSXNode;\n}\n\n/**\n * suspense boundary - renders fallback while children are suspended\n */\nexport function Suspense({ children }: SuspenseProps): JSXElement {\n\t// Suspense is handled specially in buildSegment, this is just for typing\n\treturn jsx(Fragment, { children });\n}\n\nexport interface ErrorBoundaryProps {\n\tfallback: (error: unknown) => JSXNode;\n\tchildren?: JSXNode;\n}\n\n/**\n * error boundary - catches render errors and displays fallback\n */\nexport function ErrorBoundary({ children }: ErrorBoundaryProps): JSXElement {\n\t// ErrorBoundary is handled specially in buildSegment, this is just for typing\n\treturn jsx(Fragment, { children });\n}\n\n/** cache for resolved/rejected promise values */\nconst promiseCache = new WeakMap<\n\tPromise<unknown>,\n\t{ resolved: true; value: unknown } | { resolved: false; error: unknown }\n>();\n\nfunction isContext<T>(value: unknown): value is Context<T> {\n\treturn typeof value === 'object' && value !== null && 'defaultValue' in value && 'Provider' in value;\n}\n\n/**\n * reads a context value or suspends until a promise resolves\n * @param usable context or promise\n * @returns context value or resolved promise value\n * @throws promise if not yet resolved, or error if rejected\n */\nexport function use<T>(usable: Context<T>): T;\nexport function use<T>(usable: Promise<T>): T;\nexport function use<T>(usable: Context<T> | Promise<T>): T {\n\t// context\n\tif (isContext<T>(usable)) {\n\t\treturn inject(usable);\n\t}\n\t// promise\n\tconst cached = promiseCache.get(usable);\n\tif (cached) {\n\t\tif (cached.resolved) {\n\t\t\treturn cached.value as T;\n\t\t} else {\n\t\t\tthrow cached.error;\n\t\t}\n\t}\n\t// not cached yet - set up caching and throw\n\tusable.then(\n\t\t(value) => promiseCache.set(usable, { resolved: true, value }),\n\t\t(error) => promiseCache.set(usable, { resolved: false, error }),\n\t);\n\tthrow usable;\n}\n","/**\n * streaming JSX renderer\n *\n * architecture:\n * - segment tree: we build a tree of segments (static text, composites, suspense\n * boundaries) then serialize to HTML\n * - suspense: components can throw promises via use(), caught at Suspense boundaries\n * which render fallback immediately and stream resolved content later\n * - head hoisting: <title>, <meta>, <link>, <style> found outside <head> are\n * collected and injected into <head> during finalization\n */\n\nimport { decodeUtf8From, encodeUtf8 } from '@atcute/uint8array';\n\nimport { Fragment } from '../jsx-runtime.ts';\n\nimport {\n\tpopContextFrame,\n\tpushContextFrame,\n\ttype RenderContext,\n\ttype Segment,\n\tsetActiveRenderContext,\n} from './render-context.ts';\nimport { ErrorBoundary, type ErrorBoundaryProps, Suspense, type SuspenseProps } from './suspense.ts';\nimport type { Component, JSXElement, JSXNode } from './types.ts';\n\nconst HEAD_ELEMENTS = new Set(['title', 'meta', 'link', 'style']);\nconst MAX_SUSPENSE_ATTEMPTS = 20;\nconst SELF_CLOSING_TAGS = new Set([\n\t'area',\n\t'base',\n\t'br',\n\t'col',\n\t'embed',\n\t'hr',\n\t'img',\n\t'input',\n\t'link',\n\t'meta',\n\t'param',\n\t'source',\n\t'track',\n\t'wbr',\n]);\n/** props that shouldn't be rendered as HTML attributes */\nconst FRAMEWORK_PROPS = new Set(['children', 'dangerouslySetInnerHTML']);\n\n// #region Segment helpers\n\nfunction staticSeg(html: string): Segment {\n\treturn { kind: 'static', html };\n}\n\nfunction compositeSeg(parts: Segment[]): Segment {\n\treturn { kind: 'composite', parts };\n}\n\nconst EMPTY_SEGMENT = staticSeg('');\n\n// #endregion\n\nexport interface RenderOptions {\n\tonError?: (error: unknown) => void;\n}\n\n/**\n * renders JSX to a readable stream\n * @param node JSX node to render\n * @param options render options\n * @returns readable stream of UTF-8 encoded HTML\n */\nexport function renderToStream(node: JSXNode, options?: RenderOptions): ReadableStream<Uint8Array> {\n\tconst onError = options?.onError ?? ((error) => console.error(error));\n\tconst context: RenderContext = {\n\t\tcontextStack: [],\n\t\tcurrentFrame: null,\n\t\theadElements: [],\n\t\tidsByPath: new Map(),\n\t\tinsideHead: false,\n\t\tinsideSvg: false,\n\t\tonError,\n\t\tpendingSuspense: [],\n\t};\n\n\treturn new ReadableStream({\n\t\tasync start(controller) {\n\t\t\ttry {\n\t\t\t\tconst root = buildSegment(node, context, '');\n\t\t\t\tawait resolveBlocking(root);\n\n\t\t\t\tconst html = serializeSegment(root);\n\t\t\t\tconst finalHtml = finalizeHtml(html, context);\n\t\t\t\tcontroller.enqueue(encodeUtf8(finalHtml));\n\n\t\t\t\t// stream pending suspense boundaries as they resolve\n\t\t\t\tif (context.pendingSuspense.length > 0) {\n\t\t\t\t\tawait streamPendingSuspense(context, controller);\n\t\t\t\t}\n\n\t\t\t\tcontroller.close();\n\t\t\t} catch (error) {\n\t\t\t\tonError(error);\n\t\t\t\tcontroller.error(error);\n\t\t\t}\n\t\t},\n\t});\n}\n\n/**\n * renders JSX to a string (non-streaming)\n * @param node JSX node to render\n * @param options render options\n * @returns promise resolving to HTML string\n */\nexport async function renderToString(node: JSXNode, options?: RenderOptions): Promise<string> {\n\tconst stream = renderToStream(node, options);\n\tconst reader = stream.getReader();\n\n\tlet html = '';\n\twhile (true) {\n\t\tconst { done, value } = await reader.read();\n\t\tif (done) {\n\t\t\tbreak;\n\t\t}\n\n\t\thtml += decodeUtf8From(value);\n\t}\n\n\treturn html;\n}\n\n/**\n * renders JSX to a streaming Response\n * @param node JSX node to render\n * @param init optional ResponseInit (status, headers, etc.)\n * @returns Response with streaming HTML body\n */\nexport function render(node: JSXNode, init?: ResponseInit): Response {\n\tconst stream = renderToStream(node);\n\n\t// @ts-expect-error: not sure why.\n\tconst headers = new Headers(init?.headers);\n\tif (!headers.has('Content-Type')) {\n\t\theaders.set('Content-Type', 'text/html; charset=utf-8');\n\t}\n\n\treturn new Response(stream, { ...init, headers });\n}\n\n// #region Segment building\n\nfunction isJSXElement(node: unknown): node is JSXElement {\n\treturn typeof node === 'object' && node !== null && 'type' in node && 'props' in node;\n}\n\nfunction isHeadElement(tag: string): boolean {\n\treturn HEAD_ELEMENTS.has(tag);\n}\n\nfunction buildSegment(node: JSXNode, ctx: RenderContext, path: string): Segment {\n\tconst prev = setActiveRenderContext(ctx);\n\ttry {\n\t\treturn buildSegmentInner(node, ctx, path);\n\t} finally {\n\t\tsetActiveRenderContext(prev);\n\t}\n}\n\nfunction buildSegmentInner(node: JSXNode, context: RenderContext, path: string): Segment {\n\t// primitives\n\tif (typeof node === 'string' || typeof node === 'number' || typeof node === 'bigint') {\n\t\treturn staticSeg(escapeHtml(node, false));\n\t}\n\tif (node === null || node === undefined || typeof node === 'boolean') {\n\t\treturn EMPTY_SEGMENT;\n\t}\n\t// iterables (arrays, generators, etc.)\n\tif (typeof node === 'object' && Symbol.iterator in node) {\n\t\tconst parts: Segment[] = [];\n\t\tfor (const child of node) {\n\t\t\tparts.push(buildSegmentInner(child, context, path));\n\t\t}\n\t\treturn compositeSeg(parts);\n\t}\n\t// JSX elements\n\tif (isJSXElement(node)) {\n\t\tconst { type, props } = node;\n\t\t// Fragment\n\t\tif (type === Fragment) {\n\t\t\tconst children = (props as { children?: JSXNode }).children;\n\t\t\treturn children != null ? buildSegmentInner(children, context, path) : EMPTY_SEGMENT;\n\t\t}\n\t\t// intrinsic elements (HTML tags)\n\t\tif (typeof type === 'string') {\n\t\t\tconst tag = type;\n\n\t\t\tif (tag === 'head') {\n\t\t\t\treturn buildHeadElementSegment(tag, props as Record<string, unknown>, context, path);\n\t\t\t}\n\n\t\t\tif (!context.insideHead && isHeadElement(tag)) {\n\t\t\t\t// hoist to <head>\n\t\t\t\tconst elementSeg = buildElementSegment(tag, props as Record<string, unknown>, context, path);\n\t\t\t\tcontext.headElements.push(serializeSegment(elementSeg));\n\t\t\t\treturn EMPTY_SEGMENT;\n\t\t\t}\n\n\t\t\treturn buildElementSegment(tag, props as Record<string, unknown>, context, path);\n\t\t}\n\t\t// function components\n\t\tif (typeof type === 'function') {\n\t\t\t// Suspense boundary\n\t\t\tif (type === Suspense) {\n\t\t\t\treturn buildSuspenseSegment(props as unknown as SuspenseProps, context, path);\n\t\t\t}\n\t\t\t// ErrorBoundary\n\t\t\tif (type === ErrorBoundary) {\n\t\t\t\treturn buildErrorBoundarySegment(props as unknown as ErrorBoundaryProps, context, path);\n\t\t\t}\n\t\t\treturn buildComponentSegment(type, props as Record<string, unknown>, context, path);\n\t\t}\n\t}\n\treturn EMPTY_SEGMENT;\n}\n\n// #endregion\n\n// #region Element building\n\nfunction buildElementSegment(\n\ttag: string,\n\tprops: Record<string, unknown>,\n\tcontext: RenderContext,\n\tpath: string,\n): Segment {\n\tconst currentIsSvg = context.insideSvg || tag === 'svg';\n\tconst attrs = renderAttributes(props);\n\t// self-closing tags\n\tif (SELF_CLOSING_TAGS.has(tag)) {\n\t\treturn staticSeg(`<${tag}${attrs}>`);\n\t}\n\t// dangerouslySetInnerHTML\n\tconst innerHTML = props.dangerouslySetInnerHTML as { __html: string } | undefined;\n\tif (innerHTML) {\n\t\treturn staticSeg(`<${tag}${attrs}>${innerHTML.__html}</${tag}>`);\n\t}\n\t// normal element with children\n\tconst open = staticSeg(`<${tag}${attrs}>`);\n\tconst previousInsideSvg = context.insideSvg;\n\tcontext.insideSvg = tag === 'foreignObject' ? false : currentIsSvg;\n\tconst children =\n\t\tprops.children != null ? buildSegment(props.children as JSXNode, context, path) : EMPTY_SEGMENT;\n\tcontext.insideSvg = previousInsideSvg;\n\tconst close = staticSeg(`</${tag}>`);\n\treturn compositeSeg([open, children, close]);\n}\n\nfunction buildHeadElementSegment(\n\ttag: string,\n\tprops: Record<string, unknown>,\n\tcontext: RenderContext,\n\tpath: string,\n): Segment {\n\tconst attrs = renderAttributes(props);\n\tconst previousInsideHead = context.insideHead;\n\tcontext.insideHead = true;\n\tconst open = staticSeg(`<${tag}${attrs}>`);\n\tconst children =\n\t\tprops.children != null ? buildSegment(props.children as JSXNode, context, path) : EMPTY_SEGMENT;\n\tcontext.insideHead = previousInsideHead;\n\tconst close = staticSeg(`</${tag}>`);\n\treturn compositeSeg([open, children, close]);\n}\n\nfunction renderAttributes(props: Record<string, unknown>): string {\n\tlet attrs = '';\n\tfor (const key in props) {\n\t\tif (FRAMEWORK_PROPS.has(key)) continue;\n\t\tconst value = props[key];\n\t\tif (value === undefined || value === null || value === false) continue;\n\t\tif (typeof value === 'function') continue;\n\t\t// style object -> string\n\t\tif (key === 'style' && typeof value === 'object') {\n\t\t\tconst styleStr = serializeStyle(value as Record<string, string | number>);\n\t\t\tif (styleStr) {\n\t\t\t\tattrs += ` style=\"${escapeHtml(styleStr, true)}\"`;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (value === true) {\n\t\t\tattrs += ` ${key}`;\n\t\t} else {\n\t\t\tattrs += ` ${key}=\"${escapeHtml(value, true)}\"`;\n\t\t}\n\t}\n\treturn attrs;\n}\n\nfunction serializeStyle(style: Record<string, string | number>): string {\n\tconst parts: string[] = [];\n\tfor (const [key, value] of Object.entries(style)) {\n\t\tif (value == null) continue;\n\t\tparts.push(`${key}:${value}`);\n\t}\n\treturn parts.join(';');\n}\n\n// #endregion\n\n// #region Component building\n\nfunction buildComponentSegment(\n\ttype: Component,\n\tprops: Record<string, unknown>,\n\tctx: RenderContext,\n\tpath: string,\n): Segment {\n\t// call component\n\tconst result = type(props);\n\t// if component called provide(), push frame before rendering children\n\tconst hadFrame = pushContextFrame();\n\ttry {\n\t\treturn buildSegmentInner(result, ctx, path);\n\t} finally {\n\t\tpopContextFrame(hadFrame);\n\t}\n}\n\nfunction buildSuspenseSegment(props: SuspenseProps, ctx: RenderContext, path: string): Segment {\n\t// generate unique id for this suspense boundary\n\tconst nextIndex = (ctx.idsByPath.get(path) ?? 0) + 1;\n\tctx.idsByPath.set(path, nextIndex);\n\tconst id = path ? `${path}-${nextIndex}` : `${nextIndex}`;\n\tconst suspenseId = `s${id}`;\n\n\ttry {\n\t\t// try to render children synchronously\n\t\tconst content = buildSegment(props.children, ctx, suspenseId);\n\t\t// no suspension - return content directly (no boundary needed)\n\t\treturn content;\n\t} catch (thrown) {\n\t\t// check if it's a promise (suspension)\n\t\tif (thrown instanceof Promise) {\n\t\t\t// render fallback\n\t\t\tconst fallback = buildSegment(props.fallback, ctx, suspenseId);\n\n\t\t\t// create suspense segment\n\t\t\tconst seg: Segment = {\n\t\t\t\tkind: 'suspense',\n\t\t\t\tid: suspenseId,\n\t\t\t\tfallback,\n\t\t\t\tcontent: null,\n\t\t\t};\n\n\t\t\t// snapshot context stack for async re-render (parent frames will be popped\n\t\t\t// by the time the promise resolves)\n\t\t\tconst asyncCtx: RenderContext = {\n\t\t\t\t...ctx,\n\t\t\t\tcontextStack: [...ctx.contextStack],\n\t\t\t\tcurrentFrame: null,\n\t\t\t};\n\n\t\t\t// re-render function that handles subsequent promise throws\n\t\t\tconst rerender = (attempt: number): Promise<void> | void => {\n\t\t\t\tif (attempt >= MAX_SUSPENSE_ATTEMPTS) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`suspense boundary exceeded maximum retry attempts (${MAX_SUSPENSE_ATTEMPTS})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tseg.content = buildSegment(props.children, asyncCtx, suspenseId);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (err instanceof Promise) {\n\t\t\t\t\t\t// component threw another promise - wait and retry\n\t\t\t\t\t\treturn err.then(() => rerender(attempt + 1));\n\t\t\t\t\t}\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// set up promise to re-render children when resolved\n\t\t\tconst pending = thrown.then(() => rerender(1));\n\t\t\tseg.pending = pending;\n\n\t\t\t// track for streaming\n\t\t\tconst tracked = pending.then(() => seg.content!);\n\t\t\ttracked.catch(() => {}); // prevent unhandled rejection if resolveBlocking catches first\n\t\t\tctx.pendingSuspense.push({ id: suspenseId, promise: tracked });\n\n\t\t\treturn seg;\n\t\t}\n\t\t// not a promise - re-throw\n\t\tthrow thrown;\n\t}\n}\n\nfunction buildErrorBoundarySegment(\n\tprops: ErrorBoundaryProps,\n\tctx: RenderContext,\n\tpath: string,\n): Segment {\n\t// snapshot context for potential async fallback rendering\n\tconst asyncCtx: RenderContext = {\n\t\t...ctx,\n\t\tcontextStack: [...ctx.contextStack],\n\t\tcurrentFrame: null,\n\t};\n\n\ttry {\n\t\tconst children = buildSegment(props.children, ctx, path);\n\t\treturn {\n\t\t\tkind: 'error-boundary',\n\t\t\tchildren,\n\t\t\tfallbackFn: props.fallback,\n\t\t\trenderContext: asyncCtx,\n\t\t\tpath,\n\t\t\tfallbackSegment: null,\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof Promise) {\n\t\t\tthrow error; // let Suspense handle it\n\t\t}\n\t\t// sync error - render fallback immediately\n\t\treturn buildSegment(props.fallback(error), ctx, path);\n\t}\n}\n\n// #endregion\n\n// #region Serialization\n\n/** resolve all blocking suspense boundaries and error boundaries */\nasync function resolveBlocking(segment: Segment): Promise<void> {\n\tif (segment.kind === 'suspense') {\n\t\tif (segment.pending) {\n\t\t\tawait segment.pending;\n\t\t\tsegment.pending = undefined;\n\t\t}\n\t\tif (segment.content) {\n\t\t\tawait resolveBlocking(segment.content);\n\t\t}\n\t\treturn;\n\t}\n\tif (segment.kind === 'error-boundary') {\n\t\ttry {\n\t\t\tawait resolveBlocking(segment.children);\n\t\t} catch (error) {\n\t\t\tsegment.fallbackSegment = buildSegment(\n\t\t\t\tsegment.fallbackFn(error),\n\t\t\t\tsegment.renderContext,\n\t\t\t\tsegment.path,\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\tif (segment.kind === 'composite') {\n\t\tfor (const part of segment.parts) {\n\t\t\tawait resolveBlocking(part);\n\t\t}\n\t}\n}\n\n/** serialize segment tree to HTML string */\nfunction serializeSegment(seg: Segment): string {\n\tif (seg.kind === 'static') {\n\t\treturn seg.html;\n\t}\n\tif (seg.kind === 'composite') {\n\t\treturn seg.parts.map(serializeSegment).join('');\n\t}\n\tif (seg.kind === 'error-boundary') {\n\t\treturn serializeSegment(seg.fallbackSegment ?? seg.children);\n\t}\n\t// suspense - always render fallback; resolved content streams in template\n\treturn `<!--$s:${seg.id}-->${serializeSegment(seg.fallback)}<!--/$s:${seg.id}-->`;\n}\n\n// #endregion\n\n// #region Streaming\n\n/** suspense runtime function name */\nconst SR = '$sr';\n/** suspense runtime - injected once, swaps template content with fallback */\nconst SUSPENSE_RUNTIME = `<script>${SR}=(t,i,s,e)=>{i=\"$s:\"+t.dataset.suspense;s=document.createTreeWalker(document,128);while(e=s.nextNode())if(e.data===i){while(e.nextSibling?.data!==\"/\"+i)e.nextSibling.remove();e.nextSibling.replaceWith(...t.content.childNodes);e.remove();break}t.remove()}</script>`;\n\nasync function streamPendingSuspense(\n\tcontext: RenderContext,\n\tcontroller: ReadableStreamDefaultController<Uint8Array>,\n): Promise<void> {\n\tcontroller.enqueue(encodeUtf8(SUSPENSE_RUNTIME));\n\n\twhile (true) {\n\t\tconst batch = context.pendingSuspense;\n\t\tif (batch.length === 0) {\n\t\t\tbreak;\n\t\t}\n\t\tcontext.pendingSuspense = [];\n\n\t\tawait Promise.all(\n\t\t\tbatch.map(async ({ id, promise }) => {\n\t\t\t\tlet resolvedSegment: Segment;\n\t\t\t\ttry {\n\t\t\t\t\tresolvedSegment = await promise;\n\t\t\t\t} catch {\n\t\t\t\t\t// promise rejected - error was caught by an error boundary\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait resolveBlocking(resolvedSegment);\n\n\t\t\t\t\tconst html = serializeSegment(resolvedSegment);\n\n\t\t\t\t\tcontroller.enqueue(\n\t\t\t\t\t\tencodeUtf8(\n\t\t\t\t\t\t\t`<template data-suspense=\"${id}\">${html}</template>` +\n\t\t\t\t\t\t\t\t`<script>${SR}(document.currentScript.previousElementSibling)</script>`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcontext.onError(error);\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t}\n}\n\n// #endregion\n\n// #region Utilities\n\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n\nfunction escapeHtml(value: unknown, isAttr: boolean): string {\n\tconst str = String(value ?? '');\n\tconst pattern = isAttr ? ATTR_REGEX : CONTENT_REGEX;\n\tpattern.lastIndex = 0;\n\n\tlet escaped = '';\n\tlet last = 0;\n\n\twhile (pattern.test(str)) {\n\t\tconst i = pattern.lastIndex - 1;\n\t\tconst ch = str[i];\n\t\tescaped += str.substring(last, i) + (ch === '&' ? '&amp;' : ch === '\"' ? '&quot;' : '&lt;');\n\t\tlast = i + 1;\n\t}\n\n\treturn escaped + str.substring(last);\n}\n\nfunction finalizeHtml(html: string, context: RenderContext): string {\n\tconst hasHtmlRoot = html.trimStart().toLowerCase().startsWith('<html');\n\t// inject hoisted head elements\n\tif (context.headElements.length > 0) {\n\t\tconst headContent = context.headElements.join('');\n\t\tif (hasHtmlRoot) {\n\t\t\tconst headCloseIndex = html.indexOf('</head>');\n\t\t\tif (headCloseIndex !== -1) {\n\t\t\t\t// inject before existing </head>\n\t\t\t\thtml = html.slice(0, headCloseIndex) + headContent + html.slice(headCloseIndex);\n\t\t\t} else {\n\t\t\t\t// no existing head, inject after <html>\n\t\t\t\tconst htmlOpenMatch = html.match(/<html[^>]*>/);\n\t\t\t\tif (htmlOpenMatch && htmlOpenMatch.index !== undefined) {\n\t\t\t\t\tconst insertIndex = htmlOpenMatch.index + htmlOpenMatch[0].length;\n\t\t\t\t\thtml = html.slice(0, insertIndex) + `<head>${headContent}</head>` + html.slice(insertIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// no HTML root, prepend head\n\t\t\thtml = `<head>${headContent}</head>${html}`;\n\t\t}\n\t}\n\tif (hasHtmlRoot) {\n\t\thtml = '<!doctype html>' + html;\n\t}\n\treturn html;\n}\n\n// #endregion\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["key"],"sources":["../src/lib/create-element.ts","../src/lib/render-context.ts","../src/lib/context.ts","../src/lib/suspense.ts","../src/lib/render.ts"],"sourcesContent":["import type { JSX } from './intrinsic-elements.ts';\nimport type { Component, JSXElement, JSXNode } from './types.ts';\n\n// #region createElement\n\n/**\n * creates a JSX element for an intrinsic element\n * @param type element tag name\n * @param props element properties\n * @param children child elements\n * @returns JSX element\n */\nexport function createElement<T extends keyof JSX.IntrinsicElements>(\n\ttype: T,\n\tprops?: JSX.IntrinsicElements[T] | null,\n\t...children: JSXNode[]\n): JSXElement<JSX.IntrinsicElements[T], T>;\n\n/**\n * creates a JSX element for a function component\n * @param type component function\n * @param props component properties\n * @param children child elements\n * @returns JSX element\n */\nexport function createElement<P extends {}>(\n\ttype: Component<P>,\n\tprops?: P | null,\n\t...children: JSXNode[]\n): JSXElement<P, Component<P>>;\n\n/**\n * creates a JSX element (classic API)\n * @param type element tag name or component function\n * @param props element properties\n * @param children child elements\n * @returns JSX element\n */\nexport function createElement<P extends {}>(\n\ttype: string | Component<P>,\n\tprops?: P | null,\n\t...children: JSXNode[]\n): JSXElement<P>;\n\nexport function createElement(\n\ttype: string | Component<any>,\n\tprops?: Record<string, unknown> | null,\n\t...children: JSXNode[]\n): JSXElement {\n\tconst finalProps: Record<string, unknown> = { ...props };\n\n\tif (children.length === 1) {\n\t\tfinalProps.children = children[0];\n\t} else if (children.length > 1) {\n\t\tfinalProps.children = children;\n\t}\n\n\treturn { type, props: finalProps };\n}\n\n// #endregion\n\n// #region cloneElement\n\n/**\n * clones a JSX element for an intrinsic element with new props\n * @param element element to clone\n * @param props props to merge (overrides original)\n * @param children children to replace (if provided)\n * @returns cloned JSX element\n */\nexport function cloneElement<T extends keyof JSX.IntrinsicElements>(\n\telement: JSXElement<JSX.IntrinsicElements[T], T>,\n\tprops?: Partial<JSX.IntrinsicElements[T]> | null,\n\t...children: JSXNode[]\n): JSXElement<JSX.IntrinsicElements[T], T>;\n\n/**\n * clones a JSX element for a function component with new props\n * @param element element to clone\n * @param props props to merge (overrides original)\n * @param children children to replace (if provided)\n * @returns cloned JSX element\n */\nexport function cloneElement<P>(\n\telement: JSXElement<P, Component<P>>,\n\tprops?: Partial<P> | null,\n\t...children: JSXNode[]\n): JSXElement<P, Component<P>>;\n\n/**\n * clones a JSX element with new props\n * @param element element to clone\n * @param props props to merge (overrides original)\n * @param children children to replace (if provided)\n * @returns cloned JSX element\n */\nexport function cloneElement<P>(\n\telement: JSXElement<P>,\n\tprops?: Partial<P> | null,\n\t...children: JSXNode[]\n): JSXElement<P>;\n\nexport function cloneElement(\n\telement: JSXElement,\n\tprops?: Record<string, unknown> | null,\n\t...children: JSXNode[]\n): JSXElement {\n\tconst finalProps: Record<string, unknown> = { ...(element.props as Record<string, unknown>), ...props };\n\n\tif (children.length === 1) {\n\t\tfinalProps.children = children[0];\n\t} else if (children.length > 1) {\n\t\tfinalProps.children = children;\n\t}\n\n\treturn { type: element.type, props: finalProps };\n}\n\n// #endregion\n","import type { Context } from './context.ts';\nimport type { JSXNode } from './types.ts';\n\n/** stack of context frames */\ntype ContextFrame = Map<Context<unknown>, unknown>;\n\n// #region Segment types\n\nexport type Segment =\n\t| {\n\t\t\treadonly kind: 'static';\n\t\t\treadonly html: string;\n\t }\n\t| {\n\t\t\treadonly kind: 'composite';\n\t\t\treadonly parts: readonly Segment[];\n\t }\n\t| {\n\t\t\treadonly kind: 'suspense';\n\t\t\treadonly id: string;\n\t\t\treadonly fallback: Segment;\n\t\t\tpending?: Promise<void>;\n\t\t\tcontent: Segment | null;\n\t }\n\t| {\n\t\t\treadonly kind: 'error-boundary';\n\t\t\treadonly children: Segment;\n\t\t\treadonly fallbackFn: (error: unknown) => JSXNode;\n\t\t\treadonly renderContext: RenderContext;\n\t\t\treadonly path: string;\n\t\t\tfallbackSegment: Segment | null;\n\t };\n\n// #endregion\n\n/** render context passed through the render tree */\nexport interface RenderContext {\n\tcontextStack: ContextFrame[];\n\tcurrentFrame: ContextFrame | null;\n\theadElements: string[];\n\tidsByPath: Map<string, number>;\n\tinsideHead: boolean;\n\tinsideSvg: boolean;\n\tonError: (error: unknown) => void;\n\tpendingSuspense: Array<{ id: string; promise: Promise<Segment> }>;\n}\n\n/** active render context (set by renderer) */\nlet activeRenderContext: RenderContext | null = null;\n\n/**\n * sets the active render context\n * @param ctx render context to activate, or null to clear\n * @returns the previous render context\n */\nexport function setActiveRenderContext(ctx: RenderContext | null): RenderContext | null {\n\tconst prev = activeRenderContext;\n\tactiveRenderContext = ctx;\n\treturn prev;\n}\n\n/**\n * provides a value for the context during the current component's render\n * @param context context key from createContext()\n * @param value value to provide\n */\nexport function provide<T>(context: Context<T>, value: T): void {\n\tconst ctx = activeRenderContext!;\n\tif (!ctx.currentFrame) {\n\t\t// lazily create frame, copying from previous\n\t\tconst prev = ctx.contextStack[ctx.contextStack.length - 1];\n\t\tctx.currentFrame = prev ? new Map(prev) : new Map();\n\t}\n\tctx.currentFrame.set(context as Context<unknown>, value);\n}\n\n/**\n * returns current provided value, or the default value\n * @param context context key from createContext()\n */\nexport function inject<T>(context: Context<T>): T {\n\tconst ctx = activeRenderContext!;\n\t// check current frame first, then stack\n\tconst frame = ctx.currentFrame ?? ctx.contextStack[ctx.contextStack.length - 1];\n\tif (frame?.has(context as Context<unknown>)) {\n\t\treturn frame.get(context as Context<unknown>) as T;\n\t}\n\treturn context.defaultValue;\n}\n\n/**\n * pushes current frame to stack (called before rendering children)\n * @returns whether a frame was pushed (needed for popContextFrame)\n */\nexport function pushContextFrame(): boolean {\n\tconst ctx = activeRenderContext!;\n\tif (ctx.currentFrame) {\n\t\tctx.contextStack.push(ctx.currentFrame);\n\t\tctx.currentFrame = null;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * pops context frame (called after rendering children)\n * @param hadFrame whether pushContextFrame returned true\n */\nexport function popContextFrame(hadFrame: boolean): void {\n\tconst ctx = activeRenderContext!;\n\tif (hadFrame) {\n\t\tctx.contextStack.pop();\n\t}\n\tctx.currentFrame = null;\n}\n","import { Fragment, jsx } from '../jsx-runtime.ts';\n\nimport { provide } from './render-context.ts';\nimport type { JSXElement, JSXNode } from './types.ts';\n\n/** context object returned by createContext() */\nexport interface Context<T> {\n\tdefaultValue: T;\n\tProvider: (props: { value: T; children?: JSXNode }) => JSXElement;\n}\n\n/** internal provider props */\ninterface ProviderProps<T> {\n\tcontext: Context<T>;\n\tvalue: T;\n\tchildren?: JSXNode;\n}\n\n/** internal provider component */\nfunction Provider<T>({ context, value, children }: ProviderProps<T>): JSXElement {\n\tprovide(context, value);\n\treturn jsx(Fragment, { children });\n}\n\n/**\n * creates a context with a Provider component\n * @param defaultValue value returned by use() when no Provider is above\n * @example\n * const ThemeContext = createContext('light');\n *\n * <ThemeContext.Provider value=\"dark\">\n * <App />\n * </ThemeContext.Provider>\n *\n * function App() {\n * const theme = use(ThemeContext);\n * return <div>{theme}</div>;\n * }\n */\nexport function createContext<T>(defaultValue: T): Context<T>;\nexport function createContext<T>(): Context<T | undefined>;\nexport function createContext<T>(defaultValue?: T): Context<T | undefined> {\n\tconst context: Context<T | undefined> = {\n\t\tdefaultValue,\n\t\tProvider: ({ value, children }) => Provider({ context, value, children }),\n\t};\n\n\treturn context;\n}\n","import { Fragment, jsx } from '../jsx-runtime.js';\n\nimport type { Context } from './context.js';\nimport { inject } from './render-context.js';\nimport type { JSXElement, JSXNode } from './types.js';\n\nexport interface SuspenseProps {\n\tfallback: JSXNode;\n\tchildren?: JSXNode;\n}\n\n/**\n * suspense boundary - renders fallback while children are suspended\n */\nexport function Suspense({ children }: SuspenseProps): JSXElement {\n\t// Suspense is handled specially in buildSegment, this is just for typing\n\treturn jsx(Fragment, { children });\n}\n\nexport interface ErrorBoundaryProps {\n\tfallback: (error: unknown) => JSXNode;\n\tchildren?: JSXNode;\n}\n\n/**\n * error boundary - catches render errors and displays fallback\n */\nexport function ErrorBoundary({ children }: ErrorBoundaryProps): JSXElement {\n\t// ErrorBoundary is handled specially in buildSegment, this is just for typing\n\treturn jsx(Fragment, { children });\n}\n\n/** cache for resolved/rejected promise values */\nconst promiseCache = new WeakMap<\n\tPromise<unknown>,\n\t{ resolved: true; value: unknown } | { resolved: false; error: unknown }\n>();\n\nfunction isContext<T>(value: unknown): value is Context<T> {\n\treturn typeof value === 'object' && value !== null && 'defaultValue' in value && 'Provider' in value;\n}\n\n/**\n * reads a context value or suspends until a promise resolves\n * @param usable context or promise\n * @returns context value or resolved promise value\n * @throws promise if not yet resolved, or error if rejected\n */\nexport function use<T>(usable: Context<T>): T;\nexport function use<T>(usable: Promise<T>): T;\nexport function use<T>(usable: Context<T> | Promise<T>): T {\n\t// context\n\tif (isContext<T>(usable)) {\n\t\treturn inject(usable);\n\t}\n\t// promise\n\tconst cached = promiseCache.get(usable);\n\tif (cached) {\n\t\tif (cached.resolved) {\n\t\t\treturn cached.value as T;\n\t\t} else {\n\t\t\tthrow cached.error;\n\t\t}\n\t}\n\t// not cached yet - set up caching and throw\n\tusable.then(\n\t\t(value) => promiseCache.set(usable, { resolved: true, value }),\n\t\t(error) => promiseCache.set(usable, { resolved: false, error }),\n\t);\n\tthrow usable;\n}\n","/**\n * streaming JSX renderer\n *\n * architecture:\n * - segment tree: we build a tree of segments (static text, composites, suspense\n * boundaries) then serialize to HTML\n * - suspense: components can throw promises via use(), caught at Suspense boundaries\n * which render fallback immediately and stream resolved content later\n * - head hoisting: <title>, <meta>, <link>, <style> found outside <head> are\n * collected and injected into <head> during finalization\n */\n\nimport { decodeUtf8From, encodeUtf8 } from '@atcute/uint8array';\n\nimport { Fragment } from '../jsx-runtime.ts';\n\nimport {\n\tpopContextFrame,\n\tpushContextFrame,\n\tsetActiveRenderContext,\n\ttype RenderContext,\n\ttype Segment,\n} from './render-context.ts';\nimport { ErrorBoundary, Suspense, type ErrorBoundaryProps, type SuspenseProps } from './suspense.ts';\nimport type { Component, JSXElement, JSXNode } from './types.ts';\n\nconst HEAD_ELEMENTS = new Set(['title', 'meta', 'link', 'style']);\nconst MAX_SUSPENSE_ATTEMPTS = 20;\nconst SELF_CLOSING_TAGS = new Set([\n\t'area',\n\t'base',\n\t'br',\n\t'col',\n\t'embed',\n\t'hr',\n\t'img',\n\t'input',\n\t'link',\n\t'meta',\n\t'param',\n\t'source',\n\t'track',\n\t'wbr',\n]);\n/** props that shouldn't be rendered as HTML attributes */\nconst FRAMEWORK_PROPS = new Set(['children', 'dangerouslySetInnerHTML']);\n\n// #region Segment helpers\n\nfunction staticSeg(html: string): Segment {\n\treturn { kind: 'static', html };\n}\n\nfunction compositeSeg(parts: Segment[]): Segment {\n\treturn { kind: 'composite', parts };\n}\n\nconst EMPTY_SEGMENT = staticSeg('');\n\n// #endregion\n\nexport interface RenderOptions {\n\tonError?: (error: unknown) => void;\n}\n\n/**\n * renders JSX to a readable stream\n * @param node JSX node to render\n * @param options render options\n * @returns readable stream of UTF-8 encoded HTML\n */\nexport function renderToStream(node: JSXNode, options?: RenderOptions): ReadableStream<Uint8Array> {\n\tconst onError = options?.onError ?? ((error) => console.error(error));\n\tconst context: RenderContext = {\n\t\tcontextStack: [],\n\t\tcurrentFrame: null,\n\t\theadElements: [],\n\t\tidsByPath: new Map(),\n\t\tinsideHead: false,\n\t\tinsideSvg: false,\n\t\tonError,\n\t\tpendingSuspense: [],\n\t};\n\n\treturn new ReadableStream({\n\t\tasync start(controller) {\n\t\t\ttry {\n\t\t\t\tconst root = buildSegment(node, context, '');\n\t\t\t\tawait resolveBlocking(root);\n\n\t\t\t\tconst html = serializeSegment(root);\n\t\t\t\tconst finalHtml = finalizeHtml(html, context);\n\t\t\t\tcontroller.enqueue(encodeUtf8(finalHtml));\n\n\t\t\t\t// stream pending suspense boundaries as they resolve\n\t\t\t\tif (context.pendingSuspense.length > 0) {\n\t\t\t\t\tawait streamPendingSuspense(context, controller);\n\t\t\t\t}\n\n\t\t\t\tcontroller.close();\n\t\t\t} catch (error) {\n\t\t\t\tonError(error);\n\t\t\t\tcontroller.error(error);\n\t\t\t}\n\t\t},\n\t});\n}\n\n/**\n * renders JSX to a string (non-streaming)\n * @param node JSX node to render\n * @param options render options\n * @returns promise resolving to HTML string\n */\nexport async function renderToString(node: JSXNode, options?: RenderOptions): Promise<string> {\n\tconst stream = renderToStream(node, options);\n\tconst reader = stream.getReader();\n\n\tlet html = '';\n\twhile (true) {\n\t\tconst { done, value } = await reader.read();\n\t\tif (done) {\n\t\t\tbreak;\n\t\t}\n\n\t\thtml += decodeUtf8From(value);\n\t}\n\n\treturn html;\n}\n\n/**\n * renders JSX to a streaming Response\n * @param node JSX node to render\n * @param init optional ResponseInit (status, headers, etc.)\n * @returns Response with streaming HTML body\n */\nexport function render(node: JSXNode, init?: ResponseInit): Response {\n\tconst stream = renderToStream(node);\n\n\t// @ts-expect-error: not sure why.\n\tconst headers = new Headers(init?.headers);\n\tif (!headers.has('Content-Type')) {\n\t\theaders.set('Content-Type', 'text/html; charset=utf-8');\n\t}\n\n\treturn new Response(stream, { ...init, headers });\n}\n\n// #region Segment building\n\nfunction isJSXElement(node: unknown): node is JSXElement {\n\treturn typeof node === 'object' && node !== null && 'type' in node && 'props' in node;\n}\n\nfunction isHeadElement(tag: string): boolean {\n\treturn HEAD_ELEMENTS.has(tag);\n}\n\nfunction buildSegment(node: JSXNode, ctx: RenderContext, path: string): Segment {\n\tconst prev = setActiveRenderContext(ctx);\n\ttry {\n\t\treturn buildSegmentInner(node, ctx, path);\n\t} finally {\n\t\tsetActiveRenderContext(prev);\n\t}\n}\n\nfunction buildSegmentInner(node: JSXNode, context: RenderContext, path: string): Segment {\n\t// primitives\n\tif (typeof node === 'string' || typeof node === 'number' || typeof node === 'bigint') {\n\t\treturn staticSeg(escapeHtml(node, false));\n\t}\n\tif (node === null || node === undefined || typeof node === 'boolean') {\n\t\treturn EMPTY_SEGMENT;\n\t}\n\t// iterables (arrays, generators, etc.)\n\tif (typeof node === 'object' && Symbol.iterator in node) {\n\t\tconst parts: Segment[] = [];\n\t\tfor (const child of node) {\n\t\t\tparts.push(buildSegmentInner(child, context, path));\n\t\t}\n\t\treturn compositeSeg(parts);\n\t}\n\t// JSX elements\n\tif (isJSXElement(node)) {\n\t\tconst { type, props } = node;\n\t\t// Fragment\n\t\tif (type === Fragment) {\n\t\t\tconst children = (props as { children?: JSXNode }).children;\n\t\t\treturn children != null ? buildSegmentInner(children, context, path) : EMPTY_SEGMENT;\n\t\t}\n\t\t// intrinsic elements (HTML tags)\n\t\tif (typeof type === 'string') {\n\t\t\tconst tag = type;\n\n\t\t\tif (tag === 'head') {\n\t\t\t\treturn buildHeadElementSegment(tag, props as Record<string, unknown>, context, path);\n\t\t\t}\n\n\t\t\tif (!context.insideHead && isHeadElement(tag)) {\n\t\t\t\t// hoist to <head>\n\t\t\t\tconst elementSeg = buildElementSegment(tag, props as Record<string, unknown>, context, path);\n\t\t\t\tcontext.headElements.push(serializeSegment(elementSeg));\n\t\t\t\treturn EMPTY_SEGMENT;\n\t\t\t}\n\n\t\t\treturn buildElementSegment(tag, props as Record<string, unknown>, context, path);\n\t\t}\n\t\t// function components\n\t\tif (typeof type === 'function') {\n\t\t\t// Suspense boundary\n\t\t\tif (type === Suspense) {\n\t\t\t\treturn buildSuspenseSegment(props as unknown as SuspenseProps, context, path);\n\t\t\t}\n\t\t\t// ErrorBoundary\n\t\t\tif (type === ErrorBoundary) {\n\t\t\t\treturn buildErrorBoundarySegment(props as unknown as ErrorBoundaryProps, context, path);\n\t\t\t}\n\t\t\treturn buildComponentSegment(type, props as Record<string, unknown>, context, path);\n\t\t}\n\t}\n\treturn EMPTY_SEGMENT;\n}\n\n// #endregion\n\n// #region Element building\n\nfunction buildElementSegment(\n\ttag: string,\n\tprops: Record<string, unknown>,\n\tcontext: RenderContext,\n\tpath: string,\n): Segment {\n\tconst currentIsSvg = context.insideSvg || tag === 'svg';\n\tconst attrs = renderAttributes(props);\n\t// self-closing tags\n\tif (SELF_CLOSING_TAGS.has(tag)) {\n\t\treturn staticSeg(`<${tag}${attrs}>`);\n\t}\n\t// dangerouslySetInnerHTML\n\tconst innerHTML = props.dangerouslySetInnerHTML as { __html: string } | undefined;\n\tif (innerHTML) {\n\t\treturn staticSeg(`<${tag}${attrs}>${innerHTML.__html}</${tag}>`);\n\t}\n\t// normal element with children\n\tconst open = staticSeg(`<${tag}${attrs}>`);\n\tconst previousInsideSvg = context.insideSvg;\n\tcontext.insideSvg = tag === 'foreignObject' ? false : currentIsSvg;\n\tconst children =\n\t\tprops.children != null ? buildSegment(props.children as JSXNode, context, path) : EMPTY_SEGMENT;\n\tcontext.insideSvg = previousInsideSvg;\n\tconst close = staticSeg(`</${tag}>`);\n\treturn compositeSeg([open, children, close]);\n}\n\nfunction buildHeadElementSegment(\n\ttag: string,\n\tprops: Record<string, unknown>,\n\tcontext: RenderContext,\n\tpath: string,\n): Segment {\n\tconst attrs = renderAttributes(props);\n\tconst previousInsideHead = context.insideHead;\n\tcontext.insideHead = true;\n\tconst open = staticSeg(`<${tag}${attrs}>`);\n\tconst children =\n\t\tprops.children != null ? buildSegment(props.children as JSXNode, context, path) : EMPTY_SEGMENT;\n\tcontext.insideHead = previousInsideHead;\n\tconst close = staticSeg(`</${tag}>`);\n\treturn compositeSeg([open, children, close]);\n}\n\nfunction renderAttributes(props: Record<string, unknown>): string {\n\tlet attrs = '';\n\tfor (const key in props) {\n\t\tif (FRAMEWORK_PROPS.has(key)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = props[key];\n\t\tif (value === undefined || value === null || value === false) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (typeof value === 'function') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (key === 'class') {\n\t\t\tif (!Array.isArray(value)) {\n\t\t\t\tattrs = ` class=\"${escapeHtml(value, true)}\"`;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst len = value.length;\n\n\t\t\tlet idx = 0;\n\t\t\tlet str = '';\n\t\t\tlet val: any;\n\n\t\t\tfor (; idx < len; idx++) {\n\t\t\t\tif ((val = value[idx])) {\n\t\t\t\t\tstr = str ? str + ' ' + val : val;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (str) {\n\t\t\t\tattrs += ` class=\"${escapeHtml(str, true)}\"`;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (key === 'style') {\n\t\t\tif (typeof value !== 'object') {\n\t\t\t\tattrs += ` style=\"${escapeHtml(value, true)}\"`;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet str = '';\n\t\t\tlet val;\n\n\t\t\tfor (const key in value) {\n\t\t\t\tif ((val = (value as any)[key]) != null) {\n\t\t\t\t\tstr = str ? str + '; ' + key + ':' + val : key + ':' + val;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (str) {\n\t\t\t\tattrs += ` style=\"${escapeHtml(str, true)}\"`;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (value === true) {\n\t\t\tattrs += ` ${key}`;\n\t\t} else {\n\t\t\tattrs += ` ${key}=\"${escapeHtml(value, true)}\"`;\n\t\t}\n\t}\n\treturn attrs;\n}\n\n// #endregion\n\n// #region Component building\n\nfunction buildComponentSegment(\n\ttype: Component,\n\tprops: Record<string, unknown>,\n\tctx: RenderContext,\n\tpath: string,\n): Segment {\n\t// call component\n\tconst result = type(props);\n\t// if component called provide(), push frame before rendering children\n\tconst hadFrame = pushContextFrame();\n\ttry {\n\t\treturn buildSegmentInner(result, ctx, path);\n\t} finally {\n\t\tpopContextFrame(hadFrame);\n\t}\n}\n\nfunction buildSuspenseSegment(props: SuspenseProps, ctx: RenderContext, path: string): Segment {\n\t// generate unique id for this suspense boundary\n\tconst nextIndex = (ctx.idsByPath.get(path) ?? 0) + 1;\n\tctx.idsByPath.set(path, nextIndex);\n\tconst id = path ? `${path}-${nextIndex}` : `${nextIndex}`;\n\tconst suspenseId = `s${id}`;\n\n\ttry {\n\t\t// try to render children synchronously\n\t\tconst content = buildSegment(props.children, ctx, suspenseId);\n\t\t// no suspension - return content directly (no boundary needed)\n\t\treturn content;\n\t} catch (thrown) {\n\t\t// check if it's a promise (suspension)\n\t\tif (thrown instanceof Promise) {\n\t\t\t// render fallback\n\t\t\tconst fallback = buildSegment(props.fallback, ctx, suspenseId);\n\n\t\t\t// create suspense segment\n\t\t\tconst seg: Segment = {\n\t\t\t\tkind: 'suspense',\n\t\t\t\tid: suspenseId,\n\t\t\t\tfallback,\n\t\t\t\tcontent: null,\n\t\t\t};\n\n\t\t\t// snapshot context stack for async re-render (parent frames will be popped\n\t\t\t// by the time the promise resolves)\n\t\t\tconst asyncCtx: RenderContext = {\n\t\t\t\t...ctx,\n\t\t\t\tcontextStack: [...ctx.contextStack],\n\t\t\t\tcurrentFrame: null,\n\t\t\t};\n\n\t\t\t// re-render function that handles subsequent promise throws\n\t\t\tconst rerender = (attempt: number): Promise<void> | void => {\n\t\t\t\tif (attempt >= MAX_SUSPENSE_ATTEMPTS) {\n\t\t\t\t\tthrow new Error(`suspense boundary exceeded maximum retry attempts (${MAX_SUSPENSE_ATTEMPTS})`);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tseg.content = buildSegment(props.children, asyncCtx, suspenseId);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (err instanceof Promise) {\n\t\t\t\t\t\t// component threw another promise - wait and retry\n\t\t\t\t\t\treturn err.then(() => rerender(attempt + 1));\n\t\t\t\t\t}\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// set up promise to re-render children when resolved\n\t\t\tconst pending = thrown.then(() => rerender(1));\n\t\t\tseg.pending = pending;\n\n\t\t\t// track for streaming\n\t\t\tconst tracked = pending.then(() => seg.content!);\n\t\t\ttracked.catch(() => {}); // prevent unhandled rejection if resolveBlocking catches first\n\t\t\tctx.pendingSuspense.push({ id: suspenseId, promise: tracked });\n\n\t\t\treturn seg;\n\t\t}\n\t\t// not a promise - re-throw\n\t\tthrow thrown;\n\t}\n}\n\nfunction buildErrorBoundarySegment(props: ErrorBoundaryProps, ctx: RenderContext, path: string): Segment {\n\t// snapshot context for potential async fallback rendering\n\tconst asyncCtx: RenderContext = {\n\t\t...ctx,\n\t\tcontextStack: [...ctx.contextStack],\n\t\tcurrentFrame: null,\n\t};\n\n\ttry {\n\t\tconst children = buildSegment(props.children, ctx, path);\n\t\treturn {\n\t\t\tkind: 'error-boundary',\n\t\t\tchildren,\n\t\t\tfallbackFn: props.fallback,\n\t\t\trenderContext: asyncCtx,\n\t\t\tpath,\n\t\t\tfallbackSegment: null,\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof Promise) {\n\t\t\tthrow error; // let Suspense handle it\n\t\t}\n\t\t// sync error - render fallback immediately\n\t\treturn buildSegment(props.fallback(error), ctx, path);\n\t}\n}\n\n// #endregion\n\n// #region Serialization\n\n/** resolve all blocking suspense boundaries and error boundaries */\nasync function resolveBlocking(segment: Segment): Promise<void> {\n\tif (segment.kind === 'suspense') {\n\t\tif (segment.pending) {\n\t\t\tawait segment.pending;\n\t\t\tsegment.pending = undefined;\n\t\t}\n\t\tif (segment.content) {\n\t\t\tawait resolveBlocking(segment.content);\n\t\t}\n\t\treturn;\n\t}\n\tif (segment.kind === 'error-boundary') {\n\t\ttry {\n\t\t\tawait resolveBlocking(segment.children);\n\t\t} catch (error) {\n\t\t\tsegment.fallbackSegment = buildSegment(segment.fallbackFn(error), segment.renderContext, segment.path);\n\t\t}\n\t\treturn;\n\t}\n\tif (segment.kind === 'composite') {\n\t\tfor (const part of segment.parts) {\n\t\t\tawait resolveBlocking(part);\n\t\t}\n\t}\n}\n\n/** serialize segment tree to HTML string */\nfunction serializeSegment(seg: Segment): string {\n\tif (seg.kind === 'static') {\n\t\treturn seg.html;\n\t}\n\tif (seg.kind === 'composite') {\n\t\treturn seg.parts.map(serializeSegment).join('');\n\t}\n\tif (seg.kind === 'error-boundary') {\n\t\treturn serializeSegment(seg.fallbackSegment ?? seg.children);\n\t}\n\t// suspense - always render fallback; resolved content streams in template\n\treturn `<!--$s:${seg.id}-->${serializeSegment(seg.fallback)}<!--/$s:${seg.id}-->`;\n}\n\n// #endregion\n\n// #region Streaming\n\n/** suspense runtime function name */\nconst SR = '$sr';\n/** suspense runtime - injected once, swaps template content with fallback */\nconst SUSPENSE_RUNTIME = `<script>${SR}=(t,i,s,e)=>{i=\"$s:\"+t.dataset.suspense;s=document.createTreeWalker(document,128);while(e=s.nextNode())if(e.data===i){while(e.nextSibling?.data!==\"/\"+i)e.nextSibling.remove();e.nextSibling.replaceWith(...t.content.childNodes);e.remove();break}t.remove()}</script>`;\n\nasync function streamPendingSuspense(\n\tcontext: RenderContext,\n\tcontroller: ReadableStreamDefaultController<Uint8Array>,\n): Promise<void> {\n\tcontroller.enqueue(encodeUtf8(SUSPENSE_RUNTIME));\n\n\twhile (true) {\n\t\tconst batch = context.pendingSuspense;\n\t\tif (batch.length === 0) {\n\t\t\tbreak;\n\t\t}\n\t\tcontext.pendingSuspense = [];\n\n\t\tawait Promise.all(\n\t\t\tbatch.map(async ({ id, promise }) => {\n\t\t\t\tlet resolvedSegment: Segment;\n\t\t\t\ttry {\n\t\t\t\t\tresolvedSegment = await promise;\n\t\t\t\t} catch {\n\t\t\t\t\t// promise rejected - error was caught by an error boundary\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait resolveBlocking(resolvedSegment);\n\n\t\t\t\t\tconst html = serializeSegment(resolvedSegment);\n\n\t\t\t\t\tcontroller.enqueue(\n\t\t\t\t\t\tencodeUtf8(\n\t\t\t\t\t\t\t`<template data-suspense=\"${id}\">${html}</template>` +\n\t\t\t\t\t\t\t\t`<script>${SR}(document.currentScript.previousElementSibling)</script>`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcontext.onError(error);\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t}\n}\n\n// #endregion\n\n// #region Utilities\n\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n\nfunction escapeHtml(value: unknown, isAttr: boolean): string {\n\tconst str = String(value ?? '');\n\tconst pattern = isAttr ? ATTR_REGEX : CONTENT_REGEX;\n\tpattern.lastIndex = 0;\n\n\tlet escaped = '';\n\tlet last = 0;\n\n\twhile (pattern.test(str)) {\n\t\tconst i = pattern.lastIndex - 1;\n\t\tconst ch = str[i];\n\t\tescaped += str.substring(last, i) + (ch === '&' ? '&amp;' : ch === '\"' ? '&quot;' : '&lt;');\n\t\tlast = i + 1;\n\t}\n\n\treturn escaped + str.substring(last);\n}\n\nfunction finalizeHtml(html: string, context: RenderContext): string {\n\tconst hasHtmlRoot = html.trimStart().toLowerCase().startsWith('<html');\n\t// inject hoisted head elements\n\tif (context.headElements.length > 0) {\n\t\tconst headContent = context.headElements.join('');\n\t\tif (hasHtmlRoot) {\n\t\t\tconst headCloseIndex = html.indexOf('</head>');\n\t\t\tif (headCloseIndex !== -1) {\n\t\t\t\t// inject before existing </head>\n\t\t\t\thtml = html.slice(0, headCloseIndex) + headContent + html.slice(headCloseIndex);\n\t\t\t} else {\n\t\t\t\t// no existing head, inject after <html>\n\t\t\t\tconst htmlOpenMatch = html.match(/<html[^>]*>/);\n\t\t\t\tif (htmlOpenMatch && htmlOpenMatch.index !== undefined) {\n\t\t\t\t\tconst insertIndex = htmlOpenMatch.index + htmlOpenMatch[0].length;\n\t\t\t\t\thtml = html.slice(0, insertIndex) + `<head>${headContent}</head>` + html.slice(insertIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// no HTML root, prepend head\n\t\t\thtml = `<head>${headContent}</head>${html}`;\n\t\t}\n\t}\n\tif (hasHtmlRoot) {\n\t\thtml = '<!doctype html>' + html;\n\t}\n\treturn html;\n}\n\n// #endregion\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { i as JSX, n as jsx, t as Fragment } from "./jsx-runtime-CcUWZKzW.mjs";
1
+ import { a as JSX, n as jsx, t as Fragment } from "./jsx-runtime-DNOsJEgZ.mjs";
2
2
  export { Fragment, type JSX, jsx as jsxDEV };
@@ -25,6 +25,10 @@ interface JSXElement<P = unknown, T extends string | Component<any> = string | C
25
25
  type JSXNode = JSXElement | string | number | bigint | boolean | null | undefined | Iterable<JSXNode>;
26
26
  //#endregion
27
27
  //#region src/lib/intrinsic-elements.d.ts
28
+ /**
29
+ * a single class value that can be conditionally applied
30
+ */
31
+ type ClassValue = string | false | 0 | null | undefined;
28
32
  /**
29
33
  * boolean or string boolean for DOM attributes
30
34
  * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute
@@ -342,7 +346,7 @@ interface HTMLAttributes extends AriaAttributes, DOMAttributes {
342
346
  accesskey?: string | undefined;
343
347
  autocapitalize?: 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters' | undefined | (string & {});
344
348
  autofocus?: boolean | undefined;
345
- class?: string | undefined;
349
+ class?: string | ClassValue[] | undefined;
346
350
  contenteditable?: Booleanish | 'inherit' | 'plaintext-only' | undefined;
347
351
  /** @deprecated */
348
352
  contextmenu?: string | undefined;
@@ -817,7 +821,7 @@ interface VideoHTMLAttributes extends MediaHTMLAttributes {
817
821
  onresize?: string | undefined;
818
822
  }
819
823
  interface SVGAttributes extends AriaAttributes, DOMAttributes {
820
- class?: string | undefined;
824
+ class?: string | ClassValue[] | undefined;
821
825
  color?: string | undefined;
822
826
  height?: number | string | undefined;
823
827
  id?: string | undefined;
@@ -1295,5 +1299,5 @@ declare function Fragment(props: {
1295
1299
  children?: JSXNode;
1296
1300
  }): JSXNode;
1297
1301
  //#endregion
1298
- export { SVGAttributes as a, JSXElement as c, JSX as i, JSXNode as l, jsx as n, Component as o, HTMLAttributes as r, FC as s, Fragment as t };
1299
- //# sourceMappingURL=jsx-runtime-CcUWZKzW.d.mts.map
1302
+ export { JSX as a, FC as c, HTMLAttributes as i, JSXElement as l, jsx as n, SVGAttributes as o, ClassValue as r, Component as s, Fragment as t, JSXNode as u };
1303
+ //# sourceMappingURL=jsx-runtime-DNOsJEgZ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-runtime-DNOsJEgZ.d.mts","names":[],"sources":["../src/lib/types.ts","../src/lib/intrinsic-elements.ts","../src/jsx-runtime.ts"],"sourcesContent":[],"mappings":"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SACA;SACA;gBACO;UACN;QACF;YACI;YACA;aACC;YACD;UACF;UACA;SACD;cACK;UACJ;cACI;QACN;SACC;aACI;SACJ;YACG;SACH;QACD;QACA;QACA;WACG;cACG;gBACE;YACJ;YACA;UACF;QACF;QACA;QACA;QACA;QACA;QACA;UACE;YACE;YACA;QACJ;UACE;OACH;YACK;SACH;WACE;SACF;SACA;YACG;WACD;YACC;QACJ;UACE;UACA;SACD;UACC;UACA;cACI;UACJ;WACC;SACF;aACI;cACC;YACF;QACJ;cACM;YACF;YACA;OACL;WACI;aACE;SACJ;cACK;OACP;QACC;QACA;UACE;OACH;UACG;YACE;UACF;YACE;aACC;YACD;WACD;YACC;UACF;YACE;WACD;SACF;aACI;SACJ;WACE;cACG;WACH;QACH;cACM;WACH;QACH;WACG;UACD;WACC;QACH;WACG;OACJ;QACC;SACC;WACE;SACF;aACI;SAGJ;aAEI;mBACM;sBACG;YACV;cACE;UACJ;UACA;aACG;aACA;mBACM;yBACM;iBACR;sBACK;uBACC;uBACA;oBACH;kBACF;aACL;aACA;aACA;aACA;aACA;oBACO;aACP;aACA;iBACI;kBACC;cACJ;kBACI;wBACM;iBACP;YACL;kBACM;YACN;mBACO;OACZ;WACI;UACD;oBACU;YACR;UACF;cACI;WACH;UACD;aACG;aACA;cACC;oBACM;UACV;SACD;UACC;YACE;YACA;UACF;cACI;WACH;SACF;UACC;;;;;;;AD5jDR;AAGA;AAWA;;AAAsF,iBEbtE,GFasE,CAAA,CAAA,EAAA,UAAA,MAAA,GEb5C,SFa4C,CAAA,GAAA,CAAA,CAAA,CAAA,IAAA,EEbtB,CFasB,EAAA,KAAA,EEbZ,CFaY,CAAA,EEbR,UFaQ,CEbG,CFaH,EEbM,CFaN,CAAA;AAE9E,iBETQ,QAAA,CFSR,KAAA,EAAA;EAAC,QAAA,CAAA,EEToC,OFSpC;AAWT,CAAA,CAAA,EEpByD,OFoB7C"}
@@ -1,2 +1,2 @@
1
- import { i as JSX, n as jsx, t as Fragment } from "./jsx-runtime-CcUWZKzW.mjs";
1
+ import { a as JSX, n as jsx, t as Fragment } from "./jsx-runtime-DNOsJEgZ.mjs";
2
2
  export { Fragment, JSX, jsx, jsx as jsxs };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oomfware/jsx",
4
- "version": "0.1.5",
4
+ "version": "0.1.7",
5
5
  "description": "server-side JSX renderer",
6
6
  "license": "0BSD",
7
7
  "repository": {
@@ -14,8 +14,6 @@
14
14
  "./jsx-runtime": "./dist/jsx-runtime.mjs",
15
15
  "./package.json": "./package.json"
16
16
  },
17
- "main": "./dist/index.mjs",
18
- "module": "./dist/index.mjs",
19
17
  "types": "./dist/index.d.mts",
20
18
  "publishConfig": {
21
19
  "access": "public"
@@ -29,16 +27,16 @@
29
27
  "devDependencies": {
30
28
  "@ianvs/prettier-plugin-sort-imports": "^4.7.0",
31
29
  "@prettier/plugin-oxc": "^0.1.3",
32
- "@types/bun": "^1.3.5",
33
- "bumpp": "^10.3.2",
34
- "csstype": "^3.2.3",
35
- "oxlint": "^1.38.0",
36
- "prettier": "^3.7.4",
37
- "tsdown": "^0.18.1",
30
+ "@types/bun": "^1.3.6",
31
+ "bumpp": "^10.4.0",
32
+ "oxlint": "^1.41.0",
33
+ "prettier": "^3.8.0",
34
+ "tsdown": "^0.19.0",
38
35
  "typescript": "^5.9.3"
39
36
  },
40
37
  "dependencies": {
41
- "@atcute/uint8array": "^1.0.6"
38
+ "@atcute/uint8array": "^1.0.6",
39
+ "csstype": "^3.2.3"
42
40
  },
43
41
  "scripts": {
44
42
  "build": "tsdown",
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export type { Component, FC, JSXElement, JSXNode } from './lib/types.js';
2
- export type { HTMLAttributes, JSX, SVGAttributes } from './lib/intrinsic-elements.js';
2
+ export type { ClassValue, HTMLAttributes, JSX, SVGAttributes } from './lib/intrinsic-elements.js';
3
3
 
4
4
  export { Fragment } from './jsx-runtime.js';
5
5
 
@@ -4,6 +4,11 @@ import type * as CSS from 'csstype';
4
4
 
5
5
  import type { JSXElement, JSXNode } from './types.js';
6
6
 
7
+ /**
8
+ * a single class value that can be conditionally applied
9
+ */
10
+ export type ClassValue = string | false | 0 | null | undefined;
11
+
7
12
  /**
8
13
  * boolean or string boolean for DOM attributes
9
14
  * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute
@@ -454,7 +459,7 @@ export interface HTMLAttributes extends AriaAttributes, DOMAttributes {
454
459
  accesskey?: string | undefined;
455
460
  autocapitalize?: 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters' | undefined | (string & {});
456
461
  autofocus?: boolean | undefined;
457
- class?: string | undefined;
462
+ class?: string | ClassValue[] | undefined;
458
463
  contenteditable?: Booleanish | 'inherit' | 'plaintext-only' | undefined;
459
464
  /** @deprecated */
460
465
  contextmenu?: string | undefined;
@@ -1096,7 +1101,7 @@ interface VideoHTMLAttributes extends MediaHTMLAttributes {
1096
1101
  // - union of string literals
1097
1102
  export interface SVGAttributes extends AriaAttributes, DOMAttributes {
1098
1103
  // Attributes which also defined in HTMLAttributes
1099
- class?: string | undefined;
1104
+ class?: string | ClassValue[] | undefined;
1100
1105
  color?: string | undefined;
1101
1106
  height?: number | string | undefined;
1102
1107
  id?: string | undefined;
package/src/lib/render.ts CHANGED
@@ -17,11 +17,11 @@ import { Fragment } from '../jsx-runtime.ts';
17
17
  import {
18
18
  popContextFrame,
19
19
  pushContextFrame,
20
+ setActiveRenderContext,
20
21
  type RenderContext,
21
22
  type Segment,
22
- setActiveRenderContext,
23
23
  } from './render-context.ts';
24
- import { ErrorBoundary, type ErrorBoundaryProps, Suspense, type SuspenseProps } from './suspense.ts';
24
+ import { ErrorBoundary, Suspense, type ErrorBoundaryProps, type SuspenseProps } from './suspense.ts';
25
25
  import type { Component, JSXElement, JSXNode } from './types.ts';
26
26
 
27
27
  const HEAD_ELEMENTS = new Set(['title', 'meta', 'link', 'style']);
@@ -275,18 +275,65 @@ function buildHeadElementSegment(
275
275
  function renderAttributes(props: Record<string, unknown>): string {
276
276
  let attrs = '';
277
277
  for (const key in props) {
278
- if (FRAMEWORK_PROPS.has(key)) continue;
278
+ if (FRAMEWORK_PROPS.has(key)) {
279
+ continue;
280
+ }
281
+
279
282
  const value = props[key];
280
- if (value === undefined || value === null || value === false) continue;
281
- if (typeof value === 'function') continue;
282
- // style object -> string
283
- if (key === 'style' && typeof value === 'object') {
284
- const styleStr = serializeStyle(value as Record<string, string | number>);
285
- if (styleStr) {
286
- attrs += ` style="${escapeHtml(styleStr, true)}"`;
283
+ if (value === undefined || value === null || value === false) {
284
+ continue;
285
+ }
286
+
287
+ if (typeof value === 'function') {
288
+ continue;
289
+ }
290
+
291
+ if (key === 'class') {
292
+ if (!Array.isArray(value)) {
293
+ attrs = ` class="${escapeHtml(value, true)}"`;
294
+ continue;
295
+ }
296
+
297
+ const len = value.length;
298
+
299
+ let idx = 0;
300
+ let str = '';
301
+ let val: any;
302
+
303
+ for (; idx < len; idx++) {
304
+ if ((val = value[idx])) {
305
+ str = str ? str + ' ' + val : val;
306
+ }
307
+ }
308
+
309
+ if (str) {
310
+ attrs += ` class="${escapeHtml(str, true)}"`;
287
311
  }
288
312
  continue;
289
313
  }
314
+
315
+ if (key === 'style') {
316
+ if (typeof value !== 'object') {
317
+ attrs += ` style="${escapeHtml(value, true)}"`;
318
+ continue;
319
+ }
320
+
321
+ let str = '';
322
+ let val;
323
+
324
+ for (const key in value) {
325
+ if ((val = (value as any)[key]) != null) {
326
+ str = str ? str + '; ' + key + ':' + val : key + ':' + val;
327
+ }
328
+ }
329
+
330
+ if (str) {
331
+ attrs += ` style="${escapeHtml(str, true)}"`;
332
+ }
333
+
334
+ continue;
335
+ }
336
+
290
337
  if (value === true) {
291
338
  attrs += ` ${key}`;
292
339
  } else {
@@ -296,15 +343,6 @@ function renderAttributes(props: Record<string, unknown>): string {
296
343
  return attrs;
297
344
  }
298
345
 
299
- function serializeStyle(style: Record<string, string | number>): string {
300
- const parts: string[] = [];
301
- for (const [key, value] of Object.entries(style)) {
302
- if (value == null) continue;
303
- parts.push(`${key}:${value}`);
304
- }
305
- return parts.join(';');
306
- }
307
-
308
346
  // #endregion
309
347
 
310
348
  // #region Component building
@@ -363,9 +401,7 @@ function buildSuspenseSegment(props: SuspenseProps, ctx: RenderContext, path: st
363
401
  // re-render function that handles subsequent promise throws
364
402
  const rerender = (attempt: number): Promise<void> | void => {
365
403
  if (attempt >= MAX_SUSPENSE_ATTEMPTS) {
366
- throw new Error(
367
- `suspense boundary exceeded maximum retry attempts (${MAX_SUSPENSE_ATTEMPTS})`,
368
- );
404
+ throw new Error(`suspense boundary exceeded maximum retry attempts (${MAX_SUSPENSE_ATTEMPTS})`);
369
405
  }
370
406
  try {
371
407
  seg.content = buildSegment(props.children, asyncCtx, suspenseId);
@@ -394,11 +430,7 @@ function buildSuspenseSegment(props: SuspenseProps, ctx: RenderContext, path: st
394
430
  }
395
431
  }
396
432
 
397
- function buildErrorBoundarySegment(
398
- props: ErrorBoundaryProps,
399
- ctx: RenderContext,
400
- path: string,
401
- ): Segment {
433
+ function buildErrorBoundarySegment(props: ErrorBoundaryProps, ctx: RenderContext, path: string): Segment {
402
434
  // snapshot context for potential async fallback rendering
403
435
  const asyncCtx: RenderContext = {
404
436
  ...ctx,
@@ -445,11 +477,7 @@ async function resolveBlocking(segment: Segment): Promise<void> {
445
477
  try {
446
478
  await resolveBlocking(segment.children);
447
479
  } catch (error) {
448
- segment.fallbackSegment = buildSegment(
449
- segment.fallbackFn(error),
450
- segment.renderContext,
451
- segment.path,
452
- );
480
+ segment.fallbackSegment = buildSegment(segment.fallbackFn(error), segment.renderContext, segment.path);
453
481
  }
454
482
  return;
455
483
  }
@@ -179,6 +179,43 @@ describe('stream', () => {
179
179
  const html = await renderToString(<button onclick={() => {}} />);
180
180
  expect(html).toBe('<button></button>');
181
181
  });
182
+
183
+ it('renders string class as-is', async () => {
184
+ const html = await renderToString(<div class="foo bar" />);
185
+ expect(html).toBe('<div class="foo bar"></div>');
186
+ });
187
+
188
+ it('concatenates class array', async () => {
189
+ const html = await renderToString(<div class={['foo', 'bar', 'baz']} />);
190
+ expect(html).toBe('<div class="foo bar baz"></div>');
191
+ });
192
+
193
+ it('filters out falsy values from class array', async () => {
194
+ const html = await renderToString(<div class={['foo', false, 'bar', null, 'baz', undefined, 0]} />);
195
+ expect(html).toBe('<div class="foo bar baz"></div>');
196
+ });
197
+
198
+ it('conditionally applies classes', async () => {
199
+ const isActive = true;
200
+ const isDisabled = false;
201
+ const html = await renderToString(<div class={['btn', isActive && 'active', isDisabled && 'disabled']} />);
202
+ expect(html).toBe('<div class="btn active"></div>');
203
+ });
204
+
205
+ it('omits class attribute when array is all falsy', async () => {
206
+ const html = await renderToString(<div class={[false, null, undefined, 0]} />);
207
+ expect(html).toBe('<div></div>');
208
+ });
209
+
210
+ it('handles empty class array', async () => {
211
+ const html = await renderToString(<div class={[]} />);
212
+ expect(html).toBe('<div></div>');
213
+ });
214
+
215
+ it('handles single-element class array', async () => {
216
+ const html = await renderToString(<div class={['solo']} />);
217
+ expect(html).toBe('<div class="solo"></div>');
218
+ });
182
219
  });
183
220
 
184
221
  describe('escaping', () => {
@@ -233,7 +270,7 @@ describe('stream', () => {
233
270
  const html = await renderToString(
234
271
  <div style={{ color: 'green', 'margin-top': '10px', padding: '5px' }} />,
235
272
  );
236
- expect(html).toBe('<div style="color:green;margin-top:10px;padding:5px"></div>');
273
+ expect(html).toBe('<div style="color:green; margin-top:10px; padding:5px"></div>');
237
274
  });
238
275
  });
239
276
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsx-runtime-CcUWZKzW.d.mts","names":[],"sources":["../src/lib/types.ts","../src/lib/intrinsic-elements.ts","../src/jsx-runtime.ts"],"sourcesContent":[],"mappings":"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ACJ;cACI;QACN;SACC;aACI;SACJ;YACG;SACH;QACD;QACA;QACA;WACG;cACG;gBACE;YACJ;YACA;UACF;QACF;QACA;QACA;QACA;QACA;QACA;UACE;YACE;YACA;QACJ;UACE;OACH;YACK;SACH;WACE;SACF;SACA;YACG;WACD;YACC;QACJ;UACE;UACA;SACD;UACC;UACA;cACI;UACJ;WACC;SACF;aACI;cACC;YACF;QACJ;cACM;YACF;YACA;OACL;WACI;aACE;SACJ;cACK;OACP;QACC;QACA;UACE;OACH;UACG;YACE;UACF;YACE;aACC;YACD;WACD;YACC;UACF;YACE;WACD;SACF;aACI;SACJ;WACE;cACG;WACH;QACH;cACM;WACH;QACH;WACG;UACD;WACC;QACH;WACG;OACJ;QACC;SACC;WACE;SACF;aACI;SAGJ;aAEI;mBACM;sBACG;YACV;cACE;UACJ;UACA;aACG;aACA;mBACM;yBACM;iBACR;sBACK;uBACC;uBACA;oBACH;kBACF;aACL;aACA;aACA;aACA;aACA;oBACO;aACP;aACA;iBACI;kBACC;cACJ;kBACI;wBACM;iBACP;YACL;kBACM;YACN;mBACO;OACZ;WACI;UACD;oBACU;YACR;UACF;cACI;WACH;UACD;aACG;aACA;cACC;oBACM;UACV;SACD;UACC;YACE;YACA;UACF;cACI;WACH;SACF;UACC;;;;;;;ADvjDR;AAGA;AAWA;;AAAsF,iBEbtE,GFasE,CAAA,CAAA,EAAA,UAAA,MAAA,GEb5C,SFa4C,CAAA,GAAA,CAAA,CAAA,CAAA,IAAA,EEbtB,CFasB,EAAA,KAAA,EEbZ,CFaY,CAAA,EEbR,UFaQ,CEbG,CFaH,EEbM,CFaN,CAAA;AAE9E,iBETQ,QAAA,CFSR,KAAA,EAAA;EAAC,QAAA,CAAA,EEToC,OFSpC;AAWT,CAAA,CAAA,EEpByD,OFoB7C"}