semajsx 0.8.0 → 0.9.0

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.
Files changed (44) hide show
  1. package/dist/{client-BrupjhG0.mjs → client-CEJQ4fit.mjs} +3 -3
  2. package/dist/{client-BrupjhG0.mjs.map → client-CEJQ4fit.mjs.map} +1 -1
  3. package/dist/{document-DsiJO2jG.mjs → document-Cbz4084O.mjs} +2 -2
  4. package/dist/{document-XKyAs62C.mjs → document-Cfdhi7vG.mjs} +2 -2
  5. package/dist/{document-XKyAs62C.mjs.map → document-Cfdhi7vG.mjs.map} +1 -1
  6. package/dist/dom/index.mjs +2 -2
  7. package/dist/dom/jsx-dev-runtime.mjs +1 -1
  8. package/dist/dom/jsx-runtime.mjs +1 -1
  9. package/dist/index.d.mts +11 -0
  10. package/dist/index.d.mts.map +1 -1
  11. package/dist/index.mjs +1 -1
  12. package/dist/{jsx-runtime-Dc77fsnM.d.mts → jsx-runtime-tdaY-P9K.d.mts} +2 -2
  13. package/dist/{jsx-runtime-Dc77fsnM.d.mts.map → jsx-runtime-tdaY-P9K.d.mts.map} +1 -1
  14. package/dist/{lucide-Ddt_N9dJ.mjs → lucide-DWk3itzO.mjs} +3 -3
  15. package/dist/{lucide-Ddt_N9dJ.mjs.map → lucide-DWk3itzO.mjs.map} +1 -1
  16. package/dist/{resource-pm7qP-jV.mjs → resource-BU0Po0ez.mjs} +2 -2
  17. package/dist/{resource-pm7qP-jV.mjs.map → resource-BU0Po0ez.mjs.map} +1 -1
  18. package/dist/{src-Cv4rRVzv.mjs → src--YS4EvMz.mjs} +9 -6
  19. package/dist/src--YS4EvMz.mjs.map +1 -0
  20. package/dist/{src-CXY-7FC3.mjs → src-77V1Plyd.mjs} +665 -129
  21. package/dist/src-77V1Plyd.mjs.map +1 -0
  22. package/dist/{src-SqJ6k7Xv.mjs → src-BTG08Qnh.mjs} +4 -4
  23. package/dist/{src-SqJ6k7Xv.mjs.map → src-BTG08Qnh.mjs.map} +1 -1
  24. package/dist/{src-C_aFsFJ3.mjs → src-Cm12Y2XV.mjs} +2 -2
  25. package/dist/{src-C_aFsFJ3.mjs.map → src-Cm12Y2XV.mjs.map} +1 -1
  26. package/dist/{src-CAyv9Uf9.mjs → src-Mucdq4zw.mjs} +6 -6
  27. package/dist/{src-CAyv9Uf9.mjs.map → src-Mucdq4zw.mjs.map} +1 -1
  28. package/dist/ssg/index.mjs +6 -6
  29. package/dist/ssg/plugins/docs-theme.mjs +9 -9
  30. package/dist/ssg/plugins/lucide.mjs +3 -3
  31. package/dist/ssr/client.mjs +4 -4
  32. package/dist/ssr/index.mjs +5 -5
  33. package/dist/terminal/index.d.mts +248 -4
  34. package/dist/terminal/index.d.mts.map +1 -1
  35. package/dist/terminal/index.mjs +3 -3
  36. package/dist/terminal/jsx-dev-runtime.d.mts +2 -2
  37. package/dist/terminal/jsx-dev-runtime.mjs +1 -1
  38. package/dist/terminal/jsx-runtime.d.mts +2 -2
  39. package/dist/terminal/jsx-runtime.mjs +1 -1
  40. package/dist/{types-Bj5q5x2Q.d.mts → types-Bm8rZGKW.d.mts} +2 -2
  41. package/dist/{types-Bj5q5x2Q.d.mts.map → types-Bm8rZGKW.d.mts.map} +1 -1
  42. package/package.json +1 -1
  43. package/dist/src-CXY-7FC3.mjs.map +0 -1
  44. package/dist/src-Cv4rRVzv.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src--YS4EvMz.mjs","names":[],"sources":["../../core/src/types.ts","../../core/src/vnode.ts","../../core/src/shared/island-marker.ts","../../core/src/context.ts","../../core/src/helpers.ts","../../core/src/jsx.ts","../../core/src/component.ts","../../core/src/render-core.ts"],"sourcesContent":["import type { ReadableSignal, WritableSignal } from \"./signal\";\n\n/**\n * Special VNode type for fragment support\n */\nexport const Fragment: symbol = Symbol.for(\"semajsx.fragment\");\n\n/**\n * Special VNode type for portal support\n */\nexport const Portal: symbol = Symbol.for(\"semajsx.portal\");\n\n/**\n * Special VNode type for forward support\n * Forward merges its props onto its single child element without producing a DOM node\n */\nexport const Forward: symbol = Symbol.for(\"semajsx.forward\");\n\n/**\n * VNode types\n * - The runtime VNode tree always resolves to these `type` values\n */\nexport type VNodeType = string | Component<any> | typeof Fragment | typeof Portal | typeof Forward;\n\n/**\n * VNode: The basic unit of the runtime render tree\n * - `type`: the element/component type\n * - `props`: attributes or props passed to the node (may be null)\n * - `children`: resolved child nodes (always normalized to VNode[] at render time)\n */\nexport interface VNode {\n type: VNodeType;\n props: Record<string, any> | null;\n children: VNode[];\n key?: string | number | null;\n}\n\n/**\n * Primitive values allowed in JSX\n * - These are normalized during VNode construction\n */\nexport type JSXPrimitive = string | number | boolean | null | undefined;\n\n/**\n * A JSXNode represents any valid \"JSX expression result\"\n * - Could be a raw VNode/primitive, or wrapped in a reactive/async container\n */\nexport type JSXNode =\n | VNode\n | JSXPrimitive\n | Iterable<JSXNode>\n | ReadableSignal<JSXNode>\n | Promise<JSXNode>\n | AsyncIterableIterator<JSXNode>;\n\n/**\n * Component type\n * - Optional `ctx` parameter allows passing in custom API/runtime helpers\n */\nexport type Component<P = any> = (props: P, ctx?: ComponentAPI) => JSXNode;\n\n/**\n * ComponentAPI - Runtime API available to components via second parameter\n */\nexport interface ComponentAPI {\n /**\n * Inject a context value\n * @param context - The context to inject\n * @returns The current value of the context, or undefined if not provided\n */\n inject<T>(context: Context<T>): T | undefined;\n}\n\n/**\n * Ref types\n */\n\n/**\n * Ref - can be a WritableSignal or a callback function\n * This allows both reactive refs and imperative refs\n */\nexport type Ref<T> = WritableSignal<T | null> | ((instance: T | null) => void);\n\n/**\n * Context types\n */\n\n/**\n * Context - a typed Symbol for identifying context\n */\nexport type Context<T> = symbol & { __type?: T };\n\n/**\n * Context provide entry: [Context, value]\n */\nexport type ContextProvide<T = any> = [Context<T>, T];\n\n/**\n * Context component props - supports single or multiple context provides\n */\nexport interface ContextProps {\n // Single context: [ThemeContext, theme]\n // Multiple contexts: [[ThemeContext, theme], [UserContext, user]]\n provide: ContextProvide | ContextProvide[];\n children?: JSXNode;\n}\n\n/**\n * Helper type to allow Signal values for any attribute\n */\nexport type SignalOr<T> = T | ReadableSignal<T>;\n\n/**\n * Makes all properties in T accept Signal values\n * Excludes event handlers (functions) and children\n */\nexport type WithSignals<T> = {\n [K in keyof T]: K extends `on${string}`\n ? T[K] // Event handlers don't need Signal wrapper\n : K extends \"children\"\n ? T[K] // Children handled separately\n : T[K] extends (...args: any[]) => any\n ? T[K] // Other functions don't need Signal wrapper\n : SignalOr<T[K]>;\n};\n\n/**\n * Adds key property to element attributes for list reconciliation\n */\nexport type WithKey<T> = T & {\n key?: string | number;\n};\n","import type { JSXNode, VNode, VNodeType } from \"./types\";\nimport type { Signal } from \"@semajsx/signal\";\nimport { Fragment } from \"./types\";\nimport { isSignal } from \"@semajsx/signal\";\n\n/**\n * Create a VNode (Virtual Node)\n */\nexport function h(\n type: VNodeType,\n props: Record<string, any> | null,\n ...children: JSXNode[]\n): VNode {\n return {\n type,\n props: props || {},\n children: normalizeChildren(children),\n key: props?.key,\n };\n}\n\n/**\n * Create a text VNode\n */\nexport function createTextVNode(text: string | number): VNode {\n return {\n type: \"#text\",\n props: { nodeValue: String(text) },\n children: [],\n };\n}\n\n/**\n * Create a signal VNode wrapper\n */\nexport function createSignalVNode(signal: Signal<unknown>): VNode {\n return {\n type: \"#signal\",\n props: { signal },\n children: [],\n };\n}\n\n/**\n * Normalize children into an array of VNodes\n */\nfunction normalizeChildren(children: JSXNode[]): VNode[] {\n const result: VNode[] = [];\n\n for (const child of children) {\n if (child == null || typeof child === \"boolean\") {\n // Skip nullish and boolean values\n continue;\n }\n\n if (Array.isArray(child)) {\n // Recursively flatten arrays\n result.push(...normalizeChildren(child));\n } else if (typeof child === \"string\" || typeof child === \"number\") {\n // Convert primitives to text nodes\n result.push(createTextVNode(child));\n } else if (isSignal(child)) {\n // Wrap signals in special signal nodes\n result.push(createSignalVNode(child));\n } else if (isVNode(child)) {\n // Already a VNode\n result.push(child);\n } else {\n // Unknown type, skip\n console.warn(\"Unknown child type:\", typeof child);\n }\n }\n\n return result;\n}\n\n/**\n * Check if a value is a VNode\n */\nexport function isVNode(value: unknown): value is VNode {\n return (\n value != null &&\n typeof value === \"object\" &&\n \"type\" in value &&\n \"props\" in value &&\n \"children\" in value\n );\n}\n\n/**\n * Create a Fragment\n */\nexport function createFragment(children: JSXNode[]): VNode {\n return h(Fragment, null, ...children);\n}\n","/**\n * Unique symbol to mark Island components\n * This symbol is used to identify components that should be hydrated on the client\n */\nexport const ISLAND_MARKER: symbol = Symbol.for(\"semajsx.island\");\n","/**\n * Context API implementation\n */\n\nimport { h } from \"./vnode\";\nimport { Fragment } from \"./types\";\nimport type { ComponentAPI, Context as ContextType, ContextProps, VNode } from \"./types\";\n\n// Context map type - stores context values for current render environment\nexport type ContextMap = Map<symbol, any>;\n\n/**\n * Create a new Context (returns a typed Symbol)\n *\n * @param name - Optional name for debugging (defaults to \"anonymous\")\n * @returns Context symbol\n *\n * @example\n * ```typescript\n * const ThemeContext = context<Theme>();\n * const UserContext = context<User>('user'); // With debug name\n *\n * <Context provide={[ThemeContext, theme]}>\n * <App />\n * </Context>\n * ```\n */\nexport function context<T>(name?: string): ContextType<T> {\n const debugName = name || \"anonymous\";\n return Symbol(debugName) as ContextType<T>;\n}\n\n/**\n * Context component - provides context values to child components\n *\n * @example\n * ```typescript\n * // Single context\n * <Context provide={[ThemeContext, theme]}>\n * <App />\n * </Context>\n *\n * // Multiple contexts\n * <Context provide={[\n * [ThemeContext, theme],\n * [UserContext, user]\n * ]}>\n * <App />\n * </Context>\n * ```\n */\nexport function Context(props: ContextProps): VNode {\n const children = props.children\n ? Array.isArray(props.children)\n ? props.children\n : [props.children]\n : [];\n return h(Fragment, null, ...children);\n}\n\n// Mark as special context provider component\n(Context as any).__isContextProvider = true;\n\n/**\n * Create ComponentAPI instance for a component\n *\n * @param contextMap - The context map for current render environment\n * @returns ComponentAPI instance\n */\nexport function createComponentAPI(contextMap: ContextMap): ComponentAPI {\n return {\n inject<T>(context: ContextType<T>): T | undefined {\n return contextMap.get(context);\n },\n };\n}\n","import type { JSXNode } from \"./types\";\nimport type { Signal } from \"@semajsx/signal\";\nimport { computed, signal } from \"@semajsx/signal\";\n\n/**\n * Conditional rendering helper\n *\n * Renders content when condition signal is true, nothing when false.\n *\n * @example\n * // With VNode\n * const hint = when(showHint, <text>Press Ctrl+C to exit</text>);\n *\n * @example\n * // With function (lazy evaluation)\n * const hint = when(showHint, () => <text>Press Ctrl+C to exit</text>);\n */\nexport function when(\n condition: Signal<boolean>,\n content: JSXNode | (() => JSXNode),\n): Signal<JSXNode | null> {\n return computed([condition], (show) => {\n if (!show) return null;\n return typeof content === \"function\" ? content() : content;\n });\n}\n\n/**\n * Async resource helper for Promise<VNode>\n *\n * Renders pending content (or null) while the promise is pending, then renders\n * the resolved VNode. Handle errors in the promise itself using .catch().\n *\n * @example\n * // Handle everything in the promise\n * const content = resource(\n * fetchData()\n * .then(data => <text>{data}</text>)\n * .catch(err => <text color=\"red\">Error: {err.message}</text>)\n * );\n *\n * @example\n * // With optional pending content\n * const content = resource(\n * fetchData().then(data => <text>{data}</text>),\n * <text>Loading...</text>\n * );\n */\nexport function resource(promise: Promise<JSXNode>, pending?: JSXNode): Signal<JSXNode | null> {\n const content = signal<JSXNode | null>(pending || null);\n\n promise\n .then((result) => {\n content.value = result;\n })\n .catch((err) => {\n console.error(\"Unhandled promise rejection in resource():\", err);\n });\n\n return content;\n}\n\n/**\n * Async stream helper for AsyncIterable<VNode>\n *\n * Renders each yielded VNode from the async iterator, replacing the previous\n * content with each new value.\n *\n * @example\n * async function* generateContent() {\n * yield <text>Loading...</text>;\n * const data = await fetchData();\n * yield <text>Data: {data}</text>;\n * }\n *\n * const content = stream(generateContent());\n */\nexport function stream(\n iterator: AsyncIterable<JSXNode>,\n pending?: JSXNode,\n): Signal<JSXNode | null> {\n const content = signal<JSXNode | null>(pending || null);\n\n (async () => {\n try {\n for await (const vnode of iterator) {\n content.value = vnode;\n }\n } catch (err) {\n console.error(\"Error in stream():\", err);\n }\n })();\n\n return content;\n}\n","import { VNode, VNodeType } from \"./types\";\nimport { h } from \"./vnode\";\n\nexport function jsx(type: VNodeType, props: any, key?: any): VNode {\n const { children, ...restProps } = props || {};\n\n if (key !== undefined) {\n restProps.key = key;\n }\n\n if (children !== undefined) {\n return h(type, restProps, children);\n }\n\n return h(type, restProps);\n}\n\nexport function jsxs(type: VNodeType, props: any, key?: any): VNode {\n const { children, ...restProps } = props || {};\n\n if (key !== undefined) {\n restProps.key = key;\n }\n\n if (children !== undefined) {\n const childArray = Array.isArray(children) ? children : [children];\n return h(type, restProps, ...childArray);\n }\n\n return h(type, restProps);\n}\n","import type { JSXNode, JSXPrimitive, VNode } from \"./types\";\nimport { Fragment } from \"./types\";\nimport { isSignal } from \"@semajsx/signal\";\nimport { createSignalVNode, createTextVNode, isVNode } from \"./vnode\";\n\n/**\n * Normalize the `children` prop passed to components so it mirrors React semantics.\n * - 0 children => undefined\n * - 1 child => the child itself\n * - >1 children => array\n */\nexport function normalizeChildrenProp(children: VNode[]): VNode | VNode[] | undefined {\n if (children.length === 0) {\n return undefined;\n }\n if (children.length === 1) {\n return children[0];\n }\n return children;\n}\n\n/**\n * Normalize any JSXNode result from a component into a concrete VNode.\n */\nexport function normalizeComponentResult(result: VNode | JSXPrimitive | Iterable<JSXNode>): VNode {\n if (isVNode(result)) {\n return result;\n }\n\n if (typeof result === \"string\" || typeof result === \"number\") {\n return createTextVNode(result);\n }\n\n if (result == null || typeof result === \"boolean\") {\n return createTextVNode(\"\");\n }\n\n if (Array.isArray(result) || isIterable(result)) {\n const normalizedChildren = normalizeIterableChildren(result);\n return {\n type: Fragment,\n props: {},\n children: normalizedChildren,\n };\n }\n\n throw new Error(`Invalid component return type: ${typeof result}`);\n}\n\nfunction normalizeIterableChildren(children: Iterable<JSXNode>): VNode[] {\n const normalized: VNode[] = [];\n\n for (const child of children) {\n if (child == null || typeof child === \"boolean\") {\n continue;\n }\n\n if (Array.isArray(child) || isIterable(child)) {\n normalized.push(...normalizeIterableChildren(child as Iterable<JSXNode>));\n continue;\n }\n\n if (typeof child === \"string\" || typeof child === \"number\") {\n normalized.push(createTextVNode(child));\n continue;\n }\n\n if (isSignal(child)) {\n normalized.push(createSignalVNode(child));\n continue;\n }\n\n if (isVNode(child)) {\n normalized.push(child);\n continue;\n }\n\n throw new Error(`Invalid child in iterable: ${typeof child}`);\n }\n\n return normalized;\n}\n\nfunction isIterable(value: unknown): value is Iterable<unknown> {\n return value != null && typeof (value as any)[Symbol.iterator] === \"function\";\n}\n","import type { VNode, Ref } from \"./types\";\nimport { Fragment, Forward, Portal } from \"./types\";\nimport { isSignal } from \"@semajsx/signal\";\nimport { isVNode } from \"./vnode\";\nimport { resource, stream } from \"./helpers\";\nimport { type ContextMap, createComponentAPI } from \"./context\";\nimport { normalizeChildrenProp, normalizeComponentResult } from \"./component\";\n\n/**\n * Generic rendered node structure\n */\nexport interface RenderedNode<TNode> {\n vnode: VNode;\n node: TNode | null;\n subscriptions: Array<() => void>;\n children: RenderedNode<TNode>[];\n}\n\n/**\n * Operations strategy for different rendering targets\n */\nexport interface RenderStrategy<TNode> {\n /**\n * Create a text node\n */\n createTextNode(text: string): TNode;\n\n /**\n * Create a comment node (used for markers)\n */\n createComment(text: string): TNode;\n\n /**\n * Create an element node\n */\n createElement(type: string): TNode;\n\n /**\n * Get the parent node of a node\n */\n getParent(node: TNode): TNode | null;\n\n /**\n * Get the next sibling of a node\n */\n getNextSibling(node: TNode): TNode | null;\n\n /**\n * Insert a node before another node\n */\n insertBefore(parent: TNode, newNode: TNode, beforeNode: TNode | null): void;\n\n /**\n * Append child to parent\n */\n appendChild(parent: TNode, child: TNode): void;\n\n /**\n * Remove child from its parent\n */\n removeChild(node: TNode): void;\n\n /**\n * Replace old node with new node\n */\n replaceNode(oldNode: TNode, newNode: TNode): void;\n\n /**\n * Set a property on a node\n */\n setProperty(node: TNode, key: string, value: unknown): void;\n\n /**\n * Set a signal property on a node (returns unsubscribe function)\n */\n setSignalProperty(node: TNode, key: string, signal: any): () => void;\n\n /**\n * Optional: Set a ref on a node (returns cleanup function)\n * This is only used for DOM rendering\n */\n setRef?(node: TNode, ref: Ref<TNode>): () => void;\n\n /**\n * Optional: Try to reuse an existing node instead of replacing it\n * Returns true if the node was successfully reused\n * This is used for DOM optimization but not needed for terminal\n */\n tryReuseNode?(\n oldNode: TNode,\n newNode: TNode,\n oldRendered: RenderedNode<TNode>,\n newRendered: RenderedNode<TNode>,\n ): boolean;\n\n /**\n * Optional: Called before a component function is invoked.\n * Renderers can use this to set up per-component state (e.g., cleanup scopes).\n */\n onBeforeComponent?(): void;\n\n /**\n * Optional: Called after a component function returns.\n * Returns an array of cleanup functions to attach to the component's RenderedNode subscriptions.\n * This enables per-component lifecycle hooks like onCleanup().\n */\n onAfterComponent?(): Array<() => void>;\n}\n\n/**\n * Check if a value is a Promise\n */\nexport function isPromise<T>(value: any): value is Promise<T> {\n return value && typeof value.then === \"function\";\n}\n\n/**\n * Check if a value is an AsyncIterator\n */\nexport function isAsyncIterator<T>(value: any): value is AsyncIterableIterator<T> {\n return value && typeof value[Symbol.asyncIterator] === \"function\";\n}\n\n/**\n * Core rendering logic - works for both DOM and Terminal\n */\nexport function createRenderer<TNode>(strategy: RenderStrategy<TNode>): {\n renderNode: (vnode: VNode, parentContext: ContextMap) => RenderedNode<TNode>;\n unmount: (node: RenderedNode<TNode>) => void;\n cleanupSubscriptions: (node: RenderedNode<TNode>) => void;\n} {\n /**\n * Helper to recursively collect all actual DOM nodes from a rendered node\n * Handles fragments and signal nodes that may not have their own DOM node\n */\n function collectNodes(rendered: RenderedNode<TNode>): TNode[] {\n const nodes: TNode[] = [];\n\n // Fragment: no node, only children\n if (rendered.vnode.type === Fragment) {\n for (const child of rendered.children) {\n nodes.push(...collectNodes(child));\n }\n return nodes;\n }\n\n // Portal: children are rendered into a different container,\n // so they should not be collected in the parent tree\n if (rendered.vnode.type === Portal) {\n return nodes;\n }\n\n // Signal marker: include marker node + content children\n if (rendered.vnode.type === \"#signal\") {\n if (rendered.node) {\n nodes.push(rendered.node); // marker\n }\n // Collect content children (after marker)\n for (const child of rendered.children) {\n nodes.push(...collectNodes(child));\n }\n return nodes;\n }\n\n // Regular elements and text nodes: just the node itself\n // Children are already attached to the node\n if (rendered.node) {\n nodes.push(rendered.node);\n }\n\n return nodes;\n }\n\n /**\n * Render a single VNode\n */\n function renderNode(vnode: VNode, parentContext: ContextMap): RenderedNode<TNode> {\n const { type } = vnode;\n\n // Text node\n if (type === \"#text\") {\n return renderTextNode(vnode);\n }\n\n // Signal VNode\n if (type === \"#signal\") {\n return renderSignalNode(vnode, parentContext);\n }\n\n // Fragment\n if (type === Fragment) {\n return renderFragment(vnode, parentContext);\n }\n\n // Portal\n if (type === Portal) {\n return renderPortal(vnode, parentContext);\n }\n\n // Forward\n if (type === Forward) {\n return renderForward(vnode, parentContext);\n }\n\n // Native node (pre-created element from external libraries)\n if (type === \"#native\") {\n return renderNativeNode(vnode);\n }\n\n // Component\n if (typeof type === \"function\") {\n return renderComponent(vnode, parentContext);\n }\n\n // Element\n if (typeof type === \"string\") {\n return renderElement(vnode, parentContext);\n }\n\n throw new Error(`Unknown VNode type: ${String(type)}`);\n }\n\n /**\n * Render a text node\n */\n function renderTextNode(vnode: VNode): RenderedNode<TNode> {\n const text = vnode.props?.nodeValue || \"\";\n const node = strategy.createTextNode(text);\n\n return {\n vnode,\n node,\n subscriptions: [],\n children: [],\n };\n }\n\n /**\n * Render a signal VNode\n */\n function renderSignalNode(vnode: VNode, parentContext: ContextMap): RenderedNode<TNode> {\n const signal = vnode.props?.signal;\n // Use captured context if available (for async components), otherwise parent context\n const contextForSignal = vnode.props?.context || parentContext;\n\n if (!isSignal(signal)) {\n throw new Error(\"Signal VNode must have a signal prop\");\n }\n\n // Create a comment node as a marker to track the signal's position in the DOM\n // This is necessary because signal content might be a Fragment (no direct node)\n // or might be empty initially\n const marker = strategy.createComment(\"signal\");\n\n // Get initial value and render it\n const initialValue = signal.value;\n let currentRendered = renderValueToNode(initialValue, contextForSignal);\n\n const subscriptions: Array<() => void> = [];\n\n // Subscribe to signal changes\n const unsubscribe = signal.subscribe((value) => {\n const newRendered = renderValueToNode(value, contextForSignal);\n\n // Collect actual DOM nodes from old and new rendered trees\n const oldContentNodes = collectNodes(currentRendered);\n const newContentNodes = collectNodes(newRendered);\n\n // Get the parent from the marker\n const parent = strategy.getParent(marker);\n if (!parent) {\n console.warn(\"[Signal] Marker not in DOM, cannot update\");\n return;\n }\n\n // Remove all old content nodes\n for (const node of oldContentNodes) {\n strategy.removeChild(node);\n }\n\n // Insert new content nodes after the marker\n let insertAfter = strategy.getNextSibling(marker);\n for (const node of newContentNodes) {\n strategy.insertBefore(parent, node, insertAfter);\n // Update insertAfter to maintain order (insert at the position after the last inserted)\n insertAfter = strategy.getNextSibling(node);\n }\n\n // Unmount old rendered tree: cleans up subscriptions AND removes\n // portal children from their containers (cleanupSubscriptions alone\n // would leave portal content orphaned in the portal container)\n unmount(currentRendered);\n\n currentRendered = newRendered;\n });\n\n subscriptions.push(unsubscribe);\n\n return {\n vnode,\n node: marker,\n subscriptions,\n children: currentRendered ? [currentRendered] : [],\n };\n }\n\n /**\n * Helper to convert a signal value to a rendered node\n */\n function renderValueToNode(value: unknown, context: ContextMap): RenderedNode<TNode> {\n let newVNode: VNode;\n\n // Convert value to VNode\n if (isVNode(value)) {\n newVNode = value;\n } else if (Array.isArray(value)) {\n // Support arrays - wrap in Fragment automatically\n // This allows: computed(todos, list => list.map(...))\n // Without requiring manual Fragment wrapping\n newVNode = {\n type: Fragment,\n props: {},\n children: value.filter(isVNode), // Filter out non-VNodes\n };\n } else if (typeof value === \"string\" || typeof value === \"number\") {\n newVNode = {\n type: \"#text\",\n props: { nodeValue: String(value) },\n children: [],\n };\n } else if (value == null || typeof value === \"boolean\") {\n // Render empty text for null/undefined/boolean\n // This works for both DOM and terminal\n newVNode = {\n type: \"#text\",\n props: { nodeValue: \"\" },\n children: [],\n };\n } else {\n throw new Error(`Invalid signal value type: ${typeof value}`);\n }\n\n return renderNode(newVNode, context);\n }\n\n /**\n * Render a fragment\n */\n function renderFragment(vnode: VNode, parentContext: ContextMap): RenderedNode<TNode> {\n const children = vnode.children.map((child) => renderNode(child, parentContext));\n\n // Fragment has no node of its own\n return {\n vnode,\n node: null,\n subscriptions: [],\n children,\n };\n }\n\n /**\n * Render a portal\n * Portal renders its children into a different container\n */\n function renderPortal(vnode: VNode, parentContext: ContextMap): RenderedNode<TNode> {\n const container = vnode.props?.container;\n\n if (!container) {\n throw new Error(\"Portal must have a container prop\");\n }\n\n // Render children with same context\n const children = vnode.children.map((child) => renderNode(child, parentContext));\n\n // Append all child nodes to the portal container (recursively handles fragments)\n for (const child of children) {\n const nodes = collectNodes(child);\n for (const node of nodes) {\n strategy.appendChild(container, node);\n }\n }\n\n // Portal has no node in the parent tree\n return {\n vnode,\n node: null,\n subscriptions: [],\n children,\n };\n }\n\n /**\n * Merge Forward's props into the child's props\n * - class/className: concatenated (array)\n * - style: merged objects (Forward overrides per-property)\n * - on* events: chained (both handlers run)\n * - other props: Forward overrides child\n */\n function mergeForwardProps(\n childProps: Record<string, any>,\n forwardProps: Record<string, any>,\n ): Record<string, any> {\n const merged = { ...childProps };\n\n for (const [key, value] of Object.entries(forwardProps)) {\n if (key === \"key\" || key === \"children\") continue;\n\n if ((key === \"class\" || key === \"className\") && merged[key] != null) {\n // Concatenate class values as array — renderers resolve arrays\n merged[key] = [merged[key], value];\n } else if (key === \"style\" && typeof merged[key] === \"object\" && typeof value === \"object\") {\n // Merge style objects (Forward properties override)\n merged[key] = { ...merged[key], ...value };\n } else if (\n key.startsWith(\"on\") &&\n typeof value === \"function\" &&\n typeof merged[key] === \"function\"\n ) {\n // Chain event handlers: Forward's runs first, then child's\n const existing = merged[key];\n merged[key] = (...args: unknown[]) => {\n value(...args);\n existing(...args);\n };\n } else {\n merged[key] = value;\n }\n }\n\n return merged;\n }\n\n /**\n * Render a Forward node\n * Forward merges its props onto its single child and renders it directly\n */\n function renderForward(vnode: VNode, parentContext: ContextMap): RenderedNode<TNode> {\n const child = vnode.children[0];\n\n if (!child || vnode.children.length !== 1) {\n throw new Error(\"Forward must have exactly one child element\");\n }\n\n const forwardProps = vnode.props || {};\n\n // Create a new VNode with merged props\n const mergedChild: VNode = {\n ...child,\n props: mergeForwardProps(child.props || {}, forwardProps),\n };\n\n // Render the merged child directly — Forward is completely transparent\n return renderNode(mergedChild, parentContext);\n }\n\n /**\n * Render a native node (pre-created element from external libraries)\n * The element is used directly without creating a new one.\n * Additional props are applied via the strategy's setProperty/setSignalProperty.\n */\n function renderNativeNode(vnode: VNode): RenderedNode<TNode> {\n const nativeNode = vnode.props?.__nativeNode as TNode;\n\n if (!nativeNode) {\n throw new Error(\"Native VNode must have an __nativeNode prop\");\n }\n\n const subscriptions: Array<() => void> = [];\n\n // Apply additional props to the native node\n const props = vnode.props || {};\n for (const [key, value] of Object.entries(props)) {\n if (key === \"__nativeNode\" || key === \"key\" || key === \"children\") continue;\n\n if (isSignal(value)) {\n const unsub = strategy.setSignalProperty(nativeNode, key, value);\n subscriptions.push(unsub);\n } else {\n strategy.setProperty(nativeNode, key, value);\n }\n }\n\n return {\n vnode,\n node: nativeNode,\n subscriptions,\n children: [],\n };\n }\n\n /**\n * Render a component\n */\n function renderComponent(vnode: VNode, parentContext: ContextMap): RenderedNode<TNode> {\n if (typeof vnode.type !== \"function\") {\n throw new Error(\"Component vnode must have a function type\");\n }\n\n const Component = vnode.type;\n const props = {\n ...vnode.props,\n children: normalizeChildrenProp(vnode.children),\n };\n\n // Prepare current component's context\n let currentContext = parentContext;\n\n // Check if this is a Context Provider\n const isContextProvider = (Component as any).__isContextProvider;\n\n if (isContextProvider) {\n // Context Provider: create new context map with provided values\n currentContext = new Map(parentContext);\n const provide = (props as any).provide;\n\n if (provide) {\n // Check if it's a single provide [Context, value] or multiple [[Context, value], ...]\n const isSingle = provide.length === 2 && typeof provide[0] === \"symbol\";\n\n if (isSingle) {\n // Single: [Context, value]\n const [context, value] = provide;\n currentContext.set(context, value);\n } else {\n // Multiple: [[Context, value], ...]\n for (const [context, value] of provide) {\n currentContext.set(context, value);\n }\n }\n }\n }\n\n // Create ComponentAPI\n const ctx = createComponentAPI(currentContext);\n\n // Notify strategy before component render (for per-component lifecycle hooks)\n strategy.onBeforeComponent?.();\n\n // Call component function with props and ctx\n const result = Component(props, ctx);\n\n // Collect per-component cleanup subscriptions\n const componentCleanups = strategy.onAfterComponent?.() ?? [];\n\n // Handle async component (Promise<VNode>)\n if (isPromise(result)) {\n const pending: VNode = {\n type: \"#text\",\n props: { nodeValue: \"\" },\n children: [],\n };\n const resultSignal = resource(result, pending);\n const signalVNode: VNode = {\n type: \"#signal\",\n props: { signal: resultSignal, context: currentContext },\n children: [],\n };\n const rendered = renderNode(signalVNode, currentContext);\n return {\n vnode,\n node: rendered.node,\n subscriptions: [...componentCleanups, ...rendered.subscriptions],\n children: [rendered],\n };\n }\n\n // Handle async generator component (AsyncIterableIterator<VNode>)\n if (isAsyncIterator(result)) {\n const pending: VNode = {\n type: \"#text\",\n props: { nodeValue: \"\" },\n children: [],\n };\n const resultSignal = stream(result, pending);\n const signalVNode: VNode = {\n type: \"#signal\",\n props: { signal: resultSignal, context: currentContext },\n children: [],\n };\n const rendered = renderNode(signalVNode, currentContext);\n return {\n vnode,\n node: rendered.node,\n subscriptions: [...componentCleanups, ...rendered.subscriptions],\n children: [rendered],\n };\n }\n\n // Handle signal component (Signal<VNode>)\n if (isSignal(result)) {\n const signalVNode: VNode = {\n type: \"#signal\",\n props: { signal: result, context: currentContext },\n children: [],\n };\n const rendered = renderNode(signalVNode, currentContext);\n return {\n vnode,\n node: rendered.node,\n subscriptions: [...componentCleanups, ...rendered.subscriptions],\n children: [rendered],\n };\n }\n\n // Handle normal sync component (VNode)\n const normalizedResult = normalizeComponentResult(result);\n const rendered = renderNode(normalizedResult, currentContext);\n\n return {\n vnode,\n node: rendered.node,\n subscriptions: [...componentCleanups, ...rendered.subscriptions],\n children: [rendered],\n };\n }\n\n /**\n * Render an element\n */\n function renderElement(vnode: VNode, parentContext: ContextMap): RenderedNode<TNode> {\n if (typeof vnode.type !== \"string\") {\n throw new Error(\"Element vnode must have a string type\");\n }\n\n const element = strategy.createElement(vnode.type);\n const subscriptions: Array<() => void> = [];\n\n // Apply props\n const props = vnode.props || {};\n for (const [key, value] of Object.entries(props)) {\n if (key === \"key\" || key === \"children\") continue;\n\n // Handle ref separately\n if (key === \"ref\") {\n if (strategy.setRef && value != null) {\n const cleanup = strategy.setRef(element, value as Ref<TNode>);\n subscriptions.push(cleanup);\n }\n continue;\n }\n\n if (isSignal(value)) {\n const unsub = strategy.setSignalProperty(element, key, value);\n subscriptions.push(unsub);\n } else {\n strategy.setProperty(element, key, value);\n }\n }\n\n // Render children with same context\n const children = vnode.children.map((child) => renderNode(child, parentContext));\n\n // Append all child nodes (recursively handles fragments and signal wrappers)\n for (const child of children) {\n const nodes = collectNodes(child);\n for (const node of nodes) {\n strategy.appendChild(element, node);\n }\n }\n\n return {\n vnode,\n node: element,\n subscriptions,\n children,\n };\n }\n\n /**\n * Unmount a rendered node\n */\n function unmount(node: RenderedNode<TNode>): void {\n // Cleanup subscriptions\n for (const unsub of node.subscriptions) {\n unsub();\n }\n\n // Recursively unmount children\n for (const child of node.children) {\n unmount(child);\n }\n\n // Remove from tree\n if (node.node) {\n strategy.removeChild(node.node);\n }\n }\n\n /**\n * Clean up subscriptions without removing nodes from tree\n */\n function cleanupSubscriptions(node: RenderedNode<TNode>): void {\n // Cleanup subscriptions\n for (const unsub of node.subscriptions) {\n unsub();\n }\n\n // Recursively cleanup children\n for (const child of node.children) {\n cleanupSubscriptions(child);\n }\n }\n\n return {\n renderNode: renderNode,\n unmount: unmount,\n cleanupSubscriptions: cleanupSubscriptions,\n };\n}\n"],"mappings":"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"}