@but212/atom-effect-jquery 0.29.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/atom-effect-jquery.min.js +10 -2
- package/dist/atom-effect-jquery.min.js.map +1 -1
- package/dist/index.cjs +10 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.mjs +1349 -1185
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atom-effect-jquery.min.js","names":["$"],"sources":["../../core/dist/index.mjs","../src/utils/index.ts","../src/constants.ts","../src/utils/debug.ts","../src/core/namespace.ts","../src/utils/pool.ts","../src/core/registry.ts","../src/core/jquery-patch.ts","../src/types.ts","../src/bindings/input-binding.ts","../src/core/effect-factory.ts","../src/utils/sanitize.ts","../src/bindings/unified.ts","../src/bindings/form.ts","../src/bindings/chainable.ts","../src/bindings/list.ts","../src/bindings/mount.ts","../src/features/route.ts","../src/features/fetch.ts","../src/index.ts"],"sourcesContent":["var y = {\n IDLE: \"idle\",\n PENDING: \"pending\",\n RESOLVED: \"resolved\",\n REJECTED: \"rejected\"\n}, I = {\n DISPOSED: 1,\n EXECUTING: 8\n}, B = {\n DISPOSED: 1,\n IS_COMPUTED: 2,\n DIRTY: 8,\n IDLE: 16,\n PENDING: 32,\n RESOLVED: 64,\n REJECTED: 128,\n RECOMPUTING: 256,\n HAS_ERROR: 512,\n FORCE_COMPUTE: 1024\n}, a = {\n DISPOSED: 1,\n SYNC: 8,\n NOTIFICATION_SCHEDULED: 16\n}, C = {\n MAX_EXECUTIONS_PER_SECOND: 1e3,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n MAX_EXECUTIONS_PER_FLUSH: 1e4,\n MAX_FLUSH_ITERATIONS: 1e3,\n MIN_FLUSH_ITERATIONS: 10,\n BATCH_QUEUE_SHRINK_THRESHOLD: 1e3\n}, Z = {\n WARN_INFINITE_LOOP: !0,\n EFFECT_FREQUENCY_WINDOW: 1e3\n}, ut = { MAX_PROMISE_ID: Number.MAX_SAFE_INTEGER - 1 }, b = {\n UNINITIALIZED: -1,\n MIN: 1\n}, X = 1073741823, Tt = (typeof process < \"u\" && process.env, !1), Y = Object.freeze([]), T = class extends Error {\n constructor(t, s = null, e = !0) {\n super(t), this.cause = s, this.recoverable = e, this.name = \"AtomError\";\n }\n}, m = class extends T {\n constructor(t, s = null) {\n super(t, s, !0), this.name = \"ComputedError\";\n }\n}, v = class extends T {\n constructor(t, s = null) {\n super(t, s, !1), this.name = \"EffectError\";\n }\n}, U = class extends T {\n constructor(t, s = null) {\n super(t, s, !1), this.name = \"SchedulerError\";\n }\n}, c = {\n COMPUTED_MUST_BE_FUNCTION: \"Computed target must be a function\",\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: \"Async computation pending with no default value\",\n COMPUTED_COMPUTATION_FAILED: \"Computation execution failed\",\n COMPUTED_ASYNC_COMPUTATION_FAILED: \"Async computation execution failed\",\n COMPUTED_CIRCULAR_DEPENDENCY: \"Circular dependency detected\",\n COMPUTED_DISPOSED: \"Attempted to access disposed computed\",\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: \"Subscriber must be a function or Subscriber object\",\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: \"Subscriber execution failed\",\n EFFECT_MUST_BE_FUNCTION: \"Effect target must be a function\",\n EFFECT_EXECUTION_FAILED: \"Effect execution failed\",\n EFFECT_CLEANUP_FAILED: \"Effect cleanup failed\",\n EFFECT_DISPOSED: \"Attempted to run disposed effect\",\n SCHEDULER_FLUSH_OVERFLOW: (t, s) => `Maximum flush iterations (${t}) exceeded. ${s} jobs dropped. Possible infinite loop.`,\n CALLBACK_ERROR_IN_ERROR_HANDLER: \"Exception encountered in onError handler\",\n EFFECT_FREQUENCY_LIMIT_EXCEEDED: \"Effect executed too frequently within 1 second. Suspected infinite loop.\",\n SCHEDULER_CALLBACK_MUST_BE_FUNCTION: \"Scheduler callback must be a function\",\n SCHEDULER_END_BATCH_WITHOUT_START: \"endBatch() called without matching startBatch(). Ignoring.\",\n BATCH_CALLBACK_MUST_BE_FUNCTION: \"Batch callback must be a function\"\n};\nfunction g(t, s, e) {\n return t instanceof T ? t : t instanceof Error ? new s(`${t.name || t.constructor.name || \"Error\"} (${e}): ${t.message}`, t) : new s(`Unexpected error (${e}): ${String(t)}`);\n}\nvar q = /* @__PURE__ */ Symbol(\"AtomEffect.DebugName\"), lt = /* @__PURE__ */ Symbol(\"AtomEffect.Id\"), j = /* @__PURE__ */ Symbol(\"AtomEffect.Type\"), L = /* @__PURE__ */ Symbol(\"AtomEffect.NoDefaultValue\"), ht = class {\n constructor() {\n this.enabled = !1, this.warnInfiniteLoop = Z.WARN_INFINITE_LOOP;\n }\n warn(t, s) {\n }\n attachDebugInfo(t, s, e) {\n }\n getDebugName(t) {\n if (t != null)\n return t[q];\n }\n getDebugType(t) {\n if (t != null)\n return t[j];\n }\n}, G = new ht(), ct = 1, _t = () => ct++ | 0, J = class {\n constructor() {\n this._s0 = null, this._s1 = null, this._s2 = null, this._s3 = null, this._count = 0, this._overflow = null, this._freeIndices = null;\n }\n get size() {\n return this._count;\n }\n getAt(t) {\n if (t < 4) switch (t) {\n case 0:\n return this._s0;\n case 1:\n return this._s1;\n case 2:\n return this._s2;\n case 3:\n return this._s3;\n }\n const s = this._overflow;\n if (s !== null) {\n const e = s[t - 4];\n return e === void 0 ? null : e;\n }\n return null;\n }\n setAt(t, s) {\n switch (t) {\n case 0:\n this._s0 = s;\n break;\n case 1:\n this._s1 = s;\n break;\n case 2:\n this._s2 = s;\n break;\n case 3:\n this._s3 = s;\n break;\n default:\n this._overflow ??= [], this._overflow[t - 4] = s;\n }\n t >= this._count && (this._count = t + 1);\n }\n truncateFrom(t) {\n const s = this._count;\n if (t >= s) return;\n if (t <= 3) {\n if (t <= 0) {\n const i = this._s0;\n i != null && (this._onItemRemoved(i), this._s0 = null);\n }\n if (t <= 1) {\n const i = this._s1;\n i != null && (this._onItemRemoved(i), this._s1 = null);\n }\n if (t <= 2) {\n const i = this._s2;\n i != null && (this._onItemRemoved(i), this._s2 = null);\n }\n if (t <= 3) {\n const i = this._s3;\n i != null && (this._onItemRemoved(i), this._s3 = null);\n }\n }\n const e = this._overflow;\n if (e !== null && s > 4) {\n const i = t > 4 ? t - 4 : 0, r = e.length;\n for (let n = i; n < r; n++) {\n const o = e[n];\n o != null && (this._onItemRemoved(o), e[n] = null);\n }\n t <= 4 ? (e.length = 0, this._overflow = null) : e.length = t - 4;\n }\n this._freeIndices !== null && (this._freeIndices = null), this._count = t;\n }\n _onItemRemoved(t) {\n }\n add(t) {\n if (this._s0 === null) {\n this._s0 = t, this._count++;\n return;\n }\n if (this._s1 === null) {\n this._s1 = t, this._count++;\n return;\n }\n if (this._s2 === null) {\n this._s2 = t, this._count++;\n return;\n }\n if (this._s3 === null) {\n this._s3 = t, this._count++;\n return;\n }\n this._addToOverflow(t);\n }\n _addToOverflow(t) {\n const s = this._overflow;\n if (s === null) this._overflow = [t];\n else {\n const e = this._freeIndices;\n e !== null && e.length > 0 ? s[e.pop()] = t : s.push(t);\n }\n this._count++;\n }\n remove(t) {\n if (this._s0 === t)\n return this._s0 = null, this._count--, !0;\n if (this._s1 === t)\n return this._s1 = null, this._count--, !0;\n if (this._s2 === t)\n return this._s2 = null, this._count--, !0;\n if (this._s3 === t)\n return this._s3 = null, this._count--, !0;\n const s = this._overflow;\n if (s == null) return !1;\n for (let e = 0, i = s.length; e < i; e++) if (s[e] === t) {\n s[e] = null, this._count--;\n let r = this._freeIndices;\n return r === null && (r = this._freeIndices = []), r.push(e), !0;\n }\n return !1;\n }\n has(t) {\n if (this._count === 0) return !1;\n if (this._s0 === t || this._s1 === t || this._s2 === t || this._s3 === t) return !0;\n const s = this._overflow;\n if (s != null) {\n for (let e = 0, i = s.length; e < i; e++) if (s[e] === t) return !0;\n }\n return !1;\n }\n forEach(t) {\n const s = this._count;\n if (s === 0) return;\n let e = 0;\n const i = this._s0;\n if (i != null && (t(i), ++e === s))\n return;\n const r = this._s1;\n if (r != null && (t(r), ++e === s))\n return;\n const n = this._s2;\n if (n != null && (t(n), ++e === s))\n return;\n const o = this._s3;\n if (o != null && (t(o), ++e === s))\n return;\n const u = this._overflow;\n if (u != null) for (let l = 0, h = u.length; l < h; l++) {\n const f = u[l];\n if (f != null && (t(f), ++e === s))\n return;\n }\n }\n forEachIndexed(t) {\n const s = this._count;\n if (s === 0) return 0;\n let e = 0;\n const i = this._s0;\n if (i != null && (t(i), ++e === s))\n return e;\n const r = this._s1;\n if (r != null && (t(r), ++e === s))\n return e;\n const n = this._s2;\n if (n != null && (t(n), ++e === s))\n return e;\n const o = this._s3;\n if (o != null && (t(o), ++e === s))\n return e;\n const u = this._overflow;\n if (u != null) for (let l = 0, h = u.length; l < h; l++) {\n const f = u[l];\n if (f != null && (t(f), ++e === s))\n return e;\n }\n return e;\n }\n compact() {\n const t = this._overflow;\n if (t === null) return;\n let s = t.length;\n if (s === 0) return;\n let e = 0;\n for (; e < s; ) if (t[e] === null) {\n for (; s > e && t[s - 1] === null; )\n t.pop(), s--;\n s > e && (t[e] = t.pop(), s--, e++);\n } else e++;\n this._freeIndices = null, s === 0 && (this._overflow = null);\n }\n clear() {\n this._s0 = null, this._s1 = null, this._s2 = null, this._s3 = null, this._count = 0, this._overflow !== null && (this._overflow.length = 0, this._overflow = null), this._freeIndices = null;\n }\n dispose() {\n this.clear();\n }\n}, tt = class extends J {\n constructor(...t) {\n super(...t), this._map = null, this._SCAN_THRESHOLD = 32, this.hasComputeds = !1;\n }\n prepareTracking() {\n this.hasComputeds = !1;\n }\n _onItemRemoved(t) {\n const s = t.unsub;\n s && s();\n }\n claimExisting(t, s) {\n const e = this._count;\n if (s >= e) return !1;\n const i = e - s;\n if (this._map !== null || i > this._SCAN_THRESHOLD) return this._claimViaMap(t, s);\n if (s < 4) switch (s) {\n case 0: {\n const n = this._s0;\n if (n && n.node === t && n.unsub)\n return n.version = t.version, !0;\n }\n case 1:\n if (e > 1) {\n const n = this._s1;\n if (n && n.node === t && n.unsub)\n return n.version = t.version, s !== 1 && (this._s1 = this._s0, this._s0 = n), !0;\n }\n case 2:\n if (e > 2) {\n const n = this._s2;\n if (n && n.node === t && n.unsub) {\n if (n.version = t.version, s !== 2) {\n const o = s === 0 ? this._s0 : this._s1;\n s === 0 ? this._s0 = n : this._s1 = n, this._s2 = o;\n }\n return !0;\n }\n }\n case 3:\n if (e > 3) {\n const n = this._s3;\n if (n && n.node === t && n.unsub) {\n if (n.version = t.version, s !== 3) {\n let o;\n s === 0 ? (o = this._s0, this._s0 = n) : s === 1 ? (o = this._s1, this._s1 = n) : (o = this._s2, this._s2 = n), this._s3 = o;\n }\n return !0;\n }\n }\n }\n const r = this._overflow;\n if (r) {\n const n = t.version, o = s > 4 ? s : 4, u = r.length;\n for (let l = o - 4; l < u; l++) {\n const h = r[l];\n if (h && h.node === t && h.unsub)\n return h.version = n, this._swapGeneral(l + 4, s, h), !0;\n }\n }\n return !1;\n }\n _claimViaMap(t, s) {\n let e = this._map;\n if (e === null) {\n e = this._map = /* @__PURE__ */ new Map();\n const n = this._count;\n if (s < 4) {\n const u = this._s0;\n s <= 0 && u?.unsub && e.set(u.node, 0);\n const l = this._s1;\n s <= 1 && l?.unsub && e.set(l.node, 1);\n const h = this._s2;\n s <= 2 && h?.unsub && e.set(h.node, 2);\n const f = this._s3;\n s <= 3 && f?.unsub && e.set(f.node, 3);\n }\n const o = this._overflow;\n if (o && n > 4) {\n const u = s > 4 ? s : 4, l = o.length;\n for (let h = u - 4; h < l; h++) {\n const f = o[h];\n f?.unsub && e.set(f.node, h + 4);\n }\n }\n }\n const i = e.get(t);\n if (i === void 0 || i < s) return !1;\n const r = this.getAt(i);\n if (r == null || !r.unsub) return !1;\n if (r.version = t.version, i !== s) {\n let n;\n s === 0 ? n = this._s0 : s === 1 ? n = this._s1 : s === 2 ? n = this._s2 : s === 3 ? n = this._s3 : n = this._overflow[s - 4] ?? null, this.setAt(s, r), this.setAt(i, n), n?.unsub && e.set(n.node, i), e.set(t, s);\n }\n return !0;\n }\n _swapGeneral(t, s, e) {\n if (t === s) return;\n let i;\n if (s === 0 ? i = this._s0 : s === 1 ? i = this._s1 : s === 2 ? i = this._s2 : s === 3 ? i = this._s3 : i = this._overflow[s - 4] ?? null, this.setAt(s, e), t === 0) this._s0 = i;\n else if (t === 1) this._s1 = i;\n else if (t === 2) this._s2 = i;\n else if (t === 3) this._s3 = i;\n else {\n const r = this._overflow;\n r[t - 4] = i;\n }\n }\n insertNew(t, s) {\n const e = this._count;\n if (t < e) {\n let i;\n t === 0 ? i = this._s0 : t === 1 ? i = this._s1 : t === 2 ? i = this._s2 : t === 3 ? i = this._s3 : i = this._overflow[t - 4] ?? null, i != null && (this._addToOverflow(i), this._map !== null && i.unsub && this._map.set(i.node, this._count - 1));\n }\n if (t === 0) this._s0 = s;\n else if (t === 1) this._s1 = s;\n else if (t === 2) this._s2 = s;\n else if (t === 3) this._s3 = s;\n else {\n let i = this._overflow;\n i || (i = [], this._overflow = i), i[t - 4] = s;\n }\n t >= e && (this._count = t + 1);\n }\n truncateFrom(t) {\n t >= this._count || (super.truncateFrom(t), this._map !== null && (this._map.clear(), this._map = null));\n }\n disposeAll() {\n this._count > 0 && this.truncateFrom(0), this.hasComputeds = !1;\n }\n remove(t) {\n throw new Error(\"remove() is strictly prohibited in DepSlotBuffer to preserve sequential cache paths.\");\n }\n compact() {\n }\n}, z = class {\n constructor(t, s, e = void 0) {\n this.node = t, this.version = s, this.unsub = e;\n }\n}, ft = class {\n constructor(t, s) {\n this.fn = t, this.sub = s;\n }\n notify(t, s) {\n const e = this.fn;\n if (e !== void 0) {\n e(t, s);\n return;\n }\n const i = this.sub;\n i !== void 0 && i.execute();\n }\n}, at = class {\n constructor() {\n this.current = null;\n }\n run(t, s) {\n if (this.current === t) return s();\n const e = this.current;\n this.current = t;\n try {\n return s();\n } finally {\n this.current = e;\n }\n }\n}, _ = new at();\nfunction mt(t) {\n const s = _, e = s.current;\n if (e === null) return t();\n s.current = null;\n try {\n return t();\n } finally {\n s.current = e;\n }\n}\nvar Q = class {\n constructor() {\n this.flags = 0, this.version = 0, this._lastSeenEpoch = b.UNINITIALIZED, this._notifying = 0, this._hotIndex = -1, this._slots = null, this._deps = null, this.id = _t() & X;\n }\n get isDisposed() {\n return (this.flags & B.DISPOSED) !== 0;\n }\n get isComputed() {\n return (this.flags & B.IS_COMPUTED) !== 0;\n }\n get hasError() {\n return !1;\n }\n subscribe(t) {\n const s = typeof t == \"function\";\n if (!s && (!t || typeof t.execute != \"function\")) throw g(/* @__PURE__ */ new TypeError(\"Invalid subscriber\"), T, c.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);\n let e = this._slots;\n e || (e = new J(), this._slots = e);\n let i = !1;\n if (e._s0 != null && (s ? e._s0.fn === t : e._s0.sub === t)) i = !0;\n else if (e._s1 != null && (s ? e._s1.fn === t : e._s1.sub === t)) i = !0;\n else if (e._s2 != null && (s ? e._s2.fn === t : e._s2.sub === t)) i = !0;\n else if (e._s3 != null && (s ? e._s3.fn === t : e._s3.sub === t)) i = !0;\n else {\n const n = e._overflow;\n if (n != null) for (let o = 0, u = n.length; o < u; o++) {\n const l = n[o];\n if (l != null && (s ? l.fn === t : l.sub === t)) {\n i = !0;\n break;\n }\n }\n }\n if (i)\n return () => {\n };\n const r = new ft(s ? t : void 0, s ? void 0 : t);\n return e.add(r), () => this._unsubscribe(r);\n }\n _unsubscribe(t) {\n const s = this._slots;\n s && (s.remove(t), this._notifying === 0 && s.compact());\n }\n subscriberCount() {\n const t = this._slots;\n return t === null ? 0 : t.size;\n }\n _notifySubscribers(t, s) {\n const e = this._slots;\n if (!(e === null || e.size === 0)) {\n this._notifying++;\n try {\n let i = e._s0;\n if (i != null) try {\n i.notify(t, s);\n } catch (n) {\n this._logNotifyError(n);\n }\n if (i = e._s1, i != null) try {\n i.notify(t, s);\n } catch (n) {\n this._logNotifyError(n);\n }\n if (i = e._s2, i != null) try {\n i.notify(t, s);\n } catch (n) {\n this._logNotifyError(n);\n }\n if (i = e._s3, i != null) try {\n i.notify(t, s);\n } catch (n) {\n this._logNotifyError(n);\n }\n const r = e._overflow;\n if (r != null) for (let n = 0, o = r.length; n < o; n++) {\n const u = r[n];\n if (u != null) try {\n u.notify(t, s);\n } catch (l) {\n this._logNotifyError(l);\n }\n }\n } finally {\n --this._notifying === 0 && e.compact();\n }\n }\n }\n _logNotifyError(t) {\n console.error(g(t, T, c.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n _isDirty() {\n const t = this._deps;\n if (t === null || t.size === 0) return !1;\n const s = this._hotIndex;\n if (s !== -1) {\n const e = t.getAt(s);\n if (e != null && e.node.version !== e.version) return !0;\n }\n return this._deepDirtyCheck();\n }\n}, $ = /* @__PURE__ */ Symbol.for(\"atom-effect/atom\"), st = /* @__PURE__ */ Symbol.for(\"atom-effect/computed\"), et = /* @__PURE__ */ Symbol.for(\"atom-effect/effect\"), Et = /* @__PURE__ */ Symbol.for(\"atom-effect/writable\"), P = 0;\nfunction k() {\n const t = P + 1 & X;\n return P = t === 0 ? 1 : t, P;\n}\nfunction H(t) {\n const s = t + 1 & X;\n return s === 0 ? 1 : s;\n}\nvar V = 0, R = !1, it = 0;\nfunction dt() {\n return it;\n}\nfunction W() {\n return R ? !1 : (R = !0, it = k(), V = 0, !0);\n}\nfunction K() {\n R = !1;\n}\nfunction pt() {\n if (!R) return 0;\n const t = ++V;\n if (t <= C.MAX_EXECUTIONS_PER_FLUSH) return t;\n throw new Error(`[atom-effect] Infinite loop detected: flush execution count exceeded ${C.MAX_EXECUTIONS_PER_FLUSH}`);\n}\nvar Ct = class {\n constructor() {\n this._queueBuffer = [[], []], this._bufferIndex = 0, this._size = 0, this._epoch = 0, this._isProcessing = !1, this._isFlushingSync = !1, this._batchDepth = 0, this._batchQueue = [], this._batchQueueSize = 0, this._maxFlushIterations = C.MAX_FLUSH_ITERATIONS, this.onOverflow = null, this._boundRunLoop = this._runLoop.bind(this);\n }\n get queueSize() {\n return this._size;\n }\n get isBatching() {\n return this._batchDepth > 0;\n }\n schedule(t) {\n const s = this._epoch;\n if (t._nextEpoch === s) return;\n if (t._nextEpoch = s, this._batchDepth > 0 || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = t;\n return;\n }\n const e = this._bufferIndex, i = this._queueBuffer[e];\n i[this._size++] = t, this._isProcessing || this._flush();\n }\n _flush() {\n this._isProcessing || this._size === 0 || (this._isProcessing = !0, queueMicrotask(this._boundRunLoop));\n }\n _runLoop() {\n try {\n if (this._size === 0) return;\n const t = W();\n this._drainQueue(), t && K();\n } finally {\n this._isProcessing = !1, this._size > 0 && this._batchDepth === 0 && this._flush();\n }\n }\n _flushSync() {\n this._isFlushingSync = !0;\n const t = W();\n try {\n this._mergeBatchQueue(), this._drainQueue();\n } finally {\n this._isFlushingSync = !1, t && K();\n }\n }\n _mergeBatchQueue() {\n const t = this._batchQueueSize;\n if (t === 0) return;\n const s = ++this._epoch, e = this._batchQueue, i = this._bufferIndex, r = this._queueBuffer[i];\n let n = this._size;\n for (let o = 0; o < t; o++) {\n const u = e[o];\n u._nextEpoch !== s && (u._nextEpoch = s, r[n++] = u);\n }\n this._size = n, this._batchQueueSize = 0, e.length = 0;\n }\n _drainQueue() {\n let t = 0;\n for (; this._size > 0; ) {\n if (++t > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n this._processQueue(), this._mergeBatchQueue();\n }\n }\n _processQueue() {\n const t = this._bufferIndex, s = this._queueBuffer[t], e = this._size;\n this._bufferIndex = t ^ 1, this._size = 0, this._epoch = this._epoch + 1 | 0;\n for (let i = 0; i < e; i++) {\n const r = s[i];\n try {\n typeof r == \"function\" ? r() : r.execute();\n } catch (n) {\n console.error(new U(\"Error occurred during scheduler execution\", n));\n }\n }\n s.length = 0;\n }\n _handleFlushOverflow() {\n const t = this._size + this._batchQueueSize, s = this._maxFlushIterations;\n console.error(new U(c.SCHEDULER_FLUSH_OVERFLOW(s, t))), this._size = 0;\n const e = this._bufferIndex;\n this._queueBuffer[e].length = 0, this._batchQueueSize = 0;\n const i = this.onOverflow;\n if (i) try {\n i(t);\n } catch {\n }\n }\n startBatch() {\n this._batchDepth++;\n }\n endBatch() {\n this._batchDepth !== 0 && --this._batchDepth === 0 && this._flushSync();\n }\n setMaxFlushIterations(t) {\n if (t < C.MIN_FLUSH_ITERATIONS) throw new U(`Max flush iterations must be at least ${C.MIN_FLUSH_ITERATIONS}`);\n this._maxFlushIterations = t;\n }\n}, w = new Ct();\nfunction Nt(t) {\n if (typeof t != \"function\") throw new TypeError(c.BATCH_CALLBACK_MUST_BE_FUNCTION);\n const s = w;\n s.startBatch();\n try {\n return t();\n } finally {\n s.endBatch();\n }\n}\nvar It = class extends Q {\n constructor(t, s) {\n super(), this[$] = !0, this[Et] = !0, this._value = t, s && (this.flags |= a.SYNC), G.attachDebugInfo(this, \"atom\", this.id);\n }\n get isNotificationScheduled() {\n return (this.flags & a.NOTIFICATION_SCHEDULED) !== 0;\n }\n get isSync() {\n return (this.flags & a.SYNC) !== 0;\n }\n get value() {\n const t = _.current;\n return t?.addDependency(this), this._value;\n }\n set value(t) {\n const s = this._value;\n if (Object.is(s, t)) return;\n this._value = t, this.version = H(this.version);\n const e = this.flags;\n if ((e & a.NOTIFICATION_SCHEDULED) !== 0) return;\n const i = this._slots;\n i == null || i.size === 0 || (this._pendingOldValue = s, this.flags = e | a.NOTIFICATION_SCHEDULED, (e & a.SYNC) !== 0 && !w.isBatching ? this._flushNotifications() : w.schedule(this));\n }\n execute() {\n this._flushNotifications();\n }\n _flushNotifications() {\n const t = this.flags;\n if ((t & (a.NOTIFICATION_SCHEDULED | a.DISPOSED)) !== a.NOTIFICATION_SCHEDULED) return;\n const s = this._pendingOldValue;\n this._pendingOldValue = void 0, this.flags = t & ~a.NOTIFICATION_SCHEDULED, this._notifySubscribers(this._value, s);\n }\n peek() {\n return this._value;\n }\n dispose() {\n const t = this.flags;\n (t & a.DISPOSED) === 0 && (this._slots?.clear(), this.flags = t | a.DISPOSED, this._value = void 0, this._pendingOldValue = void 0);\n }\n _deepDirtyCheck() {\n return !1;\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n};\nfunction bt(t, s = {}) {\n return new It(t, s.sync ?? !1);\n}\nfunction yt(t) {\n return typeof t == \"object\" && t !== null && $ in t;\n}\nfunction At(t) {\n return typeof t == \"object\" && t !== null && st in t;\n}\nfunction Ot(t) {\n return typeof t == \"object\" && t !== null && et in t;\n}\nfunction nt(t) {\n return typeof t == \"object\" && t !== null && typeof t.then == \"function\";\n}\nvar { IDLE: p, DIRTY: E, PENDING: S, RESOLVED: d, REJECTED: D, HAS_ERROR: A, RECOMPUTING: N, DISPOSED: M, IS_COMPUTED: O, FORCE_COMPUTE: x } = B, Dt = class extends Q {\n constructor(t, s = {}) {\n if (typeof t != \"function\") throw new m(c.COMPUTED_MUST_BE_FUNCTION);\n if (super(), this[$] = !0, this[st] = !0, this._error = null, this._promiseId = 0, this._deps = new tt(), this._trackEpoch = b.UNINITIALIZED, this._trackCount = 0, this._value = void 0, this.flags = O | E | p, this._equal = s.equal ?? Object.is, this._fn = t, this._defaultValue = \"defaultValue\" in s ? s.defaultValue : L, this._onError = s.onError ?? null, G.attachDebugInfo(this, \"computed\", this.id), s.lazy === !1) try {\n this._recompute();\n } catch {\n }\n }\n get isDirty() {\n return (this.flags & E) !== 0;\n }\n get isRejected() {\n return (this.flags & D) !== 0;\n }\n get isRecomputing() {\n return (this.flags & N) !== 0;\n }\n get _hasErrorInternal() {\n return (this.flags & A) !== 0;\n }\n _track() {\n _.current?.addDependency(this);\n }\n get value() {\n const t = _.current;\n t?.addDependency(this);\n let s = this.flags;\n if ((s & (d | E | p)) === d) return this._value;\n if ((s & M) !== 0) throw new m(c.COMPUTED_DISPOSED);\n if ((s & N) !== 0) {\n const r = this._defaultValue;\n if (r !== L) return r;\n throw new m(c.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n if ((s & (E | p)) !== 0) {\n const r = this._deps;\n if ((s & p) === 0 && (s & x) === 0 && r.size > 0 && !this._isDirty() ? s = this.flags &= ~E : (this._recompute(), s = this.flags), (s & d) !== 0) return this._value;\n }\n const e = this._defaultValue, i = e !== L;\n if ((s & S) !== 0) {\n if (i) return e;\n throw new m(c.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n if ((s & D) !== 0) {\n if (i) return e;\n throw this._error;\n }\n return this._value;\n }\n peek() {\n return this._value;\n }\n get state() {\n const t = _.current;\n t?.addDependency(this);\n const s = this.flags;\n return (s & d) !== 0 ? y.RESOLVED : (s & S) !== 0 ? y.PENDING : (s & D) !== 0 ? y.REJECTED : y.IDLE;\n }\n get hasError() {\n const t = _.current;\n if (t?.addDependency(this), (this.flags & (D | A)) !== 0) return !0;\n const s = this._deps;\n if (!s.hasComputeds) return !1;\n const e = s.size;\n for (let i = 0; i < e; i++) if (s.getAt(i)?.node.hasError) return !0;\n return !1;\n }\n get isValid() {\n return !this.hasError;\n }\n get errors() {\n const t = _.current;\n t?.addDependency(this);\n const s = this._error, e = this._deps;\n if (!e.hasComputeds)\n return s == null ? Y : Object.freeze([s]);\n const i = [];\n s != null && i.push(s);\n const r = e.size;\n for (let n = 0; n < r; n++) {\n const o = e.getAt(n);\n if (o == null) continue;\n const u = o.node;\n (u.flags & O) !== 0 && u.hasError && this._collectErrorsFromDep(u, i);\n }\n return i.length === 0 ? Y : Object.freeze(i);\n }\n _collectErrorsFromDep(t, s) {\n const e = t.errors, i = e.length;\n for (let r = 0; r < i; r++) {\n const n = e[r];\n n != null && !s.includes(n) && s.push(n);\n }\n }\n get lastError() {\n const t = _.current;\n return t?.addDependency(this), this._error;\n }\n get isPending() {\n const t = _.current;\n return t?.addDependency(this), (this.flags & S) !== 0;\n }\n get isResolved() {\n const t = _.current;\n return t?.addDependency(this), (this.flags & d) !== 0;\n }\n invalidate() {\n this.flags |= x, this._markDirty();\n }\n dispose() {\n (this.flags & M) === 0 && (this._deps.disposeAll(), this._slots != null && this._slots.clear(), this.flags = M | E | p, this._error = null, this._value = void 0, this._hotIndex = -1);\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n const s = this._trackEpoch;\n if (t._lastSeenEpoch === s) return;\n t._lastSeenEpoch = s;\n const e = this._trackCount++, i = this._deps, r = i.getAt(e);\n if (r != null && r.node === t) r.version = t.version;\n else if (!i.claimExisting(t, e)) {\n const n = new z(t, t.version, t.subscribe(this));\n i.insertNew(e, n);\n }\n (t.flags & O) !== 0 && (i.hasComputeds = !0);\n }\n _recompute() {\n if (this.isRecomputing) return;\n this.flags = (this.flags | N) & ~x, this._trackEpoch = k(), this._trackCount = 0, this._deps.prepareTracking(), this._hotIndex = -1;\n let t = !1;\n try {\n const s = _.run(this, this._fn);\n this._deps.truncateFrom(this._trackCount), t = !0, nt(s) ? this._handleAsyncComputation(s) : this._finalizeResolution(s);\n } catch (s) {\n if (!t) try {\n this._deps.truncateFrom(this._trackCount);\n } catch {\n }\n this._handleError(s, c.COMPUTED_COMPUTATION_FAILED, !0);\n } finally {\n this._trackEpoch = b.UNINITIALIZED, this._trackCount = 0, this.flags &= ~N;\n }\n }\n _handleAsyncComputation(t) {\n this.flags = (this.flags | S) & ~(p | E | d | D), this._notifySubscribers(void 0, void 0), this._promiseId = (this._promiseId + 1) % ut.MAX_PROMISE_ID;\n const s = this._promiseId;\n t.then((e) => {\n if (s === this._promiseId) {\n if (this._isDirty()) return this._markDirty();\n this._finalizeResolution(e), this._notifySubscribers(e, void 0);\n }\n }, (e) => s === this._promiseId && this._handleError(e, c.COMPUTED_ASYNC_COMPUTATION_FAILED));\n }\n _handleError(t, s, e = !1) {\n const i = g(t, m, s);\n if (!e && !this.isRejected && (this.version = H(this.version)), this._error = i, this.flags = this.flags & ~(p | E | S | d) | D | A, this._onError) try {\n this._onError(i);\n } catch (r) {\n console.error(c.CALLBACK_ERROR_IN_ERROR_HANDLER, r);\n }\n if (e) throw i;\n this._notifySubscribers(void 0, void 0);\n }\n _finalizeResolution(t) {\n const s = this.flags;\n ((s & d) === 0 || !this._equal(this._value, t)) && (this.version = H(this.version)), this._value = t, this._error = null, this.flags = (s | d) & ~(p | E | S | D | A);\n }\n execute() {\n this._markDirty();\n }\n _markDirty() {\n const t = this.flags;\n (t & (N | E)) === 0 && (this.flags = t | E, this._notifySubscribers(void 0, void 0));\n }\n _deepDirtyCheck() {\n const t = this._deps, s = _.current;\n _.current = null;\n try {\n const e = t.size;\n for (let i = 0; i < e; i++) {\n const r = t.getAt(i);\n if (r == null) continue;\n const n = r.node;\n if ((n.flags & O) !== 0) try {\n n.value;\n } catch {\n }\n if (n.version !== r.version)\n return this._hotIndex = i, !0;\n }\n return this._hotIndex = -1, !1;\n } finally {\n _.current = s;\n }\n }\n};\nfunction Ft(t, s = {}) {\n return new Dt(t, s);\n}\nvar vt = class extends Q {\n constructor(t, s = {}) {\n super(), this[et] = !0, this._cleanup = null, this._deps = new tt(), this._currentEpoch = b.UNINITIALIZED, this._lastFlushEpoch = b.UNINITIALIZED, this._fn = t, this._onError = s.onError ?? null, this._sync = s.sync ?? !1, this._maxExecutions = s.maxExecutionsPerSecond ?? C.MAX_EXECUTIONS_PER_SECOND, this._maxExecutionsPerFlush = s.maxExecutionsPerFlush ?? C.MAX_EXECUTIONS_PER_EFFECT, this._executionsInEpoch = 0, this._executionCount = 0, this._windowStart = 0, this._windowCount = 0, this._execId = 0, this._trackCount = 0, this._sync ? this._notifyCallback = () => this.execute() : this._notifyCallback = () => w.schedule(this), G.attachDebugInfo(this, \"effect\", this.id);\n }\n run() {\n if (this.isDisposed) throw new v(c.EFFECT_DISPOSED);\n this.execute(!0);\n }\n dispose() {\n this.isDisposed || (this.flags |= I.DISPOSED, this._execCleanup(), this._deps?.disposeAll());\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n if ((this.flags & I.EXECUTING) === 0) return;\n const s = this._currentEpoch;\n if (t._lastSeenEpoch === s) return;\n t._lastSeenEpoch = s;\n const e = this._trackCount++, i = this._deps;\n let r;\n switch (e) {\n case 0:\n r = i._s0;\n break;\n case 1:\n r = i._s1;\n break;\n case 2:\n r = i._s2;\n break;\n case 3:\n r = i._s3;\n break;\n default:\n r = i.getAt(e);\n }\n r != null && r.node === t ? r.version = t.version : i.claimExisting(t, e) || this._insertNewDependency(t, e), t.isComputed && (i.hasComputeds = !0);\n }\n _insertNewDependency(t, s) {\n let e;\n try {\n const i = t.subscribe(this._notifyCallback);\n e = new z(t, t.version, i);\n } catch (i) {\n const r = g(i, v, c.EFFECT_EXECUTION_FAILED);\n if (console.error(r), this._onError) try {\n this._onError(r);\n } catch {\n }\n e = new z(t, t.version, void 0);\n }\n this._deps.insertNew(s, e);\n }\n execute(t = !1) {\n const s = this.flags;\n if ((s & (I.DISPOSED | I.EXECUTING)) !== 0) return;\n const e = this._deps;\n if (!t && e.size > 0 && !this._isDirty()) return;\n this._checkInfiniteLoops(), this.flags = s | I.EXECUTING, this._execCleanup(), this._currentEpoch = k(), this._trackCount = 0, e.prepareTracking(), this._hotIndex = -1;\n let i = !1;\n try {\n const r = _.run(this, this._fn);\n e.truncateFrom(this._trackCount), i = !0, nt(r) ? this._handleAsyncResult(r) : this._cleanup = typeof r == \"function\" ? r : null;\n } catch (r) {\n if (!i) try {\n e.truncateFrom(this._trackCount);\n } catch {\n }\n this._handleExecutionError(r), this._cleanup = null;\n } finally {\n this.flags &= ~I.EXECUTING;\n }\n }\n _handleAsyncResult(t) {\n const s = ++this._execId;\n t.then((e) => {\n if (s !== this._execId || this.isDisposed) {\n if (typeof e == \"function\") try {\n e();\n } catch (i) {\n this._handleExecutionError(i, c.EFFECT_CLEANUP_FAILED);\n }\n return;\n }\n typeof e == \"function\" && (this._cleanup = e);\n }, (e) => s === this._execId && this._handleExecutionError(e));\n }\n _deepDirtyCheck() {\n const t = _.current;\n _.current = null;\n const s = this._deps;\n try {\n const e = s.size;\n for (let i = 0; i < e; i++) {\n const r = s.getAt(i);\n if (r == null) continue;\n const n = r.node;\n if (n.isComputed && this._tryPullComputed(n), n.version !== r.version)\n return this._hotIndex = i, !0;\n }\n return !1;\n } finally {\n _.current = t;\n }\n }\n _tryPullComputed(t) {\n try {\n t.value;\n } catch {\n }\n }\n _execCleanup() {\n const t = this._cleanup;\n if (t != null) {\n this._cleanup = null;\n try {\n t();\n } catch (s) {\n this._handleExecutionError(s, c.EFFECT_CLEANUP_FAILED);\n }\n }\n }\n _checkInfiniteLoops() {\n const t = dt();\n this._lastFlushEpoch !== t && (this._lastFlushEpoch = t, this._executionsInEpoch = 0), ++this._executionsInEpoch > this._maxExecutionsPerFlush && this._throwInfiniteLoopError(\"per-effect\"), pt() > C.MAX_EXECUTIONS_PER_FLUSH && this._throwInfiniteLoopError(\"global\"), this._executionCount++;\n }\n _checkFrequencyLimit() {\n if (!Number.isFinite(this._maxExecutions)) return;\n const t = Date.now();\n if (t - this._windowStart >= Z.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = t, this._windowCount = 1;\n return;\n }\n if (++this._windowCount > this._maxExecutions) {\n const s = new v(c.EFFECT_FREQUENCY_LIMIT_EXCEEDED);\n throw this.dispose(), this._handleExecutionError(s), s;\n }\n }\n get executionCount() {\n return this._executionCount;\n }\n get isExecuting() {\n return (this.flags & I.EXECUTING) !== 0;\n }\n _throwInfiniteLoopError(t) {\n const s = new v(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${V}`);\n throw this.dispose(), console.error(s), s;\n }\n _handleExecutionError(t, s = c.EFFECT_EXECUTION_FAILED) {\n const e = g(t, v, s);\n if (console.error(e), this._onError) try {\n this._onError(e);\n } catch (i) {\n console.error(g(i, v, c.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n};\nfunction Rt(t, s = {}) {\n if (typeof t != \"function\") throw new v(c.EFFECT_MUST_BE_FUNCTION);\n const e = new vt(t, s);\n return e.execute(), e;\n}\nvar St = /* @__PURE__ */ Symbol.for(\"atom-effect/atom\"), gt = /* @__PURE__ */ Symbol.for(\"atom-effect/writable\");\nfunction rt(t, s, e, i) {\n if (e === s.length) return i;\n const r = s[e], n = t != null && typeof t == \"object\" ? t : {}, o = n[r], u = rt(o, s, e + 1, i);\n if (Object.is(o, u)) return t;\n if (Array.isArray(n)) {\n const l = n.slice(), h = Number.parseInt(r, 10);\n return Number.isNaN(h) ? l[r] = u : l[h] = u, l;\n }\n return {\n ...n,\n [r]: u\n };\n}\nfunction F(t, s) {\n let e = t;\n const i = s.length;\n for (let r = 0; r < i; r++) {\n if (e == null) return;\n e = e[s[r]];\n }\n return e;\n}\nfunction ot(t, s) {\n const e = s.includes(\".\") ? s.split(\".\") : [s], i = /* @__PURE__ */ new Set(), r = () => {\n i.forEach((n) => n()), i.clear();\n };\n return {\n get value() {\n return F(t.value, e);\n },\n set value(n) {\n const o = t.peek(), u = rt(o, e, 0, n);\n u !== o && (t.value = u);\n },\n peek: () => F(t.peek(), e),\n subscribe(n) {\n const o = t.subscribe((u, l) => {\n const h = F(u, e), f = F(l, e);\n Object.is(h, f) || n(h, f);\n });\n return i.add(o), () => {\n o(), i.delete(o);\n };\n },\n subscriberCount: () => i.size,\n dispose: r,\n [Symbol.dispose]: r,\n [St]: !0,\n [gt]: !0\n };\n}\nvar wt = (t, s) => ot(t, s), Ut = (t) => (s) => ot(t, s);\nexport {\n y as AsyncState,\n T as AtomError,\n m as ComputedError,\n Z as DEBUG_CONFIG,\n G as DEBUG_RUNTIME,\n v as EffectError,\n C as SCHEDULER_CONFIG,\n U as SchedulerError,\n bt as atom,\n ot as atomLens,\n Nt as batch,\n wt as composeLens,\n Ft as computed,\n Rt as effect,\n F as getPathValue,\n yt as isAtom,\n At as isComputed,\n Ot as isEffect,\n Ut as lensFor,\n w as scheduler,\n rt as setDeepValue,\n mt as untracked\n};\n\n//# sourceMappingURL=index.mjs.map","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { isAtom } from '@but212/atom-effect';\nimport type { RenderRoute, RouteDefinition, TemplateRoute } from '@/types';\n\n// ============================================================================\n// Reactive helpers\n// ============================================================================\n\n/** Checks if a given value is a reactive node (Atom or Computed). */\nexport const isReactive = (v: unknown): v is ReadonlyAtom<unknown> => isAtom(v);\n\n/** Checks if value is a Promise. */\nexport const isPromise = <T>(v: unknown): v is Promise<T> =>\n v !== null && typeof v === 'object' && typeof (v as Record<string, unknown>).then === 'function';\n\n/** Generates a human-readable selector string for debug. */\nexport function getSelector(el: Element): string {\n const tag = el.localName;\n const id = el.id;\n if (id) return `${tag}#${id}`;\n const className = el.className;\n if (typeof className === 'string') {\n const trimmed = className.trim();\n if (trimmed) {\n return `${tag}.${trimmed.replace(/\\s+/g, '.')}`;\n }\n }\n return tag;\n}\n\nexport const hasOwn = Object.prototype.hasOwnProperty;\n\nexport const isTemplateRoute = (r: RouteDefinition): r is TemplateRoute =>\n 'template' in r && typeof r.template === 'string';\nexport const isRenderRoute = (r: RouteDefinition): r is RenderRoute =>\n 'render' in r && typeof r.render === 'function';\n\n/**\n * Shallow equality check for objects.\n * Optimized to avoid Object.keys() array allocations.\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) return false;\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n\n let countA = 0;\n for (const k in objA) {\n if (hasOwn.call(objA, k)) {\n if (!hasOwn.call(objB, k) || objA[k] !== objB[k]) return false;\n countA++;\n }\n }\n\n let countB = 0;\n for (const k in objB) {\n if (hasOwn.call(objB, k)) countB++;\n }\n\n return countA === countB;\n}\n","/**\n * Constants for atom-effect-jquery\n */\n\n// ============================================================================\n// Log Prefixes\n// ============================================================================\n\n/**\n * Log prefixes keyed by subsystem.\n * Each prefix names the specific subsystem that emitted the message so that\n * console output is unambiguous regardless of which binding triggered it.\n */\nexport const LOG_PREFIXES = {\n ROUTE: '[atom-route]',\n BINDING: '[atom-binding]',\n LIST: '[atom-list]',\n MOUNT: '[atom-mount]',\n} as const;\n\nexport const ROUTE_DEFAULTS = Object.freeze({\n mode: 'hash',\n basePath: '',\n autoBindLinks: false,\n activeClass: 'active',\n} as const);\n\nexport const INPUT_DEFAULTS = { EVENT: 'input', DEBOUNCE: 0 } as const;\nexport const DEBUG_DEFAULTS = { HIGHLIGHT_DURATION_MS: 500 } as const;\n\nexport const VALID_INPUT_TAGS: ReadonlySet<string> = new Set(['input', 'select', 'textarea']);\n\nexport const URL_PROPS: ReadonlySet<string> = new Set([\n 'src',\n 'href',\n 'action',\n 'formaction',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n 'xlink:href',\n]);\n\nexport const DANGEROUS_PROPS: ReadonlySet<string> = new Set([\n 'innerHTML',\n 'outerHTML',\n 'srcdoc',\n '__proto__',\n 'constructor',\n 'prototype',\n]);\n\n/**\n * Centralized error messages for the entire library.\n * Structured by subsystem to facilitate easy debugging and consistent error reporting.\n *\n * Each entry is a function that takes dynamic data (e.g. element name) to produce\n * a human-readable and actionable error message.\n */\nexport const ERROR_MESSAGES = {\n /** Errors related to the SPA Router. */\n ROUTE: {\n NOT_FOUND: (n: string) => `Route \"${n}\" not found and no notFound route configured`,\n TEMPLATE_NOT_FOUND: (s: string) => `Template \"${s}\" not found`,\n TARGET_NOT_FOUND: (s: string) => `Target element \"${s}\" not found`,\n MALFORMED_URI: (r: string) => `Malformed URI component: ${r}`,\n },\n /** Security-related errors, specifically from the CSS/HTML sanitizer. */\n SECURITY: {\n UNSAFE_CONTENT: () => 'Unsafe content neutralized during sanitization.',\n BLOCKED_CSS_VALUE: (p: string) => `Blocked dangerous value in CSS style property \"${p}\".`,\n BLOCKED_EVENT_HANDLER: (n: string) =>\n `Blocked setting dangerous event handler attribute/property \"${n}\".`,\n BLOCKED_PROTOCOL: (n: string) => `Blocked dangerous protocol in \"${n}\".`,\n BLOCKED_PROP: (n: string) =>\n `Blocked setting dangerous property \"${n}\". Use html binding for sanitized HTML.`,\n },\n /** General errors from reactive bindings (text, map, input, etc). */\n BINDING: {\n INVALID_INPUT_ELEMENT: (t: string) => `Val binding used on non-input element <${t}>.`,\n MISSING_SOURCE: (m: string) => `[${m}] source is required when prop/name is a string.`,\n MISSING_CONDITION: (m: string) => `[${m}] condition is required when className is a string.`,\n UPDATER_ERROR: (d: string, s?: boolean) =>\n `Updater threw in binding \"${d}\"${s ? ' (static)' : ''}`,\n CLEANUP_ERROR: (i?: string) => `Binding cleanup error${i ? `: ${i}` : ''}`,\n PARSE_ERROR: (d?: string) => `parse() threw during DOM→Atom sync${d ? `: ${d}` : ''}`,\n },\n /** Errors specific to atomList rendering and reconciliation. */\n LIST: {\n DUPLICATE_KEY: (k: string | number, i: number, c: string) =>\n `Duplicate key \"${k}\" at index ${i} in atomList <${c}>.`,\n },\n /** Lifecycle errors from atomMount/atomUnmount. */\n MOUNT: {\n ERROR: (n?: string) => `Mount error${n ? ` in component <${n}>` : ''}`,\n CLEANUP_ERROR: (n?: string) => `Cleanup error${n ? ` in component <${n}>` : ''}`,\n },\n /** Internal architectural errors from the core engine or registry. */\n CORE: {\n EFFECT_DISPOSE_ERROR: (i?: string) => `Effect dispose error${i ? `: ${i}` : ''}`,\n },\n} as const;\n","import { DEBUG_DEFAULTS } from '@/constants';\nimport { getSelector } from '@/utils';\n\n// ============================================================================\n// Environment utilities\n// ============================================================================\n\nconst IS_BROWSER = typeof window !== 'undefined';\nconst HIGHLIGHT_TRANSITION = `${DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS / 1000}s`;\n\nfunction getInitialState(): boolean {\n // biome-ignore lint/suspicious/noExplicitAny: globalThis is not typed\n const g = globalThis as any;\n if (IS_BROWSER && g.window?.__ATOM_DEBUG__ === true) return true;\n try {\n if (import.meta.env?.VITE_ATOM_DEBUG === 'true') return true;\n } catch {}\n try {\n if (g.process?.env?.VITE_ATOM_DEBUG === 'true') return true;\n } catch {}\n return false;\n}\n\n// ============================================================================\n// DebugController — Class-based singleton for JIT optimization\n// ============================================================================\n\nclass DebugController {\n private _enabled = false;\n private _lastState = false;\n\n constructor() {\n this._enabled = getInitialState();\n this._lastState = this._enabled;\n this._applyMethods(this._enabled);\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(v: boolean) {\n if (this._enabled !== v) {\n this._enabled = v;\n this._applyMethods(v);\n }\n }\n\n /** Normal logs (No-op in production) */\n public log: (p: string, ...a: unknown[]) => void = () => {};\n\n /** Atom state change logs (No-op in production) */\n public atomChanged: (p: string, n: string | undefined, o: unknown, v: unknown) => void = () => {};\n\n /** DOM update logs with highlighting (No-op in production) */\n public domUpdated: (p: string, t: Element | JQuery<Element>, type: string, v: unknown) => void =\n () => {};\n\n /** Resource cleanup logs (No-op in production) */\n public cleanup: (p: string, s: string) => void = () => {};\n\n /** Warnings (Always logged) */\n warn(p: string, m: string, ...r: unknown[]): void {\n console.warn(`${p} ${m}`, ...r);\n }\n\n /** Errors (Always logged) */\n error(p: string, m: string, c: unknown): void {\n console.error(`${p} ${m}`, c);\n }\n\n private _applyMethods(isEnabled: boolean) {\n if (isEnabled) {\n this.log = (p, ...a) => console.log(p, ...a);\n this.atomChanged = (p, n, o, v) =>\n console.log(`${p} Atom \"${n ?? 'anonymous'}\" changed:`, o, '→', v);\n this.domUpdated = (p, t, type, v) => {\n const el = t instanceof Element ? t : (t[0] as Element | undefined);\n if (el?.isConnected) {\n console.log(`${p} DOM updated: ${getSelector(el)}.${type} =`, v);\n this._highlightElement(el);\n }\n };\n this.cleanup = (p, s) => console.log(`${p} Cleanup: ${s}`);\n } else {\n this.log = () => {};\n this.atomChanged = () => {};\n this.domUpdated = () => {};\n this.cleanup = () => {};\n }\n }\n\n private _highlightElement(el: Element): void {\n if (!el.isConnected) return;\n injectStyle();\n\n const exR = rafs.get(el);\n const exT = timers.get(el);\n if (exR !== undefined) cancelAnimationFrame(exR);\n if (exT !== undefined) {\n clearTimeout(exT);\n timers.delete(el);\n }\n\n rafs.set(\n el,\n requestAnimationFrame(() => {\n rafs.delete(el);\n if (!el.isConnected) return;\n el.classList.add(HIGHLIGHT_CLASS);\n timers.set(\n el,\n setTimeout(() => {\n if (el.isConnected) el.classList.remove(HIGHLIGHT_CLASS);\n timers.delete(el);\n }, DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS)\n );\n })\n );\n }\n}\n\nexport const debug = new DebugController();\n\n// ============================================================================\n// Highlighting logic\n// ============================================================================\n\nconst HIGHLIGHT_CLASS = 'atom-debug-highlight',\n H_ATTR = 'data-atom-debug';\nlet styleInjected = false;\n\nfunction injectStyle(): void {\n if (styleInjected || !IS_BROWSER) return;\n if (document.querySelector(`style[${H_ATTR}]`)) {\n styleInjected = true;\n return;\n }\n const s = Object.assign(document.createElement('style'), {\n textContent: `.${HIGHLIGHT_CLASS}{outline:2px solid rgba(255,68,68,0.8);outline-offset:1px;transition:outline ${HIGHLIGHT_TRANSITION} ease-out}`,\n });\n s.setAttribute(H_ATTR, '');\n document.head.appendChild(s);\n styleInjected = true;\n}\n\nconst timers = new WeakMap<Element, ReturnType<typeof setTimeout>>(),\n rafs = new WeakMap<Element, number>();\n","import {\n atomLens,\n batch,\n composeLens,\n computed,\n atom as createAtom,\n effect,\n isAtom,\n isComputed,\n lensFor,\n untracked,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { AtomOptions, WritableAtom } from '@/types';\n// isReactive is defined in utils.ts because core's isAtom already covers computed\n// atoms (ComputedAtom carries ATOM_BRAND), making a separate isComputed check redundant.\nimport { isReactive } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// atom factory + debug namespace\n// ============================================================================\n\n/**\n * Local wrapper around core's `atom` factory.\n *\n * This wrapper exists to attach the `$.atom.debug` accessor directly to the\n * function object at runtime. TypeScript requires a double cast for this\n * augmentation, but `NamespaceExtensions` ensures all other fields are type-safe.\n *\n * `options` is not defaulted here — core's `atom` defaults `options` to `{}`\n * internally, so passing `undefined` is safe and avoids an extra allocation\n * per call.\n */\nfunction atom<T>(v: T, opts?: AtomOptions): WritableAtom<T> {\n return createAtom(v, opts);\n}\n\nObject.defineProperty(atom, 'debug', {\n enumerable: true,\n configurable: true,\n get: () => debug.enabled,\n set: (v: boolean) => {\n debug.enabled = v;\n },\n});\n\n/** Resolves after microtask effects flush. Fast Promise-based scheduling. */\nexport const nextTick = (): Promise<void> => Promise.resolve();\n\n// Register static extensions to jQuery\n$.extend({\n atom: atom as unknown as JQueryStatic['atom'],\n computed,\n effect,\n batch,\n untracked,\n isAtom,\n isComputed,\n isReactive,\n nextTick,\n atomLens,\n composeLens,\n lensFor,\n});\n","import type { EffectObject } from '@/types';\n\n// ============================================================================\n// ArrayPool\n// ============================================================================\n\n/**\n * Array pool for reusing temporarily allocated arrays to avoid GC pressure.\n * Ported from @but212/atom-effect core.\n *\n * @template T - Element type.\n */\nexport class ArrayPool<T> {\n private readonly pool: T[][] = [];\n\n constructor(\n private readonly limit = 50,\n private readonly capacity = 256\n ) {}\n\n /** Acquires array from pool or returns a new one. */\n acquire(): T[] {\n return this.pool.pop() ?? [];\n }\n\n /** Releases array back to pool if within capacity and limit. */\n release(arr: T[]): void {\n // Fast capacity check first to avoid frozen check cost\n if (arr.length > this.capacity || this.pool.length >= this.limit) return;\n if (Object.isFrozen(arr)) return;\n\n arr.length = 0;\n this.pool.push(arr);\n }\n\n /** Clears the pool. */\n reset(): void {\n this.pool.length = 0;\n }\n}\n\n// ============================================================================\n// ObjectPool\n// ============================================================================\n\n/**\n * Generic object pool for reusing fixed-shape plain objects.\n *\n * Design constraints:\n * - Pooled objects MUST have a fixed property shape (monomorphic).\n * Mixing shapes in a single pool will de-optimize V8's hidden classes.\n * - The `reset` callback MUST restore the object to a clean, reusable state.\n * Failing to do so leaks stale references and causes subtle bugs.\n * - The pool is LIFO (stack) for better CPU cache locality.\n *\n * @template T - Object type to pool. Must be a plain object with a fixed shape.\n */\nexport class ObjectPool<T extends object> {\n private readonly pool: T[] = [];\n\n constructor(\n private readonly factory: () => T,\n private readonly reset: (obj: T) => void,\n private readonly limit = 64\n ) {}\n\n /** Acquires object from pool or creates a new one. */\n acquire(): T {\n return this.pool.pop() ?? this.factory();\n }\n\n /** Releases object back to pool after reset. */\n release(obj: T): void {\n if (this.pool.length < this.limit) {\n this.reset(obj);\n this.pool.push(obj);\n }\n }\n\n /** Drains all retained objects. */\n drain(): void {\n if (this.pool.length > 0) {\n this.pool.length = 0;\n }\n }\n\n get size(): number {\n return this.pool.length;\n }\n}\n\n// ============================================================================\n// Specialized Pools\n// ============================================================================\n\nexport const effectsArrayPool = new ArrayPool<EffectObject>();\nexport const cleanupsArrayPool = new ArrayPool<() => void>();\n\n/**\n * Per-element record of all reactive resources that must be released on cleanup.\n * Fields are optional to avoid allocating arrays for the common case where only\n * one resource type is used.\n *\n * Extracted here so that both the pool and registry share the same type.\n */\nexport interface BindingRecord {\n effects: EffectObject[] | undefined;\n cleanups: Array<() => void> | undefined;\n componentCleanup: (() => void) | undefined;\n}\n\n/**\n * Pool for BindingRecord objects.\n * Uses a fixed hidden class for V8 optimization.\n */\nexport const bindingRecordPool = new ObjectPool<BindingRecord>(\n () => {\n return {\n effects: undefined,\n cleanups: undefined,\n componentCleanup: undefined,\n };\n },\n (r) => {\n r.effects = undefined;\n r.cleanups = undefined;\n r.componentCleanup = undefined;\n },\n 128\n);\n","import { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type { EffectObject } from '@/types';\nimport { getSelector } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport {\n type BindingRecord,\n bindingRecordPool,\n cleanupsArrayPool,\n effectsArrayPool,\n} from '@/utils/pool';\n\nlet autoCleanupScheduled = false;\n\n/**\n * Ensures that the MutationObserver for automatic cleanup is active.\n * Lazily triggered on the first reactive binding registration.\n */\nfunction ensureAutoCleanup(): void {\n if (autoCleanupScheduled) return;\n autoCleanupScheduled = true;\n if (typeof document !== 'undefined' && document.body) {\n enableAutoCleanup(document.body);\n }\n}\n\n/**\n * CSS class added to every element that has at least one active binding.\n * Used by `querySelectorAll` in `cleanupDescendants` for efficient subtree traversal.\n * Internal use only.\n */\nconst AES_BOUND = '_aes-bound';\n\n// BindingRecord type is defined in @/internal/pool to co-locate with its ObjectPool.\n\n// ============================================================================\n// BindingRegistry\n// ============================================================================\n\n/**\n * Central registry mapping DOM elements to their reactive binding records.\n *\n * Design goals:\n * - Zero memory leaks: all collections use WeakMap/WeakSet keyed by Element.\n * - Minimal allocations in the hot tracking path.\n * - O(bound-descendants) cleanup via a single querySelectorAll pass.\n */\nclass BindingRegistry {\n private records = new WeakMap<Element, BindingRecord>();\n private preservedNodes = new WeakSet<Node>();\n private ignoredNodes = new WeakSet<Node>();\n\n keep(node: Node): void {\n this.preservedNodes.add(node);\n }\n isKept(node: Node): boolean {\n return this.preservedNodes.has(node);\n }\n markIgnored(node: Node): void {\n this.ignoredNodes.add(node);\n }\n isIgnored(node: Node): boolean {\n return this.ignoredNodes.has(node);\n }\n\n private getOrCreateRecord(el: Element): BindingRecord {\n ensureAutoCleanup();\n let res = this.records.get(el);\n if (!res) {\n res = bindingRecordPool.acquire();\n this.records.set(el, res);\n el.classList.add(AES_BOUND);\n }\n return res;\n }\n\n /**\n * Registers a reactive effect with an element's record.\n * Effects are automatically disposed when the element is removed from the DOM.\n *\n * @param el - The DOM element to bind the effect to.\n * @param fx - The reactive effect instance.\n */\n trackEffect(el: Element, fx: EffectObject): void {\n const record = this.getOrCreateRecord(el);\n if (!record.effects) {\n record.effects = effectsArrayPool.acquire();\n }\n record.effects.push(fx);\n }\n\n /**\n * Registers an arbitrary cleanup function with an element's record.\n * Cleanups are executed when the element is removed from the DOM.\n *\n * @param el - The DOM element to bind the cleanup to.\n * @param fn - The cleanup function (e.g., event unbinding, timer clear).\n */\n trackCleanup(el: Element, fn: () => void): void {\n const record = this.getOrCreateRecord(el);\n if (!record.cleanups) {\n record.cleanups = cleanupsArrayPool.acquire();\n }\n record.cleanups.push(fn);\n }\n\n /**\n * Assigns a component-level cleanup function (e.g., from atomMount).\n * Unlike generic cleanups, there can only be one component cleanup per element.\n */\n setComponentCleanup(el: Element, fn: (() => void) | undefined): void {\n this.getOrCreateRecord(el).componentCleanup = fn;\n }\n\n hasBind(el: Element): boolean {\n return this.records.has(el);\n }\n\n cleanup(el: Element | Node): void {\n const isElement = el.nodeType === 1;\n const record = this.records.get(el as Element);\n\n // Consolidate deletions\n this.preservedNodes.delete(el);\n this.ignoredNodes.delete(el);\n\n if (!record) {\n if (isElement) (el as Element).classList.remove(AES_BOUND);\n return;\n }\n\n this.records.delete(el as Element);\n if (isElement) (el as Element).classList.remove(AES_BOUND);\n\n const selector = isElement ? getSelector(el as Element) : el.nodeName || 'Node';\n debug.cleanup(LOG_PREFIXES.BINDING, selector);\n\n if (record.componentCleanup) {\n try {\n record.componentCleanup();\n } catch (e) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.CLEANUP_ERROR(selector), e);\n }\n }\n\n if (record.effects) {\n for (const fx of record.effects) {\n try {\n fx.dispose();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.CORE.EFFECT_DISPOSE_ERROR(selector), e);\n }\n }\n effectsArrayPool.release(record.effects);\n record.effects = undefined;\n }\n\n if (record.cleanups) {\n for (const fn of record.cleanups) {\n try {\n fn();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.CLEANUP_ERROR(selector), e);\n }\n }\n cleanupsArrayPool.release(record.cleanups);\n record.cleanups = undefined;\n }\n bindingRecordPool.release(record);\n }\n\n cleanupDescendants(el: Element | DocumentFragment | ShadowRoot): void {\n // Fast path: getElementsByClassName is significantly faster than querySelectorAll\n const live = (el as { getElementsByClassName?(name: string): HTMLCollectionOf<Element> })\n .getElementsByClassName\n ? (el as Element).getElementsByClassName(AES_BOUND)\n : el.querySelectorAll(`.${AES_BOUND}`);\n\n const len = live.length;\n if (len === 0) return;\n\n // Snapshot to avoid issues with live collection changing during cleanup\n // and to stabilize loop prediction.\n const snapshot = new Array<Element>(len);\n for (let i = 0; i < len; i++) snapshot[i] = live[i]!;\n\n for (let i = len - 1; i >= 0; i--) {\n const child = snapshot[i]!;\n // Pre-check registry to avoid unnecessary cleanup calls\n if (this.records.has(child)) {\n this.cleanup(child);\n } else {\n child.classList.remove(AES_BOUND);\n }\n }\n }\n\n cleanupTree(el: Element | Node): void {\n if (el.nodeType === 1 || el.nodeType === 11) {\n this.cleanupDescendants(el as Element | DocumentFragment | ShadowRoot);\n }\n this.cleanup(el);\n }\n}\n\n// ============================================================================\n// Singleton + auto-cleanup\n// ============================================================================\n\nexport const registry = new BindingRegistry();\n\nconst observers = new Map<Element, MutationObserver>();\n\n/**\n * Starts observing `root` for removed elements and automatically disposes\n * their reactive bindings when they leave the DOM.\n *\n * Multiple roots can be observed concurrently (e.g. for Micro-Frontends).\n * The `root` parameter is required (no default) to make the caller explicit\n * about which subtree is being observed.\n *\n * Idempotent: calling more than once with the same root has no effect.\n */\nexport function enableAutoCleanup(root: Element): void {\n // Support independent multiple roots for Micro-Frontend architectures.\n if (observers.has(root)) {\n return;\n }\n\n const observer = new MutationObserver((mutations) => {\n const reg = registry;\n for (let i = 0, mLen = mutations.length; i < mLen; i++) {\n const removedNodes = mutations[i]!.removedNodes;\n for (let j = 0, rLen = removedNodes.length; j < rLen; j++) {\n const node = removedNodes[j]!;\n\n // Only Element nodes can carry bindings marked by our AES_BOUND class.\n // We skip text and comment nodes early for performance.\n // Combined check for nodeType and connectivity (the two most common early exits)\n // to reduce separate branch prediction entries.\n if (node.nodeType !== 1 || (node as Element).isConnected) continue;\n\n const el = node as Element;\n\n // Combined flag checks for explicit detach (.keep) or manual cleanup traversal (.ignore).\n if (reg.isKept(el) || reg.isIgnored(el)) continue;\n\n reg.cleanupTree(el);\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n observers.set(root, observer);\n}\n\n/**\n * Marks the auto-cleanup as scheduled or already running.\n * Used internally and by reset helpers in tests.\n */\nexport function setAutoCleanupScheduled(scheduled: boolean): void {\n autoCleanupScheduled = scheduled;\n}\n\n/**\n * Stops all MutationObservers started by `enableAutoCleanup`.\n */\nexport function disableAutoCleanup(): void {\n observers.forEach((obs) => obs.disconnect());\n observers.clear();\n}\n","import { batch } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from '@/core/registry';\n\n/** Generic event handler type matching jQuery's internal handler signature. */\ntype EventHandler = JQuery.EventHandlerBase<unknown, JQuery.TriggeredEvent>;\n\n/**\n * Symbol marker attached to handlers registered by this library's internals.\n * Handlers carrying this marker are NOT wrapped in batch() — they already\n * manage atom writes directly and do not need an extra reactive flush.\n */\nexport const INTERNAL_HANDLER = Symbol('atom-effect-internal');\n\n/**\n * WeakMap from original handler function → batch-wrapped handler function.\n * Keys are functions (held alive by jQuery's internal event store for as long\n * as the handler is registered), so entries are naturally released when the\n * handler is removed via .off() and jQuery drops its reference.\n */\nconst handlerMap = new WeakMap<EventHandler, EventHandler>();\n\n// ============================================================================\n// Originals store\n// ============================================================================\n\n/**\n * Snapshot of jQuery prototype methods captured at `enablejQueryOverrides()`\n * time and restored by `disablejQueryOverrides()`.\n *\n * Stored as a typed object and captured into `orig` (a local const) inside\n * `enablejQueryOverrides` so that the override closures always reference the\n * pre-patch methods even if `disablejQueryOverrides()` later resets the\n * module-level `originals` variable to null.\n */\ntype OriginalMethods = {\n on: typeof $.fn.on;\n off: typeof $.fn.off;\n remove: typeof $.fn.remove;\n empty: typeof $.fn.empty;\n detach: typeof $.fn.detach;\n};\n\nlet originals: OriginalMethods | null = null;\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst getWrappedHandler = (fn: EventHandler): EventHandler => {\n // Fast check: is already wrapped?\n if ((fn as { [INTERNAL_HANDLER]?: boolean })[INTERNAL_HANDLER]) return fn;\n\n let wrapped = handlerMap.get(fn);\n if (!wrapped) {\n wrapped = function (this: unknown, ...args: unknown[]) {\n return batch(() => fn.apply(this, args as Parameters<EventHandler>));\n } as unknown as EventHandler;\n (wrapped as { [INTERNAL_HANDLER]?: boolean })[INTERNAL_HANDLER] = true;\n handlerMap.set(fn, wrapped);\n }\n return wrapped;\n};\n\nfunction wrapEventMap(map: Record<string, EventHandler>): Record<string, EventHandler> {\n const newMap: Record<string, EventHandler> = {};\n for (const k in map) if (map[k]) newMap[k] = getWrappedHandler(map[k]);\n return newMap;\n}\n\nfunction resolveOffEventMap(\n map: Record<string, EventHandler | undefined>\n): Record<string, EventHandler | undefined> {\n const newMap: Record<string, EventHandler | undefined> = {};\n for (const k in map) {\n const h = map[k];\n newMap[k] = h ? (handlerMap.get(h) ?? h) : undefined;\n }\n return newMap;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport function enablejQueryOverrides(): void {\n if (originals !== null) return;\n\n originals = {\n on: $.fn.on,\n off: $.fn.off,\n remove: $.fn.remove,\n empty: $.fn.empty,\n detach: $.fn.detach,\n };\n const orig = originals;\n\n $.fn.remove = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n const el = targets[i];\n if (el) {\n registry.markIgnored(el);\n registry.cleanupTree(el);\n }\n }\n return orig.remove.call(this, selector) ?? this;\n };\n\n $.fn.empty = function (this: JQuery) {\n const len = this.length;\n for (let i = 0; i < len; i++) {\n const el = this[i];\n if (el?.hasChildNodes()) registry.cleanupDescendants(el);\n }\n return orig.empty.call(this) ?? this;\n };\n\n $.fn.detach = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n const el = targets[i];\n if (el) registry.keep(el);\n }\n return orig.detach.call(this, selector) ?? this;\n };\n\n $.fn.on = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n if (types && typeof types === 'object') {\n args[0] = wrapEventMap(types as Record<string, EventHandler>);\n } else {\n const last = args.length - 1;\n if (last >= 0 && typeof args[last] === 'function') {\n args[last] = getWrappedHandler(args[last] as EventHandler);\n }\n }\n return orig.on.apply(this, args as Parameters<typeof $.fn.on>) ?? this;\n };\n\n $.fn.off = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n if (types && typeof types === 'object') {\n args[0] = resolveOffEventMap(types as Record<string, EventHandler | undefined>);\n } else {\n const last = args.length - 1;\n if (last >= 0 && typeof args[last] === 'function') {\n const fn = args[last] as EventHandler;\n args[last] = handlerMap.get(fn) ?? fn;\n }\n }\n return orig.off.apply(this, args as Parameters<typeof $.fn.off>) ?? this;\n };\n}\n\n/**\n * Restores all jQuery methods patched by `enablejQueryOverrides()`.\n * Primarily useful in test environments to reset state between suites.\n */\nexport function disablejQueryOverrides(): void {\n if (originals === null) return;\n\n $.fn.on = originals.on;\n $.fn.off = originals.off;\n $.fn.remove = originals.remove;\n $.fn.empty = originals.empty;\n $.fn.detach = originals.detach;\n\n originals = null;\n}\n","import type {\n AtomOptions as BaseAtomOptions,\n ComputedAtom,\n ComputedOptions,\n EffectObject,\n Paths,\n PathValue,\n ReadonlyAtom,\n WritableAtom,\n} from '@but212/atom-effect';\n\n// ============================================================================\n// Shared API Types\n// ============================================================================\n\nexport type EffectCleanup = () => void;\nexport type EffectResult = undefined | EffectCleanup;\nexport type EqualFn<T> = (a: T, b: T) => boolean;\n\nexport interface AtomOptions extends BaseAtomOptions {\n name?: string;\n}\n\n/**\n * Represents a value that can be tracked by the reactive system.\n * - T: Static value (one-time bind)\n * - ReadonlyAtom<T>: Reactive value (updates DOM when atom changes)\n * - () => T: Reactive function (updates DOM when any atom read inside changes)\n */\nexport type ReactiveValue<T> = T | ReadonlyAtom<T> | (() => T);\n\n/**\n * An extension of ReactiveValue that also supports Promises and async functions.\n * The binding system automatically handles the promise lifecycle, showing the\n * latest resolved value and ignoring stale ones (race condition protection).\n */\nexport type AsyncReactiveValue<T> =\n | T\n | ReadonlyAtom<T | Promise<T>>\n | Promise<T>\n | (() => T | Promise<T>);\nexport type PrimitiveValue = string | number | boolean | null | undefined;\ntype KeysOfType<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T];\n\nexport type CssValue =\n | AsyncReactiveValue<string | number>\n | [source: AsyncReactiveValue<number>, unit: string];\nexport type CssBindings = Record<string, CssValue>;\n\nexport interface BindingOptions<T = unknown> {\n text?: AsyncReactiveValue<unknown>;\n html?: AsyncReactiveValue<string>;\n class?: Record<string, AsyncReactiveValue<boolean>>;\n css?: CssBindings;\n attr?: Record<string, AsyncReactiveValue<PrimitiveValue>>;\n prop?: Record<string, AsyncReactiveValue<unknown>>;\n show?: AsyncReactiveValue<boolean>;\n hide?: AsyncReactiveValue<boolean>;\n val?: WritableAtom<T> | [atom: WritableAtom<T>, options: ValOptions<T>];\n checked?: WritableAtom<boolean>;\n form?:\n | WritableAtom<T extends object ? T : unknown>\n | [atom: WritableAtom<T extends object ? T : unknown>, options: FormOptions<unknown>];\n on?: Record<string, (e: JQuery.Event) => void>;\n}\n\nexport interface DisposableWritableAtom<T> extends WritableAtom<T>, Disposable {\n dispose(): void;\n}\n\nexport type ListKey = string | number;\nexport type ListRenderResult = string | Element | DocumentFragment | JQuery;\nexport type ListKeyFn<T> = (item: T, index: number) => ListKey;\n\nexport interface ListOptions<T> {\n key: KeysOfType<T, ListKey> | ListKeyFn<T>;\n render: (item: T, index: number) => ListRenderResult;\n bind?: ($el: JQuery, item: T, index: number) => void;\n update?: ($el: JQuery, item: T, index: number) => void;\n onAdd?: ($el: JQuery) => void;\n onRemove?: ($el: JQuery) => Promise<void> | void;\n empty?: ListRenderResult;\n events?: Record<string, (item: T, index: number, e: JQuery.TriggeredEvent) => void>;\n isEqual?: (a: T, b: T) => boolean;\n}\n\n/**\n * Options for `atomVal`, `atomChecked`, and `atomForm` bindings.\n */\nexport interface ValOptions<T> {\n /** Debounce duration in milliseconds for DOM -> Atom sync. Defaults to 0. */\n debounce?: number;\n /** jQuery event name(s) to listen to. Defaults to \"input\". */\n event?: string;\n /** Custom function to parse DOM string to atom type T. */\n parse?: (v: string) => T;\n /** Custom function to format atom type T to DOM string. */\n format?: (v: T) => string;\n /** Custom equality check to prevent redundant atom updates. */\n equal?: EqualFn<T>;\n}\n\n/**\n * Options for `atomForm` binding.\n */\nexport interface FormOptions<T> extends ValOptions<T> {\n /** Custom function to transform field value based on path before atomic sync. */\n transform?: (path: string, value: unknown) => unknown;\n /** Callback triggered when a field value changes. */\n onChange?: (path: string, value: unknown) => void;\n}\n\nexport interface FetchOptions<T> {\n defaultValue: T;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | (string & {});\n headers?: Record<string, string>;\n transform?: (raw: unknown) => T;\n ajaxOptions?: JQuery.AjaxSettings | (() => JQuery.AjaxSettings);\n onError?: (err: unknown) => void;\n eager?: boolean;\n}\n\nexport interface FetchError extends Error {\n jqXHR?: JQuery.jqXHR;\n}\n\nexport type ComponentFn<P = Record<string, unknown>> = ($el: JQuery, props: P) => EffectResult;\n\nexport interface RouteLifecycle {\n onEnter?: (params: Record<string, string>, router: Router) => Record<string, string> | undefined;\n onLeave?: (router: Router) => boolean | undefined;\n}\n\nexport interface TemplateRoute extends RouteLifecycle {\n template: string;\n render?: never;\n onMount?: ($content: JQuery, onUnmount: (cleanupFn: () => void) => void, router: Router) => void;\n}\n\nexport interface RenderRoute extends RouteLifecycle {\n render: (\n container: HTMLElement,\n route: string,\n params: Record<string, string>,\n onUnmount: (cleanupFn: () => void) => void,\n router: Router\n ) => void;\n template?: never;\n}\n\nexport type RouteDefinition = TemplateRoute | RenderRoute;\n\nexport interface RouteConfig {\n target: string;\n default: string;\n routes: Record<string, RouteDefinition>;\n mode?: 'hash' | 'history';\n basePath?: string;\n notFound?: string;\n autoBindLinks?: boolean;\n activeClass?: string;\n beforeTransition?: (from: string, to: string) => void;\n afterTransition?: (from: string, to: string) => void;\n}\n\nexport interface Router {\n currentRoute: ReadonlyAtom<string>;\n queryParams: ReadonlyAtom<Record<string, string>>;\n navigate: (route: string) => void;\n destroy: () => void;\n}\n\nexport enum BindingFlags {\n None = 0,\n Focused = 1 << 0,\n Composing = 1 << 1,\n SyncingToAtom = 1 << 2,\n SyncingToDom = 1 << 3,\n Busy = Composing | SyncingToAtom | SyncingToDom,\n}\n\nexport interface BindingContext {\n readonly el: HTMLElement;\n readonly trackCleanup: (fn: EffectCleanup) => void;\n}\n\ndeclare global {\n interface JQueryStatic {\n atom: { <T>(v: T, opts?: AtomOptions): WritableAtom<T>; debug: boolean };\n computed<T>(fn: () => T, opts?: ComputedOptions<T>): ComputedAtom<T>;\n computed<T>(\n fn: () => Promise<T>,\n opts: ComputedOptions<T> & { defaultValue: T }\n ): ComputedAtom<T>;\n effect(fn: () => EffectResult): EffectObject;\n batch(fn: () => void): void;\n untracked<T>(fn: () => T): T;\n isAtom(v: unknown): boolean;\n isComputed(v: unknown): boolean;\n isReactive(v: unknown): boolean;\n nextTick(): Promise<void>;\n atomLens<T extends object, P extends Paths<T>>(\n atom: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n composeLens<T extends object, P extends Paths<T>>(\n lens: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n lensFor<T extends object>(\n atom: WritableAtom<T>\n ): <P extends Paths<T>>(p: P) => DisposableWritableAtom<PathValue<T, P>>;\n route(config: RouteConfig): Router;\n atomFetch<T>(\n url: string | (() => string),\n opts: FetchOptions<T>\n ): ComputedAtom<T> & { abort: () => void };\n }\n\n interface JQuery {\n atomText<T>(src: AsyncReactiveValue<T>, fmt?: (v: T) => string): this;\n atomHtml(src: AsyncReactiveValue<string>): this;\n atomClass(name: string, cond: AsyncReactiveValue<boolean>): this;\n atomClass(map: Record<string, AsyncReactiveValue<boolean>>): this;\n atomCss(prop: string, src: AsyncReactiveValue<string | number>, unit?: string): this;\n atomCss(map: CssBindings): this;\n atomAttr(name: string, src: AsyncReactiveValue<PrimitiveValue>): this;\n atomAttr(map: Record<string, AsyncReactiveValue<PrimitiveValue>>): this;\n atomProp<T>(name: string, src: AsyncReactiveValue<T>): this;\n atomProp<T>(map: Record<string, AsyncReactiveValue<T>>): this;\n atomShow(cond: AsyncReactiveValue<boolean>): this;\n atomHide(cond: AsyncReactiveValue<boolean>): this;\n atomVal<T>(atom: WritableAtom<T>, opts?: ValOptions<T>): this;\n atomChecked(atom: WritableAtom<boolean>): this;\n atomForm<T extends object>(atom: WritableAtom<T>, opts?: FormOptions<unknown>): this;\n atomOn(event: string, handler: (e: JQuery.Event) => void): this;\n atomBind<T = unknown>(opts: BindingOptions<T>): this;\n atomList<T>(src: ReadonlyAtom<T[]>, opts: ListOptions<T>): this;\n atomMount<P>(comp: ComponentFn<P>, props?: P): this;\n atomUnmount(): this;\n atomUnbind(): this;\n }\n}\n\nexport type { ComputedAtom, ComputedOptions, EffectObject, ReadonlyAtom, WritableAtom };\n","import { effect, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, INPUT_DEFAULTS, LOG_PREFIXES } from '@/constants';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport type { EffectObject, ValOptions, WritableAtom } from '@/types';\nimport { BindingFlags } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// Monotonically increasing counter used to generate per-instance event\n// namespaces, preventing cleanup of sibling bindings on the same element.\nlet instanceCounter = 0;\n\ntype InputEl = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\n/**\n * Marks a handler as library-internal so the jQuery patch skips batch() wrapping.\n * All handlers registered by InputBinding must be marked — unmarked handlers are\n * wrapped in batch() by the jQuery override, which is redundant and potentially\n * harmful here since InputBinding manages atom writes directly.\n */\nfunction markInternal(fn: Function): void {\n (fn as unknown as Record<symbol, true>)[INTERNAL_HANDLER] = true;\n}\n\nclass InputBinding<T> {\n private readonly $el: JQuery;\n private readonly el: InputEl;\n private readonly atom: WritableAtom<T>;\n private readonly isMultipleSelect: boolean;\n private readonly isTextControl: boolean;\n\n private readonly parse: (v: string) => T;\n private readonly format: (v: T) => string;\n private readonly equal: (a: T, b: T) => boolean;\n private readonly readDom: () => T;\n private readonly getRawDom: () => string | string[];\n private readonly writeDom: (val: T, formatted: string) => void;\n\n /**\n * Internal state flags using bitwise operations for zero-overhead tracking.\n * Tracks focus, IME composition, and sync direction to prevent infinite loops.\n */\n private flags = 0;\n private timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\n\n /** Per-instance jQuery event namespace — prevents cleanup collisions. */\n private readonly ns: string;\n private readonly handleInput: () => void;\n\n constructor($el: JQuery, atom: WritableAtom<T>, options: ValOptions<T>) {\n this.$el = $el;\n this.el = $el[0] as InputEl;\n this.atom = atom;\n const tagName = this.el.tagName;\n const isMultiple = tagName === 'SELECT' && (this.el as HTMLSelectElement).multiple;\n this.isMultipleSelect = isMultiple;\n this.isTextControl = tagName === 'INPUT' || tagName === 'TEXTAREA';\n this.ns = `.atomBind-${++instanceCounter}`;\n\n const debounce = options.debounce ?? 0;\n\n this.parse = options.parse ?? ((v: string) => v as unknown as T);\n\n // Specialize strategy functions at construction to avoid branches in sync hot-paths\n if (isMultiple) {\n this.format =\n options.format ?? ((v: T) => (Array.isArray(v) ? v : v ? [String(v)] : []).join(','));\n this.getRawDom = () => (this.$el.val() as string[] | null) || [];\n this.readDom = () => this.getRawDom() as unknown as T;\n this.writeDom = (val) => {\n this.$el.val(val as unknown as string[]);\n };\n } else {\n this.format = options.format ?? ((v: T) => String(v ?? ''));\n this.getRawDom = () => this.el.value;\n this.readDom = () => this.parse(this.el.value);\n\n if (this.isTextControl) {\n this.writeDom = (_val, formatted) => {\n if (this.flags & BindingFlags.Focused) {\n // --- Cursor Preservation Strategy ---\n try {\n const el = this.el as HTMLInputElement;\n const start = el.selectionStart;\n const end = el.selectionEnd;\n el.value = formatted;\n const len = formatted.length;\n if (start !== null && end !== null) {\n el.setSelectionRange(start < len ? start : len, end < len ? end : len);\n }\n } catch {\n this.el.value = formatted;\n }\n } else {\n this.el.value = formatted;\n }\n };\n } else {\n this.writeDom = (_, formatted) => {\n this.el.value = formatted;\n };\n }\n }\n\n const baseEqual = options.equal ?? Object.is;\n if (isMultiple) {\n this.equal = (a: T, b: T): boolean => {\n if (baseEqual(a, b)) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n const len = a.length;\n if (len !== b.length) return false;\n for (let i = 0; i < len; i++) {\n if (!Object.is(a[i], b[i])) return false;\n }\n return true;\n }\n return false;\n };\n } else {\n this.equal = baseEqual;\n }\n\n if (debounce > 0) {\n this.handleInput = () => {\n if (this.flags & BindingFlags.Composing) return;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => this.syncAtomFromDom(), debounce);\n };\n } else {\n this.handleInput = () => {\n if (!(this.flags & BindingFlags.Composing)) this.syncAtomFromDom();\n };\n }\n\n [\n this.handleFocus,\n this.handleBlur,\n this.handleCompositionStart,\n this.handleCompositionEnd,\n this.handleInput,\n ].forEach(markInternal);\n\n this.bindEvents(options.event ?? INPUT_DEFAULTS.EVENT);\n }\n\n // --- Event Handlers ---\n\n private readonly handleCompositionStart = () => {\n // We ignore input events while the user is still composing characters\n // (e.g., CJK character selection) to avoid syncing incomplete/partial data.\n this.flags |= BindingFlags.Composing;\n };\n\n private readonly handleCompositionEnd = () => {\n this.flags &= ~BindingFlags.Composing;\n // Trigger sync once composition is finished to capture the final character.\n this.handleInput();\n };\n\n private readonly handleFocus = () => {\n this.flags |= BindingFlags.Focused;\n };\n\n private readonly handleBlur = () => {\n this.flags &= ~BindingFlags.Focused;\n const wasComposing = !!(this.flags & BindingFlags.Composing);\n this.flags &= ~BindingFlags.Composing;\n\n // Ensure any pending debounced change is committed immediately on blur.\n this.flushPendingDebounce();\n\n // If composition was interrupted by blur (e.g. clicking away),\n // we must perform a final sync to stay consistent with the DOM.\n if (wasComposing && this.timeoutId === undefined) {\n this.syncAtomFromDom();\n }\n\n // Restore the strict formatted value from the atom.\n this.normalizeDomValue();\n };\n\n // --- Helpers ---\n\n private flushPendingDebounce(): void {\n if (this.timeoutId !== undefined) {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n this.syncAtomFromDom();\n }\n }\n\n private normalizeDomValue(): void {\n const val = this.atom.peek();\n const formatted = this.format(val);\n const raw = this.getRawDom();\n\n if (this.isMultipleSelect) {\n if (!this.equal(raw as unknown as T, val)) {\n this.writeDom(val, formatted);\n }\n } else if (raw !== formatted) {\n this.writeDom(val, formatted);\n }\n }\n\n private syncAtomFromDom(): void {\n if (this.flags & BindingFlags.Busy) return;\n this.flags |= BindingFlags.SyncingToAtom;\n try {\n const parsed = this.readDom();\n if (!this.equal(this.atom.peek(), parsed)) {\n this.atom.value = parsed;\n }\n } catch (e) {\n debug.warn(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.PARSE_ERROR(e instanceof Error ? e.message : String(e)),\n e\n );\n } finally {\n this.flags &= ~BindingFlags.SyncingToAtom;\n }\n }\n\n public readonly syncDomFromAtom = () => {\n const val = this.atom.value;\n\n untracked(() => {\n const formatted = this.format(val);\n const raw = this.getRawDom();\n\n // Skip if raw DOM matches formatted string (or array for select-multiple)\n if (this.isMultipleSelect) {\n if (this.equal(raw as unknown as T, val)) return;\n } else if (raw === formatted) {\n return;\n }\n\n // If focused, check if it's already \"functionally\" equal via parse to avoid\n // overwriting while user is typing (e.g. typing \"1.0\" when atom is 1)\n if (this.flags & BindingFlags.Focused) {\n try {\n if (this.equal(this.readDom(), val)) return;\n } catch {\n // Ignore parse errors on check-only read\n }\n }\n\n this.flags |= BindingFlags.SyncingToDom;\n try {\n this.writeDom(val, formatted);\n debug.domUpdated(LOG_PREFIXES.BINDING, this.$el, 'val', formatted);\n } finally {\n this.flags &= ~BindingFlags.SyncingToDom;\n }\n });\n };\n\n public readonly cleanup = () => {\n this.$el.off(this.ns);\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n };\n\n private bindEvents(eventName: string): void {\n const ns = this.ns;\n const namespacedEvents = eventName\n .trim()\n .split(/\\s+/)\n .map((e) => `${e}${ns}`)\n .join(' ');\n\n this.$el\n .on(`focus${ns}`, this.handleFocus)\n .on(`blur${ns}`, this.handleBlur)\n .on(`compositionstart${ns}`, this.handleCompositionStart)\n .on(`compositionend${ns}`, this.handleCompositionEnd)\n .on(namespacedEvents, this.handleInput);\n }\n}\n\n/**\n * Applies two-way data binding between a writable atom and an input element.\n */\nexport function applyInputBinding<T>(\n $el: JQuery,\n atom: WritableAtom<T>,\n options: ValOptions<T>\n): { fx: EffectObject; cleanup: () => void } {\n let binding: InputBinding<T> | null = new InputBinding($el, atom, options);\n return {\n fx: effect(binding.syncDomFromAtom),\n cleanup: () => {\n if (binding) {\n binding.cleanup();\n binding = null;\n }\n },\n };\n}\n","import { effect, type ReadonlyAtom, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { AsyncReactiveValue } from '@/types';\n\nimport { isPromise, isReactive } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// Debug type\n// ============================================================================\n\n/**\n * Structured label identifying which binding produced a debug log entry.\n * Fixed bindings use a plain literal; per-key bindings use a `prefix.key` form\n * where the key portion must be non-empty.\n *\n * Note: the trailing `(string & {})` member makes this type accept any string\n * at runtime while still surfacing the named literals as IDE autocomplete\n * suggestions. It does NOT enforce that only the listed values are used —\n * TypeScript absorbs all narrower literal members into `string & {}`, so there\n * is no compile-time restriction beyond `string`.\n */\nexport type BindingDebugType =\n | 'text'\n | 'html'\n | 'show'\n | 'hide'\n | 'checked'\n | `class.${string & {}}`\n | `css.${string & {}}`\n | `attr.${string & {}}`\n | `prop.${string & {}}`\n | (string & {});\n\n// ============================================================================\n// Core factory\n// ============================================================================\n\n/**\n * Registers a reactive effect that calls `updater` whenever `source` changes,\n * or calls `updater` once immediately if `source` is a static value.\n *\n * Responsibilities:\n * - Reactive path: wraps `updater` in an `effect`, tracks it on the registry.\n * - Static path: applies the value once; no effect is registered.\n * - Debug path: logs both the static initial bind and reactive updates via\n * `debug.domUpdated` so that all DOM writes appear in a uniform format.\n * - Error path: catches `updater` exceptions and surfaces them via `console.error`\n * so that a broken binding does not silently kill the effect loop.\n * Both the reactive and static paths are guarded consistently with `untracked`.\n *\n * @param el DOM element or SVG element to associate the effect with.\n * @param source Reactive or static value source.\n * @param updater Function that writes the value to the DOM.\n * @param debugType Structured label used in debug log output and effect naming.\n */\nexport function registerReactiveEffect<T>(\n el: Element,\n source: AsyncReactiveValue<T>,\n updater: (value: T) => void,\n debugType: BindingDebugType\n): void {\n let latestPromise: Promise<T> | null = null;\n\n const runUpdater = (val: T | Promise<T>) => {\n if (!isPromise(val)) {\n latestPromise = null;\n try {\n updater(val);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, val);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true), e);\n }\n return;\n }\n\n latestPromise = val;\n val\n .then((resolved) => {\n // Ensure this is still the most recent promise to avoid race conditions\n if (latestPromise === val) {\n untracked(() => {\n try {\n updater(resolved);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolved);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n }\n })\n .catch((e) => {\n if (latestPromise === val) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n };\n\n /**\n * Decide whether to register a reactive effect or perform a one-time static update.\n *\n * STRATEGY:\n * 1. If it's an Atom or a function, it's considered 'reactive' and wrapped in an effect.\n * 2. If it's a plain value or a Promise, it's 'static' and applied once.\n */\n const sourceIsReactive = isReactive(source);\n const sourceIsFunction = typeof source === 'function';\n\n if (sourceIsReactive || sourceIsFunction) {\n registry.trackEffect(\n el,\n effect(\n () => {\n // Resolve the current value based on the source type.\n // Both paths subscribe to their respective dependencies automatically.\n const value = sourceIsReactive\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n\n untracked(() => runUpdater(value));\n },\n { name: debugType }\n )\n );\n } else {\n // Static path: applies the value immediately and doesn't register an effect.\n untracked(() => runUpdater(source as T | Promise<T>));\n }\n}\n\n/**\n * Registers a single reactive effect that observes multiple sources in a map.\n * When any source changes, the entire map is re-processed via the updater.\n */\nexport function registerMapEffect<T>(\n el: Element,\n map: Record<string, AsyncReactiveValue<T>>,\n updater: (map: Record<string, T>) => void,\n debugType: BindingDebugType\n): void {\n const keys = Object.keys(map);\n const reactiveKeys: string[] = [];\n const reactiveSources: AsyncReactiveValue<T>[] = [];\n const sourceIsAtom: boolean[] = [];\n const staticValues: Record<string, T | Promise<T>> = {};\n\n for (let i = 0, len = keys.length; i < len; i++) {\n const key = keys[i]!;\n const val = map[key]!;\n const isAtomVal = isReactive(val);\n if (isAtomVal || typeof val === 'function') {\n reactiveKeys.push(key);\n reactiveSources.push(val);\n sourceIsAtom.push(isAtomVal);\n } else {\n staticValues[key] = val;\n }\n }\n\n let latestPromiseId = 0;\n\n const runUpdater = (currentMap: Record<string, T | Promise<T>>) => {\n const promises: Promise<{ key: string; val: T }>[] = [];\n const resolvedMap: Record<string, T> = {};\n const len = keys.length;\n\n for (let i = 0; i < len; i++) {\n const key = keys[i]!;\n const val = currentMap[key]!;\n if (isPromise(val)) {\n promises.push(val.then((v) => ({ key, val: v })));\n } else {\n resolvedMap[key] = val as T;\n }\n }\n\n const pLen = promises.length;\n if (pLen > 0) {\n const myId = ++latestPromiseId;\n Promise.all(promises).then((results) => {\n if (myId === latestPromiseId) {\n for (let i = 0; i < pLen; i++) {\n const res = results[i]!;\n resolvedMap[res.key] = res.val;\n }\n untracked(() => {\n try {\n updater(resolvedMap);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolvedMap);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n }\n });\n } else {\n latestPromiseId++; // Invalidate any pending promises\n try {\n updater(resolvedMap);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, resolvedMap);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true), e);\n }\n }\n };\n\n if (reactiveKeys.length > 0) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const currentMap: Record<string, T | Promise<T>> = { ...staticValues };\n for (let i = 0, len = reactiveKeys.length; i < len; i++) {\n const source = reactiveSources[i]!;\n currentMap[reactiveKeys[i]!] = sourceIsAtom[i]\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n }\n untracked(() => runUpdater(currentMap));\n },\n { name: debugType }\n )\n );\n } else {\n untracked(() => runUpdater(staticValues));\n }\n}\n","/**\n * HTML sanitization and security guards for XSS mitigation.\n *\n * This module is the **sole** sanitization layer — there is no downstream\n * sanitizer (e.g. DOMPurify) applied automatically. All regex-based\n * filtering happens here before content reaches the DOM.\n *\n * **Threat model:** best-effort defence for developer-authored templates and\n * reactive string bindings. For user-controlled rich text (e.g. a WYSIWYG\n * editor), replace or supplement this with DOMPurify.\n */\n\n// ============================================================================\n// URL attribute registry\n// ============================================================================\n\n/**\n * Attributes that carry a single URL value.\n *\n * `srcset` is intentionally excluded: its value is a comma-separated list of\n * URLs (e.g. `\"img.png 1x, img@2x.png 2x\"`), so a start-anchored regex cannot\n * reliably detect a dangerous protocol buried after the first comma. Callers\n * that need to validate srcset should parse each URL individually.\n */\nexport const URL_ATTRS = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n]);\n\n// ============================================================================\n// Pre-compiled regex constants\n// ============================================================================\n\nexport const DANGEROUS_PROTOCOL_RE = /^\\s*(?:javascript|vbscript)\\s*:/i;\n\nconst DANGEROUS_CSS_RE =\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters for XSS sanitization\n /(?:expression\\s*\\(|behavior\\s*:|-moz-binding\\s*:|(?:\\\\[0-9a-f]{1,6}\\s*|[\\s\\x00-\\x20/'\"])*(?:j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|v\\s*b\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|d\\s*a\\s*t\\s*a)\\s*:(?!image\\/))/i;\n\n/** Detects `javascript:` / `vbscript:` inside a CSS `url()` function. Non-global — no `lastIndex` state. */\nconst DANGEROUS_CSS_URL_RE = /url\\s*\\(\\s*(?:[\"']?\\s*)?(?:javascript|vbscript)\\s*:/i;\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters\nconst STRIP_CTRL_RE = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g;\n\n/**\n * Numeric HTML entity decoder: &#NNN; and &#xHH; forms.\n *\n * Runs before protocol/tag checks so entity-encoded bypass vectors like\n * \"javascript:\" (j=106) are normalised to their literal characters.\n * Safe structural entities (& < > ") are intentionally left\n * encoded — they produce inert text when re-inserted via innerHTML and must\n * remain escaped for correct HTML rendering.\n *\n * The semicolon is optional (`?`) to catch unterminated references such as\n * \"javascript:\" which some parsers still decode.\n */\nconst DECODE_NUMERIC_ENTITY_RE = /&#x([0-9a-f]+);?|&#([0-9]+);?/gi;\n\n/**\n * Named-entity decoder for the small set of entities relevant to protocol\n * smuggling (colon, Tab, NewLine).\n *\n * HTML5 named character references are **case-sensitive** — `	` exists,\n * `&tab;` does not. Do NOT add the `i` flag: it would incorrectly decode\n * non-existent variants and widen the attack surface.\n */\nconst NAMED_ENTITY_MAP: Record<string, string> = {\n colon: ':',\n Tab: '\\t',\n NewLine: '\\n',\n};\nconst DECODE_NAMED_ENTITY_RE = /&(colon|Tab|NewLine);/g;\n\nconst STRIP_XML_RE = /<\\?[\\s\\S]*?\\?>/g;\n\nconst DANGEROUS_TAG_RE =\n /(<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*>([\\s\\S]*?)<\\/\\2>|<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*\\/?>)/gi;\n\nconst DANGEROUS_PROTOCOL_GLOBAL_RE =\n /(j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|v\\s*b\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t)\\s*:/gi;\n\nconst DANGEROUS_DATA_URI_RE =\n /data\\s*:\\s*(?:text\\/(?:html|javascript|vbscript|xml)|application\\/(?:javascript|xhtml\\+xml|xml|x-shockwave-flash)|image\\/svg\\+xml)/gi;\n\nconst UNSAFE_ATTR_RE = /\\bon\\w+\\s*=/gim;\n\n/** Global variant of DANGEROUS_CSS_RE for use inside sanitizeHtml. */\nconst DANGEROUS_CSS_GLOBAL_RE = new RegExp(DANGEROUS_CSS_RE.source, 'gim');\n\n// ============================================================================\n// sanitizeHtml\n// ============================================================================\n\n/**\n * O(n) single-pass scan for characters that indicate potential danger.\n * Much cheaper than running 5+ regexes on safe strings.\n */\nfunction needsSanitization(s: string): boolean {\n const len = s.length;\n for (let i = 0; i < len; i++) {\n const c = s.charCodeAt(i);\n // '<' (0x3C), '&' (0x26), control chars (0x00-0x1F excl. tab/nl/cr)\n if (c === 0x3c || c === 0x26 || (c <= 0x1f && c !== 0x09 && c !== 0x0a && c !== 0x0d)) {\n return true;\n }\n }\n\n // Use a more conservative check for protocols and event handlers.\n // Any colon or the pattern \"on\" + letter should trigger a full regex-based sanitization.\n if (s.indexOf(':') !== -1) return true;\n\n const lower = s.toLowerCase();\n const onIdx = lower.indexOf('on');\n if (onIdx !== -1 && onIdx < len - 2) {\n const nextChar = lower.charCodeAt(onIdx + 2);\n // Check if it's \"on\" followed by a letter (potential event handler like onclick)\n if (nextChar >= 97 && nextChar <= 122) return true;\n }\n\n return false;\n}\n\n/**\n * HTML sanitization for XSS mitigation using regex-based filtering.\n * Optimized with an early-exit fast-path for safe strings.\n */\nexport function sanitizeHtml(html: string | null | undefined): string {\n if (!html) return '';\n const sInit = String(html);\n\n // Fast path: if no dangerous characters or patterns exist, skip all regex processing.\n if (!needsSanitization(sInit)) return sInit;\n\n let s = sInit\n .replace(STRIP_CTRL_RE, '')\n .replace(DECODE_NUMERIC_ENTITY_RE, (_, hex, dec) =>\n String.fromCodePoint(hex ? parseInt(hex, 16) : parseInt(dec, 10))\n )\n .replace(DECODE_NAMED_ENTITY_RE, (_, name) => NAMED_ENTITY_MAP[name] ?? '');\n\n if (s.indexOf('<') !== -1) {\n s = s.replace(STRIP_XML_RE, '');\n let prev: string;\n do {\n prev = s;\n s = s.replace(DANGEROUS_TAG_RE, '');\n } while (s !== prev);\n }\n\n return s\n .replace(DANGEROUS_PROTOCOL_GLOBAL_RE, 'data-unsafe-protocol:')\n .replace(DANGEROUS_DATA_URI_RE, 'data-unsafe-protocol:')\n .replace(UNSAFE_ATTR_RE, 'data-unsafe-attr=')\n .replace(DANGEROUS_CSS_GLOBAL_RE, 'data-unsafe-css:');\n}\n\n/** Checks for javascript:/vbscript: protocols in URL attributes. */\nexport const isDangerousUrl = (attr: string, val: string): boolean => {\n if (val.length < 10) return false; // \"javascript:\".length = 11\n const lower = attr.toLowerCase();\n return URL_ATTRS.has(lower) && DANGEROUS_PROTOCOL_RE.test(val);\n};\n\n/** Checks for protocols inside CSS url() functions. */\nexport const isDangerousCssValue = (val: string): boolean => {\n if (val.length < 15) return false; // \"url(javascript:)\".length = 15\n return val.toLowerCase().includes('url(') && DANGEROUS_CSS_URL_RE.test(val);\n};\n","import { computed, effect, isAtom, type ReadonlyAtom, untracked } from '@but212/atom-effect';\n\nimport $ from 'jquery';\nimport { applyInputBinding } from '@/bindings/input-binding';\nimport { DANGEROUS_PROPS, ERROR_MESSAGES, LOG_PREFIXES, VALID_INPUT_TAGS } from '@/constants';\nimport { registerMapEffect, registerReactiveEffect } from '@/core/effect-factory';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssValue,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\nimport { debug } from '@/utils/debug';\n\nexport type { BindingContext };\n\nimport { hasOwn, isPromise } from '@/utils';\n\nimport {\n DANGEROUS_PROTOCOL_RE,\n isDangerousCssValue,\n sanitizeHtml,\n URL_ATTRS,\n} from '@/utils/sanitize';\n\n// Cache for CSS property camelization to avoid repeated regex overhead.\n// Uses Map instead of a plain object to avoid prototype pollution risk and\n// for clearer semantics — CSS property names are a small, finite set so the\n// cache is effectively bounded in practice.\nconst camelCache = new Map<string, string>();\nfunction getCamelCase(prop: string): string {\n let cached = camelCache.get(prop);\n if (cached !== undefined) return cached;\n\n cached = prop.includes('-') ? prop.replace(/-./g, (m) => m[1]!.toUpperCase()) : prop;\n camelCache.set(prop, cached);\n return cached;\n}\n\n/**\n * Cache for sanitized versions of reactive strings.\n * Ensures that if 100 elements are bound to the same atom, sanitizeHtml() is\n * called only once per update instead of 100 times.\n */\nconst htmlSanitizeCache = new WeakMap<\n ReadonlyAtom<string | Promise<string>>,\n ReadonlyAtom<string | Promise<string>>\n>();\n\nfunction getSanitizedHtml(\n source: ReadonlyAtom<string | Promise<string>>\n): ReadonlyAtom<string | Promise<string>> {\n let cached = htmlSanitizeCache.get(source);\n if (!cached) {\n cached = computed(() => {\n const val = source.value;\n if (isPromise(val)) {\n return val.then((v: string) => sanitizeHtml(v));\n }\n return sanitizeHtml(val);\n });\n htmlSanitizeCache.set(source, cached);\n }\n return cached;\n}\n\n// ============================================================================\n// Binding Context Factory\n// ============================================================================\n\nexport function createContext(el: HTMLElement): BindingContext {\n return {\n el,\n trackCleanup: (fn) => registry.trackCleanup(el, fn),\n };\n}\n\n// ============================================================================\n// One-Way Binding Handlers (Atom → DOM)\n// ============================================================================\n\n/**\n * Updates element text content.\n */\nexport function bindText<T = unknown>(\n { el }: BindingContext,\n value: AsyncReactiveValue<T>,\n formatter?: (val: T) => string\n): void {\n registerReactiveEffect(\n el,\n value,\n (val) => {\n const text = formatter ? formatter(val) : String(val ?? '');\n if (el.textContent !== text) el.textContent = text;\n },\n 'text'\n );\n}\n\n/**\n * Updates element inner HTML with XSS sanitization.\n */\nexport function bindHtml({ el }: BindingContext, value: AsyncReactiveValue<string>): void {\n const source = isAtom(value)\n ? getSanitizedHtml(value as ReadonlyAtom<string | Promise<string>>)\n : value;\n\n registerReactiveEffect(\n el,\n source,\n (val) => {\n const html = source === value ? sanitizeHtml(val) : val;\n if (el.innerHTML !== html) {\n registry.cleanupDescendants(el);\n el.innerHTML = html;\n }\n },\n 'html'\n );\n}\n\n/**\n * Toggles multiple CSS classes based on reactive boolean conditions.\n */\nexport function bindClass(\n { el }: BindingContext,\n classMap: Record<string, AsyncReactiveValue<boolean>>\n): void {\n const tokenMap: Record<string, string[]> = {};\n for (const k in classMap) {\n if (hasOwn.call(classMap, k)) {\n const trimmed = k.trim();\n // Optimization: avoid regex for simple single-class keys\n tokenMap[k] = trimmed.indexOf(' ') === -1 ? [trimmed] : trimmed.split(/\\s+/).filter(Boolean);\n }\n }\n\n registerMapEffect(\n el,\n classMap,\n (states) => {\n for (const k in states) {\n const tokens = tokenMap[k]!;\n if (states[k]) {\n el.classList.add(...tokens);\n } else {\n el.classList.remove(...tokens);\n }\n }\n },\n 'class'\n );\n}\n\n/**\n * Updates multiple CSS style properties.\n */\nexport function bindCss({ el }: BindingContext, cssMap: Record<string, CssValue>): void {\n const style = el.style as unknown as Record<string, string | null>;\n const reactiveMap: Record<string, ReactiveValue<unknown>> = {};\n const meta: Record<string, { camel: string; unit: string }> = {};\n\n for (const p in cssMap) {\n if (hasOwn.call(cssMap, p)) {\n const val = cssMap[p]!;\n const [src, unit] = Array.isArray(val) ? val : ([val, ''] as const);\n reactiveMap[p] = src;\n meta[p] = { camel: getCamelCase(p), unit };\n }\n }\n\n registerMapEffect(\n el,\n reactiveMap,\n (states) => {\n for (const p in states) {\n const m = meta[p]!;\n const val = states[p];\n const str = m.unit ? `${val}${m.unit}` : String(val);\n const camel = m.camel;\n if (!isDangerousCssValue(str) && style[camel] !== str) {\n style[camel] = str;\n }\n }\n },\n 'css'\n );\n}\n\n/**\n * Binds DOM attributes with security guards and primitive value constraints.\n */\nexport function bindAttr(\n { el }: BindingContext,\n attrMap: Record<string, AsyncReactiveValue<PrimitiveValue>>\n): void {\n const safeMap: Record<string, AsyncReactiveValue<PrimitiveValue>> = {};\n const metaMap: Record<string, { isAria: boolean; isUrl: boolean }> = {};\n const cache: Record<string, string | null> = {};\n\n for (const name in attrMap) {\n if (!hasOwn.call(attrMap, name)) continue;\n const lower = name.toLowerCase();\n if (lower.startsWith('on')) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)}`\n );\n continue;\n }\n safeMap[name] = attrMap[name]!;\n metaMap[name] = { isAria: lower.startsWith('aria-'), isUrl: URL_ATTRS.has(lower) };\n cache[name] = el.getAttribute(name);\n }\n\n registerMapEffect(\n el,\n safeMap,\n (states) => {\n for (const name in states) {\n const m = metaMap[name]!;\n const val = states[name] as PrimitiveValue;\n\n if (val == null || (val === false && !m.isAria)) {\n if (cache[name] !== null) el.removeAttribute(name);\n cache[name] = null;\n continue;\n }\n\n const newVal = val === true ? (m.isAria ? 'true' : name) : String(val);\n if (m.isUrl && DANGEROUS_PROTOCOL_RE.test(newVal)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n if (cache[name] !== newVal) {\n el.setAttribute(name, newVal);\n cache[name] = newVal;\n }\n }\n },\n 'attr'\n );\n}\n\n/**\n * Binds DOM properties. Uses strict property write guards and security filters.\n */\nexport function bindProp(\n ctx: BindingContext,\n propMap: Record<string, AsyncReactiveValue<unknown>>\n): void {\n const el = ctx.el as unknown as Record<string, unknown>;\n const safeMap: Record<string, AsyncReactiveValue<unknown>> = {};\n const metaMap: Record<string, { isUrl: boolean }> = {};\n\n for (const name in propMap) {\n if (!hasOwn.call(propMap, name)) continue;\n const lower = name.toLowerCase();\n if (lower.startsWith('on') || DANGEROUS_PROPS.has(name)) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${\n lower.startsWith('on')\n ? ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)\n : ERROR_MESSAGES.SECURITY.BLOCKED_PROP(name)\n }`\n );\n continue;\n }\n safeMap[name] = propMap[name]!;\n metaMap[name] = { isUrl: URL_ATTRS.has(lower) };\n }\n\n registerMapEffect(\n ctx.el,\n safeMap,\n (states) => {\n for (const name in states) {\n const val = states[name];\n if (metaMap[name]!.isUrl && typeof val === 'string' && DANGEROUS_PROTOCOL_RE.test(val)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n if (el[name] !== val) {\n el[name] = val;\n }\n }\n },\n 'prop'\n );\n}\n\n/**\n * Handles visibility (display: none) toggle.\n */\nexport function bindVisibility(\n { el }: BindingContext,\n condition: AsyncReactiveValue<boolean>,\n invert: boolean\n): void {\n const show = el.style.display === 'none' ? '' : el.style.display;\n registerReactiveEffect(\n el,\n condition,\n (val) => {\n const target = invert !== !!val ? show : 'none';\n if (el.style.display !== target) el.style.display = target;\n },\n invert ? 'hide' : 'show'\n );\n}\n\n/**\n * Two-way value binding with full feature parity to $.fn.atomVal.\n */\nexport function bindVal(\n ctx: BindingContext,\n atom: WritableAtom<unknown>,\n options: ValOptions<unknown> = {}\n): void {\n const tag = ctx.el.tagName.toLowerCase();\n if (!VALID_INPUT_TAGS.has(tag)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.INVALID_INPUT_ELEMENT(tag)}`);\n return;\n }\n const { fx, cleanup } = applyInputBinding($(ctx.el), atom, options);\n registry.trackEffect(ctx.el, fx);\n ctx.trackCleanup(cleanup);\n}\n\n/**\n * Two-way binding for checkbox/radio checked state.\n */\nexport function bindChecked(ctx: BindingContext, atom: WritableAtom<boolean>): void {\n const el = ctx.el as HTMLInputElement;\n const $el = $(el);\n\n const handler = () => {\n if (atom.peek() !== el.checked) {\n atom.value = el.checked;\n if (el.type === 'radio' && el.checked && el.name) {\n (el.form ? $(el.form) : $(document))\n .find(`input[type=\"radio\"][name=\"${el.name.replace(/\"/g, '\\\\\"')}\"]`)\n .not(el)\n .trigger('change.atomRadioSync');\n }\n }\n };\n (handler as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n\n $el.on('change change.atomRadioSync', handler);\n ctx.trackCleanup(() => $el.off('change change.atomRadioSync', handler));\n\n registry.trackEffect(\n el,\n effect(() => {\n const val = !!atom.value;\n untracked(() => {\n if (el.checked !== val) {\n el.checked = val;\n debug.domUpdated(LOG_PREFIXES.BINDING, el, 'checked', val);\n }\n });\n })\n );\n}\n\n// ============================================================================\n// Event Binding Handler\n// ============================================================================\n\nexport function bindEvents(ctx: BindingContext, eventMap: NonNullable<BindingOptions['on']>): void {\n const $el = $(ctx.el);\n $el.on(eventMap);\n ctx.trackCleanup(() => $el.off(eventMap));\n}\n\n/**\n * Binds a single event handler using jQuery's event system for compatibility.\n */\nexport function bindOn(\n { el, trackCleanup }: BindingContext,\n event: string,\n handler: (e: JQuery.TriggeredEvent) => void\n): void {\n const $el = $(el);\n $el.on(event, handler);\n trackCleanup(() => $el.off(event, handler));\n}\n\n/**\n * Disposes all reactive bindings on an element and its descendants.\n */\nexport function bindUnbind(el: HTMLElement): void {\n registry.cleanupTree(el);\n}\n","import {\n batch,\n atom as createAtom,\n type EffectObject,\n effect,\n getPathValue,\n setDeepValue,\n untracked,\n type WritableAtom,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type { BindingContext, FormOptions } from '@/types';\nimport { bindVal, createContext } from './unified';\n\n/**\n * Manager class for orchestrating two-way form synchronization.\n * Optimizes performance via Root -> Leaf dispatcher and maintains circular protection.\n */\ninterface FieldEntry {\n atom: WritableAtom<unknown>;\n parts: string[];\n name: string;\n refCount: number;\n effect: EffectObject | null;\n}\n\nconst SELECTOR = 'input, select, textarea';\n\nclass FormBinder<T extends object> {\n private fieldMap = new Map<string, FieldEntry>();\n private fields: FieldEntry[] = [];\n private elementNames = new WeakMap<Element, string>();\n private isSyncingFromLeaf = false;\n\n constructor(\n private form: HTMLFormElement,\n private atom: WritableAtom<T>,\n private options: FormOptions<unknown> = {}\n ) {\n this.init();\n }\n\n private init(): void {\n const rootDispatcher = effect(() => {\n const rootValue = this.atom.value;\n if (this.isSyncingFromLeaf || !this.fields.length) return;\n\n batch(() => {\n untracked(() => {\n for (let i = 0; i < this.fields.length; i++) {\n const f = this.fields[i]!;\n const newVal = getPathValue(rootValue, f.parts);\n if (!Object.is(f.atom.peek(), newVal)) f.atom.value = newVal;\n }\n });\n });\n });\n\n registry.trackEffect(this.form, rootDispatcher);\n this.bindElement(this.form);\n this.setupObserver();\n }\n\n public bindElement(el: Element): void {\n const targets = el.matches?.(SELECTOR)\n ? [el]\n : (el as HTMLElement).querySelectorAll?.(SELECTOR) || [];\n for (let i = 0, len = targets.length; i < len; i++) {\n this.bindControl(targets[i] as Element);\n }\n }\n\n private bindControl(el: Element): void {\n if (\n !(\n el instanceof HTMLInputElement ||\n el instanceof HTMLSelectElement ||\n el instanceof HTMLTextAreaElement\n )\n ) {\n return;\n }\n const control = el;\n const name = control.name;\n if (!name) return;\n\n const oldName = this.elementNames.get(control);\n if (oldName !== undefined && oldName !== name) registry.cleanup(control);\n if (this.elementNames.has(control) && oldName === name) return;\n\n const entry = this.acquireField(name);\n this.elementNames.set(control, name);\n\n const ctx = createContext(control);\n ctx.trackCleanup(() => this.releaseField(control, name));\n\n if (\n control instanceof HTMLInputElement &&\n (control.type === 'radio' || control.type === 'checkbox')\n ) {\n this.bindToggle(ctx, entry.atom, control.value, control.type === 'checkbox');\n } else {\n bindVal(ctx, entry.atom, this.options);\n }\n }\n\n private bindToggle(\n ctx: BindingContext,\n atom: WritableAtom<unknown>,\n val: string,\n isCheck: boolean\n ): void {\n const el = ctx.el as HTMLInputElement;\n const handler = () => {\n const curr = atom.peek();\n if (isCheck && Array.isArray(curr)) {\n const s = new Set(curr.map(String));\n el.checked ? s.add(val) : s.delete(val);\n atom.value = Array.from(s);\n } else {\n atom.value = isCheck ? el.checked : val;\n }\n };\n\n (handler as unknown as { [INTERNAL_HANDLER]: boolean })[INTERNAL_HANDLER] = true;\n $(el).on('change', handler);\n ctx.trackCleanup(() => $(el).off('change', handler));\n\n registry.trackEffect(\n el,\n effect(() => {\n const v = atom.value;\n const checked = isCheck\n ? Array.isArray(v)\n ? v.some((x) => String(x) === val)\n : !!v\n : String(v) === val;\n if (el.checked !== checked) el.checked = checked;\n })\n );\n }\n\n private acquireField(name: string): FieldEntry {\n let entry = this.fieldMap.get(name);\n if (entry) {\n entry.refCount++;\n return entry;\n }\n\n const parts = name\n .replace(/\\[(\\w+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n const fieldAtom = createAtom(getPathValue(this.atom.peek(), parts));\n entry = { atom: fieldAtom, parts, name, refCount: 1, effect: null };\n\n entry.effect = effect(() => {\n let val = fieldAtom.value;\n if (this.options.transform) val = this.options.transform(name, val);\n\n const root = this.atom.peek();\n const next = setDeepValue(root, parts, 0, val);\n\n if (next !== root) {\n this.isSyncingFromLeaf = true;\n try {\n this.atom.value = next as T;\n if (this.options.onChange) untracked(() => this.options.onChange!(name, val));\n } finally {\n this.isSyncingFromLeaf = false;\n }\n }\n });\n\n this.fieldMap.set(name, entry);\n this.fields.push(entry);\n return entry;\n }\n\n private releaseField(el: Element, name: string): void {\n const entry = this.fieldMap.get(name);\n if (entry && --entry.refCount <= 0) {\n const idx = this.fields.indexOf(entry);\n if (idx !== -1) this.fields.splice(idx, 1);\n entry.effect?.dispose();\n this.fieldMap.delete(name);\n }\n registry.cleanup(el);\n }\n\n private setupObserver(): void {\n const observer = new MutationObserver((ms) => {\n for (let i = 0, len = ms.length; i < len; i++) {\n const m = ms[i]!;\n if (m.type === 'childList') {\n for (let j = 0; j < m.addedNodes.length; j++) {\n const node = m.addedNodes[j]!;\n if (node.nodeType === 1) this.bindElement(node as Element);\n }\n } else if (m.attributeName === 'name') {\n this.bindElement(m.target as Element);\n }\n }\n });\n\n observer.observe(this.form, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['name'],\n });\n\n registry.trackCleanup(this.form, () => observer.disconnect());\n }\n}\n\n/**\n * Binds an entire form to a single object-based atom.\n * Features: O(1) performance for large forms, circular loop protection,\n * and custom transform/change hooks.\n */\nexport function bindForm<T extends object>(\n form: HTMLFormElement,\n atom: WritableAtom<T>,\n options: FormOptions<unknown> = {}\n): void {\n new FormBinder(form, atom, options);\n}\n","import $ from 'jquery';\nimport { bindForm } from '@/bindings/form';\nimport {\n bindAttr,\n bindChecked,\n bindClass,\n bindCss,\n bindEvents,\n bindHtml,\n bindOn,\n bindProp,\n bindText,\n bindUnbind,\n bindVal,\n bindVisibility,\n createContext,\n} from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssBindings,\n FormOptions,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\n\nimport { debug } from '@/utils/debug';\n\n/**\n * Internal helper to iterate over a jQuery set and apply a binding function\n * to each Element node. Handles nodeType check and context creation.\n */\nfunction atomEachElement(jq: JQuery, fn: (ctx: BindingContext, el: HTMLElement) => void): JQuery {\n const len = jq.length;\n for (let i = 0; i < len; i++) {\n const node = jq[i];\n if (node?.nodeType === 1) {\n const el = node as HTMLElement;\n fn(createContext(el), el);\n } else if (node) {\n debug.log(LOG_PREFIXES.BINDING, `Skipping non-Element node (nodeType=${node.nodeType})`);\n }\n }\n return jq;\n}\n\n/**\n * Binds element `textContent` to a reactive source.\n */\n$.fn.atomText = function <T>(source: AsyncReactiveValue<T>, formatter?: (v: T) => string): JQuery {\n return atomEachElement(this, (ctx) => bindText(ctx, source, formatter));\n};\n\n/**\n * Binds element `innerHTML` to a reactive string source.\n */\n$.fn.atomHtml = function (source: AsyncReactiveValue<string>): JQuery {\n return atomEachElement(this, (ctx) => bindHtml(ctx, source));\n};\n\n/**\n * Toggles one or more CSS classes based on reactive boolean conditions.\n */\n$.fn.atomClass = function (\n this: JQuery,\n classNameOrMap: string | Record<string, AsyncReactiveValue<boolean>>,\n condition?: AsyncReactiveValue<boolean>\n): JQuery {\n if (typeof classNameOrMap === 'string') {\n if (condition === undefined) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_CONDITION('atomClass')}`\n );\n return this;\n }\n // Hoist map creation outside the element loop\n const map = { [classNameOrMap]: condition };\n return atomEachElement(this, (ctx) => bindClass(ctx, map));\n }\n return atomEachElement(this, (ctx) => bindClass(ctx, classNameOrMap));\n};\n\n/**\n * Binds one or more CSS style properties to reactive values.\n */\n$.fn.atomCss = function (\n this: JQuery,\n propOrMap: string | CssBindings,\n source?: AsyncReactiveValue<string | number>,\n unit?: string\n): JQuery {\n if (typeof propOrMap === 'string') {\n if (source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomCss')}`);\n return this;\n }\n // Hoist map creation outside the element loop\n const map = { [propOrMap]: unit ? [source as ReactiveValue<number>, unit] : source! };\n return atomEachElement(this, (ctx) => bindCss(ctx, map as CssBindings));\n }\n return atomEachElement(this, (ctx) => bindCss(ctx, propOrMap));\n};\n\n/**\n * Binds one or more HTML attributes to reactive values with security guards.\n */\n$.fn.atomAttr = function (\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<PrimitiveValue>>,\n source?: AsyncReactiveValue<PrimitiveValue>\n): JQuery {\n if (typeof nameOrMap === 'string') {\n if (source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomAttr')}`);\n return this;\n }\n // Hoist map creation outside the element loop\n const map = { [nameOrMap]: source };\n return atomEachElement(this, (ctx) => bindAttr(ctx, map));\n }\n return atomEachElement(this, (ctx) => bindAttr(ctx, nameOrMap));\n};\n\n/**\n * Binds one or more DOM properties to reactive values.\n */\n$.fn.atomProp = function <T>(\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<T>>,\n source?: AsyncReactiveValue<T>\n): JQuery {\n if (typeof nameOrMap === 'string') {\n if (source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomProp')}`);\n return this;\n }\n // Hoist map creation outside the element loop\n const map = { [nameOrMap]: source } as Record<string, AsyncReactiveValue<unknown>>;\n return atomEachElement(this, (ctx) => bindProp(ctx, map));\n }\n return atomEachElement(this, (ctx) =>\n bindProp(ctx, nameOrMap as Record<string, AsyncReactiveValue<unknown>>)\n );\n};\n\n/**\n * Shows the element when `condition` is truthy (`display: ''`).\n */\n$.fn.atomShow = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx, condition, false));\n};\n\n/**\n * Hides the element when `condition` is truthy (`display: 'none'`).\n */\n$.fn.atomHide = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx, condition, true));\n};\n\n/**\n * Two-way binding for `<input>`, `<select>`, and `<textarea>` values.\n */\n$.fn.atomVal = function <T>(atom: WritableAtom<T>, options: ValOptions<T> = {}): JQuery {\n return atomEachElement(this, (ctx) =>\n bindVal(ctx, atom as WritableAtom<unknown>, options as unknown as ValOptions<unknown>)\n );\n};\n\n/**\n * Two-way binding for checkbox and radio button `checked` state.\n */\n$.fn.atomChecked = function (atom: WritableAtom<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindChecked(ctx, atom));\n};\n\n/**\n * Two-way binding for an entire form.\n */\n$.fn.atomForm = function <T extends object>(\n atom: WritableAtom<T>,\n options: FormOptions<unknown> = {}\n): JQuery {\n return atomEachElement(this, (_, el) => {\n if (el instanceof HTMLFormElement) bindForm(el, atom, options);\n });\n};\n\n/**\n * Attaches a lifecycle-aware event handler using the jQuery event system.\n */\n$.fn.atomOn = function (event: string, handler: (e: JQuery.Event) => void): JQuery {\n return atomEachElement(this, (ctx) => bindOn(ctx, event, handler));\n};\n\n/**\n * Lookup table for reactive binding handlers.\n * Ordered to match the bitmask bits in atomBind.\n */\nconst BIND_HANDLERS: Array<(ctx: BindingContext, options: BindingOptions<unknown>) => void> = [\n (ctx, o) => bindText(ctx, o.text), // 1 << 0\n (ctx, o) => bindHtml(ctx, o.html!), // 1 << 1\n (ctx, o) => bindClass(ctx, o.class!), // 1 << 2\n (ctx, o) => bindCss(ctx, o.css!), // 1 << 3\n (ctx, o) => bindAttr(ctx, o.attr!), // 1 << 4\n (ctx, o) => bindProp(ctx, o.prop as Record<string, AsyncReactiveValue<unknown>>), // 1 << 5\n (ctx, o) => bindVisibility(ctx, o.show!, false), // 1 << 6\n (ctx, o) => bindVisibility(ctx, o.hide!, true), // 1 << 7\n (ctx, o) => {\n // 1 << 8: val\n const v = o.val!;\n if (Array.isArray(v)) {\n bindVal(ctx, v[0] as WritableAtom<unknown>, v[1] as ValOptions<unknown>);\n } else {\n bindVal(ctx, v as WritableAtom<unknown>);\n }\n },\n (ctx, o) => bindChecked(ctx, o.checked!), // 1 << 9\n (ctx, o) => {\n // 1 << 10: form\n if (ctx.el instanceof HTMLFormElement) {\n const f = o.form!;\n if (Array.isArray(f)) {\n bindForm(ctx.el, f[0] as WritableAtom<object>, f[1] as FormOptions<unknown>);\n } else {\n bindForm(ctx.el, f as WritableAtom<object>);\n }\n }\n },\n (ctx, o) => bindEvents(ctx, o.on!), // 1 << 11\n];\n\n/**\n * Integrated multi-behavior reactive binding.\n * Uses a bitmask dispatch strategy to minimize branch mispredictions in hot-path.\n */\n$.fn.atomBind = function <T>(this: JQuery, options: BindingOptions<T>): JQuery {\n let mask = 0;\n if (options.text !== undefined) mask |= 1 << 0;\n if (options.html !== undefined) mask |= 1 << 1;\n if (options.class !== undefined) mask |= 1 << 2;\n if (options.css !== undefined) mask |= 1 << 3;\n if (options.attr !== undefined) mask |= 1 << 4;\n if (options.prop !== undefined) mask |= 1 << 5;\n if (options.show !== undefined) mask |= 1 << 6;\n if (options.hide !== undefined) mask |= 1 << 7;\n if (options.val !== undefined) mask |= 1 << 8;\n if (options.checked !== undefined) mask |= 1 << 9;\n if (options.form !== undefined) mask |= 1 << 10;\n if (options.on !== undefined) mask |= 1 << 11;\n\n if (mask === 0) return this;\n\n return atomEachElement(this, (ctx) => {\n let m = mask;\n while (m > 0) {\n const bit = m & -m;\n const idx = 31 - Math.clz32(bit);\n BIND_HANDLERS[idx]!(ctx, options as BindingOptions<unknown>);\n m ^= bit;\n }\n });\n};\n\n/**\n * Destroys all reactive bindings on the selected elements **and their descendants**.\n */\n$.fn.atomUnbind = function (this: JQuery): JQuery {\n const len = this.length;\n for (let i = 0; i < len; i++) {\n const node = this[i];\n if (node?.nodeType === 1) {\n bindUnbind(node as HTMLElement);\n }\n }\n return this;\n};\n","import { effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { EffectObject, ListKey, ListKeyFn, ListOptions, ReadonlyAtom } from '@/types';\nimport { getSelector, hasOwn, shallowEqual } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport { ArrayPool, ObjectPool } from '@/utils/pool';\nimport { sanitizeHtml } from '@/utils/sanitize';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst listInstances = new WeakMap<Element, { fx: EffectObject; ctx: ListContext<unknown> }>();\nlet listBatchIdCounter = 0;\n\nconst mapPool = new ObjectPool<Map<ListKey, number>>(\n () => new Map(),\n (m) => m.clear()\n);\nconst setPool = new ObjectPool<Set<ListKey>>(\n () => new Set(),\n (s) => s.clear()\n);\nconst arrayPool = new ArrayPool<unknown>(100, 1024);\n\nfunction insertOrAppend(elOrJq: Element | JQuery, nextNode: Node | null, container: Element): void {\n // Optimization: insertBefore(node, null) is same as appendChild(node)\n if (elOrJq instanceof Element) {\n container.insertBefore(elOrJq, nextNode);\n return;\n }\n const len = elOrJq.length;\n for (let i = 0; i < len; i++) {\n const el = elOrJq[i];\n if (el) {\n container.insertBefore(el, nextNode);\n }\n }\n}\n\nfunction wrap($el: Element | JQuery<Element>): JQuery {\n return ($el instanceof Element ? $($el) : $el) as unknown as JQuery;\n}\n\n// ============================================================================\n// ListContext\n// ============================================================================\n\nclass ListContext<T> {\n oldKeys: ListKey[] = [];\n oldItems: T[] = [];\n oldNodes: (Element | JQuery)[] = [];\n\n readonly removingKeys = new Set<ListKey>();\n $emptyEl: JQuery | null = null;\n readonly keyToIndex = new Map<ListKey, number>();\n fx?: EffectObject;\n\n statesBuffer = new Uint8Array(256);\n indicesBuffer = new Int32Array(256);\n\n constructor(\n public readonly $container: JQuery,\n /** @internal */\n public readonly containerSelector: string,\n public readonly onRemove: (($el: JQuery) => Promise<void> | void) | undefined\n ) {}\n\n scheduleRemoval(k: ListKey, $el: JQuery): void {\n const commit = () => {\n if (this.fx?.isDisposed) return;\n if ($el[0]?.isConnected) $el.remove();\n this.removingKeys.delete(k);\n debug.log(LOG_PREFIXES.LIST, `${this.containerSelector} removed item:`, k);\n };\n\n const res = this.onRemove?.($el);\n if (res instanceof Promise) res.then(commit, commit);\n else commit();\n }\n\n removeItem(k: ListKey, $el: JQuery): void {\n for (let j = 0; j < $el.length; j++) {\n if ($el[j] instanceof Element) ($el[j] as Element).removeAttribute('data-atom-key');\n }\n this.removingKeys.add(k);\n this.scheduleRemoval(k, $el);\n }\n\n dispose(): void {\n this.removingKeys.clear();\n this.oldKeys.length = 0;\n this.oldItems.length = 0;\n this.oldNodes.length = 0;\n this.keyToIndex.clear();\n this.$emptyEl?.remove();\n this.$container.off('.atomList');\n this.statesBuffer = new Uint8Array(0);\n this.indicesBuffer = new Int32Array(0);\n }\n\n ensureBuffers(size: number): void {\n if (this.statesBuffer.length < size) {\n this.statesBuffer = new Uint8Array(Math.max(size, this.statesBuffer.length * 2));\n }\n if (this.indicesBuffer.length < size) {\n this.indicesBuffer = new Int32Array(Math.max(size, this.indicesBuffer.length * 2));\n }\n }\n}\n\n// ============================================================================\n// Internal diff types\n// ============================================================================\n\ninterface PreparedDiff<T> {\n newKeys: ListKey[];\n newKeySet: Set<ListKey>;\n newItems: T[];\n newNodes: (Element | JQuery)[];\n newStates: Uint8Array;\n newIndices: Int32Array;\n trKeys: ListKey[];\n trItems: T[];\n trIdxs: number[];\n startIndex: number;\n oldEndIndex: number;\n newEndIndex: number;\n}\n\ninterface PlaceCallbacks<T> {\n bind: ListOptions<T>['bind'];\n update: ListOptions<T>['update'];\n onAdd: ListOptions<T>['onAdd'];\n onRemove: ListOptions<T>['onRemove'];\n events: ListOptions<T>['events'];\n}\n\n// ============================================================================\n// Step functions\n// ============================================================================\n\nfunction handleEmpty<T>(\n ctx: ListContext<T>,\n itemCount: number,\n $container: JQuery,\n empty: ListOptions<T>['empty']\n): void {\n if (ctx.$emptyEl && itemCount > 0) {\n ctx.$emptyEl.remove();\n ctx.$emptyEl = null;\n }\n if (itemCount !== 0) return;\n\n const { oldKeys, oldNodes, onRemove } = ctx;\n if (!onRemove) {\n for (let i = 0, len = oldKeys.length; i < len; i++) ctx.removingKeys.delete(oldKeys[i]!);\n $container.empty();\n } else {\n for (let i = 0, len = oldKeys.length; i < len; i++) {\n const k = oldKeys[i]!;\n if (oldNodes[i]) ctx.removeItem(k, wrap(oldNodes[i]!));\n }\n }\n\n if (empty && !ctx.$emptyEl) {\n ctx.$emptyEl = (typeof empty === 'string'\n ? $(sanitizeHtml(empty))\n : $(empty as Element | JQuery)) as unknown as JQuery;\n ctx.$emptyEl.appendTo($container);\n }\n\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes);\n ctx.oldKeys = [];\n ctx.oldItems = [];\n ctx.oldNodes = [];\n}\n\nfunction buildIndices<T>(\n ctx: ListContext<T>,\n items: T[],\n itemCount: number,\n getKey: ListKeyFn<T>,\n update: ListOptions<T>['update'],\n isEqual: ListOptions<T>['isEqual']\n): PreparedDiff<T> {\n const { oldKeys, oldItems, oldNodes, removingKeys, keyToIndex } = ctx;\n const oldLen = oldKeys.length;\n\n let startIndex = 0,\n oldEndIndex = oldLen - 1,\n newEndIndex = itemCount - 1;\n\n const eq = isEqual || shallowEqual;\n\n while (startIndex <= oldEndIndex && startIndex <= newEndIndex) {\n const item = items[startIndex]!;\n const k = getKey(item, startIndex);\n if (oldKeys[startIndex] !== k || !eq(oldItems[startIndex]!, item)) {\n break;\n }\n keyToIndex.set(k, startIndex++);\n }\n\n while (oldEndIndex >= startIndex && newEndIndex >= startIndex) {\n const item = items[newEndIndex]!;\n const k = getKey(item, newEndIndex);\n if (oldKeys[oldEndIndex] !== k || !eq(oldItems[oldEndIndex]!, item)) {\n break;\n }\n keyToIndex.set(k, newEndIndex--);\n oldEndIndex--;\n }\n\n const oldIndexMap = mapPool.acquire();\n for (let i = startIndex; i <= oldEndIndex; i++) oldIndexMap.set(oldKeys[i]!, i);\n\n const newKeySet = setPool.acquire();\n ctx.ensureBuffers(itemCount);\n\n const newKeys = arrayPool.acquire() as ListKey[];\n newKeys.length = itemCount;\n const newItems = arrayPool.acquire() as T[];\n newItems.length = itemCount;\n const newNodes = arrayPool.acquire() as (Element | JQuery)[];\n newNodes.length = itemCount;\n const newStates = ctx.statesBuffer,\n newIndices = ctx.indicesBuffer;\n\n const trKeys = arrayPool.acquire() as ListKey[],\n trItems = arrayPool.acquire() as T[],\n trIdxs = arrayPool.acquire() as number[];\n\n for (let i = 0; i < startIndex; i++) {\n newKeys[i] = oldKeys[i]!;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[i]!;\n newStates[i] = 3;\n newIndices[i] = i;\n }\n for (let j = oldLen - 1, i = itemCount - 1; i > newEndIndex; i--, j--) {\n newKeys[i] = oldKeys[j]!;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[j]!;\n newStates[i] = 3;\n newIndices[i] = j;\n }\n\n for (let i = startIndex; i <= newEndIndex; i++) {\n const item = items[i]!,\n k = getKey(item, i);\n newKeys[i] = k;\n newItems[i] = item;\n keyToIndex.set(k, i);\n\n if (newKeySet.has(k)) {\n debug.warn(LOG_PREFIXES.LIST, ERROR_MESSAGES.LIST.DUPLICATE_KEY(k, i, ctx.containerSelector));\n newIndices[i] = -1;\n continue;\n }\n newKeySet.add(k);\n\n const oldIdx = oldIndexMap.get(k);\n if (oldIdx === undefined) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newIndices[i] = -1;\n newStates[i] = 1;\n continue;\n }\n\n const oldItem = oldItems[oldIdx]!;\n newNodes[i] = oldNodes[oldIdx]!;\n\n if (\n !update &&\n oldItem !== item &&\n !(isEqual ? isEqual(oldItem, item) : shallowEqual(oldItem, item))\n ) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newStates[i] = 2;\n } else {\n newStates[i] = 0;\n }\n newIndices[i] = removingKeys.has(k) ? -1 : oldIdx;\n }\n\n mapPool.release(oldIndexMap);\n return {\n newKeys,\n newKeySet,\n newItems,\n newNodes,\n newStates,\n newIndices,\n trKeys,\n trItems,\n trIdxs,\n startIndex,\n oldEndIndex,\n newEndIndex,\n };\n}\n\nfunction renderItems<T>(\n diff: PreparedDiff<T>,\n options: ListOptions<T>,\n isInitial: boolean\n): string[] | null {\n const { trKeys, trItems, trIdxs, newNodes, newStates } = diff;\n const renderCount = trKeys.length;\n const renderResults: (string | Element | DocumentFragment | JQuery)[] = new Array(renderCount);\n const htmlParts: string[] = [];\n let stringCount = 0;\n\n for (let t = 0; t < renderCount; t++) {\n const raw = options.render(trItems[t]!, trIdxs[t]!);\n renderResults[t] = raw;\n if (typeof raw === 'string') {\n htmlParts.push(raw);\n stringCount++;\n }\n }\n\n let sanitized: string[] | null = null;\n if (htmlParts.length > 0) {\n if (htmlParts.length === 1) sanitized = [sanitizeHtml(htmlParts[0]!)];\n else {\n const sep = `<template data-atom-sep=\"${(listBatchIdCounter++).toString(36)}\"></template>`;\n sanitized = sanitizeHtml(htmlParts.join(sep)).split(sep);\n }\n }\n\n if (\n isInitial &&\n sanitized &&\n stringCount === renderCount &&\n !options.bind &&\n !options.onAdd &&\n !options.onRemove &&\n !options.events\n ) {\n return sanitized;\n }\n\n let fragIdx = 0;\n for (let t = 0; t < renderCount; t++) {\n const raw = renderResults[t]!;\n const $el = (typeof raw === 'string'\n ? $(sanitized![fragIdx++]!)\n : $(raw as Element | DocumentFragment | JQuery)) as unknown as JQuery;\n const targetIdx = trIdxs[t]!,\n keyStr = String(trKeys[t]!);\n\n for (let j = 0, elLen = $el.length; j < elLen; j++) {\n const node = $el[j];\n if (node instanceof Element) {\n node.setAttribute('data-atom-key', keyStr);\n }\n }\n\n if (newStates[targetIdx] === 2 && newNodes[targetIdx]) {\n const node = newNodes[targetIdx]!;\n if (node instanceof Element) {\n registry.cleanupTree(node);\n } else {\n for (let j = 0, nLen = node.length; j < nLen; j++) {\n const el = node[j];\n if (el instanceof Element) registry.cleanupTree(el);\n }\n }\n wrap(node).replaceWith($el);\n }\n newNodes[targetIdx] = $el.length === 1 ? ($el[0] as Element) : $el;\n }\n return null;\n}\n\nfunction cleanupRemoved<T>(ctx: ListContext<T>, diff: PreparedDiff<T>): void {\n const { startIndex, oldEndIndex, newKeySet } = diff;\n for (let i = startIndex; i <= oldEndIndex; i++) {\n const k = ctx.oldKeys[i]!;\n if (!newKeySet.has(k) && ctx.oldNodes[i]) ctx.removeItem(k, wrap(ctx.oldNodes[i]!));\n }\n}\n\nfunction placeItems<T>(\n ctx: ListContext<T>,\n diff: PreparedDiff<T>,\n rawContainer: Element,\n callbacks: PlaceCallbacks<T>,\n innerHtmlFragments: string[] | null\n): void {\n const { newKeys, newItems, newNodes, newStates, newIndices } = diff;\n const itemCount = newKeys.length;\n\n if (innerHtmlFragments !== null) {\n rawContainer.innerHTML = innerHtmlFragments.join('');\n let el = rawContainer.firstElementChild;\n for (let i = 0; i < itemCount; i++) {\n if (!el) break;\n el.setAttribute('data-atom-key', String(newKeys[i]));\n newNodes[i] = el;\n newStates[i] = 0;\n ctx.removingKeys.delete(newKeys[i]!);\n debug.domUpdated(LOG_PREFIXES.LIST, $(el) as unknown as JQuery, 'list.add', newItems[i]);\n el = el.nextElementSibling;\n }\n return;\n }\n\n if (ctx.oldKeys.length === 0) {\n const frag = document.createDocumentFragment();\n for (let i = 0; i < itemCount; i++) {\n const node = newNodes[i]!;\n if (node instanceof Element) frag.appendChild(node);\n else for (let j = 0; j < node.length; j++) frag.appendChild(node[j]!);\n }\n rawContainer.appendChild(frag);\n } else {\n let nextNode: Node | null = null,\n min = 2147483647;\n for (let i = itemCount - 1; i >= 0; i--) {\n const idx = newIndices[i]!;\n if (idx !== -1 && idx < min) {\n min = idx;\n } else {\n insertOrAppend(newNodes[i]!, nextNode, rawContainer);\n }\n const node = newNodes[i]!;\n nextNode = node instanceof Element ? node : (node[0] ?? null);\n }\n }\n\n for (let i = 0; i < itemCount; i++) {\n const state = newStates[i]!;\n if (state !== 3) {\n const $el = wrap(newNodes[i]!),\n item = newItems[i]!;\n if (state === 0) callbacks.update?.($el, item, i);\n else callbacks.bind?.($el, item, i);\n if (state === 1) {\n callbacks.onAdd?.($el);\n ctx.removingKeys.delete(newKeys[i]!);\n debug.domUpdated(LOG_PREFIXES.LIST, $el, 'list.add', item);\n }\n }\n }\n}\n\n// ============================================================================\n// atomList\n// ============================================================================\n\n$.fn.atomList = function <T>(source: ReadonlyAtom<T[]>, options: ListOptions<T>): JQuery {\n const getKey: ListKeyFn<T> =\n typeof options.key === 'function'\n ? options.key\n : (item: T) => item[options.key as keyof T] as unknown as ListKey;\n const callbacks: PlaceCallbacks<T> = {\n bind: options.bind,\n update: options.update,\n onAdd: options.onAdd,\n onRemove: options.onRemove,\n events: options.events,\n };\n\n for (let cIdx = 0, cLen = this.length; cIdx < cLen; cIdx++) {\n const raw = this[cIdx]!,\n $c = $(raw);\n $c.off('.atomList');\n const old = listInstances.get(raw);\n if (old) {\n old.fx.dispose();\n old.ctx.dispose();\n }\n\n const ctx = new ListContext<T>($c, getSelector(raw), options.onRemove);\n const fx = effect(() => {\n const items = source.value,\n len = items.length;\n untracked(() => {\n handleEmpty(ctx, len, $c, options.empty);\n if (len === 0) return;\n debug.log(LOG_PREFIXES.LIST, `${ctx.containerSelector} updating with ${len} items`);\n\n const diff = buildIndices(ctx, items, len, getKey, options.update, options.isEqual);\n const frag = renderItems(diff, options, ctx.oldKeys.length === 0);\n cleanupRemoved(ctx, diff);\n placeItems(ctx, diff, raw, callbacks, frag);\n\n if (options.events) {\n for (let i = diff.startIndex; i <= diff.oldEndIndex; i++) {\n if (!diff.newKeySet.has(ctx.oldKeys[i]!)) ctx.keyToIndex.delete(ctx.oldKeys[i]!);\n }\n }\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes);\n ctx.oldKeys = diff.newKeys;\n ctx.oldItems = diff.newItems;\n ctx.oldNodes = diff.newNodes;\n setPool.release(diff.newKeySet);\n arrayPool.release(diff.trKeys);\n arrayPool.release(diff.trItems);\n arrayPool.release(diff.trIdxs);\n });\n });\n\n ctx.fx = fx;\n if (options.events) {\n for (const ek in options.events) {\n if (!hasOwn.call(options.events, ek)) continue;\n const s = ek.indexOf(' '),\n type = s === -1 ? ek : ek.slice(0, s),\n sel = s === -1 ? '> *' : ek.slice(s + 1).trim();\n const handler = options.events[ek]!;\n\n $c.on(`${type}.atomList`, sel, function (this: Element, e: JQuery.TriggeredEvent) {\n const itemEl = (e.target as Element).closest?.('[data-atom-key]') as HTMLElement | null;\n const rk = itemEl?.getAttribute('data-atom-key');\n if (rk === null || rk === undefined) return;\n\n let k: ListKey = rk;\n if (!ctx.keyToIndex.has(rk)) {\n const nk = Number(rk);\n if (!Number.isNaN(nk) && ctx.keyToIndex.has(nk)) k = nk;\n }\n const idx = ctx.keyToIndex.get(k);\n if (idx !== undefined) handler.call(itemEl as HTMLElement, ctx.oldItems[idx]!, idx, e);\n });\n }\n }\n registry.trackEffect(raw, fx);\n listInstances.set(raw, { fx, ctx });\n registry.trackCleanup(raw, () => {\n ctx.dispose();\n listInstances.delete(raw);\n });\n }\n return this;\n};\n","import { untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { bindUnbind } from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { ComponentFn } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst EMPTY_PROPS = Object.freeze({});\n\n// ============================================================================\n// jQuery plugin methods\n// ============================================================================\n\n/**\n * Mounts a functional component on each selected element.\n *\n * @param component - Function receiving `($el, props)` and returning an\n * optional cleanup callback. See {@link ComponentFn}.\n * @param props - Props passed to the component. When omitted, `P` must be\n * compatible with an empty object (i.e. all fields optional or\n * `P = object`). Passing no props to a component with required fields is\n * a type error that TypeScript will catch at the call site, but only when\n * `props` is explicitly typed — the `{} as P` fallback is not type-safe\n * for components with required fields, which is why the cast is explicit\n * rather than implicit.\n */\n$.fn.atomMount = function <P>(this: JQuery, component: ComponentFn<P>, props?: P): JQuery {\n const p = (props ?? EMPTY_PROPS) as P;\n const compName = component.name || 'Component';\n\n for (let i = 0, len = this.length; i < len; i++) {\n const rootEl = this[i];\n if (!rootEl) continue;\n\n registry.cleanupTree(rootEl);\n try {\n // Untracked execution prevents component initialization from leaking into parent effects\n const teardown = untracked(() => component($(rootEl), p));\n if (typeof teardown === 'function') {\n registry.setComponentCleanup(rootEl, teardown);\n }\n } catch (err) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.ERROR(compName), err);\n }\n }\n return this;\n};\n\n/**\n * Unmounts the component and disposes all reactive bindings on each selected\n * element and its descendants.\n */\n$.fn.atomUnmount = function (this: JQuery): JQuery {\n for (let i = 0, len = this.length; i < len; i++) {\n const el = this[i];\n if (el) bindUnbind(el);\n }\n return this;\n};\n","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { computed, atom as createAtom, effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES, ROUTE_DEFAULTS } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { RouteConfig, Router, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// --- Helper: Safe History API Wrappers ---\nfunction safePushState(data: unknown, url: string | URL | null): void {\n try {\n history.pushState(data, '', url);\n } catch (e) {\n debug.warn(\n LOG_PREFIXES.ROUTE,\n 'PushState failed (likely file:// protocol or security restriction). UI will update, but URL will not.',\n e\n );\n }\n}\n\nclass RouterImpl implements Router {\n public currentRoute: ReadonlyAtom<string>;\n public queryParams: ReadonlyAtom<Record<string, string>>;\n\n private config: RouteConfig &\n Required<Pick<RouteConfig, 'mode' | 'basePath' | 'autoBindLinks' | 'activeClass'>>;\n private readonly isHistoryMode: boolean;\n private readonly basePath: string;\n private readonly activeClass: string;\n\n private isDestroyed = false;\n private previousRoute = '';\n private previousUrl: string;\n private cleanups: Array<() => void> = [];\n private $target: JQuery;\n private currentRouteAtom: WritableAtom<string>;\n private queryParamsAtom: WritableAtom<Record<string, string>>;\n private templateCache = new Map<string, HTMLTemplateElement>();\n private routeCleanups: Array<() => void> = [];\n private lastRawQuery = '';\n private cachedParams: Record<string, string> = {};\n\n constructor(config: RouteConfig) {\n this.config = {\n mode: ROUTE_DEFAULTS.mode,\n basePath: ROUTE_DEFAULTS.basePath,\n autoBindLinks: ROUTE_DEFAULTS.autoBindLinks,\n activeClass: ROUTE_DEFAULTS.activeClass,\n ...config,\n } as typeof this.config;\n\n this.isHistoryMode = this.config.mode === 'history';\n this.basePath = this.config.basePath.replace(/\\/$/, '');\n this.activeClass = this.config.activeClass;\n\n this.$target = $(this.config.target);\n this.previousUrl = this.isHistoryMode ? location.pathname + location.search : location.hash;\n this.currentRouteAtom = createAtom(this.getRouteName());\n this.currentRoute = this.currentRouteAtom;\n this.queryParamsAtom = createAtom(this.getQueryParams());\n this.queryParams = computed(() => this.queryParamsAtom.value);\n this.init();\n }\n\n private init() {\n const event = this.isHistoryMode ? 'popstate' : 'hashchange';\n const handler = this.handleUrlChange.bind(this);\n window.addEventListener(event, handler);\n this.cleanups.push(() => window.removeEventListener(event, handler));\n\n const renderEffect = effect(() => {\n const routeName = this.currentRouteAtom.value;\n untracked(() => {\n for (const fn of this.routeCleanups)\n try {\n fn();\n } catch {}\n this.routeCleanups.length = 0;\n });\n this.renderRoute(routeName);\n });\n this.cleanups.push(() => renderEffect.dispose());\n this.setupAutoBindLinks();\n if (this.$target[0]) registry.trackCleanup(this.$target[0], () => this.destroy());\n }\n\n private getRouteName(): string {\n const { default: defaultRoute } = this.config;\n if (this.isHistoryMode) {\n const base = this.basePath;\n let path = location.pathname;\n if (base && path.startsWith(base)) {\n path = path.substring(base.length);\n }\n return path.replace(/^\\//, '') || defaultRoute!;\n }\n return location.hash.split('?')[0]!.substring(1) || defaultRoute!;\n }\n\n private getQueryParams(): Record<string, string> {\n const hash = location.hash;\n const queryIndex = hash.indexOf('?');\n const raw = this.isHistoryMode\n ? location.search.substring(1)\n : queryIndex !== -1\n ? hash.substring(queryIndex + 1)\n : '';\n\n if (raw === this.lastRawQuery) return this.cachedParams;\n this.lastRawQuery = raw;\n\n const res: Record<string, string> = {};\n let newLen = 0;\n if (raw) {\n new URLSearchParams(raw).forEach((v, k) => {\n res[k] = v;\n newLen++;\n });\n }\n\n let oldLen = 0;\n for (const _ in this.cachedParams) oldLen++;\n\n let changed = newLen !== oldLen;\n if (!changed) {\n for (const k in res) {\n if (res[k] !== this.cachedParams[k]) {\n changed = true;\n break;\n }\n }\n }\n\n if (changed) {\n if (raw.indexOf('%') !== -1)\n try {\n decodeURIComponent(raw);\n } catch {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.MALFORMED_URI(raw));\n }\n this.cachedParams = res;\n }\n return this.cachedParams;\n }\n\n private setUrl(name: string): void {\n const url = this.isHistoryMode ? `${this.basePath}/${name}` : `#${name}`;\n if (this.isHistoryMode) {\n safePushState(null, url);\n } else {\n location.hash = url;\n }\n this.previousUrl = this.isHistoryMode ? url : location.hash;\n }\n\n private restoreUrl(): void {\n if (this.isHistoryMode) {\n safePushState(null, this.previousUrl);\n } else {\n location.hash = this.previousUrl;\n }\n }\n\n private renderRoute(name: string): void {\n if (this.isDestroyed || !this.$target[0]) return;\n const { routes, notFound, beforeTransition, afterTransition } = this.config;\n const cfg = routes[name] ?? (notFound ? routes[notFound] : undefined);\n if (!cfg) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.NOT_FOUND(name));\n return;\n }\n\n const params = this.getQueryParams(),\n from = this.previousRoute;\n if (beforeTransition) untracked(() => beforeTransition(from, name));\n\n this.$target.empty();\n let routeParams = params;\n if (cfg.onEnter) {\n const res = untracked(() => cfg.onEnter!(params, this));\n if (res) routeParams = { ...params, ...res };\n }\n\n const onUnmount = (fn: () => void) => this.routeCleanups.push(fn);\n if (cfg.render) cfg.render(this.$target[0], name, routeParams, onUnmount, this);\n else if (cfg.template) {\n let tmpl = this.templateCache.get(cfg.template);\n if (!tmpl) {\n const el = document.querySelector(cfg.template);\n if (el instanceof HTMLTemplateElement) {\n tmpl = el;\n this.templateCache.set(cfg.template, tmpl);\n } else {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.TEMPLATE_NOT_FOUND(cfg.template));\n return;\n }\n }\n this.$target.append(tmpl.content.cloneNode(true) as DocumentFragment);\n if (cfg.onMount) cfg.onMount(this.$target.children(), onUnmount, this);\n }\n\n if (afterTransition) untracked(() => afterTransition(from, name));\n this.previousRoute = name;\n }\n\n private handleUrlChange(): void {\n if (this.isDestroyed) return;\n\n const currentUrl = this.isHistoryMode ? location.pathname + location.search : location.hash;\n if (currentUrl === this.previousUrl) return;\n\n const nextRoute = this.getRouteName();\n const oldRoute = this.currentRouteAtom.peek();\n\n if (oldRoute !== nextRoute) {\n if (untracked(() => this.config.routes[oldRoute]?.onLeave?.(this)) === false) {\n this.restoreUrl();\n return;\n }\n this.currentRouteAtom.value = nextRoute;\n }\n this.queryParamsAtom.value = this.getQueryParams();\n this.previousUrl = currentUrl;\n }\n\n private setupAutoBindLinks(): void {\n if (!this.config.autoBindLinks) return;\n const onClick = (e: JQuery.TriggeredEvent) => {\n e.preventDefault();\n const r = (e.currentTarget as HTMLElement).dataset.route;\n if (r != null) this.navigate(r);\n };\n $(document).on('click', '[data-route]', onClick);\n this.cleanups.push(() => $(document).off('click', '[data-route]', onClick));\n\n let previousActiveNodes: HTMLElement[] = [];\n const activeLinkEffect = effect(() => {\n const routeName = this.currentRouteAtom.value;\n const activeClass = this.activeClass;\n untracked(() => {\n const len = previousActiveNodes.length;\n for (let i = 0; i < len; i++) {\n const el = previousActiveNodes[i]!;\n el.classList.remove(activeClass);\n el.removeAttribute('aria-current');\n }\n\n try {\n const selector = `[data-route=\"${routeName.replace(/\"/g, '\\\\\"')}\"]`;\n const nodes = Array.from(document.querySelectorAll<HTMLElement>(selector));\n const nLen = nodes.length;\n for (let i = 0; i < nLen; i++) {\n const el = nodes[i]!;\n el.classList.add(activeClass);\n el.setAttribute('aria-current', 'page');\n }\n previousActiveNodes = nodes;\n } catch {\n previousActiveNodes = [];\n }\n });\n });\n this.cleanups.push(() => activeLinkEffect.dispose());\n }\n\n public navigate(name: string): void {\n if (this.isDestroyed) return;\n const old = this.currentRouteAtom.peek();\n if (this.config.routes[old]?.onLeave?.(this) === false) return;\n\n const resolved = name || this.config.default;\n if (!resolved) return;\n\n this.setUrl(resolved);\n this.queryParamsAtom.value = {};\n this.currentRouteAtom.value = resolved;\n }\n\n public destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n for (const fn of this.cleanups)\n try {\n fn();\n } catch {}\n this.templateCache.clear();\n }\n}\n\n/**\n * Creates an SPA router with reactive state management.\n */\nexport function route(config: RouteConfig): Router {\n return new RouterImpl(config);\n}\n\n$.extend({\n route,\n});\n","import { computed } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { ComputedAtom, FetchError, FetchOptions } from '@/types';\n\n// ============================================================================\n// atomFetch\n// ============================================================================\n\n/**\n * Context for a reactive fetch operation.\n * Manages the lifecycle of a single $.ajax request, including automatic\n * cancellation (via AbortController) and reactive URL/option resolution.\n */\nclass FetchContext<T> {\n private abortController: AbortController | null = null;\n private readonly staticOptions: JQuery.AjaxSettings;\n private readonly ajaxOptionsFn: (() => JQuery.AjaxSettings) | undefined;\n private readonly getUrl: () => string;\n\n /**\n * Optimization: If true, the URL is a static string and doesn't need to be\n * re-evaluated within a reactive scope.\n */\n private readonly isStaticUrl: boolean;\n private readonly staticUrl: string | undefined;\n\n private readonly transformFn: ((val: unknown) => T) | undefined;\n private readonly onErrorFn: ((err: unknown) => void) | undefined;\n\n constructor(urlOrFn: string | (() => string), options: FetchOptions<T>) {\n const isStatic = typeof urlOrFn === 'string';\n this.isStaticUrl = isStatic;\n if (isStatic) {\n this.staticUrl = urlOrFn as string;\n this.getUrl = () => this.staticUrl!;\n } else {\n this.getUrl = urlOrFn as () => string;\n }\n\n this.ajaxOptionsFn =\n typeof options.ajaxOptions === 'function' ? options.ajaxOptions : undefined;\n\n const baseAjax = typeof options.ajaxOptions === 'object' ? options.ajaxOptions : {};\n this.staticOptions = {\n ...baseAjax,\n method: options.method,\n headers: { ...(baseAjax as JQuery.AjaxSettings)?.headers, ...options.headers },\n };\n this.transformFn = options.transform;\n this.onErrorFn = options.onError;\n }\n\n public abort(): void {\n this.abortController?.abort();\n }\n\n private handleError(err: unknown): never {\n let final: Error;\n if (err && typeof (err as JQuery.jqXHR).readyState !== 'undefined') {\n const x = err as JQuery.jqXHR;\n final = new Error(`Network Error: ${x.statusText || 'Unknown'} (${x.status})`);\n (final as FetchError).jqXHR = x;\n } else {\n final = err instanceof Error ? err : new Error(String(err ?? 'Unknown error'));\n }\n\n if (this.onErrorFn) {\n try {\n this.onErrorFn(final);\n } catch {\n // Suppress errors in error callback\n }\n }\n throw final;\n }\n\n public execute = async (): Promise<T> => {\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n\n const dynamicOptions = this.ajaxOptionsFn?.() ?? {};\n // Use shallow merge for high-performance request setup\n const req: JQuery.AjaxSettings = {\n ...this.staticOptions,\n ...dynamicOptions,\n headers: {\n ...this.staticOptions.headers,\n ...dynamicOptions.headers,\n },\n url: this.isStaticUrl ? this.staticUrl : this.getUrl(),\n success: undefined,\n error: undefined,\n complete: undefined,\n };\n const xhr = $.ajax(req);\n\n signal.onabort = () => xhr.abort();\n if (signal.aborted) xhr.abort();\n\n try {\n const raw = await xhr;\n return this.transformFn ? this.transformFn(raw) : (raw as T);\n } catch (err) {\n if (signal.aborted) {\n const e = new Error('AbortError');\n e.name = 'AbortError';\n throw e;\n }\n return this.handleError(err);\n } finally {\n signal.onabort = null;\n if (this.abortController?.signal === signal) this.abortController = null;\n }\n };\n}\n\n/**\n * Creates a declarative reactive AJAX primitive.\n * Wraps core's async `computed` with jQuery's `$.ajax`.\n *\n * Features:\n * - Auto-Cancellation: Aborts pending requests when dependencies change.\n * - Reactive URL: Re-fetches automatically if `urlOrFn` depends on atoms.\n * - Error Isolation: Network errors are captured in .hasError/.lastError.\n */\n$.extend({\n atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T> {\n const ctx = new FetchContext<T>(urlOrFn, options);\n const atomVal = computed(ctx.execute, {\n defaultValue: options.defaultValue,\n lazy: options.eager === false,\n });\n return Object.assign(atomVal, {\n abort: () => ctx.abort(),\n }) as ComputedAtom<T> & { abort: () => void };\n },\n});\n","/**\n * atom-effect-jquery\n *\n * Brings reactivity to jQuery.\n *\n * Features:\n * - Full CJK IME Support (Input Method Editor).\n * - Auto-cleanup via MutationObserver (No memory leaks).\n * - Debug Mode: Console logging + Visual Highlighting.\n *\n * Type augmentation note:\n * This package extends both `JQuery` and `JQueryStatic` via global interface\n * merging in `types.ts`. Consumers using the `export default $` path will\n * receive the augmented type automatically because the module's side-effect\n * imports apply the augmentation at import time.\n */\n\nimport $ from 'jquery';\nimport '@/core/namespace'; // $.atom, $.computed, etc.\nimport '@/bindings/chainable'; // $.fn.atomText, etc.\nimport '@/bindings/list'; // $.fn.atomList\nimport '@/bindings/mount'; // $.fn.atomMount\nimport '@/features/route'; // $.route\nimport '@/features/fetch'; // $.atomFetch\n\nimport { enablejQueryOverrides } from '@/core/jquery-patch';\nimport { disableAutoCleanup, enableAutoCleanup, registry } from '@/core/registry';\n\n// Global initialization on DOM ready.\n$(() => {\n enablejQueryOverrides();\n enableAutoCleanup(document.body!);\n});\n\nexport { disablejQueryOverrides, enablejQueryOverrides } from '@/core/jquery-patch';\nexport { nextTick } from '@/core/namespace';\nexport type {\n BindingOptions,\n ComponentFn,\n ComputedAtom,\n CssBindings,\n CssValue,\n EffectCleanup,\n EffectResult,\n EqualFn,\n FetchOptions,\n ListOptions,\n PrimitiveValue,\n ReactiveValue,\n ReadonlyAtom,\n RenderRoute,\n RouteConfig,\n RouteDefinition,\n RouteLifecycle,\n Router,\n TemplateRoute,\n ValOptions,\n WritableAtom,\n} from '@/types';\nexport { isReactive } from '@/utils';\nexport { disableAutoCleanup, enableAutoCleanup, registry };\n\nexport default $;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"atom-effect-jquery.min.js","names":["$"],"sources":["../../core/dist/index.mjs","../src/utils/index.ts","../src/constants.ts","../src/utils/debug.ts","../src/core/namespace.ts","../src/utils/pool.ts","../src/core/registry.ts","../src/core/dom.ts","../src/core/jquery-patch.ts","../src/types.ts","../src/bindings/input-binding.ts","../src/core/effect-factory.ts","../src/utils/sanitize.ts","../src/bindings/unified.ts","../src/bindings/form.ts","../src/bindings/chainable.ts","../src/bindings/list/utils.ts","../src/bindings/list/context.ts","../src/bindings/list/diff.ts","../src/bindings/list/dom.ts","../src/bindings/list/index.ts","../src/bindings/mount.ts","../src/features/route.ts","../src/features/fetch.ts","../src/index.ts"],"sourcesContent":["var u = {\n DISPOSED: 1,\n IS_COMPUTED: 2,\n DIRTY: 256,\n RECOMPUTING: 512,\n HAS_ERROR: 1024,\n FORCE_COMPUTE: 2048,\n IDLE: 65536,\n PENDING: 131072,\n RESOLVED: 262144,\n REJECTED: 524288,\n ATOM_SYNC: 16777216,\n ATOM_NOTIFICATION_SCHEDULED: 33554432,\n EFFECT_EXECUTING: 268435456\n}, bt = Object.freeze({\n ASYNC_STATE: u.IDLE | u.PENDING | u.RESOLVED | u.REJECTED,\n COMPUTED_DIRTY_MASK: u.DIRTY | u.RECOMPUTING | u.FORCE_COMPUTE\n}), U = Object.freeze({\n IDLE: \"idle\",\n PENDING: \"pending\",\n RESOLVED: \"resolved\",\n REJECTED: \"rejected\"\n}), S = Object.freeze({\n DISPOSED: u.DISPOSED,\n EXECUTING: u.EFFECT_EXECUTING\n}), Q = Object.freeze({\n DISPOSED: u.DISPOSED,\n IS_COMPUTED: u.IS_COMPUTED,\n DIRTY: u.DIRTY,\n IDLE: u.IDLE,\n PENDING: u.PENDING,\n RESOLVED: u.RESOLVED,\n REJECTED: u.REJECTED,\n RECOMPUTING: u.RECOMPUTING,\n HAS_ERROR: u.HAS_ERROR,\n FORCE_COMPUTE: u.FORCE_COMPUTE\n}), f = Object.freeze({\n DISPOSED: u.DISPOSED,\n SYNC: u.ATOM_SYNC,\n NOTIFICATION_SCHEDULED: u.ATOM_NOTIFICATION_SCHEDULED\n}), C = Object.freeze({\n MAX_EXECUTIONS_PER_SECOND: 1e3,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n MAX_EXECUTIONS_PER_FLUSH: 1e4,\n MAX_FLUSH_ITERATIONS: 1e3,\n MIN_FLUSH_ITERATIONS: 10,\n BATCH_QUEUE_SHRINK_THRESHOLD: 1e3\n}), k = 1073741823, Y = Object.freeze({\n WARN_INFINITE_LOOP: !0,\n EFFECT_FREQUENCY_WINDOW: 1e3,\n LOOP_THRESHOLD: 100\n}), at = Object.freeze({ MAX_PROMISE_ID: k }), w = Object.freeze({\n UNINITIALIZED: -1,\n MIN: 1\n}), ot = !1;\ntry {\n ot = !!(typeof globalThis < \"u\" && globalThis.__ATOM_DEBUG__ || typeof sessionStorage < \"u\" && sessionStorage.getItem(\"__ATOM_DEBUG__\") === \"true\");\n} catch {\n}\nvar _ = (typeof process < \"u\" && process.env, typeof __DEV__ < \"u\" && !!__DEV__ || ot), et = Object.freeze([]), g = class V extends Error {\n constructor(e, s = null, i = !0, n) {\n super(e), this.cause = s, this.recoverable = i, this.code = n, this.name = \"AtomError\", Error.captureStackTrace && Error.captureStackTrace(this, this.constructor);\n }\n getChain() {\n if (this.cause === null || this.cause === void 0) return [this];\n const e = [this], s = /* @__PURE__ */ new Set([this]);\n let i = this.cause;\n for (; i != null; ) {\n const n = s.has(i);\n if (e.push(i), n) break;\n if (s.add(i), i instanceof V) i = i.cause;\n else if (i instanceof Error && \"cause\" in i) i = i.cause;\n else break;\n }\n return e;\n }\n toJSON(e = /* @__PURE__ */ new Set()) {\n if (e.has(this)) return {\n name: this.name,\n message: \"[Circular Reference]\",\n recoverable: this.recoverable,\n code: this.code\n };\n e.add(this);\n let s = this.cause;\n return this.cause instanceof V ? s = this.cause.toJSON(e) : this.cause instanceof Error && (s = {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n cause: this.cause.cause\n }), {\n name: this.name,\n message: this.message,\n code: this.code,\n recoverable: this.recoverable,\n stack: this.stack,\n cause: s\n };\n }\n static format(e, s, i) {\n return `${e} (${s}): ${i}`;\n }\n}, A = class extends g {\n constructor(...t) {\n super(...t), this.name = \"ComputedError\";\n }\n}, m = class extends g {\n constructor(t, e = null, s = !1, i) {\n super(t, e, s, i), this.name = \"EffectError\";\n }\n}, L = class extends g {\n constructor(t, e = null, s = !1, i) {\n super(t, e, s, i), this.name = \"SchedulerError\";\n }\n}, h = {\n COMPUTED_MUST_BE_FUNCTION: \"Computed target must be a function\",\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: \"Async computation pending with no default value\",\n COMPUTED_COMPUTATION_FAILED: \"Computation execution failed\",\n COMPUTED_ASYNC_COMPUTATION_FAILED: \"Async computation execution failed\",\n COMPUTED_CIRCULAR_DEPENDENCY: \"Circular dependency detected\",\n COMPUTED_DISPOSED: \"Attempted to access disposed computed\",\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: \"Subscriber must be a function or Subscriber object\",\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: \"Subscriber execution failed\",\n EFFECT_MUST_BE_FUNCTION: \"Effect target must be a function\",\n EFFECT_EXECUTION_FAILED: \"Effect execution failed\",\n EFFECT_CLEANUP_FAILED: \"Effect cleanup failed\",\n EFFECT_DISPOSED: \"Attempted to run disposed effect\",\n SCHEDULER_FLUSH_OVERFLOW: (t, e) => `Maximum flush iterations (${t}) exceeded. ${e} jobs dropped. Possible infinite loop.`,\n CALLBACK_ERROR_IN_ERROR_HANDLER: \"Exception encountered in onError handler\",\n EFFECT_FREQUENCY_LIMIT_EXCEEDED: \"Effect executed too frequently within 1 second. Suspected infinite loop.\",\n SCHEDULER_CALLBACK_MUST_BE_FUNCTION: \"Scheduler callback must be a function\",\n SCHEDULER_END_BATCH_WITHOUT_START: \"endBatch() called without matching startBatch(). Ignoring.\",\n BATCH_CALLBACK_MUST_BE_FUNCTION: \"Batch callback must be a function\"\n};\nfunction O(t, e, s) {\n if (t instanceof g) return new e(g.format(t.name, s, t.message), t, t.recoverable, t.code);\n if (t instanceof Error) {\n const i = t.name || t.constructor.name || \"Error\";\n return new e(g.format(i, s, t.message), t);\n }\n return new e(g.format(\"Unexpected error\", s, String(t)), t);\n}\nvar st = /* @__PURE__ */ Symbol(\"AtomEffect.DebugName\"), ft = /* @__PURE__ */ Symbol(\"AtomEffect.Id\"), it = /* @__PURE__ */ Symbol(\"AtomEffect.Type\"), B = /* @__PURE__ */ Symbol(\"AtomEffect.NoDefaultValue\"), Et = \"[Atom Effect]\", dt = class {\n constructor() {\n this.enabled = !0, this.warnInfiniteLoop = Y.WARN_INFINITE_LOOP, this._updateCounts = /* @__PURE__ */ new Map(), this._nodeRegistry = /* @__PURE__ */ new Map(), this._threshold = Y.LOOP_THRESHOLD, this._cleanupScheduled = !1, this.warn = (t, e) => {\n this.enabled && t && console.warn(`${Et} ${e}`);\n }, this.registerNode = (t) => {\n this._nodeRegistry.set(t.id, new WeakRef(t));\n }, this.attachDebugInfo = (t, e, s, i) => {\n this.enabled && (Object.defineProperties(t, {\n [st]: {\n value: i ?? `${e}_${s}`,\n configurable: !0\n },\n [ft]: {\n value: s,\n configurable: !0\n },\n [it]: {\n value: e,\n configurable: !0\n }\n }), this.registerNode(t));\n }, this.trackUpdate = (t, e) => {\n if (!this.enabled || !this.warnInfiniteLoop) return;\n const s = this._updateCounts, i = (s.get(t) ?? 0) + 1;\n i > this._threshold ? this.warn(!0, `Infinite loop detected for ${e ?? `dependency ${t}`}. Over ${this._threshold} updates in a single execution scope.`) : s.set(t, i), this._cleanupScheduled || (this._cleanupScheduled = !0, Promise.resolve().then(() => {\n this._updateCounts.clear(), this._cleanupScheduled = !1;\n }));\n }, this.dumpGraph = () => {\n const t = [];\n for (const [e, s] of this._nodeRegistry) {\n const i = s.deref();\n i ? t.push({\n id: e,\n name: this.getDebugName(i),\n type: this.getDebugType(i),\n updateCount: this._updateCounts.get(e) ?? 0\n }) : (this._nodeRegistry.delete(e), this._updateCounts.delete(e));\n }\n return t;\n }, this.getDebugName = (t) => {\n if (t)\n return t[st];\n }, this.getDebugType = (t) => {\n if (t)\n return t[it];\n };\n }\n}, pt = {\n enabled: !1,\n warnInfiniteLoop: !1,\n warn: () => {\n },\n registerNode: () => {\n },\n attachDebugInfo: () => {\n },\n trackUpdate: () => {\n },\n dumpGraph: () => [],\n getDebugName: () => {\n },\n getDebugType: () => {\n }\n}, d = _ ? new dt() : pt, It = 1, Ct = () => It++ | 0, ut = class {\n constructor() {\n this._s0 = null, this._s1 = null, this._s2 = null, this._s3 = null, this._count = 0, this._actualCount = 0, this._overflow = null, this._freeIndices = null;\n }\n _rawWrite(t, e) {\n if (t < 4) t === 0 ? this._s0 = e : t === 1 ? this._s1 = e : t === 2 ? this._s2 = e : this._s3 = e;\n else {\n this._overflow === null && (this._overflow = []);\n const s = this._overflow, i = t - 4;\n s[i] = e;\n }\n }\n _rawAdd(t) {\n if (this._s0 === null)\n return this._s0 = t, 0;\n if (this._s1 === null)\n return this._s1 = t, 1;\n if (this._s2 === null)\n return this._s2 = t, 2;\n if (this._s3 === null)\n return this._s3 = t, 3;\n this._overflow === null && (this._overflow = []);\n const e = this._overflow, s = this._freeIndices;\n if (s !== null && s.length > 0) {\n const i = s.pop();\n return e[i] = t, i + 4;\n }\n return e.push(t), 4 + e.length - 1;\n }\n _rawSwap(t, e) {\n if (t === e) return;\n const s = this.getAt(t), i = this.getAt(e);\n this._rawWrite(t, i), this._rawWrite(e, s);\n }\n get size() {\n return this._actualCount;\n }\n get physicalSize() {\n return this._count;\n }\n getAt(t) {\n return t < 4 ? t === 0 ? this._s0 : t === 1 ? this._s1 : t === 2 ? this._s2 : this._s3 : this._overflow?.[t - 4] ?? null;\n }\n setAt(t, e) {\n const s = this.getAt(t);\n s !== e && (this._rawWrite(t, e), s === null ? this._actualCount++ : e === null && this._actualCount--, e !== null && t >= this._count ? this._count = t + 1 : e === null && this._shrinkPhysicalSizeFrom(t));\n }\n _shrinkPhysicalSizeFrom(t) {\n if (t === this._count - 1)\n for (this._count--; this._count > 0 && this.getAt(this._count - 1) == null; ) this._count--;\n }\n truncateFrom(t) {\n t <= 3 && (t <= 0 && this._s0 !== null && (this._onItemRemoved(this._s0), this._s0 = null, this._actualCount--), t <= 1 && this._s1 !== null && (this._onItemRemoved(this._s1), this._s1 = null, this._actualCount--), t <= 2 && this._s2 !== null && (this._onItemRemoved(this._s2), this._s2 = null, this._actualCount--), t <= 3 && this._s3 !== null && (this._onItemRemoved(this._s3), this._s3 = null, this._actualCount--));\n const e = this._overflow;\n if (e !== null) {\n const s = t > 4 ? t - 4 : 0, i = e.length;\n for (let n = s; n < i; n++) {\n const r = e[n];\n r != null && (this._onItemRemoved(r), e[n] = null, this._actualCount--);\n }\n t <= 4 ? this._overflow = null : e.length = t - 4;\n }\n this._count = t, this._actualCount < 0 && (this._actualCount = 0), this._freeIndices = null;\n }\n _onItemRemoved(t) {\n }\n add(t) {\n const e = this._rawAdd(t);\n return e >= this._count && (this._count = e + 1), this._actualCount++, e;\n }\n remove(t) {\n let e = -1;\n if (this._s0 === t) e = 0;\n else if (this._s1 === t) e = 1;\n else if (this._s2 === t) e = 2;\n else if (this._s3 === t) e = 3;\n else {\n const s = this._overflow;\n s !== null && (e = s.indexOf(t), e !== -1 && (e += 4));\n }\n return e !== -1 ? (this._rawWrite(e, null), this._shrinkPhysicalSizeFrom(e), this._actualCount--, e >= 4 && (this._freeIndices === null && (this._freeIndices = []), this._freeIndices.push(e - 4)), !0) : !1;\n }\n has(t) {\n if (this._actualCount === 0) return !1;\n if (this._s0 === t || this._s1 === t || this._s2 === t || this._s3 === t) return !0;\n const e = this._overflow;\n return e !== null ? e.indexOf(t) !== -1 : !1;\n }\n forEach(t) {\n const e = this._actualCount;\n if (e === 0) return;\n if (e === this._count) {\n this._s0 != null && t(this._s0), this._s1 != null && t(this._s1), this._s2 != null && t(this._s2), this._s3 != null && t(this._s3);\n const n = this._overflow;\n if (n !== null) for (let r = 0, o = n.length; r < o; r++) {\n const c = n[r];\n c != null && t(c);\n }\n return;\n }\n let s = 0;\n const i = this._count;\n for (let n = 0; n < i; n++) {\n const r = this.getAt(n);\n if (r != null && (t(r), ++s >= e))\n break;\n }\n }\n compact() {\n if (this._actualCount === this._count) return;\n let t = 0;\n const e = this._count;\n for (let s = 0; s < e; s++) {\n const i = this.getAt(s);\n i != null && (s !== t && (this._rawWrite(t, i), this._rawWrite(s, null)), t++);\n }\n this._count = this._actualCount, this._overflow !== null && (t <= 4 ? this._overflow = null : this._overflow.length = t - 4), this._freeIndices = null;\n }\n clear() {\n this._s0 = this._s1 = this._s2 = this._s3 = null, this._count = 0, this._actualCount = 0, this._overflow = null, this._freeIndices = null;\n }\n dispose() {\n this.clear();\n }\n}, ht = class extends ut {\n constructor(...t) {\n super(...t), this._map = null, this._SCAN_THRESHOLD = 32, this.hasComputeds = !1;\n }\n prepareTracking() {\n this.hasComputeds = !1;\n }\n _onItemRemoved(t) {\n t.unsub?.();\n }\n setAt(t, e) {\n const s = this.getAt(t);\n super.setAt(t, e), this._map !== null && (s?.unsub && this._map.delete(s.node), e?.unsub && this._map.set(e.node, t));\n }\n claimExisting(t, e) {\n const s = this._count;\n if (s <= e) return !1;\n const i = this.getAt(e);\n if (i && i.node === t && i.unsub)\n return i.version = t.version, !0;\n if (this._map !== null || s - e > this._SCAN_THRESHOLD) return this._claimViaMap(t, e);\n for (let n = e + 1; n < s; n++) {\n const r = this.getAt(n);\n if (r && r.node === t && r.unsub)\n return r.version = t.version, this._rawSwap(n, e), !0;\n }\n return !1;\n }\n _claimViaMap(t, e) {\n this._map === null && (this._map = this._initMap());\n const s = this._map, i = s.get(t);\n if (i === void 0 || i < e) return !1;\n const n = this.getAt(i);\n if (n == null || !n.unsub) return !1;\n if (n.version = t.version, i !== e) {\n const r = this.getAt(e);\n this._rawSwap(i, e), s.set(t, e), r?.unsub && s.set(r.node, i);\n }\n return !0;\n }\n _initMap() {\n const t = /* @__PURE__ */ new Map();\n for (let e = 0; e < this._count; e++) {\n const s = this.getAt(e);\n s?.unsub && t.set(s.node, e);\n }\n return t;\n }\n insertNew(t, e) {\n const s = this.getAt(t);\n if (s !== null) {\n const i = this._rawAdd(s);\n i >= this._count && (this._count = i + 1), this._map !== null && s.unsub && this._map.set(s.node, i);\n }\n this._rawWrite(t, e), t >= this._count && (this._count = t + 1), this._actualCount++, this._map !== null && e.unsub && this._map.set(e.node, t);\n }\n add(t) {\n const e = super.add(t);\n return this._map !== null && t.unsub && this._map.set(t.node, e), e;\n }\n remove(t) {\n throw new Error(\"remove() prohibited\");\n }\n compact() {\n }\n truncateFrom(t) {\n super.truncateFrom(t), this._map !== null && (this._map = null);\n }\n disposeAll() {\n this.truncateFrom(0), this.hasComputeds = !1;\n }\n}, F = /* @__PURE__ */ Symbol.for(\"atom-effect/brand\"), p = {\n Atom: 1,\n Writable: 2,\n Computed: 4,\n Effect: 8\n};\nfunction q(t, e) {\n if (!t) return !1;\n const s = typeof t;\n return (s === \"object\" || s === \"function\") && !!((t[F] ?? 0) & e);\n}\nfunction At(t) {\n return q(t, p.Atom);\n}\nfunction yt(t) {\n return q(t, p.Computed);\n}\nfunction Rt(t) {\n return q(t, p.Effect);\n}\nfunction $(t) {\n if (t instanceof Promise) return !0;\n if (!t) return !1;\n const e = typeof t;\n return (e === \"object\" || e === \"function\") && typeof t.then == \"function\";\n}\nvar j = class {\n constructor(t, e, s = void 0) {\n this.node = t, this.version = e, this.unsub = s;\n }\n}, gt = class {\n constructor(t = void 0, e = void 0) {\n this.fn = t, this.sub = e;\n }\n notify(t, e) {\n M(() => {\n const s = this.fn;\n s !== void 0 && s(t, e);\n const i = this.sub;\n i !== void 0 && i.execute();\n });\n }\n}, Dt = class {\n constructor() {\n this.current = null;\n }\n run(t, e) {\n if (this.current === t) return e();\n const s = this.current;\n this.current = t;\n try {\n const i = e();\n return _ && d.warn($(i), 'Detected Promise returned within tracking context. Dependencies accessed after \"await\" will NOT be tracked. Consider using synchronous tracking before the async boundary.'), i;\n } finally {\n this.current = s;\n }\n }\n}, l = new Dt();\nfunction M(t) {\n const e = l, s = e.current;\n if (s === null) return t();\n e.current = null;\n try {\n return t();\n } finally {\n e.current = s;\n }\n}\nvar K = class {\n constructor() {\n this.flags = 0, this.version = 0, this._lastSeenEpoch = w.UNINITIALIZED, this._nextEpoch = void 0, this._notifying = 0, this._hotIndex = -1, this._slots = null, this._deps = null, this.id = Ct() & k;\n }\n get isDisposed() {\n return (this.flags & Q.DISPOSED) !== 0;\n }\n get isComputed() {\n return (this.flags & Q.IS_COMPUTED) !== 0;\n }\n get hasError() {\n return !1;\n }\n subscribe(t) {\n const e = typeof t == \"function\";\n if (!e && (!t || typeof t.execute != \"function\")) throw O(/* @__PURE__ */ new TypeError(\"Invalid subscriber\"), g, h.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);\n let s = this._slots;\n s || (s = new ut(), this._slots = s);\n let i = !1;\n if (s._s0 != null && (e ? s._s0.fn === t : s._s0.sub === t)) i = !0;\n else if (s._s1 != null && (e ? s._s1.fn === t : s._s1.sub === t)) i = !0;\n else if (s._s2 != null && (e ? s._s2.fn === t : s._s2.sub === t)) i = !0;\n else if (s._s3 != null && (e ? s._s3.fn === t : s._s3.sub === t)) i = !0;\n else {\n const r = s._overflow;\n if (r != null) for (let o = 0, c = r.length; o < c; o++) {\n const a = r[o];\n if (a != null && (e ? a.fn === t : a.sub === t)) {\n i = !0;\n break;\n }\n }\n }\n if (i)\n return _ && console.warn(`[atom-effect] Duplicate subscription ignored on node ${this.id}`), () => {\n };\n const n = new gt(e ? t : void 0, e ? void 0 : t);\n return s.add(n), () => this._unsubscribe(n);\n }\n _unsubscribe(t) {\n const e = this._slots;\n e && (e.remove(t), this._notifying === 0 && e.compact());\n }\n subscriberCount() {\n const t = this._slots;\n return t === null ? 0 : t.size;\n }\n _notifySubscribers(t, e) {\n const s = this._slots;\n if (!(s === null || s.size === 0)) {\n this._notifying++;\n try {\n let i = s._s0;\n if (i != null) try {\n i.notify(t, e);\n } catch (r) {\n this._logNotifyError(r);\n }\n if (i = s._s1, i != null) try {\n i.notify(t, e);\n } catch (r) {\n this._logNotifyError(r);\n }\n if (i = s._s2, i != null) try {\n i.notify(t, e);\n } catch (r) {\n this._logNotifyError(r);\n }\n if (i = s._s3, i != null) try {\n i.notify(t, e);\n } catch (r) {\n this._logNotifyError(r);\n }\n const n = s._overflow;\n if (n != null) for (let r = 0, o = n.length; r < o; r++) {\n const c = n[r];\n if (c != null) try {\n c.notify(t, e);\n } catch (a) {\n this._logNotifyError(a);\n }\n }\n } finally {\n --this._notifying === 0 && s.compact();\n }\n }\n }\n _logNotifyError(t) {\n console.error(O(t, g, h.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n _isDirty() {\n const t = this._deps;\n if (t === null || t.size === 0) return !1;\n const e = this._hotIndex;\n if (e !== -1) {\n const s = t.getAt(e);\n if (s != null && s.node.version !== s.version) return !0;\n }\n return this._deepDirtyCheck();\n }\n}, H = 0;\nfunction J() {\n const t = H + 1 & k;\n return H = t === 0 ? 1 : t, H;\n}\nfunction W(t) {\n const e = t + 1 & k;\n return e === 0 ? 1 : e;\n}\nvar Z = 0, z = !1, ct = 0;\nfunction St() {\n return ct;\n}\nfunction nt() {\n return z ? (_ && console.warn(\"startFlush() called during flush - ignored\"), !1) : (z = !0, ct = J(), Z = 0, !0);\n}\nfunction rt() {\n z = !1;\n}\nfunction Tt() {\n if (!z) return 0;\n const t = ++Z;\n if (t <= C.MAX_EXECUTIONS_PER_FLUSH) return t;\n throw new Error(`[atom-effect] Infinite loop detected: flush execution count exceeded ${C.MAX_EXECUTIONS_PER_FLUSH}`);\n}\nvar mt = class {\n constructor() {\n this._queueBuffer = [[], []], this._bufferIndex = 0, this._size = 0, this._epoch = 0, this._isProcessing = !1, this._isFlushingSync = !1, this._batchDepth = 0, this._batchQueue = [], this._batchQueueSize = 0, this._maxFlushIterations = C.MAX_FLUSH_ITERATIONS, this.onOverflow = null, this._boundRunLoop = this._runLoop.bind(this);\n }\n get queueSize() {\n return this._size + this._batchQueueSize;\n }\n get isBatching() {\n return this._batchDepth > 0;\n }\n schedule(t) {\n if (_ && typeof t != \"function\" && (!t || typeof t.execute != \"function\"))\n throw new L(h.SCHEDULER_CALLBACK_MUST_BE_FUNCTION);\n const e = this._epoch;\n if (t._nextEpoch === e) return;\n if (t._nextEpoch = e, this._batchDepth > 0 || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = t;\n return;\n }\n const s = this._queueBuffer[this._bufferIndex];\n s[this._size++] = t, this._isProcessing || this._flush();\n }\n _flush() {\n this._isProcessing || this._size === 0 || (this._isProcessing = !0, queueMicrotask(this._boundRunLoop));\n }\n _runLoop() {\n try {\n if (this._size === 0 && this._batchQueueSize === 0) return;\n const t = nt();\n this._drainQueue(), t && rt();\n } finally {\n this._isProcessing = !1;\n }\n }\n _flushSync() {\n if (this._size === 0 && this._batchQueueSize === 0) return;\n const t = this._isFlushingSync;\n this._isFlushingSync = !0;\n const e = nt();\n try {\n this._mergeBatchQueue(), this._drainQueue();\n } finally {\n this._isFlushingSync = t, e && rt();\n }\n }\n _mergeBatchQueue() {\n const t = this._batchQueueSize;\n if (t === 0) return;\n this._epoch = this._epoch + 1 | 0;\n const e = this._epoch, s = this._batchQueue, i = this._queueBuffer[this._bufferIndex];\n let n = this._size;\n for (let r = 0; r < t; r++) {\n const o = s[r];\n o._nextEpoch !== e && (o._nextEpoch = e, i[n++] = o), s[r] = void 0;\n }\n this._size = n, this._batchQueueSize = 0, s.length > C.BATCH_QUEUE_SHRINK_THRESHOLD && (s.length = 0);\n }\n _drainQueue() {\n let t = 0;\n for (; this._size > 0 || this._batchQueueSize > 0; ) {\n if (++t > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n this._batchQueueSize > 0 && this._mergeBatchQueue(), this._size > 0 && this._processQueue();\n }\n }\n _processQueue() {\n const t = this._bufferIndex, e = this._queueBuffer[t], s = this._size;\n this._bufferIndex = t ^ 1, this._size = 0, this._epoch = this._epoch + 1 | 0;\n for (let i = 0; i < s; i++) {\n const n = e[i];\n e[i] = void 0;\n try {\n typeof n == \"function\" ? n() : n.execute();\n } catch (r) {\n console.error(new L(\"Error occurred during scheduler execution\", r));\n }\n }\n }\n _handleFlushOverflow() {\n const t = this._size + this._batchQueueSize;\n console.error(new L(h.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations, t))), this._size = 0, this._queueBuffer[0].length = 0, this._queueBuffer[1].length = 0, this._batchQueueSize = 0, this._batchQueue.length = 0;\n const e = this.onOverflow;\n if (e) try {\n e(t);\n } catch {\n }\n }\n startBatch() {\n this._batchDepth++;\n }\n endBatch() {\n if (this._batchDepth === 0) {\n _ && console.warn(h.SCHEDULER_END_BATCH_WITHOUT_START);\n return;\n }\n --this._batchDepth === 0 && (this._isFlushingSync || this._flushSync());\n }\n setMaxFlushIterations(t) {\n if (t < C.MIN_FLUSH_ITERATIONS) throw new L(`Max iterations must be at least ${C.MIN_FLUSH_ITERATIONS}`);\n this._maxFlushIterations = t;\n }\n}, N = new mt();\nfunction wt(t) {\n if (_ && typeof t != \"function\") throw new TypeError(h.BATCH_CALLBACK_MUST_BE_FUNCTION);\n N.startBatch();\n try {\n return t();\n } finally {\n N.endBatch();\n }\n}\nvar vt = class extends K {\n constructor(t, e) {\n super(), this[F] = p.Atom | p.Writable, this._value = t, this._equal = e.equal ?? Object.is, e.sync && (this.flags |= f.SYNC), d.attachDebugInfo(this, \"atom\", this.id, e.name);\n }\n get isNotificationScheduled() {\n return (this.flags & f.NOTIFICATION_SCHEDULED) !== 0;\n }\n get isSync() {\n return (this.flags & f.SYNC) !== 0;\n }\n get value() {\n const t = l.current;\n return t?.addDependency(this), this._value;\n }\n set value(t) {\n const e = this._value;\n if (this._equal(e, t) || (this._value = t, this.version = W(this.version), d.trackUpdate(this.id, d.getDebugName(this)), (this.flags & f.NOTIFICATION_SCHEDULED) !== 0)) return;\n const s = this._slots;\n s == null || s.size === 0 || (this._pendingOldValue = e, this.flags |= f.NOTIFICATION_SCHEDULED, (this.flags & f.SYNC) !== 0 && !N.isBatching ? this._notifying === 0 && this._flushNotifications() : N.schedule(this));\n }\n execute() {\n this._flushNotifications();\n }\n _flushNotifications() {\n const t = f.NOTIFICATION_SCHEDULED, e = f.DISPOSED, s = f.SYNC;\n for (; (this.flags & (t | e)) === t; ) {\n const i = this._pendingOldValue;\n if (this._pendingOldValue = void 0, this.flags &= ~t, this._equal(this._value, i) || this._notifySubscribers(this._value, i), (this.flags & s) === 0 || N.isBatching) break;\n }\n }\n peek() {\n return this._value;\n }\n dispose() {\n const t = this.flags;\n (t & f.DISPOSED) === 0 && (this._slots?.clear(), this.flags = t | f.DISPOSED, this._value = void 0, this._pendingOldValue = void 0, this._equal = Object.is);\n }\n _deepDirtyCheck() {\n return !1;\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n};\nfunction Ft(t, e = {}) {\n return new vt(t, e);\n}\nvar { IDLE: D, DIRTY: E, PENDING: v, RESOLVED: I, REJECTED: T, HAS_ERROR: P, RECOMPUTING: y, DISPOSED: G, IS_COMPUTED: R, FORCE_COMPUTE: X } = Q, Ot = class extends K {\n constructor(t, e = {}) {\n if (typeof t != \"function\") throw new A(h.COMPUTED_MUST_BE_FUNCTION);\n if (super(), this[F] = p.Atom | p.Computed, this._error = null, this._promiseId = 0, this._deps = new ht(), this._trackEpoch = w.UNINITIALIZED, this._trackCount = 0, this._value = void 0, this.flags = R | E | D, this._equal = e.equal ?? Object.is, this._fn = t, this._defaultValue = \"defaultValue\" in e ? e.defaultValue : B, this._onError = e.onError ?? null, d.attachDebugInfo(this, \"computed\", this.id, e.name), e.lazy === !1) try {\n this._recompute();\n } catch {\n }\n }\n get isDirty() {\n return (this.flags & E) !== 0;\n }\n get isRejected() {\n return (this.flags & T) !== 0;\n }\n get isRecomputing() {\n return (this.flags & y) !== 0;\n }\n get _hasErrorInternal() {\n return (this.flags & P) !== 0;\n }\n _track() {\n l.current?.addDependency(this);\n }\n get value() {\n const t = l.current;\n t?.addDependency(this);\n let e = this.flags;\n if ((e & (I | E | D)) === I) return this._value;\n if ((e & G) !== 0) throw new A(h.COMPUTED_DISPOSED);\n if ((e & y) !== 0) {\n const n = this._defaultValue;\n if (n !== B) return n;\n throw new A(h.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n if ((e & (E | D)) !== 0) {\n const n = this._deps;\n if ((e & D) === 0 && (e & X) === 0 && n.size > 0 && !this._isDirty() ? e = this.flags &= ~E : (this._recompute(), e = this.flags), (e & I) !== 0) return this._value;\n }\n const s = this._defaultValue, i = s !== B;\n if ((e & v) !== 0) {\n if (i) return s;\n throw new A(h.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n if ((e & T) !== 0) {\n if (i) return s;\n throw this._error;\n }\n return this._value;\n }\n peek() {\n return this._value;\n }\n get state() {\n const t = l.current;\n t?.addDependency(this);\n const e = this.flags;\n return (e & I) !== 0 ? U.RESOLVED : (e & v) !== 0 ? U.PENDING : (e & T) !== 0 ? U.REJECTED : U.IDLE;\n }\n get hasError() {\n const t = l.current;\n if (t?.addDependency(this), (this.flags & (T | P)) !== 0) return !0;\n const e = this._deps;\n return e.hasComputeds ? M(() => {\n const s = e.size;\n for (let i = 0; i < s; i++) if (e.getAt(i)?.node.hasError) return !0;\n return !1;\n }) : !1;\n }\n get isValid() {\n return !this.hasError;\n }\n get errors() {\n const t = l.current;\n t?.addDependency(this);\n const e = this._error, s = this._deps;\n if (!s.hasComputeds)\n return e == null ? et : Object.freeze([e]);\n const i = [];\n return e != null && i.push(e), M(() => {\n const n = s.size;\n for (let r = 0; r < n; r++) {\n const o = s.getAt(r)?.node;\n o != null && (o.flags & R) !== 0 && this._accumulateErrors(o, i);\n }\n }), i.length === 0 ? et : Object.freeze(i);\n }\n _accumulateErrors(t, e) {\n const s = t._error;\n s != null && !e.includes(s) && e.push(s);\n const i = t._deps;\n if (!i.hasComputeds) return;\n const n = i.size;\n for (let r = 0; r < n; r++) {\n const o = i.getAt(r)?.node;\n o != null && (o.flags & R) !== 0 && this._accumulateErrors(o, e);\n }\n }\n get lastError() {\n const t = l.current;\n return t?.addDependency(this), this._error;\n }\n get isPending() {\n const t = l.current;\n return t?.addDependency(this), (this.flags & v) !== 0;\n }\n get isResolved() {\n const t = l.current;\n return t?.addDependency(this), (this.flags & I) !== 0;\n }\n invalidate() {\n this.flags |= X, this._markDirty();\n }\n dispose() {\n (this.flags & G) === 0 && (this._deps.disposeAll(), this._slots != null && this._slots.clear(), this.flags = G | E | D, this._error = null, this._value = void 0, this._hotIndex = -1);\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n const e = this._trackEpoch;\n if (t._lastSeenEpoch === e) return;\n t._lastSeenEpoch = e;\n const s = this._trackCount++, i = this._deps, n = i.getAt(s);\n if (n != null && n.node === t) n.version = t.version;\n else if (!i.claimExisting(t, s)) {\n const r = new j(t, t.version, t.subscribe(this));\n i.insertNew(s, r);\n }\n (t.flags & R) !== 0 && (i.hasComputeds = !0);\n }\n _recompute() {\n if (this.isRecomputing) return;\n this.flags = (this.flags | y) & ~X, this._trackEpoch = J(), this._trackCount = 0, this._deps.prepareTracking(), this._hotIndex = -1;\n let t = !1;\n try {\n const e = l.run(this, this._fn);\n this._deps.truncateFrom(this._trackCount), t = !0, $(e) ? this._handleAsyncComputation(e) : this._finalizeResolution(e);\n } catch (e) {\n if (!t) try {\n this._deps.truncateFrom(this._trackCount);\n } catch (s) {\n _ && console.warn(\"[atom-effect] _commitDeps failed during error recovery:\", s);\n }\n this._handleError(e, h.COMPUTED_COMPUTATION_FAILED, !0);\n } finally {\n this._trackEpoch = w.UNINITIALIZED, this._trackCount = 0, this.flags &= ~y;\n }\n }\n _handleAsyncComputation(t) {\n this.flags = (this.flags | v) & ~(D | E | I | T), this._notifySubscribers(void 0, void 0), this._promiseId = (this._promiseId + 1) % at.MAX_PROMISE_ID;\n const e = this._promiseId;\n t.then((s) => {\n if (e === this._promiseId) {\n if (this._isDirty()) return this._markDirty();\n this._finalizeResolution(s), this._notifySubscribers(s, void 0);\n }\n }, (s) => e === this._promiseId && this._handleError(s, h.COMPUTED_ASYNC_COMPUTATION_FAILED));\n }\n _handleError(t, e, s = !1) {\n const i = O(t, A, e);\n if ((!this.isRejected || this._error !== i) && (this.version = W(this.version)), this._error = i, this.flags = this.flags & ~(D | E | v | I) | T | P, this._onError) try {\n this._onError(i);\n } catch (n) {\n console.error(h.CALLBACK_ERROR_IN_ERROR_HANDLER, n);\n }\n if (this._notifySubscribers(void 0, void 0), s) throw i;\n }\n _finalizeResolution(t) {\n const e = this.flags;\n ((e & I) === 0 || !this._equal(this._value, t)) && (this.version = W(this.version)), this._value = t, this._error = null, this.flags = (e | I) & ~(D | E | v | T | P);\n }\n execute() {\n this._markDirty();\n }\n _markDirty() {\n const t = this.flags;\n (t & (y | E)) === 0 && (this.flags = t | E, d.trackUpdate(this.id, d.getDebugName(this)), this._notifySubscribers(void 0, void 0));\n }\n _deepDirtyCheck() {\n const t = this._deps;\n return M(() => {\n const e = t.size;\n for (let s = 0; s < e; s++) {\n const i = t.getAt(s);\n if (i == null) continue;\n const n = i.node;\n if ((n.flags & R) !== 0) try {\n n.value;\n } catch {\n _ && console.warn(`[atom-effect] Dependency #${n.id} threw during dirty check`);\n }\n if (n.version !== i.version)\n return this._hotIndex = s, !0;\n }\n return this._hotIndex = -1, !1;\n });\n }\n};\nfunction Ut(t, e = {}) {\n return new Ot(t, e);\n}\nvar Nt = class extends K {\n constructor(t, e = {}) {\n super(), this[F] = p.Effect, this._cleanup = null, this._deps = new ht(), this._currentEpoch = w.UNINITIALIZED, this._lastFlushEpoch = w.UNINITIALIZED, this._fn = t, this._onError = e.onError ?? null, this._sync = e.sync ?? !1, this._maxExecutions = e.maxExecutionsPerSecond ?? C.MAX_EXECUTIONS_PER_SECOND, this._maxExecutionsPerFlush = e.maxExecutionsPerFlush ?? C.MAX_EXECUTIONS_PER_EFFECT, this._executionsInEpoch = 0, this._executionCount = 0, this._windowStart = 0, this._windowCount = 0, this._execId = 0, this._trackCount = 0, this._sync ? this._notifyCallback = () => this.execute() : this._notifyCallback = () => N.schedule(this), d.attachDebugInfo(this, \"effect\", this.id, e.name);\n }\n run() {\n if (this.isDisposed) throw new m(h.EFFECT_DISPOSED);\n this.execute(!0);\n }\n dispose() {\n this.isDisposed || (this.flags |= S.DISPOSED, this._execCleanup(), this._deps?.disposeAll());\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n if ((this.flags & S.EXECUTING) === 0) return;\n const e = this._currentEpoch;\n if (t._lastSeenEpoch === e) return;\n t._lastSeenEpoch = e;\n const s = this._trackCount++, i = this._deps;\n let n;\n switch (s) {\n case 0:\n n = i._s0;\n break;\n case 1:\n n = i._s1;\n break;\n case 2:\n n = i._s2;\n break;\n case 3:\n n = i._s3;\n break;\n default:\n n = i.getAt(s);\n }\n n != null && n.node === t ? n.version = t.version : i.claimExisting(t, s) || this._insertNewDependency(t, s), t.isComputed && (i.hasComputeds = !0);\n }\n _insertNewDependency(t, e) {\n let s;\n try {\n const i = t.subscribe(this._notifyCallback);\n s = new j(t, t.version, i);\n } catch (i) {\n const n = O(i, m, h.EFFECT_EXECUTION_FAILED);\n if (console.error(n), this._onError) try {\n this._onError(n);\n } catch {\n }\n s = new j(t, t.version, void 0);\n }\n this._deps.insertNew(e, s);\n }\n execute(t = !1) {\n const e = this.flags;\n if ((e & (S.DISPOSED | S.EXECUTING)) !== 0) return;\n const s = this._deps;\n if (!t && s.size > 0 && !this._isDirty()) return;\n this._checkInfiniteLoops(), d.trackUpdate(this.id, d.getDebugName(this)), this.flags = e | S.EXECUTING, this._execCleanup(), this._currentEpoch = J(), this._trackCount = 0, s.prepareTracking(), this._hotIndex = -1;\n let i = !1;\n try {\n const n = l.run(this, this._fn);\n s.truncateFrom(this._trackCount), i = !0, $(n) ? this._handleAsyncResult(n) : this._cleanup = typeof n == \"function\" ? n : null;\n } catch (n) {\n if (!i) try {\n s.truncateFrom(this._trackCount);\n } catch (r) {\n _ && console.warn(\"[atom-effect] _commitDeps failed during error recovery:\", r);\n }\n this._handleExecutionError(n), this._cleanup = null;\n } finally {\n this.flags &= ~S.EXECUTING;\n }\n }\n _handleAsyncResult(t) {\n const e = ++this._execId;\n t.then((s) => {\n if (e !== this._execId || this.isDisposed) {\n if (typeof s == \"function\") try {\n s();\n } catch (i) {\n this._handleExecutionError(i, h.EFFECT_CLEANUP_FAILED);\n }\n return;\n }\n typeof s == \"function\" && (this._cleanup = s);\n }, (s) => e === this._execId && this._handleExecutionError(s));\n }\n _deepDirtyCheck() {\n const t = l.current;\n l.current = null;\n const e = this._deps;\n try {\n const s = e.size;\n for (let i = 0; i < s; i++) {\n const n = e.getAt(i);\n if (n == null) continue;\n const r = n.node;\n if (r.isComputed && this._tryPullComputed(r), r.version !== n.version)\n return this._hotIndex = i, !0;\n }\n return !1;\n } finally {\n l.current = t;\n }\n }\n _tryPullComputed(t) {\n try {\n t.value;\n } catch {\n _ && console.warn(`[atom-effect] Dependency #${t.id} threw during dirty check`);\n }\n }\n _execCleanup() {\n const t = this._cleanup;\n if (t != null) {\n this._cleanup = null;\n try {\n t();\n } catch (e) {\n this._handleExecutionError(e, h.EFFECT_CLEANUP_FAILED);\n }\n }\n }\n _checkInfiniteLoops() {\n const t = St();\n this._lastFlushEpoch !== t && (this._lastFlushEpoch = t, this._executionsInEpoch = 0), ++this._executionsInEpoch > this._maxExecutionsPerFlush && this._throwInfiniteLoopError(\"per-effect\"), Tt() > C.MAX_EXECUTIONS_PER_FLUSH && this._throwInfiniteLoopError(\"global\"), this._executionCount++, _ && this._checkFrequencyLimit();\n }\n _checkFrequencyLimit() {\n if (!Number.isFinite(this._maxExecutions)) return;\n const t = Date.now();\n if (t - this._windowStart >= Y.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = t, this._windowCount = 1;\n return;\n }\n if (++this._windowCount > this._maxExecutions) {\n const e = new m(h.EFFECT_FREQUENCY_LIMIT_EXCEEDED);\n throw this.dispose(), this._handleExecutionError(e), e;\n }\n }\n get executionCount() {\n return this._executionCount;\n }\n get isExecuting() {\n return (this.flags & S.EXECUTING) !== 0;\n }\n _throwInfiniteLoopError(t) {\n const e = new m(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${Z}`);\n throw this.dispose(), console.error(e), e;\n }\n _handleExecutionError(t, e = h.EFFECT_EXECUTION_FAILED) {\n const s = O(t, m, e);\n if (console.error(s), this._onError) try {\n this._onError(s);\n } catch (i) {\n console.error(O(i, m, h.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n};\nfunction Lt(t, e = {}) {\n if (typeof t != \"function\") throw new m(h.EFFECT_MUST_BE_FUNCTION);\n const s = new Nt(t, e);\n return s.execute(), s;\n}\nfunction lt(t, e, s, i) {\n if (s === e.length) return i;\n const n = e[s], r = t != null && typeof t == \"object\" ? t : {}, o = r[n], c = lt(o, e, s + 1, i);\n if (Object.is(o, c)) return t;\n if (Array.isArray(r)) {\n const a = r.slice(), b = Number.parseInt(n, 10);\n return Number.isNaN(b) ? a[n] = c : a[b] = c, a;\n }\n return {\n ...r,\n [n]: c\n };\n}\nfunction x(t, e) {\n let s = t;\n const i = e.length;\n for (let n = 0; n < i; n++) {\n if (s == null) return;\n s = s[e[n]];\n }\n return s;\n}\nfunction _t(t, e) {\n const s = e.includes(\".\") ? e.split(\".\") : [e], i = /* @__PURE__ */ new Set(), n = () => {\n i.forEach((r) => r()), i.clear();\n };\n return {\n get value() {\n return x(t.value, s);\n },\n set value(r) {\n const o = t.peek(), c = lt(o, s, 0, r);\n c !== o && (t.value = c);\n },\n peek: () => x(t.peek(), s),\n subscribe(r) {\n const o = t.subscribe((c, a) => {\n const b = x(c, s), tt = x(a, s);\n Object.is(b, tt) || r(b, tt);\n });\n return i.add(o), () => {\n o(), i.delete(o);\n };\n },\n subscriberCount: () => i.size,\n dispose: n,\n [Symbol.dispose]: n,\n [F]: p.Atom | p.Writable\n };\n}\nvar Pt = (t, e) => _t(t, e), xt = (t) => (e) => _t(t, e);\nexport {\n U as AsyncState,\n g as AtomError,\n A as ComputedError,\n Y as DEBUG_CONFIG,\n m as EffectError,\n C as SCHEDULER_CONFIG,\n L as SchedulerError,\n Ft as atom,\n _t as atomLens,\n wt as batch,\n Pt as composeLens,\n Ut as computed,\n Lt as effect,\n x as getPathValue,\n N as globalScheduler,\n At as isAtom,\n yt as isComputed,\n Rt as isEffect,\n xt as lensFor,\n d as runtimeDebug,\n lt as setDeepValue,\n M as untracked\n};\n\n//# sourceMappingURL=index.mjs.map","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { isAtom } from '@but212/atom-effect';\nimport type { RenderRoute, RouteDefinition, TemplateRoute } from '@/types';\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\nconst isObject = (v: unknown): v is object => v !== null && typeof v === 'object';\n\n// ============================================================================\n// Reactive helpers\n// ============================================================================\n\n/** Checks if a given value is a reactive node (Atom or Computed). */\nexport const isReactive = (v: unknown): v is ReadonlyAtom<unknown> => isAtom(v);\n\n/**\n * Checks if value is a Promise or Thenable.\n */\nexport const isPromise = <T>(v: unknown): v is Promise<T> =>\n (isObject(v) || typeof v === 'function') &&\n typeof (v as Record<string, unknown>).then === 'function';\n\n/** Generates a human-readable selector string for debug. */\nexport function getSelector(el: Element): string {\n const { localName: tag, id, className } = el;\n let res = tag;\n if (id) res += `#${id}`;\n\n // Handle SVG className which returns SVGAnimatedString instead of string\n const classStr =\n typeof className === 'string'\n ? className\n : (className as unknown as { baseVal: string }).baseVal;\n\n if (typeof classStr === 'string') {\n const trimmed = classStr.trim();\n if (trimmed) {\n res += `.${trimmed.replace(/\\s+/g, '.')}`;\n }\n }\n\n // Include type attribute for inputs/buttons for extra context\n const type = (el as HTMLInputElement | HTMLButtonElement).type;\n if (type && typeof type === 'string' && type !== 'text') {\n res += `.${type}`;\n }\n\n return res;\n}\n\nexport const hasOwn = Object.prototype.hasOwnProperty;\n\nexport const isTemplateRoute = (r: RouteDefinition): r is TemplateRoute =>\n isObject(r) && 'template' in r && typeof r.template === 'string';\n\nexport const isRenderRoute = (r: RouteDefinition): r is RenderRoute =>\n isObject(r) && 'render' in r && typeof r.render === 'function';\n\n/**\n * Shallow equality check for objects.\n * Handles NaN correctly using Object.is.\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (!isObject(a) || !isObject(b)) return false;\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!hasOwn.call(objB, key) || !Object.is(objA[key], objB[key])) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Constants for atom-effect-jquery\n */\n\n// ============================================================================\n// Log Prefixes\n// ============================================================================\n\n/**\n * Log prefixes keyed by subsystem.\n * Each prefix names the specific subsystem that emitted the message so that\n * console output is unambiguous regardless of which binding triggered it.\n */\nexport const LOG_PREFIXES = {\n ROUTE: '[atom-route]',\n BINDING: '[atom-binding]',\n LIST: '[atom-list]',\n MOUNT: '[atom-mount]',\n} as const;\n\nexport const ROUTE_DEFAULTS = Object.freeze({\n mode: 'hash',\n basePath: '',\n autoBindLinks: false,\n activeClass: 'active',\n} as const);\n\nexport const INPUT_DEFAULTS = Object.freeze({ EVENT: 'input', DEBOUNCE: 0 } as const);\nexport const DEBUG_DEFAULTS = Object.freeze({ HIGHLIGHT_DURATION_MS: 500 } as const);\n\nexport const VALID_INPUT_TAGS: ReadonlySet<string> = new Set(['input', 'select', 'textarea']);\n\nexport const URL_PROPS: ReadonlySet<string> = new Set([\n 'src',\n 'href',\n 'action',\n 'formaction',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n 'xlink:href',\n]);\n\nexport const DANGEROUS_PROPS: ReadonlySet<string> = new Set([\n 'innerHTML',\n 'outerHTML',\n 'srcdoc',\n '__proto__',\n 'constructor',\n 'prototype',\n]);\n\n/** Regex-like pattern for dangerous protocols (javascript, vbscript) with optional whitespace. */\nexport const DANGEROUS_PROTOCOL_PATTERN =\n '(?:j\\\\s*a\\\\s*v\\\\s*a\\\\s*s\\\\s*c\\\\s*r\\\\s*i\\\\s*p\\\\s*t|v\\\\s*b\\\\s*s\\\\s*c\\\\s*r\\\\s*i\\\\s*p\\\\s*t)';\n\n/**\n * Centralized error messages for the entire library.\n * Structured by subsystem to facilitate easy debugging and consistent error reporting.\n *\n * Each entry is a function that takes dynamic data (e.g. element name) to produce\n * a human-readable and actionable error message.\n */\nexport const ERROR_MESSAGES = {\n /** Errors related to the SPA Router. */\n ROUTE: {\n NOT_FOUND: (n: string) => `Route \"${n}\" not found and no notFound route configured`,\n TEMPLATE_NOT_FOUND: (s: string) => `Template \"${s}\" not found`,\n TARGET_NOT_FOUND: (s: string) => `Target element \"${s}\" not found`,\n MALFORMED_URI: (r: string) => `Malformed URI component: ${r}`,\n },\n /** Security-related errors, specifically from the CSS/HTML sanitizer. */\n SECURITY: {\n UNSAFE_CONTENT: () => 'Unsafe content neutralized during sanitization.',\n BLOCKED_CSS_VALUE: (p: string) => `Blocked dangerous value in CSS style property \"${p}\".`,\n BLOCKED_EVENT_HANDLER: (n: string) =>\n `Blocked setting dangerous event handler attribute/property \"${n}\".`,\n BLOCKED_PROTOCOL: (n: string) => `Blocked dangerous protocol in \"${n}\".`,\n BLOCKED_PROP: (n: string) =>\n `Blocked setting dangerous property \"${n}\". Use html binding for sanitized HTML.`,\n },\n /** General errors from reactive bindings (text, map, input, etc). */\n BINDING: {\n INVALID_INPUT_ELEMENT: (t: string) => `Val binding used on non-input element <${t}>.`,\n MISSING_SOURCE: (m: string) => `[${m}] source is required when prop/name is a string.`,\n MISSING_CONDITION: (m: string) => `[${m}] condition is required when className is a string.`,\n UPDATER_ERROR: (d: string, s?: boolean) =>\n `Updater threw in binding \"${d}\"${s ? ' (static)' : ''}`,\n CLEANUP_ERROR: (i?: string) => `Binding cleanup error${i ? `: ${i}` : ''}`,\n PARSE_ERROR: (d?: string) => `parse() threw during DOM→Atom sync${d ? `: ${d}` : ''}`,\n },\n /** Errors specific to atomList rendering and reconciliation. */\n LIST: {\n DUPLICATE_KEY: (k: string | number, i: number, c: string) =>\n `Duplicate key \"${k}\" at index ${i} in atomList <${c}>.`,\n },\n /** Lifecycle errors from atomMount/atomUnmount. */\n MOUNT: {\n ERROR: (n?: string) => `Mount error${n ? ` in component <${n}>` : ''}`,\n CLEANUP_ERROR: (n?: string) => `Cleanup error${n ? ` in component <${n}>` : ''}`,\n },\n /** Internal architectural errors from the core engine or registry. */\n CORE: {\n EFFECT_DISPOSE_ERROR: (i?: string) => `Effect dispose error${i ? `: ${i}` : ''}`,\n },\n} as const;\n","import { DEBUG_DEFAULTS } from '@/constants';\nimport { getSelector } from '@/utils';\n\n// ============================================================================\n// Constants & Configuration\n// ============================================================================\n\nconst HIGHLIGHT_CLASS = 'atom-debug-highlight';\nconst ATTR_MARKER = 'data-atom-debug';\nconst IS_BROWSER = typeof window !== 'undefined';\n\n/** Shared timer maps to track active animations and timeouts on elements. */\nconst timers = new WeakMap<Element, ReturnType<typeof setTimeout>>();\nconst rafs = new WeakMap<Element, number>();\n\nlet styleInjected = false;\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/** Calculates the CSS transition duration based on configuration. */\nconst getTransitionDuration = () => `${DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS / 1000}s`;\n\n/** Returns the necessary CSS for visual debugging. */\nconst getHighlightStyles = () =>\n `\n [${ATTR_MARKER}] {\n transition: outline ${getTransitionDuration()} ease-out;\n }\n .${HIGHLIGHT_CLASS} {\n outline: 2px solid rgba(255, 68, 68, 0.8);\n outline-offset: 1px;\n }\n`.replace(/\\s+/g, ' ');\n\n/** Injects necessary CSS for highlighting to the document head. */\nfunction injectStyle(): void {\n if (styleInjected || !IS_BROWSER) return;\n\n // Double check existence in case of multiple debug modules or manual removal\n if (document.querySelector(`style[${ATTR_MARKER}]`)) {\n styleInjected = true;\n return;\n }\n\n const style = document.createElement('style');\n style.setAttribute(ATTR_MARKER, '');\n style.textContent = getHighlightStyles();\n document.head.appendChild(style);\n styleInjected = true;\n}\n\n/** Determines the initial debug state of the application. */\nfunction resolveInitialState(): boolean {\n const g = globalThis as {\n __ATOM_DEBUG__?: boolean;\n __DEV__?: boolean;\n process?: { env?: { NODE_ENV?: string } };\n };\n\n // 1. Explicit global override or sessionStorage (supports runtime toggling in builds)\n if (typeof g.__ATOM_DEBUG__ !== 'undefined') return !!g.__ATOM_DEBUG__;\n try {\n if (\n typeof sessionStorage !== 'undefined' &&\n sessionStorage.getItem('__ATOM_DEBUG__') === 'true'\n )\n return true;\n } catch {}\n\n // 2. Node.js / Bundler environment check\n if (g.process?.env?.NODE_ENV !== 'production' && g.process?.env?.NODE_ENV !== undefined) {\n return true;\n }\n\n // 3. __DEV__ flag (often injected by bundlers)\n if (typeof g.__DEV__ !== 'undefined') return !!g.__DEV__;\n\n // 4. Vite/Meta specific\n try {\n if (import.meta.env?.DEV) return true;\n if (import.meta.env?.VITE_ATOM_DEBUG === 'true') return true;\n } catch {}\n\n return false;\n}\n\n// ============================================================================\n// DebugController\n// ============================================================================\n\nexport interface DebugConfig {\n enabled: boolean;\n log(prefix: string, ...args: unknown[]): void;\n atomChanged(prefix: string, name: string | undefined, prev: unknown, next: unknown): void;\n domUpdated(prefix: string, target: Element | JQuery<Element>, type: string, value: unknown): void;\n cleanup(prefix: string, subject: string): void;\n warn(prefix: string, message: string, ...rest: unknown[]): void;\n error(prefix: string, message: string, cause: unknown): void;\n}\n\nclass DevDebugController implements DebugConfig {\n public enabled = true;\n\n public log(prefix: string, ...args: unknown[]): void {\n if (!this.enabled) return;\n console.log(prefix, ...args);\n }\n\n public atomChanged(prefix: string, name: string | undefined, prev: unknown, next: unknown): void {\n if (!this.enabled) return;\n console.log(`${prefix} Atom \"${name ?? 'anonymous'}\" changed:`, prev, '→', next);\n }\n\n public cleanup(prefix: string, subject: string): void {\n if (!this.enabled) return;\n console.log(`${prefix} Cleanup: ${subject}`);\n }\n\n public warn(prefix: string, message: string, ...rest: unknown[]): void {\n console.warn(`${prefix} ${message}`, ...rest);\n }\n\n public error(prefix: string, message: string, cause: unknown): void {\n console.error(`${prefix} ${message}`, cause);\n }\n\n public domUpdated(\n prefix: string,\n target: Element | JQuery<Element>,\n type: string,\n value: unknown\n ): void {\n if (!this.enabled) return;\n // Resolve element from target (supports HTMLElement, SVGElement, or JQuery wrapper)\n const el = 'jquery' in target ? target[0] : target;\n\n // Only proceed if it is a connected Element node\n if (el && el.nodeType === 1 && el.isConnected) {\n console.log(`${prefix} DOM updated: ${getSelector(el as Element)}.${type} =`, value);\n this._triggerVisualHighlight(el as Element);\n }\n }\n\n /** Applies a visual outline highlight to an element with a fade-out transition. */\n private _triggerVisualHighlight(el: Element): void {\n const g = globalThis;\n const raf = g.requestAnimationFrame;\n const caf = g.cancelAnimationFrame;\n\n if (!IS_BROWSER || typeof raf !== 'function') return;\n injectStyle();\n\n // Cancel existing scheduled highlights on this element\n const existingRaf = rafs.get(el);\n const existingTimer = timers.get(el);\n if (existingRaf !== undefined && typeof caf === 'function') caf(existingRaf);\n if (existingTimer !== undefined) {\n clearTimeout(existingTimer);\n timers.delete(el);\n }\n\n // Apply the marker attribute if not present to enable the CSS transition\n if (!el.hasAttribute(ATTR_MARKER)) {\n el.setAttribute(ATTR_MARKER, '');\n }\n\n // Use requestAnimationFrame to ensure the class change happens in the next paint cycle\n rafs.set(\n el,\n raf(() => {\n rafs.delete(el);\n if (!el.isConnected) return;\n\n el.classList.add(HIGHLIGHT_CLASS);\n\n // Schedule removal\n timers.set(\n el,\n setTimeout(() => {\n // Remove the highlight class. The outline will fade out smoothly\n // because the [data-atom-debug] transition remains active.\n el.classList.remove(HIGHLIGHT_CLASS);\n timers.delete(el);\n }, DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS)\n );\n })\n );\n }\n}\n\n/**\n * Inert implementation for production.\n */\nconst ProdDebugController: DebugConfig = {\n enabled: false,\n log: () => {},\n atomChanged: () => {},\n domUpdated: () => {},\n cleanup: () => {},\n warn: (prefix: string, message: string, ...rest: unknown[]) =>\n console.warn(`${prefix} ${message}`, ...rest),\n error: (prefix: string, message: string, cause: unknown) =>\n console.error(`${prefix} ${message}`, cause),\n};\n\n/**\n * Global debug controller singleton.\n * Swaps between Dev and Prod implementations for zero overhead in production.\n */\nexport const debug: DebugConfig = resolveInitialState()\n ? new DevDebugController()\n : ProdDebugController;\n","import {\n atomLens,\n batch,\n composeLens,\n computed,\n atom as createAtom,\n effect,\n isAtom,\n isComputed,\n lensFor,\n untracked,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { AtomOptions, WritableAtom } from '@/types';\n// isReactive is defined in utils.ts because core's isAtom already covers computed\n// atoms (ComputedAtom carries ATOM_BRAND), making a separate isComputed check redundant.\nimport { isReactive } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// atom factory + debug namespace\n// ============================================================================\n\n/**\n * Local wrapper around core's `atom` factory.\n *\n * This wrapper exists to attach the `$.atom.debug` accessor directly to the\n * function object at runtime. TypeScript requires a double cast for this\n * augmentation, but `NamespaceExtensions` ensures all other fields are type-safe.\n *\n * `options` is not defaulted here — core's `atom` defaults `options` to `{}`\n * internally, so passing `undefined` is safe and avoids an extra allocation\n * per call.\n */\nfunction atom<T>(v: T, opts?: AtomOptions): WritableAtom<T> {\n return createAtom(v, opts);\n}\n\nObject.defineProperty(atom, 'debug', {\n enumerable: true,\n configurable: true,\n get: () => debug.enabled,\n set: (v: boolean) => {\n debug.enabled = v;\n },\n});\n\n/** Resolves after microtask effects flush. Fast Promise-based scheduling. */\nexport const nextTick = (): Promise<void> => Promise.resolve();\n\n// Register static extensions to jQuery\n$.extend({\n atom: atom as unknown as JQueryStatic['atom'],\n computed,\n effect,\n batch,\n untracked,\n isAtom,\n isComputed,\n isReactive,\n nextTick,\n atomLens,\n composeLens,\n lensFor,\n});\n","import type { EffectObject } from '@/types';\n\n// ============================================================================\n// ArrayPool\n// ============================================================================\n\n/**\n * Array pool for reusing temporarily allocated arrays to avoid GC pressure.\n *\n * @template T - Element type.\n */\nexport class ArrayPool<T> {\n private readonly pool: T[][] = [];\n\n constructor(\n private readonly limit = 50,\n private readonly capacity = 256\n ) {}\n\n /** Acquires array from pool or returns a new one. */\n acquire(): T[] {\n return this.pool.pop() ?? [];\n }\n\n /** Releases array back to pool if within capacity and limit. */\n release(arr: T[]): void {\n if (Object.isFrozen(arr)) return;\n\n const length = arr.length;\n // Always clear the array to help GC by breaking references,\n // even if it won't be stored in the pool.\n arr.length = 0;\n\n if (this.pool.length < this.limit && length <= this.capacity) {\n // Basic double-release protection. indexOf is O(N) but pool size is small.\n if (this.pool.indexOf(arr) === -1) {\n this.pool.push(arr);\n }\n }\n }\n\n /** Clears the pool. */\n reset(): void {\n this.pool.length = 0;\n }\n}\n\n// ============================================================================\n// ObjectPool\n// ============================================================================\n\n/**\n * Generic object pool for reusing fixed-shape plain objects.\n *\n * Design constraints:\n * - Pooled objects MUST have a fixed property shape (monomorphic).\n * Mixing shapes in a single pool will de-optimize V8's hidden classes.\n * - The `reset` callback MUST restore the object to a clean, reusable state.\n * Failing to do so leaks stale references and causes subtle bugs.\n * - The pool is LIFO (stack) for better CPU cache locality.\n *\n * @template T - Object type to pool. Must be a plain object with a fixed shape.\n */\nexport class ObjectPool<T extends object> {\n private readonly pool: T[] = [];\n\n constructor(\n private readonly factory: () => T,\n private readonly reset: (obj: T) => void,\n private readonly limit = 64\n ) {}\n\n /** Acquires object from pool or creates a new one. */\n acquire(): T {\n return this.pool.pop() ?? this.factory();\n }\n\n /** Releases object back to pool after reset. */\n release(obj: T): void {\n if (Object.isFrozen(obj)) return;\n\n // Always reset the object to help GC by breaking references,\n // even if it won't be stored in the pool.\n this.reset(obj);\n\n if (this.pool.length < this.limit) {\n // Basic double-release protection. indexOf is O(N) but pool size is small.\n if (this.pool.indexOf(obj) === -1) {\n this.pool.push(obj);\n }\n }\n }\n\n /** Drains all retained objects. */\n drain(): void {\n if (this.pool.length > 0) {\n this.pool.length = 0;\n }\n }\n\n get size(): number {\n return this.pool.length;\n }\n}\n\n// ============================================================================\n// Specialized Pools\n// ============================================================================\n\n/** Limit synchronized with bindingRecordPool to ensure constituent arrays are also pooled. */\nconst SHARED_LIMIT = 128;\n\nexport const effectsArrayPool = new ArrayPool<EffectObject>(SHARED_LIMIT);\nexport const cleanupsArrayPool = new ArrayPool<() => void>(SHARED_LIMIT);\n\n/**\n * Per-element record of all reactive resources that must be released on cleanup.\n * Fields are optional to avoid allocating arrays for the common case where only\n * one resource type is used.\n */\nexport interface BindingRecord {\n effects: EffectObject[] | undefined;\n cleanups: Array<() => void> | undefined;\n componentCleanup: (() => void) | undefined;\n}\n\n/**\n * Pool for BindingRecord objects.\n * Orchestrates constituent array pools during reset to prevent resource leaks.\n */\nexport const bindingRecordPool = new ObjectPool<BindingRecord>(\n () => ({\n effects: undefined,\n cleanups: undefined,\n componentCleanup: undefined,\n }),\n (r) => {\n // Orchestration: Proactively dispose all effects and execute cleanups.\n // This is defensive; registry.ts handles primary cleanup with logging.\n if (r.effects) {\n const len = r.effects.length;\n for (let i = 0; i < len; i++) {\n try {\n r.effects[i]!.dispose();\n } catch {\n /* ignore */\n }\n }\n effectsArrayPool.release(r.effects);\n r.effects = undefined;\n }\n\n if (r.cleanups) {\n const len = r.cleanups.length;\n for (let i = 0; i < len; i++) {\n try {\n r.cleanups[i]!();\n } catch {\n /* ignore */\n }\n }\n cleanupsArrayPool.release(r.cleanups);\n r.cleanups = undefined;\n }\n\n if (r.componentCleanup) {\n try {\n r.componentCleanup();\n } catch {\n /* ignore */\n }\n r.componentCleanup = undefined;\n }\n },\n SHARED_LIMIT\n);\n","import { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type { EffectObject } from '@/types';\nimport { getSelector } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport {\n type BindingRecord,\n bindingRecordPool,\n cleanupsArrayPool,\n effectsArrayPool,\n} from '@/utils/pool';\n\nlet autoCleanupScheduled = false;\n\n/**\n * Ensures that the MutationObserver for automatic cleanup is active.\n * Lazily triggered on the first reactive binding registration.\n */\nfunction ensureAutoCleanup(): void {\n if (autoCleanupScheduled) return;\n if (typeof document !== 'undefined' && document.body) {\n autoCleanupScheduled = true;\n enableAutoCleanup(document.body);\n }\n}\n\n/**\n * CSS class added to every element that has at least one active binding.\n * Used by `querySelectorAll` in `cleanupDescendants` for efficient subtree traversal.\n * Internal use only.\n */\nconst AES_BOUND = '_aes-bound';\n\n// BindingRecord type is defined in @/internal/pool to co-locate with its ObjectPool.\n\n// ============================================================================\n// BindingRegistry\n// ============================================================================\n\n/**\n * Central registry mapping DOM elements to their reactive binding records.\n *\n * Design goals:\n * - Zero memory leaks: all collections use WeakMap/WeakSet keyed by Element.\n * - Minimal allocations in the hot tracking path.\n * - O(bound-descendants) cleanup via a single querySelectorAll pass.\n */\nclass BindingRegistry {\n private records = new WeakMap<Element, BindingRecord>();\n private preservedNodes = new WeakSet<Node>();\n private ignoredNodes = new WeakSet<Node>();\n\n keep(node: Node): void {\n this.preservedNodes.add(node);\n }\n isKept(node: Node): boolean {\n return this.preservedNodes.has(node);\n }\n markIgnored(node: Node): void {\n this.ignoredNodes.add(node);\n }\n isIgnored(node: Node): boolean {\n return this.ignoredNodes.has(node);\n }\n\n private getOrCreateRecord(el: Element): BindingRecord {\n ensureAutoCleanup();\n let res = this.records.get(el);\n if (!res) {\n res = bindingRecordPool.acquire();\n this.records.set(el, res);\n el.classList.add(AES_BOUND);\n }\n return res;\n }\n\n /**\n * Registers a reactive effect with an element's record.\n * Effects are automatically disposed when the element is removed from the DOM.\n *\n * @param el - The DOM element to bind the effect to.\n * @param fx - The reactive effect instance.\n */\n trackEffect(el: Element, fx: EffectObject): void {\n const record = this.getOrCreateRecord(el);\n if (!record.effects) {\n record.effects = effectsArrayPool.acquire();\n }\n record.effects.push(fx);\n }\n\n /**\n * Registers an arbitrary cleanup function with an element's record.\n * Cleanups are executed when the element is removed from the DOM.\n *\n * @param el - The DOM element to bind the cleanup to.\n * @param fn - The cleanup function (e.g., event unbinding, timer clear).\n */\n trackCleanup(el: Element, fn: () => void): void {\n const record = this.getOrCreateRecord(el);\n if (!record.cleanups) {\n record.cleanups = cleanupsArrayPool.acquire();\n }\n record.cleanups.push(fn);\n }\n\n /**\n * Assigns a component-level cleanup function (e.g., from atomMount).\n * Unlike generic cleanups, there can only be one component cleanup per element.\n */\n setComponentCleanup(el: Element, fn: (() => void) | undefined): void {\n this.getOrCreateRecord(el).componentCleanup = fn;\n }\n\n hasBind(el: Element): boolean {\n return this.records.has(el);\n }\n\n cleanup(el: Node): void {\n // Shared deletions for all node types\n this.preservedNodes.delete(el);\n this.ignoredNodes.delete(el);\n\n if (el.nodeType !== 1) return; // Only Elements can have bindings\n\n const element = el as Element;\n const record = this.records.get(element);\n\n if (!record) {\n element.classList.remove(AES_BOUND);\n return;\n }\n\n this.records.delete(element);\n element.classList.remove(AES_BOUND);\n\n const selector = getSelector(element);\n debug.cleanup(LOG_PREFIXES.BINDING, selector);\n\n if (record.componentCleanup) {\n try {\n record.componentCleanup();\n } catch (e) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.CLEANUP_ERROR(selector), e);\n }\n record.componentCleanup = undefined;\n }\n\n if (record.effects) {\n for (const fx of record.effects) {\n try {\n fx.dispose();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.CORE.EFFECT_DISPOSE_ERROR(selector), e);\n }\n }\n effectsArrayPool.release(record.effects);\n record.effects = undefined;\n }\n\n if (record.cleanups) {\n for (const fn of record.cleanups) {\n try {\n fn();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.CLEANUP_ERROR(selector), e);\n }\n }\n cleanupsArrayPool.release(record.cleanups);\n record.cleanups = undefined;\n }\n bindingRecordPool.release(record);\n }\n\n cleanupDescendants(el: Element | DocumentFragment | ShadowRoot): void {\n // Fast path: getElementsByClassName is significantly faster than querySelectorAll\n const live =\n 'getElementsByClassName' in el\n ? (el as Element).getElementsByClassName(AES_BOUND)\n : el.querySelectorAll(`.${AES_BOUND}`);\n\n const len = live.length;\n if (len === 0) return;\n\n // Snapshot to avoid issues with live collection changing during cleanup\n const snapshot = new Array<Element>(len);\n for (let i = 0; i < len; i++) snapshot[i] = live[i]!;\n\n for (let i = len - 1; i >= 0; i--) {\n const child = snapshot[i]!;\n if (this.records.has(child)) {\n this.cleanup(child);\n } else {\n child.classList.remove(AES_BOUND);\n }\n }\n }\n\n cleanupTree(el: Node): void {\n if (el.nodeType === 1 || el.nodeType === 11) {\n this.cleanupDescendants(el as Element | DocumentFragment | ShadowRoot);\n }\n this.cleanup(el);\n }\n}\n\n// ============================================================================\n// Singleton + auto-cleanup\n// ============================================================================\n\nexport const registry = new BindingRegistry();\n\nconst observers = new Map<Node, MutationObserver>();\n\n/**\n * Starts observing `root` for removed elements and automatically disposes\n * their reactive bindings when they leave the DOM.\n *\n * Supports Element, ShadowRoot, and DocumentFragment roots.\n * Multiple roots can be observed concurrently (e.g. for Micro-Frontends).\n */\nexport function enableAutoCleanup(root: Element | ShadowRoot | DocumentFragment): void {\n // Idempotent: calling more than once with the same root has no effect.\n if (observers.has(root)) {\n return;\n }\n\n const observer = new MutationObserver((mutations) => {\n const reg = registry;\n for (let i = 0, mLen = mutations.length; i < mLen; i++) {\n const removedNodes = mutations[i]!.removedNodes;\n for (let j = 0, rLen = removedNodes.length; j < rLen; j++) {\n const node = removedNodes[j]!;\n\n // Performance: skip non-element nodes early\n if (node.nodeType !== 1) continue;\n\n // Skip nodes that were moved (still connected elsewhere)\n if ((node as Element).isConnected) continue;\n\n const el = node as Element;\n if (reg.isKept(el) || reg.isIgnored(el)) continue;\n\n reg.cleanupTree(el);\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n observers.set(root, observer);\n}\n\n/**\n * Marks the auto-cleanup as scheduled or already running.\n * Used internally and by reset helpers in tests.\n */\nexport function setAutoCleanupScheduled(scheduled: boolean): void {\n autoCleanupScheduled = scheduled;\n}\n\n/**\n * Stops all MutationObservers started by `enableAutoCleanup`.\n */\nexport function disableAutoCleanup(): void {\n observers.forEach((obs) => obs.disconnect());\n observers.clear();\n}\n","import { LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { BindingContext, EffectCleanup } from '@/types';\nimport { debug } from '@/utils/debug';\n\n/**\n * Creates a binding context for a DOM element.\n * Encapsulates the element and a helper to register cleanups.\n */\nexport function createContext(el: HTMLElement): BindingContext {\n return {\n el,\n trackCleanup: (fn: EffectCleanup) => registry.trackCleanup(el, fn),\n };\n}\n\n/**\n * Internal helper to iterate over a jQuery set and apply a binding function\n * to each Element node. Handles nodeType check and conditional context creation.\n *\n * This is the central engine for all chainable atomXXX methods.\n */\nexport function atomEachElement(\n jq: JQuery,\n fn: (ctx: BindingContext | null, el: HTMLElement) => void,\n options: { needsCtx?: boolean } = {}\n): JQuery {\n for (let i = 0, len = jq.length; i < len; i++) {\n const node = jq[i];\n if (node?.nodeType === 1) {\n const el = node as HTMLElement;\n fn(options.needsCtx ? createContext(el) : null, el);\n } else if (node) {\n debug.log(LOG_PREFIXES.BINDING, `Skipping non-Element node (nodeType=${node.nodeType})`);\n }\n }\n return jq;\n}\n\n/**\n * Utility to handle [source, options] tuple arguments in integrated bindings.\n * Supports both standalone values and reactive atoms/promises.\n */\nexport function unpack<T, O>(val: T | [T, O]): [T, O?] {\n return Array.isArray(val) &&\n val.length === 2 &&\n (typeof val[0] === 'function' ||\n (val[0] !== null &&\n typeof val[0] === 'object' &&\n ('value' in (val[0] as object) || 'then' in (val[0] as object))))\n ? (val as [T, O])\n : [val as T];\n}\n","import { batch } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from '@/core/registry';\n\n/** Generic event handler type matching jQuery's internal handler signature. */\ntype EventHandler = JQuery.EventHandlerBase<unknown, JQuery.TriggeredEvent>;\n\n/**\n * Symbol marker attached to handlers registered by this library's internals.\n * Handlers carrying this marker are NOT wrapped in batch() — they already\n * manage atom writes directly and do not need an extra reactive flush.\n */\nexport const INTERNAL_HANDLER = Symbol.for('atom-effect-internal');\n\n/**\n * Symbol used to store the wrapped version of a handler directly on the original\n * function. This enables different instances of the library to correctly\n * identify and unbind handlers registered by others.\n */\nexport const WRAPPED_HANDLER = Symbol.for('atom-effect-wrapped');\n\n/** Matches jQuery handler signature with internal metadata properties. */\ninterface JQueryHandlerInternal extends Function {\n [INTERNAL_HANDLER]?: boolean;\n [WRAPPED_HANDLER]?: EventHandler;\n}\n\nconst handlerMap = new WeakMap<EventHandler, EventHandler>();\n\n// ============================================================================\n// Originals store\n// ============================================================================\n\ntype JQueryEventHandler = EventHandler | boolean;\n\n/**\n * Snapshot of jQuery prototype methods captured at `enablejQueryOverrides()`\n * time and restored by `disablejQueryOverrides()`.\n *\n * Stored as a typed object and captured into `orig` (a local const) inside\n * `enablejQueryOverrides` so that the override closures always reference the\n * pre-patch methods even if `disablejQueryOverrides()` later resets the\n * module-level `originals` variable to null.\n */\ntype OriginalMethods = {\n on: typeof $.fn.on;\n one: typeof $.fn.one;\n off: typeof $.fn.off;\n remove: typeof $.fn.remove;\n empty: typeof $.fn.empty;\n detach: typeof $.fn.detach;\n};\n\nlet originals: OriginalMethods | null = null;\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst getWrappedHandler = (fn: EventHandler): EventHandler => {\n const internal = fn as unknown as JQueryHandlerInternal;\n\n // Fast check: is already wrapped?\n if (internal[INTERNAL_HANDLER]) return fn;\n\n // 1. Check direct property (for cross-instance/bundle compatibility)\n let wrapped = internal[WRAPPED_HANDLER];\n if (wrapped) return wrapped;\n\n // 2. Check local map\n wrapped = handlerMap.get(fn);\n\n if (!wrapped) {\n wrapped = function (this: unknown, ...args: unknown[]) {\n return batch(() => fn.apply(this, args as Parameters<EventHandler>));\n } as unknown as EventHandler;\n (wrapped as unknown as JQueryHandlerInternal)[INTERNAL_HANDLER] = true;\n\n // Store in both places\n handlerMap.set(fn, wrapped);\n try {\n internal[WRAPPED_HANDLER] = wrapped;\n } catch {\n // Ignore if function is not extensible (rare for event handlers)\n }\n }\n return wrapped;\n};\n\nconst resolveWrapped = (fn: EventHandler): EventHandler => {\n const internal = fn as unknown as JQueryHandlerInternal;\n return internal[WRAPPED_HANDLER] ?? handlerMap.get(fn) ?? fn;\n};\n\nfunction wrapEventMap(\n map: Record<string, JQueryEventHandler | undefined>\n): Record<string, JQueryEventHandler> {\n const newMap: Record<string, JQueryEventHandler> = {};\n for (const k in map) {\n const fn = map[k];\n if (typeof fn === 'function') newMap[k] = getWrappedHandler(fn);\n else if (fn !== undefined) newMap[k] = fn;\n }\n return newMap;\n}\n\nfunction resolveOffEventMap(\n map: Record<string, JQueryEventHandler | undefined>\n): Record<string, JQueryEventHandler | undefined> {\n const newMap: Record<string, JQueryEventHandler | undefined> = {};\n for (const k in map) {\n const h = map[k];\n if (typeof h === 'function') newMap[k] = resolveWrapped(h);\n else newMap[k] = h;\n }\n return newMap;\n}\n\n/**\n * Common logic to detect and process event handler functions in jQuery argument lists.\n * jQuery standard signatures are:\n * - Positional: (types, [selector], [data], handler, ...)\n * - Map: (map, [selector], [data], ...)\n */\nfunction patchEventArguments(\n args: unknown[],\n mapProcessor: (\n map: Record<string, JQueryEventHandler | undefined>\n ) => Record<string, JQueryEventHandler | undefined>,\n handlerProcessor: (fn: EventHandler) => EventHandler\n) {\n const first = args[0];\n if (first && typeof first === 'object') {\n args[0] = mapProcessor(first as Record<string, JQueryEventHandler | undefined>);\n } else {\n // Scan positional arguments (skipping types at index 0) for handler functions.\n for (let i = 1; i < args.length; i++) {\n if (typeof args[i] === 'function') {\n args[i] = handlerProcessor(args[i] as EventHandler);\n }\n }\n }\n}\n\nfunction createEventHandlerPatch(origFn: Function) {\n return function (this: JQuery, ...args: unknown[]) {\n patchEventArguments(args, wrapEventMap, getWrappedHandler);\n return origFn.apply(this, args) ?? this;\n };\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport function enablejQueryOverrides(): void {\n if (originals !== null) return;\n\n originals = {\n on: $.fn.on,\n one: $.fn.one,\n off: $.fn.off,\n remove: $.fn.remove,\n empty: $.fn.empty,\n detach: $.fn.detach,\n };\n const orig = originals;\n\n $.fn.remove = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n const el = targets[i];\n if (el) {\n registry.markIgnored(el);\n registry.cleanupTree(el);\n }\n }\n return orig.remove.call(this, selector) ?? this;\n };\n\n $.fn.empty = function (this: JQuery) {\n const len = this.length;\n for (let i = 0; i < len; i++) {\n const el = this[i];\n if (el?.hasChildNodes()) registry.cleanupDescendants(el);\n }\n return orig.empty.call(this) ?? this;\n };\n\n $.fn.detach = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n const el = targets[i];\n if (el) registry.keep(el);\n }\n return orig.detach.call(this, selector) ?? this;\n };\n\n // --- Event Handling Patches ---\n\n $.fn.on = createEventHandlerPatch(orig.on) as typeof $.fn.on;\n $.fn.one = createEventHandlerPatch(orig.one) as typeof $.fn.one;\n\n $.fn.off = function (this: JQuery, ...args: unknown[]) {\n patchEventArguments(args, resolveOffEventMap, resolveWrapped);\n return orig.off.apply(this, args as Parameters<typeof $.fn.off>) ?? this;\n };\n}\n\n/**\n * Restores all jQuery methods patched by `enablejQueryOverrides()`.\n * Primarily useful in test environments to reset state between suites.\n */\nexport function disablejQueryOverrides(): void {\n if (originals === null) return;\n\n $.fn.on = originals.on;\n $.fn.one = originals.one;\n $.fn.off = originals.off;\n $.fn.remove = originals.remove;\n $.fn.empty = originals.empty;\n $.fn.detach = originals.detach;\n\n originals = null;\n}\n","import type {\n AtomOptions as BaseAtomOptions,\n ComputedAtom,\n ComputedOptions,\n EffectObject,\n Paths,\n PathValue,\n ReadonlyAtom,\n WritableAtom,\n} from '@but212/atom-effect';\n\n// ============================================================================\n// Shared API Types\n// ============================================================================\n\nexport type EffectCleanup = () => void;\nexport type EffectResult = undefined | EffectCleanup;\nexport type EqualFn<T> = (a: T, b: T) => boolean;\n\nexport interface AtomOptions extends BaseAtomOptions {\n name?: string;\n}\n\n/**\n * Represents a value that can be tracked by the reactive system.\n * - T: Static value (one-time bind)\n * - ReadonlyAtom<T>: Reactive value (updates DOM when atom changes)\n * - () => T: Reactive function (updates DOM when any atom read inside changes)\n */\nexport type ReactiveValue<T> = T | ReadonlyAtom<T> | (() => T);\n\n/**\n * An extension of ReactiveValue that also supports Promises and async functions.\n * The binding system automatically handles the promise lifecycle, showing the\n * latest resolved value and ignoring stale ones (race condition protection).\n */\nexport type AsyncReactiveValue<T> =\n | T\n | ReadonlyAtom<T | Promise<T>>\n | Promise<T>\n | (() => T | Promise<T>);\nexport type PrimitiveValue = string | number | boolean | null | undefined;\ntype KeysOfType<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T];\n\nexport type CssValue =\n | AsyncReactiveValue<string | number>\n | [source: AsyncReactiveValue<number>, unit: string];\nexport type CssBindings = Record<string, CssValue>;\n\nexport interface BindingOptions<T = unknown> {\n text?:\n | AsyncReactiveValue<unknown>\n | [source: AsyncReactiveValue<unknown>, formatter: (v: unknown) => string];\n html?: AsyncReactiveValue<string>;\n class?: Record<string, AsyncReactiveValue<boolean>>;\n css?: CssBindings;\n attr?: Record<string, AsyncReactiveValue<PrimitiveValue>>;\n prop?: Record<string, AsyncReactiveValue<unknown>>;\n show?: AsyncReactiveValue<boolean>;\n hide?: AsyncReactiveValue<boolean>;\n val?: WritableAtom<T> | [atom: WritableAtom<T>, options: ValOptions<T>];\n checked?: WritableAtom<boolean>;\n form?:\n | WritableAtom<T extends object ? T : unknown>\n | [\n atom: WritableAtom<T extends object ? T : unknown>,\n options: FormOptions<T extends object ? T : unknown>,\n ];\n on?: Record<string, (e: JQuery.Event) => void>;\n}\n\nexport interface DisposableWritableAtom<T> extends WritableAtom<T> {\n dispose(): void;\n}\n\nexport type ListKey = string | number;\nexport type ListRenderResult = string | Element | DocumentFragment | JQuery;\nexport type ListKeyFn<T> = (item: T, index: number) => ListKey;\n\nexport interface ListOptions<T> {\n key: KeysOfType<T, ListKey> | ListKeyFn<T>;\n render: (item: T, index: number) => ListRenderResult;\n bind?: ($el: JQuery, item: T, index: number) => void;\n update?: ($el: JQuery, item: T, index: number) => void;\n onAdd?: ($el: JQuery) => void;\n onRemove?: ($el: JQuery) => Promise<void> | void;\n empty?: ListRenderResult;\n events?: Record<string, (item: T, index: number, e: JQuery.TriggeredEvent) => void>;\n isEqual?: (a: T, b: T) => boolean;\n}\n\n/**\n * Options for `atomVal`, `atomChecked`, and `atomForm` bindings.\n */\nexport interface ValOptions<T> {\n /** Debounce duration in milliseconds for DOM -> Atom sync. Defaults to 0. */\n debounce?: number;\n /** jQuery event name(s) to listen to. Defaults to \"input\". */\n event?: string;\n /** Custom function to parse DOM string to atom type T. */\n parse?: (v: string) => T;\n /** Custom function to format atom type T to DOM string. */\n format?: (v: T) => string;\n /** Custom equality check to prevent redundant atom updates. */\n equal?: EqualFn<T>;\n}\n\n/**\n * Options for `atomForm` binding.\n */\nexport interface FormOptions<T> extends ValOptions<T> {\n /** Custom function to transform field value based on path before atomic sync. */\n transform?: (path: string, value: unknown) => unknown;\n /** Callback triggered when a field value changes. */\n onChange?: (path: string, value: unknown) => void;\n}\n\nexport interface FetchOptions<T> {\n defaultValue: T;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | (string & {});\n headers?: Record<string, string>;\n transform?: (raw: unknown) => T;\n ajaxOptions?: JQuery.AjaxSettings | (() => JQuery.AjaxSettings);\n onError?: (err: unknown) => void;\n eager?: boolean;\n}\n\nexport interface FetchError extends Error {\n jqXHR?: JQuery.jqXHR;\n}\n\nexport type ComponentFn<P = Record<string, unknown>> = ($el: JQuery, props: P) => EffectResult;\n\nexport interface RouteLifecycle {\n onEnter?: (params: Record<string, string>, router: Router) => Record<string, string> | undefined;\n onLeave?: (router: Router) => boolean | undefined;\n}\n\nexport interface TemplateRoute extends RouteLifecycle {\n template: string;\n render?: never;\n onMount?: ($content: JQuery, onUnmount: (cleanupFn: () => void) => void, router: Router) => void;\n}\n\nexport interface RenderRoute extends RouteLifecycle {\n render: (\n container: HTMLElement,\n route: string,\n params: Record<string, string>,\n onUnmount: (cleanupFn: () => void) => void,\n router: Router\n ) => void;\n template?: never;\n}\n\nexport type RouteDefinition = TemplateRoute | RenderRoute;\n\nexport interface RouteConfig {\n target: string;\n default: string;\n routes: Record<string, RouteDefinition>;\n mode?: 'hash' | 'history';\n basePath?: string;\n notFound?: string;\n autoBindLinks?: boolean;\n activeClass?: string;\n beforeTransition?: (from: string, to: string) => void;\n afterTransition?: (from: string, to: string) => void;\n}\n\nexport interface Router {\n currentRoute: ReadonlyAtom<string>;\n queryParams: ReadonlyAtom<Record<string, string>>;\n navigate: (route: string) => void;\n destroy: () => void;\n}\n\nexport enum BindingFlags {\n None = 0,\n Focused = 1 << 0,\n Composing = 1 << 1,\n SyncingToAtom = 1 << 2,\n SyncingToDom = 1 << 3,\n Busy = Composing | SyncingToAtom | SyncingToDom,\n}\n\nexport interface BindingContext {\n readonly el: HTMLElement;\n readonly trackCleanup: (fn: EffectCleanup) => void;\n}\n\ndeclare global {\n interface JQueryStatic {\n atom: { <T>(v: T, opts?: AtomOptions): WritableAtom<T>; debug: boolean };\n computed<T>(fn: () => T, opts?: ComputedOptions<T>): ComputedAtom<T>;\n computed<T>(\n fn: () => Promise<T>,\n opts: ComputedOptions<T> & { defaultValue: T }\n ): ComputedAtom<T>;\n effect(fn: () => EffectResult): EffectObject;\n batch(fn: () => void): void;\n untracked<T>(fn: () => T): T;\n isAtom(v: unknown): boolean;\n isComputed(v: unknown): boolean;\n isReactive(v: unknown): boolean;\n nextTick(): Promise<void>;\n atomLens<T extends object, P extends Paths<T>>(\n atom: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n composeLens<T extends object, P extends Paths<T>>(\n lens: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n lensFor<T extends object>(\n atom: WritableAtom<T>\n ): <P extends Paths<T>>(p: P) => DisposableWritableAtom<PathValue<T, P>>;\n route(config: RouteConfig): Router;\n atomFetch<T>(\n url: string | (() => string),\n opts: FetchOptions<T>\n ): ComputedAtom<T> & { abort: () => void };\n }\n\n interface JQuery {\n atomText<T>(src: AsyncReactiveValue<T>, fmt?: (v: T) => string): this;\n atomHtml(src: AsyncReactiveValue<string>): this;\n atomClass(name: string, cond: AsyncReactiveValue<boolean>): this;\n atomClass(map: Record<string, AsyncReactiveValue<boolean>>): this;\n atomCss(prop: string, src: AsyncReactiveValue<string | number>, unit?: string): this;\n atomCss(map: CssBindings): this;\n atomAttr(name: string, src: AsyncReactiveValue<PrimitiveValue>): this;\n atomAttr(map: Record<string, AsyncReactiveValue<PrimitiveValue>>): this;\n atomProp<T>(name: string, src: AsyncReactiveValue<T>): this;\n atomProp(map: Record<string, AsyncReactiveValue<unknown>>): this;\n atomShow(cond: AsyncReactiveValue<boolean>): this;\n atomHide(cond: AsyncReactiveValue<boolean>): this;\n atomVal<T>(atom: WritableAtom<T>, opts?: ValOptions<T>): this;\n atomChecked(atom: WritableAtom<boolean>): this;\n atomForm<T extends object>(atom: WritableAtom<T>, opts?: FormOptions<T>): this;\n atomOn(event: string, handler: (e: JQuery.Event) => void): this;\n atomBind<T = unknown>(opts: BindingOptions<T>): this;\n atomList<T>(src: ReadonlyAtom<T[]>, opts: ListOptions<T>): this;\n atomMount<P>(comp: ComponentFn<P>, props?: P): this;\n atomUnmount(): this;\n atomUnbind(): this;\n }\n}\n\nexport type { ComputedAtom, ComputedOptions, EffectObject, ReadonlyAtom, WritableAtom };\n","import { effect, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, INPUT_DEFAULTS, LOG_PREFIXES } from '@/constants';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport type { EffectObject, ValOptions, WritableAtom } from '@/types';\nimport { BindingFlags } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// Monotonically increasing counter used to generate per-instance event\n// namespaces, preventing cleanup of sibling bindings on the same element.\nlet instanceCounter = 0;\n\ntype InputEl = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\n/**\n * Marks a handler as library-internal so the jQuery patch skips batch() wrapping.\n * All handlers registered by InputBinding must be marked — unmarked handlers are\n * wrapped in batch() by the jQuery override, which is redundant and potentially\n * harmful here since InputBinding manages atom writes directly.\n */\nfunction markInternal(fn: Function): void {\n (fn as unknown as Record<symbol, true>)[INTERNAL_HANDLER] = true;\n}\n\nclass InputBinding<T> {\n private readonly $el: JQuery;\n private readonly el: InputEl;\n private readonly atom: WritableAtom<T>;\n private readonly isMultipleSelect: boolean;\n private readonly isTextControl: boolean;\n\n private readonly parse: (v: string) => T;\n private readonly format: (v: T) => string;\n private readonly equal: (a: T, b: T) => boolean;\n private readonly readDom: () => T;\n private readonly getRawDom: () => string | string[];\n private readonly writeDom: (val: T, formatted: string) => void;\n\n /**\n * Internal state flags using bitwise operations for zero-overhead tracking.\n * Tracks focus, IME composition, and sync direction to prevent infinite loops.\n */\n private flags = 0;\n private timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\n\n /** Per-instance jQuery event namespace — prevents cleanup collisions. */\n private readonly ns: string;\n private readonly handleInput: () => void;\n\n constructor($el: JQuery, atom: WritableAtom<T>, options: ValOptions<T>) {\n this.$el = $el;\n this.el = $el[0] as InputEl;\n this.atom = atom;\n\n const tagName = this.el.tagName;\n this.isMultipleSelect = tagName === 'SELECT' && (this.el as HTMLSelectElement).multiple;\n this.isTextControl = tagName === 'INPUT' || tagName === 'TEXTAREA';\n this.ns = `.atomBind-${++instanceCounter}`;\n\n // Initialize strategies based on element type\n const { parse, format, equal, readDom, getRawDom, writeDom } = this.initStrategies(options);\n this.parse = parse;\n this.format = format;\n this.equal = equal;\n this.readDom = readDom;\n this.getRawDom = getRawDom;\n this.writeDom = writeDom;\n\n const debounce = options.debounce ?? 0;\n if (debounce > 0) {\n this.handleInput = () => {\n if (this.flags & BindingFlags.Composing) return;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => this.syncAtomFromDom(), debounce);\n };\n } else {\n this.handleInput = () => {\n if (!(this.flags & BindingFlags.Composing)) this.syncAtomFromDom();\n };\n }\n\n [\n this.handleFocus,\n this.handleBlur,\n this.handleCompositionStart,\n this.handleCompositionEnd,\n this.handleInput,\n ].forEach(markInternal);\n\n this.bindEvents(options.event ?? INPUT_DEFAULTS.EVENT);\n }\n\n /**\n * Specializes binding strategies at construction.\n * This avoids branching in the sync hot-paths (syncDomFromAtom / syncAtomFromDom).\n */\n private initStrategies(options: ValOptions<T>) {\n const parse = options.parse ?? ((v: string) => v as unknown as T);\n const baseEqual = options.equal ?? Object.is;\n\n if (this.isMultipleSelect) {\n const format =\n options.format ?? ((v: T) => (Array.isArray(v) ? v : v ? [String(v)] : []).join(','));\n\n return {\n parse,\n format,\n getRawDom: () => (this.$el.val() as string[] | null) || [],\n readDom: () => ((this.$el.val() as string[] | null) || []) as unknown as T,\n writeDom: (val: T) => {\n this.$el.val(val as unknown as string[]);\n },\n equal: (a: T, b: T): boolean => {\n if (baseEqual(a, b)) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n const len = a.length;\n if (len !== b.length) return false;\n for (let i = 0; i < len; i++) {\n if (!Object.is(a[i], b[i])) return false;\n }\n return true;\n }\n return false;\n },\n };\n }\n\n const format = options.format ?? ((v: T) => String(v ?? ''));\n const getRawDom = () => this.el.value;\n const readDom = () => parse(this.el.value);\n const writeDom = this.isTextControl\n ? (_val: T, formatted: string) => this.writeTextValue(formatted)\n : (_: T, formatted: string) => {\n this.el.value = formatted;\n };\n\n return { parse, format, equal: baseEqual, readDom, getRawDom, writeDom };\n }\n\n private writeTextValue(formatted: string): void {\n const el = this.el as HTMLInputElement;\n if (this.flags & BindingFlags.Focused) {\n try {\n const start = el.selectionStart;\n const end = el.selectionEnd;\n el.value = formatted;\n const len = formatted.length;\n if (start !== null && end !== null) {\n el.setSelectionRange(Math.min(start, len), Math.min(end, len));\n }\n } catch {\n el.value = formatted;\n }\n } else {\n el.value = formatted;\n }\n }\n\n // --- Event Handlers ---\n\n private readonly handleCompositionStart = () => {\n // We ignore input events while the user is still composing characters\n // (e.g., CJK character selection) to avoid syncing incomplete/partial data.\n this.flags |= BindingFlags.Composing;\n };\n\n private readonly handleCompositionEnd = () => {\n this.flags &= ~BindingFlags.Composing;\n // Trigger sync once composition is finished to capture the final character.\n this.handleInput();\n };\n\n private readonly handleFocus = () => {\n this.flags |= BindingFlags.Focused;\n };\n\n private readonly handleBlur = () => {\n this.flags &= ~BindingFlags.Focused;\n const wasComposing = !!(this.flags & BindingFlags.Composing);\n this.flags &= ~BindingFlags.Composing;\n\n // Ensure any pending debounced change is committed immediately on blur.\n const flushed = this.flushPendingDebounce();\n\n // If composition was interrupted by blur (e.g. clicking away),\n // and no debounced sync happened, we must perform a final sync.\n if (wasComposing && !flushed) {\n this.syncAtomFromDom();\n }\n\n // Restore the strict formatted value from the atom.\n this.normalizeDomValue();\n };\n\n // --- Helpers ---\n\n private flushPendingDebounce(): boolean {\n if (this.timeoutId !== undefined) {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n this.syncAtomFromDom();\n return true;\n }\n return false;\n }\n\n private normalizeDomValue(): void {\n const val = this.atom.peek();\n const formatted = this.format(val);\n const raw = this.getRawDom();\n\n if (this.isMultipleSelect) {\n if (!this.equal(raw as unknown as T, val)) {\n this.writeDom(val, formatted);\n }\n } else if (raw !== formatted) {\n this.writeDom(val, formatted);\n }\n }\n\n private syncAtomFromDom(): void {\n if (this.flags & BindingFlags.Busy) return;\n this.flags |= BindingFlags.SyncingToAtom;\n try {\n const parsed = this.readDom();\n if (!this.equal(this.atom.peek(), parsed)) {\n this.atom.value = parsed;\n }\n } catch (e) {\n debug.warn(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.PARSE_ERROR(e instanceof Error ? e.message : String(e)),\n e\n );\n } finally {\n this.flags &= ~BindingFlags.SyncingToAtom;\n }\n }\n\n public readonly syncDomFromAtom = () => {\n // Always read the value first to ensure the effect tracks this atom,\n // even if we skip the DOM update due to composition or atom syncing.\n const val = this.atom.value;\n\n // Skip DOM update if we are currently composing IME or syncing in either direction.\n if (this.flags & BindingFlags.Busy) return;\n\n untracked(() => {\n if (this.isDomUpToDate(val)) return;\n\n const formatted = this.format(val);\n this.flags |= BindingFlags.SyncingToDom;\n try {\n this.writeDom(val, formatted);\n debug.domUpdated(LOG_PREFIXES.BINDING, this.$el, 'val', formatted);\n } finally {\n this.flags &= ~BindingFlags.SyncingToDom;\n }\n });\n };\n\n /** Check if the DOM value is functionally equivalent to the atom value. */\n private isDomUpToDate(atomVal: T): boolean {\n const raw = this.getRawDom();\n\n if (this.isMultipleSelect) {\n return this.equal(raw as unknown as T, atomVal);\n }\n\n const formatted = this.format(atomVal);\n if (raw === formatted) return true;\n\n // If focused, also check via parse to avoid overwriting \"1.0\" with \"1\" if parse(\"1.0\") === 1\n if (this.flags & BindingFlags.Focused) {\n try {\n return this.equal(this.readDom(), atomVal);\n } catch {\n // Ignore parse errors on check-only read\n }\n }\n\n return false;\n }\n\n public readonly cleanup = () => {\n this.$el.off(this.ns);\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n };\n\n private bindEvents(eventName: string): void {\n const ns = this.ns;\n const namespacedEvents = eventName\n .trim()\n .split(/\\s+/)\n .map((e) => `${e}${ns}`)\n .join(' ');\n\n this.$el\n .on(`focus${ns}`, this.handleFocus)\n .on(`blur${ns}`, this.handleBlur)\n .on(`compositionstart${ns}`, this.handleCompositionStart)\n .on(`compositionend${ns}`, this.handleCompositionEnd)\n .on(namespacedEvents, this.handleInput);\n }\n}\n\n/**\n * Applies two-way data binding between a writable atom and an input element.\n */\nexport function applyInputBinding<T>(\n $el: JQuery,\n atom: WritableAtom<T>,\n options: ValOptions<T>\n): { fx: EffectObject; cleanup: () => void } {\n let binding: InputBinding<T> | null = new InputBinding($el, atom, options);\n return {\n fx: effect(binding.syncDomFromAtom),\n cleanup: () => {\n if (binding) {\n binding.cleanup();\n binding = null;\n }\n },\n };\n}\n","import { effect, type ReadonlyAtom, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { AsyncReactiveValue } from '@/types';\n\nimport { hasOwn, isPromise, isReactive } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// Debug type\n// ============================================================================\n\n/**\n * Structured label identifying which binding produced a debug log entry.\n * Fixed bindings use a plain literal; per-key bindings use a `prefix.key` form\n * where the key portion must be non-empty.\n *\n * Note: the trailing `(string & {})` member makes this type accept any string\n * at runtime while still surfacing the named literals as IDE autocomplete\n * suggestions. It does NOT enforce that only the listed values are used —\n * TypeScript absorbs all narrower literal members into `string & {}`, so there\n * is no compile-time restriction beyond `string`.\n */\nexport type BindingDebugType =\n | 'text'\n | 'html'\n | 'show'\n | 'hide'\n | 'checked'\n | `class.${string & {}}`\n | `css.${string & {}}`\n | `attr.${string & {}}`\n | `prop.${string & {}}`\n | (string & {});\n\n// ============================================================================\n// Core factory\n// ============================================================================\n\n/**\n * Registers a reactive effect that calls `updater` whenever `source` changes,\n * or calls `updater` once immediately if `source` is a static value.\n *\n * Responsibilities:\n * - Reactive path: wraps `updater` in an `effect`, tracks it on the registry.\n * - Static path: applies the value once; no effect is registered.\n * - Debug path: logs both the static initial bind and reactive updates via\n * `debug.domUpdated` so that all DOM writes appear in a uniform format.\n * - Error path: catches `updater` exceptions and surfaces them via `console.error`\n * so that a broken binding does not silently kill the effect loop.\n * Both the reactive and static paths are guarded consistently with `untracked`.\n *\n * @param el DOM element or SVG element to associate the effect with.\n * @param source Reactive or static value source.\n * @param updater Function that writes the value to the DOM.\n * @param debugType Structured label used in debug log output and effect naming.\n */\nexport function registerReactiveEffect<T>(\n el: Element,\n source: AsyncReactiveValue<T>,\n updater: (value: T) => void,\n debugType: BindingDebugType\n): void {\n const state = {\n latestId: 0,\n isDisposed: false,\n };\n\n // Ensure zombie protection by registering cleanup immediately.\n // Covers all execution paths, including static Promise inputs.\n registry.trackCleanup(el, () => {\n state.isDisposed = true;\n });\n\n const runUpdater = (val: T | Promise<T>) => {\n // Sync Path: Update immediately and invalidate any pending async runs.\n if (!isPromise(val)) {\n state.latestId++;\n untracked(() => {\n try {\n updater(val);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, val);\n } catch (e) {\n debug.error(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true),\n e\n );\n }\n });\n return;\n }\n\n // Async Path: Increment ID to track this specific execution's relevance.\n const myId = ++state.latestId;\n val\n .then((resolved) => {\n // Execute only if this element is still connected and this promise is still current.\n if (myId === state.latestId && !state.isDisposed) {\n untracked(() => {\n try {\n updater(resolved);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolved);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n }\n })\n .catch((e) => {\n if (myId === state.latestId && !state.isDisposed) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n };\n\n const sourceIsReactive = isReactive(source);\n const sourceIsFunction = typeof source === 'function';\n\n if (sourceIsReactive || sourceIsFunction) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const value = sourceIsReactive\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n runUpdater(value);\n },\n { name: debugType }\n )\n );\n } else {\n runUpdater(source as T | Promise<T>);\n }\n}\n\n/**\n * Registers a single reactive effect that observes multiple sources in a map.\n * When any source changes, the entire map is re-processed via the updater.\n */\nexport function registerMapEffect<T>(\n el: Element,\n map: Record<string, AsyncReactiveValue<T>>,\n updater: (map: Record<string, T>) => void,\n debugType: BindingDebugType\n): void {\n const keys = Object.keys(map);\n const reactiveKeys: string[] = [];\n const reactiveSources: AsyncReactiveValue<T>[] = [];\n const sourceIsAtom: boolean[] = [];\n const staticValues: Record<string, T | Promise<T>> = {};\n\n for (let i = 0, len = keys.length; i < len; i++) {\n const key = keys[i]!;\n const val = map[key]!;\n const isAtomVal = isReactive(val);\n if (isAtomVal || typeof val === 'function') {\n reactiveKeys.push(key);\n reactiveSources.push(val);\n sourceIsAtom.push(isAtomVal);\n } else {\n staticValues[key] = val;\n }\n }\n\n const state = {\n latestId: 0,\n isDisposed: false,\n cache: {} as Record<string, { p: Promise<T>; v: T }>,\n };\n\n // Ensure zombie protection by registering cleanup immediately.\n registry.trackCleanup(el, () => {\n state.isDisposed = true;\n });\n\n const runUpdater = (currentMap: Record<string, T | Promise<T>>) => {\n const promises: Promise<{ key: string; val: T }>[] = [];\n const resolvedMap: Record<string, T> = {};\n const len = keys.length;\n\n for (let i = 0; i < len; i++) {\n const key = keys[i]!;\n const val = currentMap[key]!;\n\n // Optimization: use cached result if it matches the current promise instance.\n if (isPromise(val) && hasOwn.call(state.cache, key)) {\n const entry = state.cache[key]!;\n if (entry.p === val) {\n resolvedMap[key] = entry.v;\n continue;\n }\n }\n\n if (isPromise(val)) {\n promises.push(\n val.then((v) => {\n state.cache[key] = { p: val as Promise<T>, v };\n return { key, val: v };\n })\n );\n } else {\n resolvedMap[key] = val as T;\n }\n }\n\n if (promises.length > 0) {\n const myId = ++state.latestId;\n Promise.all(promises).then(\n (results) => {\n if (myId === state.latestId && !state.isDisposed) {\n for (let i = 0, rLen = results.length; i < rLen; i++) {\n const res = results[i]!;\n resolvedMap[res.key] = res.val;\n }\n untracked(() => {\n try {\n updater(resolvedMap);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolvedMap);\n } catch (e) {\n debug.error(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType),\n e\n );\n }\n });\n }\n },\n (e) => {\n if (myId === state.latestId && !state.isDisposed) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n }\n );\n } else {\n // Sync Path: Update immediately and invalidate any pending async runs.\n state.latestId++;\n untracked(() => {\n try {\n updater(resolvedMap);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, resolvedMap);\n } catch (e) {\n debug.error(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true),\n e\n );\n }\n });\n }\n };\n\n if (reactiveKeys.length > 0) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const currentMap: Record<string, T | Promise<T>> = { ...staticValues };\n for (let i = 0, rLen = reactiveKeys.length; i < rLen; i++) {\n const source = reactiveSources[i]!;\n currentMap[reactiveKeys[i]!] = sourceIsAtom[i]\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n }\n runUpdater(currentMap);\n },\n { name: debugType }\n )\n );\n } else {\n runUpdater(staticValues);\n }\n}\n","/**\n * HTML sanitization and security guards for XSS mitigation.\n *\n * This module is the **sole** sanitization layer — there is no downstream\n * sanitizer (e.g. DOMPurify) applied automatically. All regex-based\n * filtering happens here before content reaches the DOM.\n *\n * **Threat model:** best-effort defence for developer-authored templates and\n * reactive string bindings. For user-controlled rich text (e.g. a WYSIWYG\n * editor), replace or supplement this with DOMPurify.\n */\nimport { DANGEROUS_PROTOCOL_PATTERN } from '@/constants';\n\n// ============================================================================\n// Constants & Registry\n// ============================================================================\n\n/** Attributes that carry a single URL value. */\nexport const URL_ATTRS = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n 'fill',\n 'filter',\n 'mask',\n 'marker-start',\n 'marker-mid',\n 'marker-end',\n 'clip-path',\n]);\n\nconst NAMED_ENTITY_MAP: Record<string, string> = {\n colon: ':',\n Tab: '\\t',\n NewLine: '\\n',\n};\n\n// ============================================================================\n// Pre-compiled regex constants\n// ============================================================================\n\n/** Normalization & Fast-path regexes */\nconst RE_NUMERIC_ENTITY = /&#x([0-9a-f]+);?|&#([0-9]+);?/gi;\nconst RE_NAMED_ENTITY = /&(colon|Tab|NewLine);/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters for XSS sanitization\nconst RE_STRIP_CTRL = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters for XSS sanitization\nconst RE_FAST_SCAN = /[<&\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/;\n\n/** Sanitization regexes */\nconst RE_STRIP_XML = /<\\?[\\s\\S]*?\\?>/g;\nconst RE_DANGEROUS_TAG =\n /(<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*>([\\s\\S]*?)<\\/\\2>|<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*\\/?>)/gi;\n\nconst RE_UNSAFE_ATTR = /\\bon\\w+\\s*=/gim;\nconst RE_DANGEROUS_DATA_URI =\n /data\\s*:\\s*(?:text\\/(?:html|javascript|vbscript|xml)|application\\/(?:javascript|xhtml\\+xml|xml|x-shockwave-flash)|image\\/svg\\+xml)/gi;\n\nconst RE_DANGEROUS_PROTOCOL_GLOBAL = new RegExp(`${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`, 'gi');\nconst RE_DANGEROUS_PROTOCOL_START = new RegExp(`^\\\\s*${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`, 'i');\n\n/** CSS Sanitization */\nconst CSS_KEYWORD_PATTERN = `(?:expression\\\\s*\\\\(|behavior\\\\s*:|-moz-binding\\\\s*:|(?:\\\\\\\\[0-9a-f]{1,6}\\\\s*|[\\\\s\\\\x00-\\\\x20/'\"])*${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:(?!image\\\\/)|data\\\\s*:\\\\s*(?!image\\\\/))`;\nconst RE_DANGEROUS_CSS_GLOBAL = new RegExp(CSS_KEYWORD_PATTERN, 'gim');\nconst RE_DANGEROUS_CSS_SINGLE = new RegExp(CSS_KEYWORD_PATTERN, 'im');\nconst RE_DANGEROUS_CSS_URL = new RegExp(\n `url\\\\s*\\\\(\\\\s*(?:[\"']?\\\\s*)?${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`,\n 'i'\n);\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/** Normalizes a string by decoding entities and stripping control characters. */\nfunction normalize(s: string): string {\n return s\n .replace(RE_NUMERIC_ENTITY, (_, hex, dec) => {\n const cp = hex ? parseInt(hex, 16) : parseInt(dec, 10);\n return cp >= 0 && cp <= 0x10ffff ? String.fromCodePoint(cp) : '';\n })\n .replace(RE_NAMED_ENTITY, (_, name) => NAMED_ENTITY_MAP[name] ?? '')\n .replace(RE_STRIP_CTRL, '');\n}\n\n/** Returns true if the string contains a dangerous protocol or data URI. */\nfunction hasDangerousProtocol(s: string): boolean {\n return (\n RE_DANGEROUS_PROTOCOL_START.test(s) || new RegExp(RE_DANGEROUS_DATA_URI.source, 'i').test(s)\n );\n}\n\n/** Returns true if the string contains dangerous CSS patterns. */\nfunction hasDangerousCss(s: string): boolean {\n return (\n (s.toLowerCase().includes('url(') && RE_DANGEROUS_CSS_URL.test(s)) ||\n RE_DANGEROUS_CSS_SINGLE.test(s)\n );\n}\n\n/**\n * O(n) single-pass scan for characters that indicate potential danger.\n */\nfunction needsSanitization(s: string): boolean {\n if (RE_FAST_SCAN.test(s) || s.indexOf(':') !== -1) return true;\n\n const lower = s.toLowerCase();\n let onIdx = lower.indexOf('on');\n while (onIdx !== -1 && onIdx < s.length - 2) {\n const nextChar = lower.charCodeAt(onIdx + 2);\n if (nextChar >= 97 && nextChar <= 122) return true;\n onIdx = lower.indexOf('on', onIdx + 1);\n }\n return false;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * HTML sanitization for XSS mitigation using regex-based filtering.\n * Optimized with an early-exit fast-path for safe strings.\n */\nexport function sanitizeHtml(html: string | null | undefined): string {\n if (!html) return '';\n const sInit = String(html);\n\n // Fast path: skip expensive processing if no dangerous patterns exist.\n if (!needsSanitization(sInit)) return sInit;\n\n // 1. Normalize (Decode entities -> Strip control chars)\n let s = normalize(sInit);\n\n // 2. Strip Tags (Recursive to handle nested reassembly like <scr<script>ipt>)\n if (s.indexOf('<') !== -1) {\n s = s.replace(RE_STRIP_XML, '');\n let prev: string;\n do {\n prev = s;\n s = s.replace(RE_DANGEROUS_TAG, '');\n } while (s !== prev);\n }\n\n // 3. Neutralize CSS, Protocols, Data URIs, and Attributes\n // (Note: CSS first to ensure url(javascript:) captures the whole property)\n return s\n .replace(RE_DANGEROUS_CSS_GLOBAL, 'data-unsafe-css:')\n .replace(RE_DANGEROUS_PROTOCOL_GLOBAL, 'data-unsafe-protocol:')\n .replace(RE_DANGEROUS_DATA_URI, 'data-unsafe-protocol:')\n .replace(RE_UNSAFE_ATTR, 'data-unsafe-attr=');\n}\n\n/** Checks for javascript:/vbscript: protocols in URL attributes. */\nexport const isDangerousUrl = (attr: string, val: string): boolean => {\n const lowerAttr = attr.toLowerCase();\n if (!URL_ATTRS.has(lowerAttr)) return false;\n return hasDangerousProtocol(normalize(val));\n};\n\n/** Checks for protocols/expressions inside CSS. */\nexport const isDangerousCssValue = (val: string): boolean => {\n return hasDangerousCss(normalize(val));\n};\n","import { computed, effect, isAtom, type ReadonlyAtom, untracked } from '@but212/atom-effect';\n\nimport $ from 'jquery';\nimport { applyInputBinding } from '@/bindings/input-binding';\nimport { DANGEROUS_PROPS, ERROR_MESSAGES, LOG_PREFIXES, VALID_INPUT_TAGS } from '@/constants';\nimport { registerMapEffect, registerReactiveEffect } from '@/core/effect-factory';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssValue,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\nimport { hasOwn, isPromise } from '@/utils';\nimport { debug } from '@/utils/debug';\n\nimport { isDangerousCssValue, isDangerousUrl, sanitizeHtml, URL_ATTRS } from '@/utils/sanitize';\n\n// Cache for CSS property camelization to avoid repeated regex overhead.\n// Uses Map instead of a plain object to avoid prototype pollution risk and\n// for clearer semantics — CSS property names are a small, finite set so the\n// cache is effectively bounded in practice.\nconst camelCache = new Map<string, string>();\nfunction getCamelCase(prop: string): string {\n let cached = camelCache.get(prop);\n if (cached !== undefined) return cached;\n\n cached = prop.includes('-') ? prop.replace(/-./g, (m) => m[1]!.toUpperCase()) : prop;\n camelCache.set(prop, cached);\n return cached;\n}\n\n/**\n * Cache for sanitized versions of reactive strings.\n * Ensures that if 100 elements are bound to the same atom, sanitizeHtml() is\n * called only once per update instead of 100 times.\n */\nconst htmlSanitizeCache = new WeakMap<\n ReadonlyAtom<string | Promise<string>>,\n ReadonlyAtom<string | Promise<string>>\n>();\n\nfunction getSanitizedHtml(\n source: ReadonlyAtom<string | Promise<string>>\n): ReadonlyAtom<string | Promise<string>> {\n let cached = htmlSanitizeCache.get(source);\n if (!cached) {\n cached = computed(() => {\n const val = source.value;\n if (isPromise(val)) {\n return val.then((v: string) => sanitizeHtml(v));\n }\n return sanitizeHtml(val);\n });\n htmlSanitizeCache.set(source, cached);\n }\n return cached;\n}\n\n// ============================================================================\n// One-Way Binding Handlers (Atom → DOM)\n// ============================================================================\n\n/**\n * Updates element text content.\n */\nexport function bindText<T = unknown>(\n { el }: BindingContext,\n value: AsyncReactiveValue<T>,\n formatter?: (val: T) => string\n): void {\n registerReactiveEffect(\n el,\n value,\n (val) => {\n const text = formatter ? formatter(val) : String(val ?? '');\n if (el.textContent !== text) el.textContent = text;\n },\n 'text'\n );\n}\n\n/**\n * Updates element inner HTML with XSS sanitization.\n */\nexport function bindHtml({ el }: BindingContext, value: AsyncReactiveValue<string>): void {\n const source = isAtom(value)\n ? getSanitizedHtml(value as ReadonlyAtom<string | Promise<string>>)\n : value;\n\n let lastHtml: string | null = null;\n\n registerReactiveEffect(\n el,\n source,\n (val) => {\n const html = source === value ? sanitizeHtml(val) : val;\n if (lastHtml !== html) {\n registry.cleanupDescendants(el);\n el.innerHTML = html;\n lastHtml = html;\n }\n },\n 'html'\n );\n}\n\n/**\n * Toggles multiple CSS classes based on reactive boolean conditions.\n */\nexport function bindClass(\n { el }: BindingContext,\n classMap: Record<string, AsyncReactiveValue<boolean>>\n): void {\n const tokenMap: Record<string, string[]> = {};\n const prevStates: Record<string, boolean> = {};\n\n for (const k in classMap) {\n if (hasOwn.call(classMap, k)) {\n const trimmed = k.trim();\n // Optimization: avoid regex for simple single-class keys, but handle all whitespace robustly\n tokenMap[k] = /\\s/.test(trimmed) ? trimmed.split(/\\s+/).filter(Boolean) : [trimmed];\n }\n }\n\n registerMapEffect(\n el,\n classMap,\n (states) => {\n for (const k in states) {\n const val = !!states[k];\n if (prevStates[k] === val) continue;\n\n const tokens = tokenMap[k]!;\n if (val) {\n el.classList.add(...tokens);\n } else {\n // Safely remove tokens only if no other active key in this map requires them\n for (const token of tokens) {\n let stillNeeded = false;\n for (const otherK in states) {\n if (otherK !== k && states[otherK] && tokenMap[otherK]!.includes(token)) {\n stillNeeded = true;\n break;\n }\n }\n if (!stillNeeded) el.classList.remove(token);\n }\n }\n prevStates[k] = val;\n }\n },\n 'class'\n );\n}\n\n/**\n * Updates multiple CSS style properties.\n */\nexport function bindCss({ el }: BindingContext, cssMap: Record<string, CssValue>): void {\n const style = el.style as unknown as Record<string, string | null>;\n const reactiveMap: Record<string, ReactiveValue<unknown>> = {};\n const meta: Record<string, { camel: string; unit: string }> = {};\n const prevValues: Record<string, string | null> = {};\n\n for (const p in cssMap) {\n if (hasOwn.call(cssMap, p)) {\n const val = cssMap[p]!;\n const [src, unit] = Array.isArray(val) ? val : ([val, ''] as const);\n reactiveMap[p] = src;\n meta[p] = { camel: getCamelCase(p), unit };\n }\n }\n\n registerMapEffect(\n el,\n reactiveMap,\n (states) => {\n for (const p in states) {\n const m = meta[p]!;\n const val = states[p];\n const str = m.unit ? `${val}${m.unit}` : String(val);\n const camel = m.camel;\n\n if (prevValues[p] !== str) {\n if (!isDangerousCssValue(str)) {\n style[camel] = str;\n }\n prevValues[p] = str;\n }\n }\n },\n 'css'\n );\n}\n\n/**\n * Binds DOM attributes with security guards and primitive value constraints.\n */\nexport function bindAttr(\n { el }: BindingContext,\n attrMap: Record<string, AsyncReactiveValue<PrimitiveValue>>\n): void {\n const safeMap: Record<string, AsyncReactiveValue<PrimitiveValue>> = {};\n const metaMap: Record<string, { isAria: boolean; isUrl: boolean }> = {};\n const cache: Record<string, string | null> = {};\n\n for (const name in attrMap) {\n if (!hasOwn.call(attrMap, name)) continue;\n const lower = name.toLowerCase();\n if (lower.startsWith('on')) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)}`\n );\n continue;\n }\n safeMap[name] = attrMap[name]!;\n metaMap[name] = { isAria: lower.startsWith('aria-'), isUrl: URL_ATTRS.has(lower) };\n cache[name] = el.getAttribute(name);\n }\n\n registerMapEffect(\n el,\n safeMap,\n (states) => {\n for (const name in states) {\n const m = metaMap[name]!;\n const val = states[name] as PrimitiveValue;\n\n if (val == null || (val === false && !m.isAria)) {\n if (cache[name] !== null) el.removeAttribute(name);\n cache[name] = null;\n continue;\n }\n\n const newVal = val === true ? (m.isAria ? 'true' : name) : String(val);\n if (isDangerousUrl(name, newVal)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n if (cache[name] !== newVal) {\n el.setAttribute(name, newVal);\n cache[name] = newVal;\n }\n }\n },\n 'attr'\n );\n}\n\n/**\n * Binds DOM properties. Uses strict property write guards and security filters.\n */\nexport function bindProp(\n ctx: BindingContext,\n propMap: Record<string, AsyncReactiveValue<unknown>>\n): void {\n const el = ctx.el as unknown as Record<string, unknown>;\n const safeMap: Record<string, AsyncReactiveValue<unknown>> = {};\n const metaMap: Record<string, { isUrl: boolean }> = {};\n const prevValues: Record<string, unknown> = {};\n\n for (const name in propMap) {\n if (!hasOwn.call(propMap, name)) continue;\n const lower = name.toLowerCase();\n if (lower.startsWith('on') || DANGEROUS_PROPS.has(name)) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${\n lower.startsWith('on')\n ? ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)\n : ERROR_MESSAGES.SECURITY.BLOCKED_PROP(name)\n }`\n );\n continue;\n }\n safeMap[name] = propMap[name]!;\n metaMap[name] = { isUrl: URL_ATTRS.has(lower) };\n }\n\n registerMapEffect(\n ctx.el,\n safeMap,\n (states) => {\n for (const name in states) {\n const val = states[name];\n if (prevValues[name] === val) continue;\n\n if (typeof val === 'string' && isDangerousUrl(name, val)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n el[name] = val;\n prevValues[name] = val;\n }\n },\n 'prop'\n );\n}\n\n/**\n * Handles visibility (display: none) toggle.\n */\nexport function bindVisibility(\n { el }: BindingContext,\n condition: AsyncReactiveValue<boolean>,\n invert: boolean\n): void {\n let lastDisplay = el.style.display === 'none' ? '' : el.style.display;\n\n registerReactiveEffect(\n el,\n condition,\n (val) => {\n const isVisible = invert !== !!val;\n if (isVisible) {\n if (el.style.display === 'none') {\n el.style.display = lastDisplay;\n }\n } else if (el.style.display !== 'none') {\n lastDisplay = el.style.display;\n el.style.display = 'none';\n }\n },\n invert ? 'hide' : 'show'\n );\n}\n\n/**\n * Two-way value binding with full feature parity to $.fn.atomVal.\n */\nexport function bindVal(\n ctx: BindingContext,\n atom: WritableAtom<unknown>,\n options: ValOptions<unknown> = {}\n): void {\n const tag = ctx.el.tagName.toLowerCase();\n if (!VALID_INPUT_TAGS.has(tag)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.INVALID_INPUT_ELEMENT(tag)}`);\n return;\n }\n const { fx, cleanup } = applyInputBinding($(ctx.el), atom, options);\n registry.trackEffect(ctx.el, fx);\n ctx.trackCleanup(cleanup);\n}\n\n/**\n * Helper to trigger synchronization across a radio group.\n */\nfunction syncRadioGroup(el: HTMLInputElement): void {\n if (el.type === 'radio' && el.name) {\n (el.form ? $(el.form) : $(document))\n .find(`input[type=\"radio\"][name=\"${$.escapeSelector(el.name)}\"]`)\n .not(el)\n .trigger('change.atomRadioSync');\n }\n}\n\n/**\n * Two-way binding for checkbox/radio checked state.\n */\nexport function bindChecked(ctx: BindingContext, atom: WritableAtom<boolean>): void {\n const el = ctx.el as HTMLInputElement;\n const $el = $(el);\n\n const handler = () => {\n if (atom.peek() !== el.checked) {\n atom.value = el.checked;\n syncRadioGroup(el);\n }\n };\n (handler as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n\n $el.on('change change.atomRadioSync', handler);\n ctx.trackCleanup(() => $el.off('change change.atomRadioSync', handler));\n\n registry.trackEffect(\n el,\n effect(() => {\n const val = !!atom.value;\n untracked(() => {\n if (el.checked !== val) {\n el.checked = val;\n debug.domUpdated(LOG_PREFIXES.BINDING, el, 'checked', val);\n if (val) syncRadioGroup(el);\n }\n });\n })\n );\n}\n\n// ============================================================================\n// Event Binding Handler\n// ============================================================================\n\nexport function bindEvents(ctx: BindingContext, eventMap: NonNullable<BindingOptions['on']>): void {\n const $el = $(ctx.el);\n $el.on(eventMap);\n ctx.trackCleanup(() => $el.off(eventMap));\n}\n\n/**\n * Binds a single event handler using jQuery's event system for compatibility.\n */\nexport function bindOn(\n { el, trackCleanup }: BindingContext,\n event: string,\n handler: (e: JQuery.TriggeredEvent) => void\n): void {\n const $el = $(el);\n $el.on(event, handler);\n trackCleanup(() => $el.off(event, handler));\n}\n\n/**\n * Disposes all reactive bindings on an element and its descendants.\n */\nexport function bindUnbind(el: HTMLElement): void {\n registry.cleanupTree(el);\n}\n","import {\n batch,\n atom as createAtom,\n type EffectObject,\n effect,\n getPathValue,\n setDeepValue,\n untracked,\n type WritableAtom,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { createContext } from '@/core/dom';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type { BindingContext, FormOptions } from '@/types';\nimport { bindVal } from './unified';\n\n/**\n * Interface for managing the state and synchronization logic of individual form fields.\n */\ninterface FieldEntry {\n /** Independent Atom managing the data for this specific field */\n atom: WritableAtom<unknown>;\n /** Path segments for deep object property traversal (e.g., \"a.b[0]\" -> [\"a\", \"b\", \"0\"]) */\n parts: string[];\n /** The value of the field's \"name\" attribute */\n name: string;\n /** Number of DOM elements currently referencing this field */\n refCount: number;\n /** Effect object that reflects field Atom changes back to the root Atom */\n effect: EffectObject | null;\n}\n\n/** Selector definition for form controls (input, select, textarea) */\nconst SELECTOR = 'input, select, textarea';\n\n/**\n * Orchestrator class for managing two-way synchronization between a single object-based Atom\n * and HTML form elements.\n *\n * This class uses a \"Root -> Leaf\" dispatcher model to maintain performance in large forms:\n * - Root -> Leaf: Updates individual field Atoms conditionally when the root data changes.\n * - Leaf -> Root: Updates the specific path within the root Atom when a field Atom changes.\n *\n * It uses the `isSyncingFromLeaf` flag to prevent infinite loops during two-way updates.\n *\n * @template T The type of the form data (object)\n */\nclass FormBinder<T extends object> {\n /** Map using field names as keys to manage field entries */\n private fieldMap = new Map<string, FieldEntry>();\n /** Cache of field entries for efficient iteration */\n private fields: FieldEntry[] = [];\n /** WeakMap tracking the previous name of elements to support cleanup when name attributes change */\n private elementNames = new WeakMap<Element, string>();\n /** Protection flag to prevent root dispatcher execution when the update originates from a leaf field */\n private isSyncingFromLeaf = false;\n\n constructor(\n private form: HTMLFormElement,\n private atom: WritableAtom<T>,\n private options: FormOptions<unknown> = {}\n ) {\n this.init();\n }\n\n /**\n * Initializes the Root -> Leaf synchronization dispatcher.\n * Updates child field Atoms whenever the root Atom value changes.\n */\n private init(): void {\n const rootDispatcher = effect(() => {\n const rootValue = this.atom.value;\n // Skip if updating from a leaf field or if there are no managed fields (optimization & loop protection).\n if (this.isSyncingFromLeaf || !this.fields.length) return;\n\n batch(() => {\n untracked(() => {\n for (let i = 0; i < this.fields.length; i++) {\n const f = this.fields[i]!;\n const newVal = getPathValue(rootValue, f.parts);\n // Only update the field Atom if the value has actually changed to prevent redundant DOM renders.\n if (!Object.is(f.atom.peek(), newVal)) f.atom.value = newVal;\n }\n });\n });\n });\n\n // Link the form element lifecycle with the dispatcher.\n registry.trackEffect(this.form, rootDispatcher);\n this.bindElement(this.form);\n this.setupObserver();\n }\n\n /**\n * Finds and binds all form controls within the given element.\n * @param el Root element to start binding from\n */\n public bindElement(el: Element): void {\n const targets = el.matches?.(SELECTOR)\n ? [el]\n : (el as HTMLElement).querySelectorAll?.(SELECTOR) || [];\n for (let i = 0, len = targets.length; i < len; i++) {\n this.bindControl(targets[i] as Element);\n }\n }\n\n /**\n * Handles binding for individual controls (input, select, textarea).\n * Only processes elements with a name attribute and prevents duplicate bindings.\n */\n private bindControl(el: Element): void {\n if (\n !(\n el instanceof HTMLInputElement ||\n el instanceof HTMLSelectElement ||\n el instanceof HTMLTextAreaElement\n )\n ) {\n return;\n }\n const control = el;\n const name = control.name;\n if (!name) return;\n\n // Cleanup existing field resources if the name attribute has changed.\n const oldName = this.elementNames.get(control);\n if (oldName !== undefined && oldName !== name) registry.cleanup(control);\n // Prevent duplicate binding if already bound with the same name.\n if (this.elementNames.has(control) && oldName === name) return;\n\n const entry = this.acquireField(name);\n this.elementNames.set(control, name);\n\n const ctx = createContext(control);\n // Track cleanup to decrement field reference count when the element is removed from DOM.\n ctx.trackCleanup(() => this.releaseField(control, name));\n\n // Choose appropriate binding strategy based on control type.\n if (\n control instanceof HTMLInputElement &&\n (control.type === 'radio' || control.type === 'checkbox')\n ) {\n this.bindToggle(ctx, entry.atom, control.value, control.type === 'checkbox');\n } else {\n // Standard input fields (text, select, etc.) use the standard bindVal logic.\n bindVal(ctx, entry.atom, this.options);\n }\n }\n\n /**\n * Handles specialized binding logic for checkboxes and radio buttons.\n * Supports multi-checkbox configurations (managing values as an array).\n */\n private bindToggle(\n ctx: BindingContext,\n atom: WritableAtom<unknown>,\n val: string,\n isCheck: boolean\n ): void {\n const el = ctx.el as HTMLInputElement;\n\n // Handler to reflect UI changes back to the Atom\n const handler = () => {\n const curr = atom.peek();\n if (isCheck && Array.isArray(curr)) {\n // Multi-checkbox logic using Set for array-based values\n const s = new Set(curr.map(String));\n el.checked ? s.add(val) : s.delete(val);\n atom.value = Array.from(s);\n } else {\n // Standard radio buttons and single checkboxes\n atom.value = isCheck ? el.checked : val;\n }\n };\n\n // Mark as internal handler to prevent redundant interceptions.\n (handler as unknown as { [INTERNAL_HANDLER]: boolean })[INTERNAL_HANDLER] = true;\n $(el).on('change', handler);\n ctx.trackCleanup(() => $(el).off('change', handler));\n\n // Effect to update UI checked state when the Atom changes\n registry.trackEffect(\n el,\n effect(() => {\n const v = atom.value;\n const checked = isCheck\n ? Array.isArray(v)\n ? v.some((x) => String(x) === val)\n : !!v\n : String(v) === val;\n if (el.checked !== checked) el.checked = checked;\n })\n );\n }\n\n /**\n * Acquires field resources for a specific name path.\n * Increments refCount if it exists, otherwise creates a new Atom and synchronization Effect.\n */\n private acquireField(name: string): FieldEntry {\n let entry = this.fieldMap.get(name);\n if (entry) {\n entry.refCount++;\n return entry;\n }\n\n // Parse the name attribute into an object path (e.g., \"user[info].name\" -> [\"user\", \"info\", \"name\"])\n const parts = name\n .replace(/\\[(\\w+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n\n // Create an independent field Atom for Leaf -> Root synchronization\n const fieldAtom = createAtom(getPathValue(this.atom.peek(), parts));\n entry = { atom: fieldAtom, parts, name, refCount: 1, effect: null };\n\n // Set up Leaf (field Atom) -> Root (main data Atom) synchronization effect\n entry.effect = effect(() => {\n let val = fieldAtom.value;\n // Support custom data transformation via options\n if (this.options.transform) val = this.options.transform(name, val);\n\n const root = this.atom.peek();\n // Update deep path value immutably\n const next = setDeepValue(root, parts, 0, val);\n\n if (next !== root) {\n // Mark as syncing from leaf to prevent infinite loop in Root dispatcher\n this.isSyncingFromLeaf = true;\n try {\n this.atom.value = next as T;\n // Execute onChange callback if provided (wrapped in untracked to protect from effect collection)\n if (this.options.onChange) untracked(() => this.options.onChange!(name, val));\n } finally {\n this.isSyncingFromLeaf = false;\n }\n }\n });\n\n this.fieldMap.set(name, entry);\n this.fields.push(entry);\n return entry;\n }\n\n /**\n * Releases field usage and cleans up resources when refCount reaches zero.\n */\n private releaseField(el: Element, name: string): void {\n const entry = this.fieldMap.get(name);\n if (entry && --entry.refCount <= 0) {\n const idx = this.fields.indexOf(entry);\n if (idx !== -1) this.fields.splice(idx, 1);\n entry.effect?.dispose();\n this.fieldMap.delete(name);\n }\n registry.cleanup(el);\n }\n\n /**\n * Uses MutationObserver to detect dynamic changes within the form.\n * Automatically updates bindings when new elements are added or name attributes change.\n */\n private setupObserver(): void {\n const observer = new MutationObserver((ms) => {\n for (let i = 0, len = ms.length; i < len; i++) {\n const m = ms[i]!;\n if (m.type === 'childList') {\n for (let j = 0; j < m.addedNodes.length; j++) {\n const node = m.addedNodes[j]!;\n if (node.nodeType === 1) this.bindElement(node as Element);\n }\n } else if (m.attributeName === 'name') {\n this.bindElement(m.target as Element);\n }\n }\n });\n\n observer.observe(this.form, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['name'],\n });\n\n // Disconnect the observer when the form is destroyed.\n registry.trackCleanup(this.form, () => observer.disconnect());\n }\n}\n\n/**\n * Binds an entire HTML form to a single object-based Atom.\n *\n * Key Features:\n * - O(1) level update performance for large forms (only changed fields react)\n * - Circular loop protection via internal flags for two-way updates\n * - Support for custom data transformation (transform) and change callbacks (onChange)\n * - Automatic dynamic element binding and memory management via MutationObserver\n *\n * @param form The HTMLFormElement to bind\n * @param atom The WritableAtom holding the form data\n * @param options Evaluation options for performance tuning or callbacks\n */\nexport function bindForm<T extends object>(\n form: HTMLFormElement,\n atom: WritableAtom<T>,\n options: FormOptions<unknown> = {}\n): void {\n new FormBinder(form, atom, options);\n}\n","import $ from 'jquery';\nimport { bindForm } from '@/bindings/form';\nimport {\n bindAttr,\n bindChecked,\n bindClass,\n bindCss,\n bindEvents,\n bindHtml,\n bindOn,\n bindProp,\n bindText,\n bindUnbind,\n bindVal,\n bindVisibility,\n} from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { atomEachElement, unpack } from '@/core/dom';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssBindings,\n FormOptions,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\n\nimport { debug } from '@/utils/debug';\n\n/**\n * Binds element `textContent` to a reactive source.\n */\n$.fn.atomText = function <T>(source: AsyncReactiveValue<T>, formatter?: (v: T) => string): JQuery {\n return atomEachElement(this, (ctx) => bindText(ctx!, source, formatter), { needsCtx: true });\n};\n\n/**\n * Binds element `innerHTML` to a reactive string source.\n */\n$.fn.atomHtml = function (source: AsyncReactiveValue<string>): JQuery {\n return atomEachElement(this, (ctx) => bindHtml(ctx!, source), { needsCtx: true });\n};\n\n/**\n * Toggles one or more CSS classes based on reactive boolean conditions.\n */\n$.fn.atomClass = function (\n this: JQuery,\n classNameOrMap: string | Record<string, AsyncReactiveValue<boolean>>,\n condition?: AsyncReactiveValue<boolean>\n): JQuery {\n const map =\n typeof classNameOrMap === 'string'\n ? condition === undefined\n ? null\n : { [classNameOrMap]: condition }\n : classNameOrMap;\n\n if (!map) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_CONDITION('atomClass')}`\n );\n return this;\n }\n\n return atomEachElement(this, (ctx) => bindClass(ctx!, map), { needsCtx: true });\n};\n\n/**\n * Binds one or more CSS style properties to reactive values.\n */\n$.fn.atomCss = function (\n this: JQuery,\n propOrMap: string | CssBindings,\n source?: AsyncReactiveValue<string | number>,\n unit?: string\n): JQuery {\n const map =\n typeof propOrMap === 'string'\n ? source === undefined\n ? null\n : { [propOrMap]: unit ? [source as ReactiveValue<number>, unit] : source! }\n : propOrMap;\n\n if (!map) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomCss')}`);\n return this;\n }\n\n return atomEachElement(this, (ctx) => bindCss(ctx!, map as CssBindings), { needsCtx: true });\n};\n\n/**\n * Binds one or more HTML attributes to reactive values with security guards.\n */\n$.fn.atomAttr = function (\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<PrimitiveValue>>,\n source?: AsyncReactiveValue<PrimitiveValue>\n): JQuery {\n const map =\n typeof nameOrMap === 'string'\n ? source === undefined\n ? null\n : { [nameOrMap]: source }\n : nameOrMap;\n\n if (!map) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomAttr')}`);\n return this;\n }\n\n return atomEachElement(this, (ctx) => bindAttr(ctx!, map), { needsCtx: true });\n};\n\n/**\n * Binds one or more DOM properties to reactive values.\n */\n$.fn.atomProp = function <T>(\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<T>>,\n source?: AsyncReactiveValue<T>\n): JQuery {\n const map =\n typeof nameOrMap === 'string'\n ? source === undefined\n ? null\n : ({ [nameOrMap]: source } as Record<string, AsyncReactiveValue<unknown>>)\n : (nameOrMap as Record<string, AsyncReactiveValue<unknown>>);\n\n if (!map) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomProp')}`);\n return this;\n }\n\n return atomEachElement(this, (ctx) => bindProp(ctx!, map), { needsCtx: true });\n};\n\n/**\n * Shows the element when `condition` is truthy (`display: ''`).\n */\n$.fn.atomShow = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx!, condition, false), {\n needsCtx: true,\n });\n};\n\n/**\n * Hides the element when `condition` is truthy (`display: 'none'`).\n */\n$.fn.atomHide = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx!, condition, true), {\n needsCtx: true,\n });\n};\n\n/**\n * Two-way binding for `<input>`, `<select>`, and `<textarea>` values.\n */\n$.fn.atomVal = function <T>(atom: WritableAtom<T>, options: ValOptions<T> = {}): JQuery {\n return atomEachElement(\n this,\n (ctx) => bindVal(ctx!, atom as WritableAtom<unknown>, options as ValOptions<unknown>),\n { needsCtx: true }\n );\n};\n\n/**\n * Two-way binding for checkbox and radio button `checked` state.\n */\n$.fn.atomChecked = function (atom: WritableAtom<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindChecked(ctx!, atom), { needsCtx: true });\n};\n\n/**\n * Two-way binding for an entire form.\n */\n$.fn.atomForm = function <T extends object>(\n atom: WritableAtom<T>,\n options: FormOptions<T> = {}\n): JQuery {\n return atomEachElement(\n this,\n (_, el) => {\n if (el instanceof HTMLFormElement) {\n bindForm(el, atom as WritableAtom<object>, options as unknown as FormOptions<unknown>);\n } else {\n debug.log(LOG_PREFIXES.BINDING, 'Skipping non-Form element for atomForm');\n }\n },\n { needsCtx: false }\n );\n};\n\n/**\n * Attaches a lifecycle-aware event handler using the jQuery event system.\n */\n$.fn.atomOn = function (event: string, handler: (e: JQuery.Event) => void): JQuery {\n return atomEachElement(this, (ctx) => bindOn(ctx!, event, handler), { needsCtx: true });\n};\n\n/**\n * Lookup table for reactive binding handlers.\n * Ordered to match the bitmask bits in atomBind.\n */\nconst BIND_HANDLERS: Array<(ctx: BindingContext, options: BindingOptions<unknown>) => void> = [\n (ctx, o) =>\n bindText(ctx, ...(unpack(o.text!) as [AsyncReactiveValue<unknown>, (v: unknown) => string])), // 1 << 0\n (ctx, o) => bindHtml(ctx, o.html!), // 1 << 1\n (ctx, o) => bindClass(ctx, o.class!), // 1 << 2\n (ctx, o) => bindCss(ctx, o.css!), // 1 << 3\n (ctx, o) => bindAttr(ctx, o.attr!), // 1 << 4\n (ctx, o) => bindProp(ctx, o.prop as Record<string, AsyncReactiveValue<unknown>>), // 1 << 5\n (ctx, o) => bindVisibility(ctx, o.show!, false), // 1 << 6\n (ctx, o) => bindVisibility(ctx, o.hide!, true), // 1 << 7\n (ctx, o) => bindVal(ctx, ...(unpack(o.val!) as [WritableAtom<unknown>, ValOptions<unknown>])), // 1 << 8\n (ctx, o) => bindChecked(ctx, o.checked!), // 1 << 9\n (ctx, o) => {\n // 1 << 10: form\n if (ctx.el instanceof HTMLFormElement) {\n bindForm(ctx.el, ...(unpack(o.form!) as [WritableAtom<object>, FormOptions<unknown>]));\n }\n },\n (ctx, o) => bindEvents(ctx, o.on!), // 1 << 11\n];\n\n/**\n * Integrated multi-behavior reactive binding.\n * Uses a bitmask dispatch strategy to minimize branch mispredictions in hot-path.\n */\n$.fn.atomBind = function <T>(this: JQuery, options: BindingOptions<T>): JQuery {\n let mask = 0;\n if (options.text !== undefined) mask |= 1 << 0;\n if (options.html !== undefined) mask |= 1 << 1;\n if (options.class !== undefined) mask |= 1 << 2;\n if (options.css !== undefined) mask |= 1 << 3;\n if (options.attr !== undefined) mask |= 1 << 4;\n if (options.prop !== undefined) mask |= 1 << 5;\n if (options.show !== undefined) mask |= 1 << 6;\n if (options.hide !== undefined) mask |= 1 << 7;\n if (options.val !== undefined) mask |= 1 << 8;\n if (options.checked !== undefined) mask |= 1 << 9;\n if (options.form !== undefined) mask |= 1 << 10;\n if (options.on !== undefined) mask |= 1 << 11;\n\n if (mask === 0) return this;\n\n return atomEachElement(\n this,\n (ctx) => {\n let m = mask;\n while (m > 0) {\n const bit = m & -m;\n const idx = 31 - Math.clz32(bit);\n BIND_HANDLERS[idx]!(ctx!, options as BindingOptions<unknown>);\n m ^= bit;\n }\n },\n { needsCtx: true }\n );\n};\n\n/**\n * Destroys all reactive bindings on the selected elements **and their descendants**.\n */\n$.fn.atomUnbind = function (this: JQuery): JQuery {\n return atomEachElement(this, (_, el) => bindUnbind(el), { needsCtx: false });\n};\n","import $ from 'jquery';\nimport { registry } from '@/core/registry';\n\n/**\n * Ensures an element or jQuery collection is wrapped in a jQuery object.\n */\nexport function wrap($el: Element | JQuery<Element>): JQuery {\n return ($el instanceof Element ? $($el) : $el) as unknown as JQuery;\n}\n\n/**\n * Sets or removes the 'data-atom-key' attribute on a DOM node or a jQuery collection.\n * This attribute is crucial for tracking which item an element belongs to.\n *\n * @param node - The DOM element, node, or jQuery object.\n * @param key - The key string to set, or null to remove it.\n */\nexport function setAtomKey(node: Element | Node | JQuery, key: string | null): void {\n if (node instanceof Element) {\n if (key === null) node.removeAttribute('data-atom-key');\n else node.setAttribute('data-atom-key', key);\n } else if (!(node as Node).nodeType) {\n // JQuery object\n const elOrJq = node as JQuery;\n for (let i = 0, len = elOrJq.length; i < len; i++) {\n const el = elOrJq[i];\n if (el instanceof Element) {\n if (key === null) el.removeAttribute('data-atom-key');\n else el.setAttribute('data-atom-key', key);\n }\n }\n }\n}\n\n/**\n * Cleans up the registry and effects associated with a tree of DOM nodes.\n *\n * @param node - The root element or a jQuery collection potentially containing multiple roots.\n */\nexport function cleanupNodes(node: Element | JQuery): void {\n if (node instanceof Element) {\n registry.cleanupTree(node);\n } else {\n for (let j = 0, nLen = (node as JQuery).length; j < nLen; j++) {\n const el = (node as JQuery)[j];\n if (el instanceof Element) registry.cleanupTree(el);\n }\n }\n}\n","import { LOG_PREFIXES } from '@/constants';\nimport type { EffectObject, ListKey } from '@/types';\nimport { debug } from '@/utils/debug';\nimport { setAtomKey } from './utils';\n\n/**\n * ListContext manages the state of a single atomList instance.\n * It tracks current keys, items, and DOM nodes to perform efficient reconciliation.\n * It also handles asynchronous removal of items and maintains reusable buffers.\n */\nexport class ListContext<T> {\n /** Keys of the items currently in the DOM. */\n oldKeys: ListKey[] = [];\n /** Actual items currently in the DOM. */\n oldItems: T[] = [];\n /** DOM elements or collections corresponding to the items. */\n oldNodes: (Element | JQuery | undefined)[] = [];\n\n /** Keys that are currently in the process of being removed (e.g., during an animation). */\n readonly removingKeys = new Set<ListKey>();\n /** The element displayed when the list is empty. */\n $emptyEl: JQuery | null = null;\n /** Mapping from key to its current index in the oldKeys/oldItems arrays. */\n readonly keyToIndex = new Map<ListKey, number>();\n /** The reactive effect managing this list. */\n fx?: EffectObject;\n\n /** Pre-allocated buffer for storing item states during diffing. */\n statesBuffer = new Uint8Array(256);\n /** Pre-allocated buffer for storing item indices during diffing. */\n indicesBuffer = new Int32Array(256);\n\n constructor(\n public readonly $container: JQuery,\n /** @internal */\n public readonly containerSelector: string,\n public readonly onRemove: (($el: JQuery) => Promise<void> | void) | undefined\n ) {}\n\n /**\n * Schedules the removal of an element, optionally waiting for a promise returned by onRemove.\n *\n * @param k - The key of the item being removed.\n * @param $el - The jQuery collection representing the item's DOM nodes.\n */\n scheduleRemoval(k: ListKey, $el: JQuery): void {\n const commit = () => {\n if (this.fx?.isDisposed) return;\n // Race condition check: If the element has been re-added to the list\n // (indicated by having a data-atom-key again), we must NOT remove it.\n if ($el[0] instanceof Element && $el[0].hasAttribute('data-atom-key')) return;\n\n if ($el[0]?.isConnected) $el.remove();\n this.removingKeys.delete(k);\n debug.log(LOG_PREFIXES.LIST, `${this.containerSelector} removed item:`, k);\n };\n\n const res = this.onRemove?.($el);\n if (res instanceof Promise) res.then(commit, commit);\n else commit();\n }\n\n /**\n * Initiates the removal process for an item.\n *\n * @param k - The key of the item.\n * @param $el - The jQuery collection of the item.\n */\n removeItem(k: ListKey, $el: JQuery): void {\n setAtomKey($el, null); // Clear the key to allow re-addition detection\n this.removingKeys.add(k);\n this.scheduleRemoval(k, $el);\n }\n\n /**\n * Resets the context and cleans up resources.\n */\n dispose(): void {\n this.removingKeys.clear();\n this.oldKeys.length = 0;\n this.oldItems.length = 0;\n this.oldNodes.length = 0;\n this.keyToIndex.clear();\n this.$emptyEl?.remove();\n this.$container.off('.atomList');\n this.statesBuffer = new Uint8Array(0);\n this.indicesBuffer = new Int32Array(0);\n }\n\n /**\n * Ensures that the internal buffers are large enough for the given size.\n *\n * @param size - The required capacity of the buffers.\n */\n ensureBuffers(size: number): void {\n if (this.statesBuffer.length < size) {\n this.statesBuffer = new Uint8Array(Math.max(size, this.statesBuffer.length * 2));\n }\n if (this.indicesBuffer.length < size) {\n this.indicesBuffer = new Int32Array(Math.max(size, this.indicesBuffer.length * 2));\n }\n }\n}\n","import { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type { ListKey, ListKeyFn, ListOptions } from '@/types';\nimport { shallowEqual } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport type { ListContext } from './context';\nimport type { PreparedDiff } from './types';\n\n/**\n * Performs a reconciliation between the current items in the DOM and the new source items.\n * Uses prefix/suffix trimming and a keyed index map for efficient updates.\n *\n * @param ctx - The list context.\n * @param items - The new array of items.\n * @param itemCount - Number of items in the new array.\n * @param getKey - Function to extract a key from an item.\n * @param update - Optional update hook to prevent full re-renders.\n * @param isEqual - Optional equality check function.\n * @param pools - Object containing resource pools for memory management.\n * @returns A PreparedDiff object containing instructions for the DOM update.\n */\nexport function buildIndices<T>(\n ctx: ListContext<T>,\n items: T[],\n itemCount: number,\n getKey: ListKeyFn<T>,\n update: ListOptions<T>['update'],\n isEqual: ListOptions<T>['isEqual'],\n pools: {\n map: { acquire: () => Map<ListKey, number>; release: (m: Map<ListKey, number>) => void };\n set: { acquire: () => Set<ListKey>; release: (s: Set<ListKey>) => void };\n array: { acquire: () => unknown[]; release: (a: unknown[]) => void };\n }\n): PreparedDiff<T> {\n const { oldKeys, oldItems, oldNodes, removingKeys, keyToIndex } = ctx;\n const oldLen = oldKeys.length;\n\n let startIndex = 0,\n oldEndIndex = oldLen - 1,\n newEndIndex = itemCount - 1;\n\n const eq = isEqual || shallowEqual;\n\n // 1. Prefix trimming: Skip items at the beginning that are identical\n while (startIndex <= oldEndIndex && startIndex <= newEndIndex) {\n const item = items[startIndex]!;\n const k = getKey(item, startIndex);\n if (oldKeys[startIndex] !== k || !eq(oldItems[startIndex]!, item) || !oldNodes[startIndex]) {\n break;\n }\n keyToIndex.set(k, startIndex++);\n }\n\n // 2. Suffix trimming: Skip identical items at the end\n while (oldEndIndex >= startIndex && newEndIndex >= startIndex) {\n const item = items[newEndIndex]!;\n const k = getKey(item, newEndIndex);\n if (oldKeys[oldEndIndex] !== k || !eq(oldItems[oldEndIndex]!, item) || !oldNodes[oldEndIndex]) {\n break;\n }\n keyToIndex.set(k, newEndIndex--);\n oldEndIndex--;\n }\n\n // 3. Middle range: Reconcile everything between trimmed prefix and suffix\n const oldIndexMap = pools.map.acquire();\n for (let i = startIndex; i <= oldEndIndex; i++) oldIndexMap.set(oldKeys[i]!, i);\n\n const newKeySet = pools.set.acquire();\n ctx.ensureBuffers(itemCount);\n\n const newKeys = pools.array.acquire() as ListKey[];\n newKeys.length = itemCount;\n const newItems = pools.array.acquire() as T[];\n newItems.length = itemCount;\n const newNodes = pools.array.acquire() as (Element | JQuery | undefined)[];\n newNodes.length = itemCount;\n\n // Track item states:\n // 0: Exists (maybe update)\n // 1: New (create)\n // 2: Force Replace (key exists but content changed significantly/no update fn)\n // 3: Unchanged (trimmed)\n const newStates = ctx.statesBuffer,\n newIndices = ctx.indicesBuffer;\n\n // Items that need to be rendered (either brand new or forced replacement)\n const trKeys = pools.array.acquire() as ListKey[],\n trItems = pools.array.acquire() as T[],\n trIdxs = pools.array.acquire() as number[];\n\n // Fill in prefix (trimmed)\n for (let i = 0; i < startIndex; i++) {\n const k = oldKeys[i]!;\n newKeys[i] = k;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[i]!;\n newStates[i] = 3;\n newIndices[i] = i;\n newKeySet.add(k);\n }\n // Fill in suffix (trimmed)\n for (let j = oldLen - 1, i = itemCount - 1; i > newEndIndex; i--, j--) {\n const k = oldKeys[j]!;\n newKeys[i] = k;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[j]!;\n newStates[i] = 3;\n newIndices[i] = j;\n newKeySet.add(k);\n }\n\n // Iterate middle section\n for (let i = startIndex; i <= newEndIndex; i++) {\n const item = items[i]!,\n k = getKey(item, i);\n newKeys[i] = k;\n newItems[i] = item;\n keyToIndex.set(k, i);\n\n if (newKeySet.has(k)) {\n debug.warn(LOG_PREFIXES.LIST, ERROR_MESSAGES.LIST.DUPLICATE_KEY(k, i, ctx.containerSelector));\n newIndices[i] = -1;\n continue;\n }\n newKeySet.add(k);\n\n const oldIdx = oldIndexMap.get(k);\n if (oldIdx === undefined) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newIndices[i] = -1;\n newStates[i] = 1; // Mark as NEW\n continue;\n }\n\n const oldItem = oldItems[oldIdx]!;\n newNodes[i] = oldNodes[oldIdx]!;\n\n if (\n !update &&\n oldItem !== item &&\n !(isEqual ? isEqual(oldItem, item) : shallowEqual(oldItem, item))\n ) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newStates[i] = 2; // Mark as FORCE REPLACE\n } else {\n newStates[i] = 0; // Mark as EXISTING\n }\n // If the key is currently being removed (ongoing transition),\n // treat it as conceptually fresh for placement logic.\n newIndices[i] = removingKeys.has(k) ? -1 : oldIdx;\n }\n\n pools.map.release(oldIndexMap);\n return {\n newKeys,\n newKeySet,\n newItems,\n newNodes,\n newStates,\n newIndices,\n trKeys,\n trItems,\n trIdxs,\n startIndex,\n oldEndIndex,\n newEndIndex,\n };\n}\n","import $ from 'jquery';\nimport { LOG_PREFIXES } from '@/constants';\nimport type { ListOptions } from '@/types';\nimport { debug } from '@/utils/debug';\nimport { sanitizeHtml } from '@/utils/sanitize';\nimport type { ListContext } from './context';\nimport type { PlaceCallbacks, PreparedDiff } from './types';\nimport { cleanupNodes, setAtomKey, wrap } from './utils';\n\nlet listBatchIdCounter = 0;\n\n/**\n * Helper to insert an element or a jQuery collection before a specific node.\n * Handles both single DOM elements and multi-root jQuery collections.\n *\n * @param elOrJq - The element(s) to insert.\n * @param nextNode - The reference node to insert before.\n * @param container - The parent container.\n */\nexport function insertOrAppend(\n elOrJq: Element | JQuery | undefined,\n nextNode: Node | null,\n container: Element\n): void {\n if (!elOrJq) return;\n if (elOrJq instanceof Element) {\n container.insertBefore(elOrJq, nextNode);\n return;\n }\n const len = elOrJq.length;\n for (let i = 0; i < len; i++) {\n const el = elOrJq[i];\n if (el) {\n container.insertBefore(el, nextNode);\n }\n }\n}\n\n/**\n * Handles the logic when the list becomes empty.\n * Manages the removal of old items and the display of the 'empty' placeholder.\n *\n * @param ctx - The list context.\n * @param itemCount - Current number of items.\n * @param $container - The jQuery container.\n * @param empty - The empty state configuration.\n * @param arrayPool - Resource pool for releasing arrays.\n */\nexport function handleEmpty<T>(\n ctx: ListContext<T>,\n itemCount: number,\n $container: JQuery,\n empty: ListOptions<T>['empty'],\n arrayPool: { release: (arr: unknown[]) => void }\n): void {\n if (ctx.$emptyEl && itemCount > 0) {\n ctx.$emptyEl.remove();\n ctx.$emptyEl = null;\n }\n if (itemCount !== 0) return;\n\n const { oldKeys, oldNodes, onRemove } = ctx;\n if (!onRemove) {\n for (let i = 0, len = oldKeys.length; i < len; i++) ctx.removingKeys.delete(oldKeys[i]!);\n $container.empty();\n } else {\n for (let i = 0, len = oldKeys.length; i < len; i++) {\n const k = oldKeys[i]!;\n if (oldNodes[i]) ctx.removeItem(k, wrap(oldNodes[i] as Element | JQuery<Element>));\n }\n }\n\n if (empty && !ctx.$emptyEl) {\n ctx.$emptyEl = (typeof empty === 'string'\n ? $(sanitizeHtml(empty))\n : $(empty as Element | JQuery)) as unknown as JQuery;\n ctx.$emptyEl.appendTo($container);\n }\n\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes as unknown[]);\n ctx.oldKeys = [];\n ctx.oldItems = [];\n ctx.oldNodes = [];\n}\n\n/**\n * Renders the items that need creation or replacement.\n * Implements batch sanitization and optionally 'initial' optimization using innerHTML.\n *\n * @param diff - The prepared diff.\n * @param options - The list options.\n * @param isInitial - Whether this is the very first render of the list.\n * @returns An array of sanitized HTML strings if initial optimization is possible, null otherwise.\n */\nexport function renderItems<T>(\n diff: PreparedDiff<T>,\n options: ListOptions<T>,\n isInitial: boolean\n): string[] | null {\n const { trKeys, trItems, trIdxs, newNodes, newStates } = diff;\n const renderCount = trKeys.length;\n const renderResults: (string | Element | DocumentFragment | JQuery)[] = new Array(renderCount);\n const htmlParts: string[] = [];\n let stringCount = 0;\n\n for (let t = 0; t < renderCount; t++) {\n const raw = options.render(trItems[t]!, trIdxs[t]!);\n renderResults[t] = raw;\n if (typeof raw === 'string') {\n htmlParts.push(raw);\n stringCount++;\n }\n }\n\n let sanitized: string[] | null = null;\n if (htmlParts.length > 0) {\n if (htmlParts.length === 1) sanitized = [sanitizeHtml(htmlParts[0]!)];\n else {\n const sep = `<template data-atom-sep=\"${(listBatchIdCounter++).toString(36)}\"></template>`;\n sanitized = sanitizeHtml(htmlParts.join(sep)).split(sep);\n }\n }\n\n if (\n isInitial &&\n sanitized &&\n stringCount === renderCount &&\n !options.bind &&\n !options.onAdd &&\n !options.onRemove &&\n !options.events\n ) {\n // ensure each rendered string results in a single node\n if ($.parseHTML(sanitized.join('')).length === renderCount) {\n return sanitized;\n }\n }\n\n let fragIdx = 0;\n for (let t = 0; t < renderCount; t++) {\n const raw = renderResults[t]!;\n const $el = (typeof raw === 'string'\n ? $($.parseHTML(sanitized![fragIdx++]!))\n : $(raw as Element | DocumentFragment | JQuery)) as unknown as JQuery;\n const targetIdx = trIdxs[t]!,\n keyStr = String(trKeys[t]!);\n\n setAtomKey($el, keyStr);\n\n if (newStates[targetIdx] === 2 && newNodes[targetIdx]) {\n const node = newNodes[targetIdx]!;\n cleanupNodes(node as Element | JQuery);\n const $old = wrap(node as Element | JQuery<Element>);\n $old.first().before($el);\n $old.remove();\n }\n newNodes[targetIdx] = $el.length === 1 ? ($el[0] as Element) : $el;\n }\n return null;\n}\n\n/**\n * Identifies and removes items that are no longer present in the list.\n */\nexport function cleanupRemoved<T>(ctx: ListContext<T>, diff: PreparedDiff<T>): void {\n const { startIndex, oldEndIndex, newKeySet } = diff;\n for (let i = startIndex; i <= oldEndIndex; i++) {\n const k = ctx.oldKeys[i]!;\n // If key not in new set and node exists, trigger removal\n if (!newKeySet.has(k) && ctx.oldNodes[i])\n ctx.removeItem(k, wrap(ctx.oldNodes[i] as Element | JQuery<Element>));\n }\n}\n\n/**\n * Places the rendered/updated items into the DOM.\n * Optimizes for both the 'all-new' case and the 'incremental update' case.\n *\n * @param ctx - The list context.\n * @param diff - The prepared diff.\n * @param rawContainer - The raw DOM container element.\n * @param callbacks - Lifecycle hooks.\n * @param innerHtmlFragments - Optional pre-rendered HTML fragments for innerHTML optimization.\n */\nexport function placeItems<T>(\n ctx: ListContext<T>,\n diff: PreparedDiff<T>,\n rawContainer: Element,\n callbacks: PlaceCallbacks<T>,\n innerHtmlFragments: string[] | null\n): void {\n const { newKeys, newItems, newNodes, newStates, newIndices } = diff;\n const itemCount = newKeys.length;\n\n if (innerHtmlFragments !== null) {\n // Fast-path: If rendering the whole list for the first time and no hooks are needed,\n // we can use innerHTML for maximum performance.\n rawContainer.innerHTML = innerHtmlFragments.join('');\n let el = rawContainer.firstElementChild;\n for (let i = 0; i < itemCount; i++) {\n if (!el) break;\n el.setAttribute('data-atom-key', String(newKeys[i]));\n newNodes[i] = el;\n newStates[i] = 0;\n ctx.removingKeys.delete(newKeys[i]!);\n debug.domUpdated(LOG_PREFIXES.LIST, $(el) as unknown as JQuery, 'list.add', newItems[i]);\n el = el.nextElementSibling;\n }\n return;\n }\n\n if (ctx.oldKeys.length === 0 && ctx.removingKeys.size === 0) {\n const frag = document.createDocumentFragment();\n for (let i = 0; i < itemCount; i++) {\n const node = newNodes[i];\n if (!node) continue;\n if (node instanceof Element) frag.appendChild(node);\n else for (let j = 0; j < (node as JQuery).length; j++) frag.appendChild((node as JQuery)[j]!);\n }\n rawContainer.innerHTML = '';\n rawContainer.appendChild(frag);\n } else {\n let nextNode: Node | null = null,\n min = 2147483647;\n for (let i = itemCount - 1; i >= 0; i--) {\n const idx = newIndices[i]!;\n const node = newNodes[i];\n if (!node) continue;\n\n if (idx !== -1 && idx < min) {\n min = idx;\n } else {\n insertOrAppend(node as Element | JQuery, nextNode, rawContainer);\n }\n nextNode = node instanceof Element ? node : ((node as JQuery)[0] ?? null);\n }\n }\n\n for (let i = 0; i < itemCount; i++) {\n const state = newStates[i]!;\n if (state !== 3) {\n const node = newNodes[i];\n if (!node) continue;\n const $el = wrap(node as Element | JQuery<Element>),\n item = newItems[i]!;\n if (state === 0) callbacks.update?.($el, item, i);\n else callbacks.bind?.($el, item, i);\n if (state === 1) {\n callbacks.onAdd?.($el);\n ctx.removingKeys.delete(newKeys[i]!);\n debug.domUpdated(LOG_PREFIXES.LIST, $el, 'list.add', item);\n }\n }\n }\n}\n","import { effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { EffectObject, ListKey, ListKeyFn, ListOptions, ReadonlyAtom } from '@/types';\nimport { getSelector, hasOwn } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport { ArrayPool, ObjectPool } from '@/utils/pool';\nimport { ListContext } from './context';\nimport { buildIndices } from './diff';\nimport { cleanupRemoved, handleEmpty, placeItems, renderItems } from './dom';\nimport type { PlaceCallbacks } from './types';\n\nconst listInstances = new WeakMap<Element, { fx: EffectObject; ctx: ListContext<unknown> }>();\n\n/**\n * Pool for reusing Map objects to minimize GC pressure during diffing.\n */\nconst mapPool = new ObjectPool<Map<ListKey, number>>(\n () => new Map(),\n (m) => m.clear()\n);\n\n/**\n * Pool for reusing Set objects during diffing.\n */\nconst setPool = new ObjectPool<Set<ListKey>>(\n () => new Set(),\n (s) => s.clear()\n);\n\n/**\n * Pool for reusing arrays during diffing.\n */\nconst arrayPool = new ArrayPool<unknown>(100, 1024);\n\nconst pools = {\n map: mapPool,\n set: setPool,\n array: arrayPool,\n};\n\n/**\n * atomList binding for jQuery.\n * Efficiently renders and reconciles a list of items based on an Atom source.\n *\n * @param source - The ReadonlyAtom containing the array of items.\n * @param options - Configuration for rendering, keys, and lifecycle hooks.\n * @returns The original jQuery collection for chaining.\n */\nfunction atomList<T>(this: JQuery, source: ReadonlyAtom<T[]>, options: ListOptions<T>): JQuery {\n const getKey: ListKeyFn<T> =\n typeof options.key === 'function'\n ? options.key\n : (item: T) => item[options.key as keyof T] as unknown as ListKey;\n\n const callbacks: PlaceCallbacks<T> = {\n bind: options.bind,\n update: options.update,\n onAdd: options.onAdd,\n onRemove: options.onRemove,\n events: options.events,\n };\n\n // Each element in the jQuery collection can host a separate list instance.\n for (let cIdx = 0, cLen = this.length; cIdx < cLen; cIdx++) {\n const raw = this[cIdx]!,\n $c = $(raw);\n\n // Clean up existing instance if any\n $c.off('.atomList');\n const old = listInstances.get(raw);\n if (old) {\n old.fx.dispose();\n old.ctx.dispose();\n }\n\n const ctx = new ListContext<T>($c, getSelector(raw), options.onRemove);\n\n // Create a reactive effect that automatically re-runs when 'source' changes\n const fx = effect(() => {\n const items = source.value,\n len = items.length;\n\n // Reconcilation is performance critical, use untracked to avoid\n // accidental dependencies inside the complex logic.\n untracked(() => {\n // 1. Handle empty state\n handleEmpty(ctx, len, $c, options.empty, arrayPool);\n if (len === 0) return;\n\n debug.log(LOG_PREFIXES.LIST, `${ctx.containerSelector} updating with ${len} items`);\n\n // 2. Build diff information (reconciliation)\n const diff = buildIndices(ctx, items, len, getKey, options.update, options.isEqual, pools);\n\n // 3. Render new items (or update existing ones if strings provided)\n const frag = renderItems(diff, options, ctx.oldKeys.length === 0);\n\n // 4. Mark removed items for deletion (handles async transitions)\n cleanupRemoved(ctx, diff);\n\n // 5. Place nodes in the DOM and call lifecycle hooks\n placeItems(ctx, diff, raw, callbacks, frag);\n\n // Update event mapping if needed\n if (options.events) {\n for (let i = diff.startIndex; i <= diff.oldEndIndex; i++) {\n if (!diff.newKeySet.has(ctx.oldKeys[i]!)) ctx.keyToIndex.delete(ctx.oldKeys[i]!);\n }\n }\n\n // Release old memory back to pools\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes as unknown[]);\n\n // Sync context with new state\n ctx.oldKeys = diff.newKeys;\n ctx.oldItems = diff.newItems;\n ctx.oldNodes = diff.newNodes;\n\n // Release diff-specific structures\n setPool.release(diff.newKeySet);\n arrayPool.release(diff.trKeys);\n arrayPool.release(diff.trItems);\n arrayPool.release(diff.trIdxs);\n });\n });\n\n ctx.fx = fx;\n\n // Event delegation support\n if (options.events) {\n for (const ek in options.events) {\n if (!hasOwn.call(options.events, ek)) continue;\n const s = ek.indexOf(' '),\n type = s === -1 ? ek : ek.slice(0, s),\n sel = s === -1 ? '> *' : ek.slice(s + 1).trim();\n const handler = options.events[ek]!;\n\n $c.on(`${type}.atomList`, sel, function (this: Element, e: JQuery.TriggeredEvent) {\n // Use data-atom-key to find the corresponding item in the context\n const itemEl = (e.target as Element).closest?.('[data-atom-key]') as HTMLElement | null;\n const rk = itemEl?.getAttribute('data-atom-key');\n if (rk === null || rk === undefined) return;\n\n let k: ListKey = rk;\n if (!ctx.keyToIndex.has(rk)) {\n const nk = Number(rk); // Try converting to number for key lookup\n if (!Number.isNaN(nk) && ctx.keyToIndex.has(nk)) k = nk;\n }\n const idx = ctx.keyToIndex.get(k);\n if (idx !== undefined) handler.call(itemEl as HTMLElement, ctx.oldItems[idx]!, idx, e);\n });\n }\n }\n\n registry.trackEffect(raw, fx);\n listInstances.set(raw, { fx, ctx });\n registry.trackCleanup(raw, () => {\n ctx.dispose();\n listInstances.delete(raw);\n });\n }\n return this;\n}\n\n$.fn.atomList = atomList;\n","import { batch, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { bindUnbind } from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { atomEachElement } from '@/core/dom';\nimport { registry } from '@/core/registry';\nimport type { ComponentFn } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst EMPTY_PROPS = Object.freeze({});\n\n// ============================================================================\n// jQuery plugin methods\n// ============================================================================\n\n/**\n * Mounts a functional component on each selected element.\n *\n * @param component - Function receiving `($el, props)` and returning an\n * optional cleanup callback. See {@link ComponentFn}.\n * @param props - Props passed to the component. When omitted, `P` must be\n * compatible with an empty object (i.e. all fields optional or\n * `P = object`). Passing no props to a component with required fields is\n * a type error that TypeScript will catch at the call site, but only when\n * `props` is explicitly typed — the `{} as P` fallback is not type-safe\n * for components with required fields, which is why the cast is explicit\n * rather than implicit.\n */\n$.fn.atomMount = function <P>(this: JQuery, component: ComponentFn<P>, props?: P): JQuery {\n const p = (props ?? EMPTY_PROPS) as P;\n const compName = component.name || 'Component';\n\n return atomEachElement(this, (_, el) => {\n registry.cleanupTree(el);\n try {\n // Untracked + Batched execution:\n // prevents component initialization from leaking into parent effects\n // and ensures multiple initial state updates only trigger one flush.\n const teardown = untracked(() => batch(() => component($(el), p)));\n if (typeof teardown === 'function') {\n registry.setComponentCleanup(el, teardown);\n }\n } catch (err) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.ERROR(compName), err);\n }\n });\n};\n\n/**\n * Unmounts the component and disposes all reactive bindings on each selected\n * element and its descendants.\n */\n$.fn.atomUnmount = function (this: JQuery): JQuery {\n return atomEachElement(this, (_, el) => bindUnbind(el));\n};\n","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { computed, atom as createAtom, effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES, ROUTE_DEFAULTS } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { RouteConfig, Router, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// --- Helper: Safe History API Wrappers ---\n\n/**\n * Safely executes history.pushState with a fallback for restricted environments.\n * Prevents crashes in 'file://' protocol or security-restricted contexts.\n *\n * @param data State data to associate with the new history entry\n * @param url The new URL to display in the address bar\n */\nfunction safePushState(data: unknown, url: string | URL | null): void {\n try {\n history.pushState(data, '', url);\n } catch (e) {\n debug.warn(\n LOG_PREFIXES.ROUTE,\n 'PushState failed (likely file:// protocol or security restriction). UI will update, but URL will not.',\n e\n );\n }\n}\n\n/**\n * Solid Implementation of the SPA Router.\n * Supports both standard History API and Hash-based routing.\n * Integrates with atom-effect for reactive route and query parameter tracking.\n */\nclass RouterImpl implements Router {\n /** Reactive atom holding the currently active route name */\n public currentRoute: ReadonlyAtom<string>;\n /** Reactive atom holding the current URL query parameters as an object */\n public queryParams: ReadonlyAtom<Record<string, string>>;\n\n private config: Required<RouteConfig>;\n private readonly isHistoryMode: boolean;\n private readonly basePath: string;\n private readonly activeClass: string;\n\n private isDestroyed = false;\n private previousRoute = '';\n private previousUrl: string;\n /** Global cleanup functions for the router instance */\n private cleanups: Array<() => void> = [];\n /** The root element where routes are rendered */\n private $target: JQuery;\n private currentRouteAtom: WritableAtom<string>;\n private queryParamsAtom: WritableAtom<Record<string, string>>;\n /** Cache for HTMLTemplateElements to avoid repeated DOM lookups */\n private templateCache = new Map<string, HTMLTemplateElement>();\n /** Cleanup functions specific to the currently rendered route (disposed on route change) */\n private routeCleanups: Array<() => void> = [];\n /** Tracker for query string changes to prevent redundant updates */\n private lastRawQuery = '';\n private cachedParams: Record<string, string> = {};\n\n /**\n * Parses a raw query string into a key-value object.\n */\n private parseQueryParams(raw: string): Record<string, string> {\n const res: Record<string, string> = {};\n if (raw) {\n new URLSearchParams(raw).forEach((v, k) => {\n res[k] = v;\n });\n }\n return res;\n }\n\n constructor(config: RouteConfig) {\n // Fill in defaults for missing configuration options\n this.config = {\n mode: ROUTE_DEFAULTS.mode,\n basePath: ROUTE_DEFAULTS.basePath,\n autoBindLinks: ROUTE_DEFAULTS.autoBindLinks,\n activeClass: ROUTE_DEFAULTS.activeClass,\n notFound: config.notFound || '',\n beforeTransition: config.beforeTransition || (() => {}),\n afterTransition: config.afterTransition || (() => {}),\n ...config,\n } as Required<RouteConfig>;\n\n this.isHistoryMode = this.config.mode === 'history';\n // Normalize base path by removing trailing slash\n this.basePath = this.config.basePath.replace(/\\/$/, '');\n this.activeClass = this.config.activeClass;\n\n this.$target = $(this.config.target);\n // Initialize previous URL stack based on mode\n this.previousUrl = this.isHistoryMode ? location.pathname + location.search : location.hash;\n\n // Initialize reactive atoms with current browser state\n this.currentRouteAtom = createAtom(this.getRouteName());\n this.currentRoute = this.currentRouteAtom;\n this.queryParamsAtom = createAtom(this.getQueryParams());\n this.queryParams = computed(() => this.queryParamsAtom.value);\n\n this.init();\n }\n\n /**\n * Sets up event listeners and core reactive effects.\n */\n private init() {\n // Listen for browser navigation (back/forward)\n const event = this.isHistoryMode ? 'popstate' : 'hashchange';\n const handler = this.handleUrlChange.bind(this);\n window.addEventListener(event, handler);\n this.cleanups.push(() => window.removeEventListener(event, handler));\n\n // Reactive effect that handles DOM rendering when the current route atom changes\n const renderEffect = effect(() => {\n const routeName = this.currentRouteAtom.value;\n\n // Dispose old route-specific effects before rendering the new one\n untracked(() => {\n for (const fn of this.routeCleanups) {\n try {\n fn();\n } catch {}\n }\n this.routeCleanups.length = 0;\n });\n\n this.renderRoute(routeName);\n });\n this.cleanups.push(() => renderEffect.dispose());\n\n // Setup automatic link binding for [data-route] elements\n this.setupAutoBindLinks();\n\n // Register with global registry if target exists for auto-destruction\n if (this.$target[0]) {\n registry.trackCleanup(this.$target[0], () => this.destroy());\n }\n }\n\n /**\n * Determines the current route name from the URL based on the routing mode.\n */\n private getRouteName(): string {\n const { default: defaultRoute } = this.config;\n if (this.isHistoryMode) {\n const base = this.basePath;\n let path = location.pathname;\n // Strip base path from the URL to get the logical route\n if (base && (path === base || path.startsWith(`${base}/`))) {\n path = path.substring(base.length);\n }\n return path.replace(/^\\/+/, '') || defaultRoute!;\n }\n const hash = location.hash;\n const { route } = this.splitPath(hash.startsWith('#') ? hash.substring(1) : hash);\n return route || defaultRoute!;\n }\n\n /**\n * Extracts and parses query parameters from the browser URL.\n * Includes primitive caching to skip redundant parsing.\n */\n private getQueryParams(): Record<string, string> {\n const raw = this.getCurrentRawQuery();\n // Optimization: Skip parsing if the raw query string hasn't changed\n if (raw === this.lastRawQuery) return this.cachedParams;\n this.lastRawQuery = raw;\n\n const res = this.parseQueryParams(raw);\n // Deep equality check to prevent downstream reactive triggers if values are identical\n if (this.areParamsEqual(res, this.cachedParams)) return this.cachedParams;\n\n // Validate URI encoding to catch malformed query components\n if (raw.indexOf('%') !== -1) {\n try {\n decodeURIComponent(raw);\n } catch {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.MALFORMED_URI(raw));\n }\n }\n\n this.cachedParams = res;\n return res;\n }\n\n /**\n * Helper to get the raw query string regardless of routing mode.\n */\n private getCurrentRawQuery(): string {\n if (this.isHistoryMode) return location.search.substring(1);\n const hash = location.hash;\n const queryIndex = hash.indexOf('?');\n return queryIndex !== -1 ? hash.substring(queryIndex + 1) : '';\n }\n\n /**\n * Performs shallow comparison of two query parameter objects.\n */\n private areParamsEqual(a: Record<string, string>, b: Record<string, string>): boolean {\n const keysA = Object.keys(a);\n if (keysA.length !== Object.keys(b).length) return false;\n for (const k of keysA) {\n if (a[k] !== b[k]) return false;\n }\n return true;\n }\n\n /**\n * Splits a path string into route and query components.\n * @param path Full string to split (e.g., \"products/list?sort=asc\")\n */\n private splitPath(path: string): { route: string; query: string | undefined } {\n const queryIndex = path.indexOf('?');\n const route = queryIndex !== -1 ? path.slice(0, queryIndex) : path;\n const query = queryIndex !== -1 ? path.slice(queryIndex + 1) : undefined;\n return {\n route: route.replace(/^\\/+/, ''),\n query,\n };\n }\n\n /**\n * Updates the browser URL to match the given route name.\n * @param name Internal route path (e.g., \"login\")\n */\n private setUrl(name: string): void {\n const { route, query } = this.splitPath(name);\n const fullPath = query ? `${route}?${query}` : route;\n const url = this.isHistoryMode ? `${this.basePath}/${fullPath}` : `#${fullPath}`;\n\n if (this.isHistoryMode) {\n safePushState(null, url);\n } else {\n location.hash = url;\n }\n this.previousUrl = this.isHistoryMode ? url : location.hash;\n }\n\n /**\n * Reverts the browser URL to the last known successful state (used for navigation guards).\n */\n private restoreUrl(): void {\n try {\n if (this.isHistoryMode) {\n history.replaceState(null, '', this.previousUrl);\n } else {\n location.hash = this.previousUrl;\n }\n } catch (e) {\n debug.warn(LOG_PREFIXES.ROUTE, 'Restore URL failed', e);\n }\n }\n\n /**\n * Renders the UI content associated with a route name.\n * Handles lifecycle hooks (beforeTransition, onEnter, onMount, afterTransition).\n * Supports both function-based rendering and HTML template cloning.\n *\n * @param name The route name to render\n */\n private renderRoute(name: string): void {\n if (this.isDestroyed || !this.$target[0]) return;\n\n const { routes, notFound, beforeTransition, afterTransition } = this.config;\n // Fallback to 'notFound' route if the requested route doesn't exist\n const cfg = routes[name] ?? (notFound ? routes[notFound] : undefined);\n\n if (!cfg) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.NOT_FOUND(name));\n return;\n }\n\n const params = this.getQueryParams();\n const from = this.previousRoute;\n\n // Trigger global hook before transition starts\n if (beforeTransition) untracked(() => beforeTransition(from, name));\n\n // Flush current view\n this.$target.empty();\n\n let routeParams = params;\n // Process route-level enter guard and parameter resolution\n if (cfg.onEnter) {\n const res = untracked(() => cfg.onEnter!(params, this));\n if (res) routeParams = { ...params, ...res };\n }\n\n // Helper to register per-route cleanup logic (e.g., event listeners or timers)\n const onUnmount = (fn: () => void) => this.routeCleanups.push(fn);\n\n if (cfg.render) {\n // Logic defined in code (custom composition)\n cfg.render(this.$target[0], name, routeParams, onUnmount, this);\n } else if (cfg.template) {\n // Logic defined in HTML <template> tags\n let tmpl = this.templateCache.get(cfg.template);\n if (!tmpl) {\n const el = document.querySelector(cfg.template);\n if (el instanceof HTMLTemplateElement) {\n tmpl = el;\n this.templateCache.set(cfg.template, tmpl);\n } else {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.TEMPLATE_NOT_FOUND(cfg.template));\n return;\n }\n }\n this.$target.append(tmpl.content.cloneNode(true) as DocumentFragment);\n // Run optional mount hook for template-based views\n if (cfg.onMount) {\n cfg.onMount(this.$target.children(), onUnmount, this);\n }\n }\n\n // Trigger global hook after successful transition\n if (afterTransition) untracked(() => afterTransition(from, name));\n this.previousRoute = name;\n }\n\n /**\n * Internal listener for URL changes (back/forward or external hash modification).\n * Executes the onLeave guard before proceeding with navigation.\n */\n private handleUrlChange(): void {\n if (this.isDestroyed) return;\n\n const currentUrl = this.isHistoryMode ? location.pathname + location.search : location.hash;\n // If the URL actually hasn't changed, do nothing\n if (currentUrl === this.previousUrl) return;\n\n const nextRoute = this.getRouteName();\n const oldRoute = this.currentRouteAtom.peek();\n\n if (oldRoute !== nextRoute) {\n // Execute the 'onLeave' guard for the current route\n if (untracked(() => this.config.routes[oldRoute]?.onLeave?.(this)) === false) {\n // If the guard returns false, cancel navigation and revert the URL\n this.restoreUrl();\n return;\n }\n this.currentRouteAtom.value = nextRoute;\n }\n\n // Always update query params to match the new URL\n this.queryParamsAtom.value = this.getQueryParams();\n this.previousUrl = currentUrl;\n }\n\n /**\n * Sets up automatic delegation for all links marked with [data-route].\n * Also initializes a reactive link highlighter for \"active\" states.\n */\n private setupAutoBindLinks(): void {\n if (!this.config.autoBindLinks) return;\n\n // Handle clicks on [data-route] elements globally via delegation\n const onClick = (e: JQuery.TriggeredEvent) => {\n e.preventDefault();\n const r = (e.currentTarget as HTMLElement).dataset.route;\n if (r != null) this.navigate(r);\n };\n $(document).on('click', '[data-route]', onClick);\n this.cleanups.push(() => $(document).off('click', '[data-route]', onClick));\n\n // Reactive effect to toggle active classes and ARIA attributes on relevant links\n let previousActiveNodes: HTMLElement[] = [];\n const activeLinkEffect = effect(() => {\n const routeName = this.currentRouteAtom.value;\n const activeClass = this.activeClass;\n\n untracked(() => {\n // Clear previous state to ensure only the currently active route is highlighted\n for (const el of previousActiveNodes) {\n el.classList.remove(activeClass);\n el.removeAttribute('aria-current');\n }\n\n try {\n const selector = `[data-route=\"${routeName.replace(/\"/g, '\\\\\"')}\"]`;\n const nodes = Array.from(document.querySelectorAll<HTMLElement>(selector));\n for (const el of nodes) {\n el.classList.add(activeClass);\n el.setAttribute('aria-current', 'page');\n }\n previousActiveNodes = nodes;\n } catch {\n previousActiveNodes = [];\n }\n });\n });\n\n this.cleanups.push(() => {\n activeLinkEffect.dispose();\n previousActiveNodes.length = 0;\n });\n }\n\n /**\n * Programmatically navigate to a specified route.\n * Checks the 'onLeave' guard before performing the transition.\n *\n * @param name Route path or full URL (e.g., \"products/1\" or \"info?tab=desc\")\n */\n public navigate(name: string): void {\n if (this.isDestroyed) return;\n\n const old = this.currentRouteAtom.peek();\n // Run exit guard for current route\n if (this.config.routes[old]?.onLeave?.(this) === false) return;\n\n const { route: routePart, query: queryPart } = this.splitPath(name);\n const resolvedRoute = routePart || this.config.default || '';\n if (!resolvedRoute) return;\n\n // Batch atom updates to prevent flickering or multiple partial renders\n $.batch(() => {\n this.setUrl(name);\n\n const nextParams = queryPart ? this.parseQueryParams(queryPart) : {};\n if (!this.areParamsEqual(nextParams, this.queryParamsAtom.peek())) {\n this.queryParamsAtom.value = nextParams;\n }\n this.currentRouteAtom.value = resolvedRoute;\n });\n }\n\n /**\n * Shuts down the router, clearing all event listeners, effects, and caches.\n */\n public destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n for (const fn of this.cleanups) {\n try {\n fn();\n } catch {}\n }\n this.cleanups.length = 0;\n this.templateCache.clear();\n }\n}\n\n/**\n * Factory function to create a new SPA router instance with reactive state management.\n *\n * @param config Configuration for the internal routing engine and route mapping.\n * @returns A Router instance for controlling navigation and tracking state.\n */\nexport function route(config: RouteConfig): Router {\n return new RouterImpl(config);\n}\n\n// Extend jQuery static namespace for easy global access\n$.extend({\n route,\n});\n","import { computed } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { ComputedAtom, FetchError, FetchOptions } from '@/types';\n\n// ============================================================================\n// atomFetch\n// ============================================================================\n\n/**\n * Context for a reactive fetch operation.\n * Manages the lifecycle of a single $.ajax request, including automatic\n * cancellation (via AbortController) and reactive URL/option resolution.\n */\nclass FetchContext<T> {\n private abortController: AbortController | null = null;\n private readonly staticOptions: JQuery.AjaxSettings;\n private readonly ajaxOptionsFn: (() => JQuery.AjaxSettings) | undefined;\n private readonly getUrl: () => string;\n\n /**\n * Optimization: If true, the URL is a static string and doesn't need to be\n * re-evaluated within a reactive scope.\n */\n private readonly isStaticUrl: boolean;\n private readonly staticUrl: string | undefined;\n\n private readonly transformFn: ((val: unknown) => T) | undefined;\n private readonly onErrorFn: ((err: unknown) => void) | undefined;\n\n constructor(urlOrFn: string | (() => string), options: FetchOptions<T>) {\n const isStatic = typeof urlOrFn === 'string';\n this.isStaticUrl = isStatic;\n if (isStatic) {\n this.staticUrl = urlOrFn as string;\n this.getUrl = () => this.staticUrl!;\n } else {\n this.getUrl = urlOrFn as () => string;\n }\n\n this.ajaxOptionsFn =\n typeof options.ajaxOptions === 'function' ? options.ajaxOptions : undefined;\n\n const baseAjax = typeof options.ajaxOptions === 'object' ? options.ajaxOptions : {};\n this.staticOptions = {\n ...baseAjax,\n headers: { ...(baseAjax as JQuery.AjaxSettings)?.headers, ...options.headers },\n };\n if (options.method) {\n this.staticOptions.method = options.method;\n }\n\n this.transformFn = options.transform;\n this.onErrorFn = options.onError;\n }\n\n public abort(): void {\n this.abortController?.abort();\n }\n\n private handleError(err: unknown): never {\n let final: Error;\n if (err && typeof (err as JQuery.jqXHR).readyState !== 'undefined') {\n const x = err as JQuery.jqXHR;\n final = new Error(`Network Error: ${x.statusText || 'Unknown'} (${x.status})`);\n (final as FetchError).jqXHR = x;\n } else {\n final = err instanceof Error ? err : new Error(String(err ?? 'Unknown error'));\n }\n\n if (this.onErrorFn) {\n try {\n this.onErrorFn(final);\n } catch {\n // Suppress errors in error callback\n }\n }\n throw final;\n }\n\n public execute = async (): Promise<T> => {\n this.abort();\n const controller = new AbortController();\n this.abortController = controller;\n const { signal } = controller;\n\n let onAbort: (() => void) | undefined;\n\n try {\n const settings = this.prepareSettings();\n const xhr = $.ajax(settings);\n\n // Link AbortSignal to jqXHR\n onAbort = () => xhr.abort();\n signal.addEventListener('abort', onAbort);\n if (signal.aborted) xhr.abort();\n\n const raw = await xhr;\n return this.transformFn ? this.transformFn(raw) : (raw as T);\n } catch (err) {\n if (signal.aborted) throw this.createAbortError();\n return this.handleError(err);\n } finally {\n if (onAbort) signal.removeEventListener('abort', onAbort);\n if (this.abortController === controller) {\n this.abortController = null;\n }\n }\n };\n\n private prepareSettings(): JQuery.AjaxSettings {\n const dynamicOptions = this.ajaxOptionsFn?.() ?? {};\n return {\n ...this.staticOptions,\n ...dynamicOptions,\n headers: { ...this.staticOptions.headers, ...dynamicOptions.headers },\n url: this.isStaticUrl ? this.staticUrl : this.getUrl(),\n success: undefined,\n error: undefined,\n complete: undefined,\n };\n }\n\n private createAbortError(): Error {\n const e = new Error('AbortError');\n e.name = 'AbortError';\n return e;\n }\n}\n\n/**\n * Creates a declarative reactive AJAX primitive.\n * Wraps core's async `computed` with jQuery's `$.ajax`.\n *\n * Features:\n * - Auto-Cancellation: Aborts pending requests when dependencies change.\n * - Reactive URL: Re-fetches automatically if `urlOrFn` depends on atoms.\n * - Error Isolation: Network errors are captured in .hasError/.lastError.\n */\n$.extend({\n atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T> {\n const ctx = new FetchContext<T>(urlOrFn, options);\n const atomVal = computed(ctx.execute, {\n defaultValue: options.defaultValue,\n lazy: options.eager === false,\n });\n\n const originalDispose = atomVal.dispose.bind(atomVal);\n atomVal.dispose = () => {\n ctx.abort();\n originalDispose();\n };\n\n return Object.assign(atomVal, {\n abort: () => ctx.abort(),\n }) as ComputedAtom<T> & { abort: () => void };\n },\n});\n","/**\n * atom-effect-jquery\n *\n * Brings reactivity to jQuery.\n *\n * Features:\n * - Full CJK IME Support (Input Method Editor).\n * - Auto-cleanup via MutationObserver (No memory leaks).\n * - Debug Mode: Console logging + Visual Highlighting.\n *\n * Type augmentation note:\n * This package extends both `JQuery` and `JQueryStatic` via global interface\n * merging in `types.ts`. Consumers using the `export default $` path will\n * receive the augmented type automatically because the module's side-effect\n * imports apply the augmentation at import time.\n */\n\nimport $ from 'jquery';\nimport '@/core/namespace'; // $.atom, $.computed, etc.\nimport '@/bindings/chainable'; // $.fn.atomText, etc.\nimport '@/bindings/list'; // $.fn.atomList\nimport '@/bindings/mount'; // $.fn.atomMount\nimport '@/features/route'; // $.route\nimport '@/features/fetch'; // $.atomFetch\n\nimport { enablejQueryOverrides } from '@/core/jquery-patch';\nimport { disableAutoCleanup, enableAutoCleanup, registry } from '@/core/registry';\n\n// Global initialization on DOM ready.\n$(() => {\n enablejQueryOverrides();\n if (document.body) {\n enableAutoCleanup(document.body);\n }\n});\n\nexport { disablejQueryOverrides, enablejQueryOverrides } from '@/core/jquery-patch';\nexport { nextTick } from '@/core/namespace';\nexport type {\n BindingOptions,\n ComponentFn,\n ComputedAtom,\n CssBindings,\n CssValue,\n EffectCleanup,\n EffectResult,\n EqualFn,\n FetchOptions,\n ListOptions,\n PrimitiveValue,\n ReactiveValue,\n ReadonlyAtom,\n RenderRoute,\n RouteConfig,\n RouteDefinition,\n RouteLifecycle,\n Router,\n TemplateRoute,\n ValOptions,\n WritableAtom,\n} from '@/types';\nexport { isReactive } from '@/utils';\nexport { disableAutoCleanup, enableAutoCleanup, registry };\n\nexport default $;\n"],"mappings":"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"}
|