@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 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 pageData = await resolvePageData(pageModule, context);
613
+ const middlewareContext = await resolveMiddlewares(pageModule.middlewares, context);
614
+ activeContext = middlewareContext;
615
+ const pageData = await resolvePageData(pageModule, middlewareContext);
500
616
  const pageContext = {
501
- ...context,
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 appRequire = Module.createRequire(path.join(pagesDir, "__webframez_react_worker__.js"));
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
- ["react", appRequire.resolve("react")],
550
- ["react/jsx-runtime", appRequire.resolve("react/jsx-runtime")],
551
- ["react/jsx-dev-runtime", appRequire.resolve("react/jsx-dev-runtime")],
552
- ["react-dom/client", appRequire.resolve("react-dom/client")]
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 pageData = await resolvePageData(pageModule, context);
588
+ const middlewareContext = await resolveMiddlewares(pageModule.middlewares, context);
589
+ activeContext = middlewareContext;
590
+ const pageData = await resolvePageData(pageModule, middlewareContext);
475
591
  const pageContext = {
476
- ...context,
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 appRequire = Module.createRequire(path.join(pagesDir, "__webframez_react_worker__.js"));
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
- ["react", appRequire.resolve("react")],
525
- ["react/jsx-runtime", appRequire.resolve("react/jsx-runtime")],
526
- ["react/jsx-dev-runtime", appRequire.resolve("react/jsx-dev-runtime")],
527
- ["react-dom/client", appRequire.resolve("react-dom/client")]
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 pageData = await resolvePageData(pageModule, context);
646
+ const middlewareContext = await resolveMiddlewares(pageModule.middlewares, context);
647
+ activeContext = middlewareContext;
648
+ const pageData = await resolvePageData(pageModule, middlewareContext);
533
649
  const pageContext = {
534
- ...context,
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 appRequire = Module.createRequire(path.join(pagesDir, "__webframez_react_worker__.js"));
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
- ["react", appRequire.resolve("react")],
587
- ["react/jsx-runtime", appRequire.resolve("react/jsx-runtime")],
588
- ["react/jsx-dev-runtime", appRequire.resolve("react/jsx-dev-runtime")],
589
- ["react-dom/client", appRequire.resolve("react-dom/client")]
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