@lolyjs/core 0.2.0-alpha.19 → 0.2.0-alpha.20

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/cli.cjs CHANGED
@@ -10052,7 +10052,30 @@ function loadLayoutServerHook(layoutFile) {
10052
10052
  try {
10053
10053
  const mod = require(file);
10054
10054
  const serverHook = typeof mod?.getServerSideProps === "function" ? mod.getServerSideProps : null;
10055
- return serverHook;
10055
+ let middlewares = [];
10056
+ const rawMiddlewares = mod?.[NAMING.BEFORE_MIDDLEWARES];
10057
+ if (rawMiddlewares !== void 0) {
10058
+ if (!Array.isArray(rawMiddlewares)) {
10059
+ console.warn(
10060
+ `[framework][server-hook] ${NAMING.BEFORE_MIDDLEWARES} must be an array in ${file}, ignoring invalid value`
10061
+ );
10062
+ } else {
10063
+ for (let i = 0; i < rawMiddlewares.length; i++) {
10064
+ const mw = rawMiddlewares[i];
10065
+ if (typeof mw !== "function") {
10066
+ console.warn(
10067
+ `[framework][server-hook] Middleware at index ${i} in ${NAMING.BEFORE_MIDDLEWARES} is not a function in ${file}, skipping`
10068
+ );
10069
+ continue;
10070
+ }
10071
+ middlewares.push(mw);
10072
+ }
10073
+ }
10074
+ }
10075
+ return {
10076
+ serverHook,
10077
+ middlewares
10078
+ };
10056
10079
  } catch (error) {
10057
10080
  console.error(
10058
10081
  `[framework][server-hook] Error loading layout server hook from ${file}:`,
@@ -10137,9 +10160,16 @@ function loadRoutes(appDir) {
10137
10160
  appDir
10138
10161
  );
10139
10162
  const layoutServerHooks = [];
10163
+ const layoutMiddlewares = [];
10140
10164
  for (const layoutFile of layoutFiles) {
10141
- const layoutServerHook = loadLayoutServerHook(layoutFile);
10142
- layoutServerHooks.push(layoutServerHook);
10165
+ const layoutHookData = loadLayoutServerHook(layoutFile);
10166
+ if (layoutHookData) {
10167
+ layoutServerHooks.push(layoutHookData.serverHook);
10168
+ layoutMiddlewares.push(layoutHookData.middlewares);
10169
+ } else {
10170
+ layoutServerHooks.push(null);
10171
+ layoutMiddlewares.push([]);
10172
+ }
10143
10173
  }
10144
10174
  const { middlewares, serverHook, dynamic, generateStaticParams } = loadServerHookForDir(currentDir);
10145
10175
  routes.push({
@@ -10155,6 +10185,8 @@ function loadRoutes(appDir) {
10155
10185
  // Keep 'loader' field name for backward compatibility
10156
10186
  layoutServerHooks,
10157
10187
  // Server hooks for each layout (same order as layouts)
10188
+ layoutMiddlewares,
10189
+ // Middlewares for each layout (same order as layouts)
10158
10190
  dynamic,
10159
10191
  generateStaticParams
10160
10192
  });
@@ -10718,9 +10750,16 @@ function loadRoutesFromManifest(projectRoot) {
10718
10750
  );
10719
10751
  const pageDir = import_path9.default.dirname(pageFile);
10720
10752
  const layoutServerHooks = [];
10753
+ const layoutMiddlewares = [];
10721
10754
  for (const layoutFile of layoutFiles) {
10722
- const layoutServerHook = loadLayoutServerHook(layoutFile);
10723
- layoutServerHooks.push(layoutServerHook);
10755
+ const layoutHookData = loadLayoutServerHook(layoutFile);
10756
+ if (layoutHookData) {
10757
+ layoutServerHooks.push(layoutHookData.serverHook);
10758
+ layoutMiddlewares.push(layoutHookData.middlewares);
10759
+ } else {
10760
+ layoutServerHooks.push(null);
10761
+ layoutMiddlewares.push([]);
10762
+ }
10724
10763
  }
10725
10764
  const { middlewares, serverHook, dynamic, generateStaticParams } = loadServerHookForDir(pageDir);
10726
10765
  pageRoutes.push({
@@ -10736,6 +10775,8 @@ function loadRoutesFromManifest(projectRoot) {
10736
10775
  // Keep 'loader' field name for backward compatibility
10737
10776
  layoutServerHooks,
10738
10777
  // Server hooks for each layout (same order as layouts)
10778
+ layoutMiddlewares,
10779
+ // Middlewares for each layout (same order as layouts)
10739
10780
  dynamic: entry.dynamic ?? dynamic,
10740
10781
  generateStaticParams
10741
10782
  });
@@ -11264,9 +11305,16 @@ function loadNotFoundRouteFromFilesystem(appDir) {
11264
11305
  appDir
11265
11306
  );
11266
11307
  const layoutServerHooks = [];
11308
+ const layoutMiddlewares = [];
11267
11309
  for (const layoutFile of layoutFiles) {
11268
- const layoutServerHook = loadLayoutServerHook(layoutFile);
11269
- layoutServerHooks.push(layoutServerHook);
11310
+ const layoutHookData = loadLayoutServerHook(layoutFile);
11311
+ if (layoutHookData) {
11312
+ layoutServerHooks.push(layoutHookData.serverHook);
11313
+ layoutMiddlewares.push(layoutHookData.middlewares);
11314
+ } else {
11315
+ layoutServerHooks.push(null);
11316
+ layoutMiddlewares.push([]);
11317
+ }
11270
11318
  }
11271
11319
  const { middlewares, serverHook, dynamic, generateStaticParams } = loadServerHookForDir(notFoundDir);
11272
11320
  return {
@@ -11282,6 +11330,8 @@ function loadNotFoundRouteFromFilesystem(appDir) {
11282
11330
  // Keep 'loader' field name for backward compatibility
11283
11331
  layoutServerHooks,
11284
11332
  // Server hooks for each layout (same order as layouts)
11333
+ layoutMiddlewares,
11334
+ // Middlewares for each layout (same order as layouts)
11285
11335
  dynamic,
11286
11336
  generateStaticParams
11287
11337
  };
@@ -11313,9 +11363,16 @@ function loadErrorRouteFromFilesystem(appDir) {
11313
11363
  appDir
11314
11364
  );
11315
11365
  const layoutServerHooks = [];
11366
+ const layoutMiddlewares = [];
11316
11367
  for (const layoutFile of layoutFiles) {
11317
- const layoutServerHook = loadLayoutServerHook(layoutFile);
11318
- layoutServerHooks.push(layoutServerHook);
11368
+ const layoutHookData = loadLayoutServerHook(layoutFile);
11369
+ if (layoutHookData) {
11370
+ layoutServerHooks.push(layoutHookData.serverHook);
11371
+ layoutMiddlewares.push(layoutHookData.middlewares);
11372
+ } else {
11373
+ layoutServerHooks.push(null);
11374
+ layoutMiddlewares.push([]);
11375
+ }
11319
11376
  }
11320
11377
  const { middlewares, serverHook, dynamic, generateStaticParams } = loadServerHookForDir(appDir);
11321
11378
  return {
@@ -11331,6 +11388,8 @@ function loadErrorRouteFromFilesystem(appDir) {
11331
11388
  // Keep 'loader' field name for backward compatibility
11332
11389
  layoutServerHooks,
11333
11390
  // Server hooks for each layout (same order as layouts)
11391
+ layoutMiddlewares,
11392
+ // Middlewares for each layout (same order as layouts)
11334
11393
  dynamic,
11335
11394
  generateStaticParams
11336
11395
  };
@@ -12800,6 +12859,29 @@ async function handlePageRequestInternal(options) {
12800
12859
  if (!skipLayoutHooks && notFoundPage.layoutServerHooks && notFoundPage.layoutServerHooks.length > 0) {
12801
12860
  for (let i = 0; i < notFoundPage.layoutServerHooks.length; i++) {
12802
12861
  const layoutServerHook = notFoundPage.layoutServerHooks[i];
12862
+ const layoutMiddlewares = notFoundPage.layoutMiddlewares?.[i] || [];
12863
+ if (layoutMiddlewares.length > 0) {
12864
+ for (const mw of layoutMiddlewares) {
12865
+ try {
12866
+ await Promise.resolve(
12867
+ mw(ctx2, async () => {
12868
+ })
12869
+ );
12870
+ } catch (error) {
12871
+ const reqLogger2 = getRequestLogger(req);
12872
+ const layoutFile = notFoundPage.layoutFiles[i];
12873
+ const relativeLayoutPath = layoutFile ? import_path19.default.relative(projectRoot || process.cwd(), layoutFile) : "unknown";
12874
+ reqLogger2.error("Layout middleware failed for not-found page", error instanceof Error ? error : new Error(String(error)), {
12875
+ layoutIndex: i,
12876
+ layoutFile: relativeLayoutPath
12877
+ });
12878
+ throw error;
12879
+ }
12880
+ if (ctx2.res.headersSent) {
12881
+ return;
12882
+ }
12883
+ }
12884
+ }
12803
12885
  if (layoutServerHook) {
12804
12886
  try {
12805
12887
  const layoutResult = await layoutServerHook(ctx2);
@@ -12917,6 +12999,29 @@ async function handlePageRequestInternal(options) {
12917
12999
  if (!skipLayoutHooks && route.layoutServerHooks && route.layoutServerHooks.length > 0) {
12918
13000
  for (let i = 0; i < route.layoutServerHooks.length; i++) {
12919
13001
  const layoutServerHook = route.layoutServerHooks[i];
13002
+ const layoutMiddlewares = route.layoutMiddlewares?.[i] || [];
13003
+ if (layoutMiddlewares.length > 0) {
13004
+ for (const mw of layoutMiddlewares) {
13005
+ try {
13006
+ await Promise.resolve(
13007
+ mw(ctx, async () => {
13008
+ })
13009
+ );
13010
+ } catch (error) {
13011
+ const layoutFile = route.layoutFiles[i];
13012
+ const relativeLayoutPath = layoutFile ? import_path19.default.relative(projectRoot || process.cwd(), layoutFile) : "unknown";
13013
+ reqLogger.error("Layout middleware failed", error instanceof Error ? error : new Error(String(error)), {
13014
+ route: route.pattern,
13015
+ layoutIndex: i,
13016
+ layoutFile: relativeLayoutPath
13017
+ });
13018
+ throw error;
13019
+ }
13020
+ if (ctx.res.headersSent) {
13021
+ return;
13022
+ }
13023
+ }
13024
+ }
12920
13025
  if (layoutServerHook) {
12921
13026
  try {
12922
13027
  const layoutResult = await layoutServerHook(ctx);
@@ -13112,6 +13217,28 @@ async function renderErrorPageWithStream(errorPage, req, res, error, routeChunks
13112
13217
  if (!skipLayoutHooks && errorPage.layoutServerHooks && errorPage.layoutServerHooks.length > 0) {
13113
13218
  for (let i = 0; i < errorPage.layoutServerHooks.length; i++) {
13114
13219
  const layoutServerHook = errorPage.layoutServerHooks[i];
13220
+ const layoutMiddlewares = errorPage.layoutMiddlewares?.[i] || [];
13221
+ if (layoutMiddlewares.length > 0) {
13222
+ for (const mw of layoutMiddlewares) {
13223
+ try {
13224
+ await Promise.resolve(
13225
+ mw(ctx, async () => {
13226
+ })
13227
+ );
13228
+ } catch (error2) {
13229
+ const layoutFile = errorPage.layoutFiles[i];
13230
+ const relativeLayoutPath = layoutFile ? import_path19.default.relative(projectRoot || process.cwd(), layoutFile) : "unknown";
13231
+ reqLogger.error("Layout middleware failed for error page", error2 instanceof Error ? error2 : new Error(String(error2)), {
13232
+ layoutIndex: i,
13233
+ layoutFile: relativeLayoutPath
13234
+ });
13235
+ throw error2;
13236
+ }
13237
+ if (ctx.res.headersSent) {
13238
+ return;
13239
+ }
13240
+ }
13241
+ }
13115
13242
  if (layoutServerHook) {
13116
13243
  try {
13117
13244
  const layoutResult = await layoutServerHook(ctx);