@estjs/server 0.0.15-beta.13 → 0.0.15-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- 'use strict';var shared=require('@estjs/shared'),template=require('@estjs/template');function S(t,e=false){return shared.isNil(t)?"":shared.isString(t)?t:shared.isArray(t)?t.map(r=>S(r,e)).join(""):shared.isFunction(t)?S(t(),e):String(t)}var ct=/^<([a-z]+)(\s*)([^>]*)>/i,ut=/data-idx="(\d+)"/g,ft=/<!--(.*?)-->/g;function x(t,e){return t.replace(ct,`<$1$2$3 data-hk="${e}">`).replaceAll(ut,`data-idx="${e}-$1"`).replaceAll(ft,`<!--${e}-$1-->`)}function ht(t,e={}){if(!shared.isFunction(t))return shared.error("Component must be a function"),"";template.resetHydrationKey();let r=template.createScope(null),n;try{n=template.runWithScope(r,()=>t(e));}finally{template.disposeScope(r);}return S(n)}function pt(t,e,...r){let n=[],i=t.length,s=r.length;for(let c=0;c<i;c++)n.push(t[c]),c<s&&r[c]&&n.push(S(r[c]));let o=n.join("");return x(o,e)}function dt(t,e={}){if(!shared.isFunction(t))return shared.error("createSSGComponent: Component is not a function"),"";let r=template.createScope(),n;try{n=template.runWithScope(r,()=>t(e));}finally{template.disposeScope(r);}return S(n)}function m(t){return !!t&&!!t._IS_SIGNAL}Promise.resolve();function Z(t){return !!t&&!!t._IS_COMPUTED}function Ot(t){if(!t)return null;let{class:e,style:r}=t;return e&&typeof e!="string"&&(t.class=shared.normalizeClassName(e)),r&&(t.style=shared.normalizeStyle(r)),t}function rt(t,e,r){if(m(e)||Z(e))return rt(t,e.value);if(!e&&e!==0)return "";if(t==="style"){let n=shared.normalizeStyle(e);return n?typeof n=="string"?` style="${n}"`:` style="${shared.styleToString(n)}"`:""}if(t==="class"){let n=shared.normalizeClassName(e);return n?` class="${n}"`:""}return t.startsWith("on")?"":e===true?` ${t}`:` ${t}="${e}"`}Object.defineProperty(exports,"escapeHTML",{enumerable:true,get:function(){return shared.escapeHTML}});exports.addAttributes=x;exports.convertToString=S;exports.createSSGComponent=dt;exports.normalizeProps=Ot;exports.render=pt;exports.renderToString=ht;exports.setSSGAttr=rt;//# sourceMappingURL=server.cjs.js.map
1
+ 'use strict';var shared=require('@estjs/shared'),template=require('@estjs/template');function _(t,e=false){return shared.isNil(t)?"":shared.isString(t)?t:shared.isArray(t)?t.map(r=>_(r,e)).join(""):shared.isFunction(t)?_(t(),e):String(t)}var ut=/^<([a-z]+)(\s*)([^>]*)>/i,ft=/data-idx="(\d+)"/g,lt=/<!--(.*?)-->/g;function x(t,e){return t.replace(ut,`<$1$2$3 data-hk="${e}">`).replaceAll(ft,`data-idx="${e}-$1"`).replaceAll(lt,`<!--${e}-$1-->`)}function pt(t,e={}){if(!shared.isFunction(t))return shared.error("Component must be a function"),"";template.resetHydrationKey();let r=template.createScope(null),n;try{n=template.runWithScope(r,()=>t(e));}finally{template.disposeScope(r);}return _(n)}function dt(t,e,...r){let n=[],i=t.length,s=r.length;for(let c=0;c<i;c++)n.push(t[c]),c<s&&r[c]&&n.push(_(r[c]));let a=n.join("");return x(a,e)}function gt(t,e={}){if(!shared.isFunction(t))return shared.error("createSSGComponent: Component is not a function"),"";let r=template.createScope(),n;try{n=template.runWithScope(r,()=>t(e));}finally{template.disposeScope(r);}return _(n)}function S(t){return !!t&&!!t._IS_SIGNAL}Promise.resolve();function tt(t){return !!t&&!!t._IS_COMPUTED}function Vt(t){if(!t)return null;let{class:e,style:r}=t;return e&&!shared.isString(e)&&(t.class=shared.normalizeClassName(e)),r&&(t.style=shared.normalizeStyle(r)),t}function it(t,e,r){if(S(e)||tt(e))return it(t,e.value);if(!e&&e!==0)return "";if(t==="style"){let n=shared.normalizeStyle(e);return n?shared.isString(n)?` style="${n}"`:` style="${shared.styleToString(n)}"`:""}if(t==="class"){let n=shared.normalizeClassName(e);return n?` class="${n}"`:""}return t.startsWith("on")?"":e===true?` ${t}`:` ${t}="${e}"`}Object.defineProperty(exports,"escapeHTML",{enumerable:true,get:function(){return shared.escapeHTML}});exports.addAttributes=x;exports.convertToString=_;exports.createSSGComponent=gt;exports.normalizeProps=Vt;exports.render=dt;exports.renderToString=pt;exports.setSSGAttr=it;//# sourceMappingURL=server.cjs.js.map
2
2
  //# sourceMappingURL=server.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/render.ts","../../signals/dist/signals.dev.esm.js","../src/attrs.ts"],"names":["convertToString","content","isSvg","isNil","isString","isArray","item","isFunction","ROOT_ELEMENT_REGEX","INDEX_ATTRIBUTE_REGEX","COMMENT_REGEX","addAttributes","htmlContent","hydrationId","renderToString","component","props","error","resetHydrationKey","scope","createScope","result","runWithScope","disposeScope","render","templates","hydrationKey","components","parts","templateLen","componentLen","i","createSSGComponent","isSignal","value","isComputed","normalizeProps","className","style","normalizeClassName","normalizeStyle","setSSGAttr","attrName","attrValue","normalizedStyle","styleToString","normalizedClassName"],"mappings":"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","file":"server.cjs.js","sourcesContent":["import { isArray, isFunction, isNil, isString } from '@estjs/shared';\n\n/**\n * Convert content to string for SSR output\n *\n * @param content - the content to convert\n * @param isSvg - whether the content is SVG\n * @returns the content as a string\n */\nexport function convertToString(content: unknown, isSvg = false): string {\n if (isNil(content)) {\n return '';\n }\n\n if (isString(content)) {\n return content;\n }\n\n if (isArray(content)) {\n return (content as unknown[]).map((item: unknown) => convertToString(item, isSvg)).join('');\n }\n\n if (isFunction(content)) {\n return convertToString((content as () => unknown)(), isSvg);\n }\n\n return String(content);\n}\n\n/** Regex to match the root element */\nconst ROOT_ELEMENT_REGEX = /^<([a-z]+)(\\s*)([^>]*)>/i;\n/** Regex to match data-idx attributes */\nconst INDEX_ATTRIBUTE_REGEX = /data-idx=\"(\\d+)\"/g;\n/** Regex to match HTML comments */\nconst COMMENT_REGEX = /<!--(.*?)-->/g;\n\n/**\n * Add hydration attributes to HTML content\n *\n * @param htmlContent - the html content\n * @param hydrationId - the hydration id\n * @returns the html content with hydration attributes\n */\nexport function addAttributes(htmlContent: string, hydrationId: string): string {\n return htmlContent\n .replace(ROOT_ELEMENT_REGEX, `<$1$2$3 data-hk=\"${hydrationId}\">`)\n .replaceAll(INDEX_ATTRIBUTE_REGEX, `data-idx=\"${hydrationId}-$1\"`)\n .replaceAll(COMMENT_REGEX, `<!--${hydrationId}-$1-->`);\n}\n","import { error, isFunction } from '@estjs/shared';\nimport {\n type ComponentFn,\n type ComponentProps,\n createScope,\n disposeScope,\n resetHydrationKey,\n runWithScope,\n} from '@estjs/template';\nimport { addAttributes, convertToString } from './utils';\n\n/**\n * Render a component to HTML string\n * @param {ComponentFn} component - the component to render\n * @param {ComponentProps} props - the props to pass to the component\n * @returns {string} the rendered HTML string\n */\nexport function renderToString<P extends ComponentProps = ComponentProps>(\n component: ComponentFn<P>,\n props: P | ComponentProps = {},\n): string {\n if (!isFunction(component)) {\n error('Component must be a function');\n return '';\n }\n\n // Reset the hydration key counter\n resetHydrationKey();\n\n // Create root scope for SSR to support provide/inject\n const scope = createScope(null);\n\n let result: unknown;\n try {\n // Render the component within scope\n result = runWithScope(scope, () => component(props as P));\n } finally {\n // Clean up scope after rendering\n disposeScope(scope);\n }\n\n // Convert the result to string\n return convertToString(result);\n}\n\n/**\n * Render template with components (used by babel plugin in SSG mode)\n * @param {string[]} templates - the template fragments\n * @param {string} hydrationKey - the hydration key\n * @param {...string[]} components - the rendered component strings\n * @returns {string} the rendered HTML string\n */\nexport function render(templates: string[], hydrationKey: string, ...components: string[]): string {\n /**\n * JSX source code:\n * <div>\n * <div>\n * <Component1 />\n * <Component2 />\n * </div>\n * <Component3 />\n * </div>\n *\n * Compiles to:\n *\n * let _tmpl = [\n * '<div><div>',\n * '</div>',\n * '</div>',\n * ]\n *\n * function component(props) {\n * return render(_tmpl, getHydrationKey(),\n * createSSGComponent(Component1, {}),\n * createSSGComponent(Component2, {}),\n * createSSGComponent(Component3, {})\n * );\n * }\n */\n\n // Build content using array join for better performance\n const parts: string[] = [];\n const templateLen = templates.length;\n const componentLen = components.length;\n\n for (let i = 0; i < templateLen; i++) {\n parts.push(templates[i]);\n if (i < componentLen && components[i]) {\n parts.push(convertToString(components[i]));\n }\n }\n\n const content = parts.join('');\n\n // Add hydration key attribute\n return addAttributes(content, hydrationKey);\n}\n\n/**\n * Create a SSG component (renders component to string)\n * @param {ComponentFn} component - the component to create\n * @param {ComponentProps} props - the props to pass to the component\n * @returns {string} the rendered component as a string\n */\nexport function createSSGComponent<P extends ComponentProps = ComponentProps>(\n component: ComponentFn<P>,\n props: P | ComponentProps = {},\n): string {\n if (!isFunction(component)) {\n error('createSSGComponent: Component is not a function');\n return '';\n }\n\n // Create child scope inheriting from current active scope (if any)\n // This allows nested components to access parent's provided values\n const scope = createScope();\n\n let result: unknown;\n try {\n // Render the component within scope\n result = runWithScope(scope, () => component(props as P));\n } finally {\n // Clean up scope after rendering\n disposeScope(scope);\n }\n\n return convertToString(result);\n}\n","import { isFunction, isObject, warn, error, isPlainObject, hasChanged, isArray, isSet, isMap, isWeakMap, isWeakSet, hasOwn, isStringNumber } from '@estjs/shared';\n\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// src/constants.ts\nvar TriggerOpTypes = {\n SET: \"SET\",\n ADD: \"ADD\",\n DELETE: \"DELETE\",\n CLEAR: \"CLEAR\"\n};\nvar SIGNAL_KEY = /* @__PURE__ */ Symbol(\"Signal_Key\" );\nvar ARRAY_KEY = /* @__PURE__ */ Symbol(\"Array_Key\" );\nvar COLLECTION_KEY = /* @__PURE__ */ Symbol(\"Collection_Key\" );\nvar WEAK_COLLECTION_KEY = /* @__PURE__ */ Symbol(\"WeakCollection_Key\" );\nvar ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\"Array_Iterate_Key\" );\n\n// src/propagation.ts\nfunction propagate(link) {\n let next = link.nextSubLink;\n let stack;\n top: do {\n const sub = link.subNode;\n const queueBit = sub.flag & 64 /* QUEUED */;\n const watcherBit = sub.flag & 2 /* WATCHING */;\n let flags = sub.flag & -65 /* QUEUED */;\n if (!(flags & (16 /* DIRTY */ | 32 /* PENDING */ | 8 /* RECURSED */ | 4 /* RECURSED_CHECK */))) {\n sub.flag = queueBit | watcherBit | flags | 32 /* PENDING */;\n } else if (flags & (16 /* DIRTY */ | 32 /* PENDING */)) ; else if (!(flags & (8 /* RECURSED */ | 4 /* RECURSED_CHECK */))) {\n flags = 0 /* NONE */;\n sub.flag = queueBit | watcherBit;\n } else if (!(flags & 4 /* RECURSED_CHECK */)) {\n sub.flag = queueBit | watcherBit | (flags & -9 /* RECURSED */ | 32 /* PENDING */);\n } else if (!(flags & (16 /* DIRTY */ | 32 /* PENDING */)) && isValidLink(link, sub)) {\n sub.flag = queueBit | watcherBit | (flags | 8 /* RECURSED */ | 32 /* PENDING */);\n flags &= 1 /* MUTABLE */;\n } else {\n flags = 0 /* NONE */;\n sub.flag = queueBit | watcherBit;\n }\n if (sub.flag & 2 /* WATCHING */) {\n enqueueEffect(sub);\n }\n if (flags & 1 /* MUTABLE */) {\n const subSubs = sub.subLink;\n if (subSubs) {\n const nextSub = (link = subSubs).nextSubLink;\n if (nextSub) {\n stack = { value: next, prev: stack };\n next = nextSub;\n }\n continue;\n }\n }\n if (next) {\n link = next;\n next = link.nextSubLink;\n continue;\n }\n while (stack) {\n link = stack.value;\n stack = stack.prev;\n if (link) {\n next = link.nextSubLink;\n continue top;\n }\n }\n break;\n } while (true);\n}\nfunction shallowPropagate(link) {\n while (link) {\n const sub = link.subNode;\n const queueBit = sub.flag & 64 /* QUEUED */;\n const flags = sub.flag & -65 /* QUEUED */;\n if (!(flags & 16 /* DIRTY */) && flags & (1 /* MUTABLE */ | 32 /* PENDING */)) {\n const newFlags = queueBit | flags & -33 /* PENDING */ | 16 /* DIRTY */;\n sub.flag = newFlags;\n if (newFlags & 2 /* WATCHING */) {\n enqueueEffect(sub);\n }\n if (flags & 1 /* MUTABLE */ && sub.subLink) {\n shallowPropagate(sub.subLink);\n }\n }\n link = link.nextSubLink;\n }\n}\nfunction enqueueEffect(effect2) {\n if (!effect2.active) {\n return;\n }\n effect2.notify();\n}\n\n// src/link.ts\nvar currentLinkVersion = 0;\nvar activeSub;\nvar isUntracking = false;\nfunction linkReactiveNode(depNode, subNode) {\n if (isUntracking) {\n return void 0;\n }\n const prevDep = subNode.depLinkTail;\n if (prevDep && prevDep.depNode === depNode) {\n return prevDep;\n }\n const nextDep = prevDep ? prevDep.nextDepLink : subNode.depLink;\n if (nextDep && nextDep.depNode === depNode) {\n nextDep.version = currentLinkVersion;\n subNode.depLinkTail = nextDep;\n return nextDep;\n }\n const prevSub = depNode.subLinkTail;\n if (prevSub && prevSub.version === currentLinkVersion && prevSub.subNode === subNode) {\n subNode.depLinkTail = prevSub;\n return prevSub;\n }\n const newLink = {\n version: currentLinkVersion,\n depNode,\n subNode,\n // Subscriber chain pointers (horizontal)\n prevSubLink: prevSub,\n nextSubLink: void 0,\n // Dependency chain pointers (vertical)\n prevDepLink: prevDep,\n nextDepLink: nextDep\n };\n if (nextDep) {\n nextDep.prevDepLink = newLink;\n }\n if (prevDep) {\n prevDep.nextDepLink = newLink;\n } else {\n subNode.depLink = newLink;\n }\n if (prevSub) {\n prevSub.nextSubLink = newLink;\n } else {\n depNode.subLink = newLink;\n }\n depNode.subLinkTail = newLink;\n subNode.depLinkTail = newLink;\n {\n if (subNode.onTrack && isFunction(subNode == null ? void 0 : subNode.onTrack)) {\n subNode.onTrack({\n effect: subNode,\n target: depNode,\n type: \"get\",\n key: void 0\n });\n }\n }\n return newLink;\n}\nfunction unlinkReactiveNode(linkNode, subNode = linkNode.subNode) {\n const depNode = linkNode.depNode;\n const prevSub = linkNode.prevSubLink;\n const nextSub = linkNode.nextSubLink;\n const prevDep = linkNode.prevDepLink;\n const nextDep = linkNode.nextDepLink;\n if (nextDep) {\n nextDep.prevDepLink = prevDep;\n } else {\n subNode.depLinkTail = prevDep;\n }\n if (prevDep) {\n prevDep.nextDepLink = nextDep;\n } else {\n subNode.depLink = nextDep;\n }\n if (nextSub) {\n nextSub.prevSubLink = prevSub;\n } else {\n depNode.subLinkTail = prevSub;\n }\n if (prevSub) {\n prevSub.nextSubLink = nextSub;\n } else {\n depNode.subLink = nextSub;\n if (nextSub === void 0) {\n let toRemove = depNode.depLink;\n while (toRemove) {\n toRemove = unlinkReactiveNode(toRemove, depNode);\n }\n depNode.depLinkTail = void 0;\n depNode.flag |= 16 /* DIRTY */;\n {\n if (depNode.depLink) {\n error(\n \"[Link] Cascading cleanup failed: depNode still has dependency links. This indicates a bug in the unlinking logic.\"\n );\n }\n }\n }\n }\n linkNode.depNode = void 0;\n linkNode.subNode = void 0;\n linkNode.prevSubLink = void 0;\n linkNode.nextSubLink = void 0;\n linkNode.prevDepLink = void 0;\n linkNode.nextDepLink = void 0;\n return nextDep;\n}\nfunction checkDirty(link, sub) {\n const stack = [{ link, owner: sub }];\n const pendingNodes = [];\n while (stack.length > 0) {\n const frame = stack.pop();\n let current = frame.link;\n const owner = frame.owner;\n while (current) {\n const dep = current.depNode;\n const depFlags = dep.flag;\n if (owner.flag & 16 /* DIRTY */) {\n return true;\n }\n if ((depFlags & (1 /* MUTABLE */ | 16 /* DIRTY */)) === (1 /* MUTABLE */ | 16 /* DIRTY */)) {\n const subs = dep.subLink;\n if (subs && subs.nextSubLink) {\n shallowPropagate2(subs);\n }\n for (const node of pendingNodes) {\n if (node.flag & 32 /* PENDING */) {\n node.flag = node.flag & -33 /* PENDING */ | 16 /* DIRTY */;\n }\n }\n return true;\n }\n if ((depFlags & (1 /* MUTABLE */ | 32 /* PENDING */)) === (1 /* MUTABLE */ | 32 /* PENDING */)) {\n if (dep.depLink) {\n pendingNodes.push(dep);\n stack.push({ link: dep.depLink, owner: dep });\n } else {\n dep.flag &= -33 /* PENDING */;\n }\n } else if (depFlags & 32 /* PENDING */) {\n dep.flag &= -33 /* PENDING */;\n }\n current = current.nextDepLink;\n }\n }\n for (const node of pendingNodes) {\n node.flag &= -33 /* PENDING */;\n }\n if (sub.flag & 32 /* PENDING */) {\n sub.flag &= -33 /* PENDING */;\n }\n return false;\n}\nfunction shallowPropagate2(link) {\n while (link) {\n const sub = link.subNode;\n const queueBit = sub.flag & 64 /* QUEUED */;\n const flags = sub.flag & -65 /* QUEUED */;\n if ((flags & (32 /* PENDING */ | 16 /* DIRTY */)) === 32 /* PENDING */) {\n sub.flag = queueBit | flags | 16 /* DIRTY */;\n }\n link = link.nextSubLink;\n }\n}\nfunction setActiveSub(sub) {\n const prev = activeSub;\n activeSub = sub;\n return prev;\n}\nfunction startTracking(sub) {\n currentLinkVersion++;\n sub.depLinkTail = void 0;\n sub.flag = sub.flag & -57 | 4 /* RECURSED_CHECK */;\n return setActiveSub(sub);\n}\nfunction endTracking(sub, prevSub) {\n activeSub = prevSub;\n const depsTail = sub.depLinkTail;\n let toRemove = depsTail ? depsTail.nextDepLink : sub.depLink;\n while (toRemove) {\n toRemove = unlinkReactiveNode(toRemove, sub);\n }\n sub.flag &= -5 /* RECURSED_CHECK */;\n}\nfunction untrack(fn) {\n const prevSub = setActiveSub(void 0);\n const prevUntracking = isUntracking;\n isUntracking = true;\n try {\n return fn();\n } finally {\n isUntracking = prevUntracking;\n setActiveSub(prevSub);\n }\n}\nfunction isValidLink(checkLink, sub) {\n let link = sub.depLinkTail;\n while (link) {\n if (link === checkLink) {\n return true;\n }\n link = link.prevDepLink;\n }\n return false;\n}\nvar targetMap = /* @__PURE__ */ new WeakMap();\nfunction track(target, key) {\n if (!activeSub || isUntracking) {\n return;\n }\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n depsMap = /* @__PURE__ */ new Map();\n targetMap.set(target, depsMap);\n }\n let dep = depsMap.get(key);\n if (!dep) {\n dep = /* @__PURE__ */ new Set();\n depsMap.set(key, dep);\n }\n if (!dep.has(activeSub)) {\n dep.add(activeSub);\n if (isFunction(activeSub.onTrack)) {\n activeSub.onTrack({\n effect: activeSub,\n target,\n type: \"get\",\n key\n });\n }\n }\n}\nfunction trigger(target, type, key, newValue) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const effects = /* @__PURE__ */ new Set();\n if (key !== void 0) {\n if (Array.isArray(key)) {\n key.forEach((k) => {\n const dep = depsMap.get(k);\n if (dep) {\n dep.forEach((effect2) => effects.add(effect2));\n }\n });\n } else {\n const dep = depsMap.get(key);\n if (dep) {\n dep.forEach((effect2) => effects.add(effect2));\n }\n }\n }\n if (type === \"ADD\" || type === \"DELETE\" || type === \"CLEAR\") {\n const ITERATE_KEY = /* @__PURE__ */ Symbol(\"iterate\");\n const ARRAY_ITERATE_KEY2 = /* @__PURE__ */ Symbol(\"arrayIterate\");\n const iterationKey = Array.isArray(target) ? ARRAY_ITERATE_KEY2 : ITERATE_KEY;\n const iterationDep = depsMap.get(iterationKey);\n if (iterationDep) {\n iterationDep.forEach((effect2) => effects.add(effect2));\n }\n }\n effects.forEach((effect2) => {\n var _a5;\n if (isFunction(effect2.onTrigger)) {\n effect2.onTrigger({\n effect: effect2,\n target,\n type,\n key,\n newValue\n });\n }\n if (effect2.flag & 2 /* WATCHING */) {\n (_a5 = effect2.notify) == null ? void 0 : _a5.call(effect2);\n } else if (effect2.flag & 1 /* MUTABLE */) {\n effect2.flag |= 16 /* DIRTY */;\n if (effect2.subLink) {\n propagate(effect2.subLink);\n }\n }\n });\n}\nvar reactiveCaches = /* @__PURE__ */ new WeakMap();\nfunction toRaw(value) {\n if (!value || !isObject(value)) {\n return value;\n }\n const raw = value[\"_RAW\" /* RAW */];\n if (raw) {\n return toRaw(raw);\n }\n if (isSignal(value)) {\n return toRaw(value.peek());\n }\n return value;\n}\nvar arrayInstrumentations = createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n const instrumentations = {};\n [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n let res = arr[key](...args);\n if ((res === -1 || res === false) && args.length > 0) {\n const rawArgs = args.map((arg) => toRaw(arg));\n res = arr[key](...rawArgs);\n }\n return res;\n };\n });\n [\"find\", \"findIndex\", \"findLast\", \"findLastIndex\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_ITERATE_KEY);\n const res = arr[key](...args);\n if ((key === \"find\" || key === \"findLast\") && isObject(res) && !isShallowMode) {\n return reactiveImpl(res);\n }\n return res;\n };\n });\n [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\", \"sort\", \"reverse\", \"fill\", \"copyWithin\"].forEach(\n (key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const res = Array.prototype[key].apply(arr, args);\n trigger(arr, TriggerOpTypes.SET, ARRAY_KEY);\n trigger(arr, TriggerOpTypes.SET, ARRAY_ITERATE_KEY);\n return res;\n };\n }\n );\n [\"toReversed\", \"toSorted\", \"toSpliced\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_ITERATE_KEY);\n if (key === \"toSpliced\") {\n for (let i = 0, l = arr.length; i < l; i++) {\n track(arr, `${i}`);\n }\n }\n const res = Array.prototype[key].apply(arr, args);\n if (!Array.isArray(res)) {\n return res;\n }\n return res.map((item) => isObject(item) ? reactiveImpl(item, isShallowMode) : item);\n };\n });\n [\"concat\", \"slice\", \"filter\", \"map\", \"flatMap\", \"flat\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n const res = Array.prototype[key].apply(arr, args);\n return res;\n };\n });\n [\"join\", \"toString\", \"toLocaleString\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n return Array.prototype[key].apply(arr, args);\n };\n });\n [\"values\", \"keys\", \"entries\", Symbol.iterator].forEach((key) => {\n instrumentations[key] = function() {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_KEY);\n const rawIterator = key === Symbol.iterator ? arr[Symbol.iterator]() : arr[key]();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (Array.isArray(value)) {\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v, isShallowMode) : v),\n done\n };\n }\n return {\n value: isObject(value) ? reactiveImpl(value, isShallowMode) : value,\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n });\n return instrumentations;\n}\nvar arrayHandlers = (shallow) => ({\n get: (target, key, receiver) => {\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_IS_SHALLOW\" /* IS_SHALLOW */) {\n return shallow;\n }\n if (hasOwn(arrayInstrumentations, key)) {\n return arrayInstrumentations[key];\n }\n const value = Reflect.get(target, key, receiver);\n if (isStringNumber(key)) {\n track(target, key);\n }\n track(target, ARRAY_KEY);\n if (isObject(value) && !shallow) {\n return reactiveImpl(value);\n }\n return value;\n },\n set: (target, key, value, receiver) => {\n const oldValue = Reflect.get(target, key, receiver);\n const result = Reflect.set(target, key, value, receiver);\n if (hasChanged(value, oldValue)) {\n if (isStringNumber(key)) {\n trigger(target, TriggerOpTypes.SET, [key, ARRAY_ITERATE_KEY, ARRAY_KEY]);\n } else {\n trigger(target, TriggerOpTypes.SET, key);\n }\n }\n return result;\n }\n});\nvar shallowArrayHandlers = arrayHandlers(true);\nvar deepArrayHandlers = arrayHandlers(false);\nvar collectionHandlers = {\n get(target, key) {\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n return Reflect.get(\n hasOwn(collectionInstrumentations, key) ? collectionInstrumentations : target,\n key,\n target\n );\n }\n};\nvar weakCollectionHandlers = {\n get(target, key) {\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n return Reflect.get(\n hasOwn(weakInstrumentations, key) && key in target ? weakInstrumentations : target,\n key,\n target\n );\n }\n};\nvar collectionInstrumentations = {\n get(key) {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n const value = target.get(key);\n if (isObject(value) && !isShallow(this)) {\n return reactiveImpl(value);\n }\n return value;\n },\n set(key, value) {\n const target = toRaw(this);\n const hadKey = target.has(key);\n const oldValue = target.get(key);\n const rawValue = toRaw(value);\n target.set(key, rawValue);\n if (!hadKey || hasChanged(oldValue, rawValue)) {\n trigger(target, TriggerOpTypes.SET, COLLECTION_KEY);\n }\n return this;\n },\n add(value) {\n const target = toRaw(this);\n const rawValue = toRaw(value);\n const hadValue = target.has(rawValue);\n target.add(rawValue);\n if (!hadValue) {\n trigger(target, TriggerOpTypes.ADD, COLLECTION_KEY);\n } else {\n trigger(target, TriggerOpTypes.SET, COLLECTION_KEY);\n }\n return this;\n },\n has(key) {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n const hasKey = target.has(key);\n if (!hasKey && isObject(key)) {\n return target.has(toRaw(key));\n }\n return hasKey;\n },\n delete(key) {\n const target = toRaw(this);\n const hadKey = target.has(key);\n let result = target.delete(key);\n if (!result && isObject(key)) {\n result = target.delete(toRaw(key));\n }\n if (hadKey || result) {\n trigger(target, TriggerOpTypes.DELETE, COLLECTION_KEY);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size > 0;\n const result = target.clear();\n if (hadItems) {\n trigger(target, TriggerOpTypes.CLEAR, COLLECTION_KEY);\n }\n return result;\n },\n forEach(callback, thisArg) {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n target.forEach((value, key) => {\n const wrappedValue = isShallowMode || !isObject(value) ? value : reactiveImpl(value);\n const wrappedKey = isShallowMode || !isObject(key) ? key : reactiveImpl(key);\n callback.call(thisArg, wrappedValue, wrappedKey, this);\n });\n },\n [Symbol.iterator]() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target[Symbol.iterator]();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (isShallowMode) {\n return { value, done };\n }\n if (Array.isArray(value)) {\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v) : v),\n done\n };\n }\n return {\n value: isObject(value) ? reactiveImpl(value) : value,\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n get size() {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n return target.size;\n },\n keys() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.keys();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n return {\n value: isShallowMode || !isObject(value) ? value : reactiveImpl(value),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n values() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.values();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n return {\n value: isShallowMode || !isObject(value) ? value : reactiveImpl(value),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n entries() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.entries();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (isShallowMode) {\n return { value, done };\n }\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v) : v),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n }\n};\nvar weakInstrumentations = {\n get(key) {\n const target = toRaw(this);\n track(target, WEAK_COLLECTION_KEY);\n let value = target.get(key);\n if (value === void 0 && isReactive(key)) {\n value = target.get(toRaw(key));\n }\n if (isObject(value) && !isShallow(this)) {\n return reactiveImpl(value);\n }\n return value;\n },\n set(key, value) {\n const target = toRaw(this);\n const rawKey = toRaw(key);\n const hadKey = target.has(rawKey);\n const oldValue = target.get(rawKey);\n const rawValue = toRaw(value);\n target.set(rawKey, rawValue);\n if (!hadKey || hasChanged(oldValue, rawValue)) {\n trigger(target, TriggerOpTypes.SET, WEAK_COLLECTION_KEY);\n }\n return this;\n },\n add(value) {\n const target = toRaw(this);\n const rawValue = toRaw(value);\n const hadValue = target.has(rawValue);\n target.add(rawValue);\n if (!hadValue) {\n trigger(target, TriggerOpTypes.ADD, WEAK_COLLECTION_KEY);\n }\n return this;\n },\n has(key) {\n const target = toRaw(this);\n track(target, WEAK_COLLECTION_KEY);\n let hasKey = target.has(key);\n if (!hasKey && isReactive(key)) {\n hasKey = target.has(toRaw(key));\n }\n return hasKey;\n },\n delete(key) {\n const target = toRaw(this);\n const rawKey = toRaw(key);\n const hadKey = target.has(rawKey);\n const result = target.delete(rawKey);\n if (hadKey || result) {\n trigger(target, TriggerOpTypes.DELETE, WEAK_COLLECTION_KEY);\n }\n return result;\n }\n};\nvar objectHandlers = (shallow) => ({\n get(target, key, receiver) {\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_IS_SHALLOW\" /* IS_SHALLOW */) {\n return shallow;\n }\n const value = Reflect.get(target, key, receiver);\n const valueUnwrapped = isSignal(value) ? value.value : value;\n track(target, key);\n if (isObject(valueUnwrapped) && !shallow) {\n return reactiveImpl(valueUnwrapped);\n }\n return valueUnwrapped;\n },\n set: (target, key, value, receiver) => {\n const oldValue = Reflect.get(target, key, receiver);\n const result = Reflect.set(target, key, toRaw(value), receiver);\n if (hasChanged(value, oldValue)) {\n trigger(target, TriggerOpTypes.SET, key, value);\n }\n return result;\n },\n deleteProperty: (target, key) => {\n const hadKey = hasOwn(target, key);\n const result = Reflect.deleteProperty(target, key);\n if (hadKey && result) {\n trigger(target, TriggerOpTypes.DELETE, key, void 0);\n }\n return result;\n }\n});\nfunction reactiveImpl(target, shallow = false) {\n if (!isObject(target)) {\n return target;\n }\n if (isReactive(target)) {\n return target;\n }\n const existingProxy = reactiveCaches.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n let handler;\n if (isArray(target)) {\n handler = shallow ? shallowArrayHandlers : deepArrayHandlers;\n } else if (isSet(target) || isMap(target)) {\n handler = collectionHandlers;\n } else if (isWeakMap(target) || isWeakSet(target)) {\n handler = weakCollectionHandlers;\n } else {\n handler = objectHandlers(shallow);\n }\n const proxy = new Proxy(target, handler);\n reactiveCaches.set(target, proxy);\n return proxy;\n}\nfunction isReactive(target) {\n return !!(target && target[\"_IS_REACTIVE\" /* IS_REACTIVE */]);\n}\nfunction reactive(target) {\n if (isReactive(target)) {\n return target;\n }\n if (isSignal(target)) {\n return target;\n }\n return reactiveImpl(target);\n}\nfunction shallowReactive(target) {\n if (isReactive(target)) {\n return target;\n }\n if (isSignal(target)) {\n return target;\n }\n return reactiveImpl(target, true);\n}\nfunction isShallow(value) {\n return !!(value && value[\"_IS_SHALLOW\" /* IS_SHALLOW */]);\n}\nvar toReactive = (value) => isObject(value) ? reactive(value) : value;\n\n// src/signal.ts\nvar _a;\n_a = \"_IS_SIGNAL\" /* IS_SIGNAL */;\nvar SignalImpl = class {\n // Mark as Signal\n /**\n * Create a new Signal with the given initial value.\n *\n * @param value - Initial value\n * @param shallow - Whether only the top level should be reactive\n */\n constructor(value, shallow = false) {\n this.flag = 1 /* MUTABLE */;\n // Mark whether it's shallow reactive\n // @ts-ignore\n this[_a] = true;\n this._rawValue = value;\n if (shallow) {\n this._value = isObject(value) ? shallowReactive(value) : value;\n } else {\n this._value = isObject(value) ? reactive(value) : value;\n }\n this[\"_IS_SHALLOW\" /* IS_SHALLOW */] = shallow;\n }\n // dep getter, returns itself for dependency collection\n get dep() {\n return this;\n }\n get value() {\n const sub = activeSub;\n if (sub) {\n linkReactiveNode(this, sub);\n }\n const flags = this.flag;\n if (flags & 16 /* DIRTY */ && this.shouldUpdate()) {\n const subs = this.subLink;\n if (subs) {\n shallowPropagate2(subs);\n }\n }\n return this._value;\n }\n // value setter, triggers update when value changes\n set value(value) {\n if (isSignal(value)) {\n {\n warn(\n \"Setting a signal value to another signal is not recommended. The value will be unwrapped automatically.\"\n );\n }\n value = value.peek();\n }\n value = toRaw(value);\n if (!hasChanged(this._rawValue, value)) {\n return;\n }\n if (!(\"_oldValue\" in this)) {\n this._oldValue = this._rawValue;\n }\n const flags = this.flag;\n this.flag = flags | 16 /* DIRTY */;\n this._rawValue = value;\n const shallow = this[\"_IS_SHALLOW\" /* IS_SHALLOW */];\n if (shallow) {\n this._value = isObject(value) ? shallowReactive(value) : value;\n } else {\n this._value = isObject(value) ? reactive(value) : value;\n }\n const subs = this.subLink;\n if (subs) {\n propagate(subs);\n }\n }\n // Check if the value should be update\n shouldUpdate() {\n this.flag &= -17 /* DIRTY */;\n if (!(\"_oldValue\" in this)) {\n return true;\n }\n const changed = hasChanged(this._oldValue, this._rawValue);\n this._oldValue = this._rawValue;\n return changed;\n }\n // Get current value without triggering dependency tracking\n peek() {\n return this._value;\n }\n // set method is an alias for the value setter\n set(value) {\n this.value = value;\n }\n // Update value using an updater function\n update(updater) {\n const nextValue = updater(this.peek());\n if (isSignal(nextValue)) {\n {\n warn(\n \"Returning a signal from an update function is not recommended. The value will be unwrapped.\"\n );\n }\n this.value = nextValue.peek();\n } else {\n this.value = nextValue;\n }\n }\n};\nfunction signal(value) {\n if (isSignal(value)) {\n {\n warn(\n \"Creating a signal with another signal is not recommended. The value will be unwrapped.\"\n );\n }\n return value;\n }\n return new SignalImpl(value);\n}\nfunction shallowSignal(value) {\n if (isSignal(value)) {\n value = value.peek();\n }\n return new SignalImpl(value, true);\n}\nfunction isSignal(value) {\n return !!value && !!value[\"_IS_SIGNAL\" /* IS_SIGNAL */];\n}\nvar queue = /* @__PURE__ */ new Set();\nvar activePreFlushCbs = /* @__PURE__ */ new Set();\nvar p = Promise.resolve();\nvar isFlushPending = false;\nfunction nextTick(fn) {\n if (fn) {\n return new Promise((resolve, reject) => {\n queueMicrotask(() => {\n try {\n fn();\n resolve();\n } catch (error5) {\n reject(error5);\n }\n });\n });\n }\n return p;\n}\nfunction queueJob(job) {\n queue.add(job);\n queueFlush();\n}\nfunction queueFlush() {\n if (!isFlushPending) {\n isFlushPending = true;\n nextTick(flushJobs);\n }\n}\nfunction queuePreFlushCb(cb) {\n activePreFlushCbs.add(cb);\n queueFlush();\n}\nfunction flushJobs() {\n isFlushPending = false;\n flushPreFlushCbs();\n while (queue.size > 0) {\n const jobs = Array.from(queue);\n queue.clear();\n for (const job of jobs) {\n try {\n job();\n } catch (_error) {\n {\n error(\"Error executing queued job:\", _error);\n }\n }\n }\n }\n}\nfunction flushPreFlushCbs() {\n const callbacks = Array.from(activePreFlushCbs);\n activePreFlushCbs.clear();\n for (const callback of callbacks) {\n try {\n callback();\n } catch (_error) {\n {\n error(\"Error executing pre-flush callback:\", _error);\n }\n }\n }\n}\nfunction createScheduler(effect2, flush) {\n switch (flush) {\n case \"sync\":\n return () => effect2();\n case \"pre\":\n return () => queuePreFlushCb(effect2);\n case \"post\":\n return () => queueJob(effect2);\n default:\n {\n warn(`Invalid flush timing: ${flush}. Defaulting to 'post'.`);\n }\n return () => queueJob(effect2);\n }\n}\n\n// src/batch.ts\nvar batchDepth = 0;\nfunction batch(fn) {\n startBatch();\n try {\n return fn();\n } finally {\n endBatch();\n }\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (batchDepth === 0) {\n warn(\n \"[Batch] endBatch() called without matching startBatch(). This indicates unbalanced batch calls in your code. Make sure every startBatch() has a corresponding endBatch(), or use the batch() function which handles this automatically.\"\n );\n return;\n }\n batchDepth--;\n if (batchDepth === 0) {\n flushJobs();\n }\n}\nfunction isBatching() {\n return batchDepth > 0;\n}\nfunction getBatchDepth() {\n return batchDepth;\n}\n\n// src/effect.ts\nvar _a2;\n_a2 = \"_IS_EFFECT\" /* IS_EFFECT */;\nvar EffectImpl = class {\n /**\n * Create an Effect instance\n *\n * @param fn - The effect function\n * @param options - Configuration options\n */\n constructor(fn, options) {\n this.flag = 2 /* WATCHING */ | 16 /* DIRTY */;\n // @ts-ignore\n this[_a2] = true;\n // State management\n this._active = true;\n this.fn = fn;\n if (options) {\n this.scheduler = options.flush || options.scheduler;\n this.onStop = options.onStop;\n this.onTrack = options.onTrack;\n this.onTrigger = options.onTrigger;\n }\n }\n /**\n * Check if the Effect is active\n */\n get active() {\n return this._active;\n }\n /**\n * Check if the Effect is dirty (needs re-execution)\n \n */\n get dirty() {\n const flags = this.flag;\n if (flags & 16 /* DIRTY */) {\n return true;\n }\n if (flags & 32 /* PENDING */) {\n if (this.depLink && checkDirty(this.depLink, this)) {\n this.flag = flags & -33 /* PENDING */ | 16 /* DIRTY */;\n return true;\n }\n this.flag = flags & -33 /* PENDING */;\n }\n return false;\n }\n /**\n * Pause Effect execution\n *\n * When an effect is paused:\n * - It stops responding to dependency changes\n * - Notifications are ignored (see notify method)\n * - DIRTY and PENDING flags are still set when dependencies change\n * - The effect remains active and maintains its dependency links\n *\n * Use cases:\n * - Temporarily disable effects during bulk updates\n * - Prevent effects from running during initialization\n * - Control when side effects should execute\n *\n * @example\n * ```typescript\n * const count = signal(0);\n * const runner = effect(() => console.log(count.value));\n *\n * runner.effect.pause();\n * count.value = 1; // Effect won't run\n * count.value = 2; // Effect won't run\n * runner.effect.resume(); // Effect runs once with latest value\n * ```\n */\n pause() {\n this.flag |= 256 /* PAUSED */;\n }\n /**\n * Resume Effect execution\n *\n * When an effect is resumed:\n * - The PAUSED flag is cleared\n * - If dependencies changed during pause (DIRTY or PENDING flags set),\n * the effect executes immediately via notify()\n * - If no changes occurred, the effect simply becomes active again\n *\n * State management:\n * - Clears PAUSED flag atomically\n * - Checks for accumulated DIRTY/PENDING flags\n * - Triggers execution if needed\n *\n * @example\n * ```typescript\n * const count = signal(0);\n * const runner = effect(() => console.log(count.value));\n *\n * runner.effect.pause();\n * count.value = 1; // Queued\n * count.value = 2; // Queued\n * runner.effect.resume(); // Executes once with count.value = 2\n * ```\n */\n resume() {\n const flags = this.flag;\n const nextFlags = flags & -257 /* PAUSED */;\n this.flag = nextFlags;\n const wasDirty = (nextFlags & 16 /* DIRTY */) !== 0;\n const wasPending = (nextFlags & 32 /* PENDING */) !== 0;\n if (wasDirty || wasPending) {\n this.notify();\n }\n }\n /**\n * Execute the Effect function\n *\n * Core execution flow:\n * 1. Check if active\n * 2. Clear dirty flag\n * 3. Start tracking dependencies\n * 4. Execute user function\n * 5. End tracking, clean up stale dependencies\n \n * @returns The return value of the effect function\n */\n run() {\n if (!this._active) {\n return this.fn();\n }\n const flags = this.flag;\n this.flag = flags & -17 /* DIRTY */ | 1024 /* STOP */;\n const prevSub = startTracking(this);\n try {\n return this.fn();\n } catch (error5) {\n this.flag |= 16 /* DIRTY */;\n throw error5;\n } finally {\n this.flag &= -1025 /* STOP */;\n endTracking(this, prevSub);\n }\n }\n /**\n * Get or create the job function for this effect\n */\n getJob() {\n if (!this._job) {\n this._job = () => this.run();\n }\n return this._job;\n }\n /**\n * Notify that the Effect needs to execute\n *\n * Called by dependent reactive values.\n * Decides whether to execute immediately or defer based on scheduling strategy.\n */\n notify() {\n const flags = this.flag;\n if (!this._active || flags & (256 /* PAUSED */ | 1024 /* STOP */ | 16 /* DIRTY */)) {\n return;\n }\n this.flag = flags | 16 /* DIRTY */;\n if (this.onTrigger) {\n this.onTrigger({\n effect: this,\n target: {},\n type: \"set\"\n });\n }\n if (this.scheduler) {\n if (isFunction(this.scheduler)) {\n this.scheduler(this);\n } else {\n const schedulerFn = createScheduler(() => this.run(), this.scheduler);\n schedulerFn();\n }\n } else if (isBatching()) {\n queueJob(this.getJob());\n } else {\n this.run();\n }\n }\n /**\n * Stop the Effect\n *\n * After stopping:\n * - No longer responds to dependency changes\n * - Disconnects all dependency links\n * - Clears cached job function\n * - Calls onStop callback\n * - Verifies complete cleanup in development mode\n */\n stop() {\n if (!this._active) {\n {\n warn(\"[Effect] Attempting to stop an already stopped effect.\");\n }\n return;\n }\n this._active = false;\n let dep = this.depLink;\n while (dep) {\n dep = unlinkReactiveNode(dep, this);\n }\n let sub = this.subLink;\n while (sub) {\n sub = unlinkReactiveNode(sub);\n }\n this._job = void 0;\n this.depLinkTail = void 0;\n this.subLinkTail = void 0;\n {\n if (this.depLink) {\n error(\n \"[Effect] Cleanup verification failed: depLink not cleared. This indicates a memory leak in the dependency tracking system.\"\n );\n }\n if (this.subLink) {\n error(\n \"[Effect] Cleanup verification failed: subLink not cleared. This indicates a memory leak in the subscription system.\"\n );\n }\n }\n if (this.onStop) {\n this.onStop();\n }\n }\n};\nfunction effect(fn, options) {\n const effectInstance = new EffectImpl(fn, options);\n try {\n effectInstance.run();\n } catch (_error) {\n effectInstance.stop();\n {\n error(\n \"[Effect] Effect failed during initial execution and has been stopped. Fix the error in your effect function.\",\n _error\n );\n }\n throw _error;\n }\n const runner = () => effectInstance.run();\n runner.effect = effectInstance;\n runner.stop = () => effectInstance.stop();\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nfunction isEffect(value) {\n return !!(value && value[\"_IS_EFFECT\" /* IS_EFFECT */]);\n}\nfunction memoEffect(fn, initialState, options) {\n let currentState = initialState;\n const effectFn = () => {\n const result = fn(currentState);\n currentState = result;\n };\n return effect(effectFn, options);\n}\nvar NO_VALUE = /* @__PURE__ */ Symbol(\"computed-no-value\");\nvar _a3;\n_a3 = \"_IS_COMPUTED\" /* IS_COMPUTED */;\nvar ComputedImpl = class {\n /**\n * Create a Computed instance\n *\n * @param getter - The computation function\n * @param setter - Optional setter function\n * @param onTrack - Optional debug callback for dependency tracking\n * @param onTrigger - Optional debug callback for triggers\n */\n constructor(getter, setter, onTrack, onTrigger) {\n this.flag = 1 /* MUTABLE */ | 16 /* DIRTY */;\n //@ts-ignore\n this[_a3] = true;\n // Cache\n // Use symbol sentinel to distinguish \"no value\" from undefined/null values\n this._value = NO_VALUE;\n this.getter = getter;\n this.setter = setter;\n this.onTrack = onTrack;\n this.onTrigger = onTrigger;\n this.flag |= 16 /* DIRTY */;\n }\n get value() {\n if (activeSub) {\n linkReactiveNode(this, activeSub);\n }\n const flags = this.flag;\n const hasValue = this._value !== NO_VALUE;\n if (hasValue && !(flags & (16 /* DIRTY */ | 32 /* PENDING */))) {\n return this._value;\n }\n if (!hasValue || flags & 16 /* DIRTY */) {\n this.recompute();\n return this._value;\n }\n if (flags & 32 /* PENDING */) {\n if (this.depLink && checkDirty(this.depLink, this)) {\n this.recompute();\n } else {\n this.flag = flags & -33 /* PENDING */;\n }\n }\n return this._value;\n }\n /**\n * Set value (only effective when setter is provided)\n *\n * @param newValue - The new value\n */\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else {\n warn(\n \"[Computed] Cannot set readonly computed value. Provide a setter in the computed options to make it writable.\\nExample: computed({ get: () => value, set: (v) => { ... } })\"\n );\n }\n }\n /**\n * Read value without tracking dependencies\n *\n * @returns Current value\n */\n peek() {\n if (this._value === NO_VALUE) {\n this.recompute();\n }\n return this._value;\n }\n /**\n * Recompute the value\n *\n * computation logic:\n * 1. Start tracking dependencies\n * 2. Execute getter function\n * 3. Check if value changed using optimized comparison\n * 4. If changed, update cache and notify subscribers\n * 5. End tracking, clean up stale dependencies\n * @private\n */\n recompute() {\n const oldValue = this._value;\n const hadValue = oldValue !== NO_VALUE;\n const prevSub = startTracking(this);\n try {\n const newValue = this.getter();\n const flags = this.flag;\n const subs = this.subLink;\n const clearMask = ~(16 /* DIRTY */ | 32 /* PENDING */);\n const valueChanged = !hadValue || hasChanged(oldValue, newValue);\n if (valueChanged) {\n this._value = newValue;\n this.flag = flags & clearMask;\n if (this.onTrigger) {\n this.onTrigger({\n effect: this,\n target: this,\n type: \"set\",\n key: \"value\",\n newValue\n });\n }\n if (subs) {\n shallowPropagate(subs);\n }\n } else {\n this.flag = flags & clearMask;\n }\n } catch (_error) {\n const clearMask = -49;\n this.flag &= clearMask;\n this.flag |= 16 /* DIRTY */;\n {\n error(\n \"[Computed] Error occurred while computing value.\\nThe computed will retry on next access.\\nCommon causes:\\n - Accessing undefined properties\\n - Circular dependencies\\n - Exceptions in getter function\\nCheck your getter function for errors.\",\n _error\n );\n }\n throw _error;\n } finally {\n endTracking(this, prevSub);\n }\n }\n /**\n * Check if update is needed\n *\n * Internal use, called by reactive system.\n *\n * @returns true if value changed\n */\n shouldUpdate() {\n const hadValue = this._value !== NO_VALUE;\n const oldValue = this._value;\n this.recompute();\n if (!hadValue) {\n return true;\n }\n return hasChanged(this._value, oldValue);\n }\n};\nfunction computed(getterOrOptions) {\n if (isComputed(getterOrOptions)) {\n {\n warn(\n \"[Computed] Creating a computed from another computed is not recommended. The existing computed will be returned to avoid unnecessary wrapping.\"\n );\n }\n return getterOrOptions;\n }\n if (!getterOrOptions) {\n throw new Error(\n \"[Computed] Invalid argument: computed() requires a getter function or options object.\"\n );\n }\n if (isFunction(getterOrOptions)) {\n return new ComputedImpl(getterOrOptions);\n }\n if (isPlainObject(getterOrOptions)) {\n const { get, set, onTrack, onTrigger } = getterOrOptions;\n if (!get) {\n throw new Error(\n \"[Computed] Invalid options: getter function is required.\\nUsage: computed({ get: () => value, set: (v) => { ... } })\"\n );\n }\n if (!isFunction(get)) {\n throw new TypeError(\n `[Computed] Invalid options: getter must be a function.\nReceived: ${typeof get}`\n );\n }\n return new ComputedImpl(get, set, onTrack, onTrigger);\n }\n throw new Error(\n `[Computed] Invalid argument: expected a function or options object.\nReceived: ${typeof getterOrOptions}`\n );\n}\nfunction isComputed(value) {\n return !!value && !!value[\"_IS_COMPUTED\" /* IS_COMPUTED */];\n}\nfunction createOptionsStore(options) {\n if (!options.state) {\n warn(\"Store state is required\");\n throw new Error(\"Store state is required\");\n }\n const { state, getters, actions } = options;\n const initState = __spreadValues({}, state);\n const reactiveState = reactive(state);\n const subscriptions = /* @__PURE__ */ new Set();\n const actionCallbacks = /* @__PURE__ */ new Set();\n const notifySubscribers = (state2) => {\n subscriptions.forEach((callback) => callback(state2));\n actionCallbacks.forEach((callback) => callback(state2));\n };\n const defaultActions = {\n patch$(payload) {\n if (!payload) {\n warn(\"Patch payload is required\");\n return;\n }\n batch(() => {\n Object.assign(reactiveState, payload);\n });\n notifySubscribers(reactiveState);\n },\n subscribe$(callback) {\n if (!callback) {\n warn(\"Subscribe callback is required\");\n return;\n }\n subscriptions.add(callback);\n },\n unsubscribe$(callback) {\n subscriptions.delete(callback);\n },\n onAction$(callback) {\n if (!callback) {\n warn(\"Action callback is required\");\n return;\n }\n actionCallbacks.add(callback);\n },\n reset$() {\n batch(() => {\n Object.assign(reactiveState, initState);\n });\n notifySubscribers(reactiveState);\n }\n };\n const store = __spreadValues(__spreadProps(__spreadValues({}, reactiveState), {\n state: reactiveState\n }), defaultActions);\n if (getters) {\n for (const key in getters) {\n const getter = getters[key];\n if (getter) {\n let accessCount = 0;\n let lastWarnTime = 0;\n Object.defineProperty(store, key, {\n get() {\n {\n accessCount++;\n const now = Date.now();\n if (accessCount > 100 && now - lastWarnTime > 1e3) {\n warn(\n `Getter '${key}' has been accessed ${accessCount} times. Consider caching the result if the value is used frequently. Note: Getters are computed properties that recalculate on every access.`\n );\n lastWarnTime = now;\n accessCount = 0;\n }\n }\n return computed(() => getter.call(store, reactiveState)).value;\n },\n enumerable: true,\n configurable: true\n });\n }\n }\n }\n if (actions) {\n for (const key in actions) {\n const action = actions[key];\n if (action) {\n store[key] = (...args) => {\n const result = action.apply(reactiveState, args);\n actionCallbacks.forEach((callback) => callback(reactiveState));\n return result;\n };\n }\n }\n }\n return store;\n}\nfunction createClassStore(StoreClass) {\n const instance = new StoreClass();\n const state = /* @__PURE__ */ Object.create(null);\n const getters = {};\n const actions = {};\n Object.getOwnPropertyNames(instance).forEach((key) => {\n state[key] = instance[key];\n });\n Object.getOwnPropertyNames(StoreClass.prototype).forEach((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(StoreClass.prototype, key);\n if (descriptor) {\n if (isFunction(descriptor.get)) {\n getters[key] = function() {\n return descriptor.get.call(this);\n };\n } else if (isFunction(descriptor.value) && key !== \"constructor\") {\n actions[key] = function(...args) {\n return descriptor.value.apply(this, args);\n };\n }\n }\n });\n return {\n state,\n getters,\n actions\n };\n}\nfunction createStore(storeDefinition) {\n if (!storeDefinition) {\n warn(\"Store definition is required\");\n throw new Error(\"Store definition is required\");\n }\n return () => {\n let options;\n if (isFunction(storeDefinition)) {\n options = createClassStore(storeDefinition);\n } else {\n options = storeDefinition;\n }\n const store = createOptionsStore(options);\n if (isFunction(storeDefinition)) {\n Object.keys(options.actions || {}).forEach((key) => {\n store[key] = options.actions[key].bind(store);\n });\n }\n return store;\n };\n}\nvar _a4, _b;\nvar RefImpl = class extends (_b = SignalImpl, _a4 = \"_IS_REF\" /* IS_REF */, _b) {\n /**\n * Creates a new ref with the given initial value.\n *\n * @param value - The initial value\n */\n constructor(value) {\n super(value, true);\n // @ts-ignore\n this[_a4] = true;\n }\n get value() {\n track(this, SIGNAL_KEY);\n return this._value;\n }\n set value(newValue) {\n if (isSignal(newValue)) {\n newValue = newValue.value;\n }\n if (isRef(newValue)) {\n newValue = newValue.value;\n }\n if (hasChanged(this._value, newValue)) {\n this._value = newValue;\n if (this.subLink) {\n shallowPropagate2(this.subLink);\n }\n trigger(this, \"SET\", SIGNAL_KEY);\n }\n }\n};\nfunction ref(value = void 0) {\n if (isRef(value)) {\n return value;\n }\n if (isSignal(value)) {\n return new RefImpl(value.peek());\n }\n return new RefImpl(value);\n}\nfunction isRef(value) {\n return !!value && !!value[\"_IS_REF\" /* IS_REF */];\n}\nvar INITIAL_WATCHER_VALUE = {};\nvar cleanupMap = /* @__PURE__ */ new WeakMap();\nfunction traverse(value, seen = /* @__PURE__ */ new Set()) {\n if (!isObject(value) || seen.has(value)) {\n return value;\n }\n seen.add(value);\n if (isSignal(value) || isComputed(value)) {\n return traverse(value.value, seen);\n }\n if (Array.isArray(value)) {\n for (const element of value) {\n traverse(element, seen);\n }\n } else if (isMap(value)) {\n value.forEach((v) => {\n traverse(v, seen);\n });\n value.keys();\n value.values();\n } else if (isSet(value)) {\n value.forEach((v) => {\n traverse(v, seen);\n });\n value.values();\n } else {\n Object.keys(value).forEach((key) => {\n traverse(value[key], seen);\n });\n }\n return value;\n}\nfunction cloneValue(value) {\n if (!isObject(value)) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneValue(item));\n }\n if (isMap(value)) {\n const cloned2 = /* @__PURE__ */ new Map();\n value.forEach((v, k) => {\n cloned2.set(k, cloneValue(v));\n });\n return cloned2;\n }\n if (isSet(value)) {\n const cloned2 = /* @__PURE__ */ new Set();\n value.forEach((v) => {\n cloned2.add(cloneValue(v));\n });\n return cloned2;\n }\n const cloned = {};\n for (const key of Object.keys(value)) {\n cloned[key] = cloneValue(value[key]);\n }\n return cloned;\n}\nfunction resolveSource(source) {\n if (Array.isArray(source)) {\n return () => source.map((s) => {\n if (isSignal(s) || isComputed(s)) {\n return s.value;\n }\n if (isReactive(s)) {\n return traverse(s);\n }\n if (isFunction(s)) {\n return s();\n }\n return s;\n });\n }\n if (isFunction(source)) {\n return source;\n }\n if (isSignal(source)) {\n return () => source.value;\n }\n if (isObject(source) && \"value\" in source) {\n return () => source.value;\n }\n if (isReactive(source)) {\n return () => traverse(source);\n }\n return () => source;\n}\nfunction watch(source, callback, options = {}) {\n const { immediate = false, deep = false } = options;\n let oldValue = INITIAL_WATCHER_VALUE;\n const getter = resolveSource(source);\n const job = () => {\n const currentEffect = runner.effect;\n if (!currentEffect.run) {\n return;\n }\n const newValue = currentEffect.run();\n if (hasChanged(newValue, oldValue)) {\n callback(newValue, oldValue === INITIAL_WATCHER_VALUE ? void 0 : oldValue);\n oldValue = cloneValue(newValue);\n }\n };\n const runner = effect(\n () => {\n const value = getter();\n if (deep) {\n traverse(value);\n }\n return value;\n },\n {\n // Use scheduler to queue job, implementing async and debouncing.\n scheduler: () => queueJob(job)\n }\n );\n if (immediate) {\n job();\n } else {\n oldValue = cloneValue(runner.effect.run());\n }\n return () => {\n runner.stop();\n const cleanups = cleanupMap.get(runner.effect);\n if (cleanups) {\n cleanups.forEach((fn) => fn());\n cleanupMap.delete(runner.effect);\n }\n };\n}\n\nexport { TriggerOpTypes, batch, computed, createStore, effect, endBatch, getBatchDepth, isBatching, isComputed, isEffect, isReactive, isRef, isShallow, isSignal, memoEffect, nextTick, queueJob, queuePreFlushCb, reactive, ref, shallowReactive, shallowSignal, signal, startBatch, stop, toRaw, toReactive, trigger, untrack, watch };\n","import { isComputed, isSignal } from '@estjs/signals';\nimport { normalizeClassName, normalizeStyle, styleToString } from '@estjs/shared';\n\n/**\n * Normalize component properties\n *\n * Special handling for class and style attributes, converting them to normalized format\n *\n * @param props - Original component properties\n * @returns Normalized component properties\n */\nexport function normalizeProps(props: Record<string, any> | null): Record<string, any> | null {\n if (!props) {\n return null;\n }\n\n const { class: className, style } = props;\n\n // Normalize class attribute\n if (className && typeof className !== 'string') {\n props.class = normalizeClassName(className);\n }\n\n // Normalize style attribute\n if (style) {\n props.style = normalizeStyle(style);\n }\n\n return props;\n}\n\n/**\n * Generate server-side rendering attribute string\n *\n * Generate HTML-compatible attribute string based on attribute type, handling special cases:\n * - Automatic unwrapping of reactive values\n * - Normalization of special attributes (style/class)\n * - Ignoring event attributes\n * - Special handling for boolean attributes\n *\n * @param attrName - Attribute name\n * @param attrValue - Attribute value\n * @param hydrationId - Hydration ID (for client-side reuse)\n * @returns Formatted HTML attribute string\n */\nexport function setSSGAttr(attrName: string, attrValue: any, hydrationId: string): string {\n // Handle reactive values (signals or computed values)\n if (isSignal(attrValue) || isComputed(attrValue)) {\n return setSSGAttr(attrName, attrValue.value, hydrationId);\n }\n\n // Ignore null, undefined, and false value attributes\n if (!attrValue && attrValue !== 0) {\n return '';\n }\n\n // Special attribute handling: style\n if (attrName === 'style') {\n const normalizedStyle = normalizeStyle(attrValue);\n if (!normalizedStyle) {\n return '';\n }\n\n if (typeof normalizedStyle === 'string') {\n return ` style=\"${normalizedStyle}\"`;\n }\n\n return ` style=\"${styleToString(normalizedStyle)}\"`;\n }\n\n // Special attribute handling: class\n if (attrName === 'class') {\n const normalizedClassName = normalizeClassName(attrValue);\n return normalizedClassName ? ` class=\"${normalizedClassName}\"` : '';\n }\n\n // Ignore event handler attributes (client-side behavior)\n if (attrName.startsWith('on')) {\n return '';\n }\n\n // Special handling for boolean attributes\n if (attrValue === true) {\n return ` ${attrName}`;\n }\n\n // Standard attribute handling\n return ` ${attrName}=\"${attrValue}\"`;\n}\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/render.ts","../../signals/dist/signals.dev.esm.js","../src/attrs.ts"],"names":["convertToString","content","isSvg","isNil","isString","isArray","item","isFunction","ROOT_ELEMENT_REGEX","INDEX_ATTRIBUTE_REGEX","COMMENT_REGEX","addAttributes","htmlContent","hydrationId","renderToString","component","props","error","resetHydrationKey","scope","createScope","result","runWithScope","disposeScope","render","templates","hydrationKey","components","parts","templateLen","componentLen","i","createSSGComponent","isSignal","value","isComputed","normalizeProps","className","style","normalizeClassName","normalizeStyle","setSSGAttr","attrName","attrValue","normalizedStyle","styleToString","normalizedClassName"],"mappings":"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","file":"server.cjs.js","sourcesContent":["import { isArray, isFunction, isNil, isString } from '@estjs/shared';\n\n/**\n * Convert content to string for SSR output\n *\n * @param content - the content to convert\n * @param isSvg - whether the content is SVG\n * @returns the content as a string\n */\nexport function convertToString(content: unknown, isSvg = false): string {\n if (isNil(content)) {\n return '';\n }\n\n if (isString(content)) {\n return content;\n }\n\n if (isArray(content)) {\n return (content as unknown[]).map((item: unknown) => convertToString(item, isSvg)).join('');\n }\n\n if (isFunction(content)) {\n return convertToString((content as () => unknown)(), isSvg);\n }\n\n return String(content);\n}\n\n/** Regex to match the root element */\n// eslint-disable-next-line regexp/no-super-linear-backtracking\nconst ROOT_ELEMENT_REGEX = /^<([a-z]+)(\\s*)([^>]*)>/i;\n/** Regex to match data-idx attributes */\nconst INDEX_ATTRIBUTE_REGEX = /data-idx=\"(\\d+)\"/g;\n/** Regex to match HTML comments */\nconst COMMENT_REGEX = /<!--(.*?)-->/g;\n\n/**\n * Add hydration attributes to HTML content\n *\n * @param htmlContent - the html content\n * @param hydrationId - the hydration id\n * @returns the html content with hydration attributes\n */\nexport function addAttributes(htmlContent: string, hydrationId: string): string {\n return htmlContent\n .replace(ROOT_ELEMENT_REGEX, `<$1$2$3 data-hk=\"${hydrationId}\">`)\n .replaceAll(INDEX_ATTRIBUTE_REGEX, `data-idx=\"${hydrationId}-$1\"`)\n .replaceAll(COMMENT_REGEX, `<!--${hydrationId}-$1-->`);\n}\n","import { error, isFunction } from '@estjs/shared';\nimport {\n type ComponentFn,\n type ComponentProps,\n createScope,\n disposeScope,\n resetHydrationKey,\n runWithScope,\n} from '@estjs/template';\nimport { addAttributes, convertToString } from './utils';\n\n/**\n * Render a component to HTML string\n * @param {ComponentFn} component - the component to render\n * @param {ComponentProps} props - the props to pass to the component\n * @returns {string} the rendered HTML string\n */\nexport function renderToString<P extends ComponentProps = ComponentProps>(\n component: ComponentFn<P>,\n props: P | ComponentProps = {},\n): string {\n if (!isFunction(component)) {\n error('Component must be a function');\n return '';\n }\n\n // Reset the hydration key counter\n resetHydrationKey();\n\n // Create root scope for SSR to support provide/inject\n const scope = createScope(null);\n\n let result: unknown;\n try {\n // Render the component within scope\n result = runWithScope(scope, () => component(props as P));\n } finally {\n // Clean up scope after rendering\n disposeScope(scope);\n }\n\n // Convert the result to string\n return convertToString(result);\n}\n\n/**\n * Render template with components (used by babel plugin in SSG mode)\n * @param {string[]} templates - the template fragments\n * @param {string} hydrationKey - the hydration key\n * @param {...string[]} components - the rendered component strings\n * @returns {string} the rendered HTML string\n */\nexport function render(templates: string[], hydrationKey: string, ...components: string[]): string {\n /**\n * JSX source code:\n * <div>\n * <div>\n * <Component1 />\n * <Component2 />\n * </div>\n * <Component3 />\n * </div>\n *\n * Compiles to:\n *\n * let _tmpl = [\n * '<div><div>',\n * '</div>',\n * '</div>',\n * ]\n *\n * function component(props) {\n * return render(_tmpl, getHydrationKey(),\n * createSSGComponent(Component1, {}),\n * createSSGComponent(Component2, {}),\n * createSSGComponent(Component3, {})\n * );\n * }\n */\n\n // Build content using array join for better performance\n const parts: string[] = [];\n const templateLen = templates.length;\n const componentLen = components.length;\n\n for (let i = 0; i < templateLen; i++) {\n parts.push(templates[i]);\n if (i < componentLen && components[i]) {\n parts.push(convertToString(components[i]));\n }\n }\n\n const content = parts.join('');\n\n // Add hydration key attribute\n return addAttributes(content, hydrationKey);\n}\n\n/**\n * Create a SSG component (renders component to string)\n * @param {ComponentFn} component - the component to create\n * @param {ComponentProps} props - the props to pass to the component\n * @returns {string} the rendered component as a string\n */\nexport function createSSGComponent<P extends ComponentProps = ComponentProps>(\n component: ComponentFn<P>,\n props: P | ComponentProps = {},\n): string {\n if (!isFunction(component)) {\n error('createSSGComponent: Component is not a function');\n return '';\n }\n\n // Create child scope inheriting from current active scope (if any)\n // This allows nested components to access parent's provided values\n const scope = createScope();\n\n let result: unknown;\n try {\n // Render the component within scope\n result = runWithScope(scope, () => component(props as P));\n } finally {\n // Clean up scope after rendering\n disposeScope(scope);\n }\n\n return convertToString(result);\n}\n","import { isFunction, isObject, warn, error, isPlainObject, hasChanged, isArray, isSet, isMap, isWeakMap, isWeakSet, hasOwn, isStringNumber } from '@estjs/shared';\n\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// src/constants.ts\nvar TriggerOpTypes = {\n SET: \"SET\",\n ADD: \"ADD\",\n DELETE: \"DELETE\",\n CLEAR: \"CLEAR\"\n};\nvar ARRAY_KEY = /* @__PURE__ */ Symbol(\"Array_Key\" );\nvar COLLECTION_KEY = /* @__PURE__ */ Symbol(\"Collection_Key\" );\nvar WEAK_COLLECTION_KEY = /* @__PURE__ */ Symbol(\"WeakCollection_Key\" );\nvar ITERATE_KEY = /* @__PURE__ */ Symbol(\"Iterate_Key\" );\nvar ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\"Array_Iterate_Key\" );\n\n// src/propagation.ts\nfunction enqueueEffect(effect2) {\n var _a5;\n (_a5 = effect2 == null ? void 0 : effect2.notify) == null ? void 0 : _a5.call(effect2);\n}\nfunction propagate(link) {\n let next = link.nextSubLink;\n let stack;\n top: do {\n const sub = link.subNode;\n const watcherBit = sub.flag & 2 /* WATCHING */;\n let flags = sub.flag;\n if (!(flags & (16 /* DIRTY */ | 32 /* PENDING */ | 8 /* RECURSED */ | 4 /* RECURSED_CHECK */))) {\n sub.flag = flags | 32 /* PENDING */;\n if (watcherBit) {\n enqueueEffect(sub);\n }\n } else if (!(flags & (8 /* RECURSED */ | 4 /* RECURSED_CHECK */))) {\n flags = 0 /* NONE */;\n } else if (!(flags & 4 /* RECURSED_CHECK */)) {\n sub.flag = flags & -9 /* RECURSED */ | 32 /* PENDING */;\n } else if (!(flags & (16 /* DIRTY */ | 32 /* PENDING */)) && isValidLink(link, sub)) {\n sub.flag = flags | (8 /* RECURSED */ | 32 /* PENDING */);\n if (watcherBit) {\n enqueueEffect(sub);\n }\n flags &= 1 /* MUTABLE */;\n } else {\n flags = 0 /* NONE */;\n }\n if (flags & 1 /* MUTABLE */) {\n const subSubs = sub.subLink;\n if (subSubs !== void 0) {\n const nextSub = subSubs.nextSubLink;\n if (nextSub !== void 0) {\n stack = { value: next, prev: stack };\n next = nextSub;\n }\n link = subSubs;\n continue;\n }\n }\n if ((link = next) !== void 0) {\n next = link.nextSubLink;\n continue;\n }\n while (stack !== void 0) {\n link = stack.value;\n stack = stack.prev;\n if (link !== void 0) {\n next = link.nextSubLink;\n continue top;\n }\n }\n break;\n } while (true);\n}\nfunction shallowPropagate(link) {\n while (link) {\n const sub = link.subNode;\n const flags = sub.flag;\n if ((flags & (32 /* PENDING */ | 16 /* DIRTY */)) === 32 /* PENDING */) {\n sub.flag = flags | 16 /* DIRTY */;\n if ((flags & (2 /* WATCHING */ | 4 /* RECURSED_CHECK */)) === 2 /* WATCHING */) {\n enqueueEffect(sub);\n }\n }\n link = link.nextSubLink;\n }\n}\n\n// src/link.ts\nvar currentLinkVersion = 0;\nvar activeSub;\nvar isUntracking = false;\nfunction linkReactiveNode(depNode, subNode) {\n if (isUntracking) {\n return void 0;\n }\n const prevDep = subNode.depLinkTail;\n if (prevDep && prevDep.depNode === depNode) {\n return prevDep;\n }\n const nextDep = prevDep ? prevDep.nextDepLink : subNode.depLink;\n if (nextDep && nextDep.depNode === depNode) {\n nextDep.version = currentLinkVersion;\n subNode.depLinkTail = nextDep;\n return nextDep;\n }\n const prevSub = depNode.subLinkTail;\n if (prevSub && prevSub.version === currentLinkVersion && prevSub.subNode === subNode) {\n subNode.depLinkTail = prevSub;\n return prevSub;\n }\n const newLink = {\n version: currentLinkVersion,\n depNode,\n subNode,\n // Subscriber chain pointers (horizontal)\n prevSubLink: prevSub,\n nextSubLink: void 0,\n // Dependency chain pointers (vertical)\n prevDepLink: prevDep,\n nextDepLink: nextDep\n };\n if (nextDep) {\n nextDep.prevDepLink = newLink;\n }\n if (prevDep) {\n prevDep.nextDepLink = newLink;\n } else {\n subNode.depLink = newLink;\n }\n if (prevSub) {\n prevSub.nextSubLink = newLink;\n } else {\n depNode.subLink = newLink;\n }\n depNode.subLinkTail = newLink;\n subNode.depLinkTail = newLink;\n {\n if (subNode.onTrack && isFunction(subNode == null ? void 0 : subNode.onTrack)) {\n subNode.onTrack({\n effect: subNode,\n target: depNode,\n type: \"get\",\n key: void 0\n });\n }\n }\n return newLink;\n}\nfunction unlinkReactiveNode(linkNode, subNode = linkNode.subNode) {\n const depNode = linkNode.depNode;\n const prevSub = linkNode.prevSubLink;\n const nextSub = linkNode.nextSubLink;\n const prevDep = linkNode.prevDepLink;\n const nextDep = linkNode.nextDepLink;\n if (nextDep) {\n nextDep.prevDepLink = prevDep;\n } else {\n subNode.depLinkTail = prevDep;\n }\n if (prevDep) {\n prevDep.nextDepLink = nextDep;\n } else {\n subNode.depLink = nextDep;\n }\n if (nextSub) {\n nextSub.prevSubLink = prevSub;\n } else {\n depNode.subLinkTail = prevSub;\n }\n if (prevSub) {\n prevSub.nextSubLink = nextSub;\n } else {\n depNode.subLink = nextSub;\n if (nextSub === void 0) {\n let toRemove = depNode.depLink;\n while (toRemove) {\n toRemove = unlinkReactiveNode(toRemove, depNode);\n }\n depNode.depLinkTail = void 0;\n depNode.flag |= 16 /* DIRTY */;\n {\n if (depNode.depLink) {\n error(\n \"[Link] Cascading cleanup failed: depNode still has dependency links. This indicates a bug in the unlinking logic.\"\n );\n }\n }\n }\n }\n return nextDep;\n}\nfunction checkDirty(link, sub) {\n let stack;\n let checkDepth = 0;\n let dirty = false;\n top: do {\n let currentDirty = false;\n if (sub.flag & 16 /* DIRTY */) {\n currentDirty = true;\n } else {\n const dep = link.depNode;\n const depFlags = dep.flag;\n if ((depFlags & (1 /* MUTABLE */ | 16 /* DIRTY */)) === (1 /* MUTABLE */ | 16 /* DIRTY */)) {\n const subs = dep.subLink;\n if (subs && subs.nextSubLink) {\n shallowPropagate2(subs);\n }\n currentDirty = true;\n } else if ((depFlags & (1 /* MUTABLE */ | 32 /* PENDING */)) === (1 /* MUTABLE */ | 32 /* PENDING */)) {\n if (dep.depLink) {\n stack = { link, prev: stack };\n link = dep.depLink;\n sub = dep;\n ++checkDepth;\n continue top;\n } else {\n dep.flag &= -33 /* PENDING */;\n }\n } else if (depFlags & 32 /* PENDING */) {\n dep.flag &= -33 /* PENDING */;\n }\n }\n if (!currentDirty && link.nextDepLink !== void 0) {\n link = link.nextDepLink;\n continue top;\n }\n dirty = currentDirty;\n while (checkDepth--) {\n link = stack.link;\n stack = stack.prev;\n sub = link.subNode;\n const checkedDep = link.depNode;\n if (dirty) {\n checkedDep.flag = checkedDep.flag & -33 /* PENDING */ | 16 /* DIRTY */;\n } else {\n checkedDep.flag &= -33 /* PENDING */;\n }\n if (checkedDep.flag & 16 /* DIRTY */) {\n dirty = true;\n }\n if (!dirty && link.nextDepLink !== void 0) {\n link = link.nextDepLink;\n continue top;\n }\n }\n if (dirty) {\n sub.flag = sub.flag & -33 /* PENDING */ | 16 /* DIRTY */;\n } else {\n sub.flag &= -33 /* PENDING */;\n }\n return dirty;\n } while (true);\n}\nfunction shallowPropagate2(link) {\n while (link) {\n const sub = link.subNode;\n const flags = sub.flag;\n if ((flags & (32 /* PENDING */ | 16 /* DIRTY */)) === 32 /* PENDING */) {\n sub.flag = flags | 16 /* DIRTY */;\n }\n link = link.nextSubLink;\n }\n}\nfunction setActiveSub(sub) {\n const prev = activeSub;\n activeSub = sub;\n return prev;\n}\nfunction startTracking(sub) {\n currentLinkVersion++;\n sub.depLinkTail = void 0;\n sub.flag = sub.flag & -57 | 4 /* RECURSED_CHECK */;\n return setActiveSub(sub);\n}\nfunction endTracking(sub, prevSub) {\n activeSub = prevSub;\n const depsTail = sub.depLinkTail;\n let toRemove = depsTail ? depsTail.nextDepLink : sub.depLink;\n while (toRemove) {\n toRemove = unlinkReactiveNode(toRemove, sub);\n }\n sub.flag &= -5 /* RECURSED_CHECK */;\n}\nfunction untrack(fn) {\n const prevSub = setActiveSub(void 0);\n const prevUntracking = isUntracking;\n isUntracking = true;\n try {\n return fn();\n } finally {\n isUntracking = prevUntracking;\n setActiveSub(prevSub);\n }\n}\nfunction isValidLink(checkLink, sub) {\n let link = sub.depLinkTail;\n while (link) {\n if (link === checkLink) {\n return true;\n }\n link = link.prevDepLink;\n }\n return false;\n}\nvar targetMap = /* @__PURE__ */ new WeakMap();\nvar triggerVersion = 0;\nfunction collectTriggeredEffects(dep, effects, version) {\n if (!dep) {\n return;\n }\n dep.forEach((effect2) => {\n if (effect2.flag & 2 /* WATCHING */ && !effect2._active) {\n dep.delete(effect2);\n return;\n }\n if (effect2._triggerVersion === version) {\n return;\n }\n effect2._triggerVersion = version;\n effects.push(effect2);\n });\n}\nfunction track(target, key) {\n if (!activeSub || isUntracking) {\n return;\n }\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n depsMap = /* @__PURE__ */ new Map();\n targetMap.set(target, depsMap);\n }\n let dep = depsMap.get(key);\n if (!dep) {\n dep = /* @__PURE__ */ new Set();\n depsMap.set(key, dep);\n }\n const sizeBefore = dep.size ;\n dep.add(activeSub);\n if (dep.size !== sizeBefore && isFunction(activeSub.onTrack)) {\n activeSub.onTrack({\n effect: activeSub,\n target,\n type: \"get\",\n key\n });\n }\n}\nfunction trigger(target, type, key, newValue) {\n var _a5;\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const effects = [];\n const version = ++triggerVersion;\n if (key !== void 0) {\n if (Array.isArray(key)) {\n for (const element of key) {\n collectTriggeredEffects(depsMap.get(element), effects, version);\n }\n } else {\n collectTriggeredEffects(depsMap.get(key), effects, version);\n }\n }\n if (type === \"ADD\" || type === \"DELETE\" || type === \"CLEAR\") {\n const iterationKey = Array.isArray(target) ? ARRAY_ITERATE_KEY : ITERATE_KEY;\n collectTriggeredEffects(depsMap.get(iterationKey), effects, version);\n }\n for (const effect2 of effects) {\n if (isFunction(effect2.onTrigger)) {\n effect2.onTrigger({\n effect: effect2,\n target,\n type,\n key,\n newValue\n });\n }\n if (effect2.flag & 2 /* WATCHING */) {\n (_a5 = effect2.notify) == null ? void 0 : _a5.call(effect2);\n } else if (effect2.flag & 1 /* MUTABLE */) {\n effect2.flag |= 16 /* DIRTY */;\n if (effect2.subLink) {\n propagate(effect2.subLink);\n }\n }\n }\n}\nvar reactiveCaches = /* @__PURE__ */ new WeakMap();\nfunction toRaw(value) {\n if (!value || !isObject(value)) {\n return value;\n }\n const raw = value[\"_RAW\" /* RAW */];\n if (raw) {\n return toRaw(raw);\n }\n if (isSignal(value)) {\n return toRaw(value.peek());\n }\n return value;\n}\nvar arrayInstrumentations = createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n const instrumentations = {};\n [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n let res = arr[key](...args);\n if ((res === -1 || res === false) && args.length > 0) {\n const rawArgs = args.map((arg) => toRaw(arg));\n res = arr[key](...rawArgs);\n }\n return res;\n };\n });\n [\"find\", \"findIndex\", \"findLast\", \"findLastIndex\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_ITERATE_KEY);\n const res = arr[key](...args);\n if ((key === \"find\" || key === \"findLast\") && isObject(res) && !isShallowMode) {\n return reactiveImpl(res);\n }\n return res;\n };\n });\n [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\", \"sort\", \"reverse\", \"fill\", \"copyWithin\"].forEach(\n (key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const res = Array.prototype[key].apply(arr, args);\n trigger(arr, TriggerOpTypes.SET, [ARRAY_KEY, ARRAY_ITERATE_KEY]);\n return res;\n };\n }\n );\n [\"toReversed\", \"toSorted\", \"toSpliced\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_ITERATE_KEY);\n if (key === \"toSpliced\") {\n for (let i = 0, l = arr.length; i < l; i++) {\n track(arr, `${i}`);\n }\n }\n const res = Array.prototype[key].apply(arr, args);\n if (!Array.isArray(res)) {\n return res;\n }\n return res.map((item) => isObject(item) ? reactiveImpl(item, isShallowMode) : item);\n };\n });\n [\"concat\", \"slice\", \"filter\", \"map\", \"flatMap\", \"flat\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n const res = Array.prototype[key].apply(arr, args);\n return res;\n };\n });\n [\"join\", \"toString\", \"toLocaleString\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n return Array.prototype[key].apply(arr, args);\n };\n });\n [\"values\", \"keys\", \"entries\", Symbol.iterator].forEach((key) => {\n instrumentations[key] = function() {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_KEY);\n const rawIterator = key === Symbol.iterator ? arr[Symbol.iterator]() : arr[key]();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (Array.isArray(value)) {\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v, isShallowMode) : v),\n done\n };\n }\n return {\n value: isObject(value) ? reactiveImpl(value, isShallowMode) : value,\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n });\n return instrumentations;\n}\nvar arrayHandlers = (shallow) => ({\n get: (target, key, receiver) => {\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_IS_SHALLOW\" /* IS_SHALLOW */) {\n return shallow;\n }\n if (hasOwn(arrayInstrumentations, key)) {\n return arrayInstrumentations[key];\n }\n const value = Reflect.get(target, key, receiver);\n if (isStringNumber(key)) {\n track(target, key);\n }\n track(target, ARRAY_KEY);\n if (isObject(value) && !shallow) {\n return reactiveImpl(value);\n }\n return value;\n },\n set: (target, key, value, receiver) => {\n const oldValue = Reflect.get(target, key, receiver);\n const result = Reflect.set(target, key, value, receiver);\n if (hasChanged(value, oldValue)) {\n if (isStringNumber(key)) {\n trigger(target, TriggerOpTypes.SET, [key, ARRAY_ITERATE_KEY, ARRAY_KEY]);\n } else {\n trigger(target, TriggerOpTypes.SET, key);\n }\n }\n return result;\n }\n});\nvar shallowArrayHandlers = arrayHandlers(true);\nvar deepArrayHandlers = arrayHandlers(false);\nvar collectionHandlers = {\n get(target, key) {\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n return Reflect.get(\n hasOwn(collectionInstrumentations, key) ? collectionInstrumentations : target,\n key,\n target\n );\n }\n};\nvar weakCollectionHandlers = {\n get(target, key) {\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n return Reflect.get(\n hasOwn(weakInstrumentations, key) && key in target ? weakInstrumentations : target,\n key,\n target\n );\n }\n};\nvar collectionInstrumentations = {\n get(key) {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n const value = target.get(key);\n if (isObject(value) && !isShallow(this)) {\n return reactiveImpl(value);\n }\n return value;\n },\n set(key, value) {\n const target = toRaw(this);\n const hadKey = target.has(key);\n const oldValue = target.get(key);\n const rawValue = toRaw(value);\n target.set(key, rawValue);\n if (!hadKey || hasChanged(oldValue, rawValue)) {\n trigger(target, TriggerOpTypes.SET, COLLECTION_KEY);\n }\n return this;\n },\n add(value) {\n const target = toRaw(this);\n const rawValue = toRaw(value);\n const hadValue = target.has(rawValue);\n target.add(rawValue);\n if (!hadValue) {\n trigger(target, TriggerOpTypes.ADD, COLLECTION_KEY);\n } else {\n trigger(target, TriggerOpTypes.SET, COLLECTION_KEY);\n }\n return this;\n },\n has(key) {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n const hasKey = target.has(key);\n if (!hasKey && isObject(key)) {\n return target.has(toRaw(key));\n }\n return hasKey;\n },\n delete(key) {\n const target = toRaw(this);\n const hadKey = target.has(key);\n let result = target.delete(key);\n if (!result && isObject(key)) {\n result = target.delete(toRaw(key));\n }\n if (hadKey || result) {\n trigger(target, TriggerOpTypes.DELETE, COLLECTION_KEY);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size > 0;\n const result = target.clear();\n if (hadItems) {\n trigger(target, TriggerOpTypes.CLEAR, COLLECTION_KEY);\n }\n return result;\n },\n forEach(callback, thisArg) {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n target.forEach((value, key) => {\n const wrappedValue = isShallowMode || !isObject(value) ? value : reactiveImpl(value);\n const wrappedKey = isShallowMode || !isObject(key) ? key : reactiveImpl(key);\n callback.call(thisArg, wrappedValue, wrappedKey, this);\n });\n },\n [Symbol.iterator]() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target[Symbol.iterator]();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (isShallowMode) {\n return { value, done };\n }\n if (Array.isArray(value)) {\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v) : v),\n done\n };\n }\n return {\n value: isObject(value) ? reactiveImpl(value) : value,\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n get size() {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n return target.size;\n },\n keys() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.keys();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n return {\n value: isShallowMode || !isObject(value) ? value : reactiveImpl(value),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n values() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.values();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n return {\n value: isShallowMode || !isObject(value) ? value : reactiveImpl(value),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n entries() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.entries();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (isShallowMode) {\n return { value, done };\n }\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v) : v),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n }\n};\nvar weakInstrumentations = {\n get(key) {\n const target = toRaw(this);\n track(target, WEAK_COLLECTION_KEY);\n let value = target.get(key);\n if (value === void 0 && isReactive(key)) {\n value = target.get(toRaw(key));\n }\n if (isObject(value) && !isShallow(this)) {\n return reactiveImpl(value);\n }\n return value;\n },\n set(key, value) {\n const target = toRaw(this);\n const rawKey = toRaw(key);\n const hadKey = target.has(rawKey);\n const oldValue = target.get(rawKey);\n const rawValue = toRaw(value);\n target.set(rawKey, rawValue);\n if (!hadKey || hasChanged(oldValue, rawValue)) {\n trigger(target, TriggerOpTypes.SET, WEAK_COLLECTION_KEY);\n }\n return this;\n },\n add(value) {\n const target = toRaw(this);\n const rawValue = toRaw(value);\n const hadValue = target.has(rawValue);\n target.add(rawValue);\n if (!hadValue) {\n trigger(target, TriggerOpTypes.ADD, WEAK_COLLECTION_KEY);\n }\n return this;\n },\n has(key) {\n const target = toRaw(this);\n track(target, WEAK_COLLECTION_KEY);\n let hasKey = target.has(key);\n if (!hasKey && isReactive(key)) {\n hasKey = target.has(toRaw(key));\n }\n return hasKey;\n },\n delete(key) {\n const target = toRaw(this);\n const rawKey = toRaw(key);\n const hadKey = target.has(rawKey);\n const result = target.delete(rawKey);\n if (hadKey || result) {\n trigger(target, TriggerOpTypes.DELETE, WEAK_COLLECTION_KEY);\n }\n return result;\n }\n};\nvar objectHandlers = (shallow) => ({\n get(target, key, receiver) {\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_IS_SHALLOW\" /* IS_SHALLOW */) {\n return shallow;\n }\n const value = Reflect.get(target, key, receiver);\n const valueUnwrapped = isSignal(value) ? value.value : value;\n track(target, key);\n if (isObject(valueUnwrapped) && !shallow) {\n return reactiveImpl(valueUnwrapped);\n }\n return valueUnwrapped;\n },\n set: (target, key, value, receiver) => {\n const oldValue = Reflect.get(target, key, receiver);\n const result = Reflect.set(target, key, toRaw(value), receiver);\n if (hasChanged(value, oldValue)) {\n trigger(target, TriggerOpTypes.SET, key, value);\n }\n return result;\n },\n deleteProperty: (target, key) => {\n const hadKey = hasOwn(target, key);\n const result = Reflect.deleteProperty(target, key);\n if (hadKey && result) {\n trigger(target, TriggerOpTypes.DELETE, key, void 0);\n }\n return result;\n }\n});\nvar shallowObjectHandlers = objectHandlers(true);\nvar deepObjectHandlers = objectHandlers(false);\nfunction reactiveImpl(target, shallow = false) {\n if (!isObject(target)) {\n return target;\n }\n if (isReactive(target)) {\n return target;\n }\n const existingProxy = reactiveCaches.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n let handler;\n if (isArray(target)) {\n handler = shallow ? shallowArrayHandlers : deepArrayHandlers;\n } else if (isSet(target) || isMap(target)) {\n handler = collectionHandlers;\n } else if (isWeakMap(target) || isWeakSet(target)) {\n handler = weakCollectionHandlers;\n } else {\n handler = shallow ? shallowObjectHandlers : deepObjectHandlers;\n }\n const proxy = new Proxy(target, handler);\n reactiveCaches.set(target, proxy);\n return proxy;\n}\nfunction isReactive(target) {\n return !!(target && target[\"_IS_REACTIVE\" /* IS_REACTIVE */]);\n}\nfunction reactive(target) {\n if (isReactive(target)) {\n return target;\n }\n if (isSignal(target)) {\n return target;\n }\n return reactiveImpl(target);\n}\nfunction shallowReactive(target) {\n if (isReactive(target)) {\n return target;\n }\n if (isSignal(target)) {\n return target;\n }\n return reactiveImpl(target, true);\n}\nfunction isShallow(value) {\n return !!(value && value[\"_IS_SHALLOW\" /* IS_SHALLOW */]);\n}\nvar toReactive = (value) => isObject(value) ? reactive(value) : value;\n\n// src/signal.ts\nvar _a;\n_a = \"_IS_SIGNAL\" /* IS_SIGNAL */;\nvar SignalImpl = class {\n /**\n * Create a new Signal with the given initial value.\n *\n * @param value - Initial value\n * @param shallow - Whether only the top level should be reactive\n */\n constructor(value, shallow = false) {\n this.flag = 1 /* MUTABLE */;\n // Mark whether it's shallow reactive\n // @ts-ignore: used internally by isSignal typeguard\n this[_a] = true;\n const unwrapped = toRaw(value);\n this._rawValue = unwrapped;\n this[\"_IS_SHALLOW\" /* IS_SHALLOW */] = shallow;\n if (!isObject(unwrapped)) {\n this._value = unwrapped;\n } else {\n if (isReactive(value)) {\n this._value = value;\n } else {\n this._value = shallow ? shallowReactive(unwrapped) : reactive(unwrapped);\n }\n }\n }\n // dep getter, returns itself for dependency collection\n get dep() {\n return this;\n }\n get value() {\n const sub = activeSub;\n if (sub) {\n linkReactiveNode(this, sub);\n }\n const flags = this.flag;\n if (flags & 16 /* DIRTY */ && this.shouldUpdate()) {\n const subs = this.subLink;\n if (subs) {\n shallowPropagate2(subs);\n }\n }\n return this._value;\n }\n // value setter, triggers update when value changes\n set value(newValue) {\n if (isSignal(newValue)) {\n {\n warn(\n \"Setting a signal value to another signal is not recommended. The value will be unwrapped automatically.\"\n );\n }\n newValue = newValue.peek();\n }\n const originalValue = newValue;\n const rawValue = toRaw(newValue);\n if (!hasChanged(this._rawValue, rawValue)) {\n return;\n }\n this._oldValue = this._rawValue;\n this._rawValue = rawValue;\n this.flag |= 16 /* DIRTY */;\n if (!isObject(rawValue)) {\n this._value = rawValue;\n } else if (isReactive(originalValue)) {\n this._value = originalValue;\n } else {\n const shallow = this[\"_IS_SHALLOW\" /* IS_SHALLOW */];\n this._value = shallow ? shallowReactive(rawValue) : reactive(rawValue);\n }\n const subs = this.subLink;\n if (subs) {\n propagate(subs);\n }\n }\n // Check if the value should be updated\n shouldUpdate() {\n this.flag &= -17 /* DIRTY */;\n if (!(\"_oldValue\" in this)) {\n return true;\n }\n const changed = hasChanged(this._oldValue, this._rawValue);\n this._oldValue = this._rawValue;\n return changed;\n }\n // Get current value without triggering dependency tracking\n peek() {\n return this._value;\n }\n // set method is an alias for the value setter\n set(value) {\n this.value = value;\n }\n // Update value using an updater function\n update(updater) {\n const nextValue = updater(this.peek());\n if (isSignal(nextValue)) {\n {\n warn(\n \"Returning a signal from an update function is not recommended. The value will be unwrapped.\"\n );\n }\n this.value = nextValue.peek();\n } else {\n this.value = nextValue;\n }\n }\n};\nfunction signal(value) {\n if (isSignal(value)) {\n {\n warn(\n \"Creating a signal with another signal is not recommended. The value will be unwrapped.\"\n );\n }\n return value;\n }\n return new SignalImpl(value);\n}\nfunction shallowSignal(value) {\n if (isSignal(value)) {\n value = value.peek();\n }\n return new SignalImpl(value, true);\n}\nfunction isSignal(value) {\n return !!value && !!value[\"_IS_SIGNAL\" /* IS_SIGNAL */];\n}\nvar queue = /* @__PURE__ */ new Set();\nvar activePreFlushCbs = /* @__PURE__ */ new Set();\nvar p = Promise.resolve();\nvar isFlushPending = false;\nfunction nextTick(fn) {\n return fn ? p.then(fn) : p;\n}\nfunction queueJob(job) {\n queue.add(job);\n queueFlush();\n}\nfunction queueFlush() {\n if (!isFlushPending) {\n isFlushPending = true;\n nextTick(flushJobs);\n }\n}\nfunction queuePreFlushCb(cb) {\n activePreFlushCbs.add(cb);\n queueFlush();\n}\nfunction flushJobs() {\n isFlushPending = false;\n flushPreFlushCbs();\n while (queue.size > 0) {\n for (const job of queue) {\n try {\n job();\n } catch (_error) {\n {\n error(\"Error executing queued job:\", _error);\n }\n }\n }\n queue.clear();\n }\n}\nfunction flushPreFlushCbs() {\n const callbacks = Array.from(activePreFlushCbs);\n activePreFlushCbs.clear();\n for (const callback of callbacks) {\n try {\n callback();\n } catch (_error) {\n {\n error(\"Error executing pre-flush callback:\", _error);\n }\n }\n }\n}\nfunction createScheduler(effect2, flush) {\n switch (flush) {\n case \"sync\":\n return () => effect2();\n case \"pre\":\n return () => queuePreFlushCb(effect2);\n case \"post\":\n return () => queueJob(effect2);\n default:\n {\n warn(`Invalid flush timing: ${flush}. Defaulting to 'post'.`);\n }\n return () => queueJob(effect2);\n }\n}\n\n// src/batch.ts\nvar batchDepth = 0;\nfunction batch(fn) {\n startBatch();\n try {\n return fn();\n } finally {\n endBatch();\n }\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (batchDepth === 0) {\n warn(\n \"[Batch] endBatch() called without matching startBatch(). This indicates unbalanced batch calls in your code. Make sure every startBatch() has a corresponding endBatch(), or use the batch() function which handles this automatically.\"\n );\n return;\n }\n batchDepth--;\n if (batchDepth === 0) {\n flushJobs();\n }\n}\nfunction isBatching() {\n return batchDepth > 0;\n}\nfunction getBatchDepth() {\n return batchDepth;\n}\n\n// src/effect.ts\nvar _a2;\n_a2 = \"_IS_EFFECT\" /* IS_EFFECT */;\nvar EffectImpl = class {\n /**\n * Create an Effect instance\n *\n * @param fn - The effect function\n * @param options - Configuration options\n */\n constructor(fn, options) {\n this.flag = 2 /* WATCHING */ | 16 /* DIRTY */;\n // @ts-ignore: used internally by isEffect typeguard\n this[_a2] = true;\n // State management\n this._active = true;\n var _a5;\n this.fn = fn;\n if (options) {\n const scheduler = (_a5 = options.scheduler) != null ? _a5 : options.flush;\n if (scheduler) {\n this._flushScheduler = isFunction(scheduler) ? () => scheduler(this) : createScheduler(() => this.run(), scheduler);\n }\n if (options.onStop) this.onStop = options.onStop;\n {\n if (options.onTrack) this.onTrack = options.onTrack;\n if (options.onTrigger) this.onTrigger = options.onTrigger;\n }\n }\n }\n /**\n * Check if the Effect is active\n */\n get active() {\n return this._active;\n }\n /**\n * Check if the Effect is dirty (needs re-execution)\n */\n get dirty() {\n const flags = this.flag;\n if (flags & 16 /* DIRTY */) {\n return true;\n }\n if (flags & 32 /* PENDING */) {\n if (this.depLink && checkDirty(this.depLink, this)) {\n this.flag = flags & -33 /* PENDING */ | 16 /* DIRTY */;\n return true;\n }\n this.flag = flags & -33 /* PENDING */;\n }\n return false;\n }\n /**\n * Pause Effect execution\n *\n * When an effect is paused:\n * - It stops responding to dependency changes\n * - Notifications are ignored (see notify method)\n * - DIRTY and PENDING flags are still set when dependencies change\n * - The effect remains active and maintains its dependency links\n *\n * Use cases:\n * - Temporarily disable effects during bulk updates\n * - Prevent effects from running during initialization\n * - Control when side effects should execute\n *\n * @example\n * ```typescript\n * const count = signal(0);\n * const runner = effect(() => console.log(count.value));\n *\n * runner.effect.pause();\n * count.value = 1; // Effect won't run\n * count.value = 2; // Effect won't run\n * runner.effect.resume(); // Effect runs once with latest value\n * ```\n */\n pause() {\n this.flag |= 256 /* PAUSED */;\n }\n /**\n * Resume Effect execution\n *\n * When an effect is resumed:\n * - The PAUSED flag is cleared\n * - If dependencies changed during pause (DIRTY or PENDING flags set),\n * the effect executes immediately via notify()\n * - If no changes occurred, the effect simply becomes active again\n *\n * State management:\n * - Clears PAUSED flag atomically\n * - Checks for accumulated DIRTY/PENDING flags\n * - Triggers execution if needed\n *\n * @example\n * ```typescript\n * const count = signal(0);\n * const runner = effect(() => console.log(count.value));\n *\n * runner.effect.pause();\n * count.value = 1; // Queued\n * count.value = 2; // Queued\n * runner.effect.resume(); // Executes once with count.value = 2\n * ```\n */\n resume() {\n const flags = this.flag;\n const nextFlags = flags & -257 /* PAUSED */;\n this.flag = nextFlags;\n const wasDirty = (nextFlags & 16 /* DIRTY */) !== 0;\n const wasPending = (nextFlags & 32 /* PENDING */) !== 0;\n if (wasDirty || wasPending) {\n this.notify();\n }\n }\n /**\n * Execute the Effect function\n *\n * Core execution flow:\n * 1. Check if active\n * 2. Clear dirty flag\n * 3. Start tracking dependencies\n * 4. Execute user function\n * 5. End tracking, clean up stale dependencies\n \n * @returns The return value of the effect function\n */\n run() {\n if (!this._active) {\n return this.fn();\n }\n const flags = this.flag;\n this.flag = flags & -49 | 512 /* RUNNING */;\n const prevSub = startTracking(this);\n try {\n return this.fn();\n } catch (error5) {\n this.flag |= 16 /* DIRTY */;\n throw error5;\n } finally {\n this.flag &= -513 /* RUNNING */;\n endTracking(this, prevSub);\n }\n }\n /**\n * Get or create the job function for this effect\n */\n getJob() {\n if (!this._job) {\n this._job = () => this.run();\n }\n return this._job;\n }\n /**\n * Notify that the Effect needs to execute\n *\n * Called by dependent reactive values.\n * Decides whether to execute immediately or defer based on scheduling strategy.\n */\n notify() {\n var _a5;\n const flags = this.flag;\n if (!this._active || flags & (256 /* PAUSED */ | 512 /* RUNNING */ | 16 /* DIRTY */)) {\n return;\n }\n this.flag = flags | 16 /* DIRTY */;\n if (this == null ? void 0 : this.onTrigger) {\n this.onTrigger({\n effect: this,\n target: {},\n type: \"set\"\n });\n }\n if (this._flushScheduler) {\n (_a5 = this._flushScheduler) == null ? void 0 : _a5.call(this);\n } else if (isBatching()) {\n queueJob(this.getJob());\n } else {\n this.run();\n }\n }\n /**\n * Stop the Effect\n *\n * After stopping:\n * - No longer responds to dependency changes\n * - Disconnects all dependency links\n * - Clears cached job function\n * - Calls onStop callback\n * - Verifies complete cleanup in development mode\n */\n stop() {\n if (!this._active) {\n {\n warn(\"[Effect] Attempting to stop an already stopped effect.\");\n }\n return;\n }\n this._active = false;\n let dep = this.depLink;\n while (dep) {\n dep = unlinkReactiveNode(dep, this);\n }\n let sub = this.subLink;\n while (sub) {\n sub = unlinkReactiveNode(sub);\n }\n this._job = void 0;\n this._flushScheduler = void 0;\n this.depLinkTail = void 0;\n this.subLinkTail = void 0;\n {\n if (this.depLink) {\n error(\n \"[Effect] Cleanup verification failed: depLink not cleared. This indicates a memory leak in the dependency tracking system.\"\n );\n }\n if (this.subLink) {\n error(\n \"[Effect] Cleanup verification failed: subLink not cleared. This indicates a memory leak in the subscription system.\"\n );\n }\n }\n if (this == null ? void 0 : this.onStop) {\n this.onStop();\n }\n }\n};\nfunction effect(fn, options) {\n const effectInstance = new EffectImpl(fn, options);\n try {\n effectInstance.run();\n } catch (_error) {\n effectInstance.stop();\n {\n error(\n \"[Effect] Effect failed during initial execution and has been stopped. Fix the error in your effect function.\",\n _error\n );\n }\n throw _error;\n }\n const runner = () => effectInstance.run();\n runner.effect = effectInstance;\n runner.stop = () => effectInstance.stop();\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nfunction isEffect(value) {\n return !!(value && value[\"_IS_EFFECT\" /* IS_EFFECT */]);\n}\nfunction memoEffect(fn, initialState, options) {\n let currentState = initialState;\n const effectFn = () => {\n const result = fn(currentState);\n currentState = result;\n };\n return effect(effectFn, options);\n}\nvar NO_VALUE = /* @__PURE__ */ Symbol(\"computed-no-value\");\nvar _a3;\n_a3 = \"_IS_COMPUTED\" /* IS_COMPUTED */;\nvar ComputedImpl = class {\n /**\n * Create a Computed instance\n *\n * @param getter - The computation function\n * @param setter - Optional setter function\n * @param onTrack - Optional debug callback for dependency tracking\n * @param onTrigger - Optional debug callback for triggers\n */\n constructor(getter, setter, onTrack, onTrigger) {\n this.flag = 1 /* MUTABLE */ | 16 /* DIRTY */;\n // @ts-ignore: used internally by isComputed typeguard\n this[_a3] = true;\n // Cache\n // Use symbol sentinel to distinguish \"no value\" from undefined/null values\n this._value = NO_VALUE;\n this.getter = getter;\n this.setter = setter;\n this.onTrack = onTrack;\n this.onTrigger = onTrigger;\n this.flag |= 16 /* DIRTY */;\n }\n get value() {\n if (activeSub) {\n linkReactiveNode(this, activeSub);\n }\n const flags = this.flag;\n const hasValue = this._value !== NO_VALUE;\n if (hasValue && !(flags & (16 /* DIRTY */ | 32 /* PENDING */))) {\n return this._value;\n }\n if (!hasValue || flags & 16 /* DIRTY */) {\n this.recompute();\n return this._value;\n }\n if (flags & 32 /* PENDING */) {\n if (this.depLink && checkDirty(this.depLink, this)) {\n this.recompute();\n } else {\n this.flag = flags & -33 /* PENDING */;\n }\n }\n return this._value;\n }\n /**\n * Set value (only effective when setter is provided)\n *\n * @param newValue - The new value\n */\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else {\n warn(\n \"[Computed] Cannot set readonly computed value. Provide a setter in the computed options to make it writable.\\nExample: computed({ get: () => value, set: (v) => { ... } })\"\n );\n }\n }\n /**\n * Read value without tracking dependencies\n *\n * @returns Current value\n */\n peek() {\n if (this._value === NO_VALUE) {\n this.recompute();\n }\n return this._value;\n }\n /**\n * Recompute the value\n *\n * computation logic:\n * 1. Start tracking dependencies\n * 2. Execute getter function\n * 3. Check if value changed using optimized comparison\n * 4. If changed, update cache and notify subscribers\n * 5. End tracking, clean up stale dependencies\n * @private\n */\n recompute() {\n const oldValue = this._value;\n const hadValue = oldValue !== NO_VALUE;\n const prevSub = startTracking(this);\n try {\n const newValue = this.getter();\n const flags = this.flag;\n const subs = this.subLink;\n const clearMask = ~(16 /* DIRTY */ | 32 /* PENDING */);\n const valueChanged = !hadValue || hasChanged(oldValue, newValue);\n if (valueChanged) {\n this._value = newValue;\n this.flag = flags & clearMask;\n if (this.onTrigger) {\n this.onTrigger({\n effect: this,\n target: this,\n type: \"set\",\n key: \"value\",\n newValue\n });\n }\n if (subs) {\n shallowPropagate(subs);\n }\n } else {\n this.flag = flags & clearMask;\n }\n } catch (_error) {\n const clearMask = -49;\n this.flag &= clearMask;\n this._value = NO_VALUE;\n {\n error(\n \"[Computed] Error occurred while computing value.\\nThe computed will retry on next access.\\nCommon causes:\\n - Accessing undefined properties\\n - Circular dependencies\\n - Exceptions in getter function\\nCheck your getter function for errors.\",\n _error\n );\n }\n throw _error;\n } finally {\n endTracking(this, prevSub);\n }\n }\n /**\n * Check if update is needed\n *\n * Internal use, called by reactive system.\n *\n * @returns true if value changed\n */\n shouldUpdate() {\n const hadValue = this._value !== NO_VALUE;\n const oldValue = this._value;\n this.recompute();\n if (!hadValue) {\n return true;\n }\n return hasChanged(this._value, oldValue);\n }\n};\nfunction computed(getterOrOptions) {\n if (isComputed(getterOrOptions)) {\n {\n warn(\n \"[Computed] Creating a computed from another computed is not recommended. The existing computed will be returned to avoid unnecessary wrapping.\"\n );\n }\n return getterOrOptions;\n }\n if (!getterOrOptions) {\n throw new Error(\n \"[Computed] Invalid argument: computed() requires a getter function or options object.\"\n );\n }\n if (isFunction(getterOrOptions)) {\n return new ComputedImpl(getterOrOptions);\n }\n if (isPlainObject(getterOrOptions)) {\n const { get, set, onTrack, onTrigger } = getterOrOptions;\n if (!get) {\n throw new Error(\n \"[Computed] Invalid options: getter function is required.\\nUsage: computed({ get: () => value, set: (v) => { ... } })\"\n );\n }\n if (!isFunction(get)) {\n throw new TypeError(\n `[Computed] Invalid options: getter must be a function.\nReceived: ${typeof get}`\n );\n }\n return new ComputedImpl(get, set, onTrack, onTrigger);\n }\n throw new Error(\n `[Computed] Invalid argument: expected a function or options object.\nReceived: ${typeof getterOrOptions}`\n );\n}\nfunction isComputed(value) {\n return !!value && !!value[\"_IS_COMPUTED\" /* IS_COMPUTED */];\n}\nfunction createOptionsStore(options) {\n if (!options.state) {\n warn(\"Store state is required\");\n throw new Error(\"Store state is required\");\n }\n const { state, getters, actions } = options;\n const initState = __spreadValues({}, state);\n const reactiveState = reactive(state);\n const subscriptions = /* @__PURE__ */ new Set();\n const actionCallbacks = /* @__PURE__ */ new Set();\n const notifySubscribers = (state2) => {\n subscriptions.forEach((callback) => callback(state2));\n actionCallbacks.forEach((callback) => callback(state2));\n };\n const defaultActions = {\n patch$(payload) {\n if (!payload) {\n warn(\"Patch payload is required\");\n return;\n }\n batch(() => {\n Object.assign(reactiveState, payload);\n });\n notifySubscribers(reactiveState);\n },\n subscribe$(callback) {\n if (!callback) {\n warn(\"Subscribe callback is required\");\n return;\n }\n subscriptions.add(callback);\n },\n unsubscribe$(callback) {\n subscriptions.delete(callback);\n },\n onAction$(callback) {\n if (!callback) {\n warn(\"Action callback is required\");\n return;\n }\n actionCallbacks.add(callback);\n },\n reset$() {\n batch(() => {\n Object.assign(reactiveState, initState);\n });\n notifySubscribers(reactiveState);\n }\n };\n const store = __spreadValues(__spreadProps(__spreadValues({}, reactiveState), {\n state: reactiveState\n }), defaultActions);\n if (getters) {\n for (const key in getters) {\n const getter = getters[key];\n if (!getter) continue;\n Object.defineProperty(store, key, {\n get: () => computed(() => getter.call(store, reactiveState)).value,\n enumerable: true,\n configurable: true\n });\n }\n }\n if (actions) {\n for (const key in actions) {\n const action = actions[key];\n if (action) {\n Reflect.set(store, key, (...args) => {\n const result = action.apply(reactiveState, args);\n actionCallbacks.forEach((callback) => callback(reactiveState));\n return result;\n });\n }\n }\n }\n return store;\n}\nfunction createClassStore(StoreClass) {\n const instance = new StoreClass();\n const state = /* @__PURE__ */ Object.create(null);\n const getters = {};\n const actions = {};\n Object.getOwnPropertyNames(instance).forEach((key) => {\n state[key] = instance[key];\n });\n Object.getOwnPropertyNames(StoreClass.prototype).forEach((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(StoreClass.prototype, key);\n if (descriptor) {\n if (typeof descriptor.get === \"function\") {\n getters[key] = function() {\n return descriptor.get.call(this);\n };\n } else if (typeof descriptor.value === \"function\" && key !== \"constructor\") {\n actions[key] = function(...args) {\n return descriptor.value.apply(this, args);\n };\n }\n }\n });\n return {\n state,\n getters,\n actions\n };\n}\nfunction createStore(storeDefinition) {\n if (!storeDefinition) {\n warn(\"Store definition is required\");\n throw new Error(\"Store definition is required\");\n }\n return () => {\n let options;\n if (isFunction(storeDefinition)) {\n options = createClassStore(storeDefinition);\n } else {\n options = storeDefinition;\n }\n const store = createOptionsStore(options);\n if (isFunction(storeDefinition) && options.actions) {\n Object.keys(options.actions).forEach((key) => {\n Reflect.set(store, key, options.actions[key].bind(store));\n });\n }\n return store;\n };\n}\nvar _a4, _b;\nvar RefImpl = class extends (_b = SignalImpl, _a4 = \"_IS_REF\" /* IS_REF */, _b) {\n /**\n * Creates a new ref with the given initial value.\n *\n * @param value - The initial value\n */\n constructor(value) {\n super(value, true);\n // @ts-ignore: used internally by isRef typeguard\n this[_a4] = true;\n }\n get value() {\n const sub = activeSub;\n if (sub) {\n linkReactiveNode(this, sub);\n }\n return this._value;\n }\n set value(newValue) {\n if (isSignal(newValue)) {\n newValue = newValue.peek();\n }\n if (isRef(newValue)) {\n newValue = newValue.value;\n }\n if (hasChanged(this._value, newValue)) {\n this._rawValue = newValue;\n this._value = newValue;\n this.flag |= 16 /* DIRTY */;\n if (this.subLink) {\n propagate(this.subLink);\n }\n }\n }\n};\nfunction ref(value = void 0) {\n if (isRef(value)) {\n return value;\n }\n if (isSignal(value)) {\n return new RefImpl(value.peek());\n }\n return new RefImpl(value);\n}\nfunction isRef(value) {\n return !!value && !!value[\"_IS_REF\" /* IS_REF */];\n}\nvar INITIAL_WATCHER_VALUE = {};\nvar cleanupMap = /* @__PURE__ */ new WeakMap();\nfunction traverse(value, seen = /* @__PURE__ */ new Set()) {\n if (!isObject(value) || seen.has(value)) {\n return value;\n }\n seen.add(value);\n if (isSignal(value) || isComputed(value)) {\n return traverse(value.value, seen);\n }\n if (Array.isArray(value)) {\n for (const element of value) {\n traverse(element, seen);\n }\n } else if (isMap(value)) {\n value.forEach((v) => {\n traverse(v, seen);\n });\n value.keys();\n value.values();\n } else if (isSet(value)) {\n value.forEach((v) => {\n traverse(v, seen);\n });\n value.values();\n } else {\n Object.keys(value).forEach((key) => {\n traverse(value[key], seen);\n });\n }\n return value;\n}\nfunction cloneValue(value) {\n if (!isObject(value)) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneValue(item));\n }\n if (isMap(value)) {\n const cloned2 = /* @__PURE__ */ new Map();\n value.forEach((v, k) => {\n cloned2.set(k, cloneValue(v));\n });\n return cloned2;\n }\n if (isSet(value)) {\n const cloned2 = /* @__PURE__ */ new Set();\n value.forEach((v) => {\n cloned2.add(cloneValue(v));\n });\n return cloned2;\n }\n const cloned = {};\n for (const key of Object.keys(value)) {\n cloned[key] = cloneValue(value[key]);\n }\n return cloned;\n}\nfunction resolveSource(source) {\n if (Array.isArray(source)) {\n return () => source.map((s) => {\n if (isSignal(s) || isComputed(s)) {\n return s.value;\n }\n if (isReactive(s)) {\n return traverse(s);\n }\n if (isFunction(s)) {\n return s();\n }\n return s;\n });\n }\n if (isFunction(source)) {\n return source;\n }\n if (isSignal(source)) {\n return () => source.value;\n }\n if (isObject(source) && \"value\" in source) {\n return () => source.value;\n }\n if (isReactive(source)) {\n return () => traverse(source);\n }\n return () => source;\n}\nfunction watch(source, callback, options = {}) {\n const { immediate = false, deep = false } = options;\n let oldValue = INITIAL_WATCHER_VALUE;\n const getter = resolveSource(source);\n const job = () => {\n const currentEffect = runner.effect;\n if (!currentEffect.run) {\n return;\n }\n const newValue = currentEffect.run();\n if (hasChanged(newValue, oldValue)) {\n callback(newValue, oldValue === INITIAL_WATCHER_VALUE ? void 0 : oldValue);\n oldValue = cloneValue(newValue);\n }\n };\n const runner = effect(\n () => {\n const value = getter();\n if (deep) {\n traverse(value);\n }\n return value;\n },\n {\n // Use scheduler to queue job, implementing async and debouncing.\n scheduler: () => queueJob(job)\n }\n );\n if (immediate) {\n job();\n } else {\n oldValue = cloneValue(runner.effect.run());\n }\n return () => {\n runner.stop();\n const cleanups = cleanupMap.get(runner.effect);\n if (cleanups) {\n cleanups.forEach((fn) => fn());\n cleanupMap.delete(runner.effect);\n }\n };\n}\n\nexport { TriggerOpTypes, batch, computed, createStore, effect, endBatch, getBatchDepth, isBatching, isComputed, isEffect, isReactive, isRef, isShallow, isSignal, memoEffect, nextTick, queueJob, queuePreFlushCb, reactive, ref, shallowReactive, shallowSignal, signal, startBatch, stop, toRaw, toReactive, trigger, untrack, watch };\n","import { isComputed, isSignal } from '@estjs/signals';\nimport { isString, normalizeClassName, normalizeStyle, styleToString } from '@estjs/shared';\n\n/**\n * Normalize component properties\n *\n * Special handling for class and style attributes, converting them to normalized format\n *\n * @param props - Original component properties\n * @returns Normalized component properties\n */\nexport function normalizeProps(props: Record<string, any> | null): Record<string, any> | null {\n if (!props) {\n return null;\n }\n\n const { class: className, style } = props;\n\n // Normalize class attribute\n if (className && !isString(className)) {\n props.class = normalizeClassName(className);\n }\n\n // Normalize style attribute\n if (style) {\n props.style = normalizeStyle(style);\n }\n\n return props;\n}\n\n/**\n * Generate server-side rendering attribute string\n *\n * Generate HTML-compatible attribute string based on attribute type, handling special cases:\n * - Automatic unwrapping of reactive values\n * - Normalization of special attributes (style/class)\n * - Ignoring event attributes\n * - Special handling for boolean attributes\n *\n * @param attrName - Attribute name\n * @param attrValue - Attribute value\n * @param hydrationId - Hydration ID (for client-side reuse)\n * @returns Formatted HTML attribute string\n */\nexport function setSSGAttr(attrName: string, attrValue: any, hydrationId: string): string {\n // Handle reactive values (signals or computed values)\n if (isSignal(attrValue) || isComputed(attrValue)) {\n return setSSGAttr(attrName, attrValue.value, hydrationId);\n }\n\n // Ignore null, undefined, and false value attributes\n if (!attrValue && attrValue !== 0) {\n return '';\n }\n\n // Special attribute handling: style\n if (attrName === 'style') {\n const normalizedStyle = normalizeStyle(attrValue);\n if (!normalizedStyle) {\n return '';\n }\n\n if (isString(normalizedStyle)) {\n return ` style=\"${normalizedStyle}\"`;\n }\n\n return ` style=\"${styleToString(normalizedStyle)}\"`;\n }\n\n // Special attribute handling: class\n if (attrName === 'class') {\n const normalizedClassName = normalizeClassName(attrValue);\n return normalizedClassName ? ` class=\"${normalizedClassName}\"` : '';\n }\n\n // Ignore event handler attributes (client-side behavior)\n if (attrName.startsWith('on')) {\n return '';\n }\n\n // Special handling for boolean attributes\n if (attrValue === true) {\n return ` ${attrName}`;\n }\n\n // Standard attribute handling\n return ` ${attrName}=\"${attrValue}\"`;\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {isNil,isString,isArray,isFunction,error,normalizeClassName,normalizeStyle,styleToString}from'@estjs/shared';export{escapeHTML}from'@estjs/shared';import {resetHydrationKey,createScope,runWithScope,disposeScope}from'@estjs/template';function S(t,e=false){return isNil(t)?"":isString(t)?t:isArray(t)?t.map(r=>S(r,e)).join(""):isFunction(t)?S(t(),e):String(t)}var ut=/^<([a-z]+)(\s*)([^>]*)>/i,ft=/data-idx="(\d+)"/g,lt=/<!--(.*?)-->/g;function C(t,e){return t.replace(ut,`<$1$2$3 data-hk="${e}">`).replaceAll(ft,`data-idx="${e}-$1"`).replaceAll(lt,`<!--${e}-$1-->`)}function pt(t,e={}){if(!isFunction(t))return error("Component must be a function"),"";resetHydrationKey();let r=createScope(null),n;try{n=runWithScope(r,()=>t(e));}finally{disposeScope(r);}return S(n)}function dt(t,e,...r){let n=[],i=t.length,s=r.length;for(let c=0;c<i;c++)n.push(t[c]),c<s&&r[c]&&n.push(S(r[c]));let o=n.join("");return C(o,e)}function gt(t,e={}){if(!isFunction(t))return error("createSSGComponent: Component is not a function"),"";let r=createScope(),n;try{n=runWithScope(r,()=>t(e));}finally{disposeScope(r);}return S(n)}function m(t){return !!t&&!!t._IS_SIGNAL}Promise.resolve();function tt(t){return !!t&&!!t._IS_COMPUTED}function Mt(t){if(!t)return null;let{class:e,style:r}=t;return e&&typeof e!="string"&&(t.class=normalizeClassName(e)),r&&(t.style=normalizeStyle(r)),t}function nt(t,e,r){if(m(e)||tt(e))return nt(t,e.value);if(!e&&e!==0)return "";if(t==="style"){let n=normalizeStyle(e);return n?typeof n=="string"?` style="${n}"`:` style="${styleToString(n)}"`:""}if(t==="class"){let n=normalizeClassName(e);return n?` class="${n}"`:""}return t.startsWith("on")?"":e===true?` ${t}`:` ${t}="${e}"`}export{C as addAttributes,S as convertToString,gt as createSSGComponent,Mt as normalizeProps,dt as render,pt as renderToString,nt as setSSGAttr};//# sourceMappingURL=server.esm.js.map
1
+ import {isNil,isString,isArray,isFunction,error,normalizeClassName,normalizeStyle,styleToString}from'@estjs/shared';export{escapeHTML}from'@estjs/shared';import {resetHydrationKey,createScope,runWithScope,disposeScope}from'@estjs/template';function _(t,e=false){return isNil(t)?"":isString(t)?t:isArray(t)?t.map(r=>_(r,e)).join(""):isFunction(t)?_(t(),e):String(t)}var ft=/^<([a-z]+)(\s*)([^>]*)>/i,lt=/data-idx="(\d+)"/g,ht=/<!--(.*?)-->/g;function C(t,e){return t.replace(ft,`<$1$2$3 data-hk="${e}">`).replaceAll(lt,`data-idx="${e}-$1"`).replaceAll(ht,`<!--${e}-$1-->`)}function dt(t,e={}){if(!isFunction(t))return error("Component must be a function"),"";resetHydrationKey();let r=createScope(null),n;try{n=runWithScope(r,()=>t(e));}finally{disposeScope(r);}return _(n)}function gt(t,e,...r){let n=[],i=t.length,s=r.length;for(let c=0;c<i;c++)n.push(t[c]),c<s&&r[c]&&n.push(_(r[c]));let a=n.join("");return C(a,e)}function vt(t,e={}){if(!isFunction(t))return error("createSSGComponent: Component is not a function"),"";let r=createScope(),n;try{n=runWithScope(r,()=>t(e));}finally{disposeScope(r);}return _(n)}function S(t){return !!t&&!!t._IS_SIGNAL}Promise.resolve();function et(t){return !!t&&!!t._IS_COMPUTED}function Kt(t){if(!t)return null;let{class:e,style:r}=t;return e&&!isString(e)&&(t.class=normalizeClassName(e)),r&&(t.style=normalizeStyle(r)),t}function st(t,e,r){if(S(e)||et(e))return st(t,e.value);if(!e&&e!==0)return "";if(t==="style"){let n=normalizeStyle(e);return n?isString(n)?` style="${n}"`:` style="${styleToString(n)}"`:""}if(t==="class"){let n=normalizeClassName(e);return n?` class="${n}"`:""}return t.startsWith("on")?"":e===true?` ${t}`:` ${t}="${e}"`}export{C as addAttributes,_ as convertToString,vt as createSSGComponent,Kt as normalizeProps,gt as render,dt as renderToString,st as setSSGAttr};//# sourceMappingURL=server.esm.js.map
2
2
  //# sourceMappingURL=server.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/render.ts","../../signals/dist/signals.dev.esm.js","../src/attrs.ts"],"names":["convertToString","content","isSvg","isNil","isString","isArray","item","isFunction","ROOT_ELEMENT_REGEX","INDEX_ATTRIBUTE_REGEX","COMMENT_REGEX","addAttributes","htmlContent","hydrationId","renderToString","component","props","error","resetHydrationKey","scope","createScope","result","runWithScope","disposeScope","render","templates","hydrationKey","components","parts","templateLen","componentLen","i","createSSGComponent","isSignal","value","isComputed","normalizeProps","className","style","normalizeClassName","normalizeStyle","setSSGAttr","attrName","attrValue","normalizedStyle","styleToString","normalizedClassName"],"mappings":"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","file":"server.esm.js","sourcesContent":["import { isArray, isFunction, isNil, isString } from '@estjs/shared';\n\n/**\n * Convert content to string for SSR output\n *\n * @param content - the content to convert\n * @param isSvg - whether the content is SVG\n * @returns the content as a string\n */\nexport function convertToString(content: unknown, isSvg = false): string {\n if (isNil(content)) {\n return '';\n }\n\n if (isString(content)) {\n return content;\n }\n\n if (isArray(content)) {\n return (content as unknown[]).map((item: unknown) => convertToString(item, isSvg)).join('');\n }\n\n if (isFunction(content)) {\n return convertToString((content as () => unknown)(), isSvg);\n }\n\n return String(content);\n}\n\n/** Regex to match the root element */\nconst ROOT_ELEMENT_REGEX = /^<([a-z]+)(\\s*)([^>]*)>/i;\n/** Regex to match data-idx attributes */\nconst INDEX_ATTRIBUTE_REGEX = /data-idx=\"(\\d+)\"/g;\n/** Regex to match HTML comments */\nconst COMMENT_REGEX = /<!--(.*?)-->/g;\n\n/**\n * Add hydration attributes to HTML content\n *\n * @param htmlContent - the html content\n * @param hydrationId - the hydration id\n * @returns the html content with hydration attributes\n */\nexport function addAttributes(htmlContent: string, hydrationId: string): string {\n return htmlContent\n .replace(ROOT_ELEMENT_REGEX, `<$1$2$3 data-hk=\"${hydrationId}\">`)\n .replaceAll(INDEX_ATTRIBUTE_REGEX, `data-idx=\"${hydrationId}-$1\"`)\n .replaceAll(COMMENT_REGEX, `<!--${hydrationId}-$1-->`);\n}\n","import { error, isFunction } from '@estjs/shared';\nimport {\n type ComponentFn,\n type ComponentProps,\n createScope,\n disposeScope,\n resetHydrationKey,\n runWithScope,\n} from '@estjs/template';\nimport { addAttributes, convertToString } from './utils';\n\n/**\n * Render a component to HTML string\n * @param {ComponentFn} component - the component to render\n * @param {ComponentProps} props - the props to pass to the component\n * @returns {string} the rendered HTML string\n */\nexport function renderToString<P extends ComponentProps = ComponentProps>(\n component: ComponentFn<P>,\n props: P | ComponentProps = {},\n): string {\n if (!isFunction(component)) {\n error('Component must be a function');\n return '';\n }\n\n // Reset the hydration key counter\n resetHydrationKey();\n\n // Create root scope for SSR to support provide/inject\n const scope = createScope(null);\n\n let result: unknown;\n try {\n // Render the component within scope\n result = runWithScope(scope, () => component(props as P));\n } finally {\n // Clean up scope after rendering\n disposeScope(scope);\n }\n\n // Convert the result to string\n return convertToString(result);\n}\n\n/**\n * Render template with components (used by babel plugin in SSG mode)\n * @param {string[]} templates - the template fragments\n * @param {string} hydrationKey - the hydration key\n * @param {...string[]} components - the rendered component strings\n * @returns {string} the rendered HTML string\n */\nexport function render(templates: string[], hydrationKey: string, ...components: string[]): string {\n /**\n * JSX source code:\n * <div>\n * <div>\n * <Component1 />\n * <Component2 />\n * </div>\n * <Component3 />\n * </div>\n *\n * Compiles to:\n *\n * let _tmpl = [\n * '<div><div>',\n * '</div>',\n * '</div>',\n * ]\n *\n * function component(props) {\n * return render(_tmpl, getHydrationKey(),\n * createSSGComponent(Component1, {}),\n * createSSGComponent(Component2, {}),\n * createSSGComponent(Component3, {})\n * );\n * }\n */\n\n // Build content using array join for better performance\n const parts: string[] = [];\n const templateLen = templates.length;\n const componentLen = components.length;\n\n for (let i = 0; i < templateLen; i++) {\n parts.push(templates[i]);\n if (i < componentLen && components[i]) {\n parts.push(convertToString(components[i]));\n }\n }\n\n const content = parts.join('');\n\n // Add hydration key attribute\n return addAttributes(content, hydrationKey);\n}\n\n/**\n * Create a SSG component (renders component to string)\n * @param {ComponentFn} component - the component to create\n * @param {ComponentProps} props - the props to pass to the component\n * @returns {string} the rendered component as a string\n */\nexport function createSSGComponent<P extends ComponentProps = ComponentProps>(\n component: ComponentFn<P>,\n props: P | ComponentProps = {},\n): string {\n if (!isFunction(component)) {\n error('createSSGComponent: Component is not a function');\n return '';\n }\n\n // Create child scope inheriting from current active scope (if any)\n // This allows nested components to access parent's provided values\n const scope = createScope();\n\n let result: unknown;\n try {\n // Render the component within scope\n result = runWithScope(scope, () => component(props as P));\n } finally {\n // Clean up scope after rendering\n disposeScope(scope);\n }\n\n return convertToString(result);\n}\n","import { isFunction, isObject, warn, error, isPlainObject, hasChanged, isArray, isSet, isMap, isWeakMap, isWeakSet, hasOwn, isStringNumber } from '@estjs/shared';\n\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// src/constants.ts\nvar TriggerOpTypes = {\n SET: \"SET\",\n ADD: \"ADD\",\n DELETE: \"DELETE\",\n CLEAR: \"CLEAR\"\n};\nvar SIGNAL_KEY = /* @__PURE__ */ Symbol(\"Signal_Key\" );\nvar ARRAY_KEY = /* @__PURE__ */ Symbol(\"Array_Key\" );\nvar COLLECTION_KEY = /* @__PURE__ */ Symbol(\"Collection_Key\" );\nvar WEAK_COLLECTION_KEY = /* @__PURE__ */ Symbol(\"WeakCollection_Key\" );\nvar ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\"Array_Iterate_Key\" );\n\n// src/propagation.ts\nfunction propagate(link) {\n let next = link.nextSubLink;\n let stack;\n top: do {\n const sub = link.subNode;\n const queueBit = sub.flag & 64 /* QUEUED */;\n const watcherBit = sub.flag & 2 /* WATCHING */;\n let flags = sub.flag & -65 /* QUEUED */;\n if (!(flags & (16 /* DIRTY */ | 32 /* PENDING */ | 8 /* RECURSED */ | 4 /* RECURSED_CHECK */))) {\n sub.flag = queueBit | watcherBit | flags | 32 /* PENDING */;\n } else if (flags & (16 /* DIRTY */ | 32 /* PENDING */)) ; else if (!(flags & (8 /* RECURSED */ | 4 /* RECURSED_CHECK */))) {\n flags = 0 /* NONE */;\n sub.flag = queueBit | watcherBit;\n } else if (!(flags & 4 /* RECURSED_CHECK */)) {\n sub.flag = queueBit | watcherBit | (flags & -9 /* RECURSED */ | 32 /* PENDING */);\n } else if (!(flags & (16 /* DIRTY */ | 32 /* PENDING */)) && isValidLink(link, sub)) {\n sub.flag = queueBit | watcherBit | (flags | 8 /* RECURSED */ | 32 /* PENDING */);\n flags &= 1 /* MUTABLE */;\n } else {\n flags = 0 /* NONE */;\n sub.flag = queueBit | watcherBit;\n }\n if (sub.flag & 2 /* WATCHING */) {\n enqueueEffect(sub);\n }\n if (flags & 1 /* MUTABLE */) {\n const subSubs = sub.subLink;\n if (subSubs) {\n const nextSub = (link = subSubs).nextSubLink;\n if (nextSub) {\n stack = { value: next, prev: stack };\n next = nextSub;\n }\n continue;\n }\n }\n if (next) {\n link = next;\n next = link.nextSubLink;\n continue;\n }\n while (stack) {\n link = stack.value;\n stack = stack.prev;\n if (link) {\n next = link.nextSubLink;\n continue top;\n }\n }\n break;\n } while (true);\n}\nfunction shallowPropagate(link) {\n while (link) {\n const sub = link.subNode;\n const queueBit = sub.flag & 64 /* QUEUED */;\n const flags = sub.flag & -65 /* QUEUED */;\n if (!(flags & 16 /* DIRTY */) && flags & (1 /* MUTABLE */ | 32 /* PENDING */)) {\n const newFlags = queueBit | flags & -33 /* PENDING */ | 16 /* DIRTY */;\n sub.flag = newFlags;\n if (newFlags & 2 /* WATCHING */) {\n enqueueEffect(sub);\n }\n if (flags & 1 /* MUTABLE */ && sub.subLink) {\n shallowPropagate(sub.subLink);\n }\n }\n link = link.nextSubLink;\n }\n}\nfunction enqueueEffect(effect2) {\n if (!effect2.active) {\n return;\n }\n effect2.notify();\n}\n\n// src/link.ts\nvar currentLinkVersion = 0;\nvar activeSub;\nvar isUntracking = false;\nfunction linkReactiveNode(depNode, subNode) {\n if (isUntracking) {\n return void 0;\n }\n const prevDep = subNode.depLinkTail;\n if (prevDep && prevDep.depNode === depNode) {\n return prevDep;\n }\n const nextDep = prevDep ? prevDep.nextDepLink : subNode.depLink;\n if (nextDep && nextDep.depNode === depNode) {\n nextDep.version = currentLinkVersion;\n subNode.depLinkTail = nextDep;\n return nextDep;\n }\n const prevSub = depNode.subLinkTail;\n if (prevSub && prevSub.version === currentLinkVersion && prevSub.subNode === subNode) {\n subNode.depLinkTail = prevSub;\n return prevSub;\n }\n const newLink = {\n version: currentLinkVersion,\n depNode,\n subNode,\n // Subscriber chain pointers (horizontal)\n prevSubLink: prevSub,\n nextSubLink: void 0,\n // Dependency chain pointers (vertical)\n prevDepLink: prevDep,\n nextDepLink: nextDep\n };\n if (nextDep) {\n nextDep.prevDepLink = newLink;\n }\n if (prevDep) {\n prevDep.nextDepLink = newLink;\n } else {\n subNode.depLink = newLink;\n }\n if (prevSub) {\n prevSub.nextSubLink = newLink;\n } else {\n depNode.subLink = newLink;\n }\n depNode.subLinkTail = newLink;\n subNode.depLinkTail = newLink;\n {\n if (subNode.onTrack && isFunction(subNode == null ? void 0 : subNode.onTrack)) {\n subNode.onTrack({\n effect: subNode,\n target: depNode,\n type: \"get\",\n key: void 0\n });\n }\n }\n return newLink;\n}\nfunction unlinkReactiveNode(linkNode, subNode = linkNode.subNode) {\n const depNode = linkNode.depNode;\n const prevSub = linkNode.prevSubLink;\n const nextSub = linkNode.nextSubLink;\n const prevDep = linkNode.prevDepLink;\n const nextDep = linkNode.nextDepLink;\n if (nextDep) {\n nextDep.prevDepLink = prevDep;\n } else {\n subNode.depLinkTail = prevDep;\n }\n if (prevDep) {\n prevDep.nextDepLink = nextDep;\n } else {\n subNode.depLink = nextDep;\n }\n if (nextSub) {\n nextSub.prevSubLink = prevSub;\n } else {\n depNode.subLinkTail = prevSub;\n }\n if (prevSub) {\n prevSub.nextSubLink = nextSub;\n } else {\n depNode.subLink = nextSub;\n if (nextSub === void 0) {\n let toRemove = depNode.depLink;\n while (toRemove) {\n toRemove = unlinkReactiveNode(toRemove, depNode);\n }\n depNode.depLinkTail = void 0;\n depNode.flag |= 16 /* DIRTY */;\n {\n if (depNode.depLink) {\n error(\n \"[Link] Cascading cleanup failed: depNode still has dependency links. This indicates a bug in the unlinking logic.\"\n );\n }\n }\n }\n }\n linkNode.depNode = void 0;\n linkNode.subNode = void 0;\n linkNode.prevSubLink = void 0;\n linkNode.nextSubLink = void 0;\n linkNode.prevDepLink = void 0;\n linkNode.nextDepLink = void 0;\n return nextDep;\n}\nfunction checkDirty(link, sub) {\n const stack = [{ link, owner: sub }];\n const pendingNodes = [];\n while (stack.length > 0) {\n const frame = stack.pop();\n let current = frame.link;\n const owner = frame.owner;\n while (current) {\n const dep = current.depNode;\n const depFlags = dep.flag;\n if (owner.flag & 16 /* DIRTY */) {\n return true;\n }\n if ((depFlags & (1 /* MUTABLE */ | 16 /* DIRTY */)) === (1 /* MUTABLE */ | 16 /* DIRTY */)) {\n const subs = dep.subLink;\n if (subs && subs.nextSubLink) {\n shallowPropagate2(subs);\n }\n for (const node of pendingNodes) {\n if (node.flag & 32 /* PENDING */) {\n node.flag = node.flag & -33 /* PENDING */ | 16 /* DIRTY */;\n }\n }\n return true;\n }\n if ((depFlags & (1 /* MUTABLE */ | 32 /* PENDING */)) === (1 /* MUTABLE */ | 32 /* PENDING */)) {\n if (dep.depLink) {\n pendingNodes.push(dep);\n stack.push({ link: dep.depLink, owner: dep });\n } else {\n dep.flag &= -33 /* PENDING */;\n }\n } else if (depFlags & 32 /* PENDING */) {\n dep.flag &= -33 /* PENDING */;\n }\n current = current.nextDepLink;\n }\n }\n for (const node of pendingNodes) {\n node.flag &= -33 /* PENDING */;\n }\n if (sub.flag & 32 /* PENDING */) {\n sub.flag &= -33 /* PENDING */;\n }\n return false;\n}\nfunction shallowPropagate2(link) {\n while (link) {\n const sub = link.subNode;\n const queueBit = sub.flag & 64 /* QUEUED */;\n const flags = sub.flag & -65 /* QUEUED */;\n if ((flags & (32 /* PENDING */ | 16 /* DIRTY */)) === 32 /* PENDING */) {\n sub.flag = queueBit | flags | 16 /* DIRTY */;\n }\n link = link.nextSubLink;\n }\n}\nfunction setActiveSub(sub) {\n const prev = activeSub;\n activeSub = sub;\n return prev;\n}\nfunction startTracking(sub) {\n currentLinkVersion++;\n sub.depLinkTail = void 0;\n sub.flag = sub.flag & -57 | 4 /* RECURSED_CHECK */;\n return setActiveSub(sub);\n}\nfunction endTracking(sub, prevSub) {\n activeSub = prevSub;\n const depsTail = sub.depLinkTail;\n let toRemove = depsTail ? depsTail.nextDepLink : sub.depLink;\n while (toRemove) {\n toRemove = unlinkReactiveNode(toRemove, sub);\n }\n sub.flag &= -5 /* RECURSED_CHECK */;\n}\nfunction untrack(fn) {\n const prevSub = setActiveSub(void 0);\n const prevUntracking = isUntracking;\n isUntracking = true;\n try {\n return fn();\n } finally {\n isUntracking = prevUntracking;\n setActiveSub(prevSub);\n }\n}\nfunction isValidLink(checkLink, sub) {\n let link = sub.depLinkTail;\n while (link) {\n if (link === checkLink) {\n return true;\n }\n link = link.prevDepLink;\n }\n return false;\n}\nvar targetMap = /* @__PURE__ */ new WeakMap();\nfunction track(target, key) {\n if (!activeSub || isUntracking) {\n return;\n }\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n depsMap = /* @__PURE__ */ new Map();\n targetMap.set(target, depsMap);\n }\n let dep = depsMap.get(key);\n if (!dep) {\n dep = /* @__PURE__ */ new Set();\n depsMap.set(key, dep);\n }\n if (!dep.has(activeSub)) {\n dep.add(activeSub);\n if (isFunction(activeSub.onTrack)) {\n activeSub.onTrack({\n effect: activeSub,\n target,\n type: \"get\",\n key\n });\n }\n }\n}\nfunction trigger(target, type, key, newValue) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const effects = /* @__PURE__ */ new Set();\n if (key !== void 0) {\n if (Array.isArray(key)) {\n key.forEach((k) => {\n const dep = depsMap.get(k);\n if (dep) {\n dep.forEach((effect2) => effects.add(effect2));\n }\n });\n } else {\n const dep = depsMap.get(key);\n if (dep) {\n dep.forEach((effect2) => effects.add(effect2));\n }\n }\n }\n if (type === \"ADD\" || type === \"DELETE\" || type === \"CLEAR\") {\n const ITERATE_KEY = /* @__PURE__ */ Symbol(\"iterate\");\n const ARRAY_ITERATE_KEY2 = /* @__PURE__ */ Symbol(\"arrayIterate\");\n const iterationKey = Array.isArray(target) ? ARRAY_ITERATE_KEY2 : ITERATE_KEY;\n const iterationDep = depsMap.get(iterationKey);\n if (iterationDep) {\n iterationDep.forEach((effect2) => effects.add(effect2));\n }\n }\n effects.forEach((effect2) => {\n var _a5;\n if (isFunction(effect2.onTrigger)) {\n effect2.onTrigger({\n effect: effect2,\n target,\n type,\n key,\n newValue\n });\n }\n if (effect2.flag & 2 /* WATCHING */) {\n (_a5 = effect2.notify) == null ? void 0 : _a5.call(effect2);\n } else if (effect2.flag & 1 /* MUTABLE */) {\n effect2.flag |= 16 /* DIRTY */;\n if (effect2.subLink) {\n propagate(effect2.subLink);\n }\n }\n });\n}\nvar reactiveCaches = /* @__PURE__ */ new WeakMap();\nfunction toRaw(value) {\n if (!value || !isObject(value)) {\n return value;\n }\n const raw = value[\"_RAW\" /* RAW */];\n if (raw) {\n return toRaw(raw);\n }\n if (isSignal(value)) {\n return toRaw(value.peek());\n }\n return value;\n}\nvar arrayInstrumentations = createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n const instrumentations = {};\n [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n let res = arr[key](...args);\n if ((res === -1 || res === false) && args.length > 0) {\n const rawArgs = args.map((arg) => toRaw(arg));\n res = arr[key](...rawArgs);\n }\n return res;\n };\n });\n [\"find\", \"findIndex\", \"findLast\", \"findLastIndex\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_ITERATE_KEY);\n const res = arr[key](...args);\n if ((key === \"find\" || key === \"findLast\") && isObject(res) && !isShallowMode) {\n return reactiveImpl(res);\n }\n return res;\n };\n });\n [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\", \"sort\", \"reverse\", \"fill\", \"copyWithin\"].forEach(\n (key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const res = Array.prototype[key].apply(arr, args);\n trigger(arr, TriggerOpTypes.SET, ARRAY_KEY);\n trigger(arr, TriggerOpTypes.SET, ARRAY_ITERATE_KEY);\n return res;\n };\n }\n );\n [\"toReversed\", \"toSorted\", \"toSpliced\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_ITERATE_KEY);\n if (key === \"toSpliced\") {\n for (let i = 0, l = arr.length; i < l; i++) {\n track(arr, `${i}`);\n }\n }\n const res = Array.prototype[key].apply(arr, args);\n if (!Array.isArray(res)) {\n return res;\n }\n return res.map((item) => isObject(item) ? reactiveImpl(item, isShallowMode) : item);\n };\n });\n [\"concat\", \"slice\", \"filter\", \"map\", \"flatMap\", \"flat\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n const res = Array.prototype[key].apply(arr, args);\n return res;\n };\n });\n [\"join\", \"toString\", \"toLocaleString\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n return Array.prototype[key].apply(arr, args);\n };\n });\n [\"values\", \"keys\", \"entries\", Symbol.iterator].forEach((key) => {\n instrumentations[key] = function() {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_KEY);\n const rawIterator = key === Symbol.iterator ? arr[Symbol.iterator]() : arr[key]();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (Array.isArray(value)) {\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v, isShallowMode) : v),\n done\n };\n }\n return {\n value: isObject(value) ? reactiveImpl(value, isShallowMode) : value,\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n });\n return instrumentations;\n}\nvar arrayHandlers = (shallow) => ({\n get: (target, key, receiver) => {\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_IS_SHALLOW\" /* IS_SHALLOW */) {\n return shallow;\n }\n if (hasOwn(arrayInstrumentations, key)) {\n return arrayInstrumentations[key];\n }\n const value = Reflect.get(target, key, receiver);\n if (isStringNumber(key)) {\n track(target, key);\n }\n track(target, ARRAY_KEY);\n if (isObject(value) && !shallow) {\n return reactiveImpl(value);\n }\n return value;\n },\n set: (target, key, value, receiver) => {\n const oldValue = Reflect.get(target, key, receiver);\n const result = Reflect.set(target, key, value, receiver);\n if (hasChanged(value, oldValue)) {\n if (isStringNumber(key)) {\n trigger(target, TriggerOpTypes.SET, [key, ARRAY_ITERATE_KEY, ARRAY_KEY]);\n } else {\n trigger(target, TriggerOpTypes.SET, key);\n }\n }\n return result;\n }\n});\nvar shallowArrayHandlers = arrayHandlers(true);\nvar deepArrayHandlers = arrayHandlers(false);\nvar collectionHandlers = {\n get(target, key) {\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n return Reflect.get(\n hasOwn(collectionInstrumentations, key) ? collectionInstrumentations : target,\n key,\n target\n );\n }\n};\nvar weakCollectionHandlers = {\n get(target, key) {\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n return Reflect.get(\n hasOwn(weakInstrumentations, key) && key in target ? weakInstrumentations : target,\n key,\n target\n );\n }\n};\nvar collectionInstrumentations = {\n get(key) {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n const value = target.get(key);\n if (isObject(value) && !isShallow(this)) {\n return reactiveImpl(value);\n }\n return value;\n },\n set(key, value) {\n const target = toRaw(this);\n const hadKey = target.has(key);\n const oldValue = target.get(key);\n const rawValue = toRaw(value);\n target.set(key, rawValue);\n if (!hadKey || hasChanged(oldValue, rawValue)) {\n trigger(target, TriggerOpTypes.SET, COLLECTION_KEY);\n }\n return this;\n },\n add(value) {\n const target = toRaw(this);\n const rawValue = toRaw(value);\n const hadValue = target.has(rawValue);\n target.add(rawValue);\n if (!hadValue) {\n trigger(target, TriggerOpTypes.ADD, COLLECTION_KEY);\n } else {\n trigger(target, TriggerOpTypes.SET, COLLECTION_KEY);\n }\n return this;\n },\n has(key) {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n const hasKey = target.has(key);\n if (!hasKey && isObject(key)) {\n return target.has(toRaw(key));\n }\n return hasKey;\n },\n delete(key) {\n const target = toRaw(this);\n const hadKey = target.has(key);\n let result = target.delete(key);\n if (!result && isObject(key)) {\n result = target.delete(toRaw(key));\n }\n if (hadKey || result) {\n trigger(target, TriggerOpTypes.DELETE, COLLECTION_KEY);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size > 0;\n const result = target.clear();\n if (hadItems) {\n trigger(target, TriggerOpTypes.CLEAR, COLLECTION_KEY);\n }\n return result;\n },\n forEach(callback, thisArg) {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n target.forEach((value, key) => {\n const wrappedValue = isShallowMode || !isObject(value) ? value : reactiveImpl(value);\n const wrappedKey = isShallowMode || !isObject(key) ? key : reactiveImpl(key);\n callback.call(thisArg, wrappedValue, wrappedKey, this);\n });\n },\n [Symbol.iterator]() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target[Symbol.iterator]();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (isShallowMode) {\n return { value, done };\n }\n if (Array.isArray(value)) {\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v) : v),\n done\n };\n }\n return {\n value: isObject(value) ? reactiveImpl(value) : value,\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n get size() {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n return target.size;\n },\n keys() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.keys();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n return {\n value: isShallowMode || !isObject(value) ? value : reactiveImpl(value),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n values() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.values();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n return {\n value: isShallowMode || !isObject(value) ? value : reactiveImpl(value),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n entries() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.entries();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (isShallowMode) {\n return { value, done };\n }\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v) : v),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n }\n};\nvar weakInstrumentations = {\n get(key) {\n const target = toRaw(this);\n track(target, WEAK_COLLECTION_KEY);\n let value = target.get(key);\n if (value === void 0 && isReactive(key)) {\n value = target.get(toRaw(key));\n }\n if (isObject(value) && !isShallow(this)) {\n return reactiveImpl(value);\n }\n return value;\n },\n set(key, value) {\n const target = toRaw(this);\n const rawKey = toRaw(key);\n const hadKey = target.has(rawKey);\n const oldValue = target.get(rawKey);\n const rawValue = toRaw(value);\n target.set(rawKey, rawValue);\n if (!hadKey || hasChanged(oldValue, rawValue)) {\n trigger(target, TriggerOpTypes.SET, WEAK_COLLECTION_KEY);\n }\n return this;\n },\n add(value) {\n const target = toRaw(this);\n const rawValue = toRaw(value);\n const hadValue = target.has(rawValue);\n target.add(rawValue);\n if (!hadValue) {\n trigger(target, TriggerOpTypes.ADD, WEAK_COLLECTION_KEY);\n }\n return this;\n },\n has(key) {\n const target = toRaw(this);\n track(target, WEAK_COLLECTION_KEY);\n let hasKey = target.has(key);\n if (!hasKey && isReactive(key)) {\n hasKey = target.has(toRaw(key));\n }\n return hasKey;\n },\n delete(key) {\n const target = toRaw(this);\n const rawKey = toRaw(key);\n const hadKey = target.has(rawKey);\n const result = target.delete(rawKey);\n if (hadKey || result) {\n trigger(target, TriggerOpTypes.DELETE, WEAK_COLLECTION_KEY);\n }\n return result;\n }\n};\nvar objectHandlers = (shallow) => ({\n get(target, key, receiver) {\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_IS_SHALLOW\" /* IS_SHALLOW */) {\n return shallow;\n }\n const value = Reflect.get(target, key, receiver);\n const valueUnwrapped = isSignal(value) ? value.value : value;\n track(target, key);\n if (isObject(valueUnwrapped) && !shallow) {\n return reactiveImpl(valueUnwrapped);\n }\n return valueUnwrapped;\n },\n set: (target, key, value, receiver) => {\n const oldValue = Reflect.get(target, key, receiver);\n const result = Reflect.set(target, key, toRaw(value), receiver);\n if (hasChanged(value, oldValue)) {\n trigger(target, TriggerOpTypes.SET, key, value);\n }\n return result;\n },\n deleteProperty: (target, key) => {\n const hadKey = hasOwn(target, key);\n const result = Reflect.deleteProperty(target, key);\n if (hadKey && result) {\n trigger(target, TriggerOpTypes.DELETE, key, void 0);\n }\n return result;\n }\n});\nfunction reactiveImpl(target, shallow = false) {\n if (!isObject(target)) {\n return target;\n }\n if (isReactive(target)) {\n return target;\n }\n const existingProxy = reactiveCaches.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n let handler;\n if (isArray(target)) {\n handler = shallow ? shallowArrayHandlers : deepArrayHandlers;\n } else if (isSet(target) || isMap(target)) {\n handler = collectionHandlers;\n } else if (isWeakMap(target) || isWeakSet(target)) {\n handler = weakCollectionHandlers;\n } else {\n handler = objectHandlers(shallow);\n }\n const proxy = new Proxy(target, handler);\n reactiveCaches.set(target, proxy);\n return proxy;\n}\nfunction isReactive(target) {\n return !!(target && target[\"_IS_REACTIVE\" /* IS_REACTIVE */]);\n}\nfunction reactive(target) {\n if (isReactive(target)) {\n return target;\n }\n if (isSignal(target)) {\n return target;\n }\n return reactiveImpl(target);\n}\nfunction shallowReactive(target) {\n if (isReactive(target)) {\n return target;\n }\n if (isSignal(target)) {\n return target;\n }\n return reactiveImpl(target, true);\n}\nfunction isShallow(value) {\n return !!(value && value[\"_IS_SHALLOW\" /* IS_SHALLOW */]);\n}\nvar toReactive = (value) => isObject(value) ? reactive(value) : value;\n\n// src/signal.ts\nvar _a;\n_a = \"_IS_SIGNAL\" /* IS_SIGNAL */;\nvar SignalImpl = class {\n // Mark as Signal\n /**\n * Create a new Signal with the given initial value.\n *\n * @param value - Initial value\n * @param shallow - Whether only the top level should be reactive\n */\n constructor(value, shallow = false) {\n this.flag = 1 /* MUTABLE */;\n // Mark whether it's shallow reactive\n // @ts-ignore\n this[_a] = true;\n this._rawValue = value;\n if (shallow) {\n this._value = isObject(value) ? shallowReactive(value) : value;\n } else {\n this._value = isObject(value) ? reactive(value) : value;\n }\n this[\"_IS_SHALLOW\" /* IS_SHALLOW */] = shallow;\n }\n // dep getter, returns itself for dependency collection\n get dep() {\n return this;\n }\n get value() {\n const sub = activeSub;\n if (sub) {\n linkReactiveNode(this, sub);\n }\n const flags = this.flag;\n if (flags & 16 /* DIRTY */ && this.shouldUpdate()) {\n const subs = this.subLink;\n if (subs) {\n shallowPropagate2(subs);\n }\n }\n return this._value;\n }\n // value setter, triggers update when value changes\n set value(value) {\n if (isSignal(value)) {\n {\n warn(\n \"Setting a signal value to another signal is not recommended. The value will be unwrapped automatically.\"\n );\n }\n value = value.peek();\n }\n value = toRaw(value);\n if (!hasChanged(this._rawValue, value)) {\n return;\n }\n if (!(\"_oldValue\" in this)) {\n this._oldValue = this._rawValue;\n }\n const flags = this.flag;\n this.flag = flags | 16 /* DIRTY */;\n this._rawValue = value;\n const shallow = this[\"_IS_SHALLOW\" /* IS_SHALLOW */];\n if (shallow) {\n this._value = isObject(value) ? shallowReactive(value) : value;\n } else {\n this._value = isObject(value) ? reactive(value) : value;\n }\n const subs = this.subLink;\n if (subs) {\n propagate(subs);\n }\n }\n // Check if the value should be update\n shouldUpdate() {\n this.flag &= -17 /* DIRTY */;\n if (!(\"_oldValue\" in this)) {\n return true;\n }\n const changed = hasChanged(this._oldValue, this._rawValue);\n this._oldValue = this._rawValue;\n return changed;\n }\n // Get current value without triggering dependency tracking\n peek() {\n return this._value;\n }\n // set method is an alias for the value setter\n set(value) {\n this.value = value;\n }\n // Update value using an updater function\n update(updater) {\n const nextValue = updater(this.peek());\n if (isSignal(nextValue)) {\n {\n warn(\n \"Returning a signal from an update function is not recommended. The value will be unwrapped.\"\n );\n }\n this.value = nextValue.peek();\n } else {\n this.value = nextValue;\n }\n }\n};\nfunction signal(value) {\n if (isSignal(value)) {\n {\n warn(\n \"Creating a signal with another signal is not recommended. The value will be unwrapped.\"\n );\n }\n return value;\n }\n return new SignalImpl(value);\n}\nfunction shallowSignal(value) {\n if (isSignal(value)) {\n value = value.peek();\n }\n return new SignalImpl(value, true);\n}\nfunction isSignal(value) {\n return !!value && !!value[\"_IS_SIGNAL\" /* IS_SIGNAL */];\n}\nvar queue = /* @__PURE__ */ new Set();\nvar activePreFlushCbs = /* @__PURE__ */ new Set();\nvar p = Promise.resolve();\nvar isFlushPending = false;\nfunction nextTick(fn) {\n if (fn) {\n return new Promise((resolve, reject) => {\n queueMicrotask(() => {\n try {\n fn();\n resolve();\n } catch (error5) {\n reject(error5);\n }\n });\n });\n }\n return p;\n}\nfunction queueJob(job) {\n queue.add(job);\n queueFlush();\n}\nfunction queueFlush() {\n if (!isFlushPending) {\n isFlushPending = true;\n nextTick(flushJobs);\n }\n}\nfunction queuePreFlushCb(cb) {\n activePreFlushCbs.add(cb);\n queueFlush();\n}\nfunction flushJobs() {\n isFlushPending = false;\n flushPreFlushCbs();\n while (queue.size > 0) {\n const jobs = Array.from(queue);\n queue.clear();\n for (const job of jobs) {\n try {\n job();\n } catch (_error) {\n {\n error(\"Error executing queued job:\", _error);\n }\n }\n }\n }\n}\nfunction flushPreFlushCbs() {\n const callbacks = Array.from(activePreFlushCbs);\n activePreFlushCbs.clear();\n for (const callback of callbacks) {\n try {\n callback();\n } catch (_error) {\n {\n error(\"Error executing pre-flush callback:\", _error);\n }\n }\n }\n}\nfunction createScheduler(effect2, flush) {\n switch (flush) {\n case \"sync\":\n return () => effect2();\n case \"pre\":\n return () => queuePreFlushCb(effect2);\n case \"post\":\n return () => queueJob(effect2);\n default:\n {\n warn(`Invalid flush timing: ${flush}. Defaulting to 'post'.`);\n }\n return () => queueJob(effect2);\n }\n}\n\n// src/batch.ts\nvar batchDepth = 0;\nfunction batch(fn) {\n startBatch();\n try {\n return fn();\n } finally {\n endBatch();\n }\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (batchDepth === 0) {\n warn(\n \"[Batch] endBatch() called without matching startBatch(). This indicates unbalanced batch calls in your code. Make sure every startBatch() has a corresponding endBatch(), or use the batch() function which handles this automatically.\"\n );\n return;\n }\n batchDepth--;\n if (batchDepth === 0) {\n flushJobs();\n }\n}\nfunction isBatching() {\n return batchDepth > 0;\n}\nfunction getBatchDepth() {\n return batchDepth;\n}\n\n// src/effect.ts\nvar _a2;\n_a2 = \"_IS_EFFECT\" /* IS_EFFECT */;\nvar EffectImpl = class {\n /**\n * Create an Effect instance\n *\n * @param fn - The effect function\n * @param options - Configuration options\n */\n constructor(fn, options) {\n this.flag = 2 /* WATCHING */ | 16 /* DIRTY */;\n // @ts-ignore\n this[_a2] = true;\n // State management\n this._active = true;\n this.fn = fn;\n if (options) {\n this.scheduler = options.flush || options.scheduler;\n this.onStop = options.onStop;\n this.onTrack = options.onTrack;\n this.onTrigger = options.onTrigger;\n }\n }\n /**\n * Check if the Effect is active\n */\n get active() {\n return this._active;\n }\n /**\n * Check if the Effect is dirty (needs re-execution)\n \n */\n get dirty() {\n const flags = this.flag;\n if (flags & 16 /* DIRTY */) {\n return true;\n }\n if (flags & 32 /* PENDING */) {\n if (this.depLink && checkDirty(this.depLink, this)) {\n this.flag = flags & -33 /* PENDING */ | 16 /* DIRTY */;\n return true;\n }\n this.flag = flags & -33 /* PENDING */;\n }\n return false;\n }\n /**\n * Pause Effect execution\n *\n * When an effect is paused:\n * - It stops responding to dependency changes\n * - Notifications are ignored (see notify method)\n * - DIRTY and PENDING flags are still set when dependencies change\n * - The effect remains active and maintains its dependency links\n *\n * Use cases:\n * - Temporarily disable effects during bulk updates\n * - Prevent effects from running during initialization\n * - Control when side effects should execute\n *\n * @example\n * ```typescript\n * const count = signal(0);\n * const runner = effect(() => console.log(count.value));\n *\n * runner.effect.pause();\n * count.value = 1; // Effect won't run\n * count.value = 2; // Effect won't run\n * runner.effect.resume(); // Effect runs once with latest value\n * ```\n */\n pause() {\n this.flag |= 256 /* PAUSED */;\n }\n /**\n * Resume Effect execution\n *\n * When an effect is resumed:\n * - The PAUSED flag is cleared\n * - If dependencies changed during pause (DIRTY or PENDING flags set),\n * the effect executes immediately via notify()\n * - If no changes occurred, the effect simply becomes active again\n *\n * State management:\n * - Clears PAUSED flag atomically\n * - Checks for accumulated DIRTY/PENDING flags\n * - Triggers execution if needed\n *\n * @example\n * ```typescript\n * const count = signal(0);\n * const runner = effect(() => console.log(count.value));\n *\n * runner.effect.pause();\n * count.value = 1; // Queued\n * count.value = 2; // Queued\n * runner.effect.resume(); // Executes once with count.value = 2\n * ```\n */\n resume() {\n const flags = this.flag;\n const nextFlags = flags & -257 /* PAUSED */;\n this.flag = nextFlags;\n const wasDirty = (nextFlags & 16 /* DIRTY */) !== 0;\n const wasPending = (nextFlags & 32 /* PENDING */) !== 0;\n if (wasDirty || wasPending) {\n this.notify();\n }\n }\n /**\n * Execute the Effect function\n *\n * Core execution flow:\n * 1. Check if active\n * 2. Clear dirty flag\n * 3. Start tracking dependencies\n * 4. Execute user function\n * 5. End tracking, clean up stale dependencies\n \n * @returns The return value of the effect function\n */\n run() {\n if (!this._active) {\n return this.fn();\n }\n const flags = this.flag;\n this.flag = flags & -17 /* DIRTY */ | 1024 /* STOP */;\n const prevSub = startTracking(this);\n try {\n return this.fn();\n } catch (error5) {\n this.flag |= 16 /* DIRTY */;\n throw error5;\n } finally {\n this.flag &= -1025 /* STOP */;\n endTracking(this, prevSub);\n }\n }\n /**\n * Get or create the job function for this effect\n */\n getJob() {\n if (!this._job) {\n this._job = () => this.run();\n }\n return this._job;\n }\n /**\n * Notify that the Effect needs to execute\n *\n * Called by dependent reactive values.\n * Decides whether to execute immediately or defer based on scheduling strategy.\n */\n notify() {\n const flags = this.flag;\n if (!this._active || flags & (256 /* PAUSED */ | 1024 /* STOP */ | 16 /* DIRTY */)) {\n return;\n }\n this.flag = flags | 16 /* DIRTY */;\n if (this.onTrigger) {\n this.onTrigger({\n effect: this,\n target: {},\n type: \"set\"\n });\n }\n if (this.scheduler) {\n if (isFunction(this.scheduler)) {\n this.scheduler(this);\n } else {\n const schedulerFn = createScheduler(() => this.run(), this.scheduler);\n schedulerFn();\n }\n } else if (isBatching()) {\n queueJob(this.getJob());\n } else {\n this.run();\n }\n }\n /**\n * Stop the Effect\n *\n * After stopping:\n * - No longer responds to dependency changes\n * - Disconnects all dependency links\n * - Clears cached job function\n * - Calls onStop callback\n * - Verifies complete cleanup in development mode\n */\n stop() {\n if (!this._active) {\n {\n warn(\"[Effect] Attempting to stop an already stopped effect.\");\n }\n return;\n }\n this._active = false;\n let dep = this.depLink;\n while (dep) {\n dep = unlinkReactiveNode(dep, this);\n }\n let sub = this.subLink;\n while (sub) {\n sub = unlinkReactiveNode(sub);\n }\n this._job = void 0;\n this.depLinkTail = void 0;\n this.subLinkTail = void 0;\n {\n if (this.depLink) {\n error(\n \"[Effect] Cleanup verification failed: depLink not cleared. This indicates a memory leak in the dependency tracking system.\"\n );\n }\n if (this.subLink) {\n error(\n \"[Effect] Cleanup verification failed: subLink not cleared. This indicates a memory leak in the subscription system.\"\n );\n }\n }\n if (this.onStop) {\n this.onStop();\n }\n }\n};\nfunction effect(fn, options) {\n const effectInstance = new EffectImpl(fn, options);\n try {\n effectInstance.run();\n } catch (_error) {\n effectInstance.stop();\n {\n error(\n \"[Effect] Effect failed during initial execution and has been stopped. Fix the error in your effect function.\",\n _error\n );\n }\n throw _error;\n }\n const runner = () => effectInstance.run();\n runner.effect = effectInstance;\n runner.stop = () => effectInstance.stop();\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nfunction isEffect(value) {\n return !!(value && value[\"_IS_EFFECT\" /* IS_EFFECT */]);\n}\nfunction memoEffect(fn, initialState, options) {\n let currentState = initialState;\n const effectFn = () => {\n const result = fn(currentState);\n currentState = result;\n };\n return effect(effectFn, options);\n}\nvar NO_VALUE = /* @__PURE__ */ Symbol(\"computed-no-value\");\nvar _a3;\n_a3 = \"_IS_COMPUTED\" /* IS_COMPUTED */;\nvar ComputedImpl = class {\n /**\n * Create a Computed instance\n *\n * @param getter - The computation function\n * @param setter - Optional setter function\n * @param onTrack - Optional debug callback for dependency tracking\n * @param onTrigger - Optional debug callback for triggers\n */\n constructor(getter, setter, onTrack, onTrigger) {\n this.flag = 1 /* MUTABLE */ | 16 /* DIRTY */;\n //@ts-ignore\n this[_a3] = true;\n // Cache\n // Use symbol sentinel to distinguish \"no value\" from undefined/null values\n this._value = NO_VALUE;\n this.getter = getter;\n this.setter = setter;\n this.onTrack = onTrack;\n this.onTrigger = onTrigger;\n this.flag |= 16 /* DIRTY */;\n }\n get value() {\n if (activeSub) {\n linkReactiveNode(this, activeSub);\n }\n const flags = this.flag;\n const hasValue = this._value !== NO_VALUE;\n if (hasValue && !(flags & (16 /* DIRTY */ | 32 /* PENDING */))) {\n return this._value;\n }\n if (!hasValue || flags & 16 /* DIRTY */) {\n this.recompute();\n return this._value;\n }\n if (flags & 32 /* PENDING */) {\n if (this.depLink && checkDirty(this.depLink, this)) {\n this.recompute();\n } else {\n this.flag = flags & -33 /* PENDING */;\n }\n }\n return this._value;\n }\n /**\n * Set value (only effective when setter is provided)\n *\n * @param newValue - The new value\n */\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else {\n warn(\n \"[Computed] Cannot set readonly computed value. Provide a setter in the computed options to make it writable.\\nExample: computed({ get: () => value, set: (v) => { ... } })\"\n );\n }\n }\n /**\n * Read value without tracking dependencies\n *\n * @returns Current value\n */\n peek() {\n if (this._value === NO_VALUE) {\n this.recompute();\n }\n return this._value;\n }\n /**\n * Recompute the value\n *\n * computation logic:\n * 1. Start tracking dependencies\n * 2. Execute getter function\n * 3. Check if value changed using optimized comparison\n * 4. If changed, update cache and notify subscribers\n * 5. End tracking, clean up stale dependencies\n * @private\n */\n recompute() {\n const oldValue = this._value;\n const hadValue = oldValue !== NO_VALUE;\n const prevSub = startTracking(this);\n try {\n const newValue = this.getter();\n const flags = this.flag;\n const subs = this.subLink;\n const clearMask = ~(16 /* DIRTY */ | 32 /* PENDING */);\n const valueChanged = !hadValue || hasChanged(oldValue, newValue);\n if (valueChanged) {\n this._value = newValue;\n this.flag = flags & clearMask;\n if (this.onTrigger) {\n this.onTrigger({\n effect: this,\n target: this,\n type: \"set\",\n key: \"value\",\n newValue\n });\n }\n if (subs) {\n shallowPropagate(subs);\n }\n } else {\n this.flag = flags & clearMask;\n }\n } catch (_error) {\n const clearMask = -49;\n this.flag &= clearMask;\n this.flag |= 16 /* DIRTY */;\n {\n error(\n \"[Computed] Error occurred while computing value.\\nThe computed will retry on next access.\\nCommon causes:\\n - Accessing undefined properties\\n - Circular dependencies\\n - Exceptions in getter function\\nCheck your getter function for errors.\",\n _error\n );\n }\n throw _error;\n } finally {\n endTracking(this, prevSub);\n }\n }\n /**\n * Check if update is needed\n *\n * Internal use, called by reactive system.\n *\n * @returns true if value changed\n */\n shouldUpdate() {\n const hadValue = this._value !== NO_VALUE;\n const oldValue = this._value;\n this.recompute();\n if (!hadValue) {\n return true;\n }\n return hasChanged(this._value, oldValue);\n }\n};\nfunction computed(getterOrOptions) {\n if (isComputed(getterOrOptions)) {\n {\n warn(\n \"[Computed] Creating a computed from another computed is not recommended. The existing computed will be returned to avoid unnecessary wrapping.\"\n );\n }\n return getterOrOptions;\n }\n if (!getterOrOptions) {\n throw new Error(\n \"[Computed] Invalid argument: computed() requires a getter function or options object.\"\n );\n }\n if (isFunction(getterOrOptions)) {\n return new ComputedImpl(getterOrOptions);\n }\n if (isPlainObject(getterOrOptions)) {\n const { get, set, onTrack, onTrigger } = getterOrOptions;\n if (!get) {\n throw new Error(\n \"[Computed] Invalid options: getter function is required.\\nUsage: computed({ get: () => value, set: (v) => { ... } })\"\n );\n }\n if (!isFunction(get)) {\n throw new TypeError(\n `[Computed] Invalid options: getter must be a function.\nReceived: ${typeof get}`\n );\n }\n return new ComputedImpl(get, set, onTrack, onTrigger);\n }\n throw new Error(\n `[Computed] Invalid argument: expected a function or options object.\nReceived: ${typeof getterOrOptions}`\n );\n}\nfunction isComputed(value) {\n return !!value && !!value[\"_IS_COMPUTED\" /* IS_COMPUTED */];\n}\nfunction createOptionsStore(options) {\n if (!options.state) {\n warn(\"Store state is required\");\n throw new Error(\"Store state is required\");\n }\n const { state, getters, actions } = options;\n const initState = __spreadValues({}, state);\n const reactiveState = reactive(state);\n const subscriptions = /* @__PURE__ */ new Set();\n const actionCallbacks = /* @__PURE__ */ new Set();\n const notifySubscribers = (state2) => {\n subscriptions.forEach((callback) => callback(state2));\n actionCallbacks.forEach((callback) => callback(state2));\n };\n const defaultActions = {\n patch$(payload) {\n if (!payload) {\n warn(\"Patch payload is required\");\n return;\n }\n batch(() => {\n Object.assign(reactiveState, payload);\n });\n notifySubscribers(reactiveState);\n },\n subscribe$(callback) {\n if (!callback) {\n warn(\"Subscribe callback is required\");\n return;\n }\n subscriptions.add(callback);\n },\n unsubscribe$(callback) {\n subscriptions.delete(callback);\n },\n onAction$(callback) {\n if (!callback) {\n warn(\"Action callback is required\");\n return;\n }\n actionCallbacks.add(callback);\n },\n reset$() {\n batch(() => {\n Object.assign(reactiveState, initState);\n });\n notifySubscribers(reactiveState);\n }\n };\n const store = __spreadValues(__spreadProps(__spreadValues({}, reactiveState), {\n state: reactiveState\n }), defaultActions);\n if (getters) {\n for (const key in getters) {\n const getter = getters[key];\n if (getter) {\n let accessCount = 0;\n let lastWarnTime = 0;\n Object.defineProperty(store, key, {\n get() {\n {\n accessCount++;\n const now = Date.now();\n if (accessCount > 100 && now - lastWarnTime > 1e3) {\n warn(\n `Getter '${key}' has been accessed ${accessCount} times. Consider caching the result if the value is used frequently. Note: Getters are computed properties that recalculate on every access.`\n );\n lastWarnTime = now;\n accessCount = 0;\n }\n }\n return computed(() => getter.call(store, reactiveState)).value;\n },\n enumerable: true,\n configurable: true\n });\n }\n }\n }\n if (actions) {\n for (const key in actions) {\n const action = actions[key];\n if (action) {\n store[key] = (...args) => {\n const result = action.apply(reactiveState, args);\n actionCallbacks.forEach((callback) => callback(reactiveState));\n return result;\n };\n }\n }\n }\n return store;\n}\nfunction createClassStore(StoreClass) {\n const instance = new StoreClass();\n const state = /* @__PURE__ */ Object.create(null);\n const getters = {};\n const actions = {};\n Object.getOwnPropertyNames(instance).forEach((key) => {\n state[key] = instance[key];\n });\n Object.getOwnPropertyNames(StoreClass.prototype).forEach((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(StoreClass.prototype, key);\n if (descriptor) {\n if (isFunction(descriptor.get)) {\n getters[key] = function() {\n return descriptor.get.call(this);\n };\n } else if (isFunction(descriptor.value) && key !== \"constructor\") {\n actions[key] = function(...args) {\n return descriptor.value.apply(this, args);\n };\n }\n }\n });\n return {\n state,\n getters,\n actions\n };\n}\nfunction createStore(storeDefinition) {\n if (!storeDefinition) {\n warn(\"Store definition is required\");\n throw new Error(\"Store definition is required\");\n }\n return () => {\n let options;\n if (isFunction(storeDefinition)) {\n options = createClassStore(storeDefinition);\n } else {\n options = storeDefinition;\n }\n const store = createOptionsStore(options);\n if (isFunction(storeDefinition)) {\n Object.keys(options.actions || {}).forEach((key) => {\n store[key] = options.actions[key].bind(store);\n });\n }\n return store;\n };\n}\nvar _a4, _b;\nvar RefImpl = class extends (_b = SignalImpl, _a4 = \"_IS_REF\" /* IS_REF */, _b) {\n /**\n * Creates a new ref with the given initial value.\n *\n * @param value - The initial value\n */\n constructor(value) {\n super(value, true);\n // @ts-ignore\n this[_a4] = true;\n }\n get value() {\n track(this, SIGNAL_KEY);\n return this._value;\n }\n set value(newValue) {\n if (isSignal(newValue)) {\n newValue = newValue.value;\n }\n if (isRef(newValue)) {\n newValue = newValue.value;\n }\n if (hasChanged(this._value, newValue)) {\n this._value = newValue;\n if (this.subLink) {\n shallowPropagate2(this.subLink);\n }\n trigger(this, \"SET\", SIGNAL_KEY);\n }\n }\n};\nfunction ref(value = void 0) {\n if (isRef(value)) {\n return value;\n }\n if (isSignal(value)) {\n return new RefImpl(value.peek());\n }\n return new RefImpl(value);\n}\nfunction isRef(value) {\n return !!value && !!value[\"_IS_REF\" /* IS_REF */];\n}\nvar INITIAL_WATCHER_VALUE = {};\nvar cleanupMap = /* @__PURE__ */ new WeakMap();\nfunction traverse(value, seen = /* @__PURE__ */ new Set()) {\n if (!isObject(value) || seen.has(value)) {\n return value;\n }\n seen.add(value);\n if (isSignal(value) || isComputed(value)) {\n return traverse(value.value, seen);\n }\n if (Array.isArray(value)) {\n for (const element of value) {\n traverse(element, seen);\n }\n } else if (isMap(value)) {\n value.forEach((v) => {\n traverse(v, seen);\n });\n value.keys();\n value.values();\n } else if (isSet(value)) {\n value.forEach((v) => {\n traverse(v, seen);\n });\n value.values();\n } else {\n Object.keys(value).forEach((key) => {\n traverse(value[key], seen);\n });\n }\n return value;\n}\nfunction cloneValue(value) {\n if (!isObject(value)) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneValue(item));\n }\n if (isMap(value)) {\n const cloned2 = /* @__PURE__ */ new Map();\n value.forEach((v, k) => {\n cloned2.set(k, cloneValue(v));\n });\n return cloned2;\n }\n if (isSet(value)) {\n const cloned2 = /* @__PURE__ */ new Set();\n value.forEach((v) => {\n cloned2.add(cloneValue(v));\n });\n return cloned2;\n }\n const cloned = {};\n for (const key of Object.keys(value)) {\n cloned[key] = cloneValue(value[key]);\n }\n return cloned;\n}\nfunction resolveSource(source) {\n if (Array.isArray(source)) {\n return () => source.map((s) => {\n if (isSignal(s) || isComputed(s)) {\n return s.value;\n }\n if (isReactive(s)) {\n return traverse(s);\n }\n if (isFunction(s)) {\n return s();\n }\n return s;\n });\n }\n if (isFunction(source)) {\n return source;\n }\n if (isSignal(source)) {\n return () => source.value;\n }\n if (isObject(source) && \"value\" in source) {\n return () => source.value;\n }\n if (isReactive(source)) {\n return () => traverse(source);\n }\n return () => source;\n}\nfunction watch(source, callback, options = {}) {\n const { immediate = false, deep = false } = options;\n let oldValue = INITIAL_WATCHER_VALUE;\n const getter = resolveSource(source);\n const job = () => {\n const currentEffect = runner.effect;\n if (!currentEffect.run) {\n return;\n }\n const newValue = currentEffect.run();\n if (hasChanged(newValue, oldValue)) {\n callback(newValue, oldValue === INITIAL_WATCHER_VALUE ? void 0 : oldValue);\n oldValue = cloneValue(newValue);\n }\n };\n const runner = effect(\n () => {\n const value = getter();\n if (deep) {\n traverse(value);\n }\n return value;\n },\n {\n // Use scheduler to queue job, implementing async and debouncing.\n scheduler: () => queueJob(job)\n }\n );\n if (immediate) {\n job();\n } else {\n oldValue = cloneValue(runner.effect.run());\n }\n return () => {\n runner.stop();\n const cleanups = cleanupMap.get(runner.effect);\n if (cleanups) {\n cleanups.forEach((fn) => fn());\n cleanupMap.delete(runner.effect);\n }\n };\n}\n\nexport { TriggerOpTypes, batch, computed, createStore, effect, endBatch, getBatchDepth, isBatching, isComputed, isEffect, isReactive, isRef, isShallow, isSignal, memoEffect, nextTick, queueJob, queuePreFlushCb, reactive, ref, shallowReactive, shallowSignal, signal, startBatch, stop, toRaw, toReactive, trigger, untrack, watch };\n","import { isComputed, isSignal } from '@estjs/signals';\nimport { normalizeClassName, normalizeStyle, styleToString } from '@estjs/shared';\n\n/**\n * Normalize component properties\n *\n * Special handling for class and style attributes, converting them to normalized format\n *\n * @param props - Original component properties\n * @returns Normalized component properties\n */\nexport function normalizeProps(props: Record<string, any> | null): Record<string, any> | null {\n if (!props) {\n return null;\n }\n\n const { class: className, style } = props;\n\n // Normalize class attribute\n if (className && typeof className !== 'string') {\n props.class = normalizeClassName(className);\n }\n\n // Normalize style attribute\n if (style) {\n props.style = normalizeStyle(style);\n }\n\n return props;\n}\n\n/**\n * Generate server-side rendering attribute string\n *\n * Generate HTML-compatible attribute string based on attribute type, handling special cases:\n * - Automatic unwrapping of reactive values\n * - Normalization of special attributes (style/class)\n * - Ignoring event attributes\n * - Special handling for boolean attributes\n *\n * @param attrName - Attribute name\n * @param attrValue - Attribute value\n * @param hydrationId - Hydration ID (for client-side reuse)\n * @returns Formatted HTML attribute string\n */\nexport function setSSGAttr(attrName: string, attrValue: any, hydrationId: string): string {\n // Handle reactive values (signals or computed values)\n if (isSignal(attrValue) || isComputed(attrValue)) {\n return setSSGAttr(attrName, attrValue.value, hydrationId);\n }\n\n // Ignore null, undefined, and false value attributes\n if (!attrValue && attrValue !== 0) {\n return '';\n }\n\n // Special attribute handling: style\n if (attrName === 'style') {\n const normalizedStyle = normalizeStyle(attrValue);\n if (!normalizedStyle) {\n return '';\n }\n\n if (typeof normalizedStyle === 'string') {\n return ` style=\"${normalizedStyle}\"`;\n }\n\n return ` style=\"${styleToString(normalizedStyle)}\"`;\n }\n\n // Special attribute handling: class\n if (attrName === 'class') {\n const normalizedClassName = normalizeClassName(attrValue);\n return normalizedClassName ? ` class=\"${normalizedClassName}\"` : '';\n }\n\n // Ignore event handler attributes (client-side behavior)\n if (attrName.startsWith('on')) {\n return '';\n }\n\n // Special handling for boolean attributes\n if (attrValue === true) {\n return ` ${attrName}`;\n }\n\n // Standard attribute handling\n return ` ${attrName}=\"${attrValue}\"`;\n}\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/render.ts","../../signals/dist/signals.dev.esm.js","../src/attrs.ts"],"names":["convertToString","content","isSvg","isNil","isString","isArray","item","isFunction","ROOT_ELEMENT_REGEX","INDEX_ATTRIBUTE_REGEX","COMMENT_REGEX","addAttributes","htmlContent","hydrationId","renderToString","component","props","error","resetHydrationKey","scope","createScope","result","runWithScope","disposeScope","render","templates","hydrationKey","components","parts","templateLen","componentLen","i","createSSGComponent","isSignal","value","isComputed","normalizeProps","className","style","normalizeClassName","normalizeStyle","setSSGAttr","attrName","attrValue","normalizedStyle","styleToString","normalizedClassName"],"mappings":"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","file":"server.esm.js","sourcesContent":["import { isArray, isFunction, isNil, isString } from '@estjs/shared';\n\n/**\n * Convert content to string for SSR output\n *\n * @param content - the content to convert\n * @param isSvg - whether the content is SVG\n * @returns the content as a string\n */\nexport function convertToString(content: unknown, isSvg = false): string {\n if (isNil(content)) {\n return '';\n }\n\n if (isString(content)) {\n return content;\n }\n\n if (isArray(content)) {\n return (content as unknown[]).map((item: unknown) => convertToString(item, isSvg)).join('');\n }\n\n if (isFunction(content)) {\n return convertToString((content as () => unknown)(), isSvg);\n }\n\n return String(content);\n}\n\n/** Regex to match the root element */\n// eslint-disable-next-line regexp/no-super-linear-backtracking\nconst ROOT_ELEMENT_REGEX = /^<([a-z]+)(\\s*)([^>]*)>/i;\n/** Regex to match data-idx attributes */\nconst INDEX_ATTRIBUTE_REGEX = /data-idx=\"(\\d+)\"/g;\n/** Regex to match HTML comments */\nconst COMMENT_REGEX = /<!--(.*?)-->/g;\n\n/**\n * Add hydration attributes to HTML content\n *\n * @param htmlContent - the html content\n * @param hydrationId - the hydration id\n * @returns the html content with hydration attributes\n */\nexport function addAttributes(htmlContent: string, hydrationId: string): string {\n return htmlContent\n .replace(ROOT_ELEMENT_REGEX, `<$1$2$3 data-hk=\"${hydrationId}\">`)\n .replaceAll(INDEX_ATTRIBUTE_REGEX, `data-idx=\"${hydrationId}-$1\"`)\n .replaceAll(COMMENT_REGEX, `<!--${hydrationId}-$1-->`);\n}\n","import { error, isFunction } from '@estjs/shared';\nimport {\n type ComponentFn,\n type ComponentProps,\n createScope,\n disposeScope,\n resetHydrationKey,\n runWithScope,\n} from '@estjs/template';\nimport { addAttributes, convertToString } from './utils';\n\n/**\n * Render a component to HTML string\n * @param {ComponentFn} component - the component to render\n * @param {ComponentProps} props - the props to pass to the component\n * @returns {string} the rendered HTML string\n */\nexport function renderToString<P extends ComponentProps = ComponentProps>(\n component: ComponentFn<P>,\n props: P | ComponentProps = {},\n): string {\n if (!isFunction(component)) {\n error('Component must be a function');\n return '';\n }\n\n // Reset the hydration key counter\n resetHydrationKey();\n\n // Create root scope for SSR to support provide/inject\n const scope = createScope(null);\n\n let result: unknown;\n try {\n // Render the component within scope\n result = runWithScope(scope, () => component(props as P));\n } finally {\n // Clean up scope after rendering\n disposeScope(scope);\n }\n\n // Convert the result to string\n return convertToString(result);\n}\n\n/**\n * Render template with components (used by babel plugin in SSG mode)\n * @param {string[]} templates - the template fragments\n * @param {string} hydrationKey - the hydration key\n * @param {...string[]} components - the rendered component strings\n * @returns {string} the rendered HTML string\n */\nexport function render(templates: string[], hydrationKey: string, ...components: string[]): string {\n /**\n * JSX source code:\n * <div>\n * <div>\n * <Component1 />\n * <Component2 />\n * </div>\n * <Component3 />\n * </div>\n *\n * Compiles to:\n *\n * let _tmpl = [\n * '<div><div>',\n * '</div>',\n * '</div>',\n * ]\n *\n * function component(props) {\n * return render(_tmpl, getHydrationKey(),\n * createSSGComponent(Component1, {}),\n * createSSGComponent(Component2, {}),\n * createSSGComponent(Component3, {})\n * );\n * }\n */\n\n // Build content using array join for better performance\n const parts: string[] = [];\n const templateLen = templates.length;\n const componentLen = components.length;\n\n for (let i = 0; i < templateLen; i++) {\n parts.push(templates[i]);\n if (i < componentLen && components[i]) {\n parts.push(convertToString(components[i]));\n }\n }\n\n const content = parts.join('');\n\n // Add hydration key attribute\n return addAttributes(content, hydrationKey);\n}\n\n/**\n * Create a SSG component (renders component to string)\n * @param {ComponentFn} component - the component to create\n * @param {ComponentProps} props - the props to pass to the component\n * @returns {string} the rendered component as a string\n */\nexport function createSSGComponent<P extends ComponentProps = ComponentProps>(\n component: ComponentFn<P>,\n props: P | ComponentProps = {},\n): string {\n if (!isFunction(component)) {\n error('createSSGComponent: Component is not a function');\n return '';\n }\n\n // Create child scope inheriting from current active scope (if any)\n // This allows nested components to access parent's provided values\n const scope = createScope();\n\n let result: unknown;\n try {\n // Render the component within scope\n result = runWithScope(scope, () => component(props as P));\n } finally {\n // Clean up scope after rendering\n disposeScope(scope);\n }\n\n return convertToString(result);\n}\n","import { isFunction, isObject, warn, error, isPlainObject, hasChanged, isArray, isSet, isMap, isWeakMap, isWeakSet, hasOwn, isStringNumber } from '@estjs/shared';\n\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// src/constants.ts\nvar TriggerOpTypes = {\n SET: \"SET\",\n ADD: \"ADD\",\n DELETE: \"DELETE\",\n CLEAR: \"CLEAR\"\n};\nvar ARRAY_KEY = /* @__PURE__ */ Symbol(\"Array_Key\" );\nvar COLLECTION_KEY = /* @__PURE__ */ Symbol(\"Collection_Key\" );\nvar WEAK_COLLECTION_KEY = /* @__PURE__ */ Symbol(\"WeakCollection_Key\" );\nvar ITERATE_KEY = /* @__PURE__ */ Symbol(\"Iterate_Key\" );\nvar ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\"Array_Iterate_Key\" );\n\n// src/propagation.ts\nfunction enqueueEffect(effect2) {\n var _a5;\n (_a5 = effect2 == null ? void 0 : effect2.notify) == null ? void 0 : _a5.call(effect2);\n}\nfunction propagate(link) {\n let next = link.nextSubLink;\n let stack;\n top: do {\n const sub = link.subNode;\n const watcherBit = sub.flag & 2 /* WATCHING */;\n let flags = sub.flag;\n if (!(flags & (16 /* DIRTY */ | 32 /* PENDING */ | 8 /* RECURSED */ | 4 /* RECURSED_CHECK */))) {\n sub.flag = flags | 32 /* PENDING */;\n if (watcherBit) {\n enqueueEffect(sub);\n }\n } else if (!(flags & (8 /* RECURSED */ | 4 /* RECURSED_CHECK */))) {\n flags = 0 /* NONE */;\n } else if (!(flags & 4 /* RECURSED_CHECK */)) {\n sub.flag = flags & -9 /* RECURSED */ | 32 /* PENDING */;\n } else if (!(flags & (16 /* DIRTY */ | 32 /* PENDING */)) && isValidLink(link, sub)) {\n sub.flag = flags | (8 /* RECURSED */ | 32 /* PENDING */);\n if (watcherBit) {\n enqueueEffect(sub);\n }\n flags &= 1 /* MUTABLE */;\n } else {\n flags = 0 /* NONE */;\n }\n if (flags & 1 /* MUTABLE */) {\n const subSubs = sub.subLink;\n if (subSubs !== void 0) {\n const nextSub = subSubs.nextSubLink;\n if (nextSub !== void 0) {\n stack = { value: next, prev: stack };\n next = nextSub;\n }\n link = subSubs;\n continue;\n }\n }\n if ((link = next) !== void 0) {\n next = link.nextSubLink;\n continue;\n }\n while (stack !== void 0) {\n link = stack.value;\n stack = stack.prev;\n if (link !== void 0) {\n next = link.nextSubLink;\n continue top;\n }\n }\n break;\n } while (true);\n}\nfunction shallowPropagate(link) {\n while (link) {\n const sub = link.subNode;\n const flags = sub.flag;\n if ((flags & (32 /* PENDING */ | 16 /* DIRTY */)) === 32 /* PENDING */) {\n sub.flag = flags | 16 /* DIRTY */;\n if ((flags & (2 /* WATCHING */ | 4 /* RECURSED_CHECK */)) === 2 /* WATCHING */) {\n enqueueEffect(sub);\n }\n }\n link = link.nextSubLink;\n }\n}\n\n// src/link.ts\nvar currentLinkVersion = 0;\nvar activeSub;\nvar isUntracking = false;\nfunction linkReactiveNode(depNode, subNode) {\n if (isUntracking) {\n return void 0;\n }\n const prevDep = subNode.depLinkTail;\n if (prevDep && prevDep.depNode === depNode) {\n return prevDep;\n }\n const nextDep = prevDep ? prevDep.nextDepLink : subNode.depLink;\n if (nextDep && nextDep.depNode === depNode) {\n nextDep.version = currentLinkVersion;\n subNode.depLinkTail = nextDep;\n return nextDep;\n }\n const prevSub = depNode.subLinkTail;\n if (prevSub && prevSub.version === currentLinkVersion && prevSub.subNode === subNode) {\n subNode.depLinkTail = prevSub;\n return prevSub;\n }\n const newLink = {\n version: currentLinkVersion,\n depNode,\n subNode,\n // Subscriber chain pointers (horizontal)\n prevSubLink: prevSub,\n nextSubLink: void 0,\n // Dependency chain pointers (vertical)\n prevDepLink: prevDep,\n nextDepLink: nextDep\n };\n if (nextDep) {\n nextDep.prevDepLink = newLink;\n }\n if (prevDep) {\n prevDep.nextDepLink = newLink;\n } else {\n subNode.depLink = newLink;\n }\n if (prevSub) {\n prevSub.nextSubLink = newLink;\n } else {\n depNode.subLink = newLink;\n }\n depNode.subLinkTail = newLink;\n subNode.depLinkTail = newLink;\n {\n if (subNode.onTrack && isFunction(subNode == null ? void 0 : subNode.onTrack)) {\n subNode.onTrack({\n effect: subNode,\n target: depNode,\n type: \"get\",\n key: void 0\n });\n }\n }\n return newLink;\n}\nfunction unlinkReactiveNode(linkNode, subNode = linkNode.subNode) {\n const depNode = linkNode.depNode;\n const prevSub = linkNode.prevSubLink;\n const nextSub = linkNode.nextSubLink;\n const prevDep = linkNode.prevDepLink;\n const nextDep = linkNode.nextDepLink;\n if (nextDep) {\n nextDep.prevDepLink = prevDep;\n } else {\n subNode.depLinkTail = prevDep;\n }\n if (prevDep) {\n prevDep.nextDepLink = nextDep;\n } else {\n subNode.depLink = nextDep;\n }\n if (nextSub) {\n nextSub.prevSubLink = prevSub;\n } else {\n depNode.subLinkTail = prevSub;\n }\n if (prevSub) {\n prevSub.nextSubLink = nextSub;\n } else {\n depNode.subLink = nextSub;\n if (nextSub === void 0) {\n let toRemove = depNode.depLink;\n while (toRemove) {\n toRemove = unlinkReactiveNode(toRemove, depNode);\n }\n depNode.depLinkTail = void 0;\n depNode.flag |= 16 /* DIRTY */;\n {\n if (depNode.depLink) {\n error(\n \"[Link] Cascading cleanup failed: depNode still has dependency links. This indicates a bug in the unlinking logic.\"\n );\n }\n }\n }\n }\n return nextDep;\n}\nfunction checkDirty(link, sub) {\n let stack;\n let checkDepth = 0;\n let dirty = false;\n top: do {\n let currentDirty = false;\n if (sub.flag & 16 /* DIRTY */) {\n currentDirty = true;\n } else {\n const dep = link.depNode;\n const depFlags = dep.flag;\n if ((depFlags & (1 /* MUTABLE */ | 16 /* DIRTY */)) === (1 /* MUTABLE */ | 16 /* DIRTY */)) {\n const subs = dep.subLink;\n if (subs && subs.nextSubLink) {\n shallowPropagate2(subs);\n }\n currentDirty = true;\n } else if ((depFlags & (1 /* MUTABLE */ | 32 /* PENDING */)) === (1 /* MUTABLE */ | 32 /* PENDING */)) {\n if (dep.depLink) {\n stack = { link, prev: stack };\n link = dep.depLink;\n sub = dep;\n ++checkDepth;\n continue top;\n } else {\n dep.flag &= -33 /* PENDING */;\n }\n } else if (depFlags & 32 /* PENDING */) {\n dep.flag &= -33 /* PENDING */;\n }\n }\n if (!currentDirty && link.nextDepLink !== void 0) {\n link = link.nextDepLink;\n continue top;\n }\n dirty = currentDirty;\n while (checkDepth--) {\n link = stack.link;\n stack = stack.prev;\n sub = link.subNode;\n const checkedDep = link.depNode;\n if (dirty) {\n checkedDep.flag = checkedDep.flag & -33 /* PENDING */ | 16 /* DIRTY */;\n } else {\n checkedDep.flag &= -33 /* PENDING */;\n }\n if (checkedDep.flag & 16 /* DIRTY */) {\n dirty = true;\n }\n if (!dirty && link.nextDepLink !== void 0) {\n link = link.nextDepLink;\n continue top;\n }\n }\n if (dirty) {\n sub.flag = sub.flag & -33 /* PENDING */ | 16 /* DIRTY */;\n } else {\n sub.flag &= -33 /* PENDING */;\n }\n return dirty;\n } while (true);\n}\nfunction shallowPropagate2(link) {\n while (link) {\n const sub = link.subNode;\n const flags = sub.flag;\n if ((flags & (32 /* PENDING */ | 16 /* DIRTY */)) === 32 /* PENDING */) {\n sub.flag = flags | 16 /* DIRTY */;\n }\n link = link.nextSubLink;\n }\n}\nfunction setActiveSub(sub) {\n const prev = activeSub;\n activeSub = sub;\n return prev;\n}\nfunction startTracking(sub) {\n currentLinkVersion++;\n sub.depLinkTail = void 0;\n sub.flag = sub.flag & -57 | 4 /* RECURSED_CHECK */;\n return setActiveSub(sub);\n}\nfunction endTracking(sub, prevSub) {\n activeSub = prevSub;\n const depsTail = sub.depLinkTail;\n let toRemove = depsTail ? depsTail.nextDepLink : sub.depLink;\n while (toRemove) {\n toRemove = unlinkReactiveNode(toRemove, sub);\n }\n sub.flag &= -5 /* RECURSED_CHECK */;\n}\nfunction untrack(fn) {\n const prevSub = setActiveSub(void 0);\n const prevUntracking = isUntracking;\n isUntracking = true;\n try {\n return fn();\n } finally {\n isUntracking = prevUntracking;\n setActiveSub(prevSub);\n }\n}\nfunction isValidLink(checkLink, sub) {\n let link = sub.depLinkTail;\n while (link) {\n if (link === checkLink) {\n return true;\n }\n link = link.prevDepLink;\n }\n return false;\n}\nvar targetMap = /* @__PURE__ */ new WeakMap();\nvar triggerVersion = 0;\nfunction collectTriggeredEffects(dep, effects, version) {\n if (!dep) {\n return;\n }\n dep.forEach((effect2) => {\n if (effect2.flag & 2 /* WATCHING */ && !effect2._active) {\n dep.delete(effect2);\n return;\n }\n if (effect2._triggerVersion === version) {\n return;\n }\n effect2._triggerVersion = version;\n effects.push(effect2);\n });\n}\nfunction track(target, key) {\n if (!activeSub || isUntracking) {\n return;\n }\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n depsMap = /* @__PURE__ */ new Map();\n targetMap.set(target, depsMap);\n }\n let dep = depsMap.get(key);\n if (!dep) {\n dep = /* @__PURE__ */ new Set();\n depsMap.set(key, dep);\n }\n const sizeBefore = dep.size ;\n dep.add(activeSub);\n if (dep.size !== sizeBefore && isFunction(activeSub.onTrack)) {\n activeSub.onTrack({\n effect: activeSub,\n target,\n type: \"get\",\n key\n });\n }\n}\nfunction trigger(target, type, key, newValue) {\n var _a5;\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const effects = [];\n const version = ++triggerVersion;\n if (key !== void 0) {\n if (Array.isArray(key)) {\n for (const element of key) {\n collectTriggeredEffects(depsMap.get(element), effects, version);\n }\n } else {\n collectTriggeredEffects(depsMap.get(key), effects, version);\n }\n }\n if (type === \"ADD\" || type === \"DELETE\" || type === \"CLEAR\") {\n const iterationKey = Array.isArray(target) ? ARRAY_ITERATE_KEY : ITERATE_KEY;\n collectTriggeredEffects(depsMap.get(iterationKey), effects, version);\n }\n for (const effect2 of effects) {\n if (isFunction(effect2.onTrigger)) {\n effect2.onTrigger({\n effect: effect2,\n target,\n type,\n key,\n newValue\n });\n }\n if (effect2.flag & 2 /* WATCHING */) {\n (_a5 = effect2.notify) == null ? void 0 : _a5.call(effect2);\n } else if (effect2.flag & 1 /* MUTABLE */) {\n effect2.flag |= 16 /* DIRTY */;\n if (effect2.subLink) {\n propagate(effect2.subLink);\n }\n }\n }\n}\nvar reactiveCaches = /* @__PURE__ */ new WeakMap();\nfunction toRaw(value) {\n if (!value || !isObject(value)) {\n return value;\n }\n const raw = value[\"_RAW\" /* RAW */];\n if (raw) {\n return toRaw(raw);\n }\n if (isSignal(value)) {\n return toRaw(value.peek());\n }\n return value;\n}\nvar arrayInstrumentations = createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n const instrumentations = {};\n [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n let res = arr[key](...args);\n if ((res === -1 || res === false) && args.length > 0) {\n const rawArgs = args.map((arg) => toRaw(arg));\n res = arr[key](...rawArgs);\n }\n return res;\n };\n });\n [\"find\", \"findIndex\", \"findLast\", \"findLastIndex\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_ITERATE_KEY);\n const res = arr[key](...args);\n if ((key === \"find\" || key === \"findLast\") && isObject(res) && !isShallowMode) {\n return reactiveImpl(res);\n }\n return res;\n };\n });\n [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\", \"sort\", \"reverse\", \"fill\", \"copyWithin\"].forEach(\n (key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const res = Array.prototype[key].apply(arr, args);\n trigger(arr, TriggerOpTypes.SET, [ARRAY_KEY, ARRAY_ITERATE_KEY]);\n return res;\n };\n }\n );\n [\"toReversed\", \"toSorted\", \"toSpliced\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_ITERATE_KEY);\n if (key === \"toSpliced\") {\n for (let i = 0, l = arr.length; i < l; i++) {\n track(arr, `${i}`);\n }\n }\n const res = Array.prototype[key].apply(arr, args);\n if (!Array.isArray(res)) {\n return res;\n }\n return res.map((item) => isObject(item) ? reactiveImpl(item, isShallowMode) : item);\n };\n });\n [\"concat\", \"slice\", \"filter\", \"map\", \"flatMap\", \"flat\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n const res = Array.prototype[key].apply(arr, args);\n return res;\n };\n });\n [\"join\", \"toString\", \"toLocaleString\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n track(arr, ARRAY_ITERATE_KEY);\n return Array.prototype[key].apply(arr, args);\n };\n });\n [\"values\", \"keys\", \"entries\", Symbol.iterator].forEach((key) => {\n instrumentations[key] = function() {\n const arr = toRaw(this);\n const isShallowMode = isShallow(this);\n track(arr, ARRAY_KEY);\n const rawIterator = key === Symbol.iterator ? arr[Symbol.iterator]() : arr[key]();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (Array.isArray(value)) {\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v, isShallowMode) : v),\n done\n };\n }\n return {\n value: isObject(value) ? reactiveImpl(value, isShallowMode) : value,\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n });\n return instrumentations;\n}\nvar arrayHandlers = (shallow) => ({\n get: (target, key, receiver) => {\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_IS_SHALLOW\" /* IS_SHALLOW */) {\n return shallow;\n }\n if (hasOwn(arrayInstrumentations, key)) {\n return arrayInstrumentations[key];\n }\n const value = Reflect.get(target, key, receiver);\n if (isStringNumber(key)) {\n track(target, key);\n }\n track(target, ARRAY_KEY);\n if (isObject(value) && !shallow) {\n return reactiveImpl(value);\n }\n return value;\n },\n set: (target, key, value, receiver) => {\n const oldValue = Reflect.get(target, key, receiver);\n const result = Reflect.set(target, key, value, receiver);\n if (hasChanged(value, oldValue)) {\n if (isStringNumber(key)) {\n trigger(target, TriggerOpTypes.SET, [key, ARRAY_ITERATE_KEY, ARRAY_KEY]);\n } else {\n trigger(target, TriggerOpTypes.SET, key);\n }\n }\n return result;\n }\n});\nvar shallowArrayHandlers = arrayHandlers(true);\nvar deepArrayHandlers = arrayHandlers(false);\nvar collectionHandlers = {\n get(target, key) {\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n return Reflect.get(\n hasOwn(collectionInstrumentations, key) ? collectionInstrumentations : target,\n key,\n target\n );\n }\n};\nvar weakCollectionHandlers = {\n get(target, key) {\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n return Reflect.get(\n hasOwn(weakInstrumentations, key) && key in target ? weakInstrumentations : target,\n key,\n target\n );\n }\n};\nvar collectionInstrumentations = {\n get(key) {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n const value = target.get(key);\n if (isObject(value) && !isShallow(this)) {\n return reactiveImpl(value);\n }\n return value;\n },\n set(key, value) {\n const target = toRaw(this);\n const hadKey = target.has(key);\n const oldValue = target.get(key);\n const rawValue = toRaw(value);\n target.set(key, rawValue);\n if (!hadKey || hasChanged(oldValue, rawValue)) {\n trigger(target, TriggerOpTypes.SET, COLLECTION_KEY);\n }\n return this;\n },\n add(value) {\n const target = toRaw(this);\n const rawValue = toRaw(value);\n const hadValue = target.has(rawValue);\n target.add(rawValue);\n if (!hadValue) {\n trigger(target, TriggerOpTypes.ADD, COLLECTION_KEY);\n } else {\n trigger(target, TriggerOpTypes.SET, COLLECTION_KEY);\n }\n return this;\n },\n has(key) {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n const hasKey = target.has(key);\n if (!hasKey && isObject(key)) {\n return target.has(toRaw(key));\n }\n return hasKey;\n },\n delete(key) {\n const target = toRaw(this);\n const hadKey = target.has(key);\n let result = target.delete(key);\n if (!result && isObject(key)) {\n result = target.delete(toRaw(key));\n }\n if (hadKey || result) {\n trigger(target, TriggerOpTypes.DELETE, COLLECTION_KEY);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size > 0;\n const result = target.clear();\n if (hadItems) {\n trigger(target, TriggerOpTypes.CLEAR, COLLECTION_KEY);\n }\n return result;\n },\n forEach(callback, thisArg) {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n target.forEach((value, key) => {\n const wrappedValue = isShallowMode || !isObject(value) ? value : reactiveImpl(value);\n const wrappedKey = isShallowMode || !isObject(key) ? key : reactiveImpl(key);\n callback.call(thisArg, wrappedValue, wrappedKey, this);\n });\n },\n [Symbol.iterator]() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target[Symbol.iterator]();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (isShallowMode) {\n return { value, done };\n }\n if (Array.isArray(value)) {\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v) : v),\n done\n };\n }\n return {\n value: isObject(value) ? reactiveImpl(value) : value,\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n get size() {\n const target = toRaw(this);\n track(target, COLLECTION_KEY);\n return target.size;\n },\n keys() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.keys();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n return {\n value: isShallowMode || !isObject(value) ? value : reactiveImpl(value),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n values() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.values();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n return {\n value: isShallowMode || !isObject(value) ? value : reactiveImpl(value),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n },\n entries() {\n const target = toRaw(this);\n const isShallowMode = isShallow(this);\n track(target, COLLECTION_KEY);\n const rawIterator = target.entries();\n return {\n next() {\n const { value, done } = rawIterator.next();\n if (done) {\n return { value, done };\n }\n if (isShallowMode) {\n return { value, done };\n }\n return {\n value: value.map((v) => isObject(v) ? reactiveImpl(v) : v),\n done\n };\n },\n [Symbol.iterator]() {\n return this;\n }\n };\n }\n};\nvar weakInstrumentations = {\n get(key) {\n const target = toRaw(this);\n track(target, WEAK_COLLECTION_KEY);\n let value = target.get(key);\n if (value === void 0 && isReactive(key)) {\n value = target.get(toRaw(key));\n }\n if (isObject(value) && !isShallow(this)) {\n return reactiveImpl(value);\n }\n return value;\n },\n set(key, value) {\n const target = toRaw(this);\n const rawKey = toRaw(key);\n const hadKey = target.has(rawKey);\n const oldValue = target.get(rawKey);\n const rawValue = toRaw(value);\n target.set(rawKey, rawValue);\n if (!hadKey || hasChanged(oldValue, rawValue)) {\n trigger(target, TriggerOpTypes.SET, WEAK_COLLECTION_KEY);\n }\n return this;\n },\n add(value) {\n const target = toRaw(this);\n const rawValue = toRaw(value);\n const hadValue = target.has(rawValue);\n target.add(rawValue);\n if (!hadValue) {\n trigger(target, TriggerOpTypes.ADD, WEAK_COLLECTION_KEY);\n }\n return this;\n },\n has(key) {\n const target = toRaw(this);\n track(target, WEAK_COLLECTION_KEY);\n let hasKey = target.has(key);\n if (!hasKey && isReactive(key)) {\n hasKey = target.has(toRaw(key));\n }\n return hasKey;\n },\n delete(key) {\n const target = toRaw(this);\n const rawKey = toRaw(key);\n const hadKey = target.has(rawKey);\n const result = target.delete(rawKey);\n if (hadKey || result) {\n trigger(target, TriggerOpTypes.DELETE, WEAK_COLLECTION_KEY);\n }\n return result;\n }\n};\nvar objectHandlers = (shallow) => ({\n get(target, key, receiver) {\n if (key === \"_RAW\" /* RAW */) {\n return target;\n }\n if (key === \"_IS_REACTIVE\" /* IS_REACTIVE */) {\n return true;\n }\n if (key === \"_IS_SHALLOW\" /* IS_SHALLOW */) {\n return shallow;\n }\n const value = Reflect.get(target, key, receiver);\n const valueUnwrapped = isSignal(value) ? value.value : value;\n track(target, key);\n if (isObject(valueUnwrapped) && !shallow) {\n return reactiveImpl(valueUnwrapped);\n }\n return valueUnwrapped;\n },\n set: (target, key, value, receiver) => {\n const oldValue = Reflect.get(target, key, receiver);\n const result = Reflect.set(target, key, toRaw(value), receiver);\n if (hasChanged(value, oldValue)) {\n trigger(target, TriggerOpTypes.SET, key, value);\n }\n return result;\n },\n deleteProperty: (target, key) => {\n const hadKey = hasOwn(target, key);\n const result = Reflect.deleteProperty(target, key);\n if (hadKey && result) {\n trigger(target, TriggerOpTypes.DELETE, key, void 0);\n }\n return result;\n }\n});\nvar shallowObjectHandlers = objectHandlers(true);\nvar deepObjectHandlers = objectHandlers(false);\nfunction reactiveImpl(target, shallow = false) {\n if (!isObject(target)) {\n return target;\n }\n if (isReactive(target)) {\n return target;\n }\n const existingProxy = reactiveCaches.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n let handler;\n if (isArray(target)) {\n handler = shallow ? shallowArrayHandlers : deepArrayHandlers;\n } else if (isSet(target) || isMap(target)) {\n handler = collectionHandlers;\n } else if (isWeakMap(target) || isWeakSet(target)) {\n handler = weakCollectionHandlers;\n } else {\n handler = shallow ? shallowObjectHandlers : deepObjectHandlers;\n }\n const proxy = new Proxy(target, handler);\n reactiveCaches.set(target, proxy);\n return proxy;\n}\nfunction isReactive(target) {\n return !!(target && target[\"_IS_REACTIVE\" /* IS_REACTIVE */]);\n}\nfunction reactive(target) {\n if (isReactive(target)) {\n return target;\n }\n if (isSignal(target)) {\n return target;\n }\n return reactiveImpl(target);\n}\nfunction shallowReactive(target) {\n if (isReactive(target)) {\n return target;\n }\n if (isSignal(target)) {\n return target;\n }\n return reactiveImpl(target, true);\n}\nfunction isShallow(value) {\n return !!(value && value[\"_IS_SHALLOW\" /* IS_SHALLOW */]);\n}\nvar toReactive = (value) => isObject(value) ? reactive(value) : value;\n\n// src/signal.ts\nvar _a;\n_a = \"_IS_SIGNAL\" /* IS_SIGNAL */;\nvar SignalImpl = class {\n /**\n * Create a new Signal with the given initial value.\n *\n * @param value - Initial value\n * @param shallow - Whether only the top level should be reactive\n */\n constructor(value, shallow = false) {\n this.flag = 1 /* MUTABLE */;\n // Mark whether it's shallow reactive\n // @ts-ignore: used internally by isSignal typeguard\n this[_a] = true;\n const unwrapped = toRaw(value);\n this._rawValue = unwrapped;\n this[\"_IS_SHALLOW\" /* IS_SHALLOW */] = shallow;\n if (!isObject(unwrapped)) {\n this._value = unwrapped;\n } else {\n if (isReactive(value)) {\n this._value = value;\n } else {\n this._value = shallow ? shallowReactive(unwrapped) : reactive(unwrapped);\n }\n }\n }\n // dep getter, returns itself for dependency collection\n get dep() {\n return this;\n }\n get value() {\n const sub = activeSub;\n if (sub) {\n linkReactiveNode(this, sub);\n }\n const flags = this.flag;\n if (flags & 16 /* DIRTY */ && this.shouldUpdate()) {\n const subs = this.subLink;\n if (subs) {\n shallowPropagate2(subs);\n }\n }\n return this._value;\n }\n // value setter, triggers update when value changes\n set value(newValue) {\n if (isSignal(newValue)) {\n {\n warn(\n \"Setting a signal value to another signal is not recommended. The value will be unwrapped automatically.\"\n );\n }\n newValue = newValue.peek();\n }\n const originalValue = newValue;\n const rawValue = toRaw(newValue);\n if (!hasChanged(this._rawValue, rawValue)) {\n return;\n }\n this._oldValue = this._rawValue;\n this._rawValue = rawValue;\n this.flag |= 16 /* DIRTY */;\n if (!isObject(rawValue)) {\n this._value = rawValue;\n } else if (isReactive(originalValue)) {\n this._value = originalValue;\n } else {\n const shallow = this[\"_IS_SHALLOW\" /* IS_SHALLOW */];\n this._value = shallow ? shallowReactive(rawValue) : reactive(rawValue);\n }\n const subs = this.subLink;\n if (subs) {\n propagate(subs);\n }\n }\n // Check if the value should be updated\n shouldUpdate() {\n this.flag &= -17 /* DIRTY */;\n if (!(\"_oldValue\" in this)) {\n return true;\n }\n const changed = hasChanged(this._oldValue, this._rawValue);\n this._oldValue = this._rawValue;\n return changed;\n }\n // Get current value without triggering dependency tracking\n peek() {\n return this._value;\n }\n // set method is an alias for the value setter\n set(value) {\n this.value = value;\n }\n // Update value using an updater function\n update(updater) {\n const nextValue = updater(this.peek());\n if (isSignal(nextValue)) {\n {\n warn(\n \"Returning a signal from an update function is not recommended. The value will be unwrapped.\"\n );\n }\n this.value = nextValue.peek();\n } else {\n this.value = nextValue;\n }\n }\n};\nfunction signal(value) {\n if (isSignal(value)) {\n {\n warn(\n \"Creating a signal with another signal is not recommended. The value will be unwrapped.\"\n );\n }\n return value;\n }\n return new SignalImpl(value);\n}\nfunction shallowSignal(value) {\n if (isSignal(value)) {\n value = value.peek();\n }\n return new SignalImpl(value, true);\n}\nfunction isSignal(value) {\n return !!value && !!value[\"_IS_SIGNAL\" /* IS_SIGNAL */];\n}\nvar queue = /* @__PURE__ */ new Set();\nvar activePreFlushCbs = /* @__PURE__ */ new Set();\nvar p = Promise.resolve();\nvar isFlushPending = false;\nfunction nextTick(fn) {\n return fn ? p.then(fn) : p;\n}\nfunction queueJob(job) {\n queue.add(job);\n queueFlush();\n}\nfunction queueFlush() {\n if (!isFlushPending) {\n isFlushPending = true;\n nextTick(flushJobs);\n }\n}\nfunction queuePreFlushCb(cb) {\n activePreFlushCbs.add(cb);\n queueFlush();\n}\nfunction flushJobs() {\n isFlushPending = false;\n flushPreFlushCbs();\n while (queue.size > 0) {\n for (const job of queue) {\n try {\n job();\n } catch (_error) {\n {\n error(\"Error executing queued job:\", _error);\n }\n }\n }\n queue.clear();\n }\n}\nfunction flushPreFlushCbs() {\n const callbacks = Array.from(activePreFlushCbs);\n activePreFlushCbs.clear();\n for (const callback of callbacks) {\n try {\n callback();\n } catch (_error) {\n {\n error(\"Error executing pre-flush callback:\", _error);\n }\n }\n }\n}\nfunction createScheduler(effect2, flush) {\n switch (flush) {\n case \"sync\":\n return () => effect2();\n case \"pre\":\n return () => queuePreFlushCb(effect2);\n case \"post\":\n return () => queueJob(effect2);\n default:\n {\n warn(`Invalid flush timing: ${flush}. Defaulting to 'post'.`);\n }\n return () => queueJob(effect2);\n }\n}\n\n// src/batch.ts\nvar batchDepth = 0;\nfunction batch(fn) {\n startBatch();\n try {\n return fn();\n } finally {\n endBatch();\n }\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (batchDepth === 0) {\n warn(\n \"[Batch] endBatch() called without matching startBatch(). This indicates unbalanced batch calls in your code. Make sure every startBatch() has a corresponding endBatch(), or use the batch() function which handles this automatically.\"\n );\n return;\n }\n batchDepth--;\n if (batchDepth === 0) {\n flushJobs();\n }\n}\nfunction isBatching() {\n return batchDepth > 0;\n}\nfunction getBatchDepth() {\n return batchDepth;\n}\n\n// src/effect.ts\nvar _a2;\n_a2 = \"_IS_EFFECT\" /* IS_EFFECT */;\nvar EffectImpl = class {\n /**\n * Create an Effect instance\n *\n * @param fn - The effect function\n * @param options - Configuration options\n */\n constructor(fn, options) {\n this.flag = 2 /* WATCHING */ | 16 /* DIRTY */;\n // @ts-ignore: used internally by isEffect typeguard\n this[_a2] = true;\n // State management\n this._active = true;\n var _a5;\n this.fn = fn;\n if (options) {\n const scheduler = (_a5 = options.scheduler) != null ? _a5 : options.flush;\n if (scheduler) {\n this._flushScheduler = isFunction(scheduler) ? () => scheduler(this) : createScheduler(() => this.run(), scheduler);\n }\n if (options.onStop) this.onStop = options.onStop;\n {\n if (options.onTrack) this.onTrack = options.onTrack;\n if (options.onTrigger) this.onTrigger = options.onTrigger;\n }\n }\n }\n /**\n * Check if the Effect is active\n */\n get active() {\n return this._active;\n }\n /**\n * Check if the Effect is dirty (needs re-execution)\n */\n get dirty() {\n const flags = this.flag;\n if (flags & 16 /* DIRTY */) {\n return true;\n }\n if (flags & 32 /* PENDING */) {\n if (this.depLink && checkDirty(this.depLink, this)) {\n this.flag = flags & -33 /* PENDING */ | 16 /* DIRTY */;\n return true;\n }\n this.flag = flags & -33 /* PENDING */;\n }\n return false;\n }\n /**\n * Pause Effect execution\n *\n * When an effect is paused:\n * - It stops responding to dependency changes\n * - Notifications are ignored (see notify method)\n * - DIRTY and PENDING flags are still set when dependencies change\n * - The effect remains active and maintains its dependency links\n *\n * Use cases:\n * - Temporarily disable effects during bulk updates\n * - Prevent effects from running during initialization\n * - Control when side effects should execute\n *\n * @example\n * ```typescript\n * const count = signal(0);\n * const runner = effect(() => console.log(count.value));\n *\n * runner.effect.pause();\n * count.value = 1; // Effect won't run\n * count.value = 2; // Effect won't run\n * runner.effect.resume(); // Effect runs once with latest value\n * ```\n */\n pause() {\n this.flag |= 256 /* PAUSED */;\n }\n /**\n * Resume Effect execution\n *\n * When an effect is resumed:\n * - The PAUSED flag is cleared\n * - If dependencies changed during pause (DIRTY or PENDING flags set),\n * the effect executes immediately via notify()\n * - If no changes occurred, the effect simply becomes active again\n *\n * State management:\n * - Clears PAUSED flag atomically\n * - Checks for accumulated DIRTY/PENDING flags\n * - Triggers execution if needed\n *\n * @example\n * ```typescript\n * const count = signal(0);\n * const runner = effect(() => console.log(count.value));\n *\n * runner.effect.pause();\n * count.value = 1; // Queued\n * count.value = 2; // Queued\n * runner.effect.resume(); // Executes once with count.value = 2\n * ```\n */\n resume() {\n const flags = this.flag;\n const nextFlags = flags & -257 /* PAUSED */;\n this.flag = nextFlags;\n const wasDirty = (nextFlags & 16 /* DIRTY */) !== 0;\n const wasPending = (nextFlags & 32 /* PENDING */) !== 0;\n if (wasDirty || wasPending) {\n this.notify();\n }\n }\n /**\n * Execute the Effect function\n *\n * Core execution flow:\n * 1. Check if active\n * 2. Clear dirty flag\n * 3. Start tracking dependencies\n * 4. Execute user function\n * 5. End tracking, clean up stale dependencies\n \n * @returns The return value of the effect function\n */\n run() {\n if (!this._active) {\n return this.fn();\n }\n const flags = this.flag;\n this.flag = flags & -49 | 512 /* RUNNING */;\n const prevSub = startTracking(this);\n try {\n return this.fn();\n } catch (error5) {\n this.flag |= 16 /* DIRTY */;\n throw error5;\n } finally {\n this.flag &= -513 /* RUNNING */;\n endTracking(this, prevSub);\n }\n }\n /**\n * Get or create the job function for this effect\n */\n getJob() {\n if (!this._job) {\n this._job = () => this.run();\n }\n return this._job;\n }\n /**\n * Notify that the Effect needs to execute\n *\n * Called by dependent reactive values.\n * Decides whether to execute immediately or defer based on scheduling strategy.\n */\n notify() {\n var _a5;\n const flags = this.flag;\n if (!this._active || flags & (256 /* PAUSED */ | 512 /* RUNNING */ | 16 /* DIRTY */)) {\n return;\n }\n this.flag = flags | 16 /* DIRTY */;\n if (this == null ? void 0 : this.onTrigger) {\n this.onTrigger({\n effect: this,\n target: {},\n type: \"set\"\n });\n }\n if (this._flushScheduler) {\n (_a5 = this._flushScheduler) == null ? void 0 : _a5.call(this);\n } else if (isBatching()) {\n queueJob(this.getJob());\n } else {\n this.run();\n }\n }\n /**\n * Stop the Effect\n *\n * After stopping:\n * - No longer responds to dependency changes\n * - Disconnects all dependency links\n * - Clears cached job function\n * - Calls onStop callback\n * - Verifies complete cleanup in development mode\n */\n stop() {\n if (!this._active) {\n {\n warn(\"[Effect] Attempting to stop an already stopped effect.\");\n }\n return;\n }\n this._active = false;\n let dep = this.depLink;\n while (dep) {\n dep = unlinkReactiveNode(dep, this);\n }\n let sub = this.subLink;\n while (sub) {\n sub = unlinkReactiveNode(sub);\n }\n this._job = void 0;\n this._flushScheduler = void 0;\n this.depLinkTail = void 0;\n this.subLinkTail = void 0;\n {\n if (this.depLink) {\n error(\n \"[Effect] Cleanup verification failed: depLink not cleared. This indicates a memory leak in the dependency tracking system.\"\n );\n }\n if (this.subLink) {\n error(\n \"[Effect] Cleanup verification failed: subLink not cleared. This indicates a memory leak in the subscription system.\"\n );\n }\n }\n if (this == null ? void 0 : this.onStop) {\n this.onStop();\n }\n }\n};\nfunction effect(fn, options) {\n const effectInstance = new EffectImpl(fn, options);\n try {\n effectInstance.run();\n } catch (_error) {\n effectInstance.stop();\n {\n error(\n \"[Effect] Effect failed during initial execution and has been stopped. Fix the error in your effect function.\",\n _error\n );\n }\n throw _error;\n }\n const runner = () => effectInstance.run();\n runner.effect = effectInstance;\n runner.stop = () => effectInstance.stop();\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nfunction isEffect(value) {\n return !!(value && value[\"_IS_EFFECT\" /* IS_EFFECT */]);\n}\nfunction memoEffect(fn, initialState, options) {\n let currentState = initialState;\n const effectFn = () => {\n const result = fn(currentState);\n currentState = result;\n };\n return effect(effectFn, options);\n}\nvar NO_VALUE = /* @__PURE__ */ Symbol(\"computed-no-value\");\nvar _a3;\n_a3 = \"_IS_COMPUTED\" /* IS_COMPUTED */;\nvar ComputedImpl = class {\n /**\n * Create a Computed instance\n *\n * @param getter - The computation function\n * @param setter - Optional setter function\n * @param onTrack - Optional debug callback for dependency tracking\n * @param onTrigger - Optional debug callback for triggers\n */\n constructor(getter, setter, onTrack, onTrigger) {\n this.flag = 1 /* MUTABLE */ | 16 /* DIRTY */;\n // @ts-ignore: used internally by isComputed typeguard\n this[_a3] = true;\n // Cache\n // Use symbol sentinel to distinguish \"no value\" from undefined/null values\n this._value = NO_VALUE;\n this.getter = getter;\n this.setter = setter;\n this.onTrack = onTrack;\n this.onTrigger = onTrigger;\n this.flag |= 16 /* DIRTY */;\n }\n get value() {\n if (activeSub) {\n linkReactiveNode(this, activeSub);\n }\n const flags = this.flag;\n const hasValue = this._value !== NO_VALUE;\n if (hasValue && !(flags & (16 /* DIRTY */ | 32 /* PENDING */))) {\n return this._value;\n }\n if (!hasValue || flags & 16 /* DIRTY */) {\n this.recompute();\n return this._value;\n }\n if (flags & 32 /* PENDING */) {\n if (this.depLink && checkDirty(this.depLink, this)) {\n this.recompute();\n } else {\n this.flag = flags & -33 /* PENDING */;\n }\n }\n return this._value;\n }\n /**\n * Set value (only effective when setter is provided)\n *\n * @param newValue - The new value\n */\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else {\n warn(\n \"[Computed] Cannot set readonly computed value. Provide a setter in the computed options to make it writable.\\nExample: computed({ get: () => value, set: (v) => { ... } })\"\n );\n }\n }\n /**\n * Read value without tracking dependencies\n *\n * @returns Current value\n */\n peek() {\n if (this._value === NO_VALUE) {\n this.recompute();\n }\n return this._value;\n }\n /**\n * Recompute the value\n *\n * computation logic:\n * 1. Start tracking dependencies\n * 2. Execute getter function\n * 3. Check if value changed using optimized comparison\n * 4. If changed, update cache and notify subscribers\n * 5. End tracking, clean up stale dependencies\n * @private\n */\n recompute() {\n const oldValue = this._value;\n const hadValue = oldValue !== NO_VALUE;\n const prevSub = startTracking(this);\n try {\n const newValue = this.getter();\n const flags = this.flag;\n const subs = this.subLink;\n const clearMask = ~(16 /* DIRTY */ | 32 /* PENDING */);\n const valueChanged = !hadValue || hasChanged(oldValue, newValue);\n if (valueChanged) {\n this._value = newValue;\n this.flag = flags & clearMask;\n if (this.onTrigger) {\n this.onTrigger({\n effect: this,\n target: this,\n type: \"set\",\n key: \"value\",\n newValue\n });\n }\n if (subs) {\n shallowPropagate(subs);\n }\n } else {\n this.flag = flags & clearMask;\n }\n } catch (_error) {\n const clearMask = -49;\n this.flag &= clearMask;\n this._value = NO_VALUE;\n {\n error(\n \"[Computed] Error occurred while computing value.\\nThe computed will retry on next access.\\nCommon causes:\\n - Accessing undefined properties\\n - Circular dependencies\\n - Exceptions in getter function\\nCheck your getter function for errors.\",\n _error\n );\n }\n throw _error;\n } finally {\n endTracking(this, prevSub);\n }\n }\n /**\n * Check if update is needed\n *\n * Internal use, called by reactive system.\n *\n * @returns true if value changed\n */\n shouldUpdate() {\n const hadValue = this._value !== NO_VALUE;\n const oldValue = this._value;\n this.recompute();\n if (!hadValue) {\n return true;\n }\n return hasChanged(this._value, oldValue);\n }\n};\nfunction computed(getterOrOptions) {\n if (isComputed(getterOrOptions)) {\n {\n warn(\n \"[Computed] Creating a computed from another computed is not recommended. The existing computed will be returned to avoid unnecessary wrapping.\"\n );\n }\n return getterOrOptions;\n }\n if (!getterOrOptions) {\n throw new Error(\n \"[Computed] Invalid argument: computed() requires a getter function or options object.\"\n );\n }\n if (isFunction(getterOrOptions)) {\n return new ComputedImpl(getterOrOptions);\n }\n if (isPlainObject(getterOrOptions)) {\n const { get, set, onTrack, onTrigger } = getterOrOptions;\n if (!get) {\n throw new Error(\n \"[Computed] Invalid options: getter function is required.\\nUsage: computed({ get: () => value, set: (v) => { ... } })\"\n );\n }\n if (!isFunction(get)) {\n throw new TypeError(\n `[Computed] Invalid options: getter must be a function.\nReceived: ${typeof get}`\n );\n }\n return new ComputedImpl(get, set, onTrack, onTrigger);\n }\n throw new Error(\n `[Computed] Invalid argument: expected a function or options object.\nReceived: ${typeof getterOrOptions}`\n );\n}\nfunction isComputed(value) {\n return !!value && !!value[\"_IS_COMPUTED\" /* IS_COMPUTED */];\n}\nfunction createOptionsStore(options) {\n if (!options.state) {\n warn(\"Store state is required\");\n throw new Error(\"Store state is required\");\n }\n const { state, getters, actions } = options;\n const initState = __spreadValues({}, state);\n const reactiveState = reactive(state);\n const subscriptions = /* @__PURE__ */ new Set();\n const actionCallbacks = /* @__PURE__ */ new Set();\n const notifySubscribers = (state2) => {\n subscriptions.forEach((callback) => callback(state2));\n actionCallbacks.forEach((callback) => callback(state2));\n };\n const defaultActions = {\n patch$(payload) {\n if (!payload) {\n warn(\"Patch payload is required\");\n return;\n }\n batch(() => {\n Object.assign(reactiveState, payload);\n });\n notifySubscribers(reactiveState);\n },\n subscribe$(callback) {\n if (!callback) {\n warn(\"Subscribe callback is required\");\n return;\n }\n subscriptions.add(callback);\n },\n unsubscribe$(callback) {\n subscriptions.delete(callback);\n },\n onAction$(callback) {\n if (!callback) {\n warn(\"Action callback is required\");\n return;\n }\n actionCallbacks.add(callback);\n },\n reset$() {\n batch(() => {\n Object.assign(reactiveState, initState);\n });\n notifySubscribers(reactiveState);\n }\n };\n const store = __spreadValues(__spreadProps(__spreadValues({}, reactiveState), {\n state: reactiveState\n }), defaultActions);\n if (getters) {\n for (const key in getters) {\n const getter = getters[key];\n if (!getter) continue;\n Object.defineProperty(store, key, {\n get: () => computed(() => getter.call(store, reactiveState)).value,\n enumerable: true,\n configurable: true\n });\n }\n }\n if (actions) {\n for (const key in actions) {\n const action = actions[key];\n if (action) {\n Reflect.set(store, key, (...args) => {\n const result = action.apply(reactiveState, args);\n actionCallbacks.forEach((callback) => callback(reactiveState));\n return result;\n });\n }\n }\n }\n return store;\n}\nfunction createClassStore(StoreClass) {\n const instance = new StoreClass();\n const state = /* @__PURE__ */ Object.create(null);\n const getters = {};\n const actions = {};\n Object.getOwnPropertyNames(instance).forEach((key) => {\n state[key] = instance[key];\n });\n Object.getOwnPropertyNames(StoreClass.prototype).forEach((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(StoreClass.prototype, key);\n if (descriptor) {\n if (typeof descriptor.get === \"function\") {\n getters[key] = function() {\n return descriptor.get.call(this);\n };\n } else if (typeof descriptor.value === \"function\" && key !== \"constructor\") {\n actions[key] = function(...args) {\n return descriptor.value.apply(this, args);\n };\n }\n }\n });\n return {\n state,\n getters,\n actions\n };\n}\nfunction createStore(storeDefinition) {\n if (!storeDefinition) {\n warn(\"Store definition is required\");\n throw new Error(\"Store definition is required\");\n }\n return () => {\n let options;\n if (isFunction(storeDefinition)) {\n options = createClassStore(storeDefinition);\n } else {\n options = storeDefinition;\n }\n const store = createOptionsStore(options);\n if (isFunction(storeDefinition) && options.actions) {\n Object.keys(options.actions).forEach((key) => {\n Reflect.set(store, key, options.actions[key].bind(store));\n });\n }\n return store;\n };\n}\nvar _a4, _b;\nvar RefImpl = class extends (_b = SignalImpl, _a4 = \"_IS_REF\" /* IS_REF */, _b) {\n /**\n * Creates a new ref with the given initial value.\n *\n * @param value - The initial value\n */\n constructor(value) {\n super(value, true);\n // @ts-ignore: used internally by isRef typeguard\n this[_a4] = true;\n }\n get value() {\n const sub = activeSub;\n if (sub) {\n linkReactiveNode(this, sub);\n }\n return this._value;\n }\n set value(newValue) {\n if (isSignal(newValue)) {\n newValue = newValue.peek();\n }\n if (isRef(newValue)) {\n newValue = newValue.value;\n }\n if (hasChanged(this._value, newValue)) {\n this._rawValue = newValue;\n this._value = newValue;\n this.flag |= 16 /* DIRTY */;\n if (this.subLink) {\n propagate(this.subLink);\n }\n }\n }\n};\nfunction ref(value = void 0) {\n if (isRef(value)) {\n return value;\n }\n if (isSignal(value)) {\n return new RefImpl(value.peek());\n }\n return new RefImpl(value);\n}\nfunction isRef(value) {\n return !!value && !!value[\"_IS_REF\" /* IS_REF */];\n}\nvar INITIAL_WATCHER_VALUE = {};\nvar cleanupMap = /* @__PURE__ */ new WeakMap();\nfunction traverse(value, seen = /* @__PURE__ */ new Set()) {\n if (!isObject(value) || seen.has(value)) {\n return value;\n }\n seen.add(value);\n if (isSignal(value) || isComputed(value)) {\n return traverse(value.value, seen);\n }\n if (Array.isArray(value)) {\n for (const element of value) {\n traverse(element, seen);\n }\n } else if (isMap(value)) {\n value.forEach((v) => {\n traverse(v, seen);\n });\n value.keys();\n value.values();\n } else if (isSet(value)) {\n value.forEach((v) => {\n traverse(v, seen);\n });\n value.values();\n } else {\n Object.keys(value).forEach((key) => {\n traverse(value[key], seen);\n });\n }\n return value;\n}\nfunction cloneValue(value) {\n if (!isObject(value)) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneValue(item));\n }\n if (isMap(value)) {\n const cloned2 = /* @__PURE__ */ new Map();\n value.forEach((v, k) => {\n cloned2.set(k, cloneValue(v));\n });\n return cloned2;\n }\n if (isSet(value)) {\n const cloned2 = /* @__PURE__ */ new Set();\n value.forEach((v) => {\n cloned2.add(cloneValue(v));\n });\n return cloned2;\n }\n const cloned = {};\n for (const key of Object.keys(value)) {\n cloned[key] = cloneValue(value[key]);\n }\n return cloned;\n}\nfunction resolveSource(source) {\n if (Array.isArray(source)) {\n return () => source.map((s) => {\n if (isSignal(s) || isComputed(s)) {\n return s.value;\n }\n if (isReactive(s)) {\n return traverse(s);\n }\n if (isFunction(s)) {\n return s();\n }\n return s;\n });\n }\n if (isFunction(source)) {\n return source;\n }\n if (isSignal(source)) {\n return () => source.value;\n }\n if (isObject(source) && \"value\" in source) {\n return () => source.value;\n }\n if (isReactive(source)) {\n return () => traverse(source);\n }\n return () => source;\n}\nfunction watch(source, callback, options = {}) {\n const { immediate = false, deep = false } = options;\n let oldValue = INITIAL_WATCHER_VALUE;\n const getter = resolveSource(source);\n const job = () => {\n const currentEffect = runner.effect;\n if (!currentEffect.run) {\n return;\n }\n const newValue = currentEffect.run();\n if (hasChanged(newValue, oldValue)) {\n callback(newValue, oldValue === INITIAL_WATCHER_VALUE ? void 0 : oldValue);\n oldValue = cloneValue(newValue);\n }\n };\n const runner = effect(\n () => {\n const value = getter();\n if (deep) {\n traverse(value);\n }\n return value;\n },\n {\n // Use scheduler to queue job, implementing async and debouncing.\n scheduler: () => queueJob(job)\n }\n );\n if (immediate) {\n job();\n } else {\n oldValue = cloneValue(runner.effect.run());\n }\n return () => {\n runner.stop();\n const cleanups = cleanupMap.get(runner.effect);\n if (cleanups) {\n cleanups.forEach((fn) => fn());\n cleanupMap.delete(runner.effect);\n }\n };\n}\n\nexport { TriggerOpTypes, batch, computed, createStore, effect, endBatch, getBatchDepth, isBatching, isComputed, isEffect, isReactive, isRef, isShallow, isSignal, memoEffect, nextTick, queueJob, queuePreFlushCb, reactive, ref, shallowReactive, shallowSignal, signal, startBatch, stop, toRaw, toReactive, trigger, untrack, watch };\n","import { isComputed, isSignal } from '@estjs/signals';\nimport { isString, normalizeClassName, normalizeStyle, styleToString } from '@estjs/shared';\n\n/**\n * Normalize component properties\n *\n * Special handling for class and style attributes, converting them to normalized format\n *\n * @param props - Original component properties\n * @returns Normalized component properties\n */\nexport function normalizeProps(props: Record<string, any> | null): Record<string, any> | null {\n if (!props) {\n return null;\n }\n\n const { class: className, style } = props;\n\n // Normalize class attribute\n if (className && !isString(className)) {\n props.class = normalizeClassName(className);\n }\n\n // Normalize style attribute\n if (style) {\n props.style = normalizeStyle(style);\n }\n\n return props;\n}\n\n/**\n * Generate server-side rendering attribute string\n *\n * Generate HTML-compatible attribute string based on attribute type, handling special cases:\n * - Automatic unwrapping of reactive values\n * - Normalization of special attributes (style/class)\n * - Ignoring event attributes\n * - Special handling for boolean attributes\n *\n * @param attrName - Attribute name\n * @param attrValue - Attribute value\n * @param hydrationId - Hydration ID (for client-side reuse)\n * @returns Formatted HTML attribute string\n */\nexport function setSSGAttr(attrName: string, attrValue: any, hydrationId: string): string {\n // Handle reactive values (signals or computed values)\n if (isSignal(attrValue) || isComputed(attrValue)) {\n return setSSGAttr(attrName, attrValue.value, hydrationId);\n }\n\n // Ignore null, undefined, and false value attributes\n if (!attrValue && attrValue !== 0) {\n return '';\n }\n\n // Special attribute handling: style\n if (attrName === 'style') {\n const normalizedStyle = normalizeStyle(attrValue);\n if (!normalizedStyle) {\n return '';\n }\n\n if (isString(normalizedStyle)) {\n return ` style=\"${normalizedStyle}\"`;\n }\n\n return ` style=\"${styleToString(normalizedStyle)}\"`;\n }\n\n // Special attribute handling: class\n if (attrName === 'class') {\n const normalizedClassName = normalizeClassName(attrValue);\n return normalizedClassName ? ` class=\"${normalizedClassName}\"` : '';\n }\n\n // Ignore event handler attributes (client-side behavior)\n if (attrName.startsWith('on')) {\n return '';\n }\n\n // Special handling for boolean attributes\n if (attrValue === true) {\n return ` ${attrName}`;\n }\n\n // Standard attribute handling\n return ` ${attrName}=\"${attrValue}\"`;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@estjs/server",
3
- "version": "0.0.15-beta.13",
3
+ "version": "0.0.15-beta.14",
4
4
  "description": "Server-side rendering for Essor framework",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -34,8 +34,8 @@
34
34
  },
35
35
  "sideEffects": false,
36
36
  "dependencies": {
37
- "@estjs/shared": "0.0.15-beta.13",
38
- "@estjs/template": "0.0.15-beta.13"
37
+ "@estjs/shared": "0.0.15-beta.14",
38
+ "@estjs/template": "0.0.15-beta.14"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsup && cross-env NODE_ENV=production tsup --clean=false --treeshake --sourcemap=false",