@elurjs/core 3.6.2 → 3.7.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/dist/lib/async.cjs +1 -1
  2. package/dist/lib/async.js +1 -1
  3. package/dist/lib/component.cjs +1 -2
  4. package/dist/lib/component.js +2 -66
  5. package/dist/lib/context.cjs +1 -1
  6. package/dist/lib/context.js +35 -23
  7. package/dist/lib/devtools.cjs +1 -1
  8. package/dist/lib/devtools.js +1 -1
  9. package/dist/lib/elur/async.cjs +1 -1
  10. package/dist/lib/elur/async.cjs.map +1 -1
  11. package/dist/lib/elur/async.js +1 -1
  12. package/dist/lib/elur/component.cjs +1 -2
  13. package/dist/lib/elur/component.d.cts +1 -17
  14. package/dist/lib/elur/component.d.ts +1 -17
  15. package/dist/lib/elur/component.js +2 -66
  16. package/dist/lib/elur/context.cjs +1 -1
  17. package/dist/lib/elur/context.cjs.map +1 -1
  18. package/dist/lib/elur/context.d.cts +5 -0
  19. package/dist/lib/elur/context.d.ts +5 -0
  20. package/dist/lib/elur/context.js +35 -23
  21. package/dist/lib/elur/context.js.map +1 -1
  22. package/dist/lib/elur/devtools.cjs +1 -1
  23. package/dist/lib/elur/devtools.cjs.map +1 -1
  24. package/dist/lib/elur/devtools.js +1 -1
  25. package/dist/lib/elur/form.cjs +1 -1
  26. package/dist/lib/elur/form.cjs.map +1 -1
  27. package/dist/lib/elur/form.js +1 -1
  28. package/dist/lib/elur/hydrate/index.cjs +1 -2
  29. package/dist/lib/elur/hydrate/index.d.cts +1 -13
  30. package/dist/lib/elur/hydrate/index.d.ts +1 -13
  31. package/dist/lib/elur/hydrate/index.js +2 -410
  32. package/dist/lib/elur/lifecycle.cjs +1 -1
  33. package/dist/lib/elur/lifecycle.cjs.map +1 -1
  34. package/dist/lib/elur/lifecycle.d.cts +27 -0
  35. package/dist/lib/elur/lifecycle.d.ts +27 -0
  36. package/dist/lib/elur/lifecycle.js +4 -0
  37. package/dist/lib/elur/lifecycle.js.map +1 -1
  38. package/dist/lib/elur/next/component.d.cts +281 -0
  39. package/dist/lib/elur/next/component.d.ts +281 -0
  40. package/dist/lib/elur/next/dom-write.d.cts +18 -0
  41. package/dist/lib/elur/next/dom-write.d.ts +18 -0
  42. package/dist/lib/elur/next/hydrate.d.cts +14 -0
  43. package/dist/lib/elur/next/hydrate.d.ts +14 -0
  44. package/dist/lib/elur/next/keyed-diff.d.cts +46 -0
  45. package/dist/lib/elur/next/keyed-diff.d.ts +46 -0
  46. package/dist/lib/elur/next/mount-helpers.d.cts +25 -0
  47. package/dist/lib/elur/next/mount-helpers.d.ts +25 -0
  48. package/dist/lib/elur/next/mount.d.cts +29 -0
  49. package/dist/lib/elur/next/mount.d.ts +29 -0
  50. package/dist/lib/elur/next/node-binding.d.cts +6 -0
  51. package/dist/lib/elur/next/node-binding.d.ts +6 -0
  52. package/dist/lib/elur/next/reactivity.d.cts +193 -0
  53. package/dist/lib/elur/next/reactivity.d.ts +193 -0
  54. package/dist/lib/elur/next-2/component.cjs +2 -0
  55. package/dist/lib/elur/next-2/component.cjs.map +1 -0
  56. package/dist/lib/elur/next-2/component.d.cts +283 -0
  57. package/dist/lib/elur/next-2/component.d.ts +283 -0
  58. package/dist/lib/elur/next-2/component.js +340 -0
  59. package/dist/lib/elur/next-2/component.js.map +1 -0
  60. package/dist/lib/elur/next-2/dom-write.cjs +2 -0
  61. package/dist/lib/elur/next-2/dom-write.cjs.map +1 -0
  62. package/dist/lib/elur/next-2/dom-write.d.cts +18 -0
  63. package/dist/lib/elur/next-2/dom-write.d.ts +18 -0
  64. package/dist/lib/elur/next-2/dom-write.js +31 -0
  65. package/dist/lib/elur/next-2/dom-write.js.map +1 -0
  66. package/dist/lib/elur/next-2/hydrate.cjs +2 -0
  67. package/dist/lib/elur/next-2/hydrate.cjs.map +1 -0
  68. package/dist/lib/elur/next-2/hydrate.d.cts +30 -0
  69. package/dist/lib/elur/next-2/hydrate.d.ts +30 -0
  70. package/dist/lib/elur/next-2/hydrate.js +449 -0
  71. package/dist/lib/elur/next-2/hydrate.js.map +1 -0
  72. package/dist/lib/elur/next-2/keyed-diff.cjs +2 -0
  73. package/dist/lib/elur/next-2/keyed-diff.cjs.map +1 -0
  74. package/dist/lib/elur/next-2/keyed-diff.d.cts +79 -0
  75. package/dist/lib/elur/next-2/keyed-diff.d.ts +79 -0
  76. package/dist/lib/elur/next-2/keyed-diff.js +208 -0
  77. package/dist/lib/elur/next-2/keyed-diff.js.map +1 -0
  78. package/dist/lib/elur/next-2/mount-helpers.cjs +2 -0
  79. package/dist/lib/elur/next-2/mount-helpers.cjs.map +1 -0
  80. package/dist/lib/elur/next-2/mount-helpers.d.cts +25 -0
  81. package/dist/lib/elur/next-2/mount-helpers.d.ts +25 -0
  82. package/dist/lib/elur/next-2/mount-helpers.js +87 -0
  83. package/dist/lib/elur/next-2/mount-helpers.js.map +1 -0
  84. package/dist/lib/elur/next-2/mount.cjs +2 -0
  85. package/dist/lib/elur/next-2/mount.cjs.map +1 -0
  86. package/dist/lib/elur/next-2/mount.d.cts +29 -0
  87. package/dist/lib/elur/next-2/mount.d.ts +29 -0
  88. package/dist/lib/elur/next-2/mount.js +34 -0
  89. package/dist/lib/elur/next-2/mount.js.map +1 -0
  90. package/dist/lib/elur/next-2/node-binding.cjs +2 -0
  91. package/dist/lib/elur/next-2/node-binding.cjs.map +1 -0
  92. package/dist/lib/elur/next-2/node-binding.d.cts +6 -0
  93. package/dist/lib/elur/next-2/node-binding.d.ts +6 -0
  94. package/dist/lib/elur/next-2/node-binding.js +130 -0
  95. package/dist/lib/elur/next-2/node-binding.js.map +1 -0
  96. package/dist/lib/elur/next-2/reactivity.cjs +2 -0
  97. package/dist/lib/elur/next-2/reactivity.cjs.map +1 -0
  98. package/dist/lib/elur/next-2/reactivity.d.cts +220 -0
  99. package/dist/lib/elur/next-2/reactivity.d.ts +220 -0
  100. package/dist/lib/elur/next-2/reactivity.js +614 -0
  101. package/dist/lib/elur/next-2/reactivity.js.map +1 -0
  102. package/dist/lib/elur/next-2/scheduler.cjs +2 -0
  103. package/dist/lib/elur/next-2/scheduler.cjs.map +1 -0
  104. package/dist/lib/elur/next-2/scheduler.d.cts +23 -0
  105. package/dist/lib/elur/next-2/scheduler.d.ts +23 -0
  106. package/dist/lib/elur/next-2/scheduler.js +26 -0
  107. package/dist/lib/elur/next-2/scheduler.js.map +1 -0
  108. package/dist/lib/elur/plugins.cjs +1 -1
  109. package/dist/lib/elur/plugins.cjs.map +1 -1
  110. package/dist/lib/elur/plugins.js +1 -1
  111. package/dist/lib/elur/reactivity.cjs +1 -2
  112. package/dist/lib/elur/reactivity.d.cts +1 -67
  113. package/dist/lib/elur/reactivity.d.ts +1 -67
  114. package/dist/lib/elur/reactivity.js +2 -218
  115. package/dist/lib/elur/router.cjs +1 -1
  116. package/dist/lib/elur/router.cjs.map +1 -1
  117. package/dist/lib/elur/router.js +1 -1
  118. package/dist/lib/elur/server/index.cjs +1 -1
  119. package/dist/lib/elur/server/index.cjs.map +1 -1
  120. package/dist/lib/elur/server/index.js +175 -107
  121. package/dist/lib/elur/server/index.js.map +1 -1
  122. package/dist/lib/elur/store.cjs +1 -1
  123. package/dist/lib/elur/store.cjs.map +1 -1
  124. package/dist/lib/elur/store.js +1 -1
  125. package/dist/lib/elur/template/bindings.cjs +1 -1
  126. package/dist/lib/elur/template/bindings.cjs.map +1 -1
  127. package/dist/lib/elur/template/bindings.js +98 -84
  128. package/dist/lib/elur/template/bindings.js.map +1 -1
  129. package/dist/lib/elur/template/dom-write.d.cts +1 -5
  130. package/dist/lib/elur/template/dom-write.d.ts +1 -5
  131. package/dist/lib/elur/template/error-boundary.cjs +1 -1
  132. package/dist/lib/elur/template/error-boundary.cjs.map +1 -1
  133. package/dist/lib/elur/template/error-boundary.js +56 -50
  134. package/dist/lib/elur/template/error-boundary.js.map +1 -1
  135. package/dist/lib/elur/template/html.cjs +1 -1
  136. package/dist/lib/elur/template/html.cjs.map +1 -1
  137. package/dist/lib/elur/template/html.js +40 -37
  138. package/dist/lib/elur/template/html.js.map +1 -1
  139. package/dist/lib/elur/template/index.cjs +1 -1
  140. package/dist/lib/elur/template/index.d.cts +2 -1
  141. package/dist/lib/elur/template/index.d.ts +2 -1
  142. package/dist/lib/elur/template/index.js +13 -12
  143. package/dist/lib/elur/template/keyed-diff.d.cts +1 -32
  144. package/dist/lib/elur/template/keyed-diff.d.ts +1 -32
  145. package/dist/lib/elur/template/keyed.cjs +1 -1
  146. package/dist/lib/elur/template/keyed.cjs.map +1 -1
  147. package/dist/lib/elur/template/keyed.d.cts +10 -2
  148. package/dist/lib/elur/template/keyed.d.ts +10 -2
  149. package/dist/lib/elur/template/keyed.js +12 -1
  150. package/dist/lib/elur/template/keyed.js.map +1 -1
  151. package/dist/lib/elur/template/mount-helpers.d.cts +1 -29
  152. package/dist/lib/elur/template/mount-helpers.d.ts +1 -29
  153. package/dist/lib/elur/template/node-binding.d.cts +1 -6
  154. package/dist/lib/elur/template/node-binding.d.ts +1 -6
  155. package/dist/lib/elur/template/portal.cjs +1 -1
  156. package/dist/lib/elur/template/portal.cjs.map +1 -1
  157. package/dist/lib/elur/template/portal.js +1 -1
  158. package/dist/lib/elur/template/transitions.cjs +1 -1
  159. package/dist/lib/elur/template/transitions.cjs.map +1 -1
  160. package/dist/lib/elur/template/transitions.js +2 -2
  161. package/dist/lib/elur/template/types.cjs +1 -1
  162. package/dist/lib/elur/template/types.cjs.map +1 -1
  163. package/dist/lib/elur/template/types.d.cts +55 -0
  164. package/dist/lib/elur/template/types.d.ts +55 -0
  165. package/dist/lib/elur/template/types.js +5 -1
  166. package/dist/lib/elur/template/types.js.map +1 -1
  167. package/dist/lib/elur.cjs +1 -1
  168. package/dist/lib/elur.js +2 -2
  169. package/dist/lib/form.cjs +1 -1
  170. package/dist/lib/form.js +1 -1
  171. package/dist/lib/hydrate.cjs +1 -2
  172. package/dist/lib/hydrate.js +2 -410
  173. package/dist/lib/index.cjs +1 -1
  174. package/dist/lib/index.js +2 -2
  175. package/dist/lib/lifecycle.cjs +1 -1
  176. package/dist/lib/lifecycle.js +4 -0
  177. package/dist/lib/plugins.cjs +1 -1
  178. package/dist/lib/plugins.js +1 -1
  179. package/dist/lib/router.cjs +1 -1
  180. package/dist/lib/router.js +1 -1
  181. package/dist/lib/server.cjs +1 -1
  182. package/dist/lib/server.js +175 -107
  183. package/dist/lib/signals.cjs +1 -2
  184. package/dist/lib/signals.js +2 -218
  185. package/dist/lib/store.cjs +1 -1
  186. package/dist/lib/store.js +1 -1
  187. package/dist/lib/template.cjs +1 -1
  188. package/dist/lib/template.js +13 -12
  189. package/package.json +7 -9
  190. package/dist/lib/elur/component.cjs.map +0 -1
  191. package/dist/lib/elur/component.js.map +0 -1
  192. package/dist/lib/elur/hydrate/index.cjs.map +0 -1
  193. package/dist/lib/elur/hydrate/index.js.map +0 -1
  194. package/dist/lib/elur/reactivity.cjs.map +0 -1
  195. package/dist/lib/elur/reactivity.js.map +0 -1
  196. package/dist/lib/elur/template/dom-write.cjs +0 -2
  197. package/dist/lib/elur/template/dom-write.cjs.map +0 -1
  198. package/dist/lib/elur/template/dom-write.js +0 -16
  199. package/dist/lib/elur/template/dom-write.js.map +0 -1
  200. package/dist/lib/elur/template/keyed-diff.cjs +0 -2
  201. package/dist/lib/elur/template/keyed-diff.cjs.map +0 -1
  202. package/dist/lib/elur/template/keyed-diff.js +0 -100
  203. package/dist/lib/elur/template/keyed-diff.js.map +0 -1
  204. package/dist/lib/elur/template/mount-helpers.cjs +0 -2
  205. package/dist/lib/elur/template/mount-helpers.cjs.map +0 -1
  206. package/dist/lib/elur/template/mount-helpers.js +0 -132
  207. package/dist/lib/elur/template/mount-helpers.js.map +0 -1
  208. package/dist/lib/elur/template/node-binding.cjs +0 -2
  209. package/dist/lib/elur/template/node-binding.cjs.map +0 -1
  210. package/dist/lib/elur/template/node-binding.js +0 -95
  211. package/dist/lib/elur/template/node-binding.js.map +0 -1
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Elur "next" — grafo reactivo push-pull versionado (experimental).
3
+ *
4
+ * Módulo aislado de `../reactivity.ts` (PLAN_TECNICO_ELUR_NEXT §B.3–B.9):
5
+ * nunca importar ambos en el mismo path de producción — mezclar signals de
6
+ * dos grafos rompe la semántica.
7
+ *
8
+ * Modelo:
9
+ * - PUSH: signal.set() → version++ → invalida consumidores (DIRTY directos,
10
+ * CHECK transitivos) y encola effects una sola vez. No recalcula nada.
11
+ * - PULL: antes de ejecutar un effect se estabilizan sus fuentes — los
12
+ * computeds DIRTY/CHECK se refrescan recursivamente y sólo propagan si el
13
+ * resultado realmente cambió (early cutoff por versión).
14
+ * - Liveness: un computed sin consumidores vivos no se suscribe a sus
15
+ * fuentes; se refresca por sondeo de versiones al leerse (O(1) si el
16
+ * epoch global no cambió).
17
+ * - Edges: `Link` doble-enlazado compartido entre la lista de sources del
18
+ * consumidor y la de consumers del productor — subscribe/remove O(1),
19
+ * reutilizados entre evaluaciones (mark & sweep por `evalMark`).
20
+ */
21
+ /** Cualquier cosa que pueda poseer consumidores: Owner raíz, Effect, Computed. */
22
+ export interface OwnerLike {
23
+ /**
24
+ * Cabeza de la lista doblemente enlazada de hijos poseídos (effects,
25
+ * computeds, sub-owners). Lista intrusiva — el unregistro de un hijo es
26
+ * O(1) (antes: array con indexOf+splice O(n), que hacía el clear de
27
+ * listas grandes O(n²) — el gap de `09_clear1k` en Krausest).
28
+ */
29
+ childrenHead: (Disposable & OwnerLike) | null;
30
+ /** Número de hijos vivos — `childCount` para diagnóstico/tests. */
31
+ childCount: number;
32
+ /** Cleanups registrados con onCleanup() durante la última evaluación. */
33
+ cleanups: (() => void)[] | null;
34
+ /** Owner que era activo cuando este nodo fue creado (árbol de owners). */
35
+ parent: OwnerLike | null;
36
+ /** Links intrusivos al sibling anterior/siguiente en la lista del padre. */
37
+ nextOwned: (Disposable & OwnerLike) | null;
38
+ prevOwned: (Disposable & OwnerLike) | null;
39
+ /**
40
+ * A.16: boundary por owner — un consumidor sin handler propio burbujea
41
+ * el error por la cadena de owners hasta que uno lo maneja (true).
42
+ */
43
+ onOwnerError?: (err: unknown) => boolean;
44
+ }
45
+ export interface Disposable {
46
+ dispose(): void;
47
+ }
48
+ /** Raíz de ownership explícita (un mount, un test, un sub-árbol). */
49
+ export declare class Owner implements OwnerLike, Disposable {
50
+ childrenHead: (Disposable & OwnerLike) | null;
51
+ childCount: number;
52
+ cleanups: (() => void)[] | null;
53
+ parent: OwnerLike | null;
54
+ nextOwned: (Disposable & OwnerLike) | null;
55
+ prevOwned: (Disposable & OwnerLike) | null;
56
+ onOwnerError?: (err: unknown) => boolean;
57
+ private _disposed;
58
+ dispose(): void;
59
+ }
60
+ /** Owner actual — para diagnóstico e integración con el kernel de mounts. */
61
+ export declare function getOwner(): OwnerLike | null;
62
+ /**
63
+ * Ejecuta fn con `owner` como dueño activo. Todo effect/computed creado
64
+ * dentro queda poseído por él y se destruye con él.
65
+ */
66
+ export declare function runWithOwner<T>(owner: OwnerLike | null, fn: () => T): T;
67
+ /**
68
+ * Raíz reactiva: `const dispose = createRoot(d => {...})`. Todo lo creado
69
+ * dentro muere con `dispose()` — elimina la clase de leaks de B.2.5.
70
+ */
71
+ export declare function createRoot<T>(fn: (dispose: () => void) => T): T;
72
+ /** Registra una limpieza en el owner activo (effect, computed o root). */
73
+ export declare function onCleanup(fn: () => void): void;
74
+ /**
75
+ * B.9: ciclo de efectos — un write dentro de un effect re-encola trabajo; si
76
+ * un nodo corre más de MAX_RUNS_PER_FLUSH en el mismo flush, es un bucle.
77
+ * El mensaje incluye el camino de dependencias del efecto (sus fuentes y,
78
+ * si son computeds, las suyas) para localizar el ciclo.
79
+ */
80
+ export declare class ReactiveCycleError extends Error {
81
+ constructor(effect: ConsumerNode, runs: number);
82
+ }
83
+ interface ErrorHandler {
84
+ (err: unknown): void;
85
+ }
86
+ /** @internal */
87
+ export declare function _pushErrorHandler(h: ErrorHandler): void;
88
+ /** @internal */
89
+ export declare function _popErrorHandler(): void;
90
+ export interface _SignalDebugHooks {
91
+ onCreate?: (signal: Signal<any>, initialValue: unknown) => void;
92
+ onWrite?: (signal: Signal<any>, value: unknown) => void;
93
+ }
94
+ /** @internal */
95
+ export declare function _setSignalDebugHooks(hooks: _SignalDebugHooks | null): void;
96
+ /** @internal — añade suscriptor sin reemplazar; devuelve unsubscribe. */
97
+ export declare function _addSignalDebugHooks(hooks: _SignalDebugHooks): () => void;
98
+ /** @internal — la nueva impl no tiene notify buffer; se expone para paridad. */
99
+ export declare function _getNotifyBufSize(): number;
100
+ interface ProducerNode {
101
+ /** Incrementa en cada cambio real de valor. */
102
+ version: number;
103
+ /**
104
+ * B.12.4 (durabilidad, Salsa): producer estático — nunca cambia.
105
+ * `link()` no crea edge: cero bookkeeping para deps estáticas.
106
+ */
107
+ durable?: boolean;
108
+ /** Nº de links vivos en `consumersHead` (liveness del productor). */
109
+ liveCount: number;
110
+ consumersHead: Link | null;
111
+ }
112
+ /**
113
+ * Edge compartido: vive en dos listas a la vez — la de sources del consumer
114
+ * (`nextSource/prevSource`) y la de consumers del producer
115
+ * (`nextTarget/prevTarget`). `mark` lo usa el consumer para decidir qué
116
+ * links sobrevivieron a la última evaluación; `linked` indica si está
117
+ * insertado en la lista del producer (los computeds fríos no lo están).
118
+ */
119
+ interface Link {
120
+ source: ProducerNode;
121
+ target: ConsumerNode;
122
+ seenVersion: number;
123
+ mark: number;
124
+ linked: boolean;
125
+ nextSource: Link | null;
126
+ prevSource: Link | null;
127
+ nextTarget: Link | null;
128
+ prevTarget: Link | null;
129
+ }
130
+ interface ConsumerNode {
131
+ state: number;
132
+ sourcesHead: Link | null;
133
+ /** Contador de evaluación — marca los links usados en esta pasada. */
134
+ evalMark: number;
135
+ live(): boolean;
136
+ }
137
+ export declare class Signal<T> implements ProducerNode {
138
+ version: number;
139
+ liveCount: number;
140
+ durable: boolean;
141
+ consumersHead: Link | null;
142
+ private _v;
143
+ constructor(initialValue: T);
144
+ get value(): T;
145
+ set value(newValue: T);
146
+ update(fn: (current: T) => T): void;
147
+ peek(): T;
148
+ dispose(): void;
149
+ }
150
+ export declare class Computed<T> extends Signal<T> implements ConsumerNode, OwnerLike {
151
+ state: number;
152
+ sourcesHead: Link | null;
153
+ evalMark: number;
154
+ /** Último epoch en que se verificó fresco — sondeo O(1) para fríos. */
155
+ lastCleanEpoch: number;
156
+ childrenHead: (Disposable & OwnerLike) | null;
157
+ childCount: number;
158
+ nextOwned: (Disposable & OwnerLike) | null;
159
+ prevOwned: (Disposable & OwnerLike) | null;
160
+ cleanups: (() => void)[] | null;
161
+ parent: OwnerLike | null;
162
+ _value: T | undefined;
163
+ fn: () => T;
164
+ equals: (a: T, b: T) => boolean;
165
+ flags: number;
166
+ /** B.12.1: transientes del DFS de refresh (null entre refreshes). */
167
+ _pCursor: Link | null;
168
+ _pLink: Link | null;
169
+ constructor(fn: () => T, equals?: (a: T, b: T) => boolean);
170
+ live(): boolean;
171
+ get value(): T;
172
+ peek(): T;
173
+ dispose(): void;
174
+ }
175
+ export declare function signal<T>(initialValue: T): Signal<T>;
176
+ /**
177
+ * B.12.4 (durabilidad): signal estática — `link()` no crea edges sobre ella,
178
+ * así que dependencias estáticas no cuestan bookkeeping ni checks de refresh.
179
+ * Escribirla rompe el contrato (warn en dev); el valor no se propaga.
180
+ */
181
+ export declare function constSignal<T>(value: T): Signal<T>;
182
+ export declare function computed<T>(fn: () => T, equals?: (a: T, b: T) => boolean): Computed<T>;
183
+ /** Corre una vez al crear; re-corre sólo si una fuente cambió de verdad. */
184
+ export declare function effect(fn: () => void | (() => void)): () => void;
185
+ /**
186
+ * @internal — effect de render (bindings DOM internos): se encola en la
187
+ * cola de render, que se drena ANTES que la de user effects (B.8). La API
188
+ * pública `effect()` sigue siendo la de usuario.
189
+ */
190
+ export declare function _renderEffect(fn: () => void | (() => void)): () => void;
191
+ export declare function batch<T>(fn: () => T): T;
192
+ export declare function untrack<T>(fn: () => T): T;
193
+ export interface WatchOptions {
194
+ immediate?: boolean;
195
+ once?: boolean;
196
+ }
197
+ export declare function watch<T>(source: Signal<T> | (() => T), cb: (value: T, oldValue: T | undefined) => void, options?: WatchOptions): () => void;
198
+ export declare function nextTick(fn?: () => void): Promise<void>;
199
+ /**
200
+ * @internal — binding de texto especializado (C.6): `node.nodeValue` sigue
201
+ * `fn()` con el mínimo consumer posible. `null`/`false`/`undefined` → "".
202
+ * Devuelve disposer (mata la suscripción; el caller remueve el nodo).
203
+ */
204
+ export declare function _bindText(node: {
205
+ nodeValue: string | null;
206
+ }, fn: () => unknown): () => void;
207
+ /**
208
+ * @internal — C.6 T1: suscripción directa señal→writer. El writer corre una
209
+ * vez al montar (valor inicial) y por cada cambio real de la señal, en la
210
+ * cola de render. Devuelve disposer.
211
+ */
212
+ export declare function _bindSignal<T>(source: Signal<T>, write: (v: T) => void): () => void;
213
+ /**
214
+ * @internal — C.7 T2: suscripción directa señal→(getter derivado)→writer.
215
+ * Equivale a `_bindSignal(dep, () => write(get()))` con compare incluido,
216
+ * pero sin el closure intermedio ni el double-compare: un solo binding.
217
+ * Devuelve disposer.
218
+ */
219
+ export declare function _bindDerived<T>(source: Signal<unknown>, get: () => T, write: (v: T) => void): () => void;
220
+ export {};
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Elur "next" — grafo reactivo push-pull versionado (experimental).
3
+ *
4
+ * Módulo aislado de `../reactivity.ts` (PLAN_TECNICO_ELUR_NEXT §B.3–B.9):
5
+ * nunca importar ambos en el mismo path de producción — mezclar signals de
6
+ * dos grafos rompe la semántica.
7
+ *
8
+ * Modelo:
9
+ * - PUSH: signal.set() → version++ → invalida consumidores (DIRTY directos,
10
+ * CHECK transitivos) y encola effects una sola vez. No recalcula nada.
11
+ * - PULL: antes de ejecutar un effect se estabilizan sus fuentes — los
12
+ * computeds DIRTY/CHECK se refrescan recursivamente y sólo propagan si el
13
+ * resultado realmente cambió (early cutoff por versión).
14
+ * - Liveness: un computed sin consumidores vivos no se suscribe a sus
15
+ * fuentes; se refresca por sondeo de versiones al leerse (O(1) si el
16
+ * epoch global no cambió).
17
+ * - Edges: `Link` doble-enlazado compartido entre la lista de sources del
18
+ * consumidor y la de consumers del productor — subscribe/remove O(1),
19
+ * reutilizados entre evaluaciones (mark & sweep por `evalMark`).
20
+ */
21
+ /** Cualquier cosa que pueda poseer consumidores: Owner raíz, Effect, Computed. */
22
+ export interface OwnerLike {
23
+ /**
24
+ * Cabeza de la lista doblemente enlazada de hijos poseídos (effects,
25
+ * computeds, sub-owners). Lista intrusiva — el unregistro de un hijo es
26
+ * O(1) (antes: array con indexOf+splice O(n), que hacía el clear de
27
+ * listas grandes O(n²) — el gap de `09_clear1k` en Krausest).
28
+ */
29
+ childrenHead: (Disposable & OwnerLike) | null;
30
+ /** Número de hijos vivos — `childCount` para diagnóstico/tests. */
31
+ childCount: number;
32
+ /** Cleanups registrados con onCleanup() durante la última evaluación. */
33
+ cleanups: (() => void)[] | null;
34
+ /** Owner que era activo cuando este nodo fue creado (árbol de owners). */
35
+ parent: OwnerLike | null;
36
+ /** Links intrusivos al sibling anterior/siguiente en la lista del padre. */
37
+ nextOwned: (Disposable & OwnerLike) | null;
38
+ prevOwned: (Disposable & OwnerLike) | null;
39
+ /**
40
+ * A.16: boundary por owner — un consumidor sin handler propio burbujea
41
+ * el error por la cadena de owners hasta que uno lo maneja (true).
42
+ */
43
+ onOwnerError?: (err: unknown) => boolean;
44
+ }
45
+ export interface Disposable {
46
+ dispose(): void;
47
+ }
48
+ /** Raíz de ownership explícita (un mount, un test, un sub-árbol). */
49
+ export declare class Owner implements OwnerLike, Disposable {
50
+ childrenHead: (Disposable & OwnerLike) | null;
51
+ childCount: number;
52
+ cleanups: (() => void)[] | null;
53
+ parent: OwnerLike | null;
54
+ nextOwned: (Disposable & OwnerLike) | null;
55
+ prevOwned: (Disposable & OwnerLike) | null;
56
+ onOwnerError?: (err: unknown) => boolean;
57
+ private _disposed;
58
+ dispose(): void;
59
+ }
60
+ /** Owner actual — para diagnóstico e integración con el kernel de mounts. */
61
+ export declare function getOwner(): OwnerLike | null;
62
+ /**
63
+ * Ejecuta fn con `owner` como dueño activo. Todo effect/computed creado
64
+ * dentro queda poseído por él y se destruye con él.
65
+ */
66
+ export declare function runWithOwner<T>(owner: OwnerLike | null, fn: () => T): T;
67
+ /**
68
+ * Raíz reactiva: `const dispose = createRoot(d => {...})`. Todo lo creado
69
+ * dentro muere con `dispose()` — elimina la clase de leaks de B.2.5.
70
+ */
71
+ export declare function createRoot<T>(fn: (dispose: () => void) => T): T;
72
+ /** Registra una limpieza en el owner activo (effect, computed o root). */
73
+ export declare function onCleanup(fn: () => void): void;
74
+ /**
75
+ * B.9: ciclo de efectos — un write dentro de un effect re-encola trabajo; si
76
+ * un nodo corre más de MAX_RUNS_PER_FLUSH en el mismo flush, es un bucle.
77
+ * El mensaje incluye el camino de dependencias del efecto (sus fuentes y,
78
+ * si son computeds, las suyas) para localizar el ciclo.
79
+ */
80
+ export declare class ReactiveCycleError extends Error {
81
+ constructor(effect: ConsumerNode, runs: number);
82
+ }
83
+ interface ErrorHandler {
84
+ (err: unknown): void;
85
+ }
86
+ /** @internal */
87
+ export declare function _pushErrorHandler(h: ErrorHandler): void;
88
+ /** @internal */
89
+ export declare function _popErrorHandler(): void;
90
+ export interface _SignalDebugHooks {
91
+ onCreate?: (signal: Signal<any>, initialValue: unknown) => void;
92
+ onWrite?: (signal: Signal<any>, value: unknown) => void;
93
+ }
94
+ /** @internal */
95
+ export declare function _setSignalDebugHooks(hooks: _SignalDebugHooks | null): void;
96
+ /** @internal — añade suscriptor sin reemplazar; devuelve unsubscribe. */
97
+ export declare function _addSignalDebugHooks(hooks: _SignalDebugHooks): () => void;
98
+ /** @internal — la nueva impl no tiene notify buffer; se expone para paridad. */
99
+ export declare function _getNotifyBufSize(): number;
100
+ interface ProducerNode {
101
+ /** Incrementa en cada cambio real de valor. */
102
+ version: number;
103
+ /**
104
+ * B.12.4 (durabilidad, Salsa): producer estático — nunca cambia.
105
+ * `link()` no crea edge: cero bookkeeping para deps estáticas.
106
+ */
107
+ durable?: boolean;
108
+ /** Nº de links vivos en `consumersHead` (liveness del productor). */
109
+ liveCount: number;
110
+ consumersHead: Link | null;
111
+ }
112
+ /**
113
+ * Edge compartido: vive en dos listas a la vez — la de sources del consumer
114
+ * (`nextSource/prevSource`) y la de consumers del producer
115
+ * (`nextTarget/prevTarget`). `mark` lo usa el consumer para decidir qué
116
+ * links sobrevivieron a la última evaluación; `linked` indica si está
117
+ * insertado en la lista del producer (los computeds fríos no lo están).
118
+ */
119
+ interface Link {
120
+ source: ProducerNode;
121
+ target: ConsumerNode;
122
+ seenVersion: number;
123
+ mark: number;
124
+ linked: boolean;
125
+ nextSource: Link | null;
126
+ prevSource: Link | null;
127
+ nextTarget: Link | null;
128
+ prevTarget: Link | null;
129
+ }
130
+ interface ConsumerNode {
131
+ state: number;
132
+ sourcesHead: Link | null;
133
+ /** Contador de evaluación — marca los links usados en esta pasada. */
134
+ evalMark: number;
135
+ live(): boolean;
136
+ }
137
+ export declare class Signal<T> implements ProducerNode {
138
+ version: number;
139
+ liveCount: number;
140
+ durable: boolean;
141
+ consumersHead: Link | null;
142
+ private _v;
143
+ constructor(initialValue: T);
144
+ get value(): T;
145
+ set value(newValue: T);
146
+ update(fn: (current: T) => T): void;
147
+ peek(): T;
148
+ dispose(): void;
149
+ }
150
+ export declare class Computed<T> extends Signal<T> implements ConsumerNode, OwnerLike {
151
+ state: number;
152
+ sourcesHead: Link | null;
153
+ evalMark: number;
154
+ /** Último epoch en que se verificó fresco — sondeo O(1) para fríos. */
155
+ lastCleanEpoch: number;
156
+ childrenHead: (Disposable & OwnerLike) | null;
157
+ childCount: number;
158
+ nextOwned: (Disposable & OwnerLike) | null;
159
+ prevOwned: (Disposable & OwnerLike) | null;
160
+ cleanups: (() => void)[] | null;
161
+ parent: OwnerLike | null;
162
+ _value: T | undefined;
163
+ fn: () => T;
164
+ equals: (a: T, b: T) => boolean;
165
+ flags: number;
166
+ /** B.12.1: transientes del DFS de refresh (null entre refreshes). */
167
+ _pCursor: Link | null;
168
+ _pLink: Link | null;
169
+ constructor(fn: () => T, equals?: (a: T, b: T) => boolean);
170
+ live(): boolean;
171
+ get value(): T;
172
+ peek(): T;
173
+ dispose(): void;
174
+ }
175
+ export declare function signal<T>(initialValue: T): Signal<T>;
176
+ /**
177
+ * B.12.4 (durabilidad): signal estática — `link()` no crea edges sobre ella,
178
+ * así que dependencias estáticas no cuestan bookkeeping ni checks de refresh.
179
+ * Escribirla rompe el contrato (warn en dev); el valor no se propaga.
180
+ */
181
+ export declare function constSignal<T>(value: T): Signal<T>;
182
+ export declare function computed<T>(fn: () => T, equals?: (a: T, b: T) => boolean): Computed<T>;
183
+ /** Corre una vez al crear; re-corre sólo si una fuente cambió de verdad. */
184
+ export declare function effect(fn: () => void | (() => void)): () => void;
185
+ /**
186
+ * @internal — effect de render (bindings DOM internos): se encola en la
187
+ * cola de render, que se drena ANTES que la de user effects (B.8). La API
188
+ * pública `effect()` sigue siendo la de usuario.
189
+ */
190
+ export declare function _renderEffect(fn: () => void | (() => void)): () => void;
191
+ export declare function batch<T>(fn: () => T): T;
192
+ export declare function untrack<T>(fn: () => T): T;
193
+ export interface WatchOptions {
194
+ immediate?: boolean;
195
+ once?: boolean;
196
+ }
197
+ export declare function watch<T>(source: Signal<T> | (() => T), cb: (value: T, oldValue: T | undefined) => void, options?: WatchOptions): () => void;
198
+ export declare function nextTick(fn?: () => void): Promise<void>;
199
+ /**
200
+ * @internal — binding de texto especializado (C.6): `node.nodeValue` sigue
201
+ * `fn()` con el mínimo consumer posible. `null`/`false`/`undefined` → "".
202
+ * Devuelve disposer (mata la suscripción; el caller remueve el nodo).
203
+ */
204
+ export declare function _bindText(node: {
205
+ nodeValue: string | null;
206
+ }, fn: () => unknown): () => void;
207
+ /**
208
+ * @internal — C.6 T1: suscripción directa señal→writer. El writer corre una
209
+ * vez al montar (valor inicial) y por cada cambio real de la señal, en la
210
+ * cola de render. Devuelve disposer.
211
+ */
212
+ export declare function _bindSignal<T>(source: Signal<T>, write: (v: T) => void): () => void;
213
+ /**
214
+ * @internal — C.7 T2: suscripción directa señal→(getter derivado)→writer.
215
+ * Equivale a `_bindSignal(dep, () => write(get()))` con compare incluido,
216
+ * pero sin el closure intermedio ni el double-compare: un solo binding.
217
+ * Devuelve disposer.
218
+ */
219
+ export declare function _bindDerived<T>(source: Signal<unknown>, get: () => T, write: (v: T) => void): () => void;
220
+ export {};