@estjs/template 0.0.16-beta.1 → 0.0.16-beta.3
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/{chunk-3E4EK64L.dev.esm.js → chunk-JT6RSDKI.dev.esm.js} +11 -11
- package/dist/chunk-JT6RSDKI.dev.esm.js.map +1 -0
- package/dist/chunk-WWGSC3TY.esm.js +2 -0
- package/dist/chunk-WWGSC3TY.esm.js.map +1 -0
- package/dist/{internal-Bz6h0aPa.d.cts → internal-DSKAj-zW.d.cts} +4 -0
- package/dist/{internal-Bz6h0aPa.d.ts → internal-DSKAj-zW.d.ts} +4 -0
- package/dist/internal.cjs.js +1 -1
- package/dist/internal.cjs.js.map +1 -1
- package/dist/internal.d.cts +2 -1
- package/dist/internal.d.ts +2 -1
- package/dist/internal.dev.cjs.js +9 -9
- package/dist/internal.dev.cjs.js.map +1 -1
- package/dist/internal.dev.esm.js +1 -1
- package/dist/internal.esm.js +1 -1
- package/dist/template.cjs.js +2 -2
- package/dist/template.cjs.js.map +1 -1
- package/dist/template.d.cts +16 -13
- package/dist/template.d.ts +16 -13
- package/dist/template.dev.cjs.js +134 -134
- package/dist/template.dev.cjs.js.map +1 -1
- package/dist/template.dev.esm.js +126 -125
- package/dist/template.dev.esm.js.map +1 -1
- package/dist/template.esm.js +2 -2
- package/dist/template.esm.js.map +1 -1
- package/package.json +7 -3
- package/dist/chunk-3E4EK64L.dev.esm.js.map +0 -1
- package/dist/chunk-IRDMO5MX.esm.js +0 -2
- package/dist/chunk-IRDMO5MX.esm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/operations/attr.ts","../src/operations/class.ts","../src/operations/style.ts","../src/hydration.ts","../src/reconcile.ts","../src/dom.ts","../src/operations/event.ts","../src/lifecycle.ts","../src/component.ts","../src/renderer.ts","../src/provide.ts","../src/events.ts","../src/binding.ts","../src/utils.ts","../src/components/Fragment.ts","../src/components/Portal.ts","../src/components/Suspense.ts","../src/components/createResource.ts","../src/components/AsyncComponent.ts","../src/components/For.ts"],"names":["next","isBoolean","isString","isObject","_a","warn","child","error","isFunction","template","document","effect","isSignal","isComputed","isBrowser","isArray","isPromise","children","alive","currentComp","swap","batchFragment"],"mappings":"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","file":"template.dev.esm.js","sourcesContent":["/**\n * event prefix, used to distinguish event handler properties\n */\nexport const EVENT_PREFIX = 'on';\n\n/**\n * update prefix, used to identify update callback properties\n */\nexport const UPDATE_PREFIX = 'update';\n\n/**\n * children property name\n */\nexport const CHILDREN_PROP = 'children';\n/**\n * Key name for the Spread attribute\n */\nexport const SPREAD_NAME = '_$spread$';\n\n/**\n * used to get the DOM element reference\n */\nexport const REF_KEY = 'ref';\n/**\n * Component key property name\n */\nexport const KEY_PROP = 'key' as const;\n\n/**\n * SVG namespace constant\n */\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * XML namespace for xlink attributes\n */\nexport const XLINK_NAMESPACE = 'http://www.w3.org/2000/xlink';\n\n/**\n * xmlns namespace for SVG elements\n */\nexport const XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/';\n\nexport const NORMAL_COMPONENT = Symbol(__DEV__ ? 'Normal Component' : '');\nexport const FRAGMENT_COMPONENT = Symbol(__DEV__ ? 'Fragment Component' : '');\nexport const PORTAL_COMPONENT = Symbol(__DEV__ ? 'Portal Component' : '');\nexport const SUSPENSE_COMPONENT = Symbol(__DEV__ ? 'Suspense Component' : '');\nexport const FOR_COMPONENT = Symbol(__DEV__ ? 'For Component' : '');\nexport enum COMPONENT_STATE {\n /** Initial state */\n INITIAL,\n /** Mounting */\n MOUNTING,\n /** MOUNTED */\n MOUNTED,\n /** Updating */\n UPDATING,\n /** Destroying */\n DESTROYING,\n /** destroy */\n DESTROYED,\n}\nexport enum COMPONENT_TYPE {\n NORMAL = 'normal',\n FRAGMENT = 'fragment',\n PORTAL = 'portal',\n SUSPENSE = 'suspense',\n FOR = 'for',\n}\n","import {\n includeBooleanAttr,\n isBooleanAttr,\n isObject,\n isSpecialBooleanAttr,\n isString,\n isSymbol,\n warn,\n} from '@estjs/shared';\nimport {\n KEY_PROP,\n SPREAD_NAME,\n SVG_NAMESPACE,\n XLINK_NAMESPACE,\n XMLNS_NAMESPACE,\n} from '../constants';\n\n/**\n * Supported value types for the attribute patch layer.\n *\n * In addition to primitive values, spread objects are also accepted, so the\n * type keeps `Record<string, unknown>`.\n */\nexport type AttrValue = string | boolean | number | null | undefined | Record<string, unknown>;\n\n/**\n * Applies a minimal attribute update to an element.\n *\n * This is the most general-purpose attribute updater in the template runtime.\n * It is responsible for:\n * - skipping internal reserved fields;\n * - expanding spread attribute objects;\n * - handling boolean attributes and SVG / xlink / xmlns namespaces;\n * - applying basic dangerous-URL protection;\n * - refusing raw HTML sinks such as `innerHTML` / `srcdoc`;\n * - staying silent during hydration to avoid overwriting SSR DOM.\n *\n * @param el - The element to patch.\n * @param key - The attribute key.\n * @param prev - Previous attribute value.\n * @param next - Next attribute value.\n */\nexport function patchAttr(el: Element, key: string, prev: AttrValue, next: AttrValue) {\n if (key === KEY_PROP) {\n if (next == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(next));\n }\n return;\n }\n if (key === SPREAD_NAME) {\n const prevObj = isObject(prev) ? (prev as Record<string, unknown>) : null;\n const nextObj = isObject(next) ? (next as Record<string, unknown>) : null;\n\n if (__DEV__) {\n if (next != null && !nextObj) {\n warn('spread attribute must be an object');\n }\n }\n\n if (prevObj) {\n for (const attrKey in prevObj) {\n if (attrKey === SPREAD_NAME) {\n if (__DEV__) {\n warn('nested spread attributes are ignored');\n }\n continue;\n }\n if (!nextObj || !(attrKey in nextObj)) {\n patchAttr(el, attrKey, prevObj[attrKey] as AttrValue, null);\n }\n }\n }\n\n if (nextObj) {\n for (const attrKey in nextObj) {\n if (attrKey === SPREAD_NAME) {\n if (__DEV__) {\n warn('nested spread attributes are ignored');\n }\n continue;\n }\n patchAttr(el, attrKey, prevObj?.[attrKey] as AttrValue, nextObj[attrKey] as AttrValue);\n }\n }\n return;\n }\n\n const elementIsSVG = el?.namespaceURI === SVG_NAMESPACE;\n const isXlink = elementIsSVG && key.startsWith('xlink:');\n const isXmlns = elementIsSVG && key.startsWith('xmlns:');\n\n const isBoolean = isSpecialBooleanAttr(key) || isBooleanAttr(key);\n\n // Early return if values are the same\n if (prev === next) {\n return;\n }\n\n // Event attributes are handled by the dedicated event layer, so skip them here.\n if (key.length > 2 && key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110) {\n return;\n }\n\n // Lowercase only after early returns, since it is only needed for specific checks like href.\n const lowerKey = key.toLowerCase();\n\n if (lowerKey === 'innerhtml' || lowerKey === 'srcdoc') {\n if (__DEV__) {\n warn(`${key} updates are ignored by patchAttr`);\n }\n return;\n }\n\n if (next == null) {\n if (isXlink) {\n el.removeAttributeNS(XLINK_NAMESPACE, key.slice(6));\n } else if (isXmlns) {\n const localName = key.slice(6);\n el.removeAttributeNS(XMLNS_NAMESPACE, localName);\n } else {\n el.removeAttribute(key);\n }\n return;\n }\n\n if (isBoolean) {\n if (includeBooleanAttr(next)) {\n el.setAttribute(key, '');\n } else {\n el.removeAttribute(key);\n }\n return;\n }\n\n const attrValue = isSymbol(next) ? String(next) : next;\n\n // Basic safety guard: block dangerous protocols on common URL attributes.\n const isUrlAttr =\n lowerKey === 'href' ||\n lowerKey === 'src' ||\n lowerKey === 'xlink:href' ||\n lowerKey === 'action' ||\n lowerKey === 'formaction' ||\n lowerKey === 'poster';\n if (isUrlAttr && isString(attrValue)) {\n const v = attrValue.trim().toLowerCase();\n if (v.startsWith('javascript:') || v.startsWith('data:')) {\n return;\n }\n }\n\n if (isXlink) {\n el.setAttributeNS(XLINK_NAMESPACE, key, String(attrValue));\n return;\n }\n\n if (isXmlns) {\n el.setAttributeNS(XMLNS_NAMESPACE, key, String(attrValue));\n return;\n }\n\n if (elementIsSVG) {\n el.setAttribute(key, String(attrValue));\n } else {\n if (key in el) {\n try {\n el[key] = attrValue;\n } catch {\n el.setAttribute(key, String(attrValue));\n }\n } else {\n el.setAttribute(key, String(attrValue));\n }\n }\n}\n","import { isString, normalizeClassName } from '@estjs/shared';\n\n/**\n * Supported value types for the class patch layer.\n */\nexport type ClassValue = string | Record<string, boolean> | ClassValue[] | null | undefined;\n\n/**\n * Applies a minimal class update to an element.\n *\n * Class values are normalized into a string first, then written through\n * `className` or `setAttribute('class')` depending on the element type.\n * Hydration stays silent and reuses the server-rendered result by default.\n *\n * @param el - The element to patch.\n * @param prev - Previous class value.\n * @param next - Next class value.\n * @param isSVG - Whether the element is an SVG element.\n * @returns {void}\n */\nexport function patchClass(\n el: Element,\n prev: unknown,\n next: unknown,\n isSVG: boolean = false,\n): void {\n if (prev === next) {\n return;\n }\n\n const normalizedNext = normalizeClass(next);\n if (!normalizedNext) {\n el.removeAttribute('class');\n return;\n }\n\n // Skip DOM write if normalized values are identical.\n // For string prev, it's already normalized; otherwise normalize.\n const normalizedPrev = isString(prev) ? prev : normalizeClass(prev);\n if (normalizedPrev === normalizedNext) {\n return;\n }\n\n // SVG nodes cannot rely on `className` consistently, so use the attribute path.\n if (isSVG) {\n el.setAttribute('class', normalizedNext);\n } else {\n el.className = normalizedNext;\n }\n}\n\n/**\n * Normalizes supported class inputs into a single string.\n */\nexport const normalizeClass = normalizeClassName;\n","import { camelCase, capitalize, isArray, isObject, isString } from '@estjs/shared';\n\n/**\n * Internal symbol used to mark raw CSS variable text in style objects.\n * @internal\n */\nexport const CSS_VAR_TEXT: unique symbol = Symbol('CSS_VAR_TEXT');\n\n// Precompile the `!important` detector to avoid recreating it on every write.\nconst importantRE = /\\s*!important$/;\n\n// Candidate vendor prefixes and their lookup cache.\nconst prefixes = ['Webkit', 'Moz', 'ms'];\nconst prefixCache: Record<string, string> = {};\n\n/**\n * Supported value types for the style patch layer.\n */\nexport type Style = string | Record<string, string | string[]> | null | undefined;\n\n/**\n * Applies a minimal style update to an element.\n *\n * Supports both string-based and object-based styles, while staying silent\n * during hydration so the server-rendered DOM can be reused.\n *\n * @param el - The element to patch.\n * @param prev - Previous style value.\n * @param next - Next style value.\n * @returns {void}\n */\nexport function patchStyle(el: HTMLElement, prev: unknown, next?: unknown) {\n const style = el.style;\n\n if (next && isString(next)) {\n if (prev !== next) {\n style.cssText = next;\n }\n return;\n }\n\n if (!next) {\n if (prev) {\n el.removeAttribute('style');\n }\n return;\n }\n\n // When the previous value is an object, remove keys that disappeared in the next value.\n if (prev && !isString(prev)) {\n const prevObj = prev as Record<string, unknown>;\n for (const key in prevObj) {\n if (!next || (next as Record<string, unknown>)[key] == null) {\n setStyle(style, key, '');\n }\n }\n } else if (prev && isString(prev)) {\n // When the previous value is a string, approximate its keys and remove missing ones.\n // Match only CSS property-name tokens (letters/digits/hyphens before a colon).\n // This is linear and ignores semicolons inside url() or quoted values because\n // those fragments never match /letter+:/.\n const declRE = /(?:^|;)\\s*([a-z][a-z\\d-]*)\\s*:/gi;\n let match: RegExpExecArray | null;\n while ((match = declRE.exec(prev)) !== null) {\n const key = match[1].trim();\n if (key && next && isObject(next) && (next as Record<string, unknown>)[key] == null) {\n setStyle(style, key, '');\n }\n }\n }\n\n // Apply the next style values last.\n if (next && !isString(next)) {\n const nextObj = next as Record<string, unknown>;\n for (const key in nextObj) {\n const value = nextObj[key];\n if (\n (!prev || isString(prev) || (prev as Record<string, unknown>)[key] !== value) &&\n value != null\n ) {\n setStyle(style, key, value as string | string[]);\n }\n }\n }\n}\n\n/**\n * Sets a single style property.\n *\n * Centralizes array-value expansion, CSS variable writes, vendor-prefix\n * resolution, and `!important` handling in one place.\n *\n * @param style - Target style object.\n * @param name - Style property name.\n * @param val - Style value.\n * @private\n */\nexport function setStyle(style: CSSStyleDeclaration, name: string, val: string | string[]): void {\n // Array values represent multiple candidates for the same property.\n if (isArray(val)) {\n for (const element of val) {\n setStyle(style, name, element);\n }\n return;\n }\n\n if (val == null || val === '') {\n val = '';\n }\n\n // CSS variables must be written through `setProperty()`.\n if (name.startsWith('--')) {\n style.setProperty(name, val);\n return;\n }\n\n // Regular properties try vendor prefix resolution first.\n const prefixed = autoPrefix(style, name);\n\n // `!important` cannot use direct property assignment and must go through `setProperty()`.\n if (isString(val) && importantRE.test(val)) {\n style.setProperty(camelCase(prefixed), val.replace(importantRE, ''), 'important');\n } else {\n style[prefixed] = val;\n }\n}\n\n/**\n * Resolves the correct vendor-prefixed style property name.\n *\n * Results are cached in `prefixCache` to avoid repeated hot-path detection.\n *\n * @param style - Target style object.\n * @param rawName - Original property name.\n * @returns The property name that can be written to `style` directly.\n * @private\n */\nfunction autoPrefix(style: CSSStyleDeclaration, rawName: string): string {\n // Check the cache first.\n const cached = prefixCache[rawName];\n if (cached) {\n return cached;\n }\n\n // Try the standard camelCase property first.\n let name = camelCase(rawName);\n if (name !== 'filter' && name in style) {\n return (prefixCache[rawName] = name);\n }\n\n // If the standard property does not exist, try vendor-prefixed variants.\n name = capitalize(name);\n for (const prefix of prefixes) {\n const prefixed = prefix + name;\n if (prefixed in style) {\n return (prefixCache[rawName] = prefixed);\n }\n }\n\n return rawName;\n}\n","import { isBrowser, warn } from '@estjs/shared';\nimport { patchAttr } from './operations/attr';\nimport { patchClass } from './operations/class';\nimport { patchStyle } from './operations/style';\nimport { template } from './renderer';\n\n// ---------------------------------------------------------------------------\n// Hydration key counter (mirrors server-side getHydrationKey / resetHydrationKey)\n// ---------------------------------------------------------------------------\n\nlet _hydrationKey = 0;\n\n/**\n * Returns a new hydration key.\n *\n * @returns The new hydration key as a string.\n */\nexport function getHydrationKey(): string {\n return String(_hydrationKey++);\n}\n\n/**\n * Resets the client-side hydration key counter.\n *\n * @returns {void}\n */\nexport function resetHydrationKey(): void {\n _hydrationKey = 0;\n}\n\n// ---------------------------------------------------------------------------\n// Hydration state + registry\n// ---------------------------------------------------------------------------\n\n/**\n * Module-private hydration flag.\n *\n * Read via `isHydrating()` instead of importing as a `let` binding — this\n * avoids cross-bundle \"live binding\" pitfalls when consumers go through a\n * barrel-export (`import { isHydrating } from '@estjs/template'`).\n */\nlet _isHydrating = false;\n\n/**\n * Returns whether the runtime is currently in the hydration first-pass.\n *\n * @returns True while hydrating, false otherwise.\n */\nexport function isHydrating(): boolean {\n return _isHydrating;\n}\n\n/**\n * Pre-built map of data-hk → Element, populated by beginHydration().\n * Mirrors SolidJS's sharedConfig.registry / gatherHydratable().\n */\nconst _registry = new Map<string, Element>();\n\n/**\n * Gather all [data-hk] elements under `root` into the registry.\n * Called once at hydration start — O(n) DOM query, then O(1) lookups.\n *\n * @param root - The root element to scan.\n */\nfunction gatherHydratable(root: Element): void {\n const nodes = root.querySelectorAll('[data-hk]');\n for (const node of nodes) {\n const key = (node as HTMLElement).dataset.hk;\n if (key != null && !_registry.has(key)) {\n _registry.set(key, node as Element);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Teleport (Portal) hydration anchors\n// ---------------------------------------------------------------------------\n\n/** FIFO queue of `<!--teleport-anchor-->` comments at Portal call sites. */\nconst _teleportCallsiteAnchors: Comment[] = [];\n\n/** Per-target FIFO of `<!--teleport-start-->` comments inside teleport targets. */\nconst _teleportTargetStarts = new Map<Element, Comment[]>();\n\n/** Scan `document.body` for teleport comment markers, classifying each into its queue. */\nfunction gatherTeleportAnchors(): void {\n if (typeof document === 'undefined') return;\n const walker = document.createNodeIterator(document.body, NodeFilter.SHOW_COMMENT);\n let node: Comment | null;\n\n while ((node = walker.nextNode() as Comment | null)) {\n const data = node.data;\n if (data === 'teleport-anchor') {\n _teleportCallsiteAnchors.push(node);\n } else if (data === 'teleport-start') {\n const parent = node.parentElement;\n if (!parent) continue;\n let bucket = _teleportTargetStarts.get(parent);\n if (!bucket) {\n bucket = [];\n _teleportTargetStarts.set(parent, bucket);\n }\n bucket.push(node);\n }\n }\n}\n\n/** Pop the next call-site anchor comment, or `null` if exhausted. */\nexport function consumeTeleportAnchor(): Comment | null {\n return _teleportCallsiteAnchors.shift() ?? null;\n}\n\n/** Pop the next teleport block from `target`, returning start/end markers and inner nodes. */\nexport function consumeTeleportBlock(\n target: Element,\n): { start: Comment; end: Comment; nodes: Node[] } | null {\n const bucket = _teleportTargetStarts.get(target);\n const start = bucket?.shift();\n if (!start) return null;\n\n const nodes: Node[] = [];\n let cursor: Node | null = start.nextSibling;\n while (cursor) {\n if (cursor.nodeType === Node.COMMENT_NODE && (cursor as Comment).data === 'teleport-end') {\n return { start, end: cursor as Comment, nodes };\n }\n nodes.push(cursor);\n cursor = cursor.nextSibling;\n }\n\n // Malformed block — no <!--teleport-end--> found. Return null to signal\n // a hydration mismatch rather than returning `{ start, end: start }` which\n // would be semantically incorrect.\n if (__DEV__) {\n warn('[Portal] hydration: orphaned <!--teleport-start--> without matching <!--teleport-end-->');\n }\n return null;\n}\n\n/**\n * Begins hydration.\n *\n * @param root - The root element to hydrate.\n */\nexport function beginHydration(root: Element): void {\n _isHydrating = true;\n _hydrationKey = 0;\n _registry.clear();\n _teleportCallsiteAnchors.length = 0;\n _teleportTargetStarts.clear();\n gatherHydratable(root);\n gatherTeleportAnchors();\n}\n\n/**\n * Ends hydration.\n *\n * @returns {void}\n */\nexport function endHydration(): void {\n _isHydrating = false;\n _registry.clear();\n _teleportCallsiteAnchors.length = 0;\n _teleportTargetStarts.clear();\n}\n\n/**\n * Returns a factory function that, when called at component render time:\n * - During hydration: increments the key, looks up the pre-built registry,\n * and returns the ACTUAL SSR DOM node (no cloneNode).\n * - During CSR: clones the parsed template as usual.\n *\n * @param html - The HTML template string.\n * @returns A factory function that returns a DOM element.\n */\nexport function getRenderedElement(html: string): () => Element {\n if (!isBrowser()) {\n return () => {\n throw new Error('[essor] getRenderedElement called in non-browser environment');\n };\n }\n\n let _csrFactory: (() => Element) | null = null;\n\n return (): Element => {\n if (!_isHydrating) {\n // CSR path — clone the template as normal\n if (!_csrFactory) _csrFactory = template(html) as () => Element;\n return _csrFactory();\n }\n\n // Hydration path — key incremented HERE (render time) to match server order\n const key = getHydrationKey();\n const node = _registry.get(key);\n\n if (node) {\n _registry.delete(key);\n return node; // TRUE DOM reuse — no cloneNode\n }\n\n // Mismatch: SSR node not found, fall back to CSR creation\n warn(`[essor] hydration mismatch: no SSR element for key \"${key}\"`);\n if (!_csrFactory) _csrFactory = template(html) as () => Element;\n return _csrFactory();\n };\n}\n\n// ---------------------------------------------------------------------------\n// Hydrate-mode patch wrappers (silence DOM writes during first hydration run)\n// ---------------------------------------------------------------------------\n\n/**\n * Patches class while considering hydration state.\n *\n * @param el - The element to patch.\n * @param prev - Previous class value.\n * @param next - Next class value.\n * @param isSVG - Whether the element is an SVG element.\n */\nexport function patchClassHydrate(\n el: Element,\n prev: unknown,\n next: unknown,\n isSVG?: boolean,\n): void {\n if (_isHydrating) return;\n patchClass(el, prev, next, isSVG);\n}\n\n/**\n * Patches attribute while considering hydration state.\n *\n * @param el - The element to patch.\n * @param key - The attribute key.\n * @param prev - Previous attribute value.\n * @param next - Next attribute value.\n */\nexport function patchAttrHydrate(el: Element, key: string, prev: unknown, next: unknown): void {\n if (_isHydrating) return;\n patchAttr(el, key, prev as never, next as never);\n}\n\n/**\n * Patches style while considering hydration state.\n *\n * @param el - The element to patch.\n * @param prev - Previous style value.\n * @param next - Next style value.\n */\nexport function patchStyleHydrate(el: HTMLElement, prev: unknown, next?: unknown): void {\n if (_isHydrating) return;\n patchStyle(el, prev, next);\n}\n","import { insertNode, removeNode } from './dom';\n\n/**\n * Resolves insert anchor.\n *\n * @param parent - The parent node.\n * @param candidate - The candidate anchor node.\n * @returns The resolved anchor node or null.\n */\nfunction resolveInsertAnchor(parent: Node, candidate?: Node | null): Node | null {\n return candidate && candidate.parentNode === parent ? candidate : null;\n}\n\n/**\n * Reconcile two arrays of real DOM nodes with minimal DOM operations.\n * This is the list reconciler for fine-grained rendering.\n *\n * @param parent - The parent node.\n * @param oldNodes - The array of current nodes.\n * @param newNodes - The array of new nodes.\n * @param anchor - Optional reference node for insertion.\n * @returns The new array of nodes.\n */\nexport function reconcileArrays(\n parent: Node,\n oldNodes: Node[],\n newNodes: Node[],\n anchor?: Node,\n): Node[] {\n const fallbackAnchor = resolveInsertAnchor(parent, anchor);\n const oldLength = oldNodes.length;\n const newLength = newNodes.length;\n\n if (oldLength === 0 && newLength === 0) return newNodes;\n\n if (oldLength === 0) {\n for (let i = 0; i < newLength; i++) {\n insertNode(parent, newNodes[i], fallbackAnchor);\n }\n return newNodes;\n }\n\n if (newLength === 0) {\n for (let i = 0; i < oldLength; i++) {\n removeNode(oldNodes[i]);\n }\n return [];\n }\n\n let start = 0;\n let oldEnd = oldLength - 1;\n let newEnd = newLength - 1;\n\n while (start <= oldEnd && start <= newEnd) {\n if (oldNodes[start] === newNodes[start]) {\n start++;\n } else {\n break;\n }\n }\n\n while (oldEnd >= start && newEnd >= start) {\n if (oldNodes[oldEnd] === newNodes[newEnd]) {\n oldEnd--;\n newEnd--;\n } else {\n break;\n }\n }\n\n if (start > oldEnd) {\n if (start <= newEnd) {\n const nextPos = newEnd + 1;\n const nextNode = resolveInsertAnchor(\n parent,\n nextPos < newLength ? newNodes[nextPos] : fallbackAnchor,\n );\n for (let i = start; i <= newEnd; i++) {\n insertNode(parent, newNodes[i], nextNode);\n }\n }\n } else if (start > newEnd) {\n for (let i = start; i <= oldEnd; i++) {\n removeNode(oldNodes[i]);\n }\n } else {\n reconcileUnknownSequence(parent, oldNodes, newNodes, start, oldEnd, newEnd, fallbackAnchor);\n }\n\n return newNodes;\n}\n\n/**\n * Reconciles unknown sequence of nodes.\n *\n * @param parent - The parent node.\n * @param oldNodes - Current nodes.\n * @param newNodes - New nodes.\n * @param start - Start index of the sequence.\n * @param oldEnd - End index of the old sequence.\n * @param newEnd - End index of the new sequence.\n * @param anchor - Optional reference node for insertion.\n * @returns {void}\n */\nfunction reconcileUnknownSequence(\n parent: Node,\n oldNodes: Node[],\n newNodes: Node[],\n start: number,\n oldEnd: number,\n newEnd: number,\n anchor?: Node | null,\n): void {\n const newLength = newEnd - start + 1;\n const newIndexMap = new Map<Node, number>();\n for (let i = start; i <= newEnd; i++) {\n newIndexMap.set(newNodes[i], i);\n }\n\n const newIndexToOldIndexMap = new Int32Array(newLength);\n newIndexToOldIndexMap.fill(0);\n\n let patched = 0;\n let moved = false;\n let maxNewIndexSoFar = 0;\n\n for (let i = start; i <= oldEnd; i++) {\n const oldNode = oldNodes[i];\n\n if (patched >= newLength) {\n removeNode(oldNode);\n continue;\n }\n\n const newIndex = newIndexMap.get(oldNode);\n\n if (newIndex === undefined) {\n removeNode(oldNode);\n } else {\n newIndexToOldIndexMap[newIndex - start] = i + 1;\n\n if (newIndex >= maxNewIndexSoFar) {\n maxNewIndexSoFar = newIndex;\n } else {\n moved = true;\n }\n patched++;\n }\n }\n\n const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : [];\n let j = increasingNewIndexSequence.length - 1;\n\n for (let i = newLength - 1; i >= 0; i--) {\n const nextIndex = start + i;\n const nextNode = newNodes[nextIndex];\n const anchorNode = resolveInsertAnchor(\n parent,\n nextIndex + 1 < newNodes.length ? newNodes[nextIndex + 1] : anchor,\n );\n\n if (newIndexToOldIndexMap[i] === 0) {\n insertNode(parent, nextNode, anchorNode);\n } else if (moved) {\n if (j < 0 || i !== increasingNewIndexSequence[j]) {\n insertNode(parent, nextNode, anchorNode);\n } else {\n j--;\n }\n }\n }\n}\n\n/**\n * Compute the Longest Increasing Subsequence using patience sorting.\n * O(n log n) time, O(n) space.\n *\n * @param arr - The array of indices.\n * @returns The LIS indices.\n */\nexport function getSequence(arr: Int32Array): number[] {\n const p = new Int32Array(arr.length);\n const result = [0];\n const len = arr.length;\n let i: number;\n let j: number;\n let u: number;\n let v: number;\n let c: number;\n\n for (i = 0; i < len; i++) {\n const arrI = arr[i];\n if (arrI !== 0) {\n j = result[result.length - 1];\n if (arr[j] < arrI) {\n p[i] = j;\n result.push(i);\n continue;\n }\n u = 0;\n v = result.length - 1;\n while (u < v) {\n c = (u + v) >> 1;\n if (arr[result[c]] < arrI) {\n u = c + 1;\n } else {\n v = c;\n }\n }\n if (arrI < arr[result[u]]) {\n if (u > 0) {\n p[i] = result[u - 1];\n }\n result[u] = i;\n }\n }\n }\n u = result.length;\n v = result[u - 1];\n while (u-- > 0) {\n result[u] = v;\n v = p[v];\n }\n return result;\n}\n","import {\n coerceArray,\n error,\n hasOwn,\n isBoolean,\n isFalsy,\n isFunction,\n isHTMLElement,\n isNull,\n isNumber,\n isObject,\n isPrimitive,\n isString,\n isUndefined,\n} from '@estjs/shared';\nimport { effect } from '@estjs/signals';\nimport { isComponent } from './component';\nimport { KEY_PROP } from './constants';\nimport { type Scope, getActiveScope, onCleanup, runWithScope } from './scope';\nimport { isHydrating } from './hydration';\nimport { reconcileArrays } from './reconcile';\nimport type { AnyNode } from './types';\n\n/**\n * Remove node from its parent\n *\n * @param node Node to remove\n *\n * @example\n * ```typescript\n * removeNode(elementToRemove);\n * ```\n */\nexport function removeNode(node: AnyNode): void {\n if (!node) return;\n\n if (isComponent(node)) {\n node.destroy();\n } else {\n const element = node as ChildNode;\n if (element.parentNode) {\n element.remove();\n }\n }\n}\n\n/**\n * Insert child node\n * Handle insertion of component nodes and DOM nodes\n *\n * @param parent Parent node\n * @param child Child node\n * @param before Reference node for insertion\n */\nexport function insertNode(parent: Node, child: AnyNode, before?: AnyNode): void {\n if (!parent || !child) return;\n\n const beforeNode = isComponent(before) ? before.firstChild : (before as Node);\n\n if (isComponent(child)) {\n child.mount(parent, beforeNode);\n return;\n }\n\n if (beforeNode) {\n parent.insertBefore(child as Node, beforeNode);\n } else {\n if (__DEV__) {\n if (!child) {\n error('insertNode: child is not a Node', child);\n }\n }\n parent.appendChild(child as Node);\n }\n}\n\n/**\n * Replace child node\n * Handle replacement of component nodes and DOM nodes\n *\n * @param parent Parent node\n * @param newNode New node\n * @param oldNode Old node to be replaced\n */\nexport function replaceNode(parent: Node, newNode: AnyNode, oldNode: AnyNode): void {\n if (!parent || !newNode || !oldNode || newNode === oldNode) return;\n\n const beforeNode: AnyNode | undefined = isComponent(oldNode)\n ? oldNode.beforeNode\n : (oldNode as Node).nextSibling!;\n removeNode(oldNode);\n insertNode(parent, newNode, beforeNode);\n}\n\n/**\n * Check if two nodes are the same (inline for performance)\n * This combines key check and type check\n */\nexport function isSameNode(a: AnyNode, b: AnyNode): boolean {\n // Check key equality first (fast path)\n const keyA = getNodeKey(a);\n const keyB = getNodeKey(b);\n\n if (keyA !== keyB) {\n return false;\n }\n\n // Inline type check to avoid function call\n const aIsComponent = isComponent(a);\n const bIsComponent = isComponent(b);\n\n if (aIsComponent && bIsComponent) {\n return a.component === b.component;\n }\n\n if (aIsComponent !== bIsComponent) {\n return false;\n }\n\n if (isPrimitive(a) || isPrimitive(b)) {\n return a === b;\n }\n\n const aNode = a as Node;\n const bNode = b as Node;\n\n if (aNode.nodeType !== bNode.nodeType) {\n return false;\n }\n\n if (aNode.nodeType === Node.ELEMENT_NODE) {\n return (aNode as Element).tagName === (bNode as Element).tagName;\n }\n\n return true;\n}\n\n/**\n * Extract the optional stable key associated with a runtime node.\n */\nfunction getNodeKey(node: AnyNode): unknown {\n if (!node) {\n return undefined;\n }\n\n if (isComponent(node)) {\n return hasOwn(node.props, KEY_PROP) ? node.props[KEY_PROP] : undefined;\n }\n\n if (node instanceof Element) {\n return node.getAttribute(KEY_PROP);\n }\n\n if (isObject(node) && hasOwn(node, KEY_PROP)) {\n return Reflect.get(node as object, KEY_PROP);\n }\n\n return undefined;\n}\n\n/**\n * Normalize node for reconciliation\n */\nexport function normalizeNode(node: unknown): Node {\n // already a Node\n if (isHTMLElement(node)) {\n return node;\n }\n\n if (isPrimitive(node)) {\n return document.createTextNode(isFalsy(node) ? '' : String(node));\n }\n\n return node as Node;\n}\n/**\n * Reactive node insertion with binding support\n *\n * @param parent Parent node\n * @param nodeFactory Node factory function or static node\n * @param before Reference node for insertion position\n * @example\n * ```typescript\n * insert(container, () => message.value, null);\n * insert(container, staticElement, referenceNode);\n * insert(container, \"Hello World\", null); // Direct string support\n * ```\n */\nexport function insert(parent: Node, nodeFactory: AnyNode, before?: Node) {\n if (!parent) return;\n // Capture owner scope at call time - this is critical for correct context inheritance\n // When dynamic components are created inside effects, they need to inherit from\n // the scope that was active when insert() was called, not when the effect runs\n const ownerScope: Scope | null = getActiveScope();\n\n let renderedNodes: Node[] = [];\n let isFirstRun = true;\n\n /**\n * Resolves a raw node value into a flat array of DOM Nodes.\n * Fast-paths simple cases (single Node, single primitive) to avoid\n * intermediate array allocations.\n */\n const resolveNodes = (raw: unknown): Node[] => {\n // Fast path: already a DOM Node\n if (raw instanceof Node) return [raw];\n\n // Fast path: single primitive → text node\n if (isNull(raw) || isUndefined(raw) || isString(raw) || isNumber(raw) || isBoolean(raw)) {\n return [normalizeNode(raw)];\n }\n\n // General path: coerce, resolve nested functions, flatten, normalize\n return coerceArray(raw)\n .map((item) => (isFunction(item) ? item() : item))\n .flatMap((i) => i)\n .map(normalizeNode) as Node[];\n };\n\n // Create effect for reactive updates\n const effectRunner = effect(() => {\n const executeUpdate = () => {\n const rawNodes = isFunction(nodeFactory) ? nodeFactory() : nodeFactory;\n const nodes = resolveNodes(rawNodes);\n // Hydration mode: skip DOM operations on first run only when every\n // node already exists under the target parent. Component instances and\n // fallback CSR nodes still need the normal reconcile path.\n if (\n isFirstRun &&\n isHydrating() &&\n nodes.every((node) => node instanceof Node && node.parentNode === parent)\n ) {\n renderedNodes = nodes;\n isFirstRun = false;\n return;\n }\n renderedNodes = reconcileArrays(parent, renderedNodes as Node[], nodes, before) as Node[];\n isFirstRun = false;\n };\n\n // If we have an owner scope, run within it to maintain context hierarchy\n if (ownerScope && !ownerScope.isDestroyed) {\n runWithScope(ownerScope, executeUpdate);\n } else {\n executeUpdate();\n }\n });\n\n onCleanup(() => {\n effectRunner.stop();\n for (const node of renderedNodes) removeNode(node);\n renderedNodes = [];\n });\n\n return renderedNodes;\n}\n/**\n * Returns the first child of a node.\n *\n * @param node - The node to get the child from.\n * @returns The first child node or null.\n */\nexport function child(node: Node | null): Node | null {\n return node?.firstChild || null;\n}\n\n/**\n * Returns the next sibling after advancing by `step`.\n *\n * @param node - The starting node.\n * @param step - Number of steps to advance.\n * @returns The resulting sibling node or null.\n */\nexport function next(node: Node | null, step: number = 1): Node | null {\n while (node && step > 0) {\n node = node.nextSibling;\n step--;\n }\n return node || null;\n}\n\n/**\n * Returns the child node at the requested index.\n *\n * @param node - The parent node.\n * @param index - The child index.\n * @returns The child node at index or null.\n */\nexport function nthChild(node: Node | null, index: number): Node | null {\n if (!node || index < 0) return null;\n let current = node.firstChild;\n while (current && index > 0) {\n current = current.nextSibling;\n index--;\n }\n return current || null;\n}\n","/**\n * Extended listener options with optional event delegation support.\n */\nexport interface EventOptions extends AddEventListenerOptions {\n /**\n * Selector used for event delegation.\n *\n * When provided, the handler only runs if the event target matches the selector.\n */\n delegate?: string;\n}\n\n/**\n * Cleanup function signature for event listeners.\n */\nexport type EventCleanup = () => void;\n\n/**\n * Adds an event listener to an element with optional simple delegation.\n *\n * Without `delegate`, this is a thin wrapper around native `addEventListener()`.\n * When `delegate` is provided, the runtime first checks the selector match before\n * dispatching the real handler to the caller.\n *\n * @param el - The element to add the listener to.\n * @param event - The name of the event to listen for.\n * @param handler - The event handler function.\n * @param options - Optional event listener options.\n * @returns A cleanup function that removes the listener.\n */\nexport function addEvent(\n el: Element,\n event: string,\n handler: EventListener,\n options?: EventOptions,\n): EventCleanup {\n if (!options?.delegate) {\n el.addEventListener(event, handler, options);\n return () => el.removeEventListener(event, handler, options);\n }\n\n // Delegation path: match the selector first, then forward the event to the caller.\n const selector = options.delegate;\n /**\n * Dispatches delegated events only for matching descendants.\n */\n const wrappedHandler = (e: Event) => {\n const target = e.target as Element;\n if (target.matches(selector) || target.closest(selector)) {\n handler.call(el, e);\n }\n };\n\n // Extract delegate from options and pass the rest to addEventListener\n const { delegate: _, ...nativeOptions } = options;\n\n el.addEventListener(event, wrappedHandler, nativeOptions);\n\n return () => {\n el.removeEventListener(event, wrappedHandler, nativeOptions);\n };\n}\n","import { error, isPromise } from '@estjs/shared';\nimport { type Scope, getActiveScope, runWithScope } from './scope';\n\nexport type LifecycleHook = () => void | Promise<void>;\n\n/**\n * Registers scoped hook.\n *\n * @param scope - The scope to register the hook for.\n * @param listKey - The key of the hook list.\n * @param hook - The hook function to register.\n */\nfunction registerScopedHook(\n scope: Scope,\n listKey: 'onMount' | 'onUpdate' | 'onDestroy',\n hook: LifecycleHook,\n): void {\n let hookList = scope[listKey];\n if (!hookList) {\n hookList = [];\n scope[listKey] = hookList;\n }\n hookList.push(hook);\n}\n\n/**\n * Executes lifecycle hooks and captures async rejections in dev mode.\n *\n * @param hooks - The array of hooks to execute.\n * @param scopeId - The ID of the scope.\n * @param phase - The lifecycle phase.\n * @returns A promise if any hooks are asynchronous, or undefined.\n */\nfunction executeHooks(\n hooks: LifecycleHook[],\n scopeId: number,\n phase: 'mount' | 'update' | 'destroy',\n): void | Promise<void> {\n const len = hooks.length;\n if (len === 0) return;\n\n let pending: Promise<void>[] | undefined;\n\n for (let i = 0; i < len; i++) {\n try {\n const result = hooks[i]();\n if (isPromise(result)) {\n const safePromise = result.catch((error_) => {\n if (__DEV__) {\n error(`Scope(${scopeId}): Async ${phase} hook rejected:`, error_);\n }\n });\n (pending || (pending = [])).push(safePromise);\n }\n } catch (error_) {\n if (__DEV__) {\n error(`Scope(${scopeId}): Error in ${phase} hook:`, error_);\n }\n }\n }\n\n if (!pending) return;\n return Promise.all(pending).then(() => {});\n}\n\n/**\n * Register a mount lifecycle hook.\n * If the scope is already mounted, the hook is executed immediately.\n *\n * @param hook - The hook function to register.\n * @returns {void}\n */\nexport function onMount(hook: LifecycleHook): void {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) error('onMount() must be called within a scope');\n return;\n }\n\n if (scope.isMounted) {\n try {\n const result = hook();\n if (isPromise(result)) {\n result.catch((error_) => {\n if (__DEV__) error(`Scope(${scope.id}): Async mount hook rejected:`, error_);\n });\n }\n } catch (error_) {\n if (__DEV__) error(`Scope(${scope.id}): Error in mount hook:`, error_);\n }\n return;\n }\n\n registerScopedHook(scope, 'onMount', hook);\n}\n\n/**\n * Register an update lifecycle hook.\n *\n * @param hook - The hook function to register.\n * @returns {void}\n */\nexport function onUpdate(hook: LifecycleHook): void {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) error('onUpdate() must be called within a scope');\n return;\n }\n\n registerScopedHook(scope, 'onUpdate', hook);\n}\n\n/**\n * Register a destroy lifecycle hook.\n *\n * @param hook - The hook function to register.\n * @returns {void}\n */\nexport function onDestroy(hook: LifecycleHook): void {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) error('onDestroy() must be called within a scope');\n return;\n }\n\n registerScopedHook(scope, 'onDestroy', hook);\n}\n\n/**\n * Trigger mount lifecycle hooks for a scope.\n *\n * @param scope - The scope to trigger hooks for.\n * @returns A promise if any hooks are asynchronous, or undefined.\n */\nexport function triggerMountHooks(scope: Scope): void | Promise<void> {\n if (scope.isDestroyed) {\n return;\n }\n if (!scope.onMount || scope.onMount.length === 0) {\n scope.isMounted = true;\n return;\n }\n\n const mountHooks = scope.onMount;\n const result = runWithScope(scope, () => executeHooks(mountHooks, scope.id, 'mount'));\n mountHooks.length = 0;\n scope.isMounted = true;\n return result;\n}\n\n/**\n * Trigger update lifecycle hooks for a scope.\n *\n * @param scope - The scope to trigger hooks for.\n * @returns A promise if any hooks are asynchronous, or undefined.\n */\nexport function triggerUpdateHooks(scope: Scope): void | Promise<void> {\n if (scope.isDestroyed || !scope.onUpdate || scope.onUpdate.length === 0) return;\n return runWithScope(scope, () => executeHooks(scope.onUpdate!, scope.id, 'update'));\n}\n\n// NOTE: destroy hooks are executed directly inside `disposeScope` to keep\n// the teardown path synchronous and free of extra `runWithScope` frames.\n// See `./scope.ts`.\n","import { isComputed, isSignal, shallowReactive } from '@estjs/signals';\nimport { isFunction, isOn } from '@estjs/shared';\n\nimport { COMPONENT_STATE, COMPONENT_TYPE, REF_KEY } from './constants';\nimport { insert, insertNode, removeNode } from './dom';\nimport { createScope, disposeScope, getActiveScope, runWithScope } from './scope';\nimport { type EventCleanup, addEvent } from './operations/event';\nimport { triggerMountHooks, triggerUpdateHooks } from './lifecycle';\nimport type { AnyNode, ComponentFn, ComponentProps } from './types';\nimport type { Scope } from './scope';\n\n/**\n * Install every own-key descriptor from `source` onto `target` verbatim\n * (getters stay getters), optionally deleting any target key not present\n * in the incoming source.\n *\n * Preserving getter descriptors is the whole reason the component body can\n * read `props.foo` and transparently get the latest reactive value — the\n * compiler emits dynamic props as `{ get foo() { return signal.value } }`.\n * `{ ...props }` would snapshot each getter once and kill reactivity;\n * `defineProperty` keeps it alive.\n */\nfunction syncDescriptors(target: object, source: object, pruneMissing = false): void {\n const seen = pruneMissing ? new Set<string>() : null;\n for (const key of Object.getOwnPropertyNames(source)) {\n seen?.add(key);\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)!);\n }\n if (seen) {\n for (const key of Object.getOwnPropertyNames(target)) {\n if (!seen.has(key)) delete (target as Record<string, unknown>)[key];\n }\n }\n}\n\n/**\n * Read a prop value through its descriptor so dynamic getters (ref/event\n * handlers emitted as `get onClick() { ... }`) resolve to the latest value.\n */\nfunction readProp(source: object, key: string): unknown {\n const descriptor = Object.getOwnPropertyDescriptor(source, key)!;\n return descriptor.get ? descriptor.get.call(source) : descriptor.value;\n}\n\nexport class Component<P extends ComponentProps = {}> {\n public readonly [COMPONENT_TYPE.NORMAL] = true;\n\n public scope: Scope | null = null;\n public state: COMPONENT_STATE = COMPONENT_STATE.INITIAL;\n public beforeNode: Node | undefined = undefined;\n public renderedNodes: Node[] = [];\n public firstChild: Node | undefined = undefined;\n\n protected parentNode: Node | undefined = undefined;\n\n private readonly parentScope: Scope | null;\n private readonly reactiveProps: P;\n private rootEventCleanups: EventCleanup[] = [];\n private rootRefCleanup?: () => void;\n\n constructor(\n public readonly component: ComponentFn<P>,\n public props: P = {} as P,\n ) {\n this.parentScope = getActiveScope();\n // Shallow-reactive container that inherits the raw props' descriptors.\n // The component body reads from this container; `update()` re-installs\n // new descriptors in-place so existing closures keep working.\n const container = {} as P;\n syncDescriptors(container, props);\n this.reactiveProps = shallowReactive(container) as P;\n }\n\n /**\n * Mount the component into `parentNode` (optionally before `beforeNode`).\n * If already rendered, the existing DOM is re-inserted without re-running\n * the component function.\n */\n mount(parentNode: Node, beforeNode?: Node): AnyNode[] {\n this.parentNode = parentNode;\n this.beforeNode = beforeNode;\n this.state = COMPONENT_STATE.MOUNTING;\n\n // Fast path: already rendered — just move the nodes.\n if (this.renderedNodes.length > 0) {\n for (const node of this.renderedNodes) {\n insertNode(parentNode, node, beforeNode);\n }\n this.state = COMPONENT_STATE.MOUNTED;\n return this.renderedNodes;\n }\n\n const scope = createScope(this.parentScope ?? getActiveScope());\n this.scope = scope;\n\n const renderedNodes = runWithScope(scope, () => {\n let result: unknown = this.component(this.reactiveProps);\n\n // Render-function pattern: a component may return a factory instead of\n // the element directly.\n if (isFunction(result)) {\n result = (result as Function)(this.reactiveProps);\n }\n\n // Unwrap signal / computed — only their current value reaches the DOM.\n if (isSignal<Element>(result) || isComputed<Element>(result)) {\n result = result.value;\n }\n\n return insert(parentNode, result as AnyNode, beforeNode) ?? [];\n });\n\n this.renderedNodes = renderedNodes;\n this.firstChild = renderedNodes[0];\n\n // Wire refs/events only after renderedNodes/firstChild are set.\n this.syncSpecialProps(this.props);\n\n this.state = COMPONENT_STATE.MOUNTED;\n triggerMountHooks(scope);\n\n return this.renderedNodes;\n }\n\n /**\n * Re-install props into the same `reactiveProps` container (preserving\n * any closures already holding a reference to it) and re-apply\n * refs/events against the current root element.\n */\n update(props: P): void {\n this.props = props;\n const scope = this.scope;\n if (!scope || scope.isDestroyed) return;\n\n syncDescriptors(this.reactiveProps as object, props ?? {}, /* pruneMissing */ true);\n this.syncSpecialProps(props);\n\n triggerUpdateHooks(scope);\n }\n\n /**\n * Tear down and re-mount the component at its current insertion point.\n * No-op if the component has never been mounted.\n */\n forceUpdate(): void {\n if (!this.parentNode) return;\n const parent = this.parentNode;\n const before = this.beforeNode;\n this.destroy();\n this.mount(parent, before);\n }\n\n /**\n * Dispose the scope, remove all rendered nodes, and clear bookkeeping.\n * Idempotent: subsequent calls are no-ops.\n */\n destroy(): void {\n const scope = this.scope;\n if (!scope || scope.isDestroyed) return;\n this.scope = null;\n this.releaseSpecialProps();\n disposeScope(scope);\n for (const node of this.renderedNodes) removeNode(node);\n this.renderedNodes = [];\n this.firstChild = undefined;\n this.parentNode = undefined;\n }\n\n /**\n * Apply props that bind to the root DOM element rather than flowing into\n * the component body: `ref` (signal/function) and `onXxx` event handlers.\n * The render-facing `reactiveProps` already has those keys; here we just\n * wire them to the actual DOM node.\n */\n private syncSpecialProps(props: P): void {\n if (!props) return;\n const root = this.firstChild as Element | undefined;\n if (!root) return;\n\n this.releaseSpecialProps();\n\n for (const key of Object.getOwnPropertyNames(props)) {\n const value = readProp(props, key);\n\n if (key === REF_KEY) {\n this.rootRefCleanup = this.bindRootRef(value, root);\n continue;\n }\n\n if (isOn(key) && isFunction(value)) {\n const eventName = key.slice(2).toLowerCase();\n this.rootEventCleanups.push(addEvent(root, eventName, value as EventListener));\n }\n }\n }\n\n /**\n * Remove all listeners/ref bindings currently attached to the root element.\n */\n private releaseSpecialProps(): void {\n for (const cleanup of this.rootEventCleanups) {\n cleanup();\n }\n this.rootEventCleanups.length = 0;\n\n if (this.rootRefCleanup) {\n this.rootRefCleanup();\n this.rootRefCleanup = undefined;\n }\n }\n\n /**\n * Bind the root ref prop and return a cleanup that restores the previous ref state.\n */\n private bindRootRef(value: unknown, root: Element): (() => void) | undefined {\n if (isFunction(value)) {\n value(root);\n return () => value(null);\n }\n\n if (isSignal(value)) {\n const previousValue = value.value;\n value.value = root;\n return () => {\n if (value.value === root) {\n value.value = previousValue;\n }\n };\n }\n\n return undefined;\n }\n}\n\n/**\n * Check if a value is a Component instance.\n */\nexport function isComponent(node: unknown): node is Component {\n return !!node && !!(node as Record<PropertyKey, unknown>)[COMPONENT_TYPE.NORMAL];\n}\n\n/**\n * Wrap a component function in a Component instance, or pass an existing\n * Component instance through unchanged.\n */\nexport function createComponent<P extends ComponentProps>(\n componentFn: ComponentFn<P>,\n props?: P,\n): Component<P> {\n if (isComponent(componentFn)) {\n return componentFn as unknown as Component<P>;\n }\n return new Component(componentFn, props);\n}\n","import { isString, warn } from '@estjs/shared';\nimport { type Component, createComponent, isComponent } from './component';\nimport { createScope, disposeScope, runWithScope } from './scope';\nimport { beginHydration, endHydration } from './hydration';\nimport { insert, insertNode } from './dom';\nimport type { ComponentFn, ComponentProps } from './types';\n\n/**\n * Create a template factory function from HTML string.\n *\n * This function creates a reusable template factory that efficiently clones\n * DOM nodes from the provided HTML string. The template is parsed once.\n *\n * Security note: `template(html)` is a raw HTML entrypoint. The caller is\n * responsible for ensuring `html` is trusted and not derived from unsanitized\n * user input.\n *\n * @param html - The HTML string to create template from.\n * @returns Factory function that returns a cloned node of the template.\n * @throws {Error} When template content is empty or invalid.\n *\n * @example\n * ```typescript\n * const buttonTemplate = template('<button>Click me</button>');\n * const button1 = buttonTemplate(); // Creates first button instance\n * const button2 = buttonTemplate(); // Creates second button instance\n * ```\n */\nexport function template(html: string) {\n let node: Node | undefined;\n\n /**\n * Creates the cached template root node on first use.\n */\n const create = (): Node => {\n // Regular HTML template\n const template = document.createElement('template');\n template.innerHTML = html;\n const firstChild = template.content.firstChild;\n if (!firstChild) {\n throw new Error('Invalid template: empty content');\n }\n return firstChild;\n };\n\n // return a factory function: create the template when first called, reuse the cached template when called later\n return () => (node || (node = create())).cloneNode(true);\n}\n\n/**\n * Create and mount an application with the specified component.\n *\n * This function initializes an application by mounting a root component\n * to a target DOM element. It handles target validation and cleanup.\n *\n * @param component - The root component function to mount.\n * @param target - CSS selector string or DOM element to mount to.\n * @returns Object with root component and unmount function.\n *\n * @example\n * ```typescript\n * const App = () => template('<div>Hello World</div>')\n * const app = createApp(App, '#root');\n *\n * // Or with DOM element\n * const container = document.getElementById('app');\n * const app = createApp(App, container);\n * ```\n */\nexport function createApp<P extends ComponentProps = {}>(\n component: ComponentFn<P>,\n target: string | Element,\n) {\n const container = isString(target) ? document.querySelector(target) : (target as Element);\n if (!container) {\n if (__DEV__) {\n warn(`Target element not found: ${target}`);\n }\n return;\n }\n\n const existingContent = container.innerHTML;\n if (existingContent) {\n if (__DEV__) {\n warn(`Target element is not empty, it will be cleared: ${target}`);\n }\n container.innerHTML = '';\n }\n\n const scope = createScope();\n let rootNode: Component | undefined;\n try {\n runWithScope(scope, () => {\n const mountedRoot = createComponent(component);\n if (isComponent(mountedRoot)) {\n rootNode = mountedRoot;\n insertNode(container, mountedRoot);\n }\n });\n } catch (error_) {\n disposeScope(scope);\n throw error_;\n }\n\n return {\n root: rootNode,\n unmount: () => {\n disposeScope(scope);\n rootNode?.destroy();\n },\n };\n}\n\nexport function hydrate<P extends ComponentProps = {}>(\n component: ComponentFn<P>,\n target: string | Element,\n) {\n const container = isString(target) ? document.querySelector(target) : (target as Element);\n if (!container) {\n if (__DEV__) {\n warn(`[essor] hydrate: target element not found: ${target}`);\n }\n return;\n }\n\n beginHydration(container);\n\n const scope = createScope();\n let rootNode: Component | undefined;\n try {\n runWithScope(scope, () => {\n const mountedRoot = createComponent(component);\n if (isComponent(mountedRoot)) {\n rootNode = mountedRoot;\n insert(container, mountedRoot);\n }\n });\n } catch (error_) {\n disposeScope(scope);\n throw error_;\n } finally {\n endHydration();\n }\n\n return {\n root: rootNode,\n unmount: () => {\n disposeScope(scope);\n rootNode?.destroy();\n },\n };\n}\n","import { error } from '@estjs/shared';\nimport { type Scope, getActiveScope } from './scope';\n\n/**\n * InjectionKey is a unique identifier for provided values.\n * Using Symbol ensures type safety and prevents key collisions.\n */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provide a value in the current scope.\n * The value can be injected by this scope or any descendant scope.\n *\n * @param key - The injection key.\n * @param value - The value to provide.\n * @returns {void}\n */\nexport function provide<T>(key: InjectionKey<T> | string | number, value: T): void {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) {\n error('provide() must be called within a scope');\n }\n return;\n }\n\n // Lazy initialize provides map\n if (!scope.provides) {\n scope.provides = new Map();\n }\n\n scope.provides.set(key, value);\n}\n\n/**\n * Inject a value from the scope hierarchy.\n * Traverses up the parent chain until finding a matching key.\n *\n * @param key - The injection key.\n * @param defaultValue - Default value if key is not found.\n * @returns The injected value or default value.\n */\nexport function inject<T>(key: InjectionKey<T> | string | number, defaultValue?: T): T {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) {\n error('inject() must be called within a scope');\n }\n return defaultValue as T;\n }\n\n // Traverse up the hierarchy\n let current: Scope | null = scope;\n while (current) {\n if (current.provides) {\n if (current.provides.has(key)) {\n return current.provides.get(key) as T;\n }\n }\n current = current.parent;\n }\n\n return defaultValue as T;\n}\n","import { isFunction, isString } from '@estjs/shared';\nimport { addEvent } from './operations/event';\nimport { getActiveScope, onCleanup } from './scope';\n\n/**\n * Retargets an event to a delegated host node.\n *\n * @param e - The event object.\n * @param value - The new target value.\n * @returns {void}\n */\nfunction reTargetEvent(e: Event, value: EventTarget): void {\n Object.defineProperty(e, 'target', {\n configurable: true,\n value,\n });\n}\n\n/**\n * Event handler for delegated events.\n *\n * @param e - The event object.\n */\nfunction eventHandler(e: Event): void {\n let node = e.target as any;\n const key = e.type;\n const oriTarget = e.target;\n const oriCurrentTarget = e.currentTarget;\n\n /**\n * Handle event on current node\n * @returns {boolean} Whether to continue propagation\n */\n const handleNode = (): boolean => {\n const handler = node[`_$${key}`];\n if (handler && isFunction(handler) && !node.disabled) {\n const data = node[`${key}Data`];\n data ? handler.call(node, data, e) : handler.call(node, e);\n if (e.cancelBubble) return false;\n }\n\n // Handle host element retargeting\n if (\n node.host &&\n !isString(node.host) &&\n !node.host._$host &&\n isFunction(node.contains) &&\n node.contains(e.target)\n ) {\n reTargetEvent(e, node.host);\n }\n return true;\n };\n\n /**\n * Walk up the DOM tree handling events\n */\n const walkUpTree = (): void => {\n while (handleNode() && (node = node._$host || node.parentNode || node.host));\n };\n\n // simulate currentTarget\n Object.defineProperty(e, 'currentTarget', {\n configurable: true,\n /**\n * Returns the current delegated target for the event.\n */\n get() {\n return node || document;\n },\n });\n\n if (e.composedPath) {\n const path = e.composedPath();\n reTargetEvent(e, path[0]);\n for (let i = 0; i < path.length - 2; i++) {\n node = path[i] as any;\n if (!handleNode()) break;\n if (node._$host) {\n node = node._$host;\n // bubble up from portal mount instead of composedPath\n walkUpTree();\n break;\n }\n if (node.parentNode === oriCurrentTarget) {\n break; // don't bubble above root of event delegation\n }\n }\n }\n // fallback for browsers that don't support composedPath\n else walkUpTree();\n // Mixing portals and shadow dom can lead to a nonstandard target, so reset here.\n reTargetEvent(e, oriTarget!);\n}\n\n/**\n * Symbol for storing delegated events on document\n */\nconst $EVENTS = Symbol('_$EVENTS');\n\n/**\n * Set up event delegation for specified event types.\n *\n * @param eventNames - Array of event names to delegate.\n * @param document - Document to attach events to (defaults to window.document).\n */\nexport function delegateEvents(eventNames: string[], document: Document = window.document): void {\n const docWithEvents = document as Document & { [$EVENTS]?: Set<string> };\n const eventSet = docWithEvents[$EVENTS] || (docWithEvents[$EVENTS] = new Set<string>());\n\n for (const name of eventNames) {\n if (!eventSet.has(name)) {\n eventSet.add(name);\n document.addEventListener(name, eventHandler);\n }\n }\n}\n\n/**\n * Clear all delegated events from document.\n *\n * @param document - Document to clear events from (defaults to window.document).\n */\nexport function clearDelegatedEvents(document: Document = window.document): void {\n const docWithEvents = document as Document & { [$EVENTS]?: Set<string> };\n const eventSet = docWithEvents[$EVENTS];\n if (eventSet) {\n for (const name of eventSet.keys()) {\n document.removeEventListener(name, eventHandler);\n }\n delete docWithEvents[$EVENTS];\n }\n}\n/**\n * Registers an event listener and scopes its cleanup when needed.\n *\n * @param element - The element to add the listener to.\n * @param event - The event name.\n * @param handler - The event handler.\n * @param options - Optional event listener options.\n * @returns {void}\n */\nexport function addEventListener(\n element: Element,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions,\n): void {\n const cleanup = addEvent(element, event, handler, options);\n\n if (getActiveScope()) {\n onCleanup(cleanup);\n }\n}\n","import { isFunction, isString } from '@estjs/shared';\nimport { effect } from '@estjs/signals';\nimport { addEventListener } from './events';\nimport { getActiveScope, onCleanup } from './scope';\n\n/**\n * Modifiers supported by `bind:*` two-way bindings.\n *\n * - `trim` strip surrounding whitespace from string values\n * - `number` coerce numeric strings to numbers (no-op on `NaN`)\n * - `lazy` commit on `change` instead of `input`\n */\nexport interface BindModifiers {\n trim?: boolean;\n number?: boolean;\n lazy?: boolean;\n [key: string]: boolean | undefined;\n}\n\n// ─── Bind Strategy Table ───\n\ninterface BindStrategy {\n /** Default DOM event used to sync DOM → model. */\n event: string;\n read: (node: Element) => unknown;\n write: (node: Element, value: unknown) => void;\n /** Force using `change` even when not lazy (e.g. checkbox / select / file). */\n forceChangeEvent?: boolean;\n /** Element accepts free-form text and may emit composition events (IME). */\n needsComposition?: boolean;\n}\n\nconst INPUT_CHECKBOX_CHECKED: BindStrategy = {\n event: 'change',\n forceChangeEvent: true,\n read: (n) => (n as HTMLInputElement).checked,\n write: (n, v) => {\n const el = n as HTMLInputElement;\n const next = Boolean(v);\n if (el.checked !== next) el.checked = next;\n },\n};\n\nconst INPUT_RADIO_CHECKED: BindStrategy = {\n event: 'change',\n forceChangeEvent: true,\n read: (n) => {\n const el = n as HTMLInputElement;\n return el.checked ? el.value : '';\n },\n write: (n, v) => {\n const el = n as HTMLInputElement;\n const next = String(v) === el.value;\n if (el.checked !== next) el.checked = next;\n },\n};\n\nconst INPUT_FILE_FILES: BindStrategy = {\n event: 'change',\n forceChangeEvent: true,\n read: (n) => (n as HTMLInputElement).files,\n // Browsers do not allow programmatic writes to <input type=\"file\">.\n write: () => {},\n};\n\nconst INPUT_VALUE: BindStrategy = {\n event: 'input',\n needsComposition: true,\n read: (n) => (n as HTMLInputElement).value,\n write: (n, v) => {\n const el = n as HTMLInputElement;\n const next = v == null ? '' : String(v);\n if (el.value !== next) el.value = next;\n },\n};\n\nconst SELECT_VALUE: BindStrategy = {\n event: 'change',\n forceChangeEvent: true,\n read: (n) => {\n const s = n as HTMLSelectElement;\n return s.multiple ? Array.from(s.selectedOptions, (o) => o.value) : s.value;\n },\n write: (n, v) => {\n const s = n as HTMLSelectElement;\n if (s.multiple) {\n const set = new Set((Array.isArray(v) ? v : []).map(String));\n for (const opt of Array.from(s.options)) opt.selected = set.has(opt.value);\n } else {\n const next = v == null ? '' : String(v);\n if (s.value !== next) s.value = next;\n }\n },\n};\n\nconst TEXTAREA_VALUE: BindStrategy = {\n event: 'input',\n needsComposition: true,\n read: (n) => (n as HTMLTextAreaElement).value,\n write: (n, v) => {\n const el = n as HTMLTextAreaElement;\n const next = v == null ? '' : String(v);\n if (el.value !== next) el.value = next;\n },\n};\n\n/**\n * Resolves the read/write/event strategy for a DOM element + prop combination.\n */\nfunction resolveStrategy(node: Element, prop: string): BindStrategy {\n const tag = node.nodeName;\n if (tag === 'INPUT') {\n const type = (node as HTMLInputElement).type;\n if (prop === 'checked') {\n return type === 'radio' ? INPUT_RADIO_CHECKED : INPUT_CHECKBOX_CHECKED;\n }\n if (prop === 'files') return INPUT_FILE_FILES;\n return INPUT_VALUE;\n }\n if (tag === 'SELECT') return SELECT_VALUE;\n if (tag === 'TEXTAREA') return TEXTAREA_VALUE;\n // Fallback for custom elements or contenteditable hosts.\n return {\n event: 'input',\n read: (n) => (n as any)[prop],\n write: (n, v) => {\n (n as any)[prop] = v;\n },\n };\n}\n\n/**\n * Applies built-in modifiers (trim, number) to a raw value.\n */\nfunction castValue(val: unknown, trim?: boolean, number?: boolean): unknown {\n if (!isString(val)) return val;\n if (trim) val = (val as string).trim();\n if (number && val !== '') {\n const parsed = Number(val);\n if (!Number.isNaN(parsed)) return parsed;\n }\n return val;\n}\n\n/** Whether `node` is the currently focused element (Document / ShadowRoot aware). */\nfunction isFocused(node: Element): boolean {\n const root = node.getRootNode();\n return (root instanceof Document || root instanceof ShadowRoot) && root.activeElement === node;\n}\n\n/**\n * Synchronizes a DOM element property with a model getter and setter.\n *\n * @param node The element to bind. `null` is tolerated (no-op).\n * @param prop Bound property: `value` / `checked` / `files` / arbitrary.\n * @param getter Reactive getter or static initial value.\n * @param setter Receives the new value when the user edits the DOM.\n * @param modifiers Optional `BindModifiers`.\n */\nexport function bindElement(\n node: Element | null,\n prop: 'value' | 'checked' | 'files' | string,\n getter: (() => unknown) | unknown,\n setter: (value: unknown) => void,\n modifiers: BindModifiers = {},\n): void {\n if (!node) return;\n\n const strategy = resolveStrategy(node, prop);\n const { trim, number, lazy } = modifiers;\n const isFiles = prop === 'files';\n\n const readModel = (): unknown => (isFunction(getter) ? (getter as () => unknown)() : getter);\n\n // File inputs hold a `FileList` and never benefit from string casting.\n const transform = (v: unknown): unknown => (isFiles ? v : castValue(v, trim, number));\n\n // ── DOM → Model ──\n const eventName = lazy || strategy.forceChangeEvent ? 'change' : strategy.event;\n\n // Closure flag (avoids polluting the DOM node with a `_composing` property).\n let composing = false;\n\n const syncFromDom = (): void => {\n if (composing) return;\n const raw = strategy.read(node);\n if (raw === undefined) return;\n\n if (isFiles) {\n setter(raw);\n return;\n }\n\n const next = transform(raw);\n if (!Object.is(readModel(), next)) {\n setter(next);\n }\n };\n\n addEventListener(node, eventName, syncFromDom);\n\n // For trim/number, also normalize the displayed value on `change` (blur), so the\n // input shows the canonical form (e.g. trimmed whitespace) even when bound lazily.\n if (!lazy && !isFiles && (trim || number) && eventName !== 'change') {\n addEventListener(node, 'change', () => {\n strategy.write(node, transform(strategy.read(node)));\n });\n }\n\n // IME composition: pause sync during composition; resume on end.\n if (strategy.needsComposition && !lazy) {\n addEventListener(node, 'compositionstart', () => {\n composing = true;\n });\n addEventListener(node, 'compositionend', () => {\n if (!composing) return;\n composing = false;\n // Run the same sync path now that composition has finished.\n syncFromDom();\n });\n }\n\n // ── Model → DOM ──\n const runner = effect(() => {\n const value = readModel();\n\n // Avoid disturbing the user while they are typing in a focused text input.\n if (strategy.needsComposition && !lazy && isFocused(node)) {\n if (composing) return;\n const current = transform(strategy.read(node));\n if (Object.is(current, value)) return;\n }\n\n strategy.write(node, value);\n });\n\n if (getActiveScope()) {\n onCleanup(() => runner.stop());\n }\n}\n","/**\n * Shallow compare two objects\n * @param {any} a - The first object to compare\n * @param {any} b - The second object to compare\n * @returns {boolean} - Returns true if the objects are equal, false otherwise\n */\nexport function shallowCompare(a: any, b: any): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n for (const key in a) {\n if (a[key] !== b[key]) return false;\n }\n\n for (const key in b) {\n if (!(key in a)) return false;\n }\n\n return true;\n}\n\n/**\n * Omits props from a target object using a proxy.\n *\n * @param target - The target object.\n * @param keys - The keys to omit.\n * @returns A proxy that omits specified keys.\n */\nexport function omitProps<T extends object, K extends keyof T>(target: T, keys: K[]): Omit<T, K> {\n const excludeSet = new Set(keys);\n\n return new Proxy(target, {\n /**\n * Returns a property unless it is excluded by the proxy.\n */\n get(obj, prop) {\n if (excludeSet.has(prop as K)) {\n return undefined;\n }\n return Reflect.get(obj, prop);\n },\n /**\n * Returns the enumerable keys that are not excluded from the proxy.\n */\n ownKeys(obj) {\n return Reflect.ownKeys(obj).filter((key) => !excludeSet.has(key as K));\n },\n /**\n * Returns the property descriptor unless the key is excluded.\n */\n getOwnPropertyDescriptor(obj, prop) {\n if (excludeSet.has(prop as K)) {\n return undefined;\n }\n return Reflect.getOwnPropertyDescriptor(obj, prop);\n },\n /**\n * Returns whether the requested value exists.\n */\n has(obj, prop) {\n if (excludeSet.has(prop as K)) {\n return false;\n }\n return Reflect.has(obj, prop);\n },\n });\n}\n","import { FRAGMENT_COMPONENT } from '../constants';\nimport type { AnyNode, ComponentProps } from '../types';\n\nexport interface FragmentProps extends ComponentProps {\n children?: AnyNode | AnyNode[];\n}\n\n/**\n * Fragment component - renders multiple children without wrapper elements (Client-side only).\n *\n * **Client-side behavior:**\n * - Returns children directly for rendering.\n * - Hydration system matches children using hydration keys.\n * - The template system handles array children automatically.\n *\n * @param props - Component props with children.\n * @returns {AnyNode} Children directly without wrapper.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Fragment>\n * <div>First</div>\n * <span>Second</span>\n * </Fragment>\n *\n * // Nested fragments\n * <Fragment>\n * <Fragment>\n * <div>Nested 1</div>\n * <div>Nested 2</div>\n * </Fragment>\n * <div>Third</div>\n * </Fragment>\n *\n * // Empty fragment (renders nothing)\n * <Fragment />\n * ```\n */\nexport function Fragment(props?: FragmentProps): AnyNode {\n // `<Fragment />` and `<Fragment>{null}</Fragment>` are legitimate:\n // they render nothing. Returning `null` here keeps the caller tree\n // valid and lets the template runtime drop the placeholder.\n if (!props || props.children == null) return null;\n\n // Client-side rendering: return children directly — the template\n // system handles arrays/signals/components on its own.\n return props.children as AnyNode;\n}\n\nFragment[FRAGMENT_COMPONENT] = true;\n\n/**\n * Check if a node is a Fragment component.\n *\n * @param node - Node to check.\n * @returns {boolean} True if node is a Fragment.\n */\nexport function isFragment(node: unknown): boolean {\n return !!node && !!node[FRAGMENT_COMPONENT];\n}\n","import { isFunction, isString, warn } from '@estjs/shared';\nimport { effect } from '@estjs/signals';\nimport { PORTAL_COMPONENT } from '../constants';\nimport { consumeTeleportAnchor, consumeTeleportBlock, isHydrating } from '../hydration';\nimport { onMount } from '../lifecycle';\nimport {\n type Scope,\n createScope,\n disposeScope,\n getActiveScope,\n onCleanup,\n runWithScope,\n} from '../scope';\nimport { insert } from '../dom';\nimport type { AnyNode } from '../types';\n\nexport interface PortalProps {\n /** Children to render at the target location. */\n children?: AnyNode | AnyNode[];\n /**\n * Mount target — CSS selector string, `Element`, or reactive getter.\n * When the getter result changes, the Portal re-mounts at the new target.\n */\n target?: string | Element | (() => string | Element | null | undefined);\n /**\n * When truthy, children render inline at the call site instead of being teleported.\n * May be a static value or a reactive getter.\n */\n disabled?: boolean | (() => boolean);\n}\n\n/** Resolve `props.target` to an Element, handling string / Element / getter. */\nfunction resolveTarget(props: PortalProps): Element | null {\n const raw = isFunction(props.target) ? (props.target as () => unknown)() : props.target;\n if (raw == null) return null;\n if (isString(raw)) return document.querySelector(raw as string);\n return raw as Element;\n}\n\n/** Evaluate `props.disabled`, supporting both static booleans and getters. */\nfunction evalDisabled(props: PortalProps): boolean {\n return isFunction(props.disabled) ? !!(props.disabled as () => boolean)() : !!props.disabled;\n}\n\n/**\n * Portal — teleports children into a different DOM node.\n *\n * - `disabled=true` renders children inline at the call site.\n * - Otherwise children are teleported into `target`.\n * - Both `target` and `disabled` may be reactive; changes trigger re-mount.\n *\n * @returns A placeholder comment node that marks the call site.\n *\n * @example\n * ```tsx\n * <Portal target=\"#modal-root\" disabled={isMobile}>\n * <div>Modal content</div>\n * </Portal>\n * ```\n */\nexport function Portal(props: PortalProps): Comment {\n // Hydration: adopt SSR-emitted anchors + target block.\n if (isHydrating()) {\n const adopted = tryHydratePortal(props);\n if (adopted) return adopted;\n }\n\n const placeholder = document.createComment('portal');\n placeholder[PORTAL_COMPONENT] = true;\n\n const { children } = props;\n if (children == null) return placeholder;\n\n const ownerScope = getActiveScope();\n let innerScope: Scope | null = null;\n\n /**\n * Mount children into the given parent, inside a fresh inner scope\n * that inherits from the owning scope. This allows `insert()` effects\n * to be properly disposed on teardown.\n */\n const mountAt = (parent: Node, before?: Node): void => {\n innerScope = createScope(ownerScope);\n runWithScope(innerScope, () => {\n insert(parent, () => children, before);\n });\n };\n\n /**\n * Tear down the inner scope, removing all mounted children and their\n * reactive effects.\n */\n const teardown = (): void => {\n if (innerScope) {\n disposeScope(innerScope);\n innerScope = null;\n }\n };\n\n /**\n * Evaluate disabled/target and (re-)mount, tearing down the previous\n * mount first. Accepts pre-evaluated values to avoid redundant getter\n * invocations when called from within the tracking effect.\n */\n const apply = (disabled: boolean, target: Element | null): void => {\n teardown();\n\n if (disabled) {\n const parent = placeholder.parentNode;\n if (!parent) return;\n mountAt(parent, placeholder);\n return;\n }\n\n if (!target) {\n if (__DEV__) {\n warn(`[Portal] Target element not found: ${String(props.target)}`);\n }\n return;\n }\n mountAt(target);\n };\n\n // Track reactive deps immediately but defer DOM work until placeholder\n // is attached. On subsequent runs (reactive change) the effect runs\n // apply() directly with the freshly evaluated values — no redundant\n // double-evaluation.\n let mounted = false;\n\n const effectRunner = effect(() => {\n const disabled = evalDisabled(props);\n const target = disabled ? null : resolveTarget(props);\n\n if (mounted) {\n apply(disabled, target);\n }\n });\n\n onMount(() => {\n mounted = true;\n\n const disabled = evalDisabled(props);\n const target = disabled ? null : resolveTarget(props);\n\n // Try mounting synchronously — works when target is already in the document.\n if (disabled || target) {\n apply(disabled, target);\n return;\n }\n\n // Target may not be in the document yet (sibling elements mount bottom-up).\n // Defer to microtask — flushes before paint.\n queueMicrotask(() => {\n if (!placeholder.parentNode) return;\n apply(evalDisabled(props), resolveTarget(props));\n });\n });\n\n onCleanup(() => {\n effectRunner.stop();\n teardown();\n });\n\n return placeholder;\n}\n\nPortal[PORTAL_COMPONENT] = true;\n\n/**\n * Hydration adoption for Portal.\n *\n * Returns the SSR call-site anchor as placeholder on match, `null` on mismatch\n * (falls back to CSR mount path).\n */\nfunction tryHydratePortal(props: PortalProps): Comment | null {\n if (evalDisabled(props)) return null;\n\n const anchor = consumeTeleportAnchor();\n if (!anchor) {\n if (__DEV__) {\n warn('[Portal] hydration mismatch: no <!--teleport-anchor--> at call site.');\n }\n return null;\n }\n\n const target = resolveTarget(props);\n if (!target) {\n if (__DEV__) {\n warn(`[Portal] hydration mismatch: target not found: ${String(props.target)}`);\n }\n return null;\n }\n\n const block = consumeTeleportBlock(target);\n if (!block) {\n if (__DEV__) {\n warn(\n `[Portal] hydration mismatch: no <!--teleport-start--> in target ${String(props.target)}`,\n );\n }\n return null;\n }\n\n anchor[PORTAL_COMPONENT] = true;\n return anchor;\n}\n\n/**\n * Check if a node is a Portal component.\n *\n * @param node - Node to check.\n * @returns True if node is a Portal.\n */\nexport function isPortal(node: unknown): boolean {\n return !!node && !!node[PORTAL_COMPONENT];\n}\n","import { isArray, isBrowser, isFunction, isPromise, warn } from '@estjs/shared';\nimport { isComputed, isSignal } from '@estjs/signals';\nimport { insertNode, normalizeNode } from '../dom';\nimport { provide } from '../provide';\nimport { onDestroy } from '../lifecycle';\nimport { SUSPENSE_COMPONENT } from '../constants';\nimport type { AnyNode } from '../types';\n\n/** Clear all children from an element */\nfunction clearContainer(el: HTMLElement): void {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n}\nexport function resolveNodeValue(value: unknown): unknown {\n let current = value;\n\n while (isFunction(current)) {\n current = (current as Function)();\n }\n\n if (isSignal(current) || isComputed(current)) {\n return resolveNodeValue((current as any).value);\n }\n\n return current;\n}\nexport interface SuspenseProps {\n /** The content to render. Can be a Promise for async loading. */\n children?: Node | Node[] | Promise<Node | Node[]>;\n /** Fallback content to display while children is loading (Promise pending). */\n fallback?: Node;\n /** Optional key for reconciliation. */\n key?: string;\n}\n\nexport const SuspenseContext = Symbol('SuspenseContext');\n\nexport interface SuspenseContextType {\n register: (promise: Promise<any>) => void;\n increment: () => void;\n decrement: () => void;\n}\n\n/**\n * Suspense component - handles async content with a fallback UI.\n *\n * @param props - Component props with children, fallback, and optional key.\n * @returns {AnyNode} Placeholder node or fallback content.\n *\n * @example\n * ```tsx\n * <Suspense fallback={<div>Loading...</div>}>\n * {asyncContent}\n * </Suspense>\n * ```\n */\nexport function Suspense(props: SuspenseProps): Node {\n // Check if we're in SSR mode (no DOM globals)\n if (!isBrowser()) {\n // In SSR, keep structure deterministic and never touch DOM APIs.\n // Suspense boundary renders fallback while async resources are unresolved.\n return props.fallback ?? ('' as unknown as Node);\n }\n // Create a container to manage content swapping\n const container = document.createElement('div');\n container.style.display = 'contents'; // Invisible wrapper\n\n // Track if component is still mounted (for async cleanup)\n let isMounted = true;\n let pendingCount = 0;\n let isShowingFallback = false;\n\n let resolvedChildren: AnyNode | AnyNode[] | null = null;\n\n /**\n * Materializes child.\n */\n const materializeChild = (value: AnyNode): AnyNode => {\n const current = resolveNodeValue(value);\n\n if (isArray(current)) {\n const nodes: AnyNode[] = [];\n for (const item of current as AnyNode[]) {\n const materialized = materializeChild(item);\n if (isArray(materialized)) {\n nodes.push(...(materialized as AnyNode[]));\n } else {\n nodes.push(materialized);\n }\n }\n return nodes as AnyNode;\n }\n\n return normalizeNode(current);\n };\n\n /**\n * Inserts a materialized child or child list into the container.\n */\n const insertMaterializedChild = (value: AnyNode) => {\n const normalized = materializeChild(value);\n const nodes = isArray(normalized) ? normalized : [normalized];\n\n for (const node of nodes) {\n if (node != null) {\n insertNode(container, node);\n }\n }\n };\n\n /**\n * Renders fallback content.\n */\n const renderFallbackContent = () => {\n clearContainer(container);\n\n if (props.fallback != null) {\n insertMaterializedChild(props.fallback);\n }\n };\n\n /**\n * Switches the boundary into its fallback view.\n */\n const showFallback = () => {\n if (isShowingFallback) return;\n isShowingFallback = true;\n renderFallbackContent();\n };\n\n /**\n * Restores the resolved children when the boundary can leave fallback mode.\n */\n const showChildren = () => {\n if (!isShowingFallback) return;\n\n // Check if we have something to show\n const hasContent = resolvedChildren || (props.children != null && !isPromise(props.children));\n\n if (!hasContent) {\n return;\n }\n\n isShowingFallback = false;\n\n clearContainer(container);\n\n if (resolvedChildren) {\n renderChildren(resolvedChildren);\n } else if (props.children != null && !isPromise(props.children)) {\n renderChildren(props.children);\n }\n };\n\n /**\n * Render children into the container.\n *\n * @param children - The children to render.\n * @returns {void}\n */\n const renderChildren = (children: AnyNode | AnyNode[]): void => {\n // Guard: don't render children if we should be showing fallback\n if (isShowingFallback) return;\n\n clearContainer(container);\n\n if (children == null) return;\n\n const childArray = isArray(children) ? children : [children];\n for (const child of childArray) {\n if (child != null) {\n insertMaterializedChild(child);\n }\n }\n\n // Resource registration may flip to fallback while children are mounting.\n if (isShowingFallback) {\n renderFallbackContent();\n }\n };\n\n // Context for resources to register themselves\n const suspenseContext: SuspenseContextType = {\n register: (promise: Promise<any>) => {\n pendingCount++;\n showFallback();\n\n promise\n .then(() => {\n if (!isMounted) return;\n pendingCount--;\n if (pendingCount === 0) {\n showChildren();\n }\n })\n .catch((error) => {\n if (__DEV__) {\n warn('[Suspense] Resource failed:', error);\n }\n if (!isMounted) return;\n pendingCount--;\n // For now, if error happens, we still try to show children (or maybe error boundary later)\n if (pendingCount === 0) {\n showChildren();\n }\n });\n },\n increment: () => {\n pendingCount++;\n showFallback();\n },\n decrement: () => {\n pendingCount = Math.max(0, pendingCount - 1);\n if (pendingCount === 0) {\n showChildren();\n }\n },\n };\n\n provide(SuspenseContext, suspenseContext);\n\n const children = props.children;\n\n // Initial render logic\n if (isPromise(children)) {\n // Async children - show fallback immediately, then resolve\n children\n .then((resolved) => {\n resolvedChildren = resolved;\n })\n .catch(() => {\n // Ignore error, handled by register\n });\n suspenseContext.register(children);\n } else if (children != null) {\n // Sync children - render immediately\n // If any child is a resource read, it will call register() synchronously during this render\n renderChildren(children);\n } else {\n // No children - show fallback if available\n showFallback();\n }\n\n onDestroy(() => {\n isMounted = false;\n pendingCount = 0;\n resolvedChildren = null;\n clearContainer(container);\n container.remove();\n });\n\n return container;\n}\n\nSuspense[SUSPENSE_COMPONENT] = true;\n\n/**\n * Check if a node is a Suspense component.\n *\n * @param node - Node to check.\n * @returns {boolean} True if node is a Suspense.\n */\nexport function isSuspense(node: unknown): boolean {\n return !!node && !!node[SUSPENSE_COMPONENT];\n}\n","import { type Signal, signal } from '@estjs/signals';\nimport { inject } from '../provide';\nimport { SuspenseContext } from './Suspense';\n\nexport type ResourceState = 'pending' | 'ready' | 'errored';\n\nexport interface Resource<T> {\n (): T | undefined;\n loading: Signal<boolean>;\n error: Signal<Error | null>;\n state: Signal<ResourceState>;\n}\n\nexport interface ResourceActions<T> {\n mutate: (value: T) => void;\n refetch: () => Promise<void>;\n}\n\nexport interface ResourceOptions<T> {\n initialValue?: T;\n}\n\n/**\n * Create a resource for async data fetching.\n * Inspired by SolidJS createResource.\n *\n * @param fetcher - Function that returns a Promise with the data.\n * @param options - Optional configuration.\n * @returns {[Resource<T>, ResourceActions<T>]} Tuple of [resource, actions].\n */\nexport function createResource<T>(\n fetcher: () => Promise<T>,\n options?: ResourceOptions<T>,\n): [Resource<T>, ResourceActions<T>] {\n // Internal state\n const value = signal<T | undefined>(options?.initialValue);\n const loading = signal<boolean>(true);\n const error = signal<Error | null>(null);\n const state = signal<ResourceState>('pending');\n\n let fetchId = 0;\n\n let currentPromise: Promise<void> | null = null;\n let suspenseRegistered = false;\n const suspenseContext = inject<any>(SuspenseContext, null);\n\n /**\n * Fetch function.\n */\n const fetch = async (): Promise<void> => {\n const currentFetchId = ++fetchId;\n loading.value = true;\n state.value = 'pending';\n error.value = null;\n suspenseRegistered = false;\n if (suspenseContext) {\n // Track pending fetches even when callers branch on loading/state before reading the resource.\n suspenseContext.increment();\n }\n\n try {\n const promise = fetcher();\n currentPromise = promise as any; // Track original promise for Suspense\n promise.catch(() => {}); // Prevent unhandled rejection\n const result = await promise;\n\n // Only update if this is still the latest fetch\n if (currentFetchId === fetchId) {\n value.value = result;\n state.value = 'ready';\n loading.value = false;\n }\n } catch (error_) {\n // Only update if this is still the latest fetch\n if (currentFetchId === fetchId) {\n error.value = error_ instanceof Error ? error_ : new Error(String(error_));\n state.value = 'errored';\n loading.value = false;\n }\n } finally {\n if (suspenseContext) {\n suspenseContext.decrement();\n }\n }\n };\n\n // Start initial fetch\n fetch();\n\n // Resource accessor function\n const resource = (() => {\n // Register with Suspense only once per fetch cycle\n if (!suspenseRegistered && loading.value && currentPromise && suspenseContext) {\n suspenseRegistered = true;\n // @ts-ignore\n suspenseContext.register(currentPromise);\n }\n return value.value;\n }) as Resource<T>;\n resource.loading = loading;\n resource.error = error;\n resource.state = state;\n\n // Actions\n const actions: ResourceActions<T> = {\n mutate: (newValue: T) => {\n value.value = newValue;\n state.value = 'ready';\n loading.value = false;\n error.value = null;\n },\n refetch: async () => {\n await fetch();\n },\n };\n\n return [resource, actions];\n}\n","import { isFunction } from '@estjs/shared';\nimport { inject } from '../provide';\nimport { onDestroy } from '../lifecycle';\nimport { onCleanup } from '../scope';\nimport { Component } from '../component';\nimport { SuspenseContext, type SuspenseContextType } from './Suspense';\nimport type { AnyNode, ComponentFn, ComponentProps } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AsyncComponentOptions {\n /**\n * Component to render while the async component is loading.\n * Only shown after `delay` ms has elapsed (prevents flash of loading state).\n */\n loading?: ComponentFn;\n\n /**\n * Component to render when the async component fails to load.\n * Receives `{ error, retry }` as props.\n */\n error?: ComponentFn<{ error: Error; retry: () => void }>;\n\n /**\n * Delay in ms before showing the `loading` component (default: 200).\n */\n delay?: number;\n\n /**\n * Timeout in ms. If loading exceeds this, the error component is shown.\n */\n timeout?: number;\n\n /**\n * SSR rendering strategy (default: `'blocking'`).\n *\n * - `'blocking'` — Pre-calls the loader at definition time. If the module\n * resolves before the component body runs (e.g. pre-loaded via\n * `renderToStringAsync`), the real component is inlined in the HTML.\n * - `'client-only'` — Renders `null` on the server; loads only in browser.\n */\n ssr?: 'blocking' | 'client-only';\n\n /**\n * Called when loading fails. Useful for logging or error tracking.\n */\n onError?: (error: Error, retry: () => void) => void;\n}\n\ntype LoaderResult<P> = { default: ComponentFn<P> } | ComponentFn<P>;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Resolves the default export from a module.\n *\n * @param mod - The module result to resolve.\n * @returns {ComponentFn<P>} The resolved component function.\n */\nfunction resolveModule<P>(mod: LoaderResult<P>): ComponentFn<P> {\n return isFunction(mod) ? (mod as ComponentFn<P>) : (mod as { default: ComponentFn<P> }).default;\n}\n\n/**\n * Mount a ComponentFn into a container element, returning the Component instance.\n *\n * @param el - The element to render into.\n * @param fn - The component function.\n * @param props - The component props.\n * @returns The component instance.\n */\nfunction renderInto<P extends ComponentProps>(\n el: HTMLElement,\n fn: ComponentFn<P>,\n props?: P,\n): Component<P> {\n const comp = new Component(fn, props);\n comp.mount(el);\n return comp;\n}\n\n// ============================================================================\n// defineAsyncComponent\n// ============================================================================\n\n/**\n * Define an async (lazy-loaded) component.\n *\n * Compatible with client, SSR, and SSG. Integrates with `<Suspense>` via\n * `SuspenseContext` when rendered inside a Suspense boundary.\n *\n *\n * @param loader - The async loader function.\n * @param options - Configuration options.\n * @returns {ComponentFn<P>} The async component wrapper function.\n *\n * @example\n * ```tsx\n * // Simple\n * const Chart = defineAsyncComponent(() => import('./Chart'));\n *\n * // With options\n * const Chart = defineAsyncComponent(\n * () => import('./Chart'),\n * {\n * loading: () => <Spinner />,\n * error: ({ error, retry }) => (\n * <div>\n * <p>{error.message}</p>\n * <button onClick={retry}>Retry</button>\n * </div>\n * ),\n * delay: 200,\n * timeout: 10_000,\n * }\n * );\n *\n * // Works standalone or inside Suspense\n * function App() {\n * return (\n * <Suspense fallback={<div>Loading…</div>}>\n * <Chart data={data} />\n * </Suspense>\n * );\n * }\n * ```\n */\nexport function defineAsyncComponent<P extends ComponentProps = ComponentProps>(\n loader: () => Promise<LoaderResult<P>>,\n options: AsyncComponentOptions = {},\n): ComponentFn<P> {\n const { delay = 200, timeout, ssr = 'blocking', onError } = options;\n\n // ── Server-side rendering ─────────────────────────────────────────────────\n if (typeof window === 'undefined') {\n if (ssr === 'client-only') {\n /**\n * Returns the async component placeholder output.\n */\n const placeholder: ComponentFn<P> = () => '' as unknown as AnyNode;\n (placeholder as any).__asyncLoader = loader;\n (placeholder as any).__asyncResolved = () => null;\n return placeholder;\n }\n\n // 'blocking': pre-call the loader so that if the module is already cached\n // the component is available synchronously when the component body runs.\n let ssrResolved: ComponentFn<P> | null = null;\n let ssrPromise: Promise<void> | null = null;\n\n /**\n * SSR loader matches the client-side signature `() => Promise<void>`\n * so external consumers can treat `__asyncLoader` uniformly across\n * environments.\n */\n const ssrLoad = (): Promise<void> => {\n if (ssrPromise) return ssrPromise;\n ssrPromise = loader()\n .then((mod) => {\n ssrResolved = resolveModule(mod);\n })\n .catch(() => {});\n return ssrPromise;\n };\n\n // Kick off loading eagerly so that pre-resolved modules are inlined.\n ssrLoad();\n\n /**\n * Renders the server-side async wrapper.\n */\n const ssrWrapper: ComponentFn<P> = (props: P) => {\n if (ssrResolved) {\n return ssrResolved(props);\n }\n\n return '' as unknown as AnyNode;\n };\n\n (ssrWrapper as any).__asyncLoader = ssrLoad;\n (ssrWrapper as any).__asyncResolved = () => ssrResolved;\n\n return ssrWrapper;\n }\n\n // ── Client-side ──────────────────────────────────────────────────────────\n //\n // Module-level cache: all instances share one loader invocation.\n\n let cachedComponent: ComponentFn<P> | null = null;\n let cachedError: Error | null = null;\n type CacheStatus = 'pending' | 'resolved' | 'errored';\n let cachedStatus: CacheStatus = 'pending';\n let loadPromise: Promise<void> | null = null;\n\n /**\n * Loads the requested resource.\n */\n function load(): Promise<void> {\n if (loadPromise) return loadPromise;\n\n loadPromise = loader()\n .then((mod) => {\n cachedComponent = resolveModule(mod);\n cachedStatus = 'resolved';\n })\n .catch((error) => {\n cachedError = error instanceof Error ? error : new Error(String(error));\n cachedStatus = 'errored';\n loadPromise = null; // allow retry\n });\n\n return loadPromise;\n }\n\n // Kick off loading eagerly\n load();\n\n // ── Wrapper component ────────────────────────────────────────────────────\n //\n // Mirrors the Suspense pattern: return a plain DOM element (display:contents)\n // and perform imperative DOM swaps when async state changes.\n // This avoids issues with the Component class calling the inner render\n // function immediately instead of tracking it reactively.\n\n /**\n * Renders the async component wrapper.\n */\n function AsyncWrapper(props: P): AnyNode {\n // Fast path: already resolved\n if (cachedStatus === 'resolved' && cachedComponent) {\n const el = document.createElement('div');\n el.style.display = 'contents';\n const comp = renderInto(el, cachedComponent, props);\n onCleanup(() => comp.destroy());\n return el;\n }\n\n // Fast path: already errored\n if (cachedStatus === 'errored' && cachedError) {\n const el = document.createElement('div');\n el.style.display = 'contents';\n if (options.error) {\n let alive = true;\n let currentComp: Component | null = null;\n\n const swap = (fn: ComponentFn<any>, swapProps?: any) => {\n if (!alive) return;\n currentComp?.destroy();\n currentComp = renderInto(el, fn, swapProps);\n };\n\n const retry = () => {\n loadPromise = null;\n cachedStatus = 'pending';\n cachedError = null;\n if (options.loading) swap(options.loading);\n load().then(() => {\n if (!alive) return;\n if (cachedStatus === 'resolved' && cachedComponent) {\n swap(cachedComponent, props);\n } else if (cachedStatus === 'errored' && cachedError) {\n if (options.error) swap(options.error, { error: cachedError!, retry });\n }\n });\n };\n\n swap(options.error, { error: cachedError, retry });\n\n onDestroy(() => {\n alive = false;\n currentComp?.destroy();\n currentComp = null;\n });\n }\n return el;\n }\n\n // ─ Pending state ──────────────────────────────────────────────────────\n const container = document.createElement('div');\n container.style.display = 'contents';\n\n let alive = true;\n let currentComp: Component | null = null;\n let delayTimer: ReturnType<typeof setTimeout> | null = null;\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Swaps the current rendered component.\n */\n const swap = (fn: ComponentFn<any>, swapProps?: any) => {\n if (!alive) return;\n currentComp?.destroy();\n currentComp = renderInto(container, fn, swapProps);\n };\n\n /**\n * Creates a retry handler for the current props.\n */\n const retryWith =\n (retryProps: P): (() => void) =>\n () => {\n loadPromise = null;\n cachedStatus = 'pending';\n cachedError = null;\n if (options.loading) swap(options.loading);\n load().then(() => {\n if (cachedStatus === 'resolved' && cachedComponent) {\n swap(cachedComponent, retryProps);\n } else if (cachedStatus === 'errored' && cachedError) {\n if (options.error) {\n swap(options.error, {\n error: cachedError,\n retry: retryWith(retryProps),\n });\n }\n }\n });\n };\n\n onDestroy(() => {\n alive = false;\n currentComp?.destroy();\n currentComp = null;\n if (delayTimer != null) clearTimeout(delayTimer);\n if (timeoutTimer != null) clearTimeout(timeoutTimer);\n });\n\n // Inject Suspense context (undefined when not inside a Suspense boundary)\n const suspenseCtx = inject<SuspenseContextType>(SuspenseContext) ?? null;\n\n /**\n * Displays the resolved component.\n */\n const showResolved = (compFn: ComponentFn<P>) => swap(compFn, props);\n\n /**\n * Displays the error state.\n */\n const showError = (err: Error) => {\n if (options.error) swap(options.error, { error: err, retry: retryWith(props) });\n };\n\n /**\n * Displays the loading state.\n */\n const showLoading = () => {\n if (options.loading) swap(options.loading);\n };\n\n const instancePromise = load().then(() => {\n if (!alive) return;\n if (cachedStatus === 'resolved' && cachedComponent) {\n showResolved(cachedComponent);\n } else if (cachedStatus === 'errored' && cachedError) {\n showError(cachedError);\n if (onError) onError(cachedError, retryWith(props));\n }\n if (delayTimer != null) clearTimeout(delayTimer);\n if (timeoutTimer != null) clearTimeout(timeoutTimer);\n });\n\n // Notify Suspense boundary about this pending async work\n if (suspenseCtx) {\n suspenseCtx.register(instancePromise);\n }\n\n // Delay before showing loading indicator\n if (delay > 0) {\n delayTimer = setTimeout(() => {\n if (alive && cachedStatus === 'pending') {\n showLoading();\n }\n }, delay);\n } else if (options.loading) {\n showLoading();\n }\n\n // Optional timeout\n if (timeout != null) {\n timeoutTimer = setTimeout(() => {\n if (alive && cachedStatus === 'pending') {\n const err = new Error(`[defineAsyncComponent] Timeout after ${timeout}ms`);\n cachedError = err;\n cachedStatus = 'errored';\n showError(err);\n if (onError) onError(err, retryWith(props));\n }\n }, timeout);\n }\n\n return container;\n }\n\n (AsyncWrapper as any).__asyncLoader = load;\n (AsyncWrapper as any).__asyncResolved = () => cachedComponent;\n\n return AsyncWrapper;\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Returns true if a function was created by `defineAsyncComponent`.\n *\n * @param fn - The function to check.\n * @returns {boolean} True if it is an async component.\n */\nexport function isAsyncComponent(fn: unknown): boolean {\n return isFunction(fn) && !!(fn as any).__asyncLoader;\n}\n","import { type Signal, effect, isSignal } from '@estjs/signals';\nimport { isFunction } from '@estjs/shared';\nimport {\n type Scope,\n createScope,\n disposeScope,\n getActiveScope,\n onCleanup,\n runWithScope,\n} from '../scope';\nimport { FOR_COMPONENT } from '../constants';\nimport { normalizeNode } from '../dom';\nimport { getSequence } from '../reconcile';\nimport type { AnyNode } from '../types';\n\nexport interface ForProps<T> {\n each: T[] | Signal<T[]> | (() => T[]);\n children: (item: T, index: number) => AnyNode;\n key?: (item: T) => unknown;\n fallback?: () => AnyNode;\n}\n\ninterface ItemEntry {\n key: unknown;\n item: unknown;\n nodes: Node[];\n scope: Scope; // Track scope for cleanup\n}\n\n/**\n * Optimized For Component\n * - Uses createDetachedScope to avoid parent.children Set overhead (SolidJS style)\n * - Uses DocumentFragment batching for mass creation\n * - Inlines scope switching for performance\n */\nexport function For<T>(props: ForProps<T>): Node {\n const fragment = document.createDocumentFragment();\n const marker = document.createComment('');\n fragment.appendChild(marker);\n\n let entries: ItemEntry[] = [];\n let fallbackNodes: Node[] = [];\n\n const keyFn = props.key;\n const renderFn = props.children;\n\n const getList = (): T[] => {\n const input = props.each;\n if (isSignal(input)) return (input as Signal<T[]>).value ?? [];\n if (isFunction(input)) return (input as () => T[])() ?? [];\n return (input as T[]) ?? [];\n };\n\n const getKey = (item: T): unknown => (keyFn ? keyFn(item) : item);\n\n const normalizeNodes = (value: AnyNode): Node[] => {\n if (Array.isArray(value)) {\n const nodes: Node[] = [];\n for (const item of value) {\n nodes.push(...normalizeNodes(item as AnyNode));\n }\n return nodes;\n }\n return [normalizeNode(value)];\n };\n\n const mountValue = (value: AnyNode, parent: Node, before: Node | null): Node[] => {\n const nodes = normalizeNodes(value);\n for (const node of nodes) {\n if (before) {\n parent.insertBefore(node, before);\n } else {\n parent.appendChild(node);\n }\n }\n return nodes;\n };\n\n const mountFallback = (parent: Node, before: Node | null) => {\n if (!props.fallback) return;\n const nodes = mountValue(props.fallback(), parent, before);\n fallbackNodes = nodes;\n };\n\n const clearFallback = () => {\n for (const node of fallbackNodes) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n fallbackNodes = [];\n };\n\n /**\n * Render item with detached scope.\n */\n const renderItem = (item: T, index: number, parent: Node, before: Node | null): ItemEntry => {\n const parentScope = getActiveScope();\n const scope = createScope(parentScope);\n let mountedNodes: Node[] = [];\n runWithScope(scope, () => {\n mountedNodes = mountValue(renderFn(item, index), parent, before);\n });\n\n return { key: getKey(item), item, nodes: mountedNodes, scope };\n };\n\n const disposeItem = (entry: ItemEntry) => {\n disposeScope(entry.scope);\n for (const node of entry.nodes) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n };\n\n const effectRunner = effect(() => {\n const newItems = getList();\n\n const parent = marker.parentNode;\n\n // Initial mount (parent is null because fragment is not attached yet)\n if (!parent) {\n if (newItems.length === 0) {\n mountFallback(fragment, marker);\n } else {\n entries = new Array(newItems.length);\n let idx = 0;\n for (const newItem of newItems) {\n entries[idx] = renderItem(newItem, idx, fragment, marker);\n idx++;\n }\n }\n // Skip reconcile on initial mount — entries are already created\n return;\n }\n\n // Before the fragment is attached, `marker.parentNode` is the fragment\n // itself; afterwards it is the real host (e.g. the container the user\n // mounted into). All reconciliation must target the live parent, or\n // `insertBefore(node, marker)` throws NotFoundError because `marker`\n // already moved out of the fragment on the first flush.\n reconcile(parent, newItems);\n });\n\n /**\n * Reconciles the rendered entries against the latest item list.\n *\n * @param parent - The parent node.\n * @param newItems - The new items list.\n * @returns {void}\n */\n function reconcile(parent: Node, newItems: T[]): void {\n const oldLen = entries.length;\n const newLen = newItems.length;\n\n // ===== FAST PATH 1: Clear all =====\n if (newLen === 0) {\n for (let i = 0; i < oldLen; i++) {\n disposeItem(entries[i]);\n }\n entries = [];\n\n if (props.fallback && fallbackNodes.length === 0) {\n mountFallback(parent, marker);\n }\n return;\n }\n\n // ===== FAST PATH 2: Create all (from empty/fallback) =====\n if (oldLen === 0 || fallbackNodes.length > 0) {\n if (fallbackNodes.length > 0) {\n clearFallback();\n }\n\n entries = new Array(newLen);\n\n // Batch creation in fragment\n const batchFragment = document.createDocumentFragment();\n\n for (let i = 0; i < newLen; i++) {\n // Render to batchFragment, append to end (before=null)\n entries[i] = renderItem(newItems[i], i, batchFragment, null);\n }\n\n parent.insertBefore(batchFragment, marker);\n return;\n }\n\n // ===== Keyed reconciliation =====\n //\n // Each `oldKeyMap` value preserves the entry together with its original\n // index. The index is the fuel for the LIS-based move minimisation\n // further down: by mapping each new position to an old position we can\n // find the longest slice that is already in order and leave it alone.\n const oldKeyMap = new Map<unknown, Array<[ItemEntry, number]>>();\n for (let i = 0; i < oldLen; i++) {\n const entry = entries[i];\n const list = oldKeyMap.get(entry.key);\n const pair: [ItemEntry, number] = [entry, i];\n if (list) list.push(pair);\n else oldKeyMap.set(entry.key, [pair]);\n }\n\n const newEntries: ItemEntry[] = new Array(newLen);\n const toRemove: ItemEntry[] = [];\n\n // Batch new nodes in a fragment so multiple creations turn into a\n // single native DOM insertion. Created lazily — only when a fresh\n // item is actually rendered so we avoid the allocation when every\n // entry is reused.\n let batchFragment: DocumentFragment | null = null;\n\n // `newIndexToOldIndex[i] === 0` → newEntries[i] is freshly created.\n // `newIndexToOldIndex[i] === k + 1` → reused from `entries[k]`.\n const newIndexToOldIndex = new Int32Array(newLen);\n let moved = false;\n let maxOldSeen = 0;\n\n // Pre-compute keys for all new items to avoid redundant getKey calls\n const newKeys = new Array<unknown>(newLen);\n for (let i = 0; i < newLen; i++) {\n newKeys[i] = getKey(newItems[i]);\n }\n\n for (let i = 0; i < newLen; i++) {\n const item = newItems[i];\n const key = newKeys[i];\n const oldList = oldKeyMap.get(key);\n\n if (oldList && oldList.length > 0) {\n const [reused, oldIndex] = oldList.shift()!;\n if (Object.is(reused.item, item)) {\n reused.item = item;\n newEntries[i] = reused;\n newIndexToOldIndex[i] = oldIndex + 1;\n if (oldIndex < maxOldSeen) moved = true;\n else maxOldSeen = oldIndex;\n } else {\n if (!batchFragment) batchFragment = document.createDocumentFragment();\n disposeItem(reused);\n newEntries[i] = renderItem(item, i, batchFragment, null);\n }\n } else {\n if (!batchFragment) batchFragment = document.createDocumentFragment();\n newEntries[i] = renderItem(item, i, batchFragment, null);\n // newIndexToOldIndex[i] remains 0 (fresh entry).\n }\n }\n\n for (const list of oldKeyMap.values()) {\n for (const [entry] of list) toRemove.push(entry);\n }\n for (const entry of toRemove) disposeItem(entry);\n\n // ===== Position correction with LIS =====\n // We walk the new array right-to-left using `marker` as the initial\n // anchor, which lets us use `insertBefore(node, nextNode)` uniformly.\n const lis = moved ? getSequence(newIndexToOldIndex) : [];\n let lisCursor = lis.length - 1;\n let nextNode: Node = marker;\n\n for (let i = newLen - 1; i >= 0; i--) {\n const entry = newEntries[i];\n const nodes = entry.nodes;\n const isFresh = newIndexToOldIndex[i] === 0;\n const inLis = !isFresh && moved && lisCursor >= 0 && i === lis[lisCursor];\n\n if (inLis) {\n // Stable skeleton — leave every node untouched, but still update\n // `nextNode` so the next iteration has the correct anchor.\n lisCursor--;\n for (let j = nodes.length - 1; j >= 0; j--) nextNode = nodes[j];\n continue;\n }\n\n // Fresh entry OR reused entry that is out of place → (re)insert each\n // node. The nextSibling guard keeps us from redundant writes for\n // multi-node rows whose internal order is already correct.\n for (let j = nodes.length - 1; j >= 0; j--) {\n const node = nodes[j];\n if (node.nextSibling !== nextNode) {\n parent.insertBefore(node, nextNode);\n }\n nextNode = node;\n }\n }\n\n entries = newEntries;\n }\n\n onCleanup(() => {\n effectRunner.stop();\n for (const entry of entries) {\n disposeItem(entry);\n }\n entries = [];\n clearFallback();\n if (marker.parentNode) {\n marker.parentNode.removeChild(marker);\n }\n });\n\n return fragment;\n}\n\nFor[FOR_COMPONENT] = true;\n\nexport function isFor(node: unknown): boolean {\n return !!node && !!(node as Record<symbol, boolean>)[FOR_COMPONENT];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/operations/attr.ts","../src/operations/class.ts","../src/operations/style.ts","../src/hydration.ts","../src/reconcile.ts","../src/dom.ts","../src/operations/event.ts","../src/lifecycle.ts","../src/component.ts","../src/renderer.ts","../src/provide.ts","../src/events.ts","../src/binding.ts","../src/utils.ts","../src/components/Fragment.ts","../src/components/Portal.ts","../src/components/Suspense.ts","../src/components/createResource.ts","../src/components/AsyncComponent.ts","../src/components/For.ts"],"names":["next","isString","isObject","_a","warn","child","error","isFunction","template","document","effect","isSignal","isComputed","isBrowser","isArray","isPromise","children","alive","currentComp","swap","batchFragment"],"mappings":"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","file":"template.dev.esm.js","sourcesContent":["/**\n * event prefix, used to distinguish event handler properties\n */\nexport const EVENT_PREFIX = 'on';\n\n/**\n * update prefix, used to identify update callback properties\n */\nexport const UPDATE_PREFIX = 'update';\n\n/**\n * children property name\n */\nexport const CHILDREN_PROP = 'children';\n/**\n * Key name for the Spread attribute\n */\nexport const SPREAD_NAME = '_$spread$';\n\n/**\n * used to get the DOM element reference\n */\nexport const REF_KEY = 'ref';\n/**\n * Component key property name\n */\nexport const KEY_PROP = 'key' as const;\n\n/**\n * SVG namespace constant\n */\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * XML namespace for xlink attributes\n */\nexport const XLINK_NAMESPACE = 'http://www.w3.org/2000/xlink';\n\n/**\n * xmlns namespace for SVG elements\n */\nexport const XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/';\n\nexport const NORMAL_COMPONENT = Symbol(__DEV__ ? 'Normal Component' : '');\nexport const FRAGMENT_COMPONENT = Symbol(__DEV__ ? 'Fragment Component' : '');\nexport const PORTAL_COMPONENT = Symbol(__DEV__ ? 'Portal Component' : '');\nexport const SUSPENSE_COMPONENT = Symbol(__DEV__ ? 'Suspense Component' : '');\nexport const FOR_COMPONENT = Symbol(__DEV__ ? 'For Component' : '');\nexport enum COMPONENT_STATE {\n /** Initial state */\n INITIAL,\n /** Mounting */\n MOUNTING,\n /** MOUNTED */\n MOUNTED,\n /** Updating */\n UPDATING,\n /** Destroying */\n DESTROYING,\n /** destroy */\n DESTROYED,\n}\nexport enum COMPONENT_TYPE {\n NORMAL = 'normal',\n FRAGMENT = 'fragment',\n PORTAL = 'portal',\n SUSPENSE = 'suspense',\n FOR = 'for',\n}\n","import {\n includeBooleanAttr,\n isBooleanAttr,\n isObject,\n isSpecialBooleanAttr,\n isString,\n isSymbol,\n warn,\n} from '@estjs/shared';\nimport {\n KEY_PROP,\n SPREAD_NAME,\n SVG_NAMESPACE,\n XLINK_NAMESPACE,\n XMLNS_NAMESPACE,\n} from '../constants';\n\n/**\n * Supported value types for the attribute patch layer.\n *\n * In addition to primitive values, spread objects are also accepted, so the\n * type keeps `Record<string, unknown>`.\n */\nexport type AttrValue = string | boolean | number | null | undefined | Record<string, unknown>;\n\n/**\n * Applies a minimal attribute update to an element.\n *\n * This is the most general-purpose attribute updater in the template runtime.\n * It is responsible for:\n * - skipping internal reserved fields;\n * - expanding spread attribute objects;\n * - handling boolean attributes and SVG / xlink / xmlns namespaces;\n * - applying basic dangerous-URL protection;\n * - refusing raw HTML sinks such as `innerHTML` / `srcdoc`;\n * - staying silent during hydration to avoid overwriting SSR DOM.\n *\n * @param el - The element to patch.\n * @param key - The attribute key.\n * @param prev - Previous attribute value.\n * @param next - Next attribute value.\n */\nexport function patchAttr(el: Element, key: string, prev: AttrValue, next: AttrValue) {\n if (key === KEY_PROP) {\n if (next == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(next));\n }\n return;\n }\n if (key === SPREAD_NAME) {\n const prevObj = isObject(prev) ? (prev as Record<string, unknown>) : null;\n const nextObj = isObject(next) ? (next as Record<string, unknown>) : null;\n\n if (__DEV__) {\n if (next != null && !nextObj) {\n warn('spread attribute must be an object');\n }\n }\n\n if (prevObj) {\n for (const attrKey in prevObj) {\n if (attrKey === SPREAD_NAME) {\n if (__DEV__) {\n warn('nested spread attributes are ignored');\n }\n continue;\n }\n if (!nextObj || !(attrKey in nextObj)) {\n patchAttr(el, attrKey, prevObj[attrKey] as AttrValue, null);\n }\n }\n }\n\n if (nextObj) {\n for (const attrKey in nextObj) {\n if (attrKey === SPREAD_NAME) {\n if (__DEV__) {\n warn('nested spread attributes are ignored');\n }\n continue;\n }\n patchAttr(el, attrKey, prevObj?.[attrKey] as AttrValue, nextObj[attrKey] as AttrValue);\n }\n }\n return;\n }\n\n const elementIsSVG = el?.namespaceURI === SVG_NAMESPACE;\n const isXlink = elementIsSVG && key.startsWith('xlink:');\n const isXmlns = elementIsSVG && key.startsWith('xmlns:');\n\n const isBoolean = isSpecialBooleanAttr(key) || isBooleanAttr(key);\n\n // Early return if values are the same\n if (prev === next) {\n return;\n }\n\n // Event attributes are handled by the dedicated event layer, so skip them here.\n if (key.length > 2 && key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110) {\n return;\n }\n\n // Lowercase only after early returns, since it is only needed for specific checks like href.\n const lowerKey = key.toLowerCase();\n\n if (lowerKey === 'innerhtml' || lowerKey === 'srcdoc') {\n if (__DEV__) {\n warn(`${key} updates are ignored by patchAttr`);\n }\n return;\n }\n\n if (next == null) {\n if (isXlink) {\n el.removeAttributeNS(XLINK_NAMESPACE, key.slice(6));\n } else if (isXmlns) {\n const localName = key.slice(6);\n el.removeAttributeNS(XMLNS_NAMESPACE, localName);\n } else {\n el.removeAttribute(key);\n }\n return;\n }\n\n if (isBoolean) {\n if (includeBooleanAttr(next)) {\n el.setAttribute(key, '');\n } else {\n el.removeAttribute(key);\n }\n return;\n }\n\n const attrValue = isSymbol(next) ? String(next) : next;\n\n // Basic safety guard: block dangerous protocols on common URL attributes.\n const isUrlAttr =\n lowerKey === 'href' ||\n lowerKey === 'src' ||\n lowerKey === 'xlink:href' ||\n lowerKey === 'action' ||\n lowerKey === 'formaction' ||\n lowerKey === 'poster';\n if (isUrlAttr && isString(attrValue)) {\n const v = attrValue.trim().toLowerCase();\n if (v.startsWith('javascript:') || v.startsWith('data:')) {\n return;\n }\n }\n\n if (isXlink) {\n el.setAttributeNS(XLINK_NAMESPACE, key, String(attrValue));\n return;\n }\n\n if (isXmlns) {\n el.setAttributeNS(XMLNS_NAMESPACE, key, String(attrValue));\n return;\n }\n\n if (elementIsSVG) {\n el.setAttribute(key, String(attrValue));\n } else {\n if (key in el) {\n try {\n el[key] = attrValue;\n } catch {\n el.setAttribute(key, String(attrValue));\n }\n } else {\n el.setAttribute(key, String(attrValue));\n }\n }\n}\n","import { isString, normalizeClassName } from '@estjs/shared';\n\n/**\n * Supported value types for the class patch layer.\n */\nexport type ClassValue = string | Record<string, boolean> | ClassValue[] | null | undefined;\n\n/**\n * Applies a minimal class update to an element.\n *\n * Class values are normalized into a string first, then written through\n * `className` or `setAttribute('class')` depending on the element type.\n * Hydration stays silent and reuses the server-rendered result by default.\n *\n * @param el - The element to patch.\n * @param prev - Previous class value.\n * @param next - Next class value.\n * @param isSVG - Whether the element is an SVG element.\n * @returns {void}\n */\nexport function patchClass(\n el: Element,\n prev: unknown,\n next: unknown,\n isSVG: boolean = false,\n): void {\n if (prev === next) {\n return;\n }\n\n const normalizedNext = normalizeClass(next);\n if (!normalizedNext) {\n el.removeAttribute('class');\n return;\n }\n\n // Skip DOM write if normalized values are identical.\n // For string prev, it's already normalized; otherwise normalize.\n const normalizedPrev = isString(prev) ? prev : normalizeClass(prev);\n if (normalizedPrev === normalizedNext) {\n return;\n }\n\n // SVG nodes cannot rely on `className` consistently, so use the attribute path.\n if (isSVG) {\n el.setAttribute('class', normalizedNext);\n } else {\n el.className = normalizedNext;\n }\n}\n\n/**\n * Normalizes supported class inputs into a single string.\n */\nexport const normalizeClass = normalizeClassName;\n","import { camelCase, capitalize, isArray, isObject, isString } from '@estjs/shared';\n\n/**\n * Internal symbol used to mark raw CSS variable text in style objects.\n * @internal\n */\nexport const CSS_VAR_TEXT: unique symbol = Symbol('CSS_VAR_TEXT');\n\n// Precompile the `!important` detector to avoid recreating it on every write.\nconst importantRE = /\\s*!important$/;\n\n// Candidate vendor prefixes and their lookup cache.\nconst prefixes = ['Webkit', 'Moz', 'ms'];\nconst prefixCache: Record<string, string> = {};\n\n/**\n * Supported value types for the style patch layer.\n */\nexport type Style = string | Record<string, string | string[]> | null | undefined;\n\n/**\n * Applies a minimal style update to an element.\n *\n * Supports both string-based and object-based styles, while staying silent\n * during hydration so the server-rendered DOM can be reused.\n *\n * @param el - The element to patch.\n * @param prev - Previous style value.\n * @param next - Next style value.\n * @returns {void}\n */\nexport function patchStyle(el: HTMLElement, prev: unknown, next?: unknown) {\n const style = el.style;\n\n if (next && isString(next)) {\n if (prev !== next) {\n style.cssText = next;\n }\n return;\n }\n\n if (!next) {\n if (prev) {\n el.removeAttribute('style');\n }\n return;\n }\n\n // When the previous value is an object, remove keys that disappeared in the next value.\n if (prev && !isString(prev)) {\n const prevObj = prev as Record<string, unknown>;\n for (const key in prevObj) {\n if (!next || (next as Record<string, unknown>)[key] == null) {\n setStyle(style, key, '');\n }\n }\n } else if (prev && isString(prev)) {\n // When the previous value is a string, approximate its keys and remove missing ones.\n // Match only CSS property-name tokens (letters/digits/hyphens before a colon).\n // This is linear and ignores semicolons inside url() or quoted values because\n // those fragments never match /letter+:/.\n const declRE = /(?:^|;)\\s*([a-z][a-z\\d-]*)\\s*:/gi;\n let match: RegExpExecArray | null;\n while ((match = declRE.exec(prev)) !== null) {\n const key = match[1].trim();\n if (key && next && isObject(next) && (next as Record<string, unknown>)[key] == null) {\n setStyle(style, key, '');\n }\n }\n }\n\n // Apply the next style values last.\n if (next && !isString(next)) {\n const nextObj = next as Record<string, unknown>;\n for (const key in nextObj) {\n const value = nextObj[key];\n if (\n (!prev || isString(prev) || (prev as Record<string, unknown>)[key] !== value) &&\n value != null\n ) {\n setStyle(style, key, value as string | string[]);\n }\n }\n }\n}\n\n/**\n * Sets a single style property.\n *\n * Centralizes array-value expansion, CSS variable writes, vendor-prefix\n * resolution, and `!important` handling in one place.\n *\n * @param style - Target style object.\n * @param name - Style property name.\n * @param val - Style value.\n * @private\n */\nexport function setStyle(style: CSSStyleDeclaration, name: string, val: string | string[]): void {\n // Array values represent multiple candidates for the same property.\n if (isArray(val)) {\n for (const element of val) {\n setStyle(style, name, element);\n }\n return;\n }\n\n if (val == null || val === '') {\n val = '';\n }\n\n // CSS variables must be written through `setProperty()`.\n if (name.startsWith('--')) {\n style.setProperty(name, val);\n return;\n }\n\n // Regular properties try vendor prefix resolution first.\n const prefixed = autoPrefix(style, name);\n\n // `!important` cannot use direct property assignment and must go through `setProperty()`.\n if (isString(val) && importantRE.test(val)) {\n style.setProperty(camelCase(prefixed), val.replace(importantRE, ''), 'important');\n } else {\n style[prefixed] = val;\n }\n}\n\n/**\n * Resolves the correct vendor-prefixed style property name.\n *\n * Results are cached in `prefixCache` to avoid repeated hot-path detection.\n *\n * @param style - Target style object.\n * @param rawName - Original property name.\n * @returns The property name that can be written to `style` directly.\n * @private\n */\nfunction autoPrefix(style: CSSStyleDeclaration, rawName: string): string {\n // Check the cache first.\n const cached = prefixCache[rawName];\n if (cached) {\n return cached;\n }\n\n // Try the standard camelCase property first.\n let name = camelCase(rawName);\n if (name !== 'filter' && name in style) {\n return (prefixCache[rawName] = name);\n }\n\n // If the standard property does not exist, try vendor-prefixed variants.\n name = capitalize(name);\n for (const prefix of prefixes) {\n const prefixed = prefix + name;\n if (prefixed in style) {\n return (prefixCache[rawName] = prefixed);\n }\n }\n\n return rawName;\n}\n","import { isBrowser, warn } from '@estjs/shared';\nimport { patchAttr } from './operations/attr';\nimport { patchClass } from './operations/class';\nimport { patchStyle } from './operations/style';\nimport { template } from './renderer';\n\n// ---------------------------------------------------------------------------\n// Hydration key counter (mirrors server-side getHydrationKey / resetHydrationKey)\n// ---------------------------------------------------------------------------\n\nlet _hydrationKey = 0;\n\n/**\n * Returns a new hydration key.\n *\n * @returns The new hydration key as a string.\n */\nexport function getHydrationKey(): string {\n return String(_hydrationKey++);\n}\n\n/**\n * Resets the client-side hydration key counter.\n *\n * @returns {void}\n */\nexport function resetHydrationKey(): void {\n _hydrationKey = 0;\n}\n\n// ---------------------------------------------------------------------------\n// Hydration state + registry\n// ---------------------------------------------------------------------------\n\n/**\n * Module-private hydration flag.\n *\n * Read via `isHydrating()` instead of importing as a `let` binding — this\n * avoids cross-bundle \"live binding\" pitfalls when consumers go through a\n * barrel-export (`import { isHydrating } from '@estjs/template'`).\n */\nlet _isHydrating = false;\n\n/**\n * Returns whether the runtime is currently in the hydration first-pass.\n *\n * @returns True while hydrating, false otherwise.\n */\nexport function isHydrating(): boolean {\n return _isHydrating;\n}\n\n/**\n * Pre-built map of data-hk → Element, populated by beginHydration().\n * Mirrors SolidJS's sharedConfig.registry / gatherHydratable().\n */\nconst _registry = new Map<string, Element>();\n\n/**\n * Gather all [data-hk] elements under `root` into the registry.\n * Called once at hydration start — O(n) DOM query, then O(1) lookups.\n *\n * @param root - The root element to scan.\n */\nfunction gatherHydratable(root: Element): void {\n const nodes = root.querySelectorAll('[data-hk]');\n for (const node of nodes) {\n const key = (node as HTMLElement).dataset.hk;\n if (key != null && !_registry.has(key)) {\n _registry.set(key, node as Element);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Teleport (Portal) hydration anchors\n// ---------------------------------------------------------------------------\n\n/** FIFO queue of `<!--teleport-anchor-->` comments at Portal call sites. */\nconst _teleportCallsiteAnchors: Comment[] = [];\n\n/** Per-target FIFO of `<!--teleport-start-->` comments inside teleport targets. */\nconst _teleportTargetStarts = new Map<Element, Comment[]>();\n\n/** Scan `document.body` for teleport comment markers, classifying each into its queue. */\nfunction gatherTeleportAnchors(): void {\n if (typeof document === 'undefined') return;\n const walker = document.createNodeIterator(document.body, NodeFilter.SHOW_COMMENT);\n let node: Comment | null;\n\n while ((node = walker.nextNode() as Comment | null)) {\n const data = node.data;\n if (data === 'teleport-anchor') {\n _teleportCallsiteAnchors.push(node);\n } else if (data === 'teleport-start') {\n const parent = node.parentElement;\n if (!parent) continue;\n let bucket = _teleportTargetStarts.get(parent);\n if (!bucket) {\n bucket = [];\n _teleportTargetStarts.set(parent, bucket);\n }\n bucket.push(node);\n }\n }\n}\n\n/** Pop the next call-site anchor comment, or `null` if exhausted. */\nexport function consumeTeleportAnchor(): Comment | null {\n return _teleportCallsiteAnchors.shift() ?? null;\n}\n\n/** Pop the next teleport block from `target`, returning start/end markers and inner nodes. */\nexport function consumeTeleportBlock(\n target: Element,\n): { start: Comment; end: Comment; nodes: Node[] } | null {\n const bucket = _teleportTargetStarts.get(target);\n const start = bucket?.shift();\n if (!start) return null;\n\n const nodes: Node[] = [];\n let cursor: Node | null = start.nextSibling;\n while (cursor) {\n if (cursor.nodeType === Node.COMMENT_NODE && (cursor as Comment).data === 'teleport-end') {\n return { start, end: cursor as Comment, nodes };\n }\n nodes.push(cursor);\n cursor = cursor.nextSibling;\n }\n\n // Malformed block — no <!--teleport-end--> found. Return null to signal\n // a hydration mismatch rather than returning `{ start, end: start }` which\n // would be semantically incorrect.\n if (__DEV__) {\n warn('[Portal] hydration: orphaned <!--teleport-start--> without matching <!--teleport-end-->');\n }\n return null;\n}\n\n/**\n * Begins hydration.\n *\n * @param root - The root element to hydrate.\n */\nexport function beginHydration(root: Element): void {\n _isHydrating = true;\n _hydrationKey = 0;\n _registry.clear();\n _teleportCallsiteAnchors.length = 0;\n _teleportTargetStarts.clear();\n gatherHydratable(root);\n gatherTeleportAnchors();\n}\n\n/**\n * Ends hydration.\n *\n * @returns {void}\n */\nexport function endHydration(): void {\n _isHydrating = false;\n _registry.clear();\n _teleportCallsiteAnchors.length = 0;\n _teleportTargetStarts.clear();\n}\n\n/**\n * Returns a factory function that, when called at component render time:\n * - During hydration: increments the key, looks up the pre-built registry,\n * and returns the ACTUAL SSR DOM node (no cloneNode).\n * - During CSR: clones the parsed template as usual.\n *\n * @param html - The HTML template string.\n * @returns A factory function that returns a DOM element.\n */\nexport function getRenderedElement(html: string): () => Element {\n if (!isBrowser()) {\n return () => {\n throw new Error('[essor] getRenderedElement called in non-browser environment');\n };\n }\n\n let _csrFactory: (() => Element) | null = null;\n\n return (): Element => {\n if (!_isHydrating) {\n // CSR path — clone the template as normal\n if (!_csrFactory) _csrFactory = template(html) as () => Element;\n return _csrFactory();\n }\n\n // Hydration path — key incremented HERE (render time) to match server order\n const key = getHydrationKey();\n const node = _registry.get(key);\n\n if (node) {\n _registry.delete(key);\n return node; // TRUE DOM reuse — no cloneNode\n }\n\n // Mismatch: SSR node not found, fall back to CSR creation\n warn(`[essor] hydration mismatch: no SSR element for key \"${key}\"`);\n if (!_csrFactory) _csrFactory = template(html) as () => Element;\n return _csrFactory();\n };\n}\n\n// ---------------------------------------------------------------------------\n// Hydrate-mode patch wrappers (silence DOM writes during first hydration run)\n// ---------------------------------------------------------------------------\n\n/**\n * Patches class while considering hydration state.\n *\n * @param el - The element to patch.\n * @param prev - Previous class value.\n * @param next - Next class value.\n * @param isSVG - Whether the element is an SVG element.\n */\nexport function patchClassHydrate(\n el: Element,\n prev: unknown,\n next: unknown,\n isSVG?: boolean,\n): void {\n if (_isHydrating) return;\n patchClass(el, prev, next, isSVG);\n}\n\n/**\n * Patches attribute while considering hydration state.\n *\n * @param el - The element to patch.\n * @param key - The attribute key.\n * @param prev - Previous attribute value.\n * @param next - Next attribute value.\n */\nexport function patchAttrHydrate(el: Element, key: string, prev: unknown, next: unknown): void {\n if (_isHydrating) return;\n patchAttr(el, key, prev as never, next as never);\n}\n\n/**\n * Patches style while considering hydration state.\n *\n * @param el - The element to patch.\n * @param prev - Previous style value.\n * @param next - Next style value.\n */\nexport function patchStyleHydrate(el: HTMLElement, prev: unknown, next?: unknown): void {\n if (_isHydrating) return;\n patchStyle(el, prev, next);\n}\n","import { insertNode, removeNode } from './dom';\n\n/**\n * Resolves insert anchor.\n *\n * @param parent - The parent node.\n * @param candidate - The candidate anchor node.\n * @returns The resolved anchor node or null.\n */\nfunction resolveInsertAnchor(parent: Node, candidate?: Node | null): Node | null {\n return candidate && candidate.parentNode === parent ? candidate : null;\n}\n\n/**\n * Reconcile two arrays of real DOM nodes with minimal DOM operations.\n * This is the list reconciler for fine-grained rendering.\n *\n * @param parent - The parent node.\n * @param oldNodes - The array of current nodes.\n * @param newNodes - The array of new nodes.\n * @param anchor - Optional reference node for insertion.\n * @returns The new array of nodes.\n */\nexport function reconcileArrays(\n parent: Node,\n oldNodes: Node[],\n newNodes: Node[],\n anchor?: Node,\n): Node[] {\n const fallbackAnchor = resolveInsertAnchor(parent, anchor);\n const oldLength = oldNodes.length;\n const newLength = newNodes.length;\n\n if (oldLength === 0 && newLength === 0) return newNodes;\n\n if (oldLength === 0) {\n for (let i = 0; i < newLength; i++) {\n insertNode(parent, newNodes[i], fallbackAnchor);\n }\n return newNodes;\n }\n\n if (newLength === 0) {\n for (let i = 0; i < oldLength; i++) {\n removeNode(oldNodes[i]);\n }\n return [];\n }\n\n let start = 0;\n let oldEnd = oldLength - 1;\n let newEnd = newLength - 1;\n\n while (start <= oldEnd && start <= newEnd) {\n if (oldNodes[start] === newNodes[start]) {\n start++;\n } else {\n break;\n }\n }\n\n while (oldEnd >= start && newEnd >= start) {\n if (oldNodes[oldEnd] === newNodes[newEnd]) {\n oldEnd--;\n newEnd--;\n } else {\n break;\n }\n }\n\n if (start > oldEnd) {\n if (start <= newEnd) {\n const nextPos = newEnd + 1;\n const nextNode = resolveInsertAnchor(\n parent,\n nextPos < newLength ? newNodes[nextPos] : fallbackAnchor,\n );\n for (let i = start; i <= newEnd; i++) {\n insertNode(parent, newNodes[i], nextNode);\n }\n }\n } else if (start > newEnd) {\n for (let i = start; i <= oldEnd; i++) {\n removeNode(oldNodes[i]);\n }\n } else {\n reconcileUnknownSequence(parent, oldNodes, newNodes, start, oldEnd, newEnd, fallbackAnchor);\n }\n\n return newNodes;\n}\n\n/**\n * Reconciles unknown sequence of nodes.\n *\n * @param parent - The parent node.\n * @param oldNodes - Current nodes.\n * @param newNodes - New nodes.\n * @param start - Start index of the sequence.\n * @param oldEnd - End index of the old sequence.\n * @param newEnd - End index of the new sequence.\n * @param anchor - Optional reference node for insertion.\n * @returns {void}\n */\nfunction reconcileUnknownSequence(\n parent: Node,\n oldNodes: Node[],\n newNodes: Node[],\n start: number,\n oldEnd: number,\n newEnd: number,\n anchor?: Node | null,\n): void {\n const newLength = newEnd - start + 1;\n const newIndexMap = new Map<Node, number>();\n for (let i = start; i <= newEnd; i++) {\n newIndexMap.set(newNodes[i], i);\n }\n\n const newIndexToOldIndexMap = new Int32Array(newLength);\n newIndexToOldIndexMap.fill(0);\n\n let patched = 0;\n let moved = false;\n let maxNewIndexSoFar = 0;\n\n for (let i = start; i <= oldEnd; i++) {\n const oldNode = oldNodes[i];\n\n if (patched >= newLength) {\n removeNode(oldNode);\n continue;\n }\n\n const newIndex = newIndexMap.get(oldNode);\n\n if (newIndex === undefined) {\n removeNode(oldNode);\n } else {\n newIndexToOldIndexMap[newIndex - start] = i + 1;\n\n if (newIndex >= maxNewIndexSoFar) {\n maxNewIndexSoFar = newIndex;\n } else {\n moved = true;\n }\n patched++;\n }\n }\n\n const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : [];\n let j = increasingNewIndexSequence.length - 1;\n\n for (let i = newLength - 1; i >= 0; i--) {\n const nextIndex = start + i;\n const nextNode = newNodes[nextIndex];\n const anchorNode = resolveInsertAnchor(\n parent,\n nextIndex + 1 < newNodes.length ? newNodes[nextIndex + 1] : anchor,\n );\n\n if (newIndexToOldIndexMap[i] === 0) {\n insertNode(parent, nextNode, anchorNode);\n } else if (moved) {\n if (j < 0 || i !== increasingNewIndexSequence[j]) {\n insertNode(parent, nextNode, anchorNode);\n } else {\n j--;\n }\n }\n }\n}\n\n/**\n * Compute the Longest Increasing Subsequence using patience sorting.\n * O(n log n) time, O(n) space.\n *\n * @param arr - The array of indices.\n * @returns The LIS indices.\n */\nexport function getSequence(arr: Int32Array): number[] {\n const p = new Int32Array(arr.length);\n const result = [0];\n const len = arr.length;\n let i: number;\n let j: number;\n let u: number;\n let v: number;\n let c: number;\n\n for (i = 0; i < len; i++) {\n const arrI = arr[i];\n if (arrI !== 0) {\n j = result[result.length - 1];\n if (arr[j] < arrI) {\n p[i] = j;\n result.push(i);\n continue;\n }\n u = 0;\n v = result.length - 1;\n while (u < v) {\n c = (u + v) >> 1;\n if (arr[result[c]] < arrI) {\n u = c + 1;\n } else {\n v = c;\n }\n }\n if (arrI < arr[result[u]]) {\n if (u > 0) {\n p[i] = result[u - 1];\n }\n result[u] = i;\n }\n }\n }\n u = result.length;\n v = result[u - 1];\n while (u-- > 0) {\n result[u] = v;\n v = p[v];\n }\n return result;\n}\n","import { coerceArray, error, hasOwn, isFunction, isObject, isPrimitive, warn } from '@estjs/shared';\nimport { effect } from '@estjs/signals';\nimport { isComponent } from './component';\nimport { KEY_PROP } from './constants';\nimport { type Scope, getActiveScope, onCleanup, runWithScope } from './scope';\nimport { isHydrating } from './hydration';\nimport { reconcileArrays } from './reconcile';\nimport type { AnyNode } from './types';\n\n/**\n * Remove node from its parent\n *\n * @param node Node to remove\n *\n * @example\n * ```typescript\n * removeNode(elementToRemove);\n * ```\n */\nexport function removeNode(node: AnyNode): void {\n if (!node) return;\n\n if (isComponent(node)) {\n node.destroy();\n } else {\n const element = node as ChildNode;\n if (element.parentNode) {\n element.remove();\n }\n }\n}\n\n/**\n * Insert child node\n * Handle insertion of component nodes and DOM nodes\n *\n * @param parent Parent node\n * @param child Child node\n * @param before Reference node for insertion\n */\nexport function insertNode(parent: Node, child: AnyNode, before?: AnyNode): void {\n if (!parent || !child) return;\n\n const beforeNode = isComponent(before) ? before.firstChild : (before as Node);\n\n if (isComponent(child)) {\n child.mount(parent, beforeNode);\n return;\n }\n\n if (beforeNode) {\n parent.insertBefore(child as Node, beforeNode);\n } else {\n if (__DEV__) {\n if (!child) {\n error('insertNode: child is not a Node', child);\n }\n }\n parent.appendChild(child as Node);\n }\n}\n\n/**\n * Replace child node\n * Handle replacement of component nodes and DOM nodes\n *\n * @param parent Parent node\n * @param newNode New node\n * @param oldNode Old node to be replaced\n */\nexport function replaceNode(parent: Node, newNode: AnyNode, oldNode: AnyNode): void {\n if (!parent || !newNode || !oldNode || newNode === oldNode) return;\n\n const beforeNode: AnyNode | undefined = isComponent(oldNode)\n ? oldNode.beforeNode\n : (oldNode as Node).nextSibling!;\n removeNode(oldNode);\n insertNode(parent, newNode, beforeNode);\n}\n\n/**\n * Check if two nodes are the same (inline for performance)\n * This combines key check and type check\n */\nexport function isSameNode(a: AnyNode, b: AnyNode): boolean {\n // Check key equality first (fast path)\n const keyA = getNodeKey(a);\n const keyB = getNodeKey(b);\n\n if (keyA !== keyB) {\n return false;\n }\n\n // Inline type check to avoid function call\n const aIsComponent = isComponent(a);\n const bIsComponent = isComponent(b);\n\n if (aIsComponent && bIsComponent) {\n return a.component === b.component;\n }\n\n if (aIsComponent !== bIsComponent) {\n return false;\n }\n\n if (isPrimitive(a) || isPrimitive(b)) {\n return a === b;\n }\n\n const aNode = a as Node;\n const bNode = b as Node;\n\n if (aNode.nodeType !== bNode.nodeType) {\n return false;\n }\n\n if (aNode.nodeType === Node.ELEMENT_NODE) {\n return (aNode as Element).tagName === (bNode as Element).tagName;\n }\n\n return true;\n}\n\n/**\n * Extract the optional stable key associated with a runtime node.\n */\nfunction getNodeKey(node: AnyNode): unknown {\n if (!node) {\n return undefined;\n }\n\n if (isComponent(node)) {\n return hasOwn(node.props, KEY_PROP) ? node.props[KEY_PROP] : undefined;\n }\n\n if (node instanceof Element) {\n return node.getAttribute(KEY_PROP);\n }\n\n if (isObject(node) && hasOwn(node, KEY_PROP)) {\n return Reflect.get(node as object, KEY_PROP);\n }\n\n return undefined;\n}\n\n/**\n * Normalize node for reconciliation.\n *\n * Performance-critical: uses inlined typeof / instanceof checks\n * instead of utility function calls in the hot path.\n */\nexport function normalizeNode(node: unknown): Node {\n // Fast path: already a DOM Node (covers Element, Text, Comment, etc.)\n if (node instanceof Node) return node;\n\n // Component instances must pass through as-is — the reconciler and\n // insertNode/removeNode handle them via isComponent() checks.\n if (isComponent(node)) return node as unknown as Node;\n\n // Primitives → text node (inlined for speed)\n const t = typeof node;\n if (node == null || t === 'string' || t === 'number' || t === 'boolean' || t === 'symbol') {\n return document.createTextNode(node === false || node == null ? '' : String(node));\n }\n\n // Plain objects should not be rendered directly — convert to text and warn\n if (__DEV__ && isObject(node)) {\n warn(\n 'Rendering a plain object as a node is not recommended. ' +\n 'The object will be converted to its string representation.',\n node,\n );\n }\n return document.createTextNode(String(node));\n}\n/**\n * Reactive node insertion with binding support\n *\n * @param parent Parent node\n * @param nodeFactory Node factory function or static node\n * @param before Reference node for insertion position\n * @example\n * ```typescript\n * insert(container, () => message.value, null);\n * insert(container, staticElement, referenceNode);\n * insert(container, \"Hello World\", null); // Direct string support\n * ```\n */\nexport function insert(parent: Node, nodeFactory: AnyNode, before?: Node) {\n if (!parent) return;\n // Capture the active scope at call time - this is critical for correct context inheritance\n // When dynamic components are created inside effects, they need to inherit from\n // the scope that was active when insert() was called, not when the effect runs\n const parentScope: Scope | null = getActiveScope();\n\n let renderedNodes: Node[] = [];\n let isFirstRun = true;\n\n /**\n * Resolves a raw node value into a flat array of DOM Nodes.\n * Fast-paths simple cases (single Node, single primitive) to avoid\n * intermediate array allocations.\n */\n const resolveNodes = (raw: unknown): Node[] => {\n // Fast path: already a DOM Node\n if (raw instanceof Node) return [raw];\n\n // Fast path: Component instance (skip normalizeNode entirely)\n if (isComponent(raw)) return [raw as unknown as Node];\n\n // Fast path: single primitive → text node (inlined typeof for speed)\n const t = typeof raw;\n if (raw == null || t === 'string' || t === 'number' || t === 'boolean') {\n return [normalizeNode(raw)];\n }\n\n // General path: coerce, resolve nested functions, flatten, normalize\n return coerceArray(raw)\n .map((item) => (isFunction(item) ? item() : item))\n .flatMap((i) => i)\n .map(normalizeNode) as Node[];\n };\n\n // Create effect for reactive updates\n const effectRunner = effect(() => {\n const executeUpdate = () => {\n const rawNodes = isFunction(nodeFactory) ? nodeFactory() : nodeFactory;\n const nodes = resolveNodes(rawNodes);\n // Hydration mode: skip DOM operations on first run only when every\n // node already exists under the target parent. Component instances and\n // fallback CSR nodes still need the normal reconcile path.\n if (\n isFirstRun &&\n isHydrating() &&\n nodes.every((node) => node instanceof Node && node.parentNode === parent)\n ) {\n renderedNodes = nodes;\n isFirstRun = false;\n return;\n }\n renderedNodes = reconcileArrays(parent, renderedNodes as Node[], nodes, before) as Node[];\n isFirstRun = false;\n };\n\n // If we have a parent scope, run within it to maintain context hierarchy\n if (parentScope && !parentScope.isDestroyed) {\n runWithScope(parentScope, executeUpdate);\n } else {\n executeUpdate();\n }\n });\n\n onCleanup(() => {\n effectRunner.stop();\n for (const node of renderedNodes) removeNode(node);\n renderedNodes = [];\n });\n\n return renderedNodes;\n}\n/**\n * Returns the first child of a node.\n *\n * @param node - The node to get the child from.\n * @returns The first child node or null.\n */\nexport function child(node: Node | null): Node | null {\n return node?.firstChild || null;\n}\n\n/**\n * Returns the next sibling after advancing by `step`.\n *\n * @param node - The starting node.\n * @param step - Number of steps to advance.\n * @returns The resulting sibling node or null.\n */\nexport function next(node: Node | null, step: number = 1): Node | null {\n while (node && step > 0) {\n node = node.nextSibling;\n step--;\n }\n return node || null;\n}\n\n/**\n * Returns the child node at the requested index.\n *\n * @param node - The parent node.\n * @param index - The child index.\n * @returns The child node at index or null.\n */\nexport function nthChild(node: Node | null, index: number): Node | null {\n if (!node || index < 0) return null;\n let current = node.firstChild;\n while (current && index > 0) {\n current = current.nextSibling;\n index--;\n }\n return current || null;\n}\n","/**\n * Extended listener options with optional event delegation support.\n */\nexport interface EventOptions extends AddEventListenerOptions {\n /**\n * Selector used for event delegation.\n *\n * When provided, the handler only runs if the event target matches the selector.\n */\n delegate?: string;\n}\n\n/**\n * Cleanup function signature for event listeners.\n */\nexport type EventCleanup = () => void;\n\n/**\n * Adds an event listener to an element with optional simple delegation.\n *\n * Without `delegate`, this is a thin wrapper around native `addEventListener()`.\n * When `delegate` is provided, the runtime first checks the selector match before\n * dispatching the real handler to the caller.\n *\n * @param el - The element to add the listener to.\n * @param event - The name of the event to listen for.\n * @param handler - The event handler function.\n * @param options - Optional event listener options.\n * @returns A cleanup function that removes the listener.\n */\nexport function addEvent(\n el: Element,\n event: string,\n handler: EventListener,\n options?: EventOptions,\n): EventCleanup {\n if (!options?.delegate) {\n el.addEventListener(event, handler, options);\n return () => el.removeEventListener(event, handler, options);\n }\n\n // Delegation path: match the selector first, then forward the event to the caller.\n const selector = options.delegate;\n /**\n * Dispatches delegated events only for matching descendants.\n */\n const wrappedHandler = (e: Event) => {\n const target = e.target as Element;\n if (target.matches(selector) || target.closest(selector)) {\n handler.call(el, e);\n }\n };\n\n // Extract delegate from options and pass the rest to addEventListener\n const { delegate: _, ...nativeOptions } = options;\n\n el.addEventListener(event, wrappedHandler, nativeOptions);\n\n return () => {\n el.removeEventListener(event, wrappedHandler, nativeOptions);\n };\n}\n","import { error, isPromise } from '@estjs/shared';\nimport { type Scope, getActiveScope, runWithScope } from './scope';\n\nexport type LifecycleHook = () => void | Promise<void>;\n\n/**\n * Registers scoped hook.\n *\n * @param scope - The scope to register the hook for.\n * @param listKey - The key of the hook list.\n * @param hook - The hook function to register.\n */\nfunction registerScopedHook(\n scope: Scope,\n listKey: 'onMount' | 'onUpdate' | 'onDestroy',\n hook: LifecycleHook,\n): void {\n let hookList = scope[listKey];\n if (!hookList) {\n hookList = [];\n scope[listKey] = hookList;\n }\n hookList.push(hook);\n}\n\n/**\n * Executes lifecycle hooks and captures async rejections in dev mode.\n *\n * @param hooks - The array of hooks to execute.\n * @param scopeId - The ID of the scope.\n * @param phase - The lifecycle phase.\n * @returns A promise if any hooks are asynchronous, or undefined.\n */\nfunction executeHooks(\n hooks: LifecycleHook[],\n scopeId: number,\n phase: 'mount' | 'update' | 'destroy',\n): void | Promise<void> {\n const len = hooks.length;\n if (len === 0) return;\n\n let pending: Promise<void>[] | undefined;\n\n for (let i = 0; i < len; i++) {\n try {\n const result = hooks[i]();\n if (isPromise(result)) {\n const safePromise = result.catch((error_) => {\n if (__DEV__) {\n error(`Scope(${scopeId}): Async ${phase} hook rejected:`, error_);\n }\n });\n (pending || (pending = [])).push(safePromise);\n }\n } catch (error_) {\n if (__DEV__) {\n error(`Scope(${scopeId}): Error in ${phase} hook:`, error_);\n }\n }\n }\n\n if (!pending) return;\n return Promise.all(pending).then(() => {});\n}\n\n/**\n * Register a mount lifecycle hook.\n * If the scope is already mounted, the hook is executed immediately.\n *\n * @param hook - The hook function to register.\n * @returns {void}\n */\nexport function onMount(hook: LifecycleHook): void {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) error('onMount() must be called within a scope');\n return;\n }\n\n if (scope.isMounted) {\n try {\n const result = hook();\n if (isPromise(result)) {\n result.catch((error_) => {\n if (__DEV__) error(`Scope(${scope.id}): Async mount hook rejected:`, error_);\n });\n }\n } catch (error_) {\n if (__DEV__) error(`Scope(${scope.id}): Error in mount hook:`, error_);\n }\n return;\n }\n\n registerScopedHook(scope, 'onMount', hook);\n}\n\n/**\n * Register an update lifecycle hook.\n *\n * @param hook - The hook function to register.\n * @returns {void}\n */\nexport function onUpdate(hook: LifecycleHook): void {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) error('onUpdate() must be called within a scope');\n return;\n }\n\n registerScopedHook(scope, 'onUpdate', hook);\n}\n\n/**\n * Register a destroy lifecycle hook.\n *\n * @param hook - The hook function to register.\n * @returns {void}\n */\nexport function onDestroy(hook: LifecycleHook): void {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) error('onDestroy() must be called within a scope');\n return;\n }\n\n registerScopedHook(scope, 'onDestroy', hook);\n}\n\n/**\n * Trigger mount lifecycle hooks for a scope.\n *\n * @param scope - The scope to trigger hooks for.\n * @returns A promise if any hooks are asynchronous, or undefined.\n */\nexport function triggerMountHooks(scope: Scope): void | Promise<void> {\n if (scope.isDestroyed) {\n return;\n }\n if (!scope.onMount || scope.onMount.length === 0) {\n scope.isMounted = true;\n return;\n }\n\n const mountHooks = scope.onMount;\n const result = runWithScope(scope, () => executeHooks(mountHooks, scope.id, 'mount'));\n mountHooks.length = 0;\n scope.isMounted = true;\n return result;\n}\n\n/**\n * Trigger update lifecycle hooks for a scope.\n *\n * @param scope - The scope to trigger hooks for.\n * @returns A promise if any hooks are asynchronous, or undefined.\n */\nexport function triggerUpdateHooks(scope: Scope): void | Promise<void> {\n if (scope.isDestroyed || !scope.onUpdate || scope.onUpdate.length === 0) return;\n return runWithScope(scope, () => executeHooks(scope.onUpdate!, scope.id, 'update'));\n}\n\n// NOTE: destroy hooks are executed directly inside `disposeScope` to keep\n// the teardown path synchronous and free of extra `runWithScope` frames.\n// See `./scope.ts`.\n","import { type Signal, isComputed, isSignal, shallowReactive } from '@estjs/signals';\nimport { isFunction, isOn } from '@estjs/shared';\n\nimport { COMPONENT_STATE, COMPONENT_TYPE, REF_KEY } from './constants';\nimport { insert, insertNode, removeNode } from './dom';\nimport { createScope, disposeScope, getActiveScope, runWithScope } from './scope';\nimport { type EventCleanup, addEvent } from './operations/event';\nimport { triggerMountHooks, triggerUpdateHooks } from './lifecycle';\nimport type { AnyNode, ComponentFn, ComponentProps } from './types';\nimport type { Scope } from './scope';\n\n/**\n * Install every own-key descriptor from `source` onto `target` verbatim\n * (getters stay getters), optionally deleting any target key not present\n * in the incoming source.\n *\n * Preserving getter descriptors is the whole reason the component body can\n * read `props.foo` and transparently get the latest reactive value — the\n * compiler emits dynamic props as `{ get foo() { return signal.value } }`.\n * `{ ...props }` would snapshot each getter once and kill reactivity;\n * `defineProperty` keeps it alive.\n */\nfunction syncDescriptors(target: object, source: object, pruneMissing = false): void {\n const seen = pruneMissing ? new Set<string>() : null;\n for (const key of Object.getOwnPropertyNames(source)) {\n seen?.add(key);\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)!);\n }\n if (seen) {\n for (const key of Object.getOwnPropertyNames(target)) {\n if (!seen.has(key)) delete (target as Record<string, unknown>)[key];\n }\n }\n}\n\n/**\n * Read a prop value through its descriptor so dynamic getters (ref/event\n * handlers emitted as `get onClick() { ... }`) resolve to the latest value.\n */\nfunction readProp(source: object, key: string): unknown {\n const descriptor = Object.getOwnPropertyDescriptor(source, key)!;\n return descriptor.get ? descriptor.get.call(source) : descriptor.value;\n}\n\nexport class Component<P extends ComponentProps = {}> {\n public readonly [COMPONENT_TYPE.NORMAL] = true;\n\n public scope: Scope | null = null;\n public state: COMPONENT_STATE = COMPONENT_STATE.INITIAL;\n public beforeNode: Node | undefined = undefined;\n public renderedNodes: Node[] = [];\n public firstChild: Node | undefined = undefined;\n\n protected parentNode: Node | undefined = undefined;\n\n private readonly parentScope: Scope | null;\n private readonly reactiveProps: P;\n private rootEventCleanups: EventCleanup[] = [];\n private rootRefCleanup?: () => void;\n\n constructor(\n public readonly component: ComponentFn<P>,\n public props: P = {} as P,\n ) {\n this.parentScope = getActiveScope();\n // Shallow-reactive container that inherits the raw props' descriptors.\n // The component body reads from this container; `update()` re-installs\n // new descriptors in-place so existing closures keep working.\n const container = {} as P;\n syncDescriptors(container, props);\n this.reactiveProps = shallowReactive(container) as P;\n }\n\n /**\n * Mount the component into `parentNode` (optionally before `beforeNode`).\n * If already rendered, the existing DOM is re-inserted without re-running\n * the component function.\n */\n mount(parentNode: Node, beforeNode?: Node): AnyNode[] {\n this.parentNode = parentNode;\n this.beforeNode = beforeNode;\n this.state = COMPONENT_STATE.MOUNTING;\n\n // Fast path: already rendered — just move the nodes.\n if (this.renderedNodes.length > 0) {\n for (const node of this.renderedNodes) {\n insertNode(parentNode, node, beforeNode);\n }\n this.state = COMPONENT_STATE.MOUNTED;\n return this.renderedNodes;\n }\n\n const scope = createScope(this.parentScope ?? getActiveScope());\n this.scope = scope;\n\n const renderedNodes = runWithScope(scope, () => {\n let result: unknown = this.component(this.reactiveProps);\n\n // Render-function pattern: a component may return a factory instead of\n // the element directly.\n if (isFunction(result)) {\n result = (result as Function)(this.reactiveProps);\n }\n\n // Unwrap signal / computed — only their current value reaches the DOM.\n if (isSignal<Element>(result)) {\n result = result.value;\n } else if (isComputed<Element>(result)) {\n result = result.value;\n }\n\n return insert(parentNode, result as AnyNode, beforeNode) ?? [];\n });\n\n this.renderedNodes = renderedNodes;\n this.firstChild = renderedNodes[0];\n\n // Wire refs/events only after renderedNodes/firstChild are set.\n this.syncSpecialProps(this.props);\n\n this.state = COMPONENT_STATE.MOUNTED;\n triggerMountHooks(scope);\n\n return this.renderedNodes;\n }\n\n /**\n * Re-install props into the same `reactiveProps` container (preserving\n * any closures already holding a reference to it) and re-apply\n * refs/events against the current root element.\n */\n update(props: P): void {\n this.props = props;\n const scope = this.scope;\n if (!scope || scope.isDestroyed) return;\n\n syncDescriptors(this.reactiveProps as object, props ?? {}, /* pruneMissing */ true);\n this.syncSpecialProps(props);\n\n triggerUpdateHooks(scope);\n }\n\n /**\n * Tear down and re-mount the component at its current insertion point.\n * No-op if the component has never been mounted.\n */\n forceUpdate(): void {\n if (!this.parentNode) return;\n const parent = this.parentNode;\n const before = this.beforeNode;\n this.destroy();\n this.mount(parent, before);\n }\n\n /**\n * Dispose the scope, remove all rendered nodes, and clear bookkeeping.\n * Idempotent: subsequent calls are no-ops.\n */\n destroy(): void {\n const scope = this.scope;\n if (!scope || scope.isDestroyed) return;\n this.scope = null;\n this.releaseSpecialProps();\n disposeScope(scope);\n for (const node of this.renderedNodes) removeNode(node);\n this.renderedNodes = [];\n this.firstChild = undefined;\n this.parentNode = undefined;\n }\n\n /**\n * Apply props that bind to the root DOM element rather than flowing into\n * the component body: `ref` (signal/function) and `onXxx` event handlers.\n * The render-facing `reactiveProps` already has those keys; here we just\n * wire them to the actual DOM node.\n */\n private syncSpecialProps(props: P): void {\n if (!props) return;\n const root = this.firstChild as Element | undefined;\n if (!root) return;\n\n this.releaseSpecialProps();\n\n for (const key of Object.getOwnPropertyNames(props)) {\n const value = readProp(props, key);\n\n if (key === REF_KEY) {\n this.rootRefCleanup = this.bindRootRef(value, root);\n continue;\n }\n\n if (isOn(key) && isFunction(value)) {\n const eventName = key.slice(2).toLowerCase();\n this.rootEventCleanups.push(addEvent(root, eventName, value as EventListener));\n }\n }\n }\n\n /**\n * Remove all listeners/ref bindings currently attached to the root element.\n */\n private releaseSpecialProps(): void {\n for (const cleanup of this.rootEventCleanups) {\n cleanup();\n }\n this.rootEventCleanups.length = 0;\n\n if (this.rootRefCleanup) {\n this.rootRefCleanup();\n this.rootRefCleanup = undefined;\n }\n }\n\n /**\n * Bind the root ref prop and return a cleanup that restores the previous ref state.\n */\n private bindRootRef(value: unknown, root: Element): (() => void) | undefined {\n if (isFunction(value)) {\n value(root);\n return () => value(null);\n }\n\n if (isSignal<Element | null>(value)) {\n const ref = value as Signal<Element | null>;\n const previousValue = ref.value;\n ref.value = root;\n return () => {\n if (ref.value === root) {\n ref.value = previousValue;\n }\n };\n }\n\n return undefined;\n }\n}\n\n/**\n * Check if a value is a Component instance.\n */\nexport function isComponent(node: unknown): node is Component {\n return !!node && !!(node as Record<PropertyKey, unknown>)[COMPONENT_TYPE.NORMAL];\n}\n\n/**\n * Wrap a component function in a Component instance, or pass an existing\n * Component instance through unchanged.\n */\nexport function createComponent<P extends ComponentProps>(\n componentFn: ComponentFn<P>,\n props?: P,\n): Component<P> {\n if (isComponent(componentFn)) {\n return componentFn as unknown as Component<P>;\n }\n return new Component(componentFn, props);\n}\n","import { isString, warn } from '@estjs/shared';\nimport { type Component, createComponent, isComponent } from './component';\nimport { createScope, disposeScope, runWithScope } from './scope';\nimport { beginHydration, endHydration } from './hydration';\nimport { insert, insertNode } from './dom';\nimport type { ComponentFn, ComponentProps } from './types';\n\n/**\n * Create a template factory function from HTML string.\n *\n * This function creates a reusable template factory that efficiently clones\n * DOM nodes from the provided HTML string. The template is parsed once.\n *\n * Security note: `template(html)` is a raw HTML entrypoint. The caller is\n * responsible for ensuring `html` is trusted and not derived from unsanitized\n * user input.\n *\n * @param html - The HTML string to create template from.\n * @returns Factory function that returns a cloned node of the template.\n * @throws {Error} When template content is empty or invalid.\n *\n * @example\n * ```typescript\n * const buttonTemplate = template('<button>Click me</button>');\n * const button1 = buttonTemplate(); // Creates first button instance\n * const button2 = buttonTemplate(); // Creates second button instance\n * ```\n */\nexport function template(html: string) {\n let node: Node | undefined;\n\n /**\n * Creates the cached template root node on first use.\n */\n const create = (): Node => {\n // Regular HTML template\n const template = document.createElement('template');\n template.innerHTML = html;\n const firstChild = template.content.firstChild;\n if (!firstChild) {\n throw new Error('Invalid template: empty content');\n }\n return firstChild;\n };\n\n // return a factory function: create the template when first called, reuse the cached template when called later\n return () => (node || (node = create())).cloneNode(true);\n}\n\n/**\n * Create and mount an application with the specified component.\n *\n * This function initializes an application by mounting a root component\n * to a target DOM element. It handles target validation and cleanup.\n *\n * @param component - The root component function to mount.\n * @param target - CSS selector string or DOM element to mount to.\n * @returns Object with root component and unmount function.\n *\n * @example\n * ```typescript\n * const App = () => template('<div>Hello World</div>')\n * const app = createApp(App, '#root');\n *\n * // Or with DOM element\n * const container = document.getElementById('app');\n * const app = createApp(App, container);\n * ```\n */\nexport function createApp<P extends ComponentProps = {}>(\n component: ComponentFn<P>,\n target: string | Element,\n) {\n const container = isString(target) ? document.querySelector(target) : (target as Element);\n if (!container) {\n if (__DEV__) {\n warn(`Target element not found: ${target}`);\n }\n return;\n }\n\n const existingContent = container.innerHTML;\n if (existingContent) {\n if (__DEV__) {\n warn(`Target element is not empty, it will be cleared: ${target}`);\n }\n container.innerHTML = '';\n }\n\n const scope = createScope();\n let rootNode: Component | undefined;\n try {\n runWithScope(scope, () => {\n const mountedRoot = createComponent(component);\n if (isComponent(mountedRoot)) {\n rootNode = mountedRoot;\n insertNode(container, mountedRoot);\n }\n });\n } catch (error_) {\n disposeScope(scope);\n throw error_;\n }\n\n return {\n root: rootNode,\n unmount: () => {\n disposeScope(scope);\n rootNode?.destroy();\n },\n };\n}\n\nexport function hydrate<P extends ComponentProps = {}>(\n component: ComponentFn<P>,\n target: string | Element,\n) {\n const container = isString(target) ? document.querySelector(target) : (target as Element);\n if (!container) {\n if (__DEV__) {\n warn(`[essor] hydrate: target element not found: ${target}`);\n }\n return;\n }\n\n beginHydration(container);\n\n const scope = createScope();\n let rootNode: Component | undefined;\n try {\n runWithScope(scope, () => {\n const mountedRoot = createComponent(component);\n if (isComponent(mountedRoot)) {\n rootNode = mountedRoot;\n insert(container, mountedRoot);\n }\n });\n } catch (error_) {\n disposeScope(scope);\n throw error_;\n } finally {\n endHydration();\n }\n\n return {\n root: rootNode,\n unmount: () => {\n disposeScope(scope);\n rootNode?.destroy();\n },\n };\n}\n","import { error } from '@estjs/shared';\nimport { type Scope, getActiveScope } from './scope';\n\n/**\n * InjectionKey is a unique identifier for provided values.\n * Using Symbol ensures type safety and prevents key collisions.\n */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provide a value in the current scope.\n * The value can be injected by this scope or any descendant scope.\n *\n * @param key - The injection key.\n * @param value - The value to provide.\n * @returns {void}\n */\nexport function provide<T>(key: InjectionKey<T> | string | number, value: T): void {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) {\n error('provide() must be called within a scope');\n }\n return;\n }\n\n // Lazy initialize provides map\n if (!scope.provides) {\n scope.provides = new Map();\n }\n\n scope.provides.set(key, value);\n}\n\n/**\n * Inject a value from the scope hierarchy.\n * Traverses up the parent chain until finding a matching key.\n *\n * @param key - The injection key.\n * @param defaultValue - Default value if key is not found.\n * @returns The injected value or default value.\n */\nexport function inject<T>(key: InjectionKey<T> | string | number, defaultValue?: T): T {\n const scope = getActiveScope();\n\n if (!scope) {\n if (__DEV__) {\n error('inject() must be called within a scope');\n }\n return defaultValue as T;\n }\n\n // Traverse up the hierarchy\n let current: Scope | null = scope;\n while (current) {\n if (current.provides) {\n if (current.provides.has(key)) {\n return current.provides.get(key) as T;\n }\n }\n current = current.parent;\n }\n\n return defaultValue as T;\n}\n","import { isFunction, isString } from '@estjs/shared';\nimport { addEvent } from './operations/event';\nimport { getActiveScope, onCleanup } from './scope';\n\n/**\n * Retargets an event to a delegated host node.\n *\n * @param e - The event object.\n * @param value - The new target value.\n * @returns {void}\n */\nfunction reTargetEvent(e: Event, value: EventTarget): void {\n Object.defineProperty(e, 'target', {\n configurable: true,\n value,\n });\n}\n\n/**\n * Event handler for delegated events.\n *\n * @param e - The event object.\n */\nfunction eventHandler(e: Event): void {\n let node = e.target as any;\n const key = e.type;\n const oriTarget = e.target;\n const oriCurrentTarget = e.currentTarget;\n\n /**\n * Handle event on current node\n * @returns {boolean} Whether to continue propagation\n */\n const handleNode = (): boolean => {\n const handler = node[`_$${key}`];\n if (handler && isFunction(handler) && !node.disabled) {\n const data = node[`${key}Data`];\n data ? handler.call(node, data, e) : handler.call(node, e);\n if (e.cancelBubble) return false;\n }\n\n // Handle host element retargeting\n if (\n node.host &&\n !isString(node.host) &&\n !node.host._$host &&\n isFunction(node.contains) &&\n node.contains(e.target)\n ) {\n reTargetEvent(e, node.host);\n }\n return true;\n };\n\n /**\n * Walk up the DOM tree handling events\n */\n const walkUpTree = (): void => {\n while (handleNode() && (node = node._$host || node.parentNode || node.host));\n };\n\n // simulate currentTarget\n Object.defineProperty(e, 'currentTarget', {\n configurable: true,\n /**\n * Returns the current delegated target for the event.\n */\n get() {\n return node || document;\n },\n });\n\n if (e.composedPath) {\n const path = e.composedPath();\n reTargetEvent(e, path[0]);\n for (let i = 0; i < path.length - 2; i++) {\n node = path[i] as any;\n if (!handleNode()) break;\n if (node._$host) {\n node = node._$host;\n // bubble up from portal mount instead of composedPath\n walkUpTree();\n break;\n }\n if (node.parentNode === oriCurrentTarget) {\n break; // don't bubble above root of event delegation\n }\n }\n }\n // fallback for browsers that don't support composedPath\n else walkUpTree();\n // Mixing portals and shadow dom can lead to a nonstandard target, so reset here.\n reTargetEvent(e, oriTarget!);\n}\n\n/**\n * Symbol for storing delegated events on document\n */\nconst $EVENTS = Symbol('_$EVENTS');\n\n/**\n * Set up event delegation for specified event types.\n *\n * @param eventNames - Array of event names to delegate.\n * @param document - Document to attach events to (defaults to window.document).\n */\nexport function delegateEvents(eventNames: string[], document: Document = window.document): void {\n const docWithEvents = document as Document & { [$EVENTS]?: Set<string> };\n const eventSet = docWithEvents[$EVENTS] || (docWithEvents[$EVENTS] = new Set<string>());\n\n for (const name of eventNames) {\n if (!eventSet.has(name)) {\n eventSet.add(name);\n document.addEventListener(name, eventHandler);\n }\n }\n}\n\n/**\n * Clear all delegated events from document.\n *\n * @param document - Document to clear events from (defaults to window.document).\n */\nexport function clearDelegatedEvents(document: Document = window.document): void {\n const docWithEvents = document as Document & { [$EVENTS]?: Set<string> };\n const eventSet = docWithEvents[$EVENTS];\n if (eventSet) {\n for (const name of eventSet.keys()) {\n document.removeEventListener(name, eventHandler);\n }\n delete docWithEvents[$EVENTS];\n }\n}\n/**\n * Registers an event listener and scopes its cleanup when needed.\n *\n * @param element - The element to add the listener to.\n * @param event - The event name.\n * @param handler - The event handler.\n * @param options - Optional event listener options.\n * @returns {void}\n */\nexport function addEventListener(\n element: Element,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions,\n): void {\n const cleanup = addEvent(element, event, handler, options);\n\n if (getActiveScope()) {\n onCleanup(cleanup);\n }\n}\n","import { isFunction, isString } from '@estjs/shared';\nimport { effect } from '@estjs/signals';\nimport { addEventListener } from './events';\nimport { getActiveScope, onCleanup } from './scope';\n\n/**\n * Modifiers for `bind:*` two-way bindings.\n *\n * - `trim` — strip surrounding whitespace\n * - `number` — coerce numeric strings to numbers (no-op on NaN)\n * - `lazy` — commit on `change` instead of `input`\n */\nexport interface BindModifiers {\n trim?: boolean;\n number?: boolean;\n lazy?: boolean;\n [key: string]: boolean | undefined;\n}\n\n// ── Strategy ──\n\ninterface Strategy {\n /** DOM event that triggers a DOM→Model read. */\n event: string;\n /** Read the bound value from the DOM element. */\n read(el: Element): unknown;\n /** Write a model value into the DOM element. */\n write(el: Element, v: unknown): void;\n /** Always listen on `change` regardless of `lazy` (checkbox, radio, select, file). */\n forceChange?: true;\n /** Needs IME composition guard (text inputs, textareas). */\n ime?: true;\n}\n\n// ── Shared DOM Writer ──\n\n/**\n * Compare-then-assign for string-coercible `.value` properties.\n * Shared by text input, textarea, and single-select strategies.\n */\nfunction writeValue(el: Element, v: unknown): void {\n const target = el as HTMLInputElement;\n const next = v == null ? '' : String(v);\n if (target.value !== next) target.value = next;\n}\n\n// ── Strategies ──\n\nconst CHECKBOX: Strategy = {\n event: 'change',\n forceChange: true,\n read: (el) => (el as HTMLInputElement).checked,\n write(el, v) {\n const e = el as HTMLInputElement;\n const next = Boolean(v);\n if (e.checked !== next) e.checked = next;\n },\n};\n\nconst RADIO: Strategy = {\n event: 'change',\n forceChange: true,\n read(el) {\n const e = el as HTMLInputElement;\n return e.checked ? e.value : '';\n },\n write(el, v) {\n const e = el as HTMLInputElement;\n const next = String(v) === e.value;\n if (e.checked !== next) e.checked = next;\n },\n};\n\nconst FILE: Strategy = {\n event: 'change',\n forceChange: true,\n read: (el) => (el as HTMLInputElement).files,\n write() {}, // browsers forbid programmatic writes to file inputs\n};\n\nconst TEXT: Strategy = {\n event: 'input',\n ime: true,\n read: (el) => (el as HTMLInputElement).value,\n write: writeValue,\n};\n\nconst TEXTAREA: Strategy = {\n event: 'input',\n ime: true,\n read: (el) => (el as HTMLTextAreaElement).value,\n write: writeValue,\n};\n\nconst SELECT: Strategy = {\n event: 'change',\n forceChange: true,\n read(el) {\n const s = el as HTMLSelectElement;\n return s.multiple ? Array.from(s.selectedOptions, (o) => o.value) : s.value;\n },\n write(el, v) {\n const s = el as HTMLSelectElement;\n if (s.multiple) {\n const selected = new Set((Array.isArray(v) ? v : []).map(String));\n for (const opt of Array.from(s.options)) opt.selected = selected.has(opt.value);\n } else {\n writeValue(el, v);\n }\n },\n};\n\n// ── Resolution ──\n\nfunction resolve(node: Element, prop: string): Strategy {\n switch (node.nodeName) {\n case 'INPUT':\n if (prop === 'checked') return (node as HTMLInputElement).type === 'radio' ? RADIO : CHECKBOX;\n if (prop === 'files') return FILE;\n return TEXT;\n case 'SELECT':\n return SELECT;\n case 'TEXTAREA':\n return TEXTAREA;\n default:\n // Fallback for custom elements or contenteditable hosts\n return {\n event: 'input',\n read: (el) => (el as any)[prop],\n write(el, v) {\n (el as any)[prop] = v;\n },\n };\n }\n}\n\n// ── Modifier Transform ──\n\n/** Apply trim / number modifiers to a raw DOM value. No-op for non-strings. */\nfunction applyModifiers(v: unknown, trim: boolean, toNum: boolean): unknown {\n if (!isString(v)) return v;\n let s = v as string;\n if (trim) s = s.trim();\n if (toNum && s !== '') {\n const n = Number(s);\n if (!Number.isNaN(n)) return n;\n }\n return s;\n}\n\n// ── Focus Detection ──\n\n/** Whether `el` is the active element (Document / ShadowRoot aware). */\nfunction isFocused(el: Element): boolean {\n const root = el.getRootNode();\n return (root instanceof Document || root instanceof ShadowRoot) && root.activeElement === el;\n}\n\n// ── Public API ──\n\n/**\n * Creates a two-way binding between a DOM element property and a reactive model.\n *\n * - **Model → DOM** — a reactive `effect()` pushes model changes to the element.\n * - **DOM → Model** — an event listener reads user input and calls `setter`.\n *\n * @param node Target element. `null` is tolerated (no-op).\n * @param prop Bound property (`value` / `checked` / `files` / custom).\n * @param getter Reactive getter, or a static initial value.\n * @param setter Called with the (optionally transformed) DOM value on user input.\n * @param modifiers Optional `{ trim, number, lazy }`.\n */\nexport function bindElement(\n node: Element | null,\n prop: 'value' | 'checked' | 'files' | string,\n getter: (() => unknown) | unknown,\n setter: (v: unknown) => void,\n modifiers: BindModifiers = {},\n): void {\n if (!node) return;\n\n // ── 1. Resolve strategy & pre-compute flags ──\n\n const { event, read, write, forceChange, ime } = resolve(node, prop);\n\n const trim = modifiers.trim === true;\n const toNum = modifiers.number === true;\n const lazy = modifiers.lazy === true;\n const shouldCast = (trim || toNum) && prop !== 'files';\n\n // Resolve getter shape once — avoid per-read `isFunction` branching.\n const getModel = isFunction(getter) ? (getter as () => unknown) : () => getter;\n\n // Unified transform: identity when no modifiers apply.\n const cast = shouldCast ? (v: unknown) => applyModifiers(v, trim, toNum) : (v: unknown) => v;\n\n // ── 2. DOM → Model ──\n\n let composing = false;\n const eventName = lazy || forceChange ? 'change' : event;\n\n const syncToModel = (): void => {\n if (composing) return;\n const raw = read(node);\n if (raw === undefined) return;\n const next = cast(raw);\n if (!Object.is(getModel(), next)) setter(next);\n };\n\n addEventListener(node, eventName, syncToModel);\n\n // Normalize the displayed value on blur (trim whitespace, format number)\n // when modifiers are active and primary event is not already `change`.\n if (!lazy && shouldCast && eventName !== 'change') {\n addEventListener(node, 'change', () => write(node, cast(read(node))));\n }\n\n // ── 3. IME composition guard ──\n\n if (ime && !lazy) {\n addEventListener(node, 'compositionstart', () => {\n composing = true;\n });\n addEventListener(node, 'compositionend', () => {\n if (!composing) return;\n composing = false;\n syncToModel();\n });\n }\n\n // ── 4. Model → DOM ──\n\n const runner = effect(() => {\n const value = getModel();\n\n // Don't disturb focused text inputs or ongoing IME sessions.\n if (ime && !lazy && isFocused(node)) {\n if (composing) return;\n if (Object.is(cast(read(node)), value)) return;\n }\n\n write(node, value);\n });\n\n // ── 5. Lifecycle cleanup ──\n\n if (getActiveScope()) {\n onCleanup(() => runner.stop());\n }\n}\n","/**\n * Shallow compare two objects\n * @param {any} a - The first object to compare\n * @param {any} b - The second object to compare\n * @returns {boolean} - Returns true if the objects are equal, false otherwise\n */\nexport function shallowCompare(a: any, b: any): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n for (const key in a) {\n if (a[key] !== b[key]) return false;\n }\n\n for (const key in b) {\n if (!(key in a)) return false;\n }\n\n return true;\n}\n\n/**\n * Omits props from a target object using a proxy.\n *\n * @param target - The target object.\n * @param keys - The keys to omit.\n * @returns A proxy that omits specified keys.\n */\nexport function omitProps<T extends object, K extends keyof T>(target: T, keys: K[]): Omit<T, K> {\n const excludeSet = new Set(keys);\n\n return new Proxy(target, {\n /**\n * Returns a property unless it is excluded by the proxy.\n */\n get(obj, prop) {\n if (excludeSet.has(prop as K)) {\n return undefined;\n }\n return Reflect.get(obj, prop);\n },\n /**\n * Returns the enumerable keys that are not excluded from the proxy.\n */\n ownKeys(obj) {\n return Reflect.ownKeys(obj).filter((key) => !excludeSet.has(key as K));\n },\n /**\n * Returns the property descriptor unless the key is excluded.\n */\n getOwnPropertyDescriptor(obj, prop) {\n if (excludeSet.has(prop as K)) {\n return undefined;\n }\n return Reflect.getOwnPropertyDescriptor(obj, prop);\n },\n /**\n * Returns whether the requested value exists.\n */\n has(obj, prop) {\n if (excludeSet.has(prop as K)) {\n return false;\n }\n return Reflect.has(obj, prop);\n },\n });\n}\n","import { FRAGMENT_COMPONENT } from '../constants';\nimport type { AnyNode, ComponentProps } from '../types';\n\nexport interface FragmentProps extends ComponentProps {\n children?: AnyNode | AnyNode[];\n}\n\n/**\n * Fragment component - renders multiple children without wrapper elements (Client-side only).\n *\n * **Client-side behavior:**\n * - Returns children directly for rendering.\n * - Hydration system matches children using hydration keys.\n * - The template system handles array children automatically.\n *\n * @param props - Component props with children.\n * @returns {AnyNode} Children directly without wrapper.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Fragment>\n * <div>First</div>\n * <span>Second</span>\n * </Fragment>\n *\n * // Nested fragments\n * <Fragment>\n * <Fragment>\n * <div>Nested 1</div>\n * <div>Nested 2</div>\n * </Fragment>\n * <div>Third</div>\n * </Fragment>\n *\n * // Empty fragment (renders nothing)\n * <Fragment />\n * ```\n */\nexport function Fragment(props?: FragmentProps): AnyNode {\n // `<Fragment />` and `<Fragment>{null}</Fragment>` are legitimate:\n // they render nothing. Returning `null` here keeps the caller tree\n // valid and lets the template runtime drop the placeholder.\n if (!props || props.children == null) return null;\n\n // Client-side rendering: return children directly — the template\n // system handles arrays/signals/components on its own.\n return props.children as AnyNode;\n}\n\nFragment[FRAGMENT_COMPONENT] = true;\n\n/**\n * Check if a node is a Fragment component.\n *\n * @param node - Node to check.\n * @returns {boolean} True if node is a Fragment.\n */\nexport function isFragment(node: unknown): boolean {\n return !!node && !!node[FRAGMENT_COMPONENT];\n}\n","import { isFunction, isString, warn } from '@estjs/shared';\nimport { effect } from '@estjs/signals';\nimport { PORTAL_COMPONENT } from '../constants';\nimport { consumeTeleportAnchor, consumeTeleportBlock, isHydrating } from '../hydration';\nimport { onMount } from '../lifecycle';\nimport {\n type Scope,\n createScope,\n disposeScope,\n getActiveScope,\n onCleanup,\n runWithScope,\n} from '../scope';\nimport { insert } from '../dom';\nimport type { AnyNode } from '../types';\n\nexport interface PortalProps {\n /** Children to render at the target location. */\n children?: AnyNode | AnyNode[];\n /**\n * Mount target — CSS selector string, `Element`, or reactive getter.\n * When the getter result changes, the Portal re-mounts at the new target.\n */\n target?: string | Element | (() => string | Element | null | undefined);\n /**\n * When truthy, children render inline at the call site instead of being teleported.\n * May be a static value or a reactive getter.\n */\n disabled?: boolean | (() => boolean);\n}\n\n/** Resolve `props.target` to an Element, handling string / Element / getter. */\nfunction resolveTarget(props: PortalProps): Element | null {\n const raw = isFunction(props.target) ? (props.target as () => unknown)() : props.target;\n if (raw == null) return null;\n if (isString(raw)) return document.querySelector(raw as string);\n return raw as Element;\n}\n\n/** Evaluate `props.disabled`, supporting both static booleans and getters. */\nfunction evalDisabled(props: PortalProps): boolean {\n return isFunction(props.disabled) ? !!(props.disabled as () => boolean)() : !!props.disabled;\n}\n\n/**\n * Portal — teleports children into a different DOM node.\n *\n * - `disabled=true` renders children inline at the call site.\n * - Otherwise children are teleported into `target`.\n * - Both `target` and `disabled` may be reactive; changes trigger re-mount.\n *\n * @returns A placeholder comment node that marks the call site.\n *\n * @example\n * ```tsx\n * <Portal target=\"#modal-root\" disabled={isMobile}>\n * <div>Modal content</div>\n * </Portal>\n * ```\n */\nexport function Portal(props: PortalProps): Comment {\n // Hydration: adopt SSR-emitted anchors + target block.\n if (isHydrating()) {\n const adopted = tryHydratePortal(props);\n if (adopted) return adopted;\n }\n\n const placeholder = document.createComment('portal');\n placeholder[PORTAL_COMPONENT] = true;\n\n const { children } = props;\n if (children == null) return placeholder;\n\n const parentScope = getActiveScope();\n let innerScope: Scope | null = null;\n\n /**\n * Mount children into the given parent, inside a fresh inner scope\n * that inherits from the parent scope. This allows `insert()` effects\n * to be properly disposed on teardown.\n */\n const mountAt = (parent: Node, before?: Node): void => {\n innerScope = createScope(parentScope);\n runWithScope(innerScope, () => {\n insert(parent, () => children, before);\n });\n };\n\n /**\n * Tear down the inner scope, removing all mounted children and their\n * reactive effects.\n */\n const teardown = (): void => {\n if (innerScope) {\n disposeScope(innerScope);\n innerScope = null;\n }\n };\n\n /**\n * Evaluate disabled/target and (re-)mount, tearing down the previous\n * mount first. Accepts pre-evaluated values to avoid redundant getter\n * invocations when called from within the tracking effect.\n */\n const apply = (disabled: boolean, target: Element | null): void => {\n teardown();\n\n if (disabled) {\n const parent = placeholder.parentNode;\n if (!parent) return;\n mountAt(parent, placeholder);\n return;\n }\n\n if (!target) {\n if (__DEV__) {\n warn(`[Portal] Target element not found: ${String(props.target)}`);\n }\n return;\n }\n mountAt(target);\n };\n\n // Track reactive deps immediately but defer DOM work until placeholder\n // is attached. On subsequent runs (reactive change) the effect runs\n // apply() directly with the freshly evaluated values — no redundant\n // double-evaluation.\n let mounted = false;\n\n const effectRunner = effect(() => {\n const disabled = evalDisabled(props);\n const target = disabled ? null : resolveTarget(props);\n\n if (mounted) {\n apply(disabled, target);\n }\n });\n\n onMount(() => {\n mounted = true;\n\n const disabled = evalDisabled(props);\n const target = disabled ? null : resolveTarget(props);\n\n // Try mounting synchronously — works when target is already in the document.\n if (disabled || target) {\n apply(disabled, target);\n return;\n }\n\n // Target may not be in the document yet (sibling elements mount bottom-up).\n // Defer to microtask — flushes before paint.\n queueMicrotask(() => {\n if (!placeholder.parentNode) return;\n apply(evalDisabled(props), resolveTarget(props));\n });\n });\n\n onCleanup(() => {\n effectRunner.stop();\n teardown();\n });\n\n return placeholder;\n}\n\nPortal[PORTAL_COMPONENT] = true;\n\n/**\n * Hydration adoption for Portal.\n *\n * Returns the SSR call-site anchor as placeholder on match, `null` on mismatch\n * (falls back to CSR mount path).\n */\nfunction tryHydratePortal(props: PortalProps): Comment | null {\n if (evalDisabled(props)) return null;\n\n const anchor = consumeTeleportAnchor();\n if (!anchor) {\n if (__DEV__) {\n warn('[Portal] hydration mismatch: no <!--teleport-anchor--> at call site.');\n }\n return null;\n }\n\n const target = resolveTarget(props);\n if (!target) {\n if (__DEV__) {\n warn(`[Portal] hydration mismatch: target not found: ${String(props.target)}`);\n }\n return null;\n }\n\n const block = consumeTeleportBlock(target);\n if (!block) {\n if (__DEV__) {\n warn(\n `[Portal] hydration mismatch: no <!--teleport-start--> in target ${String(props.target)}`,\n );\n }\n return null;\n }\n\n anchor[PORTAL_COMPONENT] = true;\n return anchor;\n}\n\n/**\n * Check if a node is a Portal component.\n *\n * @param node - Node to check.\n * @returns True if node is a Portal.\n */\nexport function isPortal(node: unknown): boolean {\n return !!node && !!node[PORTAL_COMPONENT];\n}\n","import { isArray, isBrowser, isFunction, isPromise, warn } from '@estjs/shared';\nimport { isComputed, isSignal } from '@estjs/signals';\nimport { insertNode, normalizeNode } from '../dom';\nimport { provide } from '../provide';\nimport { onDestroy } from '../lifecycle';\nimport { SUSPENSE_COMPONENT } from '../constants';\nimport type { AnyNode } from '../types';\n\n/** Clear all children from an element */\nfunction clearContainer(el: HTMLElement): void {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n}\nexport function resolveNodeValue(value: unknown): unknown {\n let current = value;\n\n while (isFunction(current)) {\n current = (current as Function)();\n }\n\n if (isSignal(current) || isComputed(current)) {\n return resolveNodeValue((current as any).value);\n }\n\n return current;\n}\nexport interface SuspenseProps {\n /** The content to render. Can be a Promise for async loading. */\n children?: Node | Node[] | Promise<Node | Node[]>;\n /** Fallback content to display while children is loading (Promise pending). */\n fallback?: Node;\n /** Optional key for reconciliation. */\n key?: string;\n}\n\nexport const SuspenseContext = Symbol('SuspenseContext');\n\nexport interface SuspenseContextType {\n register: (promise: Promise<any>) => void;\n increment: () => void;\n decrement: () => void;\n}\n\n/**\n * Suspense component - handles async content with a fallback UI.\n *\n * @param props - Component props with children, fallback, and optional key.\n * @returns {AnyNode} Placeholder node or fallback content.\n *\n * @example\n * ```tsx\n * <Suspense fallback={<div>Loading...</div>}>\n * {asyncContent}\n * </Suspense>\n * ```\n */\nexport function Suspense(props: SuspenseProps): Node {\n // Check if we're in SSR mode (no DOM globals)\n if (!isBrowser()) {\n // In SSR, keep structure deterministic and never touch DOM APIs.\n // Suspense boundary renders fallback while async resources are unresolved.\n return props.fallback ?? ('' as unknown as Node);\n }\n // Create a container to manage content swapping\n const container = document.createElement('div');\n container.style.display = 'contents'; // Invisible wrapper\n\n // Track if component is still mounted (for async cleanup)\n let isMounted = true;\n let pendingCount = 0;\n let isShowingFallback = false;\n\n let resolvedChildren: AnyNode | AnyNode[] | null = null;\n\n /**\n * Materializes child.\n */\n const materializeChild = (value: AnyNode): AnyNode => {\n const current = resolveNodeValue(value);\n\n if (isArray(current)) {\n const nodes: AnyNode[] = [];\n for (const item of current as AnyNode[]) {\n const materialized = materializeChild(item);\n if (isArray(materialized)) {\n nodes.push(...(materialized as AnyNode[]));\n } else {\n nodes.push(materialized);\n }\n }\n return nodes as AnyNode;\n }\n\n return normalizeNode(current);\n };\n\n /**\n * Inserts a materialized child or child list into the container.\n */\n const insertMaterializedChild = (value: AnyNode) => {\n const normalized = materializeChild(value);\n const nodes = isArray(normalized) ? normalized : [normalized];\n\n for (const node of nodes) {\n if (node != null) {\n insertNode(container, node);\n }\n }\n };\n\n /**\n * Renders fallback content.\n */\n const renderFallbackContent = () => {\n clearContainer(container);\n\n if (props.fallback != null) {\n insertMaterializedChild(props.fallback);\n }\n };\n\n /**\n * Switches the boundary into its fallback view.\n */\n const showFallback = () => {\n if (isShowingFallback) return;\n isShowingFallback = true;\n renderFallbackContent();\n };\n\n /**\n * Restores the resolved children when the boundary can leave fallback mode.\n */\n const showChildren = () => {\n if (!isShowingFallback) return;\n\n // Check if we have something to show\n const hasContent = resolvedChildren || (props.children != null && !isPromise(props.children));\n\n if (!hasContent) {\n return;\n }\n\n isShowingFallback = false;\n\n clearContainer(container);\n\n if (resolvedChildren) {\n renderChildren(resolvedChildren);\n } else if (props.children != null && !isPromise(props.children)) {\n renderChildren(props.children);\n }\n };\n\n /**\n * Render children into the container.\n *\n * @param children - The children to render.\n * @returns {void}\n */\n const renderChildren = (children: AnyNode | AnyNode[]): void => {\n // Guard: don't render children if we should be showing fallback\n if (isShowingFallback) return;\n\n clearContainer(container);\n\n if (children == null) return;\n\n const childArray = isArray(children) ? children : [children];\n for (const child of childArray) {\n if (child != null) {\n insertMaterializedChild(child);\n }\n }\n\n // Resource registration may flip to fallback while children are mounting.\n if (isShowingFallback) {\n renderFallbackContent();\n }\n };\n\n // Context for resources to register themselves\n const suspenseContext: SuspenseContextType = {\n register: (promise: Promise<any>) => {\n pendingCount++;\n showFallback();\n\n promise\n .then(() => {\n if (!isMounted) return;\n pendingCount--;\n if (pendingCount === 0) {\n showChildren();\n }\n })\n .catch((error) => {\n if (__DEV__) {\n warn('[Suspense] Resource failed:', error);\n }\n if (!isMounted) return;\n pendingCount--;\n // For now, if error happens, we still try to show children (or maybe error boundary later)\n if (pendingCount === 0) {\n showChildren();\n }\n });\n },\n increment: () => {\n pendingCount++;\n showFallback();\n },\n decrement: () => {\n pendingCount = Math.max(0, pendingCount - 1);\n if (pendingCount === 0) {\n showChildren();\n }\n },\n };\n\n provide(SuspenseContext, suspenseContext);\n\n const children = props.children;\n\n // Initial render logic\n if (isPromise(children)) {\n // Async children - show fallback immediately, then resolve\n children\n .then((resolved) => {\n resolvedChildren = resolved;\n })\n .catch(() => {\n // Ignore error, handled by register\n });\n suspenseContext.register(children);\n } else if (children != null) {\n // Sync children - render immediately\n // If any child is a resource read, it will call register() synchronously during this render\n renderChildren(children);\n } else {\n // No children - show fallback if available\n showFallback();\n }\n\n onDestroy(() => {\n isMounted = false;\n pendingCount = 0;\n resolvedChildren = null;\n clearContainer(container);\n container.remove();\n });\n\n return container;\n}\n\nSuspense[SUSPENSE_COMPONENT] = true;\n\n/**\n * Check if a node is a Suspense component.\n *\n * @param node - Node to check.\n * @returns {boolean} True if node is a Suspense.\n */\nexport function isSuspense(node: unknown): boolean {\n return !!node && !!node[SUSPENSE_COMPONENT];\n}\n","import { type Signal, signal } from '@estjs/signals';\nimport { inject } from '../provide';\nimport { SuspenseContext } from './Suspense';\n\nexport type ResourceState = 'pending' | 'ready' | 'errored';\n\nexport interface Resource<T> {\n (): T | undefined;\n loading: Signal<boolean>;\n error: Signal<Error | null>;\n state: Signal<ResourceState>;\n}\n\nexport interface ResourceActions<T> {\n mutate: (value: T) => void;\n refetch: () => Promise<void>;\n}\n\nexport interface ResourceOptions<T> {\n initialValue?: T;\n}\n\n/**\n * Create a resource for async data fetching.\n * Inspired by SolidJS createResource.\n *\n * @param fetcher - Function that returns a Promise with the data.\n * @param options - Optional configuration.\n * @returns {[Resource<T>, ResourceActions<T>]} Tuple of [resource, actions].\n */\nexport function createResource<T>(\n fetcher: () => Promise<T>,\n options?: ResourceOptions<T>,\n): [Resource<T>, ResourceActions<T>] {\n // Internal state\n const value = signal<T | undefined>(options?.initialValue);\n const loading = signal<boolean>(true);\n const error = signal<Error | null>(null);\n const state = signal<ResourceState>('pending');\n\n let fetchId = 0;\n\n let currentPromise: Promise<void> | null = null;\n let suspenseRegistered = false;\n const suspenseContext = inject<any>(SuspenseContext, null);\n\n /**\n * Fetch function.\n */\n const fetch = async (): Promise<void> => {\n const currentFetchId = ++fetchId;\n loading.value = true;\n state.value = 'pending';\n error.value = null;\n suspenseRegistered = false;\n if (suspenseContext) {\n // Track pending fetches even when callers branch on loading/state before reading the resource.\n suspenseContext.increment();\n }\n\n try {\n const promise = fetcher();\n currentPromise = promise as any; // Track original promise for Suspense\n promise.catch(() => {}); // Prevent unhandled rejection\n const result = await promise;\n\n // Only update if this is still the latest fetch\n if (currentFetchId === fetchId) {\n value.value = result;\n state.value = 'ready';\n loading.value = false;\n }\n } catch (error_) {\n // Only update if this is still the latest fetch\n if (currentFetchId === fetchId) {\n error.value = error_ instanceof Error ? error_ : new Error(String(error_));\n state.value = 'errored';\n loading.value = false;\n }\n } finally {\n if (suspenseContext) {\n suspenseContext.decrement();\n }\n }\n };\n\n // Start initial fetch\n fetch();\n\n // Resource accessor function\n const resource = (() => {\n // Register with Suspense only once per fetch cycle\n if (!suspenseRegistered && loading.value && currentPromise && suspenseContext) {\n suspenseRegistered = true;\n // @ts-ignore\n suspenseContext.register(currentPromise);\n }\n return value.value;\n }) as Resource<T>;\n resource.loading = loading;\n resource.error = error;\n resource.state = state;\n\n // Actions\n const actions: ResourceActions<T> = {\n mutate: (newValue: T) => {\n value.value = newValue;\n state.value = 'ready';\n loading.value = false;\n error.value = null;\n },\n refetch: async () => {\n await fetch();\n },\n };\n\n return [resource, actions];\n}\n","import { isFunction } from '@estjs/shared';\nimport { inject } from '../provide';\nimport { onDestroy } from '../lifecycle';\nimport { onCleanup } from '../scope';\nimport { Component } from '../component';\nimport { SuspenseContext, type SuspenseContextType } from './Suspense';\nimport type { AnyNode, ComponentFn, ComponentProps } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AsyncComponentOptions {\n /**\n * Component to render while the async component is loading.\n * Only shown after `delay` ms has elapsed (prevents flash of loading state).\n */\n loading?: ComponentFn;\n\n /**\n * Component to render when the async component fails to load.\n * Receives `{ error, retry }` as props.\n */\n error?: ComponentFn<{ error: Error; retry: () => void }>;\n\n /**\n * Delay in ms before showing the `loading` component (default: 200).\n */\n delay?: number;\n\n /**\n * Timeout in ms. If loading exceeds this, the error component is shown.\n */\n timeout?: number;\n\n /**\n * SSR rendering strategy (default: `'blocking'`).\n *\n * - `'blocking'` — Pre-calls the loader at definition time. If the module\n * resolves before the component body runs (e.g. pre-loaded via\n * `renderToStringAsync`), the real component is inlined in the HTML.\n * - `'client-only'` — Renders `null` on the server; loads only in browser.\n */\n ssr?: 'blocking' | 'client-only';\n\n /**\n * Called when loading fails. Useful for logging or error tracking.\n */\n onError?: (error: Error, retry: () => void) => void;\n}\n\ntype LoaderResult<P> = { default: ComponentFn<P> } | ComponentFn<P>;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Resolves the default export from a module.\n *\n * @param mod - The module result to resolve.\n * @returns {ComponentFn<P>} The resolved component function.\n */\nfunction resolveModule<P>(mod: LoaderResult<P>): ComponentFn<P> {\n return isFunction(mod) ? (mod as ComponentFn<P>) : (mod as { default: ComponentFn<P> }).default;\n}\n\n/**\n * Mount a ComponentFn into a container element, returning the Component instance.\n *\n * @param el - The element to render into.\n * @param fn - The component function.\n * @param props - The component props.\n * @returns The component instance.\n */\nfunction renderInto<P extends ComponentProps>(\n el: HTMLElement,\n fn: ComponentFn<P>,\n props?: P,\n): Component<P> {\n const comp = new Component(fn, props);\n comp.mount(el);\n return comp;\n}\n\n// ============================================================================\n// defineAsyncComponent\n// ============================================================================\n\n/**\n * Define an async (lazy-loaded) component.\n *\n * Compatible with client, SSR, and SSG. Integrates with `<Suspense>` via\n * `SuspenseContext` when rendered inside a Suspense boundary.\n *\n *\n * @param loader - The async loader function.\n * @param options - Configuration options.\n * @returns {ComponentFn<P>} The async component wrapper function.\n *\n * @example\n * ```tsx\n * // Simple\n * const Chart = defineAsyncComponent(() => import('./Chart'));\n *\n * // With options\n * const Chart = defineAsyncComponent(\n * () => import('./Chart'),\n * {\n * loading: () => <Spinner />,\n * error: ({ error, retry }) => (\n * <div>\n * <p>{error.message}</p>\n * <button onClick={retry}>Retry</button>\n * </div>\n * ),\n * delay: 200,\n * timeout: 10_000,\n * }\n * );\n *\n * // Works standalone or inside Suspense\n * function App() {\n * return (\n * <Suspense fallback={<div>Loading…</div>}>\n * <Chart data={data} />\n * </Suspense>\n * );\n * }\n * ```\n */\nexport function defineAsyncComponent<P extends ComponentProps = ComponentProps>(\n loader: () => Promise<LoaderResult<P>>,\n options: AsyncComponentOptions = {},\n): ComponentFn<P> {\n const { delay = 200, timeout, ssr = 'blocking', onError } = options;\n\n // ── Server-side rendering ─────────────────────────────────────────────────\n if (typeof window === 'undefined') {\n if (ssr === 'client-only') {\n /**\n * Returns the async component placeholder output.\n */\n const placeholder: ComponentFn<P> = () => '' as unknown as AnyNode;\n (placeholder as any).__asyncLoader = loader;\n (placeholder as any).__asyncResolved = () => null;\n return placeholder;\n }\n\n // 'blocking': pre-call the loader so that if the module is already cached\n // the component is available synchronously when the component body runs.\n let ssrResolved: ComponentFn<P> | null = null;\n let ssrPromise: Promise<void> | null = null;\n\n /**\n * SSR loader matches the client-side signature `() => Promise<void>`\n * so external consumers can treat `__asyncLoader` uniformly across\n * environments.\n */\n const ssrLoad = (): Promise<void> => {\n if (ssrPromise) return ssrPromise;\n ssrPromise = loader()\n .then((mod) => {\n ssrResolved = resolveModule(mod);\n })\n .catch(() => {});\n return ssrPromise;\n };\n\n // Kick off loading eagerly so that pre-resolved modules are inlined.\n ssrLoad();\n\n /**\n * Renders the server-side async wrapper.\n */\n const ssrWrapper: ComponentFn<P> = (props: P) => {\n if (ssrResolved) {\n return ssrResolved(props);\n }\n\n return '' as unknown as AnyNode;\n };\n\n (ssrWrapper as any).__asyncLoader = ssrLoad;\n (ssrWrapper as any).__asyncResolved = () => ssrResolved;\n\n return ssrWrapper;\n }\n\n // ── Client-side ──────────────────────────────────────────────────────────\n //\n // Module-level cache: all instances share one loader invocation.\n\n let cachedComponent: ComponentFn<P> | null = null;\n let cachedError: Error | null = null;\n type CacheStatus = 'pending' | 'resolved' | 'errored';\n let cachedStatus: CacheStatus = 'pending';\n let loadPromise: Promise<void> | null = null;\n\n /**\n * Loads the requested resource.\n */\n function load(): Promise<void> {\n if (loadPromise) return loadPromise;\n\n loadPromise = loader()\n .then((mod) => {\n cachedComponent = resolveModule(mod);\n cachedStatus = 'resolved';\n })\n .catch((error) => {\n cachedError = error instanceof Error ? error : new Error(String(error));\n cachedStatus = 'errored';\n loadPromise = null; // allow retry\n });\n\n return loadPromise;\n }\n\n // Kick off loading eagerly\n load();\n\n // ── Wrapper component ────────────────────────────────────────────────────\n //\n // Mirrors the Suspense pattern: return a plain DOM element (display:contents)\n // and perform imperative DOM swaps when async state changes.\n // This avoids issues with the Component class calling the inner render\n // function immediately instead of tracking it reactively.\n\n /**\n * Renders the async component wrapper.\n */\n function AsyncWrapper(props: P): AnyNode {\n // Fast path: already resolved\n if (cachedStatus === 'resolved' && cachedComponent) {\n const el = document.createElement('div');\n el.style.display = 'contents';\n const comp = renderInto(el, cachedComponent, props);\n onCleanup(() => comp.destroy());\n return el;\n }\n\n // Fast path: already errored\n if (cachedStatus === 'errored' && cachedError) {\n const el = document.createElement('div');\n el.style.display = 'contents';\n if (options.error) {\n let alive = true;\n let currentComp: Component | null = null;\n\n const swap = (fn: ComponentFn<any>, swapProps?: any) => {\n if (!alive) return;\n currentComp?.destroy();\n currentComp = renderInto(el, fn, swapProps);\n };\n\n const retry = () => {\n loadPromise = null;\n cachedStatus = 'pending';\n cachedError = null;\n if (options.loading) swap(options.loading);\n load().then(() => {\n if (!alive) return;\n if (cachedStatus === 'resolved' && cachedComponent) {\n swap(cachedComponent, props);\n } else if (cachedStatus === 'errored' && cachedError) {\n if (options.error) swap(options.error, { error: cachedError!, retry });\n }\n });\n };\n\n swap(options.error, { error: cachedError, retry });\n\n onDestroy(() => {\n alive = false;\n currentComp?.destroy();\n currentComp = null;\n });\n }\n return el;\n }\n\n // ─ Pending state ──────────────────────────────────────────────────────\n const container = document.createElement('div');\n container.style.display = 'contents';\n\n let alive = true;\n let currentComp: Component | null = null;\n let delayTimer: ReturnType<typeof setTimeout> | null = null;\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Swaps the current rendered component.\n */\n const swap = (fn: ComponentFn<any>, swapProps?: any) => {\n if (!alive) return;\n currentComp?.destroy();\n currentComp = renderInto(container, fn, swapProps);\n };\n\n /**\n * Creates a retry handler for the current props.\n */\n const retryWith =\n (retryProps: P): (() => void) =>\n () => {\n loadPromise = null;\n cachedStatus = 'pending';\n cachedError = null;\n if (options.loading) swap(options.loading);\n load().then(() => {\n if (cachedStatus === 'resolved' && cachedComponent) {\n swap(cachedComponent, retryProps);\n } else if (cachedStatus === 'errored' && cachedError) {\n if (options.error) {\n swap(options.error, {\n error: cachedError,\n retry: retryWith(retryProps),\n });\n }\n }\n });\n };\n\n onDestroy(() => {\n alive = false;\n currentComp?.destroy();\n currentComp = null;\n if (delayTimer != null) clearTimeout(delayTimer);\n if (timeoutTimer != null) clearTimeout(timeoutTimer);\n });\n\n // Inject Suspense context (undefined when not inside a Suspense boundary)\n const suspenseCtx = inject<SuspenseContextType>(SuspenseContext) ?? null;\n\n /**\n * Displays the resolved component.\n */\n const showResolved = (compFn: ComponentFn<P>) => swap(compFn, props);\n\n /**\n * Displays the error state.\n */\n const showError = (err: Error) => {\n if (options.error) swap(options.error, { error: err, retry: retryWith(props) });\n };\n\n /**\n * Displays the loading state.\n */\n const showLoading = () => {\n if (options.loading) swap(options.loading);\n };\n\n const instancePromise = load().then(() => {\n if (!alive) return;\n if (cachedStatus === 'resolved' && cachedComponent) {\n showResolved(cachedComponent);\n } else if (cachedStatus === 'errored' && cachedError) {\n showError(cachedError);\n if (onError) onError(cachedError, retryWith(props));\n }\n if (delayTimer != null) clearTimeout(delayTimer);\n if (timeoutTimer != null) clearTimeout(timeoutTimer);\n });\n\n // Notify Suspense boundary about this pending async work\n if (suspenseCtx) {\n suspenseCtx.register(instancePromise);\n }\n\n // Delay before showing loading indicator\n if (delay > 0) {\n delayTimer = setTimeout(() => {\n if (alive && cachedStatus === 'pending') {\n showLoading();\n }\n }, delay);\n } else if (options.loading) {\n showLoading();\n }\n\n // Optional timeout\n if (timeout != null) {\n timeoutTimer = setTimeout(() => {\n if (alive && cachedStatus === 'pending') {\n const err = new Error(`[defineAsyncComponent] Timeout after ${timeout}ms`);\n cachedError = err;\n cachedStatus = 'errored';\n showError(err);\n if (onError) onError(err, retryWith(props));\n }\n }, timeout);\n }\n\n return container;\n }\n\n (AsyncWrapper as any).__asyncLoader = load;\n (AsyncWrapper as any).__asyncResolved = () => cachedComponent;\n\n return AsyncWrapper;\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Returns true if a function was created by `defineAsyncComponent`.\n *\n * @param fn - The function to check.\n * @returns {boolean} True if it is an async component.\n */\nexport function isAsyncComponent(fn: unknown): boolean {\n return isFunction(fn) && !!(fn as any).__asyncLoader;\n}\n","import { type Signal, effect, isSignal } from '@estjs/signals';\nimport { isFunction } from '@estjs/shared';\nimport {\n type Scope,\n createScope,\n disposeScope,\n getActiveScope,\n onCleanup,\n runWithScope,\n} from '../scope';\nimport { FOR_COMPONENT } from '../constants';\nimport { normalizeNode } from '../dom';\nimport { getSequence } from '../reconcile';\nimport type { AnyNode } from '../types';\n\nexport interface ForProps<T> {\n each: T[] | Signal<T[]> | (() => T[]);\n children: (item: T, index: number) => AnyNode;\n key?: (item: T) => unknown;\n fallback?: () => AnyNode;\n}\n\ninterface ItemEntry {\n key: unknown;\n item: unknown;\n nodes: Node[];\n scope: Scope; // Track scope for cleanup\n}\n\n/**\n * Optimized For Component\n * - Uses createDetachedScope to avoid parent.children Set overhead (SolidJS style)\n * - Uses DocumentFragment batching for mass creation\n * - Inlines scope switching for performance\n */\nexport function For<T>(props: ForProps<T>): Node {\n const fragment = document.createDocumentFragment();\n const marker = document.createComment('');\n fragment.appendChild(marker);\n\n let entries: ItemEntry[] = [];\n let fallbackNodes: Node[] = [];\n\n const keyFn = props.key;\n const renderFn = props.children;\n\n const getList = (): T[] => {\n const input = props.each;\n if (isSignal(input)) return (input as Signal<T[]>).value ?? [];\n if (isFunction(input)) return (input as () => T[])() ?? [];\n return (input as T[]) ?? [];\n };\n\n const getKey = (item: T): unknown => (keyFn ? keyFn(item) : item);\n\n const normalizeNodes = (value: AnyNode): Node[] => {\n if (Array.isArray(value)) {\n const nodes: Node[] = [];\n for (const item of value) {\n nodes.push(...normalizeNodes(item as AnyNode));\n }\n return nodes;\n }\n return [normalizeNode(value)];\n };\n\n const mountValue = (value: AnyNode, parent: Node, before: Node | null): Node[] => {\n const nodes = normalizeNodes(value);\n for (const node of nodes) {\n if (before) {\n parent.insertBefore(node, before);\n } else {\n parent.appendChild(node);\n }\n }\n return nodes;\n };\n\n const mountFallback = (parent: Node, before: Node | null) => {\n if (!props.fallback) return;\n const nodes = mountValue(props.fallback(), parent, before);\n fallbackNodes = nodes;\n };\n\n const clearFallback = () => {\n for (const node of fallbackNodes) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n fallbackNodes = [];\n };\n\n /**\n * Render item with detached scope.\n */\n const renderItem = (item: T, index: number, parent: Node, before: Node | null): ItemEntry => {\n const parentScope = getActiveScope();\n const scope = createScope(parentScope);\n let mountedNodes: Node[] = [];\n runWithScope(scope, () => {\n mountedNodes = mountValue(renderFn(item, index), parent, before);\n });\n\n return { key: getKey(item), item, nodes: mountedNodes, scope };\n };\n\n const disposeItem = (entry: ItemEntry) => {\n disposeScope(entry.scope);\n for (const node of entry.nodes) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n };\n\n const effectRunner = effect(() => {\n const newItems = getList();\n\n const parent = marker.parentNode;\n\n // Initial mount (parent is null because fragment is not attached yet)\n if (!parent) {\n if (newItems.length === 0) {\n mountFallback(fragment, marker);\n } else {\n entries = new Array(newItems.length);\n let idx = 0;\n for (const newItem of newItems) {\n entries[idx] = renderItem(newItem, idx, fragment, marker);\n idx++;\n }\n }\n // Skip reconcile on initial mount — entries are already created\n return;\n }\n\n // Before the fragment is attached, `marker.parentNode` is the fragment\n // itself; afterwards it is the real host (e.g. the container the user\n // mounted into). All reconciliation must target the live parent, or\n // `insertBefore(node, marker)` throws NotFoundError because `marker`\n // already moved out of the fragment on the first flush.\n reconcile(parent, newItems);\n });\n\n /**\n * Reconciles the rendered entries against the latest item list.\n *\n * @param parent - The parent node.\n * @param newItems - The new items list.\n * @returns {void}\n */\n function reconcile(parent: Node, newItems: T[]): void {\n const oldLen = entries.length;\n const newLen = newItems.length;\n\n // ===== FAST PATH 1: Clear all =====\n if (newLen === 0) {\n for (let i = 0; i < oldLen; i++) {\n disposeItem(entries[i]);\n }\n entries = [];\n\n if (props.fallback && fallbackNodes.length === 0) {\n mountFallback(parent, marker);\n }\n return;\n }\n\n // ===== FAST PATH 2: Create all (from empty/fallback) =====\n if (oldLen === 0 || fallbackNodes.length > 0) {\n if (fallbackNodes.length > 0) {\n clearFallback();\n }\n\n entries = new Array(newLen);\n\n // Batch creation in fragment\n const batchFragment = document.createDocumentFragment();\n\n for (let i = 0; i < newLen; i++) {\n // Render to batchFragment, append to end (before=null)\n entries[i] = renderItem(newItems[i], i, batchFragment, null);\n }\n\n parent.insertBefore(batchFragment, marker);\n return;\n }\n\n // ===== Keyed reconciliation =====\n //\n // Each `oldKeyMap` value preserves the entry together with its original\n // index. The index is the fuel for the LIS-based move minimisation\n // further down: by mapping each new position to an old position we can\n // find the longest slice that is already in order and leave it alone.\n const oldKeyMap = new Map<unknown, Array<[ItemEntry, number]>>();\n for (let i = 0; i < oldLen; i++) {\n const entry = entries[i];\n const list = oldKeyMap.get(entry.key);\n const pair: [ItemEntry, number] = [entry, i];\n if (list) list.push(pair);\n else oldKeyMap.set(entry.key, [pair]);\n }\n\n const newEntries: ItemEntry[] = new Array(newLen);\n const toRemove: ItemEntry[] = [];\n\n // Batch new nodes in a fragment so multiple creations turn into a\n // single native DOM insertion. Created lazily — only when a fresh\n // item is actually rendered so we avoid the allocation when every\n // entry is reused.\n let batchFragment: DocumentFragment | null = null;\n\n // `newIndexToOldIndex[i] === 0` → newEntries[i] is freshly created.\n // `newIndexToOldIndex[i] === k + 1` → reused from `entries[k]`.\n const newIndexToOldIndex = new Int32Array(newLen);\n let moved = false;\n let maxOldSeen = 0;\n\n // Pre-compute keys for all new items to avoid redundant getKey calls\n const newKeys = new Array<unknown>(newLen);\n for (let i = 0; i < newLen; i++) {\n newKeys[i] = getKey(newItems[i]);\n }\n\n for (let i = 0; i < newLen; i++) {\n const item = newItems[i];\n const key = newKeys[i];\n const oldList = oldKeyMap.get(key);\n\n if (oldList && oldList.length > 0) {\n const [reused, oldIndex] = oldList.shift()!;\n if (Object.is(reused.item, item)) {\n reused.item = item;\n newEntries[i] = reused;\n newIndexToOldIndex[i] = oldIndex + 1;\n if (oldIndex < maxOldSeen) moved = true;\n else maxOldSeen = oldIndex;\n } else {\n if (!batchFragment) batchFragment = document.createDocumentFragment();\n disposeItem(reused);\n newEntries[i] = renderItem(item, i, batchFragment, null);\n }\n } else {\n if (!batchFragment) batchFragment = document.createDocumentFragment();\n newEntries[i] = renderItem(item, i, batchFragment, null);\n // newIndexToOldIndex[i] remains 0 (fresh entry).\n }\n }\n\n for (const list of oldKeyMap.values()) {\n for (const [entry] of list) toRemove.push(entry);\n }\n for (const entry of toRemove) disposeItem(entry);\n\n // ===== Position correction with LIS =====\n // We walk the new array right-to-left using `marker` as the initial\n // anchor, which lets us use `insertBefore(node, nextNode)` uniformly.\n const lis = moved ? getSequence(newIndexToOldIndex) : [];\n let lisCursor = lis.length - 1;\n let nextNode: Node = marker;\n\n for (let i = newLen - 1; i >= 0; i--) {\n const entry = newEntries[i];\n const nodes = entry.nodes;\n const isFresh = newIndexToOldIndex[i] === 0;\n const inLis = !isFresh && moved && lisCursor >= 0 && i === lis[lisCursor];\n\n if (inLis) {\n // Stable skeleton — leave every node untouched, but still update\n // `nextNode` so the next iteration has the correct anchor.\n lisCursor--;\n for (let j = nodes.length - 1; j >= 0; j--) nextNode = nodes[j];\n continue;\n }\n\n // Fresh entry OR reused entry that is out of place → (re)insert each\n // node. The nextSibling guard keeps us from redundant writes for\n // multi-node rows whose internal order is already correct.\n for (let j = nodes.length - 1; j >= 0; j--) {\n const node = nodes[j];\n if (node.nextSibling !== nextNode) {\n parent.insertBefore(node, nextNode);\n }\n nextNode = node;\n }\n }\n\n entries = newEntries;\n }\n\n onCleanup(() => {\n effectRunner.stop();\n for (const entry of entries) {\n disposeItem(entry);\n }\n entries = [];\n clearFallback();\n if (marker.parentNode) {\n marker.parentNode.removeChild(marker);\n }\n });\n\n return fragment;\n}\n\nFor[FOR_COMPONENT] = true;\n\nexport function isFor(node: unknown): boolean {\n return !!node && !!(node as Record<symbol, boolean>)[FOR_COMPONENT];\n}\n"]}
|