@webtypen/webframez-react 0.0.32 → 0.0.34
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/client.cjs +1 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.js +1 -1
- package/dist/http.cjs +90 -14
- package/dist/http.js +90 -14
- package/dist/index.cjs +90 -14
- package/dist/index.js +90 -14
- package/dist/route-slot.cjs +53 -0
- package/dist/route-slot.d.ts +7 -0
- package/dist/route-slot.js +19 -0
- package/dist/router.cjs +36 -6
- package/dist/router.d.ts +2 -0
- package/dist/router.js +36 -6
- package/dist/types.d.ts +2 -0
- package/dist/webframez-core.cjs +90 -14
- package/dist/webframez-core.js +90 -14
- package/package.json +6 -1
package/dist/router.js
CHANGED
|
@@ -10,6 +10,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
10
10
|
import fs from "node:fs";
|
|
11
11
|
import Module from "node:module";
|
|
12
12
|
import path from "node:path";
|
|
13
|
+
import { RouteChildrenSlot } from "@webtypen/webframez-react/route-slot";
|
|
13
14
|
|
|
14
15
|
// src/head.ts
|
|
15
16
|
var ABSOLUTE_ASSET_URL_PATTERN = /^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;
|
|
@@ -99,6 +100,16 @@ function isRouteChildrenType(type) {
|
|
|
99
100
|
return false;
|
|
100
101
|
}
|
|
101
102
|
}
|
|
103
|
+
function isReactElementLike(node) {
|
|
104
|
+
if (!node || typeof node !== "object") {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
return "type" in node && "props" in node;
|
|
109
|
+
} catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
102
113
|
function injectRouteChildren(node, routeChildren) {
|
|
103
114
|
if (node === null || node === void 0 || typeof node === "boolean") {
|
|
104
115
|
return node;
|
|
@@ -114,13 +125,17 @@ function injectRouteChildren(node, routeChildren) {
|
|
|
114
125
|
});
|
|
115
126
|
return changed ? next : node;
|
|
116
127
|
}
|
|
117
|
-
if (
|
|
128
|
+
if (isReactElementLike(node) && isRouteChildrenType(node.type)) {
|
|
129
|
+
return routeChildren;
|
|
130
|
+
}
|
|
131
|
+
const isValidElement = React.isValidElement(node);
|
|
132
|
+
if (!isValidElement && !isReactElementLike(node)) {
|
|
118
133
|
return node;
|
|
119
134
|
}
|
|
120
|
-
if (isRouteChildrenType(node.type)) {
|
|
135
|
+
if (isValidElement && isRouteChildrenType(node.type)) {
|
|
121
136
|
return routeChildren;
|
|
122
137
|
}
|
|
123
|
-
const props = node.props;
|
|
138
|
+
const props = node.props ?? {};
|
|
124
139
|
if (!("children" in props)) {
|
|
125
140
|
return node;
|
|
126
141
|
}
|
|
@@ -128,10 +143,19 @@ function injectRouteChildren(node, routeChildren) {
|
|
|
128
143
|
if (nextChildren === props.children) {
|
|
129
144
|
return node;
|
|
130
145
|
}
|
|
131
|
-
if (
|
|
132
|
-
|
|
146
|
+
if (isValidElement) {
|
|
147
|
+
if (Array.isArray(nextChildren)) {
|
|
148
|
+
return React.cloneElement(node, void 0, ...nextChildren);
|
|
149
|
+
}
|
|
150
|
+
return React.cloneElement(node, void 0, nextChildren);
|
|
133
151
|
}
|
|
134
|
-
|
|
152
|
+
const elementLike = node;
|
|
153
|
+
const nextProps = {
|
|
154
|
+
...elementLike.props ?? {},
|
|
155
|
+
children: nextChildren,
|
|
156
|
+
...elementLike.key !== void 0 && elementLike.key !== null ? { key: elementLike.key } : {}
|
|
157
|
+
};
|
|
158
|
+
return React.createElement(elementLike.type, nextProps);
|
|
135
159
|
}
|
|
136
160
|
|
|
137
161
|
// src/file-router.tsx
|
|
@@ -472,9 +496,12 @@ function createFileRouter(options) {
|
|
|
472
496
|
const errorHead = await resolveHead(errorModule, errorProps);
|
|
473
497
|
const layoutNode = layoutModule ? await layoutModule.default(context) : null;
|
|
474
498
|
const model = layoutNode ? injectRouteChildren(layoutNode, errorNode) : errorNode;
|
|
499
|
+
const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ jsx(RouteChildrenSlot, {})) : void 0;
|
|
475
500
|
return {
|
|
476
501
|
statusCode,
|
|
477
502
|
model,
|
|
503
|
+
contextModel,
|
|
504
|
+
pageModel: errorNode,
|
|
478
505
|
head: mergeHead(layoutHead, errorHead)
|
|
479
506
|
};
|
|
480
507
|
}
|
|
@@ -594,9 +621,12 @@ function createFileRouter(options) {
|
|
|
594
621
|
const pageHead = await resolveHead(pageModule, pageContext);
|
|
595
622
|
const layoutNode = layoutModule ? await layoutModule.default(pageContext) : null;
|
|
596
623
|
const model = layoutNode ? injectRouteChildren(layoutNode, pageNode) : pageNode;
|
|
624
|
+
const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ jsx(RouteChildrenSlot, {})) : void 0;
|
|
597
625
|
return {
|
|
598
626
|
statusCode: 200,
|
|
599
627
|
model,
|
|
628
|
+
contextModel,
|
|
629
|
+
pageModel: pageNode,
|
|
600
630
|
head: mergeHead(layoutHead, pageHead)
|
|
601
631
|
};
|
|
602
632
|
} catch (error) {
|
package/dist/types.d.ts
CHANGED
package/dist/webframez-core.cjs
CHANGED
|
@@ -145,6 +145,7 @@ function sendRSC(res, model, options = {}) {
|
|
|
145
145
|
} = options;
|
|
146
146
|
res.statusCode = statusCode;
|
|
147
147
|
res.setHeader("Content-Type", contentType);
|
|
148
|
+
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
|
|
148
149
|
const stream = (0, import_server.renderToPipeableStream)(model, moduleMap, { onError });
|
|
149
150
|
stream.pipe(res);
|
|
150
151
|
return stream;
|
|
@@ -154,6 +155,7 @@ function sendRSC(res, model, options = {}) {
|
|
|
154
155
|
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
155
156
|
var import_node_module2 = __toESM(require("node:module"), 1);
|
|
156
157
|
var import_node_path2 = __toESM(require("node:path"), 1);
|
|
158
|
+
var import_route_slot = require("@webtypen/webframez-react/route-slot");
|
|
157
159
|
|
|
158
160
|
// src/head.ts
|
|
159
161
|
var ABSOLUTE_ASSET_URL_PATTERN = /^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;
|
|
@@ -243,6 +245,16 @@ function isRouteChildrenType(type) {
|
|
|
243
245
|
return false;
|
|
244
246
|
}
|
|
245
247
|
}
|
|
248
|
+
function isReactElementLike(node) {
|
|
249
|
+
if (!node || typeof node !== "object") {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
return "type" in node && "props" in node;
|
|
254
|
+
} catch {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
246
258
|
function injectRouteChildren(node, routeChildren) {
|
|
247
259
|
if (node === null || node === void 0 || typeof node === "boolean") {
|
|
248
260
|
return node;
|
|
@@ -258,13 +270,17 @@ function injectRouteChildren(node, routeChildren) {
|
|
|
258
270
|
});
|
|
259
271
|
return changed ? next : node;
|
|
260
272
|
}
|
|
261
|
-
if (
|
|
273
|
+
if (isReactElementLike(node) && isRouteChildrenType(node.type)) {
|
|
274
|
+
return routeChildren;
|
|
275
|
+
}
|
|
276
|
+
const isValidElement = import_react.default.isValidElement(node);
|
|
277
|
+
if (!isValidElement && !isReactElementLike(node)) {
|
|
262
278
|
return node;
|
|
263
279
|
}
|
|
264
|
-
if (isRouteChildrenType(node.type)) {
|
|
280
|
+
if (isValidElement && isRouteChildrenType(node.type)) {
|
|
265
281
|
return routeChildren;
|
|
266
282
|
}
|
|
267
|
-
const props = node.props;
|
|
283
|
+
const props = node.props ?? {};
|
|
268
284
|
if (!("children" in props)) {
|
|
269
285
|
return node;
|
|
270
286
|
}
|
|
@@ -272,10 +288,19 @@ function injectRouteChildren(node, routeChildren) {
|
|
|
272
288
|
if (nextChildren === props.children) {
|
|
273
289
|
return node;
|
|
274
290
|
}
|
|
275
|
-
if (
|
|
276
|
-
|
|
291
|
+
if (isValidElement) {
|
|
292
|
+
if (Array.isArray(nextChildren)) {
|
|
293
|
+
return import_react.default.cloneElement(node, void 0, ...nextChildren);
|
|
294
|
+
}
|
|
295
|
+
return import_react.default.cloneElement(node, void 0, nextChildren);
|
|
277
296
|
}
|
|
278
|
-
|
|
297
|
+
const elementLike = node;
|
|
298
|
+
const nextProps = {
|
|
299
|
+
...elementLike.props ?? {},
|
|
300
|
+
children: nextChildren,
|
|
301
|
+
...elementLike.key !== void 0 && elementLike.key !== null ? { key: elementLike.key } : {}
|
|
302
|
+
};
|
|
303
|
+
return import_react.default.createElement(elementLike.type, nextProps);
|
|
279
304
|
}
|
|
280
305
|
|
|
281
306
|
// src/file-router.tsx
|
|
@@ -616,9 +641,12 @@ function createFileRouter(options) {
|
|
|
616
641
|
const errorHead = await resolveHead(errorModule, errorProps);
|
|
617
642
|
const layoutNode = layoutModule ? await layoutModule.default(context) : null;
|
|
618
643
|
const model = layoutNode ? injectRouteChildren(layoutNode, errorNode) : errorNode;
|
|
644
|
+
const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_route_slot.RouteChildrenSlot, {})) : void 0;
|
|
619
645
|
return {
|
|
620
646
|
statusCode,
|
|
621
647
|
model,
|
|
648
|
+
contextModel,
|
|
649
|
+
pageModel: errorNode,
|
|
622
650
|
head: mergeHead(layoutHead, errorHead)
|
|
623
651
|
};
|
|
624
652
|
}
|
|
@@ -738,9 +766,12 @@ function createFileRouter(options) {
|
|
|
738
766
|
const pageHead = await resolveHead(pageModule, pageContext);
|
|
739
767
|
const layoutNode = layoutModule ? await layoutModule.default(pageContext) : null;
|
|
740
768
|
const model = layoutNode ? injectRouteChildren(layoutNode, pageNode) : pageNode;
|
|
769
|
+
const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_route_slot.RouteChildrenSlot, {})) : void 0;
|
|
741
770
|
return {
|
|
742
771
|
statusCode: 200,
|
|
743
772
|
model,
|
|
773
|
+
contextModel,
|
|
774
|
+
pageModel: pageNode,
|
|
744
775
|
head: mergeHead(layoutHead, pageHead)
|
|
745
776
|
};
|
|
746
777
|
} catch (error) {
|
|
@@ -920,7 +951,21 @@ async function renderHtmlFromFlightData(flightData, moduleMap) {
|
|
|
920
951
|
? payload.model
|
|
921
952
|
: payload;
|
|
922
953
|
|
|
923
|
-
|
|
954
|
+
const basename =
|
|
955
|
+
payload &&
|
|
956
|
+
typeof payload === "object" &&
|
|
957
|
+
payload.head &&
|
|
958
|
+
typeof payload.head.basename === "string"
|
|
959
|
+
? payload.head.basename
|
|
960
|
+
: "";
|
|
961
|
+
|
|
962
|
+
const previousBasename = globalThis.__RSC_BASENAME;
|
|
963
|
+
globalThis.__RSC_BASENAME = basename;
|
|
964
|
+
try {
|
|
965
|
+
return await renderHtml(model);
|
|
966
|
+
} finally {
|
|
967
|
+
globalThis.__RSC_BASENAME = previousBasename;
|
|
968
|
+
}
|
|
924
969
|
}
|
|
925
970
|
|
|
926
971
|
process.on("message", async (message) => {
|
|
@@ -1257,16 +1302,16 @@ function createServerConsumerManifest(manifest) {
|
|
|
1257
1302
|
}
|
|
1258
1303
|
return requestKey;
|
|
1259
1304
|
};
|
|
1260
|
-
const addReference = (lookupKey, reference) => {
|
|
1305
|
+
const addReference = (lookupKey, exportName, reference) => {
|
|
1261
1306
|
if (!lookupKey || lookupKey.trim() === "") {
|
|
1262
1307
|
return;
|
|
1263
1308
|
}
|
|
1264
|
-
|
|
1309
|
+
const normalizedExportName = exportName || "*";
|
|
1310
|
+
consumerManifest[lookupKey] ??= {};
|
|
1311
|
+
if (normalizedExportName in consumerManifest[lookupKey]) {
|
|
1265
1312
|
return;
|
|
1266
1313
|
}
|
|
1267
|
-
consumerManifest[lookupKey] =
|
|
1268
|
-
"*": reference
|
|
1269
|
-
};
|
|
1314
|
+
consumerManifest[lookupKey][normalizedExportName] = reference;
|
|
1270
1315
|
};
|
|
1271
1316
|
for (const [key, value] of Object.entries(manifest)) {
|
|
1272
1317
|
if (!value || typeof value !== "object") {
|
|
@@ -1283,9 +1328,35 @@ function createServerConsumerManifest(manifest) {
|
|
|
1283
1328
|
name: entry.name ?? "*",
|
|
1284
1329
|
...entry.async ? { async: entry.async } : {}
|
|
1285
1330
|
};
|
|
1286
|
-
|
|
1331
|
+
const hashIndex = key.lastIndexOf("#");
|
|
1332
|
+
const keyWithoutExport = hashIndex > -1 ? key.slice(0, hashIndex) : key;
|
|
1333
|
+
const keyExportName = hashIndex > -1 ? key.slice(hashIndex + 1) : "";
|
|
1334
|
+
const manifestExportName = typeof entry.name === "string" && entry.name !== "*" ? entry.name : "";
|
|
1335
|
+
const exportNames = new Set(
|
|
1336
|
+
[keyExportName, manifestExportName].filter((name) => name.trim() !== "")
|
|
1337
|
+
);
|
|
1338
|
+
addReference(
|
|
1339
|
+
key,
|
|
1340
|
+
"*",
|
|
1341
|
+
keyExportName ? { ...reference, name: keyExportName } : reference
|
|
1342
|
+
);
|
|
1343
|
+
addReference(keyWithoutExport, "*", reference);
|
|
1344
|
+
for (const exportName of exportNames) {
|
|
1345
|
+
const exportReference = {
|
|
1346
|
+
...reference,
|
|
1347
|
+
name: exportName
|
|
1348
|
+
};
|
|
1349
|
+
addReference(keyWithoutExport, exportName, exportReference);
|
|
1350
|
+
addReference(key, "*", exportReference);
|
|
1351
|
+
}
|
|
1287
1352
|
if (typeof entry.id === "number" && Number.isFinite(entry.id)) {
|
|
1288
|
-
addReference(String(entry.id), reference);
|
|
1353
|
+
addReference(String(entry.id), "*", reference);
|
|
1354
|
+
for (const exportName of exportNames) {
|
|
1355
|
+
addReference(String(entry.id), exportName, {
|
|
1356
|
+
...reference,
|
|
1357
|
+
name: exportName
|
|
1358
|
+
});
|
|
1359
|
+
}
|
|
1289
1360
|
}
|
|
1290
1361
|
}
|
|
1291
1362
|
return consumerManifest;
|
|
@@ -1387,6 +1458,8 @@ function createNodeRequestHandler(options) {
|
|
|
1387
1458
|
);
|
|
1388
1459
|
const payload = {
|
|
1389
1460
|
model: resolved2.model,
|
|
1461
|
+
contextModel: resolved2.contextModel,
|
|
1462
|
+
pageModel: resolved2.pageModel,
|
|
1390
1463
|
head: resolved2.head
|
|
1391
1464
|
};
|
|
1392
1465
|
sendRSC(res, payload, {
|
|
@@ -1409,6 +1482,7 @@ function createNodeRequestHandler(options) {
|
|
|
1409
1482
|
} else if (ext === ".json") {
|
|
1410
1483
|
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
1411
1484
|
}
|
|
1485
|
+
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
|
|
1412
1486
|
const stream = import_node_fs2.default.createReadStream(filePath);
|
|
1413
1487
|
stream.on("error", () => {
|
|
1414
1488
|
res.statusCode = 404;
|
|
@@ -1432,6 +1506,8 @@ function createNodeRequestHandler(options) {
|
|
|
1432
1506
|
);
|
|
1433
1507
|
const initialPayload = {
|
|
1434
1508
|
model: resolved.model,
|
|
1509
|
+
contextModel: resolved.contextModel,
|
|
1510
|
+
pageModel: resolved.pageModel,
|
|
1435
1511
|
head: resolved.head
|
|
1436
1512
|
};
|
|
1437
1513
|
const initialFlightData = await renderRSCToString(initialPayload, {
|
package/dist/webframez-core.js
CHANGED
|
@@ -117,6 +117,7 @@ function sendRSC(res, model, options = {}) {
|
|
|
117
117
|
} = options;
|
|
118
118
|
res.statusCode = statusCode;
|
|
119
119
|
res.setHeader("Content-Type", contentType);
|
|
120
|
+
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
|
|
120
121
|
const stream = renderToPipeableStream(model, moduleMap, { onError });
|
|
121
122
|
stream.pipe(res);
|
|
122
123
|
return stream;
|
|
@@ -126,6 +127,7 @@ function sendRSC(res, model, options = {}) {
|
|
|
126
127
|
import fs from "node:fs";
|
|
127
128
|
import Module from "node:module";
|
|
128
129
|
import path2 from "node:path";
|
|
130
|
+
import { RouteChildrenSlot } from "@webtypen/webframez-react/route-slot";
|
|
129
131
|
|
|
130
132
|
// src/head.ts
|
|
131
133
|
var ABSOLUTE_ASSET_URL_PATTERN = /^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;
|
|
@@ -215,6 +217,16 @@ function isRouteChildrenType(type) {
|
|
|
215
217
|
return false;
|
|
216
218
|
}
|
|
217
219
|
}
|
|
220
|
+
function isReactElementLike(node) {
|
|
221
|
+
if (!node || typeof node !== "object") {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
return "type" in node && "props" in node;
|
|
226
|
+
} catch {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
218
230
|
function injectRouteChildren(node, routeChildren) {
|
|
219
231
|
if (node === null || node === void 0 || typeof node === "boolean") {
|
|
220
232
|
return node;
|
|
@@ -230,13 +242,17 @@ function injectRouteChildren(node, routeChildren) {
|
|
|
230
242
|
});
|
|
231
243
|
return changed ? next : node;
|
|
232
244
|
}
|
|
233
|
-
if (
|
|
245
|
+
if (isReactElementLike(node) && isRouteChildrenType(node.type)) {
|
|
246
|
+
return routeChildren;
|
|
247
|
+
}
|
|
248
|
+
const isValidElement = React.isValidElement(node);
|
|
249
|
+
if (!isValidElement && !isReactElementLike(node)) {
|
|
234
250
|
return node;
|
|
235
251
|
}
|
|
236
|
-
if (isRouteChildrenType(node.type)) {
|
|
252
|
+
if (isValidElement && isRouteChildrenType(node.type)) {
|
|
237
253
|
return routeChildren;
|
|
238
254
|
}
|
|
239
|
-
const props = node.props;
|
|
255
|
+
const props = node.props ?? {};
|
|
240
256
|
if (!("children" in props)) {
|
|
241
257
|
return node;
|
|
242
258
|
}
|
|
@@ -244,10 +260,19 @@ function injectRouteChildren(node, routeChildren) {
|
|
|
244
260
|
if (nextChildren === props.children) {
|
|
245
261
|
return node;
|
|
246
262
|
}
|
|
247
|
-
if (
|
|
248
|
-
|
|
263
|
+
if (isValidElement) {
|
|
264
|
+
if (Array.isArray(nextChildren)) {
|
|
265
|
+
return React.cloneElement(node, void 0, ...nextChildren);
|
|
266
|
+
}
|
|
267
|
+
return React.cloneElement(node, void 0, nextChildren);
|
|
249
268
|
}
|
|
250
|
-
|
|
269
|
+
const elementLike = node;
|
|
270
|
+
const nextProps = {
|
|
271
|
+
...elementLike.props ?? {},
|
|
272
|
+
children: nextChildren,
|
|
273
|
+
...elementLike.key !== void 0 && elementLike.key !== null ? { key: elementLike.key } : {}
|
|
274
|
+
};
|
|
275
|
+
return React.createElement(elementLike.type, nextProps);
|
|
251
276
|
}
|
|
252
277
|
|
|
253
278
|
// src/file-router.tsx
|
|
@@ -588,9 +613,12 @@ function createFileRouter(options) {
|
|
|
588
613
|
const errorHead = await resolveHead(errorModule, errorProps);
|
|
589
614
|
const layoutNode = layoutModule ? await layoutModule.default(context) : null;
|
|
590
615
|
const model = layoutNode ? injectRouteChildren(layoutNode, errorNode) : errorNode;
|
|
616
|
+
const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ jsx(RouteChildrenSlot, {})) : void 0;
|
|
591
617
|
return {
|
|
592
618
|
statusCode,
|
|
593
619
|
model,
|
|
620
|
+
contextModel,
|
|
621
|
+
pageModel: errorNode,
|
|
594
622
|
head: mergeHead(layoutHead, errorHead)
|
|
595
623
|
};
|
|
596
624
|
}
|
|
@@ -710,9 +738,12 @@ function createFileRouter(options) {
|
|
|
710
738
|
const pageHead = await resolveHead(pageModule, pageContext);
|
|
711
739
|
const layoutNode = layoutModule ? await layoutModule.default(pageContext) : null;
|
|
712
740
|
const model = layoutNode ? injectRouteChildren(layoutNode, pageNode) : pageNode;
|
|
741
|
+
const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ jsx(RouteChildrenSlot, {})) : void 0;
|
|
713
742
|
return {
|
|
714
743
|
statusCode: 200,
|
|
715
744
|
model,
|
|
745
|
+
contextModel,
|
|
746
|
+
pageModel: pageNode,
|
|
716
747
|
head: mergeHead(layoutHead, pageHead)
|
|
717
748
|
};
|
|
718
749
|
} catch (error) {
|
|
@@ -892,7 +923,21 @@ async function renderHtmlFromFlightData(flightData, moduleMap) {
|
|
|
892
923
|
? payload.model
|
|
893
924
|
: payload;
|
|
894
925
|
|
|
895
|
-
|
|
926
|
+
const basename =
|
|
927
|
+
payload &&
|
|
928
|
+
typeof payload === "object" &&
|
|
929
|
+
payload.head &&
|
|
930
|
+
typeof payload.head.basename === "string"
|
|
931
|
+
? payload.head.basename
|
|
932
|
+
: "";
|
|
933
|
+
|
|
934
|
+
const previousBasename = globalThis.__RSC_BASENAME;
|
|
935
|
+
globalThis.__RSC_BASENAME = basename;
|
|
936
|
+
try {
|
|
937
|
+
return await renderHtml(model);
|
|
938
|
+
} finally {
|
|
939
|
+
globalThis.__RSC_BASENAME = previousBasename;
|
|
940
|
+
}
|
|
896
941
|
}
|
|
897
942
|
|
|
898
943
|
process.on("message", async (message) => {
|
|
@@ -1229,16 +1274,16 @@ function createServerConsumerManifest(manifest) {
|
|
|
1229
1274
|
}
|
|
1230
1275
|
return requestKey;
|
|
1231
1276
|
};
|
|
1232
|
-
const addReference = (lookupKey, reference) => {
|
|
1277
|
+
const addReference = (lookupKey, exportName, reference) => {
|
|
1233
1278
|
if (!lookupKey || lookupKey.trim() === "") {
|
|
1234
1279
|
return;
|
|
1235
1280
|
}
|
|
1236
|
-
|
|
1281
|
+
const normalizedExportName = exportName || "*";
|
|
1282
|
+
consumerManifest[lookupKey] ??= {};
|
|
1283
|
+
if (normalizedExportName in consumerManifest[lookupKey]) {
|
|
1237
1284
|
return;
|
|
1238
1285
|
}
|
|
1239
|
-
consumerManifest[lookupKey] =
|
|
1240
|
-
"*": reference
|
|
1241
|
-
};
|
|
1286
|
+
consumerManifest[lookupKey][normalizedExportName] = reference;
|
|
1242
1287
|
};
|
|
1243
1288
|
for (const [key, value] of Object.entries(manifest)) {
|
|
1244
1289
|
if (!value || typeof value !== "object") {
|
|
@@ -1255,9 +1300,35 @@ function createServerConsumerManifest(manifest) {
|
|
|
1255
1300
|
name: entry.name ?? "*",
|
|
1256
1301
|
...entry.async ? { async: entry.async } : {}
|
|
1257
1302
|
};
|
|
1258
|
-
|
|
1303
|
+
const hashIndex = key.lastIndexOf("#");
|
|
1304
|
+
const keyWithoutExport = hashIndex > -1 ? key.slice(0, hashIndex) : key;
|
|
1305
|
+
const keyExportName = hashIndex > -1 ? key.slice(hashIndex + 1) : "";
|
|
1306
|
+
const manifestExportName = typeof entry.name === "string" && entry.name !== "*" ? entry.name : "";
|
|
1307
|
+
const exportNames = new Set(
|
|
1308
|
+
[keyExportName, manifestExportName].filter((name) => name.trim() !== "")
|
|
1309
|
+
);
|
|
1310
|
+
addReference(
|
|
1311
|
+
key,
|
|
1312
|
+
"*",
|
|
1313
|
+
keyExportName ? { ...reference, name: keyExportName } : reference
|
|
1314
|
+
);
|
|
1315
|
+
addReference(keyWithoutExport, "*", reference);
|
|
1316
|
+
for (const exportName of exportNames) {
|
|
1317
|
+
const exportReference = {
|
|
1318
|
+
...reference,
|
|
1319
|
+
name: exportName
|
|
1320
|
+
};
|
|
1321
|
+
addReference(keyWithoutExport, exportName, exportReference);
|
|
1322
|
+
addReference(key, "*", exportReference);
|
|
1323
|
+
}
|
|
1259
1324
|
if (typeof entry.id === "number" && Number.isFinite(entry.id)) {
|
|
1260
|
-
addReference(String(entry.id), reference);
|
|
1325
|
+
addReference(String(entry.id), "*", reference);
|
|
1326
|
+
for (const exportName of exportNames) {
|
|
1327
|
+
addReference(String(entry.id), exportName, {
|
|
1328
|
+
...reference,
|
|
1329
|
+
name: exportName
|
|
1330
|
+
});
|
|
1331
|
+
}
|
|
1261
1332
|
}
|
|
1262
1333
|
}
|
|
1263
1334
|
return consumerManifest;
|
|
@@ -1359,6 +1430,8 @@ function createNodeRequestHandler(options) {
|
|
|
1359
1430
|
);
|
|
1360
1431
|
const payload = {
|
|
1361
1432
|
model: resolved2.model,
|
|
1433
|
+
contextModel: resolved2.contextModel,
|
|
1434
|
+
pageModel: resolved2.pageModel,
|
|
1362
1435
|
head: resolved2.head
|
|
1363
1436
|
};
|
|
1364
1437
|
sendRSC(res, payload, {
|
|
@@ -1381,6 +1454,7 @@ function createNodeRequestHandler(options) {
|
|
|
1381
1454
|
} else if (ext === ".json") {
|
|
1382
1455
|
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
1383
1456
|
}
|
|
1457
|
+
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
|
|
1384
1458
|
const stream = fs2.createReadStream(filePath);
|
|
1385
1459
|
stream.on("error", () => {
|
|
1386
1460
|
res.statusCode = 404;
|
|
@@ -1404,6 +1478,8 @@ function createNodeRequestHandler(options) {
|
|
|
1404
1478
|
);
|
|
1405
1479
|
const initialPayload = {
|
|
1406
1480
|
model: resolved.model,
|
|
1481
|
+
contextModel: resolved.contextModel,
|
|
1482
|
+
pageModel: resolved.pageModel,
|
|
1407
1483
|
head: resolved.head
|
|
1408
1484
|
};
|
|
1409
1485
|
const initialFlightData = await renderRSCToString(initialPayload, {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webtypen/webframez-react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.34",
|
|
4
4
|
"description": "TypeScript React RSC addition for @webtypen/webframez-core",
|
|
5
5
|
"homepage": "https://webtypen.de/",
|
|
6
6
|
"author": {
|
|
@@ -43,6 +43,11 @@
|
|
|
43
43
|
"import": "./dist/navigation.js",
|
|
44
44
|
"require": "./dist/navigation.cjs"
|
|
45
45
|
},
|
|
46
|
+
"./route-slot": {
|
|
47
|
+
"types": "./dist/route-slot.d.ts",
|
|
48
|
+
"import": "./dist/route-slot.js",
|
|
49
|
+
"require": "./dist/route-slot.cjs"
|
|
50
|
+
},
|
|
46
51
|
"./types": {
|
|
47
52
|
"types": "./dist/types.d.ts",
|
|
48
53
|
"import": "./dist/types.js",
|