@askrjs/askr 0.0.1
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/LICENSE +201 -0
- package/README.md +298 -0
- package/dist/chunk-4CV4JOE5.js +27 -0
- package/dist/chunk-4CV4JOE5.js.map +1 -0
- package/dist/chunk-HIWJVOS4.js +503 -0
- package/dist/chunk-HIWJVOS4.js.map +1 -0
- package/dist/chunk-L7RL4LYV.js +3442 -0
- package/dist/chunk-L7RL4LYV.js.map +1 -0
- package/dist/chunk-UUM5W2RM.js +84 -0
- package/dist/chunk-UUM5W2RM.js.map +1 -0
- package/dist/chunk-YNH3D4KW.js +29 -0
- package/dist/chunk-YNH3D4KW.js.map +1 -0
- package/dist/index.cjs +4733 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +446 -0
- package/dist/index.d.ts +446 -0
- package/dist/index.js +683 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx/jsx-dev-runtime.cjs +40 -0
- package/dist/jsx/jsx-dev-runtime.cjs.map +1 -0
- package/dist/jsx/jsx-dev-runtime.d.cts +16 -0
- package/dist/jsx/jsx-dev-runtime.d.ts +16 -0
- package/dist/jsx/jsx-dev-runtime.js +16 -0
- package/dist/jsx/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx/jsx-runtime.cjs +45 -0
- package/dist/jsx/jsx-runtime.cjs.map +1 -0
- package/dist/jsx/jsx-runtime.d.cts +17 -0
- package/dist/jsx/jsx-runtime.d.ts +17 -0
- package/dist/jsx/jsx-runtime.js +14 -0
- package/dist/jsx/jsx-runtime.js.map +1 -0
- package/dist/navigate-NLQOZQGM.js +16 -0
- package/dist/navigate-NLQOZQGM.js.map +1 -0
- package/dist/route-TVYWYCEJ.js +31 -0
- package/dist/route-TVYWYCEJ.js.map +1 -0
- package/dist/ssr-4ELUFK65.js +24 -0
- package/dist/ssr-4ELUFK65.js.map +1 -0
- package/dist/types-DUDmnzD8.d.cts +38 -0
- package/dist/types-DUDmnzD8.d.ts +38 -0
- package/package.json +83 -0
- package/src/jsx/jsx-dev-runtime.ts +26 -0
- package/src/jsx/jsx-runtime.ts +36 -0
- package/src/jsx/react-jsx-runtime.d.ts +0 -0
- package/src/jsx/types.ts +27 -0
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createComponentInstance,
|
|
3
|
+
getCurrentComponentInstance,
|
|
4
|
+
init_component,
|
|
5
|
+
route_exports,
|
|
6
|
+
setCurrentComponentInstance
|
|
7
|
+
} from "./chunk-L7RL4LYV.js";
|
|
8
|
+
|
|
9
|
+
// src/ssr/errors.ts
|
|
10
|
+
var SSRDataMissingError = class _SSRDataMissingError extends Error {
|
|
11
|
+
constructor(message = "Server-side rendering requires all data to be available synchronously. This component attempted to use async data during SSR.") {
|
|
12
|
+
super(message);
|
|
13
|
+
this.code = "SSR_DATA_MISSING";
|
|
14
|
+
this.name = "SSRDataMissingError";
|
|
15
|
+
Object.setPrototypeOf(this, _SSRDataMissingError.prototype);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// src/ssr/context.ts
|
|
20
|
+
var current = null;
|
|
21
|
+
function withSSRContext(ctx, fn) {
|
|
22
|
+
const prev = current;
|
|
23
|
+
current = ctx;
|
|
24
|
+
try {
|
|
25
|
+
return fn();
|
|
26
|
+
} finally {
|
|
27
|
+
current = prev;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
var SeededRNG = class {
|
|
31
|
+
constructor(seed = 12345) {
|
|
32
|
+
this.seed = seed | 0;
|
|
33
|
+
}
|
|
34
|
+
reset(seed = 12345) {
|
|
35
|
+
this.seed = seed | 0;
|
|
36
|
+
}
|
|
37
|
+
// Simple LCG, stable and deterministic
|
|
38
|
+
random() {
|
|
39
|
+
this.seed = (this.seed * 9301 + 49297) % 233280;
|
|
40
|
+
return this.seed / 233280;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
function createRenderContext(seed = 12345) {
|
|
44
|
+
const rng = new SeededRNG(seed);
|
|
45
|
+
return { seed, rng };
|
|
46
|
+
}
|
|
47
|
+
var currentSSRContext = null;
|
|
48
|
+
function getCurrentSSRContext() {
|
|
49
|
+
return currentSSRContext;
|
|
50
|
+
}
|
|
51
|
+
function runWithSSRContext(ctx, fn) {
|
|
52
|
+
const prev = currentSSRContext;
|
|
53
|
+
currentSSRContext = ctx;
|
|
54
|
+
try {
|
|
55
|
+
return fn();
|
|
56
|
+
} finally {
|
|
57
|
+
currentSSRContext = prev;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function throwSSRDataMissing() {
|
|
61
|
+
throw new SSRDataMissingError();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// src/ssr/index.ts
|
|
65
|
+
init_component();
|
|
66
|
+
|
|
67
|
+
// src/ssr/sink.ts
|
|
68
|
+
var StringSink = class {
|
|
69
|
+
constructor() {
|
|
70
|
+
this.chunks = [];
|
|
71
|
+
}
|
|
72
|
+
write(html) {
|
|
73
|
+
if (html) this.chunks.push(html);
|
|
74
|
+
}
|
|
75
|
+
end() {
|
|
76
|
+
}
|
|
77
|
+
toString() {
|
|
78
|
+
return this.chunks.join("");
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
var StreamSink = class {
|
|
82
|
+
constructor(onChunk, onComplete) {
|
|
83
|
+
this.onChunk = onChunk;
|
|
84
|
+
this.onComplete = onComplete;
|
|
85
|
+
}
|
|
86
|
+
write(html) {
|
|
87
|
+
if (html) this.onChunk(html);
|
|
88
|
+
}
|
|
89
|
+
end() {
|
|
90
|
+
this.onComplete();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// src/ssr/render.ts
|
|
95
|
+
var VOID_ELEMENTS = /* @__PURE__ */ new Set([
|
|
96
|
+
"area",
|
|
97
|
+
"base",
|
|
98
|
+
"br",
|
|
99
|
+
"col",
|
|
100
|
+
"embed",
|
|
101
|
+
"hr",
|
|
102
|
+
"img",
|
|
103
|
+
"input",
|
|
104
|
+
"link",
|
|
105
|
+
"meta",
|
|
106
|
+
"param",
|
|
107
|
+
"source",
|
|
108
|
+
"track",
|
|
109
|
+
"wbr"
|
|
110
|
+
]);
|
|
111
|
+
var escapeCache = /* @__PURE__ */ new Map();
|
|
112
|
+
function escapeText(text) {
|
|
113
|
+
const cached = escapeCache.get(text);
|
|
114
|
+
if (cached) return cached;
|
|
115
|
+
const str = String(text);
|
|
116
|
+
if (!str.includes("&") && !str.includes("<") && !str.includes(">")) {
|
|
117
|
+
if (escapeCache.size < 256) escapeCache.set(text, str);
|
|
118
|
+
return str;
|
|
119
|
+
}
|
|
120
|
+
const result = str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
121
|
+
if (escapeCache.size < 256) escapeCache.set(text, result);
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
function escapeAttr(value) {
|
|
125
|
+
const str = String(value);
|
|
126
|
+
if (!str.includes("&") && !str.includes('"') && !str.includes("'") && !str.includes("<") && !str.includes(">")) {
|
|
127
|
+
return str;
|
|
128
|
+
}
|
|
129
|
+
return str.replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">");
|
|
130
|
+
}
|
|
131
|
+
function styleObjToCss(value) {
|
|
132
|
+
if (!value || typeof value !== "object") return null;
|
|
133
|
+
const entries = Object.entries(value);
|
|
134
|
+
if (entries.length === 0) return "";
|
|
135
|
+
let out = "";
|
|
136
|
+
for (const [k, v] of entries) {
|
|
137
|
+
if (v === null || v === void 0 || v === false) continue;
|
|
138
|
+
const prop = k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
|
|
139
|
+
out += `${prop}:${String(v)};`;
|
|
140
|
+
}
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
function renderAttrs(props) {
|
|
144
|
+
if (!props || typeof props !== "object") return "";
|
|
145
|
+
let result = "";
|
|
146
|
+
for (const [key, value] of Object.entries(props)) {
|
|
147
|
+
if (key === "children") continue;
|
|
148
|
+
if (key.startsWith("on") && key[2] === key[2]?.toUpperCase()) continue;
|
|
149
|
+
if (key.startsWith("_")) continue;
|
|
150
|
+
const attrName = key === "class" || key === "className" ? "class" : key;
|
|
151
|
+
if (attrName === "style") {
|
|
152
|
+
const css = typeof value === "string" ? value : styleObjToCss(value);
|
|
153
|
+
if (css === null) continue;
|
|
154
|
+
if (css === "") continue;
|
|
155
|
+
result += ` style="${escapeAttr(css)}"`;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (value === true) {
|
|
159
|
+
result += ` ${attrName}`;
|
|
160
|
+
} else if (value === false || value === null || value === void 0) {
|
|
161
|
+
continue;
|
|
162
|
+
} else {
|
|
163
|
+
result += ` ${attrName}="${escapeAttr(String(value))}"`;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
function isVNodeLike(x) {
|
|
169
|
+
return !!x && typeof x === "object" && "type" in x;
|
|
170
|
+
}
|
|
171
|
+
function normalizeChildren(node) {
|
|
172
|
+
const n = node;
|
|
173
|
+
const direct = Array.isArray(n?.children) ? n?.children : null;
|
|
174
|
+
const fromProps = n?.props?.children;
|
|
175
|
+
const raw = direct ?? fromProps;
|
|
176
|
+
if (raw === null || raw === void 0 || raw === false) return [];
|
|
177
|
+
if (Array.isArray(raw)) return raw;
|
|
178
|
+
return [raw];
|
|
179
|
+
}
|
|
180
|
+
function renderChildrenToSink(children, sink, ctx) {
|
|
181
|
+
for (const c of children)
|
|
182
|
+
renderNodeToSink(
|
|
183
|
+
c,
|
|
184
|
+
sink,
|
|
185
|
+
ctx
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
function executeComponent(type, props, ctx) {
|
|
189
|
+
const res = type(props ?? {}, { signal: ctx.signal });
|
|
190
|
+
if (res && typeof res === "object" && "then" in res && typeof res.then === "function") {
|
|
191
|
+
throwSSRDataMissing();
|
|
192
|
+
}
|
|
193
|
+
return res;
|
|
194
|
+
}
|
|
195
|
+
function renderNodeToSink(node, sink, ctx) {
|
|
196
|
+
if (node === null || node === void 0) return;
|
|
197
|
+
if (typeof node === "string") {
|
|
198
|
+
sink.write(escapeText(node));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (typeof node === "number") {
|
|
202
|
+
sink.write(escapeText(String(node)));
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (!isVNodeLike(node)) return;
|
|
206
|
+
const { type, props } = node;
|
|
207
|
+
if (typeof type === "function") {
|
|
208
|
+
const out = withSSRContext(
|
|
209
|
+
ctx,
|
|
210
|
+
() => executeComponent(type, props, ctx)
|
|
211
|
+
);
|
|
212
|
+
renderNodeToSink(
|
|
213
|
+
out,
|
|
214
|
+
sink,
|
|
215
|
+
ctx
|
|
216
|
+
);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const tag = String(type);
|
|
220
|
+
const attrs = renderAttrs(props);
|
|
221
|
+
if (VOID_ELEMENTS.has(tag)) {
|
|
222
|
+
sink.write(`<${tag}${attrs} />`);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
sink.write(`<${tag}${attrs}>`);
|
|
226
|
+
const children = normalizeChildren(node);
|
|
227
|
+
renderChildrenToSink(children, sink, ctx);
|
|
228
|
+
sink.write(`</${tag}>`);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// src/ssr/data.ts
|
|
232
|
+
var keyCounter = 0;
|
|
233
|
+
var currentRenderData = null;
|
|
234
|
+
function getCurrentRenderData() {
|
|
235
|
+
return currentRenderData;
|
|
236
|
+
}
|
|
237
|
+
function resetKeyCounter() {
|
|
238
|
+
keyCounter = 0;
|
|
239
|
+
}
|
|
240
|
+
function getNextKey() {
|
|
241
|
+
return `r:${keyCounter++}`;
|
|
242
|
+
}
|
|
243
|
+
function startRenderPhase(data) {
|
|
244
|
+
currentRenderData = data ?? null;
|
|
245
|
+
resetKeyCounter();
|
|
246
|
+
}
|
|
247
|
+
function stopRenderPhase() {
|
|
248
|
+
currentRenderData = null;
|
|
249
|
+
resetKeyCounter();
|
|
250
|
+
}
|
|
251
|
+
async function resolvePlan(_plan) {
|
|
252
|
+
throw new Error(
|
|
253
|
+
"SSR resolution of prepass plans is removed: SSR is strictly synchronous and does not support resolving async resource plans"
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
function collectResources(_opts) {
|
|
257
|
+
throw new Error(
|
|
258
|
+
"SSR collection/prepass (collectResources) is removed: SSR is strictly synchronous and does not support prepass collection"
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
var resolveResources = resolvePlan;
|
|
262
|
+
|
|
263
|
+
// src/ssr/index.ts
|
|
264
|
+
var VOID_ELEMENTS2 = /* @__PURE__ */ new Set([
|
|
265
|
+
"area",
|
|
266
|
+
"base",
|
|
267
|
+
"br",
|
|
268
|
+
"col",
|
|
269
|
+
"embed",
|
|
270
|
+
"hr",
|
|
271
|
+
"img",
|
|
272
|
+
"input",
|
|
273
|
+
"link",
|
|
274
|
+
"meta",
|
|
275
|
+
"param",
|
|
276
|
+
"source",
|
|
277
|
+
"track",
|
|
278
|
+
"wbr"
|
|
279
|
+
]);
|
|
280
|
+
var escapeCache2 = /* @__PURE__ */ new Map();
|
|
281
|
+
function escapeText2(text) {
|
|
282
|
+
const cached = escapeCache2.get(text);
|
|
283
|
+
if (cached) return cached;
|
|
284
|
+
const str = String(text);
|
|
285
|
+
if (!str.includes("&") && !str.includes("<") && !str.includes(">")) {
|
|
286
|
+
escapeCache2.set(text, str);
|
|
287
|
+
return str;
|
|
288
|
+
}
|
|
289
|
+
const result = str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
290
|
+
if (escapeCache2.size < 256) {
|
|
291
|
+
escapeCache2.set(text, result);
|
|
292
|
+
}
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
295
|
+
function escapeAttr2(value) {
|
|
296
|
+
const str = String(value);
|
|
297
|
+
if (!str.includes("&") && !str.includes('"') && !str.includes("'") && !str.includes("<") && !str.includes(">")) {
|
|
298
|
+
return str;
|
|
299
|
+
}
|
|
300
|
+
return str.replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">");
|
|
301
|
+
}
|
|
302
|
+
function renderAttrs2(props) {
|
|
303
|
+
if (!props || typeof props !== "object") return "";
|
|
304
|
+
let result = "";
|
|
305
|
+
for (const [key, value] of Object.entries(props)) {
|
|
306
|
+
if (key.startsWith("on") && key[2] === key[2].toUpperCase()) {
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
if (key.startsWith("_")) {
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
const attrName = key === "class" || key === "className" ? "class" : key;
|
|
313
|
+
if (value === true) {
|
|
314
|
+
result += ` ${attrName}`;
|
|
315
|
+
} else if (value === false || value === null || value === void 0) {
|
|
316
|
+
continue;
|
|
317
|
+
} else {
|
|
318
|
+
result += ` ${attrName}="${escapeAttr2(String(value))}"`;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
function renderChildSync(child, ctx) {
|
|
324
|
+
if (typeof child === "string") return escapeText2(child);
|
|
325
|
+
if (typeof child === "number") return escapeText2(String(child));
|
|
326
|
+
if (child === null || child === void 0 || child === false) return "";
|
|
327
|
+
if (typeof child === "object" && child !== null && "type" in child) {
|
|
328
|
+
return renderNodeSync(child, ctx);
|
|
329
|
+
}
|
|
330
|
+
return "";
|
|
331
|
+
}
|
|
332
|
+
function renderChildrenSync(children, ctx) {
|
|
333
|
+
if (!children || !Array.isArray(children) || children.length === 0) return "";
|
|
334
|
+
let result = "";
|
|
335
|
+
for (const child of children) result += renderChildSync(child, ctx);
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
function renderNodeSync(node, ctx) {
|
|
339
|
+
const { type, props } = node;
|
|
340
|
+
if (typeof type === "function") {
|
|
341
|
+
const result = executeComponentSync(type, props, ctx);
|
|
342
|
+
if (result instanceof Promise) {
|
|
343
|
+
throwSSRDataMissing();
|
|
344
|
+
}
|
|
345
|
+
return renderNodeSync(result, ctx);
|
|
346
|
+
}
|
|
347
|
+
const typeStr = type;
|
|
348
|
+
if (VOID_ELEMENTS2.has(typeStr)) {
|
|
349
|
+
const attrs2 = renderAttrs2(props);
|
|
350
|
+
return `<${typeStr}${attrs2} />`;
|
|
351
|
+
}
|
|
352
|
+
const attrs = renderAttrs2(props);
|
|
353
|
+
const children = node.children;
|
|
354
|
+
const childrenHtml = renderChildrenSync(children, ctx);
|
|
355
|
+
return `<${typeStr}${attrs}>${childrenHtml}</${typeStr}>`;
|
|
356
|
+
}
|
|
357
|
+
function executeComponentSync(component, props, ctx) {
|
|
358
|
+
const originalRandom = Math.random;
|
|
359
|
+
const originalDateNow = Date.now;
|
|
360
|
+
try {
|
|
361
|
+
if (process.env.NODE_ENV !== "production") {
|
|
362
|
+
Math.random = () => {
|
|
363
|
+
throw new Error(
|
|
364
|
+
"SSR Strict Purity: Math.random is not allowed during synchronous SSR. Use the provided `ssr` context RNG instead."
|
|
365
|
+
);
|
|
366
|
+
};
|
|
367
|
+
Date.now = () => {
|
|
368
|
+
throw new Error(
|
|
369
|
+
"SSR Strict Purity: Date.now is not allowed during synchronous SSR. Pass timestamps explicitly or use deterministic helpers."
|
|
370
|
+
);
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
const prev = getCurrentComponentInstance();
|
|
374
|
+
const temp = createComponentInstance(
|
|
375
|
+
"ssr-temp",
|
|
376
|
+
component,
|
|
377
|
+
props || {},
|
|
378
|
+
null
|
|
379
|
+
);
|
|
380
|
+
temp.ssr = true;
|
|
381
|
+
setCurrentComponentInstance(temp);
|
|
382
|
+
try {
|
|
383
|
+
return runWithSSRContext(ctx, () => {
|
|
384
|
+
const result = component(props || {}, { ssr: ctx });
|
|
385
|
+
if (result instanceof Promise) {
|
|
386
|
+
throwSSRDataMissing();
|
|
387
|
+
}
|
|
388
|
+
return result;
|
|
389
|
+
});
|
|
390
|
+
} finally {
|
|
391
|
+
setCurrentComponentInstance(prev);
|
|
392
|
+
}
|
|
393
|
+
} finally {
|
|
394
|
+
Math.random = originalRandom;
|
|
395
|
+
Date.now = originalDateNow;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
function renderToStringSync(component, props, options) {
|
|
399
|
+
const seed = options?.seed ?? 12345;
|
|
400
|
+
const ctx = createRenderContext(seed);
|
|
401
|
+
startRenderPhase(options?.data ?? null);
|
|
402
|
+
try {
|
|
403
|
+
const node = executeComponentSync(component, props || {}, ctx);
|
|
404
|
+
return renderNodeSync(node, ctx);
|
|
405
|
+
} finally {
|
|
406
|
+
stopRenderPhase();
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
function renderToStringSyncForUrl(opts) {
|
|
410
|
+
const { url, routes, options } = opts;
|
|
411
|
+
const {
|
|
412
|
+
clearRoutes,
|
|
413
|
+
route,
|
|
414
|
+
setServerLocation,
|
|
415
|
+
lockRouteRegistration,
|
|
416
|
+
resolveRoute
|
|
417
|
+
} = route_exports;
|
|
418
|
+
clearRoutes();
|
|
419
|
+
for (const r of routes) {
|
|
420
|
+
route(r.path, r.handler, r.namespace);
|
|
421
|
+
}
|
|
422
|
+
setServerLocation(url);
|
|
423
|
+
if (process.env.NODE_ENV === "production") lockRouteRegistration();
|
|
424
|
+
const resolved = resolveRoute(url);
|
|
425
|
+
if (!resolved)
|
|
426
|
+
throw new Error(`renderToStringSync: no route found for url: ${url}`);
|
|
427
|
+
const seed = options?.seed ?? 12345;
|
|
428
|
+
const ctx = createRenderContext(seed);
|
|
429
|
+
startRenderPhase(options?.data ?? null);
|
|
430
|
+
try {
|
|
431
|
+
const node = executeComponentSync(
|
|
432
|
+
resolved.handler,
|
|
433
|
+
resolved.params || {},
|
|
434
|
+
ctx
|
|
435
|
+
);
|
|
436
|
+
return renderNodeSync(node, ctx);
|
|
437
|
+
} finally {
|
|
438
|
+
stopRenderPhase();
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
function renderToString(arg) {
|
|
442
|
+
if (typeof arg === "function") {
|
|
443
|
+
return renderToStringSync(
|
|
444
|
+
arg
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
const opts = arg;
|
|
448
|
+
const sink = new StringSink();
|
|
449
|
+
renderToSinkInternal({ ...opts, sink });
|
|
450
|
+
sink.end();
|
|
451
|
+
return sink.toString();
|
|
452
|
+
}
|
|
453
|
+
function renderToStream(opts) {
|
|
454
|
+
const sink = new StreamSink(opts.onChunk, opts.onComplete);
|
|
455
|
+
renderToSinkInternal({ ...opts, sink });
|
|
456
|
+
sink.end();
|
|
457
|
+
}
|
|
458
|
+
function renderToSinkInternal(opts) {
|
|
459
|
+
const { url, routes, seed = 1, data, sink } = opts;
|
|
460
|
+
const {
|
|
461
|
+
clearRoutes,
|
|
462
|
+
route,
|
|
463
|
+
setServerLocation,
|
|
464
|
+
lockRouteRegistration,
|
|
465
|
+
resolveRoute
|
|
466
|
+
} = route_exports;
|
|
467
|
+
clearRoutes();
|
|
468
|
+
for (const r of routes) route(r.path, r.handler, r.namespace);
|
|
469
|
+
setServerLocation(url);
|
|
470
|
+
if (process.env.NODE_ENV === "production") lockRouteRegistration();
|
|
471
|
+
const resolved = resolveRoute(url);
|
|
472
|
+
if (!resolved) throw new Error(`SSR: no route found for url: ${url}`);
|
|
473
|
+
const ctx = {
|
|
474
|
+
url,
|
|
475
|
+
seed,
|
|
476
|
+
data,
|
|
477
|
+
params: resolved.params,
|
|
478
|
+
signal: void 0
|
|
479
|
+
};
|
|
480
|
+
const node = resolved.handler(resolved.params);
|
|
481
|
+
startRenderPhase(data || null);
|
|
482
|
+
try {
|
|
483
|
+
renderNodeToSink(node, sink, ctx);
|
|
484
|
+
} finally {
|
|
485
|
+
stopRenderPhase();
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
export {
|
|
490
|
+
SSRDataMissingError,
|
|
491
|
+
getCurrentSSRContext,
|
|
492
|
+
throwSSRDataMissing,
|
|
493
|
+
getCurrentRenderData,
|
|
494
|
+
getNextKey,
|
|
495
|
+
resolvePlan,
|
|
496
|
+
collectResources,
|
|
497
|
+
resolveResources,
|
|
498
|
+
renderToStringSync,
|
|
499
|
+
renderToStringSyncForUrl,
|
|
500
|
+
renderToString,
|
|
501
|
+
renderToStream
|
|
502
|
+
};
|
|
503
|
+
//# sourceMappingURL=chunk-HIWJVOS4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ssr/errors.ts","../src/ssr/context.ts","../src/ssr/index.ts","../src/ssr/sink.ts","../src/ssr/render.ts","../src/ssr/data.ts"],"sourcesContent":["export class SSRDataMissingError extends Error {\n readonly code = 'SSR_DATA_MISSING';\n constructor(\n message = 'Server-side rendering requires all data to be available synchronously. This component attempted to use async data during SSR.'\n ) {\n super(message);\n this.name = 'SSRDataMissingError';\n Object.setPrototypeOf(this, SSRDataMissingError.prototype);\n }\n}\n\nexport class SSRInvariantError extends Error {\n readonly code = 'SSR_INVARIANT_VIOLATION';\n constructor(message: string) {\n super(message);\n this.name = 'SSRInvariantError';\n Object.setPrototypeOf(this, SSRInvariantError.prototype);\n }\n}\n","import type { Props } from '../shared/types';\nimport { SSRDataMissingError } from './errors';\n\nexport type SSRData = Record<string, unknown>;\n\nexport type SSRContext = {\n url: string;\n seed: number;\n data?: SSRData;\n params?: Record<string, string>;\n signal?: AbortSignal;\n};\n\n// Optional: scoped access for sink-based streaming SSR (sync and stack-scoped)\nlet current: SSRContext | null = null;\n\nexport function getSSRContext(): SSRContext | null {\n return current;\n}\n\nexport function withSSRContext<T>(ctx: SSRContext, fn: () => T): T {\n const prev = current;\n current = ctx;\n try {\n return fn();\n } finally {\n current = prev;\n }\n}\n\n// --- Render-only context (compatibility from previous ssrContext.ts) ---------\n// Deterministic seeded RNG used only inside the render context\nexport class SeededRNG {\n private seed: number;\n\n constructor(seed = 12345) {\n this.seed = seed | 0;\n }\n\n reset(seed = 12345) {\n this.seed = seed | 0;\n }\n\n // Simple LCG, stable and deterministic\n random(): number {\n this.seed = (this.seed * 9301 + 49297) % 233280;\n return this.seed / 233280;\n }\n}\n\n/** Context passed through a single render pass */\nexport type RenderContext = {\n seed: number;\n rng: SeededRNG;\n};\n\n/** Create a RenderContext from a seed */\nexport function createRenderContext(seed = 12345): RenderContext {\n const rng = new SeededRNG(seed);\n return { seed, rng };\n}\n\n// Lightweight module-level current context for SSR detection (render-only)\nlet currentSSRContext: RenderContext | null = null;\n\nexport function getCurrentSSRContext(): RenderContext | null {\n return currentSSRContext;\n}\n\nexport function runWithSSRContext<T>(ctx: RenderContext, fn: () => T): T {\n const prev = currentSSRContext;\n currentSSRContext = ctx;\n try {\n return fn();\n } finally {\n currentSSRContext = prev;\n }\n}\n\n/**\n * Centralized SSR enforcement helper — use this to throw a single, consistent\n * error when async data is encountered during synchronous SSR.\n */\nexport function throwSSRDataMissing(): never {\n throw new SSRDataMissingError();\n}\n\nexport { SSRDataMissingError };\n\n// Deterministic RNG (explicitly used by components via ctx if desired)\nexport function makeSeededRandom(seed: number) {\n // LCG\n let s = seed >>> 0;\n return () => {\n s = (s * 1664525 + 1013904223) >>> 0;\n return s / 0x100000000;\n };\n}\n\n// Helper: merge params into props for route handlers if needed\nexport function mergeRouteProps(\n props: Props | undefined,\n params?: Record<string, string>\n): Props {\n if (!params) return (props ?? {}) as Props;\n return { ...(props ?? {}), ...params } as Props;\n}\n","/**\n * SSR - Server-Side Rendering\n *\n * Renders Askr components to static HTML strings for server-side rendering.\n * SSR is synchronous: async components are not supported; async work should use\n * `resource()` which is rejected during synchronous SSR. This module throws\n * when an async component or async resource is encountered during sync SSR.\n */\n\nimport type { JSXElement } from '../jsx/types';\nimport type { RouteHandler } from '../router/route';\nimport * as RouteModule from '../router/route';\nimport type { Props } from '../shared/types';\nimport {\n createRenderContext,\n runWithSSRContext,\n throwSSRDataMissing,\n type RenderContext,\n type SSRData,\n} from './context';\nimport {\n createComponentInstance,\n setCurrentComponentInstance,\n getCurrentComponentInstance,\n} from '../runtime/component';\nimport type { ComponentFunction } from '../runtime/component';\n\nexport { SSRDataMissingError } from './context';\n\ntype VNode = {\n type: string;\n props?: Props;\n children?: (string | VNode | null | undefined | false)[];\n};\n\nexport type Component = (\n props: Props,\n context?: { signal?: AbortSignal; ssr?: RenderContext }\n) => VNode | JSXElement;\n\n// HTML5 void elements that don't have closing tags\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\n// Escape cache for common values\nconst escapeCache = new Map<string, string>();\n\n/**\n * Escape HTML special characters in text content (optimized with cache)\n */\nfunction escapeText(text: string): string {\n const cached = escapeCache.get(text);\n if (cached) return cached;\n\n const str = String(text);\n // Fast path: check if escaping needed\n if (!str.includes('&') && !str.includes('<') && !str.includes('>')) {\n escapeCache.set(text, str);\n return str;\n }\n\n const result = str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\n if (escapeCache.size < 256) {\n escapeCache.set(text, result);\n }\n return result;\n}\n\n/**\n * Escape HTML special characters in attribute values\n */\nfunction escapeAttr(value: string): string {\n const str = String(value);\n // Fast path: check if escaping needed\n if (\n !str.includes('&') &&\n !str.includes('\"') &&\n !str.includes(\"'\") &&\n !str.includes('<') &&\n !str.includes('>')\n ) {\n return str;\n }\n\n return str\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\n/**\n * Render attributes to HTML string, excluding event handlers\n * Optimized for minimal allocations\n */\nfunction renderAttrs(props?: Props): string {\n if (!props || typeof props !== 'object') return '';\n\n let result = '';\n for (const [key, value] of Object.entries(props)) {\n // Skip event handlers (onClick, onChange, etc.)\n if (key.startsWith('on') && key[2] === key[2].toUpperCase()) {\n continue;\n }\n // Skip internal props\n if (key.startsWith('_')) {\n continue;\n }\n\n // Normalize class attribute (`class` preferred, accept `className` for compatibility)\n const attrName = key === 'class' || key === 'className' ? 'class' : key;\n\n // Boolean attributes\n if (value === true) {\n result += ` ${attrName}`;\n } else if (value === false || value === null || value === undefined) {\n // Skip falsy values\n continue;\n } else {\n // Regular attributes\n result += ` ${attrName}=\"${escapeAttr(String(value))}\"`;\n }\n }\n return result;\n}\n\n/**\n * Synchronous rendering helpers (used for strictly synchronous SSR)\n */\nfunction renderChildSync(child: unknown, ctx: RenderContext): string {\n if (typeof child === 'string') return escapeText(child);\n if (typeof child === 'number') return escapeText(String(child));\n if (child === null || child === undefined || child === false) return '';\n if (typeof child === 'object' && child !== null && 'type' in child) {\n return renderNodeSync(child as unknown as JSXElement | VNode, ctx);\n }\n return '';\n}\n\nfunction renderChildrenSync(\n children: unknown[] | undefined,\n ctx: RenderContext\n): string {\n if (!children || !Array.isArray(children) || children.length === 0) return '';\n let result = '';\n for (const child of children) result += renderChildSync(child, ctx);\n return result;\n}\n\n/**\n * Render a VNode synchronously. Throws if an async component is encountered.\n */\nfunction renderNodeSync(node: VNode | JSXElement, ctx: RenderContext): string {\n const { type, props } = node;\n\n if (typeof type === 'function') {\n const result = executeComponentSync(type as Component, props, ctx);\n if (result instanceof Promise) {\n // Use centralized SSR error to maintain a single failure mode\n throwSSRDataMissing();\n }\n return renderNodeSync(result as VNode | JSXElement, ctx);\n }\n\n const typeStr = type as string;\n if (VOID_ELEMENTS.has(typeStr)) {\n const attrs = renderAttrs(props);\n return `<${typeStr}${attrs} />`;\n }\n\n const attrs = renderAttrs(props);\n const children = (node as VNode).children;\n const childrenHtml = renderChildrenSync(children, ctx);\n return `<${typeStr}${attrs}>${childrenHtml}</${typeStr}>`;\n}\n\n/**\n * Execute a component function (synchronously or async) and return VNode\n */\n/**\n * Execute a component synchronously inside a render-only context.\n * This must not create or reuse runtime ComponentInstance objects. We pass\n * the render context explicitly as `context.ssr` in the second argument so\n * components can opt-in to deterministic randomness/time via the provided RNG.\n */\nfunction executeComponentSync(\n component: Component,\n props: Record<string, unknown> | undefined,\n ctx: RenderContext\n): VNode | JSXElement {\n // Dev-only: enforce SSR purity with clear messages. We temporarily override\n // `Math.random` and `Date.now` while rendering to produce a targeted error\n // if components call them directly. We restore them immediately afterwards.\n const originalRandom = Math.random;\n const originalDateNow = Date.now;\n\n try {\n if (process.env.NODE_ENV !== 'production') {\n (Math as unknown as { random: () => number }).random = () => {\n throw new Error(\n 'SSR Strict Purity: Math.random is not allowed during synchronous SSR. Use the provided `ssr` context RNG instead.'\n );\n };\n (Date as unknown as { now: () => number }).now = () => {\n throw new Error(\n 'SSR Strict Purity: Date.now is not allowed during synchronous SSR. Pass timestamps explicitly or use deterministic helpers.'\n );\n };\n }\n\n // Create a temporary, lightweight component instance so runtime APIs like\n // `state()` and `route()` can be called during SSR render. We avoid mounting\n // or side-effects by not attaching the instance to any DOM target.\n const prev = getCurrentComponentInstance();\n const temp = createComponentInstance(\n 'ssr-temp',\n component as unknown as ComponentFunction,\n (props || {}) as Props,\n null\n );\n temp.ssr = true;\n setCurrentComponentInstance(temp);\n try {\n return runWithSSRContext(ctx, () => {\n const result = component((props || {}) as Props, { ssr: ctx });\n if (result instanceof Promise) {\n // Use the centralized SSR error for async data/components during SSR\n throwSSRDataMissing();\n }\n return result as VNode | JSXElement;\n });\n } finally {\n // Restore the previous instance (if any)\n setCurrentComponentInstance(prev);\n }\n } finally {\n (Math as unknown as { random: () => number }).random = originalRandom;\n (Date as unknown as { now: () => number }).now = originalDateNow;\n }\n}\n\n/**\n * Single synchronous SSR entrypoint: render a component to an HTML string.\n * This is strictly synchronous and deterministic. Optionally provide a seed\n * for deterministic randomness via `options.seed`.\n */\nexport function renderToStringSync(\n component: (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | null,\n props?: Record<string, unknown>,\n options?: { seed?: number; data?: SSRData }\n): string {\n const seed = options?.seed ?? 12345;\n // Start render-phase keying (aligns with collectResources)\n const ctx = createRenderContext(seed);\n // Provide optional SSR data via options.data\n startRenderPhase(options?.data ?? null);\n try {\n const node = executeComponentSync(component as Component, props || {}, ctx);\n return renderNodeSync(node, ctx);\n } finally {\n stopRenderPhase();\n }\n}\n\n// Synchronous server render for strict checks. Routes must be resolved before\n// the render pass so no route() calls happen during rendering.\nexport function renderToStringSyncForUrl(opts: {\n url: string;\n routes: Array<{ path: string; handler: RouteHandler; namespace?: string }>;\n options?: { seed?: number; data?: SSRData };\n}): string {\n const { url, routes, options } = opts;\n // Register routes synchronously using route() (already available in module scope)\n const {\n clearRoutes,\n route,\n setServerLocation,\n lockRouteRegistration,\n resolveRoute,\n } = RouteModule;\n\n clearRoutes();\n for (const r of routes) {\n route(r.path, r.handler, r.namespace);\n }\n\n setServerLocation(url);\n if (process.env.NODE_ENV === 'production') lockRouteRegistration();\n\n const resolved = resolveRoute(url);\n if (!resolved)\n throw new Error(`renderToStringSync: no route found for url: ${url}`);\n\n const seed = options?.seed ?? 12345;\n const ctx = createRenderContext(seed);\n // Start render-phase keying (aligns with collectResources)\n startRenderPhase(options?.data ?? null);\n try {\n const node = executeComponentSync(\n resolved.handler as Component,\n resolved.params || {},\n ctx\n );\n return renderNodeSync(node, ctx);\n } finally {\n stopRenderPhase();\n }\n}\n\n// --- Streaming sink-based renderer (v2) --------------------------------------------------\nimport { StringSink, StreamSink } from './sink';\nimport { renderNodeToSink } from './render';\nimport {\n startRenderPhase,\n stopRenderPhase,\n collectResources,\n resolvePlan,\n resolveResources,\n ResourcePlan,\n} from './data';\n\nexport type SSRRoute = {\n path: string;\n handler: RouteHandler;\n namespace?: string;\n};\n\nexport function renderToString(\n component: (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | null\n): string;\nexport function renderToString(opts: {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n}): string;\nexport function renderToString(arg: unknown): string {\n // Convenience: if a component function is passed, delegate to sync render\n if (typeof arg === 'function') {\n return renderToStringSync(\n arg as (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | null\n );\n }\n const opts = arg as {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n };\n const sink = new StringSink();\n renderToSinkInternal({ ...opts, sink });\n sink.end();\n return sink.toString();\n}\n\nexport function renderToStream(opts: {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n onChunk(html: string): void;\n onComplete(): void;\n}): void {\n const sink = new StreamSink(opts.onChunk, opts.onComplete);\n renderToSinkInternal({ ...opts, sink });\n sink.end();\n}\n\nfunction renderToSinkInternal(opts: {\n url: string;\n routes: SSRRoute[];\n seed?: number;\n data?: SSRData;\n sink: { write(html: string): void; end(): void };\n}) {\n const { url, routes, seed = 1, data, sink } = opts;\n\n // Route resolution happens BEFORE render pass\n const {\n clearRoutes,\n route,\n setServerLocation,\n lockRouteRegistration,\n resolveRoute,\n } = RouteModule;\n\n clearRoutes();\n for (const r of routes) route(r.path, r.handler, r.namespace);\n\n setServerLocation(url);\n if (process.env.NODE_ENV === 'production') lockRouteRegistration();\n\n const resolved = resolveRoute(url);\n if (!resolved) throw new Error(`SSR: no route found for url: ${url}`);\n\n const ctx = {\n url,\n seed,\n data,\n params: resolved.params,\n signal: undefined as AbortSignal | undefined,\n };\n\n // Render the resolved handler with params\n const node = resolved.handler(resolved.params) as\n | VNode\n | JSXElement\n | string\n | number\n | null;\n\n // Start render-phase keying so resource() can lookup resolved `data` by key\n startRenderPhase(data || null);\n try {\n renderNodeToSink(node, sink, ctx);\n } finally {\n stopRenderPhase();\n }\n}\n\nexport { collectResources, resolvePlan, resolveResources, ResourcePlan };\n","export interface RenderSink {\n write(html: string): void;\n end(): void;\n}\n\nexport class StringSink implements RenderSink {\n private chunks: string[] = [];\n\n write(html: string) {\n if (html) this.chunks.push(html);\n }\n\n end() {}\n\n toString() {\n return this.chunks.join('');\n }\n}\n\nexport class StreamSink implements RenderSink {\n constructor(\n private readonly onChunk: (html: string) => void,\n private readonly onComplete: () => void\n ) {}\n\n write(html: string) {\n if (html) this.onChunk(html);\n }\n\n end() {\n this.onComplete();\n }\n}\n","import type { JSXElement } from '../jsx/types';\nimport type { Props } from '../shared/types';\nimport type { RenderSink } from './sink';\nimport {\n withSSRContext,\n type SSRContext,\n throwSSRDataMissing,\n} from './context';\n\ntype VNode = {\n type: string | Component;\n props?: Props;\n // Some JSX runtimes put children on `props.children`, others on `children`.\n children?: unknown[];\n};\n\nexport type Component = (\n props: Props,\n context?: { signal?: AbortSignal }\n) => VNode | JSXElement | string | number | null;\n\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nconst escapeCache = new Map<string, string>();\n\nfunction escapeText(text: string): string {\n const cached = escapeCache.get(text);\n if (cached) return cached;\n\n const str = String(text);\n if (!str.includes('&') && !str.includes('<') && !str.includes('>')) {\n if (escapeCache.size < 256) escapeCache.set(text, str);\n return str;\n }\n\n const result = str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n if (escapeCache.size < 256) escapeCache.set(text, result);\n return result;\n}\n\nfunction escapeAttr(value: string): string {\n const str = String(value);\n if (\n !str.includes('&') &&\n !str.includes('\"') &&\n !str.includes(\"'\") &&\n !str.includes('<') &&\n !str.includes('>')\n ) {\n return str;\n }\n return str\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nfunction styleObjToCss(value: unknown): string | null {\n if (!value || typeof value !== 'object') return null;\n const entries = Object.entries(value as Record<string, unknown>);\n if (entries.length === 0) return '';\n // camelCase -> kebab-case\n let out = '';\n for (const [k, v] of entries) {\n if (v === null || v === undefined || v === false) continue;\n const prop = k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n out += `${prop}:${String(v)};`;\n }\n return out;\n}\n\nfunction renderAttrs(props?: Props): string {\n if (!props || typeof props !== 'object') return '';\n\n let result = '';\n for (const [key, value] of Object.entries(props)) {\n // Skip children in attrs\n if (key === 'children') continue;\n\n // Skip event handlers: onClick, onChange, ...\n if (key.startsWith('on') && key[2] === key[2]?.toUpperCase()) continue;\n\n // Skip internal props\n if (key.startsWith('_')) continue;\n\n const attrName = key === 'class' || key === 'className' ? 'class' : key;\n\n if (attrName === 'style') {\n const css = typeof value === 'string' ? value : styleObjToCss(value);\n if (css === null) continue;\n if (css === '') continue;\n result += ` style=\"${escapeAttr(css)}\"`;\n continue;\n }\n\n if (value === true) {\n result += ` ${attrName}`;\n } else if (value === false || value === null || value === undefined) {\n continue;\n } else {\n result += ` ${attrName}=\"${escapeAttr(String(value))}\"`;\n }\n }\n\n return result;\n}\n\nfunction isVNodeLike(x: unknown): x is VNode | JSXElement {\n return (\n !!x && typeof x === 'object' && 'type' in (x as Record<string, unknown>)\n );\n}\n\nfunction normalizeChildren(node: unknown): unknown[] {\n // Prefer explicit node.children; fallback to props.children\n const n = node as Record<string, unknown> | null | undefined;\n const direct = Array.isArray(n?.children) ? (n?.children as unknown[]) : null;\n const fromProps = (n?.props as Record<string, unknown> | undefined)\n ?.children as unknown;\n\n const raw = direct ?? fromProps;\n\n if (raw === null || raw === undefined || raw === false) return [];\n if (Array.isArray(raw)) return raw;\n return [raw];\n}\n\n// Note: renderChildToSink was removed in favor of direct renderNodeToSink inlined calls\n\nfunction renderChildrenToSink(\n children: unknown[],\n sink: RenderSink,\n ctx: SSRContext\n) {\n for (const c of children)\n renderNodeToSink(\n c as VNode | JSXElement | string | number | null,\n sink,\n ctx\n );\n}\n\nfunction executeComponent(\n type: Component,\n props: Props | undefined,\n ctx: SSRContext\n): unknown {\n // Synchronous only. If a user returns a Promise, that's a hard error.\n const res = type(props ?? {}, { signal: ctx.signal });\n if (\n res &&\n typeof res === 'object' &&\n 'then' in res &&\n typeof (res as unknown as PromiseLike<unknown>).then === 'function'\n ) {\n // Use centralized SSR failure mode — async components are not allowed during\n // synchronous SSR and must be pre-resolved by the developer.\n throwSSRDataMissing();\n }\n return res;\n}\n\nexport function renderNodeToSink(\n node: VNode | JSXElement | string | number | null,\n sink: RenderSink,\n ctx: SSRContext\n) {\n if (node === null || node === undefined) return;\n\n if (typeof node === 'string') {\n sink.write(escapeText(node));\n return;\n }\n if (typeof node === 'number') {\n sink.write(escapeText(String(node)));\n return;\n }\n\n if (!isVNodeLike(node)) return;\n\n const { type, props } = node as VNode;\n\n // Function component\n if (typeof type === 'function') {\n const out = withSSRContext(ctx, () =>\n executeComponent(type as Component, props, ctx)\n );\n renderNodeToSink(\n out as VNode | JSXElement | string | number | null,\n sink,\n ctx\n );\n return;\n }\n\n // Element node\n const tag = String(type);\n const attrs = renderAttrs(props);\n\n // void element\n if (VOID_ELEMENTS.has(tag)) {\n sink.write(`<${tag}${attrs} />`);\n return;\n }\n\n sink.write(`<${tag}${attrs}>`);\n const children = normalizeChildren(node);\n renderChildrenToSink(children, sink, ctx);\n sink.write(`</${tag}>`);\n}\n","import type { SSRRoute } from './index';\n\nexport type ResourceDescriptor = {\n key: string;\n fn: (opts: { signal?: AbortSignal }) => Promise<unknown> | unknown;\n deps: unknown[];\n index: number;\n};\n\nexport type ResourcePlan = {\n resources: ResourceDescriptor[]; // declarative manifest in stable order\n};\n\n// Internal collection state (collection/prepass removed)\nlet keyCounter = 0;\nlet currentRenderData: Record<string, unknown> | null = null;\n\nexport function getCurrentRenderData(): Record<string, unknown> | null {\n return currentRenderData;\n}\n\nexport function resetKeyCounter() {\n keyCounter = 0;\n}\n\nexport function getNextKey(): string {\n return `r:${keyCounter++}`;\n}\n\nexport function startCollection() {\n throw new Error(\n 'SSR collection/prepass is removed: SSR is strictly synchronous; do not call startCollection()'\n );\n}\n\nexport function stopCollection(): ResourcePlan {\n throw new Error(\n 'SSR collection/prepass is removed: SSR is strictly synchronous; do not call stopCollection()'\n );\n}\n\nexport function registerResourceIntent(\n _fn: ResourceDescriptor['fn'],\n _deps: unknown[]\n): string {\n throw new Error(\n 'SSR resource intents collection is removed: resource() no longer registers intents for prepass'\n );\n}\n\nexport function startRenderPhase(data: Record<string, unknown> | null) {\n currentRenderData = data ?? null;\n resetKeyCounter();\n}\n\nexport function stopRenderPhase() {\n currentRenderData = null;\n resetKeyCounter();\n}\n\n// Resolve a plan (execute resource functions in declared order)\nexport async function resolvePlan(\n _plan: ResourcePlan\n): Promise<Record<string, unknown>> {\n throw new Error(\n 'SSR resolution of prepass plans is removed: SSR is strictly synchronous and does not support resolving async resource plans'\n );\n}\n\nexport function collectResources(_opts: {\n url: string;\n routes: SSRRoute[];\n}): ResourcePlan {\n throw new Error(\n 'SSR collection/prepass (collectResources) is removed: SSR is strictly synchronous and does not support prepass collection'\n );\n}\n\n// Backwards-compatible alias: new public API prefers the name `resolveResources`\nexport const resolveResources = resolvePlan;\n"],"mappings":"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","names":["VOID_ELEMENTS","escapeCache","escapeText","escapeAttr","renderAttrs","attrs"]}
|