@webtypen/webframez-react 0.0.14 → 0.0.16
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/http.cjs +139 -8
- package/dist/http.js +139 -8
- package/dist/index.cjs +139 -8
- package/dist/index.js +139 -8
- package/dist/router.cjs +119 -3
- package/dist/router.js +119 -3
- package/dist/types.d.ts +10 -0
- package/dist/webframez-core.cjs +139 -8
- package/dist/webframez-core.js +139 -8
- package/package.json +1 -1
package/dist/http.cjs
CHANGED
|
@@ -169,6 +169,7 @@ function sendRSC(res, model, options = {}) {
|
|
|
169
169
|
|
|
170
170
|
// src/file-router.tsx
|
|
171
171
|
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
172
|
+
var import_node_module2 = __toESM(require("node:module"), 1);
|
|
172
173
|
var import_node_path2 = __toESM(require("node:path"), 1);
|
|
173
174
|
|
|
174
175
|
// src/router-runtime.tsx
|
|
@@ -231,6 +232,26 @@ function injectRouteChildren(node, routeChildren) {
|
|
|
231
232
|
|
|
232
233
|
// src/file-router.tsx
|
|
233
234
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
235
|
+
var ROOT_RUNTIME_REQUIRE = import_node_module2.default.createRequire(
|
|
236
|
+
import_node_path2.default.join(process.cwd(), "__webframez_react_runtime__.js")
|
|
237
|
+
);
|
|
238
|
+
var FORCED_PACKAGE_REQUESTS = [
|
|
239
|
+
"@webtypen/webframez-core",
|
|
240
|
+
"@webtypen/webframez-react",
|
|
241
|
+
"react",
|
|
242
|
+
"react/jsx-runtime",
|
|
243
|
+
"react/jsx-dev-runtime",
|
|
244
|
+
"react-dom",
|
|
245
|
+
"react-dom/client",
|
|
246
|
+
"react-dom/server",
|
|
247
|
+
"react-dom/server.node",
|
|
248
|
+
"react-server-dom-webpack",
|
|
249
|
+
"react-server-dom-webpack/server",
|
|
250
|
+
"react-server-dom-webpack/client",
|
|
251
|
+
"react-server-dom-webpack/client.node",
|
|
252
|
+
"scheduler"
|
|
253
|
+
];
|
|
254
|
+
var forcedPackageResolutionInstalled = false;
|
|
234
255
|
function normalizePathname(pathname) {
|
|
235
256
|
const trimmed = pathname.replace(/\/+$/, "") || "/";
|
|
236
257
|
return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
@@ -279,6 +300,28 @@ var MANAGED_HEAD_ATTR = "data-webframez-head";
|
|
|
279
300
|
function createManagedAttributes() {
|
|
280
301
|
return `${MANAGED_HEAD_ATTR}="true"`;
|
|
281
302
|
}
|
|
303
|
+
function shouldForcePackageResolution(request) {
|
|
304
|
+
return FORCED_PACKAGE_REQUESTS.some(
|
|
305
|
+
(candidate) => request === candidate || request.startsWith(`${candidate}/`)
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
function installForcedPackageResolution() {
|
|
309
|
+
if (forcedPackageResolutionInstalled) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const moduleWithPrivateResolver = import_node_module2.default;
|
|
313
|
+
const originalResolveFilename = moduleWithPrivateResolver._resolveFilename;
|
|
314
|
+
moduleWithPrivateResolver._resolveFilename = function patchedResolveFilename(request, parent, isMain, options) {
|
|
315
|
+
if (typeof request === "string" && shouldForcePackageResolution(request)) {
|
|
316
|
+
try {
|
|
317
|
+
return ROOT_RUNTIME_REQUIRE.resolve(request);
|
|
318
|
+
} catch {
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return originalResolveFilename.call(this, request, parent, isMain, options);
|
|
322
|
+
};
|
|
323
|
+
forcedPackageResolutionInstalled = true;
|
|
324
|
+
}
|
|
282
325
|
function toRouteEntry(pagesDir, filePath) {
|
|
283
326
|
const normalized = filePath.replace(/\\/g, "/");
|
|
284
327
|
if (!normalized.endsWith("/index.js")) {
|
|
@@ -426,9 +469,11 @@ function isRouteAbort(value) {
|
|
|
426
469
|
}
|
|
427
470
|
}
|
|
428
471
|
function createFileRouter(options) {
|
|
472
|
+
installForcedPackageResolution();
|
|
429
473
|
const pagesDir = options.pagesDir;
|
|
430
474
|
const layoutPath = import_node_path2.default.join(pagesDir, "layout.js");
|
|
431
475
|
const errorPath = import_node_path2.default.join(pagesDir, "errors.js");
|
|
476
|
+
const middlewaresPath = import_node_path2.default.join(pagesDir, "middlewares.js");
|
|
432
477
|
function buildRouteEntries() {
|
|
433
478
|
const files = walkFiles(pagesDir);
|
|
434
479
|
return files.map((filePath) => toRouteEntry(pagesDir, filePath)).filter((entry) => entry !== null).sort((a, b) => {
|
|
@@ -471,6 +516,75 @@ function createFileRouter(options) {
|
|
|
471
516
|
head: mergeHead(layoutHead, errorHead)
|
|
472
517
|
};
|
|
473
518
|
}
|
|
519
|
+
function normalizeMiddlewareNames(config) {
|
|
520
|
+
if (!config) {
|
|
521
|
+
return [];
|
|
522
|
+
}
|
|
523
|
+
return Array.isArray(config) ? config : [config];
|
|
524
|
+
}
|
|
525
|
+
function isPlainObject(value) {
|
|
526
|
+
if (!value || typeof value !== "object") {
|
|
527
|
+
return false;
|
|
528
|
+
}
|
|
529
|
+
const prototype = Object.getPrototypeOf(value);
|
|
530
|
+
return prototype === Object.prototype || prototype === null;
|
|
531
|
+
}
|
|
532
|
+
function mergeRouteData(currentData, nextData) {
|
|
533
|
+
if (typeof nextData === "undefined") {
|
|
534
|
+
return currentData;
|
|
535
|
+
}
|
|
536
|
+
if (isPlainObject(currentData) && isPlainObject(nextData)) {
|
|
537
|
+
return {
|
|
538
|
+
...currentData,
|
|
539
|
+
...nextData
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
return nextData;
|
|
543
|
+
}
|
|
544
|
+
async function resolveMiddlewares(config, context) {
|
|
545
|
+
const middlewareNames = normalizeMiddlewareNames(config);
|
|
546
|
+
const requiresNamedMiddleware = middlewareNames.length > 0;
|
|
547
|
+
if (!import_node_fs.default.existsSync(middlewaresPath)) {
|
|
548
|
+
if (!requiresNamedMiddleware) {
|
|
549
|
+
return context;
|
|
550
|
+
}
|
|
551
|
+
throw createAbort({
|
|
552
|
+
status: 500,
|
|
553
|
+
message: `Invalid middleware '${middlewareNames[0]}'`
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
const middlewareModule = resolveModule(middlewaresPath);
|
|
557
|
+
const registry = middlewareModule.middlewares;
|
|
558
|
+
if (!registry) {
|
|
559
|
+
if (!requiresNamedMiddleware) {
|
|
560
|
+
return context;
|
|
561
|
+
}
|
|
562
|
+
throw createAbort({
|
|
563
|
+
status: 500,
|
|
564
|
+
message: `Invalid middleware '${middlewareNames[0]}'`
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
const orderedMiddlewareNames = typeof registry["*"] === "function" ? ["*", ...middlewareNames] : middlewareNames;
|
|
568
|
+
if (orderedMiddlewareNames.length === 0) {
|
|
569
|
+
return context;
|
|
570
|
+
}
|
|
571
|
+
let nextContext = context;
|
|
572
|
+
for (const middlewareName of orderedMiddlewareNames) {
|
|
573
|
+
const middleware = registry[middlewareName];
|
|
574
|
+
if (typeof middleware !== "function") {
|
|
575
|
+
throw createAbort({
|
|
576
|
+
status: 500,
|
|
577
|
+
message: `Invalid middleware '${middlewareName}'`
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
const middlewareData = await middleware(nextContext);
|
|
581
|
+
nextContext = {
|
|
582
|
+
...nextContext,
|
|
583
|
+
data: mergeRouteData(nextContext.data, middlewareData)
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
return nextContext;
|
|
587
|
+
}
|
|
474
588
|
async function resolve(input) {
|
|
475
589
|
const pathname = normalizePathname(input.pathname);
|
|
476
590
|
const contextBase = {
|
|
@@ -496,10 +610,12 @@ function createFileRouter(options) {
|
|
|
496
610
|
activeContext = context;
|
|
497
611
|
const pageModule = resolveModule(match.entry.filePath);
|
|
498
612
|
const layoutModule = import_node_fs.default.existsSync(layoutPath) ? resolveModule(layoutPath) : null;
|
|
499
|
-
const
|
|
613
|
+
const middlewareContext = await resolveMiddlewares(pageModule.middlewares, context);
|
|
614
|
+
activeContext = middlewareContext;
|
|
615
|
+
const pageData = await resolvePageData(pageModule, middlewareContext);
|
|
500
616
|
const pageContext = {
|
|
501
|
-
...
|
|
502
|
-
data: pageData
|
|
617
|
+
...middlewareContext,
|
|
618
|
+
data: mergeRouteData(middlewareContext.data, pageData)
|
|
503
619
|
};
|
|
504
620
|
activeContext = pageContext;
|
|
505
621
|
const pageNode = await pageModule.default(pageContext);
|
|
@@ -543,19 +659,34 @@ if (!pagesDir) {
|
|
|
543
659
|
throw new Error("Missing WEBFRAMEZ_REACT_PAGES_DIR");
|
|
544
660
|
}
|
|
545
661
|
|
|
546
|
-
const
|
|
662
|
+
const rootRequire = Module.createRequire(path.join(process.cwd(), "__webframez_react_worker__.js"));
|
|
547
663
|
const originalResolveFilename = Module._resolveFilename;
|
|
548
664
|
const forcedResolutions = new Map([
|
|
549
|
-
["
|
|
550
|
-
["
|
|
551
|
-
["react
|
|
552
|
-
["react-
|
|
665
|
+
["@webtypen/webframez-core", rootRequire.resolve("@webtypen/webframez-core")],
|
|
666
|
+
["@webtypen/webframez-react", rootRequire.resolve("@webtypen/webframez-react")],
|
|
667
|
+
["react", rootRequire.resolve("react")],
|
|
668
|
+
["react/jsx-runtime", rootRequire.resolve("react/jsx-runtime")],
|
|
669
|
+
["react/jsx-dev-runtime", rootRequire.resolve("react/jsx-dev-runtime")],
|
|
670
|
+
["react-dom", rootRequire.resolve("react-dom")],
|
|
671
|
+
["react-dom/client", rootRequire.resolve("react-dom/client")],
|
|
672
|
+
["react-dom/server", rootRequire.resolve("react-dom/server")],
|
|
673
|
+
["react-dom/server.node", rootRequire.resolve("react-dom/server.node")],
|
|
674
|
+
["react-server-dom-webpack", rootRequire.resolve("react-server-dom-webpack")],
|
|
675
|
+
["react-server-dom-webpack/server", rootRequire.resolve("react-server-dom-webpack/server")],
|
|
676
|
+
["react-server-dom-webpack/client", rootRequire.resolve("react-server-dom-webpack/client")],
|
|
677
|
+
["react-server-dom-webpack/client.node", rootRequire.resolve("react-server-dom-webpack/client.node")],
|
|
678
|
+
["scheduler", rootRequire.resolve("scheduler")]
|
|
553
679
|
]);
|
|
554
680
|
|
|
555
681
|
Module._resolveFilename = function(request, parent, isMain, options) {
|
|
556
682
|
if (forcedResolutions.has(request)) {
|
|
557
683
|
return forcedResolutions.get(request);
|
|
558
684
|
}
|
|
685
|
+
for (const forcedRequest of forcedResolutions.keys()) {
|
|
686
|
+
if (request.startsWith(forcedRequest + "/")) {
|
|
687
|
+
return rootRequire.resolve(request);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
559
690
|
return originalResolveFilename.call(this, request, parent, isMain, options);
|
|
560
691
|
};
|
|
561
692
|
|
package/dist/http.js
CHANGED
|
@@ -144,6 +144,7 @@ function sendRSC(res, model, options = {}) {
|
|
|
144
144
|
|
|
145
145
|
// src/file-router.tsx
|
|
146
146
|
import fs from "node:fs";
|
|
147
|
+
import Module from "node:module";
|
|
147
148
|
import path2 from "node:path";
|
|
148
149
|
|
|
149
150
|
// src/router-runtime.tsx
|
|
@@ -206,6 +207,26 @@ function injectRouteChildren(node, routeChildren) {
|
|
|
206
207
|
|
|
207
208
|
// src/file-router.tsx
|
|
208
209
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
210
|
+
var ROOT_RUNTIME_REQUIRE = Module.createRequire(
|
|
211
|
+
path2.join(process.cwd(), "__webframez_react_runtime__.js")
|
|
212
|
+
);
|
|
213
|
+
var FORCED_PACKAGE_REQUESTS = [
|
|
214
|
+
"@webtypen/webframez-core",
|
|
215
|
+
"@webtypen/webframez-react",
|
|
216
|
+
"react",
|
|
217
|
+
"react/jsx-runtime",
|
|
218
|
+
"react/jsx-dev-runtime",
|
|
219
|
+
"react-dom",
|
|
220
|
+
"react-dom/client",
|
|
221
|
+
"react-dom/server",
|
|
222
|
+
"react-dom/server.node",
|
|
223
|
+
"react-server-dom-webpack",
|
|
224
|
+
"react-server-dom-webpack/server",
|
|
225
|
+
"react-server-dom-webpack/client",
|
|
226
|
+
"react-server-dom-webpack/client.node",
|
|
227
|
+
"scheduler"
|
|
228
|
+
];
|
|
229
|
+
var forcedPackageResolutionInstalled = false;
|
|
209
230
|
function normalizePathname(pathname) {
|
|
210
231
|
const trimmed = pathname.replace(/\/+$/, "") || "/";
|
|
211
232
|
return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
@@ -254,6 +275,28 @@ var MANAGED_HEAD_ATTR = "data-webframez-head";
|
|
|
254
275
|
function createManagedAttributes() {
|
|
255
276
|
return `${MANAGED_HEAD_ATTR}="true"`;
|
|
256
277
|
}
|
|
278
|
+
function shouldForcePackageResolution(request) {
|
|
279
|
+
return FORCED_PACKAGE_REQUESTS.some(
|
|
280
|
+
(candidate) => request === candidate || request.startsWith(`${candidate}/`)
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
function installForcedPackageResolution() {
|
|
284
|
+
if (forcedPackageResolutionInstalled) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const moduleWithPrivateResolver = Module;
|
|
288
|
+
const originalResolveFilename = moduleWithPrivateResolver._resolveFilename;
|
|
289
|
+
moduleWithPrivateResolver._resolveFilename = function patchedResolveFilename(request, parent, isMain, options) {
|
|
290
|
+
if (typeof request === "string" && shouldForcePackageResolution(request)) {
|
|
291
|
+
try {
|
|
292
|
+
return ROOT_RUNTIME_REQUIRE.resolve(request);
|
|
293
|
+
} catch {
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return originalResolveFilename.call(this, request, parent, isMain, options);
|
|
297
|
+
};
|
|
298
|
+
forcedPackageResolutionInstalled = true;
|
|
299
|
+
}
|
|
257
300
|
function toRouteEntry(pagesDir, filePath) {
|
|
258
301
|
const normalized = filePath.replace(/\\/g, "/");
|
|
259
302
|
if (!normalized.endsWith("/index.js")) {
|
|
@@ -401,9 +444,11 @@ function isRouteAbort(value) {
|
|
|
401
444
|
}
|
|
402
445
|
}
|
|
403
446
|
function createFileRouter(options) {
|
|
447
|
+
installForcedPackageResolution();
|
|
404
448
|
const pagesDir = options.pagesDir;
|
|
405
449
|
const layoutPath = path2.join(pagesDir, "layout.js");
|
|
406
450
|
const errorPath = path2.join(pagesDir, "errors.js");
|
|
451
|
+
const middlewaresPath = path2.join(pagesDir, "middlewares.js");
|
|
407
452
|
function buildRouteEntries() {
|
|
408
453
|
const files = walkFiles(pagesDir);
|
|
409
454
|
return files.map((filePath) => toRouteEntry(pagesDir, filePath)).filter((entry) => entry !== null).sort((a, b) => {
|
|
@@ -446,6 +491,75 @@ function createFileRouter(options) {
|
|
|
446
491
|
head: mergeHead(layoutHead, errorHead)
|
|
447
492
|
};
|
|
448
493
|
}
|
|
494
|
+
function normalizeMiddlewareNames(config) {
|
|
495
|
+
if (!config) {
|
|
496
|
+
return [];
|
|
497
|
+
}
|
|
498
|
+
return Array.isArray(config) ? config : [config];
|
|
499
|
+
}
|
|
500
|
+
function isPlainObject(value) {
|
|
501
|
+
if (!value || typeof value !== "object") {
|
|
502
|
+
return false;
|
|
503
|
+
}
|
|
504
|
+
const prototype = Object.getPrototypeOf(value);
|
|
505
|
+
return prototype === Object.prototype || prototype === null;
|
|
506
|
+
}
|
|
507
|
+
function mergeRouteData(currentData, nextData) {
|
|
508
|
+
if (typeof nextData === "undefined") {
|
|
509
|
+
return currentData;
|
|
510
|
+
}
|
|
511
|
+
if (isPlainObject(currentData) && isPlainObject(nextData)) {
|
|
512
|
+
return {
|
|
513
|
+
...currentData,
|
|
514
|
+
...nextData
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
return nextData;
|
|
518
|
+
}
|
|
519
|
+
async function resolveMiddlewares(config, context) {
|
|
520
|
+
const middlewareNames = normalizeMiddlewareNames(config);
|
|
521
|
+
const requiresNamedMiddleware = middlewareNames.length > 0;
|
|
522
|
+
if (!fs.existsSync(middlewaresPath)) {
|
|
523
|
+
if (!requiresNamedMiddleware) {
|
|
524
|
+
return context;
|
|
525
|
+
}
|
|
526
|
+
throw createAbort({
|
|
527
|
+
status: 500,
|
|
528
|
+
message: `Invalid middleware '${middlewareNames[0]}'`
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
const middlewareModule = resolveModule(middlewaresPath);
|
|
532
|
+
const registry = middlewareModule.middlewares;
|
|
533
|
+
if (!registry) {
|
|
534
|
+
if (!requiresNamedMiddleware) {
|
|
535
|
+
return context;
|
|
536
|
+
}
|
|
537
|
+
throw createAbort({
|
|
538
|
+
status: 500,
|
|
539
|
+
message: `Invalid middleware '${middlewareNames[0]}'`
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
const orderedMiddlewareNames = typeof registry["*"] === "function" ? ["*", ...middlewareNames] : middlewareNames;
|
|
543
|
+
if (orderedMiddlewareNames.length === 0) {
|
|
544
|
+
return context;
|
|
545
|
+
}
|
|
546
|
+
let nextContext = context;
|
|
547
|
+
for (const middlewareName of orderedMiddlewareNames) {
|
|
548
|
+
const middleware = registry[middlewareName];
|
|
549
|
+
if (typeof middleware !== "function") {
|
|
550
|
+
throw createAbort({
|
|
551
|
+
status: 500,
|
|
552
|
+
message: `Invalid middleware '${middlewareName}'`
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
const middlewareData = await middleware(nextContext);
|
|
556
|
+
nextContext = {
|
|
557
|
+
...nextContext,
|
|
558
|
+
data: mergeRouteData(nextContext.data, middlewareData)
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
return nextContext;
|
|
562
|
+
}
|
|
449
563
|
async function resolve(input) {
|
|
450
564
|
const pathname = normalizePathname(input.pathname);
|
|
451
565
|
const contextBase = {
|
|
@@ -471,10 +585,12 @@ function createFileRouter(options) {
|
|
|
471
585
|
activeContext = context;
|
|
472
586
|
const pageModule = resolveModule(match.entry.filePath);
|
|
473
587
|
const layoutModule = fs.existsSync(layoutPath) ? resolveModule(layoutPath) : null;
|
|
474
|
-
const
|
|
588
|
+
const middlewareContext = await resolveMiddlewares(pageModule.middlewares, context);
|
|
589
|
+
activeContext = middlewareContext;
|
|
590
|
+
const pageData = await resolvePageData(pageModule, middlewareContext);
|
|
475
591
|
const pageContext = {
|
|
476
|
-
...
|
|
477
|
-
data: pageData
|
|
592
|
+
...middlewareContext,
|
|
593
|
+
data: mergeRouteData(middlewareContext.data, pageData)
|
|
478
594
|
};
|
|
479
595
|
activeContext = pageContext;
|
|
480
596
|
const pageNode = await pageModule.default(pageContext);
|
|
@@ -518,19 +634,34 @@ if (!pagesDir) {
|
|
|
518
634
|
throw new Error("Missing WEBFRAMEZ_REACT_PAGES_DIR");
|
|
519
635
|
}
|
|
520
636
|
|
|
521
|
-
const
|
|
637
|
+
const rootRequire = Module.createRequire(path.join(process.cwd(), "__webframez_react_worker__.js"));
|
|
522
638
|
const originalResolveFilename = Module._resolveFilename;
|
|
523
639
|
const forcedResolutions = new Map([
|
|
524
|
-
["
|
|
525
|
-
["
|
|
526
|
-
["react
|
|
527
|
-
["react-
|
|
640
|
+
["@webtypen/webframez-core", rootRequire.resolve("@webtypen/webframez-core")],
|
|
641
|
+
["@webtypen/webframez-react", rootRequire.resolve("@webtypen/webframez-react")],
|
|
642
|
+
["react", rootRequire.resolve("react")],
|
|
643
|
+
["react/jsx-runtime", rootRequire.resolve("react/jsx-runtime")],
|
|
644
|
+
["react/jsx-dev-runtime", rootRequire.resolve("react/jsx-dev-runtime")],
|
|
645
|
+
["react-dom", rootRequire.resolve("react-dom")],
|
|
646
|
+
["react-dom/client", rootRequire.resolve("react-dom/client")],
|
|
647
|
+
["react-dom/server", rootRequire.resolve("react-dom/server")],
|
|
648
|
+
["react-dom/server.node", rootRequire.resolve("react-dom/server.node")],
|
|
649
|
+
["react-server-dom-webpack", rootRequire.resolve("react-server-dom-webpack")],
|
|
650
|
+
["react-server-dom-webpack/server", rootRequire.resolve("react-server-dom-webpack/server")],
|
|
651
|
+
["react-server-dom-webpack/client", rootRequire.resolve("react-server-dom-webpack/client")],
|
|
652
|
+
["react-server-dom-webpack/client.node", rootRequire.resolve("react-server-dom-webpack/client.node")],
|
|
653
|
+
["scheduler", rootRequire.resolve("scheduler")]
|
|
528
654
|
]);
|
|
529
655
|
|
|
530
656
|
Module._resolveFilename = function(request, parent, isMain, options) {
|
|
531
657
|
if (forcedResolutions.has(request)) {
|
|
532
658
|
return forcedResolutions.get(request);
|
|
533
659
|
}
|
|
660
|
+
for (const forcedRequest of forcedResolutions.keys()) {
|
|
661
|
+
if (request.startsWith(forcedRequest + "/")) {
|
|
662
|
+
return rootRequire.resolve(request);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
534
665
|
return originalResolveFilename.call(this, request, parent, isMain, options);
|
|
535
666
|
};
|
|
536
667
|
|
package/dist/index.cjs
CHANGED
|
@@ -202,6 +202,7 @@ function createRSCHandler(options) {
|
|
|
202
202
|
|
|
203
203
|
// src/file-router.tsx
|
|
204
204
|
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
205
|
+
var import_node_module2 = __toESM(require("node:module"), 1);
|
|
205
206
|
var import_node_path2 = __toESM(require("node:path"), 1);
|
|
206
207
|
|
|
207
208
|
// src/router-runtime.tsx
|
|
@@ -264,6 +265,26 @@ function injectRouteChildren(node, routeChildren) {
|
|
|
264
265
|
|
|
265
266
|
// src/file-router.tsx
|
|
266
267
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
268
|
+
var ROOT_RUNTIME_REQUIRE = import_node_module2.default.createRequire(
|
|
269
|
+
import_node_path2.default.join(process.cwd(), "__webframez_react_runtime__.js")
|
|
270
|
+
);
|
|
271
|
+
var FORCED_PACKAGE_REQUESTS = [
|
|
272
|
+
"@webtypen/webframez-core",
|
|
273
|
+
"@webtypen/webframez-react",
|
|
274
|
+
"react",
|
|
275
|
+
"react/jsx-runtime",
|
|
276
|
+
"react/jsx-dev-runtime",
|
|
277
|
+
"react-dom",
|
|
278
|
+
"react-dom/client",
|
|
279
|
+
"react-dom/server",
|
|
280
|
+
"react-dom/server.node",
|
|
281
|
+
"react-server-dom-webpack",
|
|
282
|
+
"react-server-dom-webpack/server",
|
|
283
|
+
"react-server-dom-webpack/client",
|
|
284
|
+
"react-server-dom-webpack/client.node",
|
|
285
|
+
"scheduler"
|
|
286
|
+
];
|
|
287
|
+
var forcedPackageResolutionInstalled = false;
|
|
267
288
|
function normalizePathname(pathname) {
|
|
268
289
|
const trimmed = pathname.replace(/\/+$/, "") || "/";
|
|
269
290
|
return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
@@ -312,6 +333,28 @@ var MANAGED_HEAD_ATTR = "data-webframez-head";
|
|
|
312
333
|
function createManagedAttributes() {
|
|
313
334
|
return `${MANAGED_HEAD_ATTR}="true"`;
|
|
314
335
|
}
|
|
336
|
+
function shouldForcePackageResolution(request) {
|
|
337
|
+
return FORCED_PACKAGE_REQUESTS.some(
|
|
338
|
+
(candidate) => request === candidate || request.startsWith(`${candidate}/`)
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
function installForcedPackageResolution() {
|
|
342
|
+
if (forcedPackageResolutionInstalled) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const moduleWithPrivateResolver = import_node_module2.default;
|
|
346
|
+
const originalResolveFilename = moduleWithPrivateResolver._resolveFilename;
|
|
347
|
+
moduleWithPrivateResolver._resolveFilename = function patchedResolveFilename(request, parent, isMain, options) {
|
|
348
|
+
if (typeof request === "string" && shouldForcePackageResolution(request)) {
|
|
349
|
+
try {
|
|
350
|
+
return ROOT_RUNTIME_REQUIRE.resolve(request);
|
|
351
|
+
} catch {
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return originalResolveFilename.call(this, request, parent, isMain, options);
|
|
355
|
+
};
|
|
356
|
+
forcedPackageResolutionInstalled = true;
|
|
357
|
+
}
|
|
315
358
|
function toRouteEntry(pagesDir, filePath) {
|
|
316
359
|
const normalized = filePath.replace(/\\/g, "/");
|
|
317
360
|
if (!normalized.endsWith("/index.js")) {
|
|
@@ -459,9 +502,11 @@ function isRouteAbort(value) {
|
|
|
459
502
|
}
|
|
460
503
|
}
|
|
461
504
|
function createFileRouter(options) {
|
|
505
|
+
installForcedPackageResolution();
|
|
462
506
|
const pagesDir = options.pagesDir;
|
|
463
507
|
const layoutPath = import_node_path2.default.join(pagesDir, "layout.js");
|
|
464
508
|
const errorPath = import_node_path2.default.join(pagesDir, "errors.js");
|
|
509
|
+
const middlewaresPath = import_node_path2.default.join(pagesDir, "middlewares.js");
|
|
465
510
|
function buildRouteEntries() {
|
|
466
511
|
const files = walkFiles(pagesDir);
|
|
467
512
|
return files.map((filePath) => toRouteEntry(pagesDir, filePath)).filter((entry) => entry !== null).sort((a, b) => {
|
|
@@ -504,6 +549,75 @@ function createFileRouter(options) {
|
|
|
504
549
|
head: mergeHead(layoutHead, errorHead)
|
|
505
550
|
};
|
|
506
551
|
}
|
|
552
|
+
function normalizeMiddlewareNames(config) {
|
|
553
|
+
if (!config) {
|
|
554
|
+
return [];
|
|
555
|
+
}
|
|
556
|
+
return Array.isArray(config) ? config : [config];
|
|
557
|
+
}
|
|
558
|
+
function isPlainObject(value) {
|
|
559
|
+
if (!value || typeof value !== "object") {
|
|
560
|
+
return false;
|
|
561
|
+
}
|
|
562
|
+
const prototype = Object.getPrototypeOf(value);
|
|
563
|
+
return prototype === Object.prototype || prototype === null;
|
|
564
|
+
}
|
|
565
|
+
function mergeRouteData(currentData, nextData) {
|
|
566
|
+
if (typeof nextData === "undefined") {
|
|
567
|
+
return currentData;
|
|
568
|
+
}
|
|
569
|
+
if (isPlainObject(currentData) && isPlainObject(nextData)) {
|
|
570
|
+
return {
|
|
571
|
+
...currentData,
|
|
572
|
+
...nextData
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
return nextData;
|
|
576
|
+
}
|
|
577
|
+
async function resolveMiddlewares(config, context) {
|
|
578
|
+
const middlewareNames = normalizeMiddlewareNames(config);
|
|
579
|
+
const requiresNamedMiddleware = middlewareNames.length > 0;
|
|
580
|
+
if (!import_node_fs.default.existsSync(middlewaresPath)) {
|
|
581
|
+
if (!requiresNamedMiddleware) {
|
|
582
|
+
return context;
|
|
583
|
+
}
|
|
584
|
+
throw createAbort({
|
|
585
|
+
status: 500,
|
|
586
|
+
message: `Invalid middleware '${middlewareNames[0]}'`
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
const middlewareModule = resolveModule(middlewaresPath);
|
|
590
|
+
const registry = middlewareModule.middlewares;
|
|
591
|
+
if (!registry) {
|
|
592
|
+
if (!requiresNamedMiddleware) {
|
|
593
|
+
return context;
|
|
594
|
+
}
|
|
595
|
+
throw createAbort({
|
|
596
|
+
status: 500,
|
|
597
|
+
message: `Invalid middleware '${middlewareNames[0]}'`
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
const orderedMiddlewareNames = typeof registry["*"] === "function" ? ["*", ...middlewareNames] : middlewareNames;
|
|
601
|
+
if (orderedMiddlewareNames.length === 0) {
|
|
602
|
+
return context;
|
|
603
|
+
}
|
|
604
|
+
let nextContext = context;
|
|
605
|
+
for (const middlewareName of orderedMiddlewareNames) {
|
|
606
|
+
const middleware = registry[middlewareName];
|
|
607
|
+
if (typeof middleware !== "function") {
|
|
608
|
+
throw createAbort({
|
|
609
|
+
status: 500,
|
|
610
|
+
message: `Invalid middleware '${middlewareName}'`
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
const middlewareData = await middleware(nextContext);
|
|
614
|
+
nextContext = {
|
|
615
|
+
...nextContext,
|
|
616
|
+
data: mergeRouteData(nextContext.data, middlewareData)
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
return nextContext;
|
|
620
|
+
}
|
|
507
621
|
async function resolve(input) {
|
|
508
622
|
const pathname = normalizePathname(input.pathname);
|
|
509
623
|
const contextBase = {
|
|
@@ -529,10 +643,12 @@ function createFileRouter(options) {
|
|
|
529
643
|
activeContext = context;
|
|
530
644
|
const pageModule = resolveModule(match.entry.filePath);
|
|
531
645
|
const layoutModule = import_node_fs.default.existsSync(layoutPath) ? resolveModule(layoutPath) : null;
|
|
532
|
-
const
|
|
646
|
+
const middlewareContext = await resolveMiddlewares(pageModule.middlewares, context);
|
|
647
|
+
activeContext = middlewareContext;
|
|
648
|
+
const pageData = await resolvePageData(pageModule, middlewareContext);
|
|
533
649
|
const pageContext = {
|
|
534
|
-
...
|
|
535
|
-
data: pageData
|
|
650
|
+
...middlewareContext,
|
|
651
|
+
data: mergeRouteData(middlewareContext.data, pageData)
|
|
536
652
|
};
|
|
537
653
|
activeContext = pageContext;
|
|
538
654
|
const pageNode = await pageModule.default(pageContext);
|
|
@@ -580,19 +696,34 @@ if (!pagesDir) {
|
|
|
580
696
|
throw new Error("Missing WEBFRAMEZ_REACT_PAGES_DIR");
|
|
581
697
|
}
|
|
582
698
|
|
|
583
|
-
const
|
|
699
|
+
const rootRequire = Module.createRequire(path.join(process.cwd(), "__webframez_react_worker__.js"));
|
|
584
700
|
const originalResolveFilename = Module._resolveFilename;
|
|
585
701
|
const forcedResolutions = new Map([
|
|
586
|
-
["
|
|
587
|
-
["
|
|
588
|
-
["react
|
|
589
|
-
["react-
|
|
702
|
+
["@webtypen/webframez-core", rootRequire.resolve("@webtypen/webframez-core")],
|
|
703
|
+
["@webtypen/webframez-react", rootRequire.resolve("@webtypen/webframez-react")],
|
|
704
|
+
["react", rootRequire.resolve("react")],
|
|
705
|
+
["react/jsx-runtime", rootRequire.resolve("react/jsx-runtime")],
|
|
706
|
+
["react/jsx-dev-runtime", rootRequire.resolve("react/jsx-dev-runtime")],
|
|
707
|
+
["react-dom", rootRequire.resolve("react-dom")],
|
|
708
|
+
["react-dom/client", rootRequire.resolve("react-dom/client")],
|
|
709
|
+
["react-dom/server", rootRequire.resolve("react-dom/server")],
|
|
710
|
+
["react-dom/server.node", rootRequire.resolve("react-dom/server.node")],
|
|
711
|
+
["react-server-dom-webpack", rootRequire.resolve("react-server-dom-webpack")],
|
|
712
|
+
["react-server-dom-webpack/server", rootRequire.resolve("react-server-dom-webpack/server")],
|
|
713
|
+
["react-server-dom-webpack/client", rootRequire.resolve("react-server-dom-webpack/client")],
|
|
714
|
+
["react-server-dom-webpack/client.node", rootRequire.resolve("react-server-dom-webpack/client.node")],
|
|
715
|
+
["scheduler", rootRequire.resolve("scheduler")]
|
|
590
716
|
]);
|
|
591
717
|
|
|
592
718
|
Module._resolveFilename = function(request, parent, isMain, options) {
|
|
593
719
|
if (forcedResolutions.has(request)) {
|
|
594
720
|
return forcedResolutions.get(request);
|
|
595
721
|
}
|
|
722
|
+
for (const forcedRequest of forcedResolutions.keys()) {
|
|
723
|
+
if (request.startsWith(forcedRequest + "/")) {
|
|
724
|
+
return rootRequire.resolve(request);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
596
727
|
return originalResolveFilename.call(this, request, parent, isMain, options);
|
|
597
728
|
};
|
|
598
729
|
|