@farm.js/plugin 0.1.0-beta.107 → 0.1.0-beta.108

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAgBlD,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,CA6hBpE;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAiBlD,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,CA0hBpE;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/api/index.js CHANGED
@@ -23,7 +23,7 @@
23
23
  */
24
24
  import { _withAfterNodeMiddleware } from "@farm.js/core/after";
25
25
  import { _runWithAPIRequestRuntime, createFarmRequestBodyErrorResponse, readNodeRequestBody, resolveFarmServerConfig, } from "@farm.js/core/internal/production-runtime";
26
- import { getAllowedAPIRouteMethods, invokeAPIRouteEndpoint, matchAPIRouteAtBasePath, resolveAPIRouteEndpoint, } from "@farm.js/core/api/runtime";
26
+ import { API_ROUTE_METHODS, getAllowedAPIRouteMethods, invokeAPIRouteEndpoint, matchAPIRouteAtBasePath, resolveAPIRouteEndpoint, } from "@farm.js/core/api/runtime";
27
27
  import { sendWebResponse } from "@farm.js/core/server";
28
28
  /**
29
29
  * Farm.js API Routes Plugin
@@ -204,10 +204,9 @@ export default function farmApi(options = {}) {
204
204
  const relativePath = path.relative(apiDir, path.dirname(filePath));
205
205
  const routePath = "/api/" + (relativePath === "." ? "" : relativePath.replace(/\\/g, "/"));
206
206
  const routeModule = await server.ssrLoadModule(filePath);
207
- const methods = ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"];
208
207
  const endpoints = {};
209
208
  const availableMethods = [];
210
- for (const method of methods) {
209
+ for (const method of API_ROUTE_METHODS) {
211
210
  if (routeModule[method]) {
212
211
  availableMethods.push(method);
213
212
  endpoints[method] = routeModule[method];
@@ -440,10 +439,9 @@ export default function farmApi(options = {}) {
440
439
  try {
441
440
  // Reload the module
442
441
  const routeModule = await server.ssrLoadModule(file);
443
- const methods = ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"];
444
442
  const endpoints = {};
445
443
  const availableMethods = [];
446
- for (const method of methods) {
444
+ for (const method of API_ROUTE_METHODS) {
447
445
  if (routeModule[method]) {
448
446
  availableMethods.push(method);
449
447
  endpoints[method] = routeModule[method];
@@ -474,10 +472,9 @@ export default function farmApi(options = {}) {
474
472
  const relativePath = path.relative(apiDir, path.dirname(file));
475
473
  const routePath = "/api/" + (relativePath === "." ? "" : relativePath.replace(/\\/g, "/"));
476
474
  const routeModule = await server.ssrLoadModule(file);
477
- const methods = ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"];
478
475
  const endpoints = {};
479
476
  const availableMethods = [];
480
- for (const method of methods) {
477
+ for (const method of API_ROUTE_METHODS) {
481
478
  if (routeModule[method]) {
482
479
  availableMethods.push(method);
483
480
  endpoints[method] = routeModule[method];
package/dist/index.d.ts CHANGED
@@ -39,5 +39,5 @@
39
39
  * })
40
40
  * ```
41
41
  */
42
- export declare const version = "0.1.0-beta.107";
42
+ export declare const version = "0.1.0-beta.108";
43
43
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -39,7 +39,7 @@
39
39
  * })
40
40
  * ```
41
41
  */
42
- export const version = "0.1.0-beta.107";
42
+ export const version = "0.1.0-beta.108";
43
43
  // Note: Import plugins from their respective subpaths:
44
44
  // - @farm.js/plugin/rsc
45
45
  // - @farm.js/plugin/middleware
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"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"}
@@ -301,7 +301,10 @@ export function observabilityPlugin(options = {}) {
301
301
  console.log("[obs] ready");
302
302
  },
303
303
  beforeRequest(req) {
304
- const pathname = req.url || "/";
304
+ // `req.url` carries the query string, and a pathname feeds incident
305
+ // titles and dedupe fingerprints: a reset `?token=` would reach every
306
+ // pipeline action, and each distinct query would open a new incident.
307
+ const pathname = (req.url || "/").split("?", 1)[0] || "/";
305
308
  const method = req.method || "GET";
306
309
  const requestId = `req_${now()}_${(signalCounter++).toString(36)}`;
307
310
  requestStarts.set(req, {
@@ -342,8 +345,10 @@ export function observabilityPlugin(options = {}) {
342
345
  if (!annotateHtml)
343
346
  return html;
344
347
  const marker = `<!-- observability:path=${render.pathname} route=${render.routePattern ?? "unmatched"} -->`;
348
+ // A replacer function: as a replacement string, $` and $' in the request
349
+ // path would expand into copies of the page's own HTML.
345
350
  return html.includes("</body>")
346
- ? html.replace("</body>", `${marker}\n</body>`)
351
+ ? html.replace("</body>", () => `${marker}\n</body>`)
347
352
  : `${html}\n${marker}`;
348
353
  },
349
354
  async onError(error) {
@@ -1 +1 @@
1
- {"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../../src/rsc/entries/rsc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAk8B1D"}
1
+ {"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../../src/rsc/entries/rsc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CA09B1D"}
@@ -23,9 +23,14 @@ export function generateRscEntry(ctx) {
23
23
  return { ...root, sourceGlob };
24
24
  });
25
25
  const debugLog = `// Debug disabled`;
26
+ const middlewareConfigImports = (ctx.middlewareConfigPaths ?? [])
27
+ .map((configPath, index) => `import * as FarmMiddlewareConfigModule${index} from ${JSON.stringify(configPath.replace(/\\/g, "/"))};`)
28
+ .join("\n");
29
+ const middlewareConfigValues = (ctx.middlewareConfigPaths ?? []).map((_configPath, index) => `(FarmMiddlewareConfigModule${index}.default || FarmMiddlewareConfigModule${index})`);
26
30
  let code = `
27
31
  import React from 'react';
28
32
  import ServerErrorFallback from '/.farm/rsc-entries/error-fallback.tsx';
33
+ ${middlewareConfigImports}
29
34
  import { registerAPIRouteShape } from '@farm.js/core/api/runtime';
30
35
  import {
31
36
  renderToReadableStream,
@@ -289,12 +294,21 @@ async function handleAPIRequest(request) {
289
294
  });
290
295
  }
291
296
  }
297
+ const farmRuntimeConfigs = [${middlewareConfigValues.join(", ")}].filter(Boolean);
298
+ const farmConfigMiddleware = farmRuntimeConfigs.flatMap((config) => {
299
+ const middleware = config.middleware;
300
+ if (!middleware) return [];
301
+ return Array.isArray(middleware) ? middleware : [middleware];
302
+ });
292
303
  const farmMiddlewareRunner = createProductionMiddlewareRunner({
304
+ config: farmConfigMiddleware,
293
305
  modules: Object.entries(middlewares).map(([filePath, module]) => ({
294
306
  path: middlewarePathToRoute(filePath),
295
307
  filePath,
296
308
  module,
297
309
  })),
310
+ i18n: ${JSON.stringify(ctx.i18n) ?? "undefined"},
311
+ server: ${JSON.stringify(ctx.server) ?? "undefined"},
298
312
  });
299
313
 
300
314
  debug('Discovered pages:', Object.keys(pages));
@@ -319,8 +333,10 @@ function middlewarePathToRoute(filePath) {
319
333
  /**
320
334
  * Execute middleware chain for a request
321
335
  */
322
- async function executeMiddleware(request) {
323
- return farmMiddlewareRunner(request);
336
+ async function executeMiddleware(request, context) {
337
+ // The Request was rebuilt by the Nitro handler and has no socket; the
338
+ // handler passes the connection's address alongside it.
339
+ return farmMiddlewareRunner(request, { clientAddress: context?.clientAddress });
324
340
  }
325
341
 
326
342
  /**
@@ -455,7 +471,7 @@ function getMatchingBoundary(pageFilePath, modules, kind) {
455
471
  * Main request handler - entry point for both dev and production (Nitro).
456
472
  * Exported as { fetch: handler } for the RSC/Nitro contract (see vite-plugin-rsc-deploy-example).
457
473
  */
458
- async function handleFarmRequest(request) {
474
+ async function handleFarmRequest(request, context) {
459
475
  let url = new URL(request.url);
460
476
  let matchedPage = null;
461
477
  let errorData = new Map();
@@ -493,7 +509,7 @@ async function handleFarmRequest(request) {
493
509
  : ""}
494
510
 
495
511
  // Execute middleware first
496
- const middlewareResult = await executeMiddleware(request);
512
+ const middlewareResult = await executeMiddleware(request, context);
497
513
 
498
514
  // If middleware handled the request (e.g., redirect, auth), return the response
499
515
  if (middlewareResult.response) {
@@ -935,7 +951,7 @@ async function handler(request, context) {
935
951
  dispatch: async (localRequest) =>
936
952
  (await handleAPIRequest(localRequest)) ?? Response.json({ error: 'Not Found' }, { status: 404 }),
937
953
  }, () => _runWithCurrentRequest(request, () =>
938
- _runWithAfterRequest(request, () => handleFarmRequest(request), context)
954
+ _runWithAfterRequest(request, () => handleFarmRequest(request, context), context)
939
955
  ));
940
956
  }
941
957
 
@@ -25,6 +25,7 @@ import { type Plugin, type UserConfig } from "vite";
25
25
  import type { FarmRscPluginOptions, EntryContext } from "./types.js";
26
26
  import type { FarmServerActionsConfig } from "@farm.js/core/server-action-security";
27
27
  import type { FarmAPIConfig } from "@farm.js/core/api";
28
+ import type { FarmMiddlewareConfig } from "@farm.js/core/middleware";
28
29
  import type { FarmServerConfig } from "@farm.js/core/internal/production-runtime";
29
30
  import type { FarmLayerEntry, ResolvedFarmLayer } from "@farm.js/core/server";
30
31
  export type { FarmRscPluginOptions, EntryContext };
@@ -40,6 +41,7 @@ export interface FarmRscConfig {
40
41
  basePath?: string;
41
42
  api?: FarmAPIConfig;
42
43
  server?: FarmServerConfig;
44
+ middleware?: FarmMiddlewareConfig;
43
45
  port?: number;
44
46
  experimental?: {
45
47
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rsc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,UAAU,EAChB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAwD9E,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAExF,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE;QACb;;;WAGG;QACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B;;;WAGG;QACH,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB;;;;;;;WAOG;QACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,gHAAgH;IAChH,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,aAAkB,GAAG,UAAU,CAuDnE;AA8TD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,EAAE,CAsvC5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rsc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,UAAU,EAChB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA2D9E,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAExF,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE;QACb;;;WAGG;QACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B;;;WAGG;QACH,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB;;;;;;;WAOG;QACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,gHAAgH;IAChH,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,aAAkB,GAAG,UAAU,CAuDnE;AAuXD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,EAAE,CA8yC5E"}
package/dist/rsc/index.js CHANGED
@@ -35,6 +35,7 @@ import { transformAutomaticOptimizedBoundaries } from "./automatic-optimized-bou
35
35
  import { resolveRscBuildOutputPath } from "./build-paths.js";
36
36
  import { assertRscPackageCompatibility } from "./compatibility.js";
37
37
  import { sendRscDevelopmentResponse } from "./dev-response.js";
38
+ import { loadRscMiddlewareConfigModule } from "./middleware-config-module.js";
38
39
  import fs from "fs/promises";
39
40
  import path from "path";
40
41
  import { devServableFileExists } from "../dev-static.js";
@@ -46,7 +47,7 @@ const { farmApiPlugin, farmMiddlewarePlugin } = require_("@farm.js/core");
46
47
  const { resolveServerActionsConfig, validateServerActionRequest, createServerActionRequestErrorResponse, } = require_("@farm.js/core/server-action-security");
47
48
  const { normalizeFarmDeploymentId } = require_("@farm.js/core/deployment");
48
49
  const { getFarmLayerAliases, getFarmSourceRoots, resolveFarmLayers } = require_("@farm.js/core/server");
49
- const { searchParamsToObject, readNodeRequestBody, resolveFarmServerConfig, createFarmRequestBodyErrorResponse, } = require_("@farm.js/core/internal/production-runtime");
50
+ const { searchParamsToObject, readNodeRequestBody, resolveFarmServerConfig, resolveFarmI18nConfig, createFarmRequestBodyErrorResponse, } = require_("@farm.js/core/internal/production-runtime");
50
51
  const { isFarmAPIPathname } = require_("@farm.js/core/api/runtime");
51
52
  const { resolveFarmAPIConfig, resolveFarmAPIServerBasePath } = require_("@farm.js/core/api");
52
53
  const { getResolvedEnv } = require_("@farm.js/core/env");
@@ -175,7 +176,58 @@ const VIRTUAL_CLIENT_ENTRY = "virtual:@farm.js/rsc/entry-client";
175
176
  const VIRTUAL_HYDRATE_ENTRY = "virtual:@farm.js/rsc/hydrate";
176
177
  const OPTIMIZED_BOUNDARY_ADAPTER = "@farm.js/plugin/rsc/optimized-boundary";
177
178
  const STRATA_PACKAGE = "@farming-labs/strata";
179
+ const RSC_MIDDLEWARE_CONFIG_QUERY = "?farm-rsc-middleware";
178
180
  const FARM_CORE_PACKAGE_ROOT = path.resolve(path.dirname(require_.resolve("@farm.js/core")), "..");
181
+ const FARM_CONFIG_FILENAMES = [
182
+ "farm.config.ts",
183
+ "farm.config.tsx",
184
+ "farm.config.mts",
185
+ "farm.config.cts",
186
+ "farm.config.js",
187
+ "farm.config.jsx",
188
+ "farm.config.mjs",
189
+ "farm.config.cjs",
190
+ "config.ts",
191
+ "config.tsx",
192
+ "config.mts",
193
+ "config.cts",
194
+ "config.js",
195
+ "config.jsx",
196
+ "config.mjs",
197
+ "config.cjs",
198
+ ];
199
+ function hasFarmMiddlewareConfig(config) {
200
+ if (!config)
201
+ return false;
202
+ if (Array.isArray(config))
203
+ return config.length > 0;
204
+ const entry = config;
205
+ return Boolean(entry.matcher ||
206
+ entry.exclude ||
207
+ entry.runtime ||
208
+ entry.handler ||
209
+ (Array.isArray(entry.handlers) && entry.handlers.length > 0));
210
+ }
211
+ async function findFarmConfigPath(root) {
212
+ for (const fileName of FARM_CONFIG_FILENAMES) {
213
+ const candidate = path.join(root, fileName);
214
+ try {
215
+ if ((await fs.stat(candidate)).isFile())
216
+ return candidate;
217
+ }
218
+ catch {
219
+ // Continue checking supported config names.
220
+ }
221
+ }
222
+ return null;
223
+ }
224
+ async function resolveMiddlewareConfigPaths(root, layers) {
225
+ const paths = (layers ?? []).flatMap((layer) => layer.configFile ? [path.resolve(layer.configFile)] : []);
226
+ const projectConfigPath = await findFarmConfigPath(root);
227
+ if (projectConfigPath)
228
+ paths.push(projectConfigPath);
229
+ return [...new Set(paths)];
230
+ }
179
231
  function isOptimizedBoundaryModule(id) {
180
232
  return (id === OPTIMIZED_BOUNDARY_ADAPTER ||
181
233
  id === STRATA_PACKAGE ||
@@ -391,6 +443,7 @@ export default function farmRsc(options = {}) {
391
443
  // Context passed to entry generators
392
444
  let entryContext;
393
445
  let rscBuildRoot;
446
+ const middlewareConfigModules = new Map();
394
447
  // Store for debugging
395
448
  const debug = options.debug ?? false;
396
449
  const automaticDeploymentId = `build-${Date.now()}`;
@@ -480,6 +533,18 @@ export default function farmRsc(options = {}) {
480
533
  };
481
534
  return [
482
535
  farmEnvironmentFunctionsPlugin(),
536
+ {
537
+ name: "@farm.js/plugin/rsc:middleware-config",
538
+ enforce: "pre",
539
+ resolveId(id) {
540
+ if (!id.endsWith(RSC_MIDDLEWARE_CONFIG_QUERY))
541
+ return null;
542
+ return id.replace(/\\/g, "/");
543
+ },
544
+ load(id) {
545
+ return middlewareConfigModules.get(id.replace(/\\/g, "/")) ?? null;
546
+ },
547
+ },
483
548
  {
484
549
  name: "@farm.js/plugin/rsc:core-runtime",
485
550
  // Run after Vite/esbuild has lowered TS/JSX. es-module-lexer deliberately
@@ -539,6 +604,31 @@ export default function farmRsc(options = {}) {
539
604
  });
540
605
  Object.assign(c, layerResolution.config);
541
606
  }
607
+ middlewareConfigModules.clear();
608
+ const middlewareConfigPaths = [];
609
+ if (hasFarmMiddlewareConfig(c.middleware)) {
610
+ const configPaths = await resolveMiddlewareConfigPaths(root, c.layers);
611
+ if (configPaths.length === 0) {
612
+ throw new Error("[Farm.js] RSC config middleware requires an importable farm.config file. " +
613
+ "Move the middleware to farm.config.ts or src/app/middleware.ts.");
614
+ }
615
+ for (const configPath of configPaths) {
616
+ const extracted = await loadRscMiddlewareConfigModule(configPath);
617
+ if (extracted.kind === "unsupported") {
618
+ throw new Error(`[Farm.js] Cannot extract RSC config middleware from ${configPath}: ${extracted.reason}. ` +
619
+ "Declare middleware directly in defineConfig({ middleware: ... }) or move it to src/app/middleware.ts.");
620
+ }
621
+ if (extracted.kind === "absent")
622
+ continue;
623
+ const moduleId = `${configPath.replace(/\\/g, "/")}${RSC_MIDDLEWARE_CONFIG_QUERY}`;
624
+ middlewareConfigModules.set(moduleId, extracted.code);
625
+ middlewareConfigPaths.push(moduleId);
626
+ }
627
+ if (middlewareConfigPaths.length === 0) {
628
+ throw new Error("[Farm.js] RSC config middleware could not be traced to an explicit middleware property. " +
629
+ "Declare middleware directly in defineConfig({ middleware: ... }) or move it to src/app/middleware.ts.");
630
+ }
631
+ }
542
632
  // Read user's directory configuration
543
633
  const api = await resolveFarmAPIConfig(c.api, {
544
634
  root,
@@ -596,6 +686,15 @@ export default function farmRsc(options = {}) {
596
686
  allowedOrigins: options.serverActions?.allowedOrigins ?? c.serverActions?.allowedOrigins,
597
687
  }),
598
688
  deploymentId,
689
+ // Resolved the same way core resolves it for the config, so RSC and
690
+ // non-RSC apps match middleware against the same pathname.
691
+ i18n: resolveFarmI18nConfig(c.i18n, {
692
+ root,
693
+ mode: env.command === "serve" ? "development" : "production",
694
+ basePath: c.basePath ?? "/",
695
+ }),
696
+ server: { trustProxy: resolveFarmServerConfig(c.server).trustProxy },
697
+ middlewareConfigPaths,
599
698
  debug,
600
699
  development: env.command === "serve",
601
700
  clientCachePersistence: generateClientCachePersistenceCode(resolveFarmClientCacheAdapterEntry(root, c.cache)),
@@ -0,0 +1,19 @@
1
+ type AstNode = {
2
+ type: string;
3
+ start: number;
4
+ end: number;
5
+ [key: string]: unknown;
6
+ };
7
+ type ExtractionResult = {
8
+ kind: "module";
9
+ code: string;
10
+ } | {
11
+ kind: "absent";
12
+ } | {
13
+ kind: "unsupported";
14
+ reason: string;
15
+ };
16
+ export declare function extractRscMiddlewareConfigModule(source: string, program: AstNode): ExtractionResult;
17
+ export declare function loadRscMiddlewareConfigModule(configPath: string): Promise<ExtractionResult>;
18
+ export {};
19
+ //# sourceMappingURL=middleware-config-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-config-module.d.ts","sourceRoot":"","sources":["../../src/rsc/middleware-config-module.ts"],"names":[],"mappings":"AAQA,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AASF,KAAK,gBAAgB,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA6N5C,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf,gBAAgB,CA4IlB;AAiBD,wBAAsB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAejG"}
@@ -0,0 +1,355 @@
1
+ import path from "node:path";
2
+ function isNode(value) {
3
+ return Boolean(value &&
4
+ typeof value === "object" &&
5
+ typeof value.type === "string" &&
6
+ typeof value.start === "number" &&
7
+ typeof value.end === "number");
8
+ }
9
+ function bindingNames(pattern, names = []) {
10
+ if (!pattern)
11
+ return names;
12
+ if (pattern.type === "Identifier") {
13
+ names.push(pattern.name);
14
+ return names;
15
+ }
16
+ if (pattern.type === "RestElement") {
17
+ return bindingNames(pattern.argument, names);
18
+ }
19
+ if (pattern.type === "AssignmentPattern") {
20
+ return bindingNames(pattern.left, names);
21
+ }
22
+ if (pattern.type === "ArrayPattern") {
23
+ for (const element of pattern.elements ?? []) {
24
+ bindingNames(element, names);
25
+ }
26
+ return names;
27
+ }
28
+ if (pattern.type === "ObjectPattern") {
29
+ for (const property of pattern.properties ?? []) {
30
+ bindingNames(property.type === "RestElement"
31
+ ? property.argument
32
+ : property.value, names);
33
+ }
34
+ }
35
+ return names;
36
+ }
37
+ function isReferenceIdentifier(node, parent, key) {
38
+ if (!parent)
39
+ return true;
40
+ if ((parent.type === "MemberExpression" || parent.type === "OptionalMemberExpression") &&
41
+ key === "property" &&
42
+ parent.computed !== true) {
43
+ return false;
44
+ }
45
+ if ((parent.type === "Property" ||
46
+ parent.type === "PropertyDefinition" ||
47
+ parent.type === "MethodDefinition") &&
48
+ key === "key" &&
49
+ parent.computed !== true) {
50
+ return parent.shorthand === true;
51
+ }
52
+ if (parent.type === "VariableDeclarator")
53
+ return key !== "id";
54
+ if (parent.type === "FunctionDeclaration" ||
55
+ parent.type === "FunctionExpression" ||
56
+ parent.type === "ArrowFunctionExpression") {
57
+ return key !== "id" && key !== "params";
58
+ }
59
+ if (parent.type === "ClassDeclaration" || parent.type === "ClassExpression") {
60
+ return key !== "id";
61
+ }
62
+ if (parent.type === "CatchClause")
63
+ return key !== "param";
64
+ if (parent.type === "RestElement")
65
+ return false;
66
+ if (parent.type === "AssignmentPattern")
67
+ return key !== "left";
68
+ return ![
69
+ "ArrayPattern",
70
+ "BreakStatement",
71
+ "ContinueStatement",
72
+ "ExportSpecifier",
73
+ "ImportDefaultSpecifier",
74
+ "ImportNamespaceSpecifier",
75
+ "ImportSpecifier",
76
+ "LabeledStatement",
77
+ ].includes(parent.type);
78
+ }
79
+ function scopeBindings(node) {
80
+ const names = new Set();
81
+ if (node.type === "FunctionDeclaration" ||
82
+ node.type === "FunctionExpression" ||
83
+ node.type === "ArrowFunctionExpression") {
84
+ if (isNode(node.id))
85
+ bindingNames(node.id).forEach((name) => names.add(name));
86
+ for (const parameter of node.params ?? []) {
87
+ bindingNames(parameter).forEach((name) => names.add(name));
88
+ }
89
+ }
90
+ else if (node.type === "CatchClause" && isNode(node.param)) {
91
+ bindingNames(node.param).forEach((name) => names.add(name));
92
+ }
93
+ else if (node.type === "BlockStatement") {
94
+ for (const statement of node.body ?? []) {
95
+ const declaration = statement.type === "ExportNamedDeclaration" && isNode(statement.declaration)
96
+ ? statement.declaration
97
+ : statement;
98
+ if (declaration.type === "VariableDeclaration" && declaration.kind !== "var") {
99
+ for (const declarator of declaration.declarations ?? []) {
100
+ bindingNames(declarator.id).forEach((name) => names.add(name));
101
+ }
102
+ }
103
+ else if ((declaration.type === "FunctionDeclaration" || declaration.type === "ClassDeclaration") &&
104
+ isNode(declaration.id)) {
105
+ names.add(declaration.id.name);
106
+ }
107
+ }
108
+ }
109
+ return names;
110
+ }
111
+ function referencedTopLevelNames(node, candidates) {
112
+ const references = new Set();
113
+ const visit = (value, parent, key, scopes) => {
114
+ if (Array.isArray(value)) {
115
+ for (const child of value)
116
+ visit(child, parent, key, scopes);
117
+ return;
118
+ }
119
+ if (!isNode(value))
120
+ return;
121
+ const nodeScopes = [
122
+ ...scopes,
123
+ ...([
124
+ "ArrowFunctionExpression",
125
+ "BlockStatement",
126
+ "CatchClause",
127
+ "FunctionDeclaration",
128
+ "FunctionExpression",
129
+ ].includes(value.type)
130
+ ? [scopeBindings(value)]
131
+ : []),
132
+ ];
133
+ if (value.type === "Identifier") {
134
+ const name = value.name;
135
+ const shadowed = nodeScopes.some((scope) => scope.has(name));
136
+ if (candidates.has(name) && !shadowed && isReferenceIdentifier(value, parent, key)) {
137
+ references.add(name);
138
+ }
139
+ return;
140
+ }
141
+ for (const [childKey, child] of Object.entries(value)) {
142
+ if (childKey === "start" || childKey === "end" || childKey === "loc")
143
+ continue;
144
+ visit(child, value, childKey, nodeScopes);
145
+ }
146
+ };
147
+ visit(node, null, "", []);
148
+ return references;
149
+ }
150
+ function importBindingCode(statement, specifier, _source) {
151
+ const moduleSource = JSON.stringify(statement.source.value);
152
+ const local = specifier.local.name;
153
+ if (specifier.type === "ImportDefaultSpecifier") {
154
+ return `import ${local} from ${moduleSource};`;
155
+ }
156
+ if (specifier.type === "ImportNamespaceSpecifier") {
157
+ return `import * as ${local} from ${moduleSource};`;
158
+ }
159
+ const imported = specifier.imported;
160
+ const importedName = imported.type === "Identifier" ? imported.name : JSON.stringify(imported.value);
161
+ return `import { ${importedName}${importedName === local ? "" : ` as ${local}`} } from ${moduleSource};`;
162
+ }
163
+ function propertyName(property) {
164
+ if (property.computed === true)
165
+ return null;
166
+ const key = property.key;
167
+ if (key.type === "Identifier")
168
+ return key.name;
169
+ if (key.type === "Literal" && typeof key.value === "string")
170
+ return key.value;
171
+ return null;
172
+ }
173
+ function resolveConfigObject(node, variableInitializers, configHelpers, seen = new Set()) {
174
+ if (node.type === "ObjectExpression")
175
+ return node;
176
+ if (node.type === "CallExpression") {
177
+ const callee = node.callee;
178
+ const args = node.arguments ?? [];
179
+ if (callee.type === "Identifier" &&
180
+ configHelpers.has(callee.name) &&
181
+ args.length === 1) {
182
+ return resolveConfigObject(args[0], variableInitializers, configHelpers, seen);
183
+ }
184
+ return null;
185
+ }
186
+ if (node.type === "Identifier") {
187
+ const name = node.name;
188
+ if (seen.has(name))
189
+ return null;
190
+ const initializer = variableInitializers.get(name);
191
+ if (!initializer)
192
+ return null;
193
+ seen.add(name);
194
+ return resolveConfigObject(initializer, variableInitializers, configHelpers, seen);
195
+ }
196
+ return null;
197
+ }
198
+ export function extractRscMiddlewareConfigModule(source, program) {
199
+ const body = program.body ?? [];
200
+ const bindings = new Map();
201
+ const variableInitializers = new Map();
202
+ const configHelpers = new Set(["defineConfig", "defineFarmConfig"]);
203
+ let defaultExport = null;
204
+ let order = 0;
205
+ for (const statement of body) {
206
+ if (statement.type === "ImportDeclaration") {
207
+ const moduleName = statement.source.value;
208
+ for (const specifier of statement.specifiers ?? []) {
209
+ const local = specifier.local.name;
210
+ if (moduleName === "@farm.js/core" || moduleName === "@farm.js/core/config") {
211
+ const imported = specifier.imported;
212
+ const importedName = imported?.type === "Identifier" ? imported.name : undefined;
213
+ if (importedName === "defineConfig" || importedName === "defineFarmConfig") {
214
+ configHelpers.add(local);
215
+ }
216
+ }
217
+ bindings.set(local, {
218
+ names: [local],
219
+ order: order++,
220
+ render: () => importBindingCode(statement, specifier, source),
221
+ references: null,
222
+ });
223
+ }
224
+ continue;
225
+ }
226
+ if (statement.type === "ExportDefaultDeclaration") {
227
+ defaultExport = statement.declaration;
228
+ continue;
229
+ }
230
+ if (statement.type === "ExportNamedDeclaration") {
231
+ for (const specifier of statement.specifiers ?? []) {
232
+ const exported = specifier.exported;
233
+ if ((exported.type === "Identifier" && exported.name === "default") ||
234
+ (exported.type === "Literal" && exported.value === "default")) {
235
+ defaultExport = specifier.local;
236
+ }
237
+ }
238
+ }
239
+ const declaration = statement.type === "ExportNamedDeclaration" && isNode(statement.declaration)
240
+ ? statement.declaration
241
+ : statement;
242
+ if (declaration.type === "VariableDeclaration") {
243
+ for (const declarator of declaration.declarations ?? []) {
244
+ const names = bindingNames(declarator.id);
245
+ const initializer = isNode(declarator.init) ? declarator.init : null;
246
+ if (names.length === 1 && initializer)
247
+ variableInitializers.set(names[0], initializer);
248
+ const binding = {
249
+ names,
250
+ order: order++,
251
+ render: () => `${declaration.kind} ${source.slice(declarator.start, declarator.end)};`,
252
+ references: declarator,
253
+ };
254
+ for (const name of names)
255
+ bindings.set(name, binding);
256
+ }
257
+ continue;
258
+ }
259
+ if ((declaration.type === "FunctionDeclaration" || declaration.type === "ClassDeclaration") &&
260
+ isNode(declaration.id)) {
261
+ const name = declaration.id.name;
262
+ bindings.set(name, {
263
+ names: [name],
264
+ order: order++,
265
+ render: () => source.slice(declaration.start, declaration.end),
266
+ references: declaration,
267
+ });
268
+ }
269
+ }
270
+ if (!defaultExport) {
271
+ return { kind: "unsupported", reason: "the config has no default export" };
272
+ }
273
+ const configObject = resolveConfigObject(defaultExport, variableInitializers, configHelpers);
274
+ if (!configObject) {
275
+ return {
276
+ kind: "unsupported",
277
+ reason: "the default export is not a statically traceable defineConfig object",
278
+ };
279
+ }
280
+ const properties = configObject.properties ?? [];
281
+ let middlewareProperty = null;
282
+ let middlewareIndex = -1;
283
+ for (const [index, property] of properties.entries()) {
284
+ if (property.type === "Property" && propertyName(property) === "middleware") {
285
+ middlewareProperty = property;
286
+ middlewareIndex = index;
287
+ }
288
+ }
289
+ if (!middlewareProperty) {
290
+ if (properties.some((property) => property.type === "SpreadElement")) {
291
+ return {
292
+ kind: "unsupported",
293
+ reason: "middleware may be supplied through a config spread",
294
+ };
295
+ }
296
+ return { kind: "absent" };
297
+ }
298
+ if (properties.slice(middlewareIndex + 1).some((property) => property.type === "SpreadElement")) {
299
+ return {
300
+ kind: "unsupported",
301
+ reason: "a config spread after middleware may override it",
302
+ };
303
+ }
304
+ const middlewareValue = middlewareProperty.value;
305
+ const candidateNames = new Set(bindings.keys());
306
+ const selectedBindings = new Set();
307
+ const pending = [...referencedTopLevelNames(middlewareValue, candidateNames)];
308
+ while (pending.length > 0) {
309
+ const name = pending.pop();
310
+ const binding = bindings.get(name);
311
+ if (!binding || selectedBindings.has(binding))
312
+ continue;
313
+ selectedBindings.add(binding);
314
+ if (binding.references) {
315
+ for (const reference of referencedTopLevelNames(binding.references, candidateNames)) {
316
+ pending.push(reference);
317
+ }
318
+ }
319
+ }
320
+ const declarations = [...selectedBindings]
321
+ .sort((a, b) => a.order - b.order)
322
+ .map((binding) => binding.render());
323
+ const middlewareSource = source.slice(middlewareValue.start, middlewareValue.end);
324
+ return {
325
+ kind: "module",
326
+ code: `${declarations.join("\n")}${declarations.length ? "\n" : ""}export default { middleware: ${middlewareSource} };\n`,
327
+ };
328
+ }
329
+ function esbuildLoader(file) {
330
+ switch (path.extname(file)) {
331
+ case ".ts":
332
+ case ".mts":
333
+ case ".cts":
334
+ return "ts";
335
+ case ".tsx":
336
+ return "tsx";
337
+ case ".jsx":
338
+ return "jsx";
339
+ default:
340
+ return "js";
341
+ }
342
+ }
343
+ export async function loadRscMiddlewareConfigModule(configPath) {
344
+ const [{ readFile }, { parseAst, transformWithEsbuild }] = await Promise.all([
345
+ import("node:fs/promises"),
346
+ import("vite"),
347
+ ]);
348
+ const source = await readFile(configPath, "utf8");
349
+ const transformed = await transformWithEsbuild(source, configPath, {
350
+ format: "esm",
351
+ jsx: "automatic",
352
+ loader: esbuildLoader(configPath),
353
+ });
354
+ return extractRscMiddlewareConfigModule(transformed.code, parseAst(transformed.code));
355
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"nitro-build.d.ts","sourceRoot":"","sources":["../../src/rsc/nitro-build.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,IAAI,CAKN;AAcD,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CA8BrF;AA4ED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,IAAI,CAAC,CAgCf;AA2ED,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyLhF"}
1
+ {"version":3,"file":"nitro-build.d.ts","sourceRoot":"","sources":["../../src/rsc/nitro-build.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,IAAI,CAKN;AAcD,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CA8BrF;AA4ED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,IAAI,CAAC,CAgCf;AAwFD,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyLhF"}
@@ -249,9 +249,22 @@ function createRscRequest(event) {
249
249
  return new Request(request, { signal: controller.signal });
250
250
  }
251
251
 
252
+ // The peer address the server adapter already knows; the rebuilt Request has
253
+ // no socket. Mirrors h3's getRequestIP without the forwarded header, which only
254
+ // trustProxy may honor.
255
+ function resolveClientAddress(event) {
256
+ try {
257
+ return event.req?.context?.clientAddress || event.req?.ip ||
258
+ event.node?.req?.socket?.remoteAddress || undefined;
259
+ } catch {
260
+ return undefined;
261
+ }
262
+ }
263
+
252
264
  export default defineEventHandler(async (event) => {
253
265
  const response = await handler(createRscRequest(event), {
254
266
  waitUntil: (promise) => event.waitUntil(promise),
267
+ clientAddress: resolveClientAddress(event),
255
268
  });
256
269
  // H3's prepared headers override Response headers. Keep both the runtime's
257
270
  // fields (e.g. Accept-Encoding from static middleware) and the app's fields.
@@ -1,3 +1,4 @@
1
+ import type { ResolvedFarmI18nConfig } from "@farm.js/core/i18n";
1
2
  import type { FarmServerActionsConfig, ResolvedFarmServerActionsConfig } from "@farm.js/core/server-action-security";
2
3
  /**
3
4
  * Configuration options for the Farm.js RSC plugin.
@@ -72,6 +73,25 @@ export interface EntryContext {
72
73
  serverActions: ResolvedFarmServerActionsConfig;
73
74
  /** Resolved build identifier embedded into the server and browser entries. */
74
75
  deploymentId: string;
76
+ /**
77
+ * Resolved i18n configuration. Middleware path matching runs against the
78
+ * locale-stripped pathname, so without this a `/de/dashboard` request never
79
+ * matches a `/dashboard` middleware.
80
+ */
81
+ i18n?: ResolvedFarmI18nConfig;
82
+ /**
83
+ * Server settings the request path needs. `trustProxy` decides whether
84
+ * forwarded headers are believed when middleware reads the client address.
85
+ */
86
+ server?: {
87
+ trustProxy: boolean;
88
+ };
89
+ /**
90
+ * Ordered config modules that can contribute live middleware handlers.
91
+ * Layer configs come first and the application config comes last, matching
92
+ * Farm's normal config merge order.
93
+ */
94
+ middlewareConfigPaths?: string[];
75
95
  /** Whether debug mode is enabled */
76
96
  debug: boolean;
77
97
  /** True only for the Vite serve command, never for a production build. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rsc/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rsc/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farm.js/plugin",
3
- "version": "0.1.0-beta.107",
3
+ "version": "0.1.0-beta.108",
4
4
  "description": "Official plugins for Farm.js framework",
5
5
  "license": "MIT",
6
6
  "author": "Farm.js Team",
@@ -62,7 +62,7 @@
62
62
  "nitro": "3.0.260903-beta",
63
63
  "picocolors": "^1.0.0",
64
64
  "rsc-html-stream": "^0.0.4",
65
- "@farm.js/core": "0.1.0-beta.107"
65
+ "@farm.js/core": "0.1.0-beta.108"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@types/node": "^20.19.21",
@@ -83,7 +83,7 @@
83
83
  "react-dom": "19.2.8",
84
84
  "react-server-dom-webpack": "19.2.8",
85
85
  "vite": ">=6.0.0",
86
- "@farm.js/core": "0.1.0-beta.107"
86
+ "@farm.js/core": "0.1.0-beta.108"
87
87
  },
88
88
  "peerDependenciesMeta": {
89
89
  "@vitejs/plugin-rsc": {