@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
@@ -1,410 +1,2 @@
1
- import { effect as e } from "./signals.js";
2
- import { ELUR_RENDER_PROTOCOL as t, ELUR_TEMPLATE_DESCRIPTOR as n, isElurTemplate as r, isKeyedList as i } from "./elur/template/types.js";
3
- import { isElurComponent as a } from "./lifecycle.js";
4
- import { _captureContextSnapshot as o, _popComponentContext as s, _pushComponentContext as c } from "./context.js";
5
- import { deserializeRepeatKey as l, normalizeRepeatKey as u, serializeRepeatKey as d } from "./elur/template/keyed.js";
6
- import { createKeyedMount as f, reconcileKeyedList as p } from "./elur/template/keyed-diff.js";
7
- import { sanitizeUrl as m } from "./elur/template/sanitize.js";
8
- import { activateDelegatedEvent as h, isDelegableEvent as g } from "./elur/template/bindings.js";
9
- //#region src/elur/hydrate/index.ts
10
- function _(e, t, r = {}) {
11
- try {
12
- if (a(e)) return v(e, t, r);
13
- let i = e[n];
14
- return i || j(r, -1, "descriptor", "Template has no hydration descriptor"), { unmount: y(i, t, r) };
15
- } catch (n) {
16
- if (r.mismatch === "throw") throw n;
17
- return r.mismatch !== "remount" && console.warn("[elur] Hydration mismatch; remounting root:", n), t.replaceChildren(), { unmount: a(e) ? e.render()._render(t, null) : e._render(t, null) };
18
- }
19
- }
20
- function v(e, t, r) {
21
- c();
22
- let i = () => {};
23
- try {
24
- try {
25
- e.onInit?.();
26
- } catch (t) {
27
- if (e.onError) e.onError(t);
28
- else throw t;
29
- }
30
- let a = e.render()[n];
31
- a || j(r, -1, "descriptor", "Component template has no hydration descriptor"), i = y(a, t, r);
32
- } finally {
33
- s();
34
- }
35
- let a = e.onMount?.();
36
- return { unmount() {
37
- e.onUnmount?.(), typeof a == "function" && a(), i();
38
- } };
39
- }
40
- function y(e, t, n, r) {
41
- let i = b(t, r), a = [];
42
- for (let t = 0; t < e.contexts.length; t++) {
43
- let r = e.contexts[t], o = e.values[t];
44
- if (r.type === "event") {
45
- let e = i.events.get(t);
46
- e || j(n, t, "event", `Missing event marker ${t}`), e.removeAttribute(`data-elur-e-${t}`), a.push(S(e, r.eventName, r.modifiers, o));
47
- continue;
48
- }
49
- if (r.type === "attr") {
50
- let e = i.attributes.get(t);
51
- e || j(n, t, "attribute", `Missing attribute marker ${t}`), e.removeAttribute(`data-elur-a-${t}`), a.push(C(e, r.attrName, r.url === !0, o));
52
- continue;
53
- }
54
- let s = i.nodes.get(t);
55
- s || j(n, t, "node", `Missing node marker ${t}`);
56
- let c = w(s, o, n, i.keyed.get(t), i.arrayItems.get(t));
57
- c && a.push(c);
58
- }
59
- return () => {
60
- for (let e = a.length - 1; e >= 0; e--) a[e]();
61
- };
62
- }
63
- function b(e, t) {
64
- let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), c = [], l = [], u = [], d = document.createTreeWalker(e, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT), f;
65
- for (; f = d.nextNode();) {
66
- if (t && !x(f, t)) continue;
67
- if (f.nodeType === Node.COMMENT_NODE) {
68
- let e = f, t = /^elur-(\d+)$/.exec(e.data);
69
- if (t) {
70
- let n = Number(t[1]);
71
- c.length === 0 && r.set(n, e), c.push(n);
72
- continue;
73
- }
74
- let i = /^elur-end-(\d+)$/.exec(e.data);
75
- if (i) {
76
- let t = Number(i[1]);
77
- if (c.pop() === t && c.length === 0) {
78
- let i = r.get(t);
79
- i && n.set(t, {
80
- start: i,
81
- end: e
82
- });
83
- }
84
- continue;
85
- }
86
- let a = /^elur-ki:(.+)$/.exec(e.data);
87
- if (a) {
88
- let t = a[1];
89
- l.length === 0 && c.length === 1 ? l.push({
90
- start: e,
91
- serializedKey: t,
92
- parentIndex: c[c.length - 1]
93
- }) : l.push({
94
- start: e,
95
- serializedKey: t,
96
- parentIndex: -1
97
- });
98
- continue;
99
- }
100
- if (e.data === "elur-ke") {
101
- let t = l.pop();
102
- if (t) {
103
- if (t.parentIndex >= 0) {
104
- let n = o.get(t.parentIndex) ?? [];
105
- n.push({
106
- start: t.start,
107
- end: e,
108
- serializedKey: t.serializedKey
109
- }), o.set(t.parentIndex, n);
110
- }
111
- } else throw Error("[elur] Hydration marker mismatch: orphan keyed end marker (elur-ke)");
112
- continue;
113
- }
114
- if (e.data === "elur-ai") {
115
- u.length === 0 && c.length === 1 ? u.push({
116
- start: e,
117
- parentIndex: c[c.length - 1]
118
- }) : u.push({
119
- start: e,
120
- parentIndex: -1
121
- });
122
- continue;
123
- }
124
- if (e.data === "elur-aiend") {
125
- let t = u.pop();
126
- if (t && t.parentIndex >= 0) {
127
- let n = s.get(t.parentIndex) ?? [];
128
- n.push({
129
- start: t.start,
130
- end: e
131
- }), s.set(t.parentIndex, n);
132
- }
133
- continue;
134
- }
135
- continue;
136
- }
137
- if (c.length > 0) continue;
138
- let e = f;
139
- for (let t of Array.from(e.attributes)) {
140
- let n = /^data-elur-e-(\d+)$/.exec(t.name);
141
- n && a.set(Number(n[1]), e);
142
- let r = /^data-elur-a-(\d+)$/.exec(t.name);
143
- r && i.set(Number(r[1]), e);
144
- }
145
- }
146
- return {
147
- nodes: n,
148
- attributes: i,
149
- events: a,
150
- keyed: o,
151
- arrayItems: s
152
- };
153
- }
154
- function x(e, t) {
155
- let n = document.createRange();
156
- return n.setStartAfter(t.start), n.setEndBefore(t.end), n.intersectsNode(e);
157
- }
158
- function S(e, t, n, r) {
159
- if (typeof r != "function") throw TypeError(`Event "${t}" requires a function`);
160
- let i = r;
161
- if (g(t) && !n.includes("capture") && !n.includes("once") && document.body.contains(e)) return h(e, t, n, i);
162
- let a = {
163
- once: n.includes("once"),
164
- capture: n.includes("capture"),
165
- passive: n.includes("passive")
166
- }, o = (e) => {
167
- n.includes("prevent") && e.preventDefault(), n.includes("stop") && e.stopPropagation(), !(n.includes("self") && e.target !== e.currentTarget) && i(e);
168
- };
169
- return e.addEventListener(t, o, a), () => e.removeEventListener(t, o, a);
170
- }
171
- function C(t, n, r, i) {
172
- if (n === "ref") {
173
- let e = i;
174
- return e.el = t, () => {
175
- e.el = null;
176
- };
177
- }
178
- let a = (n === "value" || n === "checked" || n === "selected") && n in t, o = !0, s = !1, c = (e) => {
179
- if (a) if (!o) t[n] = e ?? "";
180
- else {
181
- let r = t[n];
182
- if (String(r) !== String(e ?? "") && !s) {
183
- s = !0;
184
- let e = n === "checked" || n === "selected" ? "change" : "input";
185
- queueMicrotask(() => {
186
- s = !1, t.dispatchEvent(new Event(e, { bubbles: !0 }));
187
- });
188
- }
189
- }
190
- else if (e == null || e === !1) t.removeAttribute(n);
191
- else {
192
- let i = r ? m(String(e)) : String(e);
193
- t.setAttribute(n, i);
194
- }
195
- o = !1;
196
- };
197
- return typeof i == "function" ? e(() => c(i())) : (c(i), () => {});
198
- }
199
- function w(t, n, r, a, s) {
200
- if (typeof n != "function") return T(t, n, r, a, s);
201
- let c = !0, l, u = k(t), d = null, m = o(), h = f(m), g = (e) => {
202
- console.warn(`[elur] repeat(): duplicate key "${e}". Keys must be unique; the previous entry leaks (orphaned nodes + live effects).`);
203
- }, _ = e(() => {
204
- let e = n();
205
- if (i(e)) {
206
- if (c && !d) {
207
- let n = E(e, a, r);
208
- d = {
209
- state: n.state,
210
- prevOrder: n.prevOrder
211
- }, l = n.cleanup, p({
212
- zoneStart: t.start,
213
- anchor: t.end,
214
- state: d.state,
215
- prevOrder: d.prevOrder,
216
- list: e,
217
- mount: h,
218
- ctxSnapshot: m,
219
- onDuplicateKey: g
220
- }), u = null, c = !1;
221
- return;
222
- }
223
- d || (l?.(), A(t), d = {
224
- state: /* @__PURE__ */ new Map(),
225
- prevOrder: []
226
- }, l = () => {
227
- for (let e of d.state.values()) e.cleanup();
228
- }), p({
229
- zoneStart: t.start,
230
- anchor: t.end,
231
- state: d.state,
232
- prevOrder: d.prevOrder,
233
- list: e,
234
- mount: h,
235
- ctxSnapshot: m,
236
- onDuplicateKey: g
237
- }), u = null, c = !1;
238
- return;
239
- }
240
- d && (l?.(), A(t), d = null, l = void 0), typeof e == "string" || typeof e == "number" || typeof e == "bigint" ? u ? u.nodeValue !== String(e) && (u.nodeValue = String(e)) : (u = document.createTextNode(String(e)), t.end.parentNode.insertBefore(u, t.end)) : c ? l = T(t, e, r, a, s) : (l?.(), A(t), l = O(t, e), u = k(t)), c = !1;
241
- });
242
- return () => {
243
- _(), l?.();
244
- };
245
- }
246
- function T(e, l, u, d, m) {
247
- if (i(l)) {
248
- let t = o(), n = E(l, d, u);
249
- return p({
250
- zoneStart: e.start,
251
- anchor: e.end,
252
- state: n.state,
253
- prevOrder: n.prevOrder,
254
- list: l,
255
- mount: f(t),
256
- ctxSnapshot: t,
257
- onDuplicateKey: (e) => {
258
- console.warn(`[elur] repeat(): duplicate key "${e}". Keys must be unique; the previous entry leaks (orphaned nodes + live effects).`);
259
- }
260
- }), n.cleanup;
261
- }
262
- if (Array.isArray(l)) {
263
- let t = [], n = m !== void 0 && m.length > 0;
264
- for (let r = 0; r < l.length; r++) {
265
- let i = l[r], a = m?.[r];
266
- if (n && a) {
267
- let e = T(a, i, u);
268
- e && t.push(e);
269
- } else if (n) {
270
- let n = O(e, i);
271
- n && t.push(n);
272
- } else {
273
- let n = T(e, i, u);
274
- n && t.push(n);
275
- }
276
- }
277
- return t.length ? () => {
278
- for (let e = t.length - 1; e >= 0; e--) t[e]();
279
- } : void 0;
280
- }
281
- if (r(l)) {
282
- let t = l[n];
283
- return t || j(u, -1, "descriptor", "Nested template has no hydration descriptor"), y(t, e.start.parentNode, u, e);
284
- }
285
- if (a(l)) {
286
- c();
287
- let t;
288
- try {
289
- try {
290
- l.onInit?.();
291
- } catch (e) {
292
- if (l.onError) l.onError(e);
293
- else throw e;
294
- }
295
- let r = l.render()[n];
296
- r || j(u, -1, "descriptor", "Nested component has no hydration descriptor");
297
- let i = y(r, e.start.parentNode, u, e), a = l.onMount?.();
298
- t = () => {
299
- l.onUnmount?.(), typeof a == "function" && a(), i();
300
- };
301
- } finally {
302
- s();
303
- }
304
- return t;
305
- }
306
- if (typeof l == "object" && l) {
307
- let n = l[t];
308
- if (n?.hydrateDom) return n.hydrateDom({
309
- parent: e.start.parentNode,
310
- bounds: e,
311
- context: u.context,
312
- render: (t) => T(e, t, u)
313
- }) ?? void 0;
314
- }
315
- }
316
- function E(e, t, n) {
317
- let r = /* @__PURE__ */ new Map(), i = [];
318
- if (!t || t.length === 0) return {
319
- state: r,
320
- prevOrder: i,
321
- cleanup: () => {}
322
- };
323
- let a = /* @__PURE__ */ new Map();
324
- for (let t = 0; t < e.items.length; t++) {
325
- let n = u(e.keyFn(e.items[t], t), t), r = d(n);
326
- a.has(r) && console.warn(`[elur] repeat(): duplicate client key "${n}" during hydration. Keys must be unique; entries after the first leak.`), a.set(r, t);
327
- }
328
- for (let o of t) {
329
- let t = a.get(o.serializedKey);
330
- if (t === void 0) {
331
- D(o);
332
- continue;
333
- }
334
- let s = e.items[t], c = u(e.keyFn(s, t), t);
335
- if (d(c) !== o.serializedKey && console.warn(`[elur] repeat(): hydration key mismatch at index ${t} (${l(o.serializedKey)} != ${c}). The SSR item is adopted by position.`), r.has(c)) {
336
- console.warn(`[elur] repeat(): duplicate key "${c}" during hydration; removing duplicate SSR node.`), D(o);
337
- continue;
338
- }
339
- let f = e.renderFn(s, t), p = T({
340
- start: o.start,
341
- end: o.end
342
- }, f, n);
343
- r.set(c, {
344
- start: o.start,
345
- end: o.end,
346
- cleanup: p ?? (() => {})
347
- }), i.push(c);
348
- }
349
- return {
350
- state: r,
351
- prevOrder: i,
352
- cleanup: () => {
353
- for (let e of r.values()) e.cleanup();
354
- }
355
- };
356
- }
357
- function D(e) {
358
- let t = e.start.nextSibling;
359
- for (; t && t !== e.end;) {
360
- let e = t.nextSibling;
361
- t.parentNode?.removeChild(t), t = e;
362
- }
363
- e.start.parentNode?.removeChild(e.start), e.end.parentNode?.removeChild(e.end);
364
- }
365
- function O(e, t) {
366
- if (t == null || t === !1 || t === !0) return;
367
- if (Array.isArray(t)) {
368
- let n = [];
369
- for (let r of t) {
370
- let t = O(e, r);
371
- t && n.push(t);
372
- }
373
- return n.length ? () => {
374
- for (let e = n.length - 1; e >= 0; e--) n[e]();
375
- } : void 0;
376
- }
377
- if (r(t)) return t._render(e.end.parentNode, e.end);
378
- if (a(t)) return t.render()._render(e.end.parentNode, e.end);
379
- let n = document.createTextNode(String(t));
380
- return e.end.parentNode.insertBefore(n, e.end), () => n.parentNode?.removeChild(n);
381
- }
382
- function k(e) {
383
- let t = e.start.nextSibling;
384
- for (; t && t !== e.end;) {
385
- if (t.nodeType === Node.TEXT_NODE) return t;
386
- t = t.nextSibling;
387
- }
388
- return null;
389
- }
390
- function A(e) {
391
- let t = e.start.nextSibling;
392
- for (; t && t !== e.end;) {
393
- let e = t.nextSibling;
394
- t.parentNode?.removeChild(t), t = e;
395
- }
396
- }
397
- function j(e, t, n, r) {
398
- let i = {
399
- index: t,
400
- kind: n,
401
- message: r
402
- };
403
- e.onMismatch?.(i);
404
- let a = /* @__PURE__ */ Error(`[elur] Hydration marker mismatch: ${r}`);
405
- throw Object.assign(a, { mismatch: i }), a;
406
- }
407
- //#endregion
408
- export { _ as hydrate };
409
-
410
- //# sourceMappingURL=hydrate.js.map
1
+ import { _hydrateNodeRange as e, hydrate as t } from "./elur/next-2/hydrate.js";
2
+ export { e as _hydrateNodeRange, t as hydrate };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./signals.cjs`),t=require(`./elur/template/types.cjs`),n=require(`./lifecycle.cjs`),r=require(`./context.cjs`),i=require(`./elur/template/keyed.cjs`),a=require(`./elur/template/bindings.cjs`),o=require(`./elur/template/html.cjs`),s=require(`./elur/template/raw.cjs`),c=require(`./elur/template/transitions.cjs`),l=require(`./elur/template/portal.cjs`),u=require(`./elur/template/error-boundary.cjs`),d=require(`./elur/router-registry.cjs`),f=require(`./component.cjs`),p=require(`./store.cjs`),m=require(`./plugins.cjs`),h=require(`./router.cjs`),g=require(`./async.cjs`),_=require(`./form.cjs`);exports.ELUR_RENDER_PROTOCOL=t.ELUR_RENDER_PROTOCOL,exports.ELUR_TEMPLATE_DESCRIPTOR=t.ELUR_TEMPLATE_DESCRIPTOR,exports.ElurComponent=n.ElurComponent,exports.Link=h.Link,exports.RouterKey=d.RouterKey,exports.RouterView=h.RouterView,exports.Signal=e.Signal,exports._hasActiveRouter=h._hasActiveRouter,exports.batch=e.batch,exports.bridgePlugin=m.bridgePlugin,exports.computed=e.computed,exports.createErrorBoundary=u.createErrorBoundary,exports.createForm=_.createForm,exports.createInjectionKey=r.createInjectionKey,exports.createPortalOutlet=l.createPortalOutlet,exports.createRouter=h.createRouter,exports.createStore=p.createStore,exports.createValidator=_.createValidator,exports.effect=e.effect,exports.elurField=_.elurField,exports.elurFieldArray=_.elurFieldArray,exports.elurRouter=h.elurRouter,exports.email=_.email,exports.extendValidators=_.extendValidators,exports.guardPlugin=m.guardPlugin,exports.html=o.html,exports.inject=r.inject,exports.injectOutlet=l.injectOutlet,exports.lazy=g.lazy,exports.loggerPlugin=m.loggerPlugin,exports.max=_.max,exports.maxLength=_.maxLength,exports.min=_.min,exports.minLength=_.minLength,exports.mount=f.mount,exports.nextTick=e.nextTick,exports.pattern=_.pattern,exports.persistPlugin=m.persistPlugin,exports.portal=l.portal,exports.portalOutlet=l.portalOutlet,exports.provide=r.provide,exports.provideOutlet=l.provideOutlet,exports.raw=s.raw,exports.ref=t.ref,exports.repeat=i.repeat,exports.required=_.required,exports.showWhen=a.showWhen,exports.signal=e.signal,exports.suspend=g.suspend,exports.templateFeatures=t.templateFeatures,exports.transition=c.transition,exports.untrack=e.untrack,exports.validators=_.validators,exports.watch=e.watch;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./elur/next-2/reactivity.cjs`),t=require(`./elur/template/types.cjs`),n=require(`./lifecycle.cjs`),r=require(`./context.cjs`),i=require(`./elur/template/keyed.cjs`),a=require(`./elur/template/bindings.cjs`),o=require(`./elur/template/html.cjs`),s=require(`./elur/template/raw.cjs`),c=require(`./elur/template/transitions.cjs`),l=require(`./elur/template/portal.cjs`),u=require(`./elur/template/error-boundary.cjs`),d=require(`./elur/router-registry.cjs`),f=require(`./elur/next-2/mount.cjs`),p=require(`./store.cjs`),m=require(`./plugins.cjs`),h=require(`./router.cjs`),g=require(`./async.cjs`),_=require(`./form.cjs`);exports.ELUR_RENDER_PROTOCOL=t.ELUR_RENDER_PROTOCOL,exports.ELUR_TEMPLATE_DESCRIPTOR=t.ELUR_TEMPLATE_DESCRIPTOR,exports.ElurComponent=n.ElurComponent,exports.Link=h.Link,exports.RouterKey=d.RouterKey,exports.RouterView=h.RouterView,exports.Signal=e.Signal,exports._hasActiveRouter=h._hasActiveRouter,exports.batch=e.batch,exports.bridgePlugin=m.bridgePlugin,exports.computed=e.computed,exports.createErrorBoundary=u.createErrorBoundary,exports.createForm=_.createForm,exports.createInjectionKey=r.createInjectionKey,exports.createPortalOutlet=l.createPortalOutlet,exports.createRouter=h.createRouter,exports.createStore=p.createStore,exports.createValidator=_.createValidator,exports.effect=e.effect,exports.elurField=_.elurField,exports.elurFieldArray=_.elurFieldArray,exports.elurRouter=h.elurRouter,exports.email=_.email,exports.extendValidators=_.extendValidators,exports.guardPlugin=m.guardPlugin,exports.html=o.html,exports.inject=r.inject,exports.injectOutlet=l.injectOutlet,exports.lazy=g.lazy,exports.loggerPlugin=m.loggerPlugin,exports.max=_.max,exports.maxLength=_.maxLength,exports.min=_.min,exports.minLength=_.minLength,exports.mount=f.mount,exports.nextTick=e.nextTick,exports.pattern=_.pattern,exports.persistPlugin=m.persistPlugin,exports.portal=l.portal,exports.portalOutlet=l.portalOutlet,exports.provide=r.provide,exports.provideOutlet=l.provideOutlet,exports.raw=s.raw,exports.ref=t.ref,exports.repeat=i.repeat,exports.required=_.required,exports.showWhen=a.showWhen,exports.signal=e.signal,exports.suspend=g.suspend,exports.templateFeatures=t.templateFeatures,exports.transition=c.transition,exports.untrack=e.untrack,exports.validators=_.validators,exports.watch=e.watch;
package/dist/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Signal as e, batch as t, computed as n, effect as r, nextTick as i, signal as a, untrack as o, watch as s } from "./signals.js";
1
+ import { Signal as e, batch as t, computed as n, effect as r, nextTick as i, signal as a, untrack as o, watch as s } from "./elur/next-2/reactivity.js";
2
2
  import { ELUR_RENDER_PROTOCOL as c, ELUR_TEMPLATE_DESCRIPTOR as l, ref as u, templateFeatures as d } from "./elur/template/types.js";
3
3
  import { ElurComponent as f } from "./lifecycle.js";
4
4
  import { createInjectionKey as p, inject as m, provide as h } from "./context.js";
@@ -10,7 +10,7 @@ import { transition as b } from "./elur/template/transitions.js";
10
10
  import { createPortalOutlet as x, injectOutlet as S, portal as C, portalOutlet as w, provideOutlet as T } from "./elur/template/portal.js";
11
11
  import { createErrorBoundary as E } from "./elur/template/error-boundary.js";
12
12
  import { RouterKey as D } from "./elur/router-registry.js";
13
- import { mount as O } from "./component.js";
13
+ import { mount as O } from "./elur/next-2/mount.js";
14
14
  import { createStore as k } from "./store.js";
15
15
  import { bridgePlugin as A, guardPlugin as j, loggerPlugin as M, persistPlugin as N } from "./plugins.js";
16
16
  import { Link as P, RouterView as F, _hasActiveRouter as I, createRouter as L, elurRouter as R } from "./router.js";
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=class{__isElurComponent=!0;children;_debugName;_slots=new Map;setChildren(e){return this.children=e,this}setSlot(e,t){return this._slots.set(e,t),this}slot(e){return this._slots.get(e)}setDebugName(e){return this._debugName=e,this}};function t(e){return typeof e==`object`&&!!e&&e.__isElurComponent===!0}var n=Symbol.for(`@elurjs/core/reactivity-state`);function r(){let e=globalThis,t=e[n];return t||(t={},e[n]=t),t}function i(e){let t=e.componentDebugHookSet;if(!t||t.size===0){e.componentDebugHooks=null;return}if(t.size===1){e.componentDebugHooks=t.values().next().value??null;return}e.componentDebugHooks={onMountStart(e){for(let n of t)n.onMountStart?.(e)},onMountEnd(e){for(let n of t)n.onMountEnd?.(e)},onUnmount(e){for(let n of t)n.onUnmount?.(e)}}}function a(e){let t=r(),n=new Set;e&&n.add(e),t.componentDebugHookSet=n,i(t)}function o(e){let t=r(),n=t.componentDebugHookSet;return n||(n=new Set,t.componentDebugHooks&&n.add(t.componentDebugHooks),t.componentDebugHookSet=n),n.add(e),i(t),()=>{n.delete(e),i(t)}}function s(e){r().componentDebugHooks?.onMountStart?.(e)}function c(e){r().componentDebugHooks?.onMountEnd?.(e)}function l(e){r().componentDebugHooks?.onUnmount?.(e)}exports.ElurComponent=e,exports._addComponentDebugHooks=o,exports._debugComponentMountEnd=c,exports._debugComponentMountStart=s,exports._debugComponentUnmount=l,exports._setComponentDebugHooks=a,exports.isElurComponent=t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=class{__isElurComponent=!0;children;_debugName;_slots=new Map;setChildren(e){return this.children=e,this}setSlot(e,t){return this._slots.set(e,t),this}slot(e){return this._slots.get(e)}_controllers;addController(e){(this._controllers??=[]).push(e)}setDebugName(e){return this._debugName=e,this}};function t(e){return typeof e==`object`&&!!e&&e.__isElurComponent===!0}var n=Symbol.for(`@elurjs/core/reactivity-state`);function r(){let e=globalThis,t=e[n];return t||(t={},e[n]=t),t}function i(e){let t=e.componentDebugHookSet;if(!t||t.size===0){e.componentDebugHooks=null;return}if(t.size===1){e.componentDebugHooks=t.values().next().value??null;return}e.componentDebugHooks={onMountStart(e){for(let n of t)n.onMountStart?.(e)},onMountEnd(e){for(let n of t)n.onMountEnd?.(e)},onUnmount(e){for(let n of t)n.onUnmount?.(e)}}}function a(e){let t=r(),n=new Set;e&&n.add(e),t.componentDebugHookSet=n,i(t)}function o(e){let t=r(),n=t.componentDebugHookSet;return n||(n=new Set,t.componentDebugHooks&&n.add(t.componentDebugHooks),t.componentDebugHookSet=n),n.add(e),i(t),()=>{n.delete(e),i(t)}}function s(e){r().componentDebugHooks?.onMountStart?.(e)}function c(e){r().componentDebugHooks?.onMountEnd?.(e)}function l(e){r().componentDebugHooks?.onUnmount?.(e)}exports.ElurComponent=e,exports._addComponentDebugHooks=o,exports._debugComponentMountEnd=c,exports._debugComponentMountStart=s,exports._debugComponentUnmount=l,exports._setComponentDebugHooks=a,exports.isElurComponent=t;
2
2
  //# sourceMappingURL=lifecycle.cjs.map
@@ -13,6 +13,10 @@ var e = class {
13
13
  slot(e) {
14
14
  return this._slots.get(e);
15
15
  }
16
+ _controllers;
17
+ addController(e) {
18
+ (this._controllers ??= []).push(e);
19
+ }
16
20
  setDebugName(e) {
17
21
  return this._debugName = e, this;
18
22
  }
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./signals.cjs`);function t(t,n={}){let{storage:r=localStorage,exclude:i=[],serialize:a=JSON.stringify,deserialize:o=JSON.parse,debounce:s=0}=n;return n=>{e.untrack(async()=>{try{let e=await r.getItem(t);if(!e)return;let a=o(e),s={};for(let e of Object.keys(a))e in n.$state&&!i.includes(e)&&(s[e]=a[e]);Object.keys(s).length>0&&n.$patch(s)}catch{}});let c;return e.watch(n.$stateSignal,e=>{let n=()=>{try{let n=i.length===0?e:Object.fromEntries(Object.entries(e).filter(([e])=>!i.includes(e)));r.setItem(t,a(n))}catch{}};s>0?(clearTimeout(c),c=setTimeout(n,s)):n()})}}function n(t={}){let{collapsed:n=!0,filter:r}=t;return t=>{let i=n?console.groupCollapsed:console.group;return e.watch(t.$stateSignal,(e,n)=>{if(!n)return;let a={};for(let t of Object.keys(e))Object.is(e[t],n[t])||(a[t]=e[t]);Object.keys(a).length!==0&&(r&&!r(a)||(i(`%c[elur:${t.$id}]%c ${Object.keys(a).join(`, `)}`,`color:#7F77DD;font-weight:500`,`color:inherit;font-weight:400`),console.log(`prev →`,n),console.log(`next →`,e),console.log(`diff →`,a),console.groupEnd()))},{immediate:!0})}}function r(e){return t=>{let n=t._guardFns;for(let t of e)n.push(t);return()=>{for(let t of e){let e=n.indexOf(t);e>=0&&n.splice(e,1)}}}}function i(t,n){return r=>e.watch(t.$stateSignal,e=>{n(e,r)})}exports.bridgePlugin=i,exports.guardPlugin=r,exports.loggerPlugin=n,exports.persistPlugin=t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./elur/next-2/reactivity.cjs`);function t(t,n={}){let{storage:r=localStorage,exclude:i=[],serialize:a=JSON.stringify,deserialize:o=JSON.parse,debounce:s=0}=n;return n=>{e.untrack(async()=>{try{let e=await r.getItem(t);if(!e)return;let a=o(e),s={};for(let e of Object.keys(a))e in n.$state&&!i.includes(e)&&(s[e]=a[e]);Object.keys(s).length>0&&n.$patch(s)}catch{}});let c;return e.watch(n.$stateSignal,e=>{let n=()=>{try{let n=i.length===0?e:Object.fromEntries(Object.entries(e).filter(([e])=>!i.includes(e)));r.setItem(t,a(n))}catch{}};s>0?(clearTimeout(c),c=setTimeout(n,s)):n()})}}function n(t={}){let{collapsed:n=!0,filter:r}=t;return t=>{let i=n?console.groupCollapsed:console.group;return e.watch(t.$stateSignal,(e,n)=>{if(!n)return;let a={};for(let t of Object.keys(e))Object.is(e[t],n[t])||(a[t]=e[t]);Object.keys(a).length!==0&&(r&&!r(a)||(i(`%c[elur:${t.$id}]%c ${Object.keys(a).join(`, `)}`,`color:#7F77DD;font-weight:500`,`color:inherit;font-weight:400`),console.log(`prev →`,n),console.log(`next →`,e),console.log(`diff →`,a),console.groupEnd()))},{immediate:!0})}}function r(e){return t=>{let n=t._guardFns;for(let t of e)n.push(t);return()=>{for(let t of e){let e=n.indexOf(t);e>=0&&n.splice(e,1)}}}}function i(t,n){return r=>e.watch(t.$stateSignal,e=>{n(e,r)})}exports.bridgePlugin=i,exports.guardPlugin=r,exports.loggerPlugin=n,exports.persistPlugin=t;
2
2
  //# sourceMappingURL=plugins.cjs.map
@@ -1,4 +1,4 @@
1
- import { untrack as e, watch as t } from "./signals.js";
1
+ import { untrack as e, watch as t } from "./elur/next-2/reactivity.js";
2
2
  //#region src/elur/plugins.ts
3
3
  function n(n, r = {}) {
4
4
  let { storage: i = localStorage, exclude: a = [], serialize: o = JSON.stringify, deserialize: s = JSON.parse, debounce: c = 0 } = r;
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./signals.cjs`),t=require(`./lifecycle.cjs`),n=require(`./context.cjs`),r=require(`./elur/template/html.cjs`),i=require(`./elur/router-registry.cjs`);var a=null,o=null,s=`__elur_scroll`,c=`__elur_pos`;function l(){if(!a)throw Error(`[elur] No active router. Call createRouter() first, or instantiate an outlet that auto-bootstraps one (e.g. IonRouterOutlet).`);return a}function u(){return a!==null}function d(){return{left:window.scrollX??window.pageXOffset??0,top:window.scrollY??window.pageYOffset??0}}function ee(e){if(!e||typeof e!=`object`)return null;let t=e[s];if(!t||typeof t!=`object`)return null;let n=t.left,r=t.top;return typeof n!=`number`||typeof r!=`number`?null:{left:n,top:r}}function f(e){if(!e||typeof e!=`object`)return null;let t=e[c];return typeof t==`number`?t:null}function p(e,t,n){let r=e&&typeof e==`object`?{...e}:{};return r[s]={left:t.left,top:t.top},r[c]=n,r}function m(e){let t={};return new URLSearchParams(e).forEach((e,n)=>{t[n]=e}),t}function h(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!=null&&r!==!1&&t.set(n,String(r));let n=t.toString();return n?`?`+n:``}function g(e){return e===`*`?[{kind:`wildcard`}]:e.split(`/`).filter(Boolean).map(e=>e===`*`?{kind:`wildcard`}:e.startsWith(`:`)?{kind:`param`,name:e.slice(1)}:{kind:`literal`,value:e})}function _(e,t){return t===`*`?e===``?`*`:e+`/*`:(e+(t.startsWith(`/`)?t:`/`+t)).replace(/\/+/g,`/`)||`/`}function v(e,t=``,n=[]){let r=[];for(let i of e){let e=_(t,i.path),a=[...n,i.component],o=g(e);r.push({fullPath:e,segments:o,chain:a,name:i.name,meta:i.meta,beforeEnter:i.beforeEnter,record:i}),i.children?.length&&r.push(...v(i.children,e,a))}return r}function y(e,t){let n=e.split(`/`).filter(Boolean),r=t.segments;if(r.length===1&&r[0].kind===`wildcard`)return{};let i=r.length>0&&r[r.length-1].kind===`wildcard`,a=i?r.slice(0,-1):r;if(i){if(n.length<a.length)return null}else if(n.length!==a.length)return null;let o={};for(let e=0;e<a.length;e++){let t=a[e];if(t.kind===`literal`){if(n[e]!==t.value)return null}else if(t.kind===`param`)try{o[t.name]=decodeURIComponent(n[e]??``)}catch{o[t.name]=n[e]??``}}return o}function b(e){return e.segments.reduce((e,t)=>t.kind===`literal`?e+2:t.kind===`param`?e+1:e,0)}function x(e,t){let n,r={},i=-1;for(let a of t){let t=y(e,a);if(t===null)continue;let o=b(a);o>i&&(n=a,r=t,i=o)}return n?{route:n,params:r}:void 0}function S(e){let t=e.trim();return!t||t===`/`?``:(t.startsWith(`/`)||(t=`/`+t),t.endsWith(`/`)&&(t=t.slice(0,-1)),t)}function te(){if(typeof document>`u`)return``;let e=document.querySelector(`base`);if(!e)return``;let t=e.getAttribute(`href`)||``;try{return S(new URL(t,window.location.origin).pathname)}catch{return S(t)}}function C(e){return e===!1?{allow:!1}:e===!0||e==null?{allow:!0}:typeof e==`string`?{allow:!1,redirect:e}:typeof e==`object`&&`redirect`in e&&typeof e.redirect==`string`?{allow:!1,redirect:e.redirect}:{allow:!0}}function w(t,n){let r=n?.base==null?te():S(n.base),i=n?.mode??`history`,s=i===`hash`,c=n?.scrollBehavior,l=new Map,u=!1;function g(e){return e?e.startsWith(`/`)?e:`/`+e:`/`}function _(e){let t=g(e||`/`);if(r&&t.startsWith(r)){let e=t.slice(r.length);return e===``?`/`:g(e)}return t}function y(e){let t=g(e);return r?(r+t).replace(/\/+/g,`/`)||`/`:t}function b(){let e=window.location.hash||``;if(e.startsWith(`#`)&&(e=e.slice(1)),!e)return{pathname:`/`,search:``};e.startsWith(`/`)||(e=`/`+e);let t=e.indexOf(`?`),n=t===-1?e:e.slice(0,t),r=t===-1?``:e.slice(t);return{pathname:_(n),search:r}}function w(){return s?b():{pathname:_(window.location.pathname||`/`),search:window.location.search||``}}function T(e,t){let n=y(e)+h(t);return s?`#`+n:n}function E(e,t){return g(e)+h(t)}let D=w(),O=D.pathname,k=m(D.search),A=v(t),j=new Map;for(let e of A)e.name&&(j.has(e.name)&&console.warn(`[Elur Router] Duplicate route name: "${e.name}"`),j.set(e.name,e));let ne=x(O,A),M=e.signal(O),N=e.signal(ne?.params??{}),P=e.signal(k),F=f(history.state)??0,I=e.signal({action:`initial`,direction:`none`}),L=e.signal(F>0);s?l.set(E(O,k),d()):history.replaceState(p(history.state,d(),F),``);function R(e){window.scrollTo(e.left,e.top)}function z(e,t,n){if(c){let r=c(e,t,n);if(!r)return;R(r);return}R(n??{left:0,top:0})}function B(e,t){let n=d();if(s){l.set(E(e,t),n);return}history.replaceState(p(history.state,n,F),``)}let V=[],H=[],U=0;function W(e,t,n,r,i){let a=[...V];n&&a.push(n);let o=++U;if(a.length===0){r();return}let s=0;function c(n){if(o!==U)return;let l=C(n);if(!l.allow){if(l.redirect&&l.redirect!==e){Z(l.redirect);return}if(l.redirect===e){r();return}i?.();return}if(s>=a.length){r();return}let u=a[s++](e,t);if(u instanceof Promise){u.then(c);return}c(u)}c(void 0)}let G=!1;function K(e,t){let n=e.indexOf(`?`),r=g((n===-1?e:e.slice(0,n))||`/`),i=n===-1?{}:m(e.slice(n)),a=t?{...i,...t}:i,o={};for(let[e,t]of Object.entries(a))t!=null&&t!==!1&&(o[e]=String(t));return{pathname:r,stringQuery:o}}function re(e){let t=j.get(e.name);if(!t)throw Error(`[Elur Router] No route with name "${e.name}"`);return`/`+t.segments.map(t=>{if(t.kind===`literal`)return t.value;if(t.kind===`wildcard`)return``;let n=e.params?.[t.name];if(n==null)throw Error(`[Elur Router] Missing param "${t.name}" for route "${e.name}"`);return encodeURIComponent(String(n))}).filter(Boolean).join(`/`)}function q(e,t){return typeof e==`string`?K(e,t?.query):K(re(e),{...e.query??{},...t?.query??{}})}o&&=(o(),null);let J=(e,t,n,r,i)=>{let a=M.value,o={...P.value},s=x(e,A),c=`none`;r!=null&&(r<F?c=`back`:r>F&&(c=`forward`)),W(e,a,s?.route.beforeEnter,()=>{r!=null&&(F=r);let i=X;X=void 0,I.value={action:`pop`,direction:c,animation:i},N.value=s?.params??{},P.value=t,M.value=e,L.value=F>0,z(e,a,n);for(let t of H)try{t(e,a)}catch{}},()=>i(a,o))};if(s){let e=()=>{if(u){u=!1;return}let e=w(),t=m(e.search),n=l.get(E(e.pathname,t))??null;J(e.pathname,t,n,null,(e,t)=>{u=!0,window.location.hash=T(e,t).slice(1),queueMicrotask(()=>{u=!1})})};window.addEventListener(`hashchange`,e),o=()=>window.removeEventListener(`hashchange`,e)}else{let e=e=>{let t=w(),n=m(t.search),r=ee(e.state??history.state),i=f(e.state??history.state);J(t.pathname,n,r,i,(e,t)=>{history.pushState(p({},d(),F),``,T(e,t))})};window.addEventListener(`popstate`,e),o=()=>window.removeEventListener(`popstate`,e)}function Y(e,t,n,r,i,a,o){o||(B(n,r),F+=1),I.value=a,N.value=i?.params??{},P.value=t,M.value=e,L.value=F>0;let c=T(e,t);if(s)l.set(E(e,t),{left:0,top:0}),o?history.replaceState(history.state,``,c):(u=!0,window.location.hash=c.slice(1),queueMicrotask(()=>{u=!1}));else{let e=p({},{left:0,top:0},F);o?history.replaceState(e,``,c):history.pushState(e,``,c)}z(e,n,null);for(let t of H)try{t(e,n)}catch{}}let X;function Z(e,t){G=!0;let{pathname:n,stringQuery:r}=q(e,t),i=M.value,a={...P.value},o=x(n,A),s={action:`push`,direction:t?.direction??`forward`,animation:t?.animation};W(n,i,o?.route.beforeEnter,()=>Y(n,r,i,a,o,s,!1))}function ie(e,t){G=!0;let{pathname:n,stringQuery:r}=q(e,t),i=M.value,a={...P.value},o=x(n,A),s={action:`replace`,direction:t?.direction??`root`,animation:t?.animation};W(n,i,o?.route.beforeEnter,()=>Y(n,r,i,a,o,s,!0))}function ae(e){e!==void 0&&(X=e),history.back()}function oe(e){e!==void 0&&(X=e),history.forward()}function Q(e){history.go(e)}function se(e,t=!0){let n=M.value;return t?n===e:n===e||n.startsWith(e.endsWith(`/`)?e:e+`/`)}function ce(e){let t=x(e,A);return t?{matched:!0,params:t.params,route:t.route.record}:{matched:!1,params:{},route:void 0}}function le(e){return V.push(e),()=>{let t=V.indexOf(e);t!==-1&&V.splice(t,1)}}function ue(e){return H.push(e),()=>{let t=H.indexOf(e);t!==-1&&H.splice(t,1)}}let $={current:M,params:N,query:P,intent:I,canGoBack:L,base:r||`/`,navigate:Z,replace:ie,back:ae,forward:oe,go:Q,isActive:se,resolve:ce,beforeEach:le,afterEach:ue,routes:t,_flat:A,_guards:V,_base:r,_mode:i};return a&&console.warn(`[elur] A router already exists. The previous router is being replaced. Only one router instance should be active at a time.`),a=$,queueMicrotask(()=>{G||W(O,``,x(O,A)?.route.beforeEnter,()=>{},()=>{let e=T(`/`,{});s?(l.set(E(`/`,{}),{left:0,top:0}),history.replaceState(history.state,``,e)):history.replaceState(p({},{left:0,top:0},F),``,e);let t=x(`/`,A);I.value={action:`replace`,direction:`root`},M.value=`/`,N.value=t?.params??{},P.value={},L.value=F>0,z(`/`,O,null)})}),$}function T(){return n.inject(i.RouterKey)||l()}function E(){o&&=(o(),null),a=null,i._mountedRouters.length=0}var D=class extends t.ElurComponent{_depth;_router;constructor(e=0,t){super(),this._depth=e,this._router=t}render(){let e=this._depth,t=this._router;return r.html`<div class="router-view">${()=>{let n=t??T(),i=x(n.current.value,n._flat);if(!i)return r.html`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./elur/next-2/reactivity.cjs`),t=require(`./lifecycle.cjs`),n=require(`./context.cjs`),r=require(`./elur/template/html.cjs`),i=require(`./elur/router-registry.cjs`);var a=null,o=null,s=`__elur_scroll`,c=`__elur_pos`;function l(){if(!a)throw Error(`[elur] No active router. Call createRouter() first, or instantiate an outlet that auto-bootstraps one (e.g. IonRouterOutlet).`);return a}function u(){return a!==null}function d(){return{left:window.scrollX??window.pageXOffset??0,top:window.scrollY??window.pageYOffset??0}}function ee(e){if(!e||typeof e!=`object`)return null;let t=e[s];if(!t||typeof t!=`object`)return null;let n=t.left,r=t.top;return typeof n!=`number`||typeof r!=`number`?null:{left:n,top:r}}function f(e){if(!e||typeof e!=`object`)return null;let t=e[c];return typeof t==`number`?t:null}function p(e,t,n){let r=e&&typeof e==`object`?{...e}:{};return r[s]={left:t.left,top:t.top},r[c]=n,r}function m(e){let t={};return new URLSearchParams(e).forEach((e,n)=>{t[n]=e}),t}function h(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!=null&&r!==!1&&t.set(n,String(r));let n=t.toString();return n?`?`+n:``}function g(e){return e===`*`?[{kind:`wildcard`}]:e.split(`/`).filter(Boolean).map(e=>e===`*`?{kind:`wildcard`}:e.startsWith(`:`)?{kind:`param`,name:e.slice(1)}:{kind:`literal`,value:e})}function _(e,t){return t===`*`?e===``?`*`:e+`/*`:(e+(t.startsWith(`/`)?t:`/`+t)).replace(/\/+/g,`/`)||`/`}function v(e,t=``,n=[]){let r=[];for(let i of e){let e=_(t,i.path),a=[...n,i.component],o=g(e);r.push({fullPath:e,segments:o,chain:a,name:i.name,meta:i.meta,beforeEnter:i.beforeEnter,record:i}),i.children?.length&&r.push(...v(i.children,e,a))}return r}function y(e,t){let n=e.split(`/`).filter(Boolean),r=t.segments;if(r.length===1&&r[0].kind===`wildcard`)return{};let i=r.length>0&&r[r.length-1].kind===`wildcard`,a=i?r.slice(0,-1):r;if(i){if(n.length<a.length)return null}else if(n.length!==a.length)return null;let o={};for(let e=0;e<a.length;e++){let t=a[e];if(t.kind===`literal`){if(n[e]!==t.value)return null}else if(t.kind===`param`)try{o[t.name]=decodeURIComponent(n[e]??``)}catch{o[t.name]=n[e]??``}}return o}function b(e){return e.segments.reduce((e,t)=>t.kind===`literal`?e+2:t.kind===`param`?e+1:e,0)}function x(e,t){let n,r={},i=-1;for(let a of t){let t=y(e,a);if(t===null)continue;let o=b(a);o>i&&(n=a,r=t,i=o)}return n?{route:n,params:r}:void 0}function S(e){let t=e.trim();return!t||t===`/`?``:(t.startsWith(`/`)||(t=`/`+t),t.endsWith(`/`)&&(t=t.slice(0,-1)),t)}function te(){if(typeof document>`u`)return``;let e=document.querySelector(`base`);if(!e)return``;let t=e.getAttribute(`href`)||``;try{return S(new URL(t,window.location.origin).pathname)}catch{return S(t)}}function C(e){return e===!1?{allow:!1}:e===!0||e==null?{allow:!0}:typeof e==`string`?{allow:!1,redirect:e}:typeof e==`object`&&`redirect`in e&&typeof e.redirect==`string`?{allow:!1,redirect:e.redirect}:{allow:!0}}function w(t,n){let r=n?.base==null?te():S(n.base),i=n?.mode??`history`,s=i===`hash`,c=n?.scrollBehavior,l=new Map,u=!1;function g(e){return e?e.startsWith(`/`)?e:`/`+e:`/`}function _(e){let t=g(e||`/`);if(r&&t.startsWith(r)){let e=t.slice(r.length);return e===``?`/`:g(e)}return t}function y(e){let t=g(e);return r?(r+t).replace(/\/+/g,`/`)||`/`:t}function b(){let e=window.location.hash||``;if(e.startsWith(`#`)&&(e=e.slice(1)),!e)return{pathname:`/`,search:``};e.startsWith(`/`)||(e=`/`+e);let t=e.indexOf(`?`),n=t===-1?e:e.slice(0,t),r=t===-1?``:e.slice(t);return{pathname:_(n),search:r}}function w(){return s?b():{pathname:_(window.location.pathname||`/`),search:window.location.search||``}}function T(e,t){let n=y(e)+h(t);return s?`#`+n:n}function E(e,t){return g(e)+h(t)}let D=w(),O=D.pathname,k=m(D.search),A=v(t),j=new Map;for(let e of A)e.name&&(j.has(e.name)&&console.warn(`[Elur Router] Duplicate route name: "${e.name}"`),j.set(e.name,e));let ne=x(O,A),M=e.signal(O),N=e.signal(ne?.params??{}),P=e.signal(k),F=f(history.state)??0,I=e.signal({action:`initial`,direction:`none`}),L=e.signal(F>0);s?l.set(E(O,k),d()):history.replaceState(p(history.state,d(),F),``);function R(e){window.scrollTo(e.left,e.top)}function z(e,t,n){if(c){let r=c(e,t,n);if(!r)return;R(r);return}R(n??{left:0,top:0})}function B(e,t){let n=d();if(s){l.set(E(e,t),n);return}history.replaceState(p(history.state,n,F),``)}let V=[],H=[],U=0;function W(e,t,n,r,i){let a=[...V];n&&a.push(n);let o=++U;if(a.length===0){r();return}let s=0;function c(n){if(o!==U)return;let l=C(n);if(!l.allow){if(l.redirect&&l.redirect!==e){Z(l.redirect);return}if(l.redirect===e){r();return}i?.();return}if(s>=a.length){r();return}let u=a[s++](e,t);if(u instanceof Promise){u.then(c);return}c(u)}c(void 0)}let G=!1;function K(e,t){let n=e.indexOf(`?`),r=g((n===-1?e:e.slice(0,n))||`/`),i=n===-1?{}:m(e.slice(n)),a=t?{...i,...t}:i,o={};for(let[e,t]of Object.entries(a))t!=null&&t!==!1&&(o[e]=String(t));return{pathname:r,stringQuery:o}}function re(e){let t=j.get(e.name);if(!t)throw Error(`[Elur Router] No route with name "${e.name}"`);return`/`+t.segments.map(t=>{if(t.kind===`literal`)return t.value;if(t.kind===`wildcard`)return``;let n=e.params?.[t.name];if(n==null)throw Error(`[Elur Router] Missing param "${t.name}" for route "${e.name}"`);return encodeURIComponent(String(n))}).filter(Boolean).join(`/`)}function q(e,t){return typeof e==`string`?K(e,t?.query):K(re(e),{...e.query??{},...t?.query??{}})}o&&=(o(),null);let J=(e,t,n,r,i)=>{let a=M.value,o={...P.value},s=x(e,A),c=`none`;r!=null&&(r<F?c=`back`:r>F&&(c=`forward`)),W(e,a,s?.route.beforeEnter,()=>{r!=null&&(F=r);let i=X;X=void 0,I.value={action:`pop`,direction:c,animation:i},N.value=s?.params??{},P.value=t,M.value=e,L.value=F>0,z(e,a,n);for(let t of H)try{t(e,a)}catch{}},()=>i(a,o))};if(s){let e=()=>{if(u){u=!1;return}let e=w(),t=m(e.search),n=l.get(E(e.pathname,t))??null;J(e.pathname,t,n,null,(e,t)=>{u=!0,window.location.hash=T(e,t).slice(1),queueMicrotask(()=>{u=!1})})};window.addEventListener(`hashchange`,e),o=()=>window.removeEventListener(`hashchange`,e)}else{let e=e=>{let t=w(),n=m(t.search),r=ee(e.state??history.state),i=f(e.state??history.state);J(t.pathname,n,r,i,(e,t)=>{history.pushState(p({},d(),F),``,T(e,t))})};window.addEventListener(`popstate`,e),o=()=>window.removeEventListener(`popstate`,e)}function Y(e,t,n,r,i,a,o){o||(B(n,r),F+=1),I.value=a,N.value=i?.params??{},P.value=t,M.value=e,L.value=F>0;let c=T(e,t);if(s)l.set(E(e,t),{left:0,top:0}),o?history.replaceState(history.state,``,c):(u=!0,window.location.hash=c.slice(1),queueMicrotask(()=>{u=!1}));else{let e=p({},{left:0,top:0},F);o?history.replaceState(e,``,c):history.pushState(e,``,c)}z(e,n,null);for(let t of H)try{t(e,n)}catch{}}let X;function Z(e,t){G=!0;let{pathname:n,stringQuery:r}=q(e,t),i=M.value,a={...P.value},o=x(n,A),s={action:`push`,direction:t?.direction??`forward`,animation:t?.animation};W(n,i,o?.route.beforeEnter,()=>Y(n,r,i,a,o,s,!1))}function ie(e,t){G=!0;let{pathname:n,stringQuery:r}=q(e,t),i=M.value,a={...P.value},o=x(n,A),s={action:`replace`,direction:t?.direction??`root`,animation:t?.animation};W(n,i,o?.route.beforeEnter,()=>Y(n,r,i,a,o,s,!0))}function ae(e){e!==void 0&&(X=e),history.back()}function oe(e){e!==void 0&&(X=e),history.forward()}function Q(e){history.go(e)}function se(e,t=!0){let n=M.value;return t?n===e:n===e||n.startsWith(e.endsWith(`/`)?e:e+`/`)}function ce(e){let t=x(e,A);return t?{matched:!0,params:t.params,route:t.route.record}:{matched:!1,params:{},route:void 0}}function le(e){return V.push(e),()=>{let t=V.indexOf(e);t!==-1&&V.splice(t,1)}}function ue(e){return H.push(e),()=>{let t=H.indexOf(e);t!==-1&&H.splice(t,1)}}let $={current:M,params:N,query:P,intent:I,canGoBack:L,base:r||`/`,navigate:Z,replace:ie,back:ae,forward:oe,go:Q,isActive:se,resolve:ce,beforeEach:le,afterEach:ue,routes:t,_flat:A,_guards:V,_base:r,_mode:i};return a&&console.warn(`[elur] A router already exists. The previous router is being replaced. Only one router instance should be active at a time.`),a=$,queueMicrotask(()=>{G||W(O,``,x(O,A)?.route.beforeEnter,()=>{},()=>{let e=T(`/`,{});s?(l.set(E(`/`,{}),{left:0,top:0}),history.replaceState(history.state,``,e)):history.replaceState(p({},{left:0,top:0},F),``,e);let t=x(`/`,A);I.value={action:`replace`,direction:`root`},M.value=`/`,N.value=t?.params??{},P.value={},L.value=F>0,z(`/`,O,null)})}),$}function T(){return n.inject(i.RouterKey)||l()}function E(){o&&=(o(),null),a=null,i._mountedRouters.length=0}var D=class extends t.ElurComponent{_depth;_router;constructor(e=0,t){super(),this._depth=e,this._router=t}render(){let e=this._depth,t=this._router;return r.html`<div class="router-view">${()=>{let n=t??T(),i=x(n.current.value,n._flat);if(!i)return r.html`
2
2
  <div style="color:#f87171;padding:16px 0">
3
3
  404 — Route not found: <strong>${n.current.value}</strong>
4
4
  </div>
@@ -1,4 +1,4 @@
1
- import { signal as e } from "./signals.js";
1
+ import { signal as e } from "./elur/next-2/reactivity.js";
2
2
  import { ElurComponent as t } from "./lifecycle.js";
3
3
  import { inject as n } from "./context.js";
4
4
  import { html as r } from "./elur/template/html.js";
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./elur/template/types.cjs`),t=require(`./lifecycle.cjs`),n=require(`./context.cjs`),r=require(`./elur/template/keyed.cjs`),i=require(`./elur/template/sanitize.cjs`);let a=require(`node:async_hooks`);var o=e.isElurTemplate,s=e.isKeyedList,c=new a.AsyncLocalStorage;n._setContextScopeResolver(()=>c.getStore());function l(e={}){let t=new AbortController,n={markers:e.markers===`hydration`,context:e.context,onError:e.onError},r=e=>Promise.resolve(c.run([],e));return{signal:t.signal,async render(e,i){let a={...n,markers:i?.markers??n.markers,signal:t.signal},o=``;return await r(()=>(async()=>{for await(let t of p(e,a))o+=t.value})()),o},renderToChunks(e,r){return u(e,{...n,markers:r?.markers??n.markers,signal:t.signal})},abort(e){t.abort(e)}}}function u(e,t){return{async*[Symbol.asyncIterator](){let n=[],r=[],i=!1,a,o=()=>{r.shift()?.()},s=c.run([],async()=>{try{for await(let r of p(e,t))n.push(r),o()}catch(e){a=e}finally{i=!0,o()}});for(;;){for(;n.length===0&&!i;)await new Promise(e=>r.push(e));if(n.length===0)break;let e=n.shift();e&&(yield e)}if(a)throw yield{type:`error`,value:a instanceof Error?a.message:String(a),index:-1},a;yield{type:`done`,value:``,index:-1},await s}}}async function d(e,t={}){let n={markers:t.markers===`hydration`,signal:t.signal,context:t.context,onError:t.onError},r=``;return await Promise.resolve(c.run([],async()=>{for await(let t of p(e,n))r+=t.value})),r}function f(e,t={}){return u(e,{markers:t.markers===`hydration`,signal:t.signal,context:t.context,onError:t.onError})}async function*p(n,i){if(_(i),n instanceof Promise){yield*p(await n,i);return}if(!(n==null||n===!1||n===!0)){if(typeof n==`string`||typeof n==`number`||typeof n==`bigint`){yield{type:`markup`,value:b(String(n)),index:-1};return}if(Array.isArray(n)){let e=await Promise.all(n.map(e=>v(e)));_(i);for(let t of e)i.markers&&(yield{type:`markup`,value:`<!--elur-ai-->`,index:-1}),yield*p(t,i),i.markers&&(yield{type:`markup`,value:`<!--elur-aiend-->`,index:-1});return}if((typeof n==`object`||typeof n==`function`)&&n!==null){let t=n[e.ELUR_RENDER_PROTOCOL];if(t?.renderServer){let e=await t.renderServer({markers:i.markers,signal:i.signal,context:i.context,render:(e,t)=>g(e,{...i,markers:t?.markers??i.markers})});_(i),yield{type:`markup`,value:e,index:-1};return}}if(t.isElurComponent(n)){yield*m(n,i);return}if(s(n)){if(!i.markers){yield{type:`markup`,value:(await Promise.all(n.items.map((e,t)=>g(n.renderFn(e,t),i)))).join(``),index:-1};return}let e=new Set;for(let t=0;t<n.items.length;t++){let a=n.items[t],o=r.normalizeRepeatKey(n.keyFn(a,t),t),s=r.serializeRepeatKey(o);e.has(s)&&console.warn(`[elur] repeat(): duplicate key "${o}" during server render. Keys must be unique; entries after the first will leak during hydration.`),e.add(s),yield{type:`markup`,value:`<!--elur-ki:${s}-->`,index:-1},yield*p(n.renderFn(a,t),i),yield{type:`markup`,value:`<!--elur-ke-->`,index:-1}}return}if(o(n)){let t=n[e.ELUR_TEMPLATE_DESCRIPTOR];if(!t)throw TypeError(`[elur] Template does not support server rendering`);yield*h(t,i);return}yield{type:`markup`,value:b(String(n)),index:-1}}}async function*m(e,t){n._pushComponentContext();let r={index:-1,context:`component`,cause:void 0,component:e._debugName};try{try{e.onInit?.(),e.onServerRender?.()}catch(t){if(e.onError)e.onError(t);else throw t}try{yield*p(e.render(),t)}catch(t){if(e.onError){e.onError(t);return}throw t}}catch(e){throw t.onError?.(e,{...r,cause:e}),e}finally{n._popComponentContext()}}async function*h(e,t){let n=new Uint8Array(e.strings.length);for(let r=0;r<e.strings.length;r++){if(t.signal?.aborted)throw t.signal.reason??new DOMException(`Render aborted`,`AbortError`);let a=e.strings[r];if(n[r]===1&&(a[0]===`"`||a[0]===`'`)&&(a=a.slice(1)),r>=e.contexts.length){yield{type:`markup`,value:a,index:r};continue}let o=e.contexts[r],s=e.values[r];if(o.type===`node`){yield{type:`markup`,value:a,index:r},t.markers&&(yield{type:`boundary-start`,value:`<!--elur-${r}-->`,index:r});try{let e=await v(s);_(t),yield*p(e,t)}catch(e){throw t.onError?.(e,{index:r,context:`node`,cause:e}),e}t.markers&&(yield{type:`boundary-end`,value:`<!--elur-end-${r}-->`,index:r});continue}let c=y(o),l=a.slice(0,-c);if(o.hadOpenQuote&&(n[r+1]=1),o.type===`event`){t.markers?yield{type:`markup`,value:`${l}${/\s$/.test(l)?``:` `}data-elur-e-${r}="${x(o.eventName)}"`,index:r}:yield{type:`markup`,value:l.replace(/\s+$/,``),index:r};continue}yield{type:`markup`,value:l,index:r};let u=await v(s);if(_(t),o.attrName!==`ref`&&u!=null&&u!==!1){let e=o.url?i.sanitizeUrl(String(u)):String(u);yield{type:`markup`,value:`${/\s$/.test(l)?``:` `}${o.attrName}="${x(e)}"`,index:r}}t.markers&&(yield{type:`markup`,value:` data-elur-a-${r}="${x(o.attrName)}"`,index:r})}}async function g(e,t){let n=``;for await(let r of p(e,t))n+=r.value;return n}function _(e){if(e.signal?.aborted)throw e.signal.reason??new DOMException(`Render aborted`,`AbortError`)}async function v(e){let t=typeof e==`function`?e():e;return t instanceof Promise?await t:t}function y(e){return e.type===`event`?`@${e.modifiers.length?`${e.eventName}.${e.modifiers.join(`.`)}`:e.eventName}=`.length+ +!!e.hadOpenQuote:`${e.attrName}=`.length+ +!!e.hadOpenQuote}function b(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function x(e){return b(e).replace(/"/g,`&quot;`)}exports.createServerRenderScope=l,exports.renderToChunks=f,exports.renderToString=d;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./elur/next-2/reactivity.cjs`),t=require(`./elur/template/types.cjs`),n=require(`./lifecycle.cjs`),r=require(`./context.cjs`),i=require(`./elur/template/keyed.cjs`),a=require(`./elur/template/sanitize.cjs`);let o=require(`node:async_hooks`);var s=t.isElurTemplate,c=t.isKeyedList,l=new o.AsyncLocalStorage;r._setContextScopeResolver(()=>l.getStore());function u(e={}){let t=new AbortController,n={markers:e.markers===`hydration`,context:e.context,onError:e.onError},r=e=>Promise.resolve(l.run([],e));return{signal:t.signal,async render(e,i){let a={...n,markers:i?.markers??n.markers,signal:t.signal},o=``;return await r(()=>(async()=>{for await(let t of m(e,a))o+=t.value})()),o},renderToChunks(e,r){return d(e,{...n,markers:r?.markers??n.markers,signal:t.signal})},abort(e){t.abort(e)}}}function d(e,t){return{async*[Symbol.asyncIterator](){let n=[],r=[],i=!1,a,o=()=>{r.shift()?.()},s=l.run([],async()=>{try{for await(let r of m(e,t))n.push(r),o()}catch(e){a=e}finally{i=!0,o()}});for(;;){for(;n.length===0&&!i;)await new Promise(e=>r.push(e));if(n.length===0)break;let e=n.shift();e&&(yield e)}if(a)throw yield{type:`error`,value:a instanceof Error?a.message:String(a),index:-1},a;yield{type:`done`,value:``,index:-1},await s}}}async function f(e,t={}){let n={markers:t.markers===`hydration`,signal:t.signal,context:t.context,onError:t.onError},r=``;return await Promise.resolve(l.run([],async()=>{for await(let t of m(e,n))r+=t.value})),r}function p(e,t={}){return d(e,{markers:t.markers===`hydration`,signal:t.signal,context:t.context,onError:t.onError})}async function*m(e,r){if(y(r),e instanceof Promise){yield*m(await e,r);return}if(!(e==null||e===!1||e===!0)){if(typeof e==`string`||typeof e==`number`||typeof e==`bigint`){yield{type:`markup`,value:S(String(e)),index:-1};return}if(Array.isArray(e)){let t=await Promise.all(e.map(e=>b(e)));y(r);for(let e of t)r.markers&&(yield{type:`markup`,value:`<!--elur-ai-->`,index:-1}),yield*m(e,r),r.markers&&(yield{type:`markup`,value:`<!--elur-aiend-->`,index:-1});return}if((typeof e==`object`||typeof e==`function`)&&e!==null){let n=e[t.ELUR_RENDER_PROTOCOL];if(n?.renderServer){let e=await n.renderServer({markers:r.markers,signal:r.signal,context:r.context,render:(e,t)=>v(e,{...r,markers:t?.markers??r.markers})});y(r),yield{type:`markup`,value:e,index:-1};return}}if(n.isElurComponent(e)){yield*h(e,r);return}if(c(e)){if(!r.markers){yield{type:`markup`,value:(await Promise.all(e.items.map((t,n)=>v(e.renderFn(t,n),r)))).join(``),index:-1};return}let t=new Set;for(let n=0;n<e.items.length;n++){let a=e.items[n],o=i.normalizeRepeatKey(e.keyFn(a,n),n),s=i.serializeRepeatKey(o);t.has(s)&&console.warn(`[elur] repeat(): duplicate key "${o}" during server render. Keys must be unique; entries after the first will leak during hydration.`),t.add(s),yield{type:`markup`,value:`<!--elur-ki:${s}-->`,index:-1},yield*m(e.renderFn(a,n),r),yield{type:`markup`,value:`<!--elur-ke-->`,index:-1}}return}if(s(e)){let n=e[t.ELUR_TEMPLATE_DESCRIPTOR];if(!n)throw TypeError(`[elur] Template does not support server rendering`);yield*_(n,r);return}yield{type:`markup`,value:S(String(e)),index:-1}}}async function*h(e,t){r._pushComponentContext();let n={index:-1,context:`component`,cause:void 0,component:e._debugName};try{try{e.onInit?.(),e.onServerRender?.()}catch(t){if(e.onError)e.onError(t);else throw t}try{yield*m(e.render(),t)}catch(t){if(e.onError){e.onError(t);return}throw t}}catch(e){throw t.onError?.(e,{...n,cause:e}),e}finally{r._popComponentContext()}}function g(e,t){return{m:e=>({type:`markup`,value:e,index:-1}),node:async function*(t,n){e.markers&&(yield{type:`boundary-start`,value:`<!--elur-${t}-->`,index:t});try{let t=await b(n);y(e),yield*m(t,e)}catch(n){throw e.onError?.(n,{index:t,context:`node`,cause:n}),n}e.markers&&(yield{type:`boundary-end`,value:`<!--elur-end-${t}-->`,index:t})},attr:async(n,r,i,o,s,c)=>{let l=[{type:`markup`,value:n,index:r}],u=await b(c);if(y(e),i!==`ref`&&u!=null&&u!==!1){let e=o?a.sanitizeUrl(String(u)):String(u),t=/\s$/.test(n)?``:` `;l.push({type:`markup`,value:`${t}${i}="${C(e)}"`,index:r})}return e.markers&&!t&&l.push({type:`markup`,value:` data-elur-a-${r}="${C(i)}"`,index:r}),l},event:(n,r,i)=>e.markers&&!t?{type:`markup`,value:`${r}${/\s$/.test(r)?``:` `}data-elur-e-${n}="${C(i)}"`,index:n}:{type:`markup`,value:r.replace(/\s+$/,``),index:n}}}async function*_(e,t){let n=e.hydrate!==void 0;if(e.ssr){yield*e.ssr(g(t,n),e.values);return}let r=new Uint8Array(e.strings.length);for(let i=0;i<e.strings.length;i++){if(t.signal?.aborted)throw t.signal.reason??new DOMException(`Render aborted`,`AbortError`);let o=e.strings[i];if(r[i]===1&&(o[0]===`"`||o[0]===`'`)&&(o=o.slice(1)),i>=e.contexts.length){yield{type:`markup`,value:o,index:i};continue}let s=e.contexts[i],c=e.values[i];if(s.type===`node`){yield{type:`markup`,value:o,index:i},t.markers&&(yield{type:`boundary-start`,value:`<!--elur-${i}-->`,index:i});try{let e=await b(c);y(t),yield*m(e,t)}catch(e){throw t.onError?.(e,{index:i,context:`node`,cause:e}),e}t.markers&&(yield{type:`boundary-end`,value:`<!--elur-end-${i}-->`,index:i});continue}let l=x(s),u=o.slice(0,-l);if(s.hadOpenQuote&&(r[i+1]=1),s.type===`event`){t.markers&&!n?yield{type:`markup`,value:`${u}${/\s$/.test(u)?``:` `}data-elur-e-${i}="${C(s.eventName)}"`,index:i}:yield{type:`markup`,value:u.replace(/\s+$/,``),index:i};continue}yield{type:`markup`,value:u,index:i};let d=await b(c);if(y(t),s.attrName!==`ref`&&d!=null&&d!==!1){let e=s.url?a.sanitizeUrl(String(d)):String(d);yield{type:`markup`,value:`${/\s$/.test(u)?``:` `}${s.attrName}="${C(e)}"`,index:i}}t.markers&&!n&&(yield{type:`markup`,value:` data-elur-a-${i}="${C(s.attrName)}"`,index:i})}}async function v(e,t){let n=``;for await(let r of m(e,t))n+=r.value;return n}function y(e){if(e.signal?.aborted)throw e.signal.reason??new DOMException(`Render aborted`,`AbortError`)}async function b(n){if(n instanceof e.Signal)return n.peek();if(t.isDerivedBinding(n))return e.untrack(n.get);let r=typeof n==`function`?n():n;return r instanceof Promise?await r:r}function x(e){return e.type===`event`?`@${e.modifiers.length?`${e.eventName}.${e.modifiers.join(`.`)}`:e.eventName}=`.length+ +!!e.hadOpenQuote:`${e.attrName}=`.length+ +!!e.hadOpenQuote}function S(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function C(e){return S(e).replace(/"/g,`&quot;`)}exports.createServerRenderScope=u,exports.renderToChunks=p,exports.renderToString=f;
2
2
  //# sourceMappingURL=server.cjs.map