@elurjs/core 3.6.1 → 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.
- package/dist/lib/async.cjs +1 -1
- package/dist/lib/async.js +1 -1
- package/dist/lib/component.cjs +1 -2
- package/dist/lib/component.js +2 -66
- package/dist/lib/context.cjs +1 -1
- package/dist/lib/context.js +35 -23
- package/dist/lib/devtools.cjs +1 -1
- package/dist/lib/devtools.js +1 -1
- package/dist/lib/elur/async.cjs +1 -1
- package/dist/lib/elur/async.cjs.map +1 -1
- package/dist/lib/elur/async.js +1 -1
- package/dist/lib/elur/component.cjs +1 -2
- package/dist/lib/elur/component.d.cts +1 -17
- package/dist/lib/elur/component.d.ts +1 -17
- package/dist/lib/elur/component.js +2 -66
- package/dist/lib/elur/context.cjs +1 -1
- package/dist/lib/elur/context.cjs.map +1 -1
- package/dist/lib/elur/context.d.cts +5 -0
- package/dist/lib/elur/context.d.ts +5 -0
- package/dist/lib/elur/context.js +35 -23
- package/dist/lib/elur/context.js.map +1 -1
- package/dist/lib/elur/devtools.cjs +1 -1
- package/dist/lib/elur/devtools.cjs.map +1 -1
- package/dist/lib/elur/devtools.js +1 -1
- package/dist/lib/elur/form.cjs +1 -1
- package/dist/lib/elur/form.cjs.map +1 -1
- package/dist/lib/elur/form.js +1 -1
- package/dist/lib/elur/hydrate/index.cjs +1 -2
- package/dist/lib/elur/hydrate/index.d.cts +1 -13
- package/dist/lib/elur/hydrate/index.d.ts +1 -13
- package/dist/lib/elur/hydrate/index.js +2 -410
- package/dist/lib/elur/lifecycle.cjs +1 -1
- package/dist/lib/elur/lifecycle.cjs.map +1 -1
- package/dist/lib/elur/lifecycle.d.cts +27 -0
- package/dist/lib/elur/lifecycle.d.ts +27 -0
- package/dist/lib/elur/lifecycle.js +4 -0
- package/dist/lib/elur/lifecycle.js.map +1 -1
- package/dist/lib/elur/next/component.d.cts +281 -0
- package/dist/lib/elur/next/component.d.ts +281 -0
- package/dist/lib/elur/next/dom-write.d.cts +18 -0
- package/dist/lib/elur/next/dom-write.d.ts +18 -0
- package/dist/lib/elur/next/hydrate.d.cts +14 -0
- package/dist/lib/elur/next/hydrate.d.ts +14 -0
- package/dist/lib/elur/next/keyed-diff.d.cts +46 -0
- package/dist/lib/elur/next/keyed-diff.d.ts +46 -0
- package/dist/lib/elur/next/mount-helpers.d.cts +25 -0
- package/dist/lib/elur/next/mount-helpers.d.ts +25 -0
- package/dist/lib/elur/next/mount.d.cts +29 -0
- package/dist/lib/elur/next/mount.d.ts +29 -0
- package/dist/lib/elur/next/node-binding.d.cts +6 -0
- package/dist/lib/elur/next/node-binding.d.ts +6 -0
- package/dist/lib/elur/next/reactivity.d.cts +193 -0
- package/dist/lib/elur/next/reactivity.d.ts +193 -0
- package/dist/lib/elur/next-2/component.cjs +2 -0
- package/dist/lib/elur/next-2/component.cjs.map +1 -0
- package/dist/lib/elur/next-2/component.d.cts +283 -0
- package/dist/lib/elur/next-2/component.d.ts +283 -0
- package/dist/lib/elur/next-2/component.js +340 -0
- package/dist/lib/elur/next-2/component.js.map +1 -0
- package/dist/lib/elur/next-2/dom-write.cjs +2 -0
- package/dist/lib/elur/next-2/dom-write.cjs.map +1 -0
- package/dist/lib/elur/next-2/dom-write.d.cts +18 -0
- package/dist/lib/elur/next-2/dom-write.d.ts +18 -0
- package/dist/lib/elur/next-2/dom-write.js +31 -0
- package/dist/lib/elur/next-2/dom-write.js.map +1 -0
- package/dist/lib/elur/next-2/hydrate.cjs +2 -0
- package/dist/lib/elur/next-2/hydrate.cjs.map +1 -0
- package/dist/lib/elur/next-2/hydrate.d.cts +30 -0
- package/dist/lib/elur/next-2/hydrate.d.ts +30 -0
- package/dist/lib/elur/next-2/hydrate.js +449 -0
- package/dist/lib/elur/next-2/hydrate.js.map +1 -0
- package/dist/lib/elur/next-2/keyed-diff.cjs +2 -0
- package/dist/lib/elur/next-2/keyed-diff.cjs.map +1 -0
- package/dist/lib/elur/next-2/keyed-diff.d.cts +79 -0
- package/dist/lib/elur/next-2/keyed-diff.d.ts +79 -0
- package/dist/lib/elur/next-2/keyed-diff.js +208 -0
- package/dist/lib/elur/next-2/keyed-diff.js.map +1 -0
- package/dist/lib/elur/next-2/mount-helpers.cjs +2 -0
- package/dist/lib/elur/next-2/mount-helpers.cjs.map +1 -0
- package/dist/lib/elur/next-2/mount-helpers.d.cts +25 -0
- package/dist/lib/elur/next-2/mount-helpers.d.ts +25 -0
- package/dist/lib/elur/next-2/mount-helpers.js +87 -0
- package/dist/lib/elur/next-2/mount-helpers.js.map +1 -0
- package/dist/lib/elur/next-2/mount.cjs +2 -0
- package/dist/lib/elur/next-2/mount.cjs.map +1 -0
- package/dist/lib/elur/next-2/mount.d.cts +29 -0
- package/dist/lib/elur/next-2/mount.d.ts +29 -0
- package/dist/lib/elur/next-2/mount.js +34 -0
- package/dist/lib/elur/next-2/mount.js.map +1 -0
- package/dist/lib/elur/next-2/node-binding.cjs +2 -0
- package/dist/lib/elur/next-2/node-binding.cjs.map +1 -0
- package/dist/lib/elur/next-2/node-binding.d.cts +6 -0
- package/dist/lib/elur/next-2/node-binding.d.ts +6 -0
- package/dist/lib/elur/next-2/node-binding.js +130 -0
- package/dist/lib/elur/next-2/node-binding.js.map +1 -0
- package/dist/lib/elur/next-2/reactivity.cjs +2 -0
- package/dist/lib/elur/next-2/reactivity.cjs.map +1 -0
- package/dist/lib/elur/next-2/reactivity.d.cts +220 -0
- package/dist/lib/elur/next-2/reactivity.d.ts +220 -0
- package/dist/lib/elur/next-2/reactivity.js +614 -0
- package/dist/lib/elur/next-2/reactivity.js.map +1 -0
- package/dist/lib/elur/next-2/scheduler.cjs +2 -0
- package/dist/lib/elur/next-2/scheduler.cjs.map +1 -0
- package/dist/lib/elur/next-2/scheduler.d.cts +23 -0
- package/dist/lib/elur/next-2/scheduler.d.ts +23 -0
- package/dist/lib/elur/next-2/scheduler.js +26 -0
- package/dist/lib/elur/next-2/scheduler.js.map +1 -0
- package/dist/lib/elur/plugins.cjs +1 -1
- package/dist/lib/elur/plugins.cjs.map +1 -1
- package/dist/lib/elur/plugins.js +1 -1
- package/dist/lib/elur/reactivity.cjs +1 -2
- package/dist/lib/elur/reactivity.d.cts +1 -67
- package/dist/lib/elur/reactivity.d.ts +1 -67
- package/dist/lib/elur/reactivity.js +2 -218
- package/dist/lib/elur/router.cjs +2 -2
- package/dist/lib/elur/router.cjs.map +1 -1
- package/dist/lib/elur/router.js +2 -2
- package/dist/lib/elur/router.js.map +1 -1
- package/dist/lib/elur/server/index.cjs +1 -1
- package/dist/lib/elur/server/index.cjs.map +1 -1
- package/dist/lib/elur/server/index.js +180 -108
- package/dist/lib/elur/server/index.js.map +1 -1
- package/dist/lib/elur/store.cjs +1 -1
- package/dist/lib/elur/store.cjs.map +1 -1
- package/dist/lib/elur/store.js +10 -4
- package/dist/lib/elur/store.js.map +1 -1
- package/dist/lib/elur/template/bindings.cjs +1 -1
- package/dist/lib/elur/template/bindings.cjs.map +1 -1
- package/dist/lib/elur/template/bindings.js +98 -84
- package/dist/lib/elur/template/bindings.js.map +1 -1
- package/dist/lib/elur/template/dom-write.d.cts +1 -5
- package/dist/lib/elur/template/dom-write.d.ts +1 -5
- package/dist/lib/elur/template/error-boundary.cjs +1 -1
- package/dist/lib/elur/template/error-boundary.cjs.map +1 -1
- package/dist/lib/elur/template/error-boundary.js +56 -50
- package/dist/lib/elur/template/error-boundary.js.map +1 -1
- package/dist/lib/elur/template/html.cjs +1 -1
- package/dist/lib/elur/template/html.cjs.map +1 -1
- package/dist/lib/elur/template/html.js +40 -37
- package/dist/lib/elur/template/html.js.map +1 -1
- package/dist/lib/elur/template/index.cjs +1 -1
- package/dist/lib/elur/template/index.d.cts +2 -1
- package/dist/lib/elur/template/index.d.ts +2 -1
- package/dist/lib/elur/template/index.js +13 -12
- package/dist/lib/elur/template/keyed-diff.d.cts +1 -32
- package/dist/lib/elur/template/keyed-diff.d.ts +1 -32
- package/dist/lib/elur/template/keyed.cjs +1 -1
- package/dist/lib/elur/template/keyed.cjs.map +1 -1
- package/dist/lib/elur/template/keyed.d.cts +10 -2
- package/dist/lib/elur/template/keyed.d.ts +10 -2
- package/dist/lib/elur/template/keyed.js +12 -1
- package/dist/lib/elur/template/keyed.js.map +1 -1
- package/dist/lib/elur/template/mount-helpers.d.cts +1 -29
- package/dist/lib/elur/template/mount-helpers.d.ts +1 -29
- package/dist/lib/elur/template/node-binding.d.cts +1 -6
- package/dist/lib/elur/template/node-binding.d.ts +1 -6
- package/dist/lib/elur/template/portal.cjs +1 -1
- package/dist/lib/elur/template/portal.cjs.map +1 -1
- package/dist/lib/elur/template/portal.js +1 -1
- package/dist/lib/elur/template/transitions.cjs +1 -1
- package/dist/lib/elur/template/transitions.cjs.map +1 -1
- package/dist/lib/elur/template/transitions.js +2 -2
- package/dist/lib/elur/template/types.cjs +1 -1
- package/dist/lib/elur/template/types.cjs.map +1 -1
- package/dist/lib/elur/template/types.d.cts +55 -0
- package/dist/lib/elur/template/types.d.ts +55 -0
- package/dist/lib/elur/template/types.js +5 -1
- package/dist/lib/elur/template/types.js.map +1 -1
- package/dist/lib/elur.cjs +1 -1
- package/dist/lib/elur.js +2 -2
- package/dist/lib/form.cjs +1 -1
- package/dist/lib/form.js +1 -1
- package/dist/lib/hydrate.cjs +1 -2
- package/dist/lib/hydrate.js +2 -410
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.js +2 -2
- package/dist/lib/lifecycle.cjs +1 -1
- package/dist/lib/lifecycle.js +4 -0
- package/dist/lib/plugins.cjs +1 -1
- package/dist/lib/plugins.js +1 -1
- package/dist/lib/router.cjs +2 -2
- package/dist/lib/router.js +2 -2
- package/dist/lib/server.cjs +1 -1
- package/dist/lib/server.js +180 -108
- package/dist/lib/signals.cjs +1 -2
- package/dist/lib/signals.js +2 -218
- package/dist/lib/store.cjs +1 -1
- package/dist/lib/store.js +10 -4
- package/dist/lib/template.cjs +1 -1
- package/dist/lib/template.js +13 -12
- package/package.json +7 -9
- package/dist/lib/elur/component.cjs.map +0 -1
- package/dist/lib/elur/component.js.map +0 -1
- package/dist/lib/elur/hydrate/index.cjs.map +0 -1
- package/dist/lib/elur/hydrate/index.js.map +0 -1
- package/dist/lib/elur/reactivity.cjs.map +0 -1
- package/dist/lib/elur/reactivity.js.map +0 -1
- package/dist/lib/elur/template/dom-write.cjs +0 -2
- package/dist/lib/elur/template/dom-write.cjs.map +0 -1
- package/dist/lib/elur/template/dom-write.js +0 -16
- package/dist/lib/elur/template/dom-write.js.map +0 -1
- package/dist/lib/elur/template/keyed-diff.cjs +0 -2
- package/dist/lib/elur/template/keyed-diff.cjs.map +0 -1
- package/dist/lib/elur/template/keyed-diff.js +0 -100
- package/dist/lib/elur/template/keyed-diff.js.map +0 -1
- package/dist/lib/elur/template/mount-helpers.cjs +0 -2
- package/dist/lib/elur/template/mount-helpers.cjs.map +0 -1
- package/dist/lib/elur/template/mount-helpers.js +0 -132
- package/dist/lib/elur/template/mount-helpers.js.map +0 -1
- package/dist/lib/elur/template/node-binding.cjs +0 -2
- package/dist/lib/elur/template/node-binding.cjs.map +0 -1
- package/dist/lib/elur/template/node-binding.js +0 -95
- package/dist/lib/elur/template/node-binding.js.map +0 -1
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { Signal as e, untrack as t } from "./elur/next-2/reactivity.js";
|
|
2
|
+
import { ELUR_RENDER_PROTOCOL as n, ELUR_TEMPLATE_DESCRIPTOR as r, isDerivedBinding as i, isElurTemplate as a, isKeyedList as o } from "./elur/template/types.js";
|
|
3
|
+
import { isElurComponent as s } from "./lifecycle.js";
|
|
4
|
+
import { _popComponentContext as c, _pushComponentContext as l, _setContextScopeResolver as u } from "./context.js";
|
|
5
|
+
import { normalizeRepeatKey as d, serializeRepeatKey as f } from "./elur/template/keyed.js";
|
|
6
|
+
import { sanitizeUrl as p } from "./elur/template/sanitize.js";
|
|
7
|
+
import { AsyncLocalStorage as m } from "node:async_hooks";
|
|
7
8
|
//#region src/elur/server/index.ts
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
function
|
|
9
|
+
var h = a, g = o, _ = new m();
|
|
10
|
+
u(() => _.getStore());
|
|
11
|
+
function v(e = {}) {
|
|
11
12
|
let t = new AbortController(), n = {
|
|
12
13
|
markers: e.markers === "hydration",
|
|
13
14
|
context: e.context,
|
|
14
15
|
onError: e.onError
|
|
15
|
-
}, r = (e) => Promise.resolve(
|
|
16
|
+
}, r = (e) => Promise.resolve(_.run([], e));
|
|
16
17
|
return {
|
|
17
18
|
signal: t.signal,
|
|
18
19
|
async render(e, i) {
|
|
@@ -22,11 +23,11 @@ function h(e = {}) {
|
|
|
22
23
|
signal: t.signal
|
|
23
24
|
}, o = "";
|
|
24
25
|
return await r(() => (async () => {
|
|
25
|
-
for await (let t of
|
|
26
|
+
for await (let t of S(e, a)) o += t.value;
|
|
26
27
|
})()), o;
|
|
27
28
|
},
|
|
28
29
|
renderToChunks(e, r) {
|
|
29
|
-
return
|
|
30
|
+
return y(e, {
|
|
30
31
|
...n,
|
|
31
32
|
markers: r?.markers ?? n.markers,
|
|
32
33
|
signal: t.signal
|
|
@@ -37,13 +38,13 @@ function h(e = {}) {
|
|
|
37
38
|
}
|
|
38
39
|
};
|
|
39
40
|
}
|
|
40
|
-
function
|
|
41
|
+
function y(e, t) {
|
|
41
42
|
return { async *[Symbol.asyncIterator]() {
|
|
42
43
|
let n = [], r = [], i = !1, a, o = () => {
|
|
43
44
|
r.shift()?.();
|
|
44
|
-
}, s =
|
|
45
|
+
}, s = _.run([], async () => {
|
|
45
46
|
try {
|
|
46
|
-
for await (let r of
|
|
47
|
+
for await (let r of S(e, t)) n.push(r), o();
|
|
47
48
|
} catch (e) {
|
|
48
49
|
a = e;
|
|
49
50
|
} finally {
|
|
@@ -56,7 +57,11 @@ function g(e, t) {
|
|
|
56
57
|
let e = n.shift();
|
|
57
58
|
e && (yield e);
|
|
58
59
|
}
|
|
59
|
-
if (a) throw
|
|
60
|
+
if (a) throw yield {
|
|
61
|
+
type: "error",
|
|
62
|
+
value: a instanceof Error ? a.message : String(a),
|
|
63
|
+
index: -1
|
|
64
|
+
}, a;
|
|
60
65
|
yield {
|
|
61
66
|
type: "done",
|
|
62
67
|
value: "",
|
|
@@ -64,66 +69,66 @@ function g(e, t) {
|
|
|
64
69
|
}, await s;
|
|
65
70
|
} };
|
|
66
71
|
}
|
|
67
|
-
async function
|
|
72
|
+
async function b(e, t = {}) {
|
|
68
73
|
let n = {
|
|
69
74
|
markers: t.markers === "hydration",
|
|
70
75
|
signal: t.signal,
|
|
71
76
|
context: t.context,
|
|
72
77
|
onError: t.onError
|
|
73
78
|
}, r = "";
|
|
74
|
-
return await Promise.resolve(
|
|
75
|
-
for await (let t of
|
|
79
|
+
return await Promise.resolve(_.run([], async () => {
|
|
80
|
+
for await (let t of S(e, n)) r += t.value;
|
|
76
81
|
})), r;
|
|
77
82
|
}
|
|
78
|
-
function
|
|
79
|
-
return
|
|
83
|
+
function x(e, t = {}) {
|
|
84
|
+
return y(e, {
|
|
80
85
|
markers: t.markers === "hydration",
|
|
81
86
|
signal: t.signal,
|
|
82
87
|
context: t.context,
|
|
83
88
|
onError: t.onError
|
|
84
89
|
});
|
|
85
90
|
}
|
|
86
|
-
async function*
|
|
87
|
-
if (
|
|
88
|
-
yield*
|
|
91
|
+
async function* S(e, t) {
|
|
92
|
+
if (D(t), e instanceof Promise) {
|
|
93
|
+
yield* S(await e, t);
|
|
89
94
|
return;
|
|
90
95
|
}
|
|
91
|
-
if (!(
|
|
92
|
-
if (typeof
|
|
96
|
+
if (!(e == null || e === !1 || e === !0)) {
|
|
97
|
+
if (typeof e == "string" || typeof e == "number" || typeof e == "bigint") {
|
|
93
98
|
yield {
|
|
94
99
|
type: "markup",
|
|
95
|
-
value:
|
|
100
|
+
value: A(String(e)),
|
|
96
101
|
index: -1
|
|
97
102
|
};
|
|
98
103
|
return;
|
|
99
104
|
}
|
|
100
|
-
if (Array.isArray(
|
|
101
|
-
let
|
|
102
|
-
|
|
103
|
-
for (let
|
|
105
|
+
if (Array.isArray(e)) {
|
|
106
|
+
let n = await Promise.all(e.map((e) => O(e)));
|
|
107
|
+
D(t);
|
|
108
|
+
for (let e of n) t.markers && (yield {
|
|
104
109
|
type: "markup",
|
|
105
110
|
value: "<!--elur-ai-->",
|
|
106
111
|
index: -1
|
|
107
|
-
}), yield*
|
|
112
|
+
}), yield* S(e, t), t.markers && (yield {
|
|
108
113
|
type: "markup",
|
|
109
114
|
value: "<!--elur-aiend-->",
|
|
110
115
|
index: -1
|
|
111
116
|
});
|
|
112
117
|
return;
|
|
113
118
|
}
|
|
114
|
-
if ((typeof
|
|
115
|
-
let
|
|
116
|
-
if (
|
|
117
|
-
let e = await
|
|
118
|
-
markers:
|
|
119
|
-
signal:
|
|
120
|
-
context:
|
|
121
|
-
render: (e,
|
|
122
|
-
...
|
|
123
|
-
markers:
|
|
119
|
+
if ((typeof e == "object" || typeof e == "function") && e !== null) {
|
|
120
|
+
let r = e[n];
|
|
121
|
+
if (r?.renderServer) {
|
|
122
|
+
let e = await r.renderServer({
|
|
123
|
+
markers: t.markers,
|
|
124
|
+
signal: t.signal,
|
|
125
|
+
context: t.context,
|
|
126
|
+
render: (e, n) => E(e, {
|
|
127
|
+
...t,
|
|
128
|
+
markers: n?.markers ?? t.markers
|
|
124
129
|
})
|
|
125
130
|
});
|
|
126
|
-
|
|
131
|
+
D(t), yield {
|
|
127
132
|
type: "markup",
|
|
128
133
|
value: e,
|
|
129
134
|
index: -1
|
|
@@ -131,27 +136,27 @@ async function* y(n, r) {
|
|
|
131
136
|
return;
|
|
132
137
|
}
|
|
133
138
|
}
|
|
134
|
-
if (
|
|
135
|
-
yield*
|
|
139
|
+
if (s(e)) {
|
|
140
|
+
yield* C(e, t);
|
|
136
141
|
return;
|
|
137
142
|
}
|
|
138
|
-
if (
|
|
139
|
-
if (!
|
|
143
|
+
if (g(e)) {
|
|
144
|
+
if (!t.markers) {
|
|
140
145
|
yield {
|
|
141
146
|
type: "markup",
|
|
142
|
-
value: (await Promise.all(
|
|
147
|
+
value: (await Promise.all(e.items.map((n, r) => E(e.renderFn(n, r), t)))).join(""),
|
|
143
148
|
index: -1
|
|
144
149
|
};
|
|
145
150
|
return;
|
|
146
151
|
}
|
|
147
|
-
let
|
|
148
|
-
for (let
|
|
149
|
-
let i =
|
|
150
|
-
|
|
152
|
+
let n = /* @__PURE__ */ new Set();
|
|
153
|
+
for (let r = 0; r < e.items.length; r++) {
|
|
154
|
+
let i = e.items[r], a = d(e.keyFn(i, r), r), o = f(a);
|
|
155
|
+
n.has(o) && console.warn(`[elur] repeat(): duplicate key "${a}" during server render. Keys must be unique; entries after the first will leak during hydration.`), n.add(o), yield {
|
|
151
156
|
type: "markup",
|
|
152
157
|
value: `<!--elur-ki:${o}-->`,
|
|
153
158
|
index: -1
|
|
154
|
-
}, yield*
|
|
159
|
+
}, yield* S(e.renderFn(i, r), t), yield {
|
|
155
160
|
type: "markup",
|
|
156
161
|
value: "<!--elur-ke-->",
|
|
157
162
|
index: -1
|
|
@@ -159,21 +164,21 @@ async function* y(n, r) {
|
|
|
159
164
|
}
|
|
160
165
|
return;
|
|
161
166
|
}
|
|
162
|
-
if (
|
|
163
|
-
let
|
|
164
|
-
if (!
|
|
165
|
-
yield*
|
|
167
|
+
if (h(e)) {
|
|
168
|
+
let n = e[r];
|
|
169
|
+
if (!n) throw TypeError("[elur] Template does not support server rendering");
|
|
170
|
+
yield* T(n, t);
|
|
166
171
|
return;
|
|
167
172
|
}
|
|
168
173
|
yield {
|
|
169
174
|
type: "markup",
|
|
170
|
-
value:
|
|
175
|
+
value: A(String(e)),
|
|
171
176
|
index: -1
|
|
172
177
|
};
|
|
173
178
|
}
|
|
174
179
|
}
|
|
175
|
-
async function*
|
|
176
|
-
|
|
180
|
+
async function* C(e, t) {
|
|
181
|
+
l();
|
|
177
182
|
let n = {
|
|
178
183
|
index: -1,
|
|
179
184
|
context: "component",
|
|
@@ -188,7 +193,7 @@ async function* b(e, t) {
|
|
|
188
193
|
else throw t;
|
|
189
194
|
}
|
|
190
195
|
try {
|
|
191
|
-
yield*
|
|
196
|
+
yield* S(e.render(), t);
|
|
192
197
|
} catch (t) {
|
|
193
198
|
if (e.onError) {
|
|
194
199
|
e.onError(t);
|
|
@@ -202,106 +207,173 @@ async function* b(e, t) {
|
|
|
202
207
|
cause: e
|
|
203
208
|
}), e;
|
|
204
209
|
} finally {
|
|
205
|
-
|
|
210
|
+
c();
|
|
206
211
|
}
|
|
207
212
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
213
|
+
function w(e, t) {
|
|
214
|
+
return {
|
|
215
|
+
m: (e) => ({
|
|
216
|
+
type: "markup",
|
|
217
|
+
value: e,
|
|
218
|
+
index: -1
|
|
219
|
+
}),
|
|
220
|
+
node: async function* (t, n) {
|
|
221
|
+
e.markers && (yield {
|
|
222
|
+
type: "boundary-start",
|
|
223
|
+
value: `<!--elur-${t}-->`,
|
|
224
|
+
index: t
|
|
225
|
+
});
|
|
226
|
+
try {
|
|
227
|
+
let t = await O(n);
|
|
228
|
+
D(e), yield* S(t, e);
|
|
229
|
+
} catch (n) {
|
|
230
|
+
throw e.onError?.(n, {
|
|
231
|
+
index: t,
|
|
232
|
+
context: "node",
|
|
233
|
+
cause: n
|
|
234
|
+
}), n;
|
|
235
|
+
}
|
|
236
|
+
e.markers && (yield {
|
|
237
|
+
type: "boundary-end",
|
|
238
|
+
value: `<!--elur-end-${t}-->`,
|
|
239
|
+
index: t
|
|
240
|
+
});
|
|
241
|
+
},
|
|
242
|
+
attr: async (n, r, i, a, o, s) => {
|
|
243
|
+
let c = [{
|
|
244
|
+
type: "markup",
|
|
245
|
+
value: n,
|
|
246
|
+
index: r
|
|
247
|
+
}], l = await O(s);
|
|
248
|
+
if (D(e), i !== "ref" && l != null && l !== !1) {
|
|
249
|
+
let e = a ? p(String(l)) : String(l), t = /\s$/.test(n) ? "" : " ";
|
|
250
|
+
c.push({
|
|
251
|
+
type: "markup",
|
|
252
|
+
value: `${t}${i}="${j(e)}"`,
|
|
253
|
+
index: r
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return e.markers && !t && c.push({
|
|
257
|
+
type: "markup",
|
|
258
|
+
value: ` data-elur-a-${r}="${j(i)}"`,
|
|
259
|
+
index: r
|
|
260
|
+
}), c;
|
|
261
|
+
},
|
|
262
|
+
event: (n, r, i) => e.markers && !t ? {
|
|
263
|
+
type: "markup",
|
|
264
|
+
value: `${r}${/\s$/.test(r) ? "" : " "}data-elur-e-${n}="${j(i)}"`,
|
|
265
|
+
index: n
|
|
266
|
+
} : {
|
|
267
|
+
type: "markup",
|
|
268
|
+
value: r.replace(/\s+$/, ""),
|
|
269
|
+
index: n
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
async function* T(e, t) {
|
|
274
|
+
let n = e.hydrate !== void 0;
|
|
275
|
+
if (e.ssr) {
|
|
276
|
+
yield* e.ssr(w(t, n), e.values);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
let r = new Uint8Array(e.strings.length);
|
|
280
|
+
for (let i = 0; i < e.strings.length; i++) {
|
|
211
281
|
if (t.signal?.aborted) throw t.signal.reason ?? new DOMException("Render aborted", "AbortError");
|
|
212
|
-
let
|
|
213
|
-
if (
|
|
282
|
+
let a = e.strings[i];
|
|
283
|
+
if (r[i] === 1 && (a[0] === "\"" || a[0] === "'") && (a = a.slice(1)), i >= e.contexts.length) {
|
|
214
284
|
yield {
|
|
215
285
|
type: "markup",
|
|
216
|
-
value:
|
|
217
|
-
index:
|
|
286
|
+
value: a,
|
|
287
|
+
index: i
|
|
218
288
|
};
|
|
219
289
|
continue;
|
|
220
290
|
}
|
|
221
|
-
let
|
|
222
|
-
if (
|
|
291
|
+
let o = e.contexts[i], s = e.values[i];
|
|
292
|
+
if (o.type === "node") {
|
|
223
293
|
yield {
|
|
224
294
|
type: "markup",
|
|
225
|
-
value:
|
|
226
|
-
index:
|
|
295
|
+
value: a,
|
|
296
|
+
index: i
|
|
227
297
|
}, t.markers && (yield {
|
|
228
298
|
type: "boundary-start",
|
|
229
|
-
value: `<!--elur-${
|
|
230
|
-
index:
|
|
299
|
+
value: `<!--elur-${i}-->`,
|
|
300
|
+
index: i
|
|
231
301
|
});
|
|
232
302
|
try {
|
|
233
|
-
let e = await
|
|
234
|
-
|
|
303
|
+
let e = await O(s);
|
|
304
|
+
D(t), yield* S(e, t);
|
|
235
305
|
} catch (e) {
|
|
236
306
|
throw t.onError?.(e, {
|
|
237
|
-
index:
|
|
307
|
+
index: i,
|
|
238
308
|
context: "node",
|
|
239
309
|
cause: e
|
|
240
310
|
}), e;
|
|
241
311
|
}
|
|
242
312
|
t.markers && (yield {
|
|
243
313
|
type: "boundary-end",
|
|
244
|
-
value: `<!--elur-end-${
|
|
245
|
-
index:
|
|
314
|
+
value: `<!--elur-end-${i}-->`,
|
|
315
|
+
index: i
|
|
246
316
|
});
|
|
247
317
|
continue;
|
|
248
318
|
}
|
|
249
|
-
let
|
|
250
|
-
if (
|
|
251
|
-
t.markers ? yield {
|
|
319
|
+
let c = k(o), l = a.slice(0, -c);
|
|
320
|
+
if (o.hadOpenQuote && (r[i + 1] = 1), o.type === "event") {
|
|
321
|
+
t.markers && !n ? yield {
|
|
252
322
|
type: "markup",
|
|
253
|
-
value: `${
|
|
254
|
-
index:
|
|
323
|
+
value: `${l}${/\s$/.test(l) ? "" : " "}data-elur-e-${i}="${j(o.eventName)}"`,
|
|
324
|
+
index: i
|
|
255
325
|
} : yield {
|
|
256
326
|
type: "markup",
|
|
257
|
-
value:
|
|
258
|
-
index:
|
|
327
|
+
value: l.replace(/\s+$/, ""),
|
|
328
|
+
index: i
|
|
259
329
|
};
|
|
260
330
|
continue;
|
|
261
331
|
}
|
|
262
332
|
yield {
|
|
263
333
|
type: "markup",
|
|
264
|
-
value:
|
|
265
|
-
index:
|
|
334
|
+
value: l,
|
|
335
|
+
index: i
|
|
266
336
|
};
|
|
267
|
-
let
|
|
268
|
-
if (
|
|
269
|
-
let e =
|
|
337
|
+
let u = await O(s);
|
|
338
|
+
if (D(t), o.attrName !== "ref" && u != null && u !== !1) {
|
|
339
|
+
let e = o.url ? p(String(u)) : String(u);
|
|
270
340
|
yield {
|
|
271
341
|
type: "markup",
|
|
272
|
-
value: `${/\s$/.test(
|
|
273
|
-
index:
|
|
342
|
+
value: `${/\s$/.test(l) ? "" : " "}${o.attrName}="${j(e)}"`,
|
|
343
|
+
index: i
|
|
274
344
|
};
|
|
275
345
|
}
|
|
276
|
-
t.markers && (yield {
|
|
346
|
+
t.markers && !n && (yield {
|
|
277
347
|
type: "markup",
|
|
278
|
-
value: ` data-elur-a-${
|
|
279
|
-
index:
|
|
348
|
+
value: ` data-elur-a-${i}="${j(o.attrName)}"`,
|
|
349
|
+
index: i
|
|
280
350
|
});
|
|
281
351
|
}
|
|
282
352
|
}
|
|
283
|
-
async function
|
|
353
|
+
async function E(e, t) {
|
|
284
354
|
let n = "";
|
|
285
|
-
for await (let r of
|
|
355
|
+
for await (let r of S(e, t)) n += r.value;
|
|
286
356
|
return n;
|
|
287
357
|
}
|
|
288
|
-
function
|
|
358
|
+
function D(e) {
|
|
289
359
|
if (e.signal?.aborted) throw e.signal.reason ?? new DOMException("Render aborted", "AbortError");
|
|
290
360
|
}
|
|
291
|
-
async function
|
|
292
|
-
|
|
293
|
-
|
|
361
|
+
async function O(n) {
|
|
362
|
+
if (n instanceof e) return n.peek();
|
|
363
|
+
if (i(n)) return t(n.get);
|
|
364
|
+
let r = typeof n == "function" ? n() : n;
|
|
365
|
+
return r instanceof Promise ? await r : r;
|
|
294
366
|
}
|
|
295
|
-
function
|
|
367
|
+
function k(e) {
|
|
296
368
|
return e.type === "event" ? `@${e.modifiers.length ? `${e.eventName}.${e.modifiers.join(".")}` : e.eventName}=`.length + +!!e.hadOpenQuote : `${e.attrName}=`.length + +!!e.hadOpenQuote;
|
|
297
369
|
}
|
|
298
|
-
function
|
|
370
|
+
function A(e) {
|
|
299
371
|
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
300
372
|
}
|
|
301
|
-
function
|
|
302
|
-
return
|
|
373
|
+
function j(e) {
|
|
374
|
+
return A(e).replace(/"/g, """);
|
|
303
375
|
}
|
|
304
376
|
//#endregion
|
|
305
|
-
export {
|
|
377
|
+
export { v as createServerRenderScope, x as renderToChunks, b as renderToString };
|
|
306
378
|
|
|
307
379
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":[],"sources":["../../src/elur/server/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { _popComponentContext, _pushComponentContext, _setContextScopeResolver } from \"../context.js\";\nimport { isElurComponent, type ElurComponent } from \"../lifecycle.js\";\nimport {\n isKeyedList,\n isElurTemplate,\n ELUR_RENDER_PROTOCOL,\n ELUR_TEMPLATE_DESCRIPTOR,\n type ServerRenderProtocolContext,\n type TemplateBindingContext,\n type TemplateDescriptor,\n} from \"../template/types.js\";\nimport { sanitizeUrl } from \"../template/sanitize.js\";\nimport { normalizeRepeatKey, serializeRepeatKey } from \"../template/keyed.js\";\n\n// Local guards avoid sharing the same minified import binding name with\n// callback parameters in the same module (esbuild bug with shared chunks).\nconst isTemplate = isElurTemplate;\nconst isKeyed = isKeyedList;\n\nexport interface RenderErrorInfo {\n /** Binding index inside the descriptor (or -1 for root/component errors). */\n index: number;\n /** Binding context where the error occurred. */\n context: \"node\" | \"attribute\" | \"event\" | \"root\" | \"component\";\n /** The original error. */\n cause: unknown;\n /** Debug name of the component when the error happened inside one. */\n component?: string;\n}\n\nexport interface ServerRenderOptions {\n markers?: \"none\" | \"hydration\";\n signal?: AbortSignal;\n context?: unknown;\n onError?: (error: unknown, info: RenderErrorInfo) => void;\n}\n\n/** A fragment of the rendered markup, streamed incrementally by `renderToChunks`. */\nexport interface RenderChunk {\n type: \"markup\" | \"boundary-start\" | \"boundary-end\" | \"error\" | \"done\";\n value: string;\n index: number;\n}\n\ninterface RenderState {\n markers: boolean;\n signal?: AbortSignal;\n context?: unknown;\n onError?: (error: unknown, info: RenderErrorInfo) => void;\n}\n\nconst renderContext = new AsyncLocalStorage<Map<unknown, unknown>[]>();\n_setContextScopeResolver(() => renderContext.getStore());\n\nexport interface ServerRenderScope {\n /** Abort signal that cancels all renders created through this scope. */\n readonly signal: AbortSignal;\n /** Renders a value to a full string, sharing this scope's context isolation. */\n render(value: unknown, options?: { markers?: boolean }): Promise<string>;\n /** Streams a value as incremental chunks, sharing this scope's context isolation. */\n renderToChunks(value: unknown, options?: { markers?: boolean }): AsyncIterable<RenderChunk>;\n /** Aborts every render running inside this scope. */\n abort(reason?: unknown): void;\n}\n\n/**\n * Creates an explicit server render scope: a per-render isolation unit that\n * keeps component context, markers and abort state private. Concurrent renders\n * created from the same scope never share `provide`/`inject` state.\n */\nexport function createServerRenderScope(options: Omit<ServerRenderOptions, \"signal\"> = {}): ServerRenderScope {\n const controller = new AbortController();\n const state: RenderState = {\n markers: options.markers === \"hydration\",\n context: options.context,\n onError: options.onError,\n };\n const run = <T>(fn: () => Promise<T> | T): Promise<T> => Promise.resolve(renderContext.run([], fn));\n return {\n signal: controller.signal,\n async render(value, opts): Promise<string> {\n const scoped: RenderState = { ...state, markers: opts?.markers ?? state.markers, signal: controller.signal };\n let out = \"\";\n await run(() => {\n return (async () => {\n for await (const chunk of renderValueChunks(value, scoped)) {\n out += chunk.value;\n }\n })();\n });\n return out;\n },\n renderToChunks(value, opts): AsyncIterable<RenderChunk> {\n const scoped: RenderState = { ...state, markers: opts?.markers ?? state.markers, signal: controller.signal };\n return streamChunks(value, scoped);\n },\n abort(reason?: unknown): void {\n controller.abort(reason);\n },\n };\n}\n\n/**\n * Streams chunks produced inside an AsyncLocalStorage scope, preserving\n * per-render context isolation while yielding incrementally.\n */\nfunction streamChunks(value: unknown, state: RenderState): AsyncIterable<RenderChunk> {\n return {\n async *[Symbol.asyncIterator]() {\n const queue: RenderChunk[] = [];\n const waiters: Array<() => void> = [];\n let producerDone = false;\n let producerError: unknown;\n const wake = () => {\n const waiter = waiters.shift();\n waiter?.();\n };\n\n const task = renderContext.run([], async () => {\n try {\n for await (const chunk of renderValueChunks(value, state)) {\n queue.push(chunk);\n wake();\n }\n } catch (error) {\n producerError = error;\n } finally {\n producerDone = true;\n wake();\n }\n });\n\n while (true) {\n while (queue.length === 0) {\n if (producerDone) break;\n await new Promise<void>((resolve) => waiters.push(resolve));\n }\n if (queue.length === 0) break;\n const chunk = queue.shift()!;\n if (chunk) yield chunk;\n }\n if (producerError) throw producerError;\n yield { type: \"done\", value: \"\", index: -1 };\n await task;\n },\n };\n}\n\nexport async function renderToString(value: unknown, options: ServerRenderOptions = {}): Promise<string> {\n const state: RenderState = {\n markers: options.markers === \"hydration\",\n signal: options.signal,\n context: options.context,\n onError: options.onError,\n };\n let out = \"\";\n await Promise.resolve(\n renderContext.run([], async () => {\n for await (const chunk of renderValueChunks(value, state)) {\n out += chunk.value;\n }\n }),\n );\n return out;\n}\n\nexport function renderToChunks(\n value: unknown,\n options: ServerRenderOptions = {},\n): AsyncIterable<RenderChunk> {\n const state: RenderState = {\n markers: options.markers === \"hydration\",\n signal: options.signal,\n context: options.context,\n onError: options.onError,\n };\n return streamChunks(value, state);\n}\n\nasync function* renderValueChunks(value: unknown, state: RenderState): AsyncGenerator<RenderChunk> {\n checkAbort(state);\n if (value instanceof Promise) {\n yield* renderValueChunks(await value, state);\n return;\n }\n if (value === null || value === undefined || value === false || value === true) return;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"bigint\") {\n yield { type: \"markup\", value: escapeText(String(value)), index: -1 };\n return;\n }\n if (Array.isArray(value)) {\n const resolved = await Promise.all(value.map((item) => resolveBindingValue(item)));\n checkAbort(state);\n for (const item of resolved) {\n if (state.markers) yield { type: \"markup\", value: \"<!--elur-ai-->\", index: -1 };\n yield* renderValueChunks(item, state);\n if (state.markers) yield { type: \"markup\", value: \"<!--elur-aiend-->\", index: -1 };\n }\n return;\n }\n if ((typeof value === \"object\" || typeof value === \"function\") && value !== null) {\n const protocol = (value as Record<PropertyKey, unknown>)[ELUR_RENDER_PROTOCOL] as\n | { renderServer?: (context: ServerRenderProtocolContext) => string | Promise<string> }\n | undefined;\n if (protocol?.renderServer) {\n const output = await protocol.renderServer({\n markers: state.markers,\n signal: state.signal,\n context: state.context,\n render: (nested, options) => renderValue(nested, {\n ...state,\n markers: options?.markers ?? state.markers,\n }),\n });\n checkAbort(state);\n yield { type: \"markup\", value: output, index: -1 };\n return;\n }\n }\n if (isElurComponent(value)) {\n yield* renderComponentChunks(value, state);\n return;\n }\n if (isKeyed(value)) {\n if (!state.markers) {\n const rendered = await Promise.all(\n value.items.map((item, index) => renderValue(value.renderFn(item, index), state)),\n );\n yield { type: \"markup\", value: rendered.join(\"\"), index: -1 };\n return;\n }\n const seen = new Set<string>();\n for (let index = 0; index < value.items.length; index++) {\n const item = value.items[index];\n const key = normalizeRepeatKey(value.keyFn(item, index), index);\n const serialized = serializeRepeatKey(key);\n if (seen.has(serialized)) {\n console.warn(\n `[elur] repeat(): duplicate key \"${key}\" during server render. ` +\n \"Keys must be unique; entries after the first will leak during hydration.\",\n );\n }\n seen.add(serialized);\n yield { type: \"markup\", value: `<!--elur-ki:${serialized}-->`, index: -1 };\n yield* renderValueChunks(value.renderFn(item, index), state);\n yield { type: \"markup\", value: \"<!--elur-ke-->\", index: -1 };\n }\n return;\n }\n if (isTemplate(value)) {\n const descriptor = value[ELUR_TEMPLATE_DESCRIPTOR];\n if (!descriptor) throw new TypeError(\"[elur] Template does not support server rendering\");\n yield* renderDescriptorChunks(descriptor, state);\n return;\n }\n yield { type: \"markup\", value: escapeText(String(value)), index: -1 };\n}\n\nasync function* renderComponentChunks(component: ElurComponent, state: RenderState): AsyncGenerator<RenderChunk> {\n _pushComponentContext();\n const info: RenderErrorInfo = {\n index: -1,\n context: \"component\",\n cause: undefined,\n component: component._debugName,\n };\n try {\n try {\n component.onInit?.();\n component.onServerRender?.();\n } catch (error) {\n if (component.onError) component.onError(error);\n else throw error;\n }\n try {\n yield* renderValueChunks(component.render(), state);\n } catch (error) {\n if (component.onError) {\n component.onError(error);\n return;\n }\n throw error;\n }\n } catch (error) {\n state.onError?.(error, { ...info, cause: error });\n throw error;\n } finally {\n _popComponentContext();\n }\n}\n\nasync function* renderDescriptorChunks(descriptor: TemplateDescriptor, state: RenderState): AsyncGenerator<RenderChunk> {\n const skipLeading = new Uint8Array(descriptor.strings.length);\n\n for (let index = 0; index < descriptor.strings.length; index++) {\n if (state.signal?.aborted) throw state.signal.reason ?? new DOMException(\"Render aborted\", \"AbortError\");\n let staticPart = descriptor.strings[index];\n if (skipLeading[index] === 1 && (staticPart[0] === '\"' || staticPart[0] === \"'\")) {\n staticPart = staticPart.slice(1);\n }\n if (index >= descriptor.contexts.length) {\n yield { type: \"markup\", value: staticPart, index };\n continue;\n }\n\n const context = descriptor.contexts[index];\n const value = descriptor.values[index];\n if (context.type === \"node\") {\n yield { type: \"markup\", value: staticPart, index };\n if (state.markers) yield { type: \"boundary-start\", value: `<!--elur-${index}-->`, index };\n try {\n const resolved = await resolveBindingValue(value);\n checkAbort(state);\n yield* renderValueChunks(resolved, state);\n } catch (error) {\n state.onError?.(error, { index, context: \"node\", cause: error });\n throw error;\n }\n if (state.markers) yield { type: \"boundary-end\", value: `<!--elur-end-${index}-->`, index };\n continue;\n }\n\n const cut = bindingCut(context);\n const prefix = staticPart.slice(0, -cut);\n if (context.hadOpenQuote) skipLeading[index + 1] = 1;\n if (context.type === \"event\") {\n if (state.markers) {\n const separator = /\\s$/.test(prefix) ? \"\" : \" \";\n yield { type: \"markup\", value: `${prefix}${separator}data-elur-e-${index}=\"${escapeAttribute(context.eventName)}\"`, index };\n } else {\n yield { type: \"markup\", value: prefix.replace(/\\s+$/, \"\"), index };\n }\n continue;\n }\n\n yield { type: \"markup\", value: prefix, index };\n const resolved = await resolveBindingValue(value);\n checkAbort(state);\n if (context.attrName !== \"ref\" && resolved !== null && resolved !== undefined && resolved !== false) {\n const serialized = context.url ? sanitizeUrl(String(resolved)) : String(resolved);\n const separator = /\\s$/.test(prefix) ? \"\" : \" \";\n yield { type: \"markup\", value: `${separator}${context.attrName}=\"${escapeAttribute(serialized)}\"`, index };\n }\n if (state.markers) yield { type: \"markup\", value: ` data-elur-a-${index}=\"${escapeAttribute(context.attrName)}\"`, index };\n }\n}\n\nasync function renderValue(value: unknown, state: RenderState): Promise<string> {\n let out = \"\";\n for await (const chunk of renderValueChunks(value, state)) {\n out += chunk.value;\n }\n return out;\n}\n\nfunction checkAbort(state: RenderState): void {\n if (state.signal?.aborted) throw state.signal.reason ?? new DOMException(\"Render aborted\", \"AbortError\");\n}\n\nasync function resolveBindingValue(value: unknown): Promise<unknown> {\n const resolved = typeof value === \"function\" ? (value as () => unknown)() : value;\n return resolved instanceof Promise ? await resolved : resolved;\n}\n\nfunction bindingCut(context: Exclude<TemplateBindingContext, { type: \"node\" }>): number {\n if (context.type === \"event\") {\n const full = context.modifiers.length\n ? `${context.eventName}.${context.modifiers.join(\".\")}`\n : context.eventName;\n return `@${full}=`.length + (context.hadOpenQuote ? 1 : 0);\n }\n return `${context.attrName}=`.length + (context.hadOpenQuote ? 1 : 0);\n}\n\nfunction escapeText(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \""\");\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":[],"sources":["../../src/elur/server/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { _popComponentContext, _pushComponentContext, _setContextScopeResolver } from \"../context.js\";\nimport { isElurComponent, type ElurComponent } from \"../lifecycle.js\";\nimport {\n isKeyedList,\n isElurTemplate,\n ELUR_RENDER_PROTOCOL,\n ELUR_TEMPLATE_DESCRIPTOR,\n type ServerRenderProtocolContext,\n type SsrEmit,\n type TemplateBindingContext,\n type TemplateDescriptor,\n} from \"../template/types.js\";\nimport { sanitizeUrl } from \"../template/sanitize.js\";\nimport { normalizeRepeatKey, serializeRepeatKey } from \"../template/keyed.js\";\nimport { Signal, untrack } from \"../reactivity.js\";\nimport { isDerivedBinding } from \"../template/types.js\";\n\n// Local guards avoid sharing the same minified import binding name with\n// callback parameters in the same module (esbuild bug with shared chunks).\nconst isTemplate = isElurTemplate;\nconst isKeyed = isKeyedList;\n\nexport interface RenderErrorInfo {\n /** Binding index inside the descriptor (or -1 for root/component errors). */\n index: number;\n /** Binding context where the error occurred. */\n context: \"node\" | \"attribute\" | \"event\" | \"root\" | \"component\";\n /** The original error. */\n cause: unknown;\n /** Debug name of the component when the error happened inside one. */\n component?: string;\n}\n\nexport interface ServerRenderOptions {\n markers?: \"none\" | \"hydration\";\n signal?: AbortSignal;\n context?: unknown;\n onError?: (error: unknown, info: RenderErrorInfo) => void;\n}\n\n/** A fragment of the rendered markup, streamed incrementally by `renderToChunks`. */\nexport interface RenderChunk {\n type: \"markup\" | \"boundary-start\" | \"boundary-end\" | \"error\" | \"done\";\n value: string;\n index: number;\n}\n\ninterface RenderState {\n markers: boolean;\n signal?: AbortSignal;\n context?: unknown;\n onError?: (error: unknown, info: RenderErrorInfo) => void;\n}\n\nconst renderContext = new AsyncLocalStorage<Map<unknown, unknown>[]>();\n_setContextScopeResolver(() => renderContext.getStore());\n\nexport interface ServerRenderScope {\n /** Abort signal that cancels all renders created through this scope. */\n readonly signal: AbortSignal;\n /** Renders a value to a full string, sharing this scope's context isolation. */\n render(value: unknown, options?: { markers?: boolean }): Promise<string>;\n /** Streams a value as incremental chunks, sharing this scope's context isolation. */\n renderToChunks(value: unknown, options?: { markers?: boolean }): AsyncIterable<RenderChunk>;\n /** Aborts every render running inside this scope. */\n abort(reason?: unknown): void;\n}\n\n/**\n * Creates an explicit server render scope: a per-render isolation unit that\n * keeps component context, markers and abort state private. Concurrent renders\n * created from the same scope never share `provide`/`inject` state.\n */\nexport function createServerRenderScope(options: Omit<ServerRenderOptions, \"signal\"> = {}): ServerRenderScope {\n const controller = new AbortController();\n const state: RenderState = {\n markers: options.markers === \"hydration\",\n context: options.context,\n onError: options.onError,\n };\n const run = <T>(fn: () => Promise<T> | T): Promise<T> => Promise.resolve(renderContext.run([], fn));\n return {\n signal: controller.signal,\n async render(value, opts): Promise<string> {\n const scoped: RenderState = { ...state, markers: opts?.markers ?? state.markers, signal: controller.signal };\n let out = \"\";\n await run(() => {\n return (async () => {\n for await (const chunk of renderValueChunks(value, scoped)) {\n out += chunk.value;\n }\n })();\n });\n return out;\n },\n renderToChunks(value, opts): AsyncIterable<RenderChunk> {\n const scoped: RenderState = { ...state, markers: opts?.markers ?? state.markers, signal: controller.signal };\n return streamChunks(value, scoped);\n },\n abort(reason?: unknown): void {\n controller.abort(reason);\n },\n };\n}\n\n/**\n * Streams chunks produced inside an AsyncLocalStorage scope, preserving\n * per-render context isolation while yielding incrementally.\n */\nfunction streamChunks(value: unknown, state: RenderState): AsyncIterable<RenderChunk> {\n return {\n async *[Symbol.asyncIterator]() {\n const queue: RenderChunk[] = [];\n const waiters: Array<() => void> = [];\n let producerDone = false;\n let producerError: unknown;\n const wake = () => {\n const waiter = waiters.shift();\n waiter?.();\n };\n\n const task = renderContext.run([], async () => {\n try {\n for await (const chunk of renderValueChunks(value, state)) {\n queue.push(chunk);\n wake();\n }\n } catch (error) {\n producerError = error;\n } finally {\n producerDone = true;\n wake();\n }\n });\n\n while (true) {\n while (queue.length === 0) {\n if (producerDone) break;\n await new Promise<void>((resolve) => waiters.push(resolve));\n }\n if (queue.length === 0) break;\n const chunk = queue.shift()!;\n if (chunk) yield chunk;\n }\n if (producerError) {\n yield { type: \"error\", value: producerError instanceof Error ? producerError.message : String(producerError), index: -1 };\n throw producerError;\n }\n yield { type: \"done\", value: \"\", index: -1 };\n await task;\n },\n };\n}\n\nexport async function renderToString(value: unknown, options: ServerRenderOptions = {}): Promise<string> {\n const state: RenderState = {\n markers: options.markers === \"hydration\",\n signal: options.signal,\n context: options.context,\n onError: options.onError,\n };\n let out = \"\";\n await Promise.resolve(\n renderContext.run([], async () => {\n for await (const chunk of renderValueChunks(value, state)) {\n out += chunk.value;\n }\n }),\n );\n return out;\n}\n\nexport function renderToChunks(\n value: unknown,\n options: ServerRenderOptions = {},\n): AsyncIterable<RenderChunk> {\n const state: RenderState = {\n markers: options.markers === \"hydration\",\n signal: options.signal,\n context: options.context,\n onError: options.onError,\n };\n return streamChunks(value, state);\n}\n\nasync function* renderValueChunks(value: unknown, state: RenderState): AsyncGenerator<RenderChunk> {\n checkAbort(state);\n if (value instanceof Promise) {\n yield* renderValueChunks(await value, state);\n return;\n }\n if (value === null || value === undefined || value === false || value === true) return;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"bigint\") {\n yield { type: \"markup\", value: escapeText(String(value)), index: -1 };\n return;\n }\n if (Array.isArray(value)) {\n const resolved = await Promise.all(value.map((item) => resolveBindingValue(item)));\n checkAbort(state);\n for (const item of resolved) {\n if (state.markers) yield { type: \"markup\", value: \"<!--elur-ai-->\", index: -1 };\n yield* renderValueChunks(item, state);\n if (state.markers) yield { type: \"markup\", value: \"<!--elur-aiend-->\", index: -1 };\n }\n return;\n }\n if ((typeof value === \"object\" || typeof value === \"function\") && value !== null) {\n const protocol = (value as Record<PropertyKey, unknown>)[ELUR_RENDER_PROTOCOL] as\n | { renderServer?: (context: ServerRenderProtocolContext) => string | Promise<string> }\n | undefined;\n if (protocol?.renderServer) {\n const output = await protocol.renderServer({\n markers: state.markers,\n signal: state.signal,\n context: state.context,\n render: (nested, options) => renderValue(nested, {\n ...state,\n markers: options?.markers ?? state.markers,\n }),\n });\n checkAbort(state);\n yield { type: \"markup\", value: output, index: -1 };\n return;\n }\n }\n if (isElurComponent(value)) {\n yield* renderComponentChunks(value, state);\n return;\n }\n if (isKeyed(value)) {\n if (!state.markers) {\n const rendered = await Promise.all(\n value.items.map((item, index) => renderValue(value.renderFn(item, index), state)),\n );\n yield { type: \"markup\", value: rendered.join(\"\"), index: -1 };\n return;\n }\n const seen = new Set<string>();\n for (let index = 0; index < value.items.length; index++) {\n const item = value.items[index];\n const key = normalizeRepeatKey(value.keyFn(item, index), index);\n const serialized = serializeRepeatKey(key);\n if (seen.has(serialized)) {\n console.warn(\n `[elur] repeat(): duplicate key \"${key}\" during server render. ` +\n \"Keys must be unique; entries after the first will leak during hydration.\",\n );\n }\n seen.add(serialized);\n yield { type: \"markup\", value: `<!--elur-ki:${serialized}-->`, index: -1 };\n yield* renderValueChunks(value.renderFn(item, index), state);\n yield { type: \"markup\", value: \"<!--elur-ke-->\", index: -1 };\n }\n return;\n }\n if (isTemplate(value)) {\n const descriptor = value[ELUR_TEMPLATE_DESCRIPTOR];\n if (!descriptor) throw new TypeError(\"[elur] Template does not support server rendering\");\n yield* renderDescriptorChunks(descriptor, state);\n return;\n }\n yield { type: \"markup\", value: escapeText(String(value)), index: -1 };\n}\n\nasync function* renderComponentChunks(component: ElurComponent, state: RenderState): AsyncGenerator<RenderChunk> {\n _pushComponentContext();\n const info: RenderErrorInfo = {\n index: -1,\n context: \"component\",\n cause: undefined,\n component: component._debugName,\n };\n try {\n try {\n component.onInit?.();\n component.onServerRender?.();\n } catch (error) {\n if (component.onError) component.onError(error);\n else throw error;\n }\n try {\n yield* renderValueChunks(component.render(), state);\n } catch (error) {\n if (component.onError) {\n component.onError(error);\n return;\n }\n throw error;\n }\n } catch (error) {\n state.onError?.(error, { ...info, cause: error });\n throw error;\n } finally {\n _popComponentContext();\n }\n}\n\n// C.12 fase 2: emit ops para el renderer SSR especializado (descriptor.ssr).\n// Replican exactamente la semántica del intérprete genérico — los strings\n// llegan pre-cortados desde el codegen (bindingCut/skipLeading en build).\nfunction makeSsrEmit(state: RenderState, compiledHydrate: boolean): SsrEmit {\n return {\n m: (value) => ({ type: \"markup\", value, index: -1 }),\n node: async function* (index, value) {\n if (state.markers) yield { type: \"boundary-start\", value: `<!--elur-${index}-->`, index };\n try {\n const resolved = await resolveBindingValue(value);\n checkAbort(state);\n yield* renderValueChunks(resolved, state);\n } catch (error) {\n state.onError?.(error, { index, context: \"node\", cause: error });\n throw error;\n }\n if (state.markers) yield { type: \"boundary-end\", value: `<!--elur-end-${index}-->`, index };\n },\n attr: async (prefix, index, attrName, url, _executable, value) => {\n const chunks: RenderChunk[] = [{ type: \"markup\", value: prefix, index }];\n const resolved = await resolveBindingValue(value);\n checkAbort(state);\n if (attrName !== \"ref\" && resolved !== null && resolved !== undefined && resolved !== false) {\n const serialized = url ? sanitizeUrl(String(resolved)) : String(resolved);\n const separator = /\\s$/.test(prefix) ? \"\" : \" \";\n chunks.push({ type: \"markup\", value: `${separator}${attrName}=\"${escapeAttribute(serialized)}\"`, index });\n }\n if (state.markers && !compiledHydrate) {\n chunks.push({ type: \"markup\", value: ` data-elur-a-${index}=\"${escapeAttribute(attrName)}\"`, index });\n }\n return chunks;\n },\n event: (index, prefix, eventName) => {\n if (state.markers && !compiledHydrate) {\n const separator = /\\s$/.test(prefix) ? \"\" : \" \";\n return { type: \"markup\", value: `${prefix}${separator}data-elur-e-${index}=\"${escapeAttribute(eventName)}\"`, index };\n }\n return { type: \"markup\", value: prefix.replace(/\\s+$/, \"\"), index };\n },\n };\n}\n\nasync function* renderDescriptorChunks(descriptor: TemplateDescriptor, state: RenderState): AsyncGenerator<RenderChunk> {\n // C.13: templates con hidratación compilada no necesitan `data-elur-*`\n // en el HTML — el cliente localiza los elementos por access paths.\n // Los `<!--elur-N-->` siguen emitiéndose (boundaries dinámicas).\n const compiledHydrate = descriptor.hydrate !== undefined;\n // C.12 fase 2: el artefacto compilado trae su propio renderer SSR —\n // mismo HTML, secuencia especializada en vez del loop intérprete.\n if (descriptor.ssr) {\n yield* descriptor.ssr(makeSsrEmit(state, compiledHydrate), descriptor.values);\n return;\n }\n const skipLeading = new Uint8Array(descriptor.strings.length);\n\n for (let index = 0; index < descriptor.strings.length; index++) {\n if (state.signal?.aborted) throw state.signal.reason ?? new DOMException(\"Render aborted\", \"AbortError\");\n let staticPart = descriptor.strings[index];\n if (skipLeading[index] === 1 && (staticPart[0] === '\"' || staticPart[0] === \"'\")) {\n staticPart = staticPart.slice(1);\n }\n if (index >= descriptor.contexts.length) {\n yield { type: \"markup\", value: staticPart, index };\n continue;\n }\n\n const context = descriptor.contexts[index];\n const value = descriptor.values[index];\n if (context.type === \"node\") {\n yield { type: \"markup\", value: staticPart, index };\n if (state.markers) yield { type: \"boundary-start\", value: `<!--elur-${index}-->`, index };\n try {\n const resolved = await resolveBindingValue(value);\n checkAbort(state);\n yield* renderValueChunks(resolved, state);\n } catch (error) {\n state.onError?.(error, { index, context: \"node\", cause: error });\n throw error;\n }\n if (state.markers) yield { type: \"boundary-end\", value: `<!--elur-end-${index}-->`, index };\n continue;\n }\n\n const cut = bindingCut(context);\n const prefix = staticPart.slice(0, -cut);\n if (context.hadOpenQuote) skipLeading[index + 1] = 1;\n if (context.type === \"event\") {\n if (state.markers && !compiledHydrate) {\n const separator = /\\s$/.test(prefix) ? \"\" : \" \";\n yield { type: \"markup\", value: `${prefix}${separator}data-elur-e-${index}=\"${escapeAttribute(context.eventName)}\"`, index };\n } else {\n yield { type: \"markup\", value: prefix.replace(/\\s+$/, \"\"), index };\n }\n continue;\n }\n\n yield { type: \"markup\", value: prefix, index };\n const resolved = await resolveBindingValue(value);\n checkAbort(state);\n if (context.attrName !== \"ref\" && resolved !== null && resolved !== undefined && resolved !== false) {\n const serialized = context.url ? sanitizeUrl(String(resolved)) : String(resolved);\n const separator = /\\s$/.test(prefix) ? \"\" : \" \";\n yield { type: \"markup\", value: `${separator}${context.attrName}=\"${escapeAttribute(serialized)}\"`, index };\n }\n if (state.markers && !compiledHydrate) yield { type: \"markup\", value: ` data-elur-a-${index}=\"${escapeAttribute(context.attrName)}\"`, index };\n }\n}\n\nasync function renderValue(value: unknown, state: RenderState): Promise<string> {\n let out = \"\";\n for await (const chunk of renderValueChunks(value, state)) {\n out += chunk.value;\n }\n return out;\n}\n\nfunction checkAbort(state: RenderState): void {\n if (state.signal?.aborted) throw state.signal.reason ?? new DOMException(\"Render aborted\", \"AbortError\");\n}\n\nasync function resolveBindingValue(value: unknown): Promise<unknown> {\n // C.6 T1: la señal viaja como valor — SSR la resuelve a su lectura actual.\n if (value instanceof Signal) return value.peek();\n // C.7 T2: el pack derivado se resuelve evaluando el getter untracked —\n // SSR no crea suscripciones y no debe contaminar un consumidor activo.\n if (isDerivedBinding(value)) return untrack(value.get);\n const resolved = typeof value === \"function\" ? (value as () => unknown)() : value;\n return resolved instanceof Promise ? await resolved : resolved;\n}\n\nfunction bindingCut(context: Exclude<TemplateBindingContext, { type: \"node\" }>): number {\n if (context.type === \"event\") {\n const full = context.modifiers.length\n ? `${context.eventName}.${context.modifiers.join(\".\")}`\n : context.eventName;\n return `@${full}=`.length + (context.hadOpenQuote ? 1 : 0);\n }\n return `${context.attrName}=`.length + (context.hadOpenQuote ? 1 : 0);\n}\n\nfunction escapeText(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \""\");\n}"],"mappings":"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"}
|
package/dist/lib/elur/store.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./elur/next-2/reactivity.cjs`);var t=class extends e.Signal{label;constructor(e,t=`ReadonlySignal`){super(e.peek()),this.label=t,Object.defineProperty(this,`value`,{get:()=>e.value,set:()=>{throw Error(`[elur] "${this.label}" is read-only.`)},configurable:!1}),this.update=()=>{throw Error(`[elur] "${this.label}" is read-only.`)},this.dispose=()=>{throw Error(`[elur] Cannot dispose "${this.label}" directly.`)}}},n=new Set([`$id`,`$state`,`$stateSignal`,`$snapshot`,`$reset`,`$patch`,`$watch`,`$dispose`]);function r(e){if(e===`__proto__`||e===`constructor`||e===`prototype`)throw Error(`[elur] Store key "${e}" is not allowed for security reasons.`);if(n.has(e))throw Error(`[elur] Store key "${e}" is reserved.`)}function i(e,t){return n.has(e)?(console.warn(`[elur] Store ${t} "${e}" is reserved and will be ignored.`),!1):!0}function a(e,n){return new t(e,n)}function o(t,o){let{name:s=`store`,actions:c,getters:l,plugins:u=[],serialize:d}=o??{},f=Object.keys(t),p={};for(let n of f)r(n),p[n]=e.signal(t[n]);let m=p,h=e.computed(()=>{let e={};for(let t of f)e[t]=p[t].value;return e}),g=a(h,`store "${s}".$stateSignal`),_;try{_=d?d(t):structuredClone(t)}catch(e){throw Error(`[elur] Store "${s}" initialState contains non-serializable data (functions, DOM nodes, Symbols, or WeakRefs). Provide a custom \`serialize\` option or remove these before creating the store. Original error: ${e}`)}let v=[];function y(){let t=x(),n=_;for(let e of v){let r=e(n,t);r!==void 0&&(n={...n,...r})}e.batch(()=>{for(let e of f)p[e].value=n[e]})}function b(t){let n=t,r=x();for(let e of v){let t=e(n,r);t!==void 0&&(n=t)}e.batch(()=>{for(let e of Object.keys(n))Object.prototype.hasOwnProperty.call(p,e)&&(p[e].value=n[e])})}function x(){let e={};for(let t of f)e[t]=p[t].peek();return e}function S(t,n){return e.watch(h,t,n)}let C=Object.assign(Object.create(null),m,{$reset:y,$patch:b,$watch:S,$snapshot:x});Object.defineProperty(C,`$id`,{value:s,writable:!1,enumerable:!1,configurable:!1}),Object.defineProperty(C,`$state`,{get(){return h.value},enumerable:!0,configurable:!1}),Object.defineProperty(C,`$stateSignal`,{value:g,writable:!1,enumerable:!1,configurable:!1}),Object.defineProperty(C,`_guardFns`,{value:v,writable:!1,enumerable:!1,configurable:!1});let w=new Set([...f,...Array.from(n)]);if(c){let e=c(m);for(let t of Object.keys(e))if(i(t,`action`)){if(w.has(t)){console.warn(`[elur] Store "${s}": action "${t}" collides with an existing signal or getter and will be ignored.`);continue}w.add(t),C[t]=e[t]}}if(l){let t=l(m);for(let n of Object.keys(t)){if(!i(n,`getter`))continue;if(w.has(n)){console.warn(`[elur] Store "${s}": getter "${n}" collides with an existing signal or action and will be ignored.`);continue}let r=t[n];if(!(r instanceof e.Signal))throw TypeError(`[elur] Store "${s}": getter "${n}" must return a Signal (wrap it with computed()). Got: ${typeof r}`);w.add(n),C[n]=a(r,`getter "${n}" in store "${s}"`)}}let T=[()=>h.dispose()];for(let e of u)try{let t=e(C);typeof t==`function`&&T.push(t)}catch(e){console.error(`[elur] Plugin initialization failed for store "${s}":`,e)}return C.$dispose=()=>{for(let e of T)e()},C}exports.ReadonlySignal=t,exports.createStore=o;
|
|
2
2
|
//# sourceMappingURL=store.cjs.map
|