@farm.js/plugin 0.1.0-beta.106 → 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.
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +4 -7
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/middleware/matching.d.ts +6 -0
- package/dist/middleware/matching.d.ts.map +1 -1
- package/dist/middleware/matching.js +13 -4
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +7 -2
- package/dist/rsc/entries/rsc.d.ts.map +1 -1
- package/dist/rsc/entries/rsc.js +21 -5
- package/dist/rsc/index.d.ts +2 -0
- package/dist/rsc/index.d.ts.map +1 -1
- package/dist/rsc/index.js +100 -1
- package/dist/rsc/middleware-config-module.d.ts +19 -0
- package/dist/rsc/middleware-config-module.d.ts.map +1 -0
- package/dist/rsc/middleware-config-module.js +355 -0
- package/dist/rsc/nitro-build.d.ts.map +1 -1
- package/dist/rsc/nitro-build.js +13 -0
- package/dist/rsc/types.d.ts +20 -0
- package/dist/rsc/types.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/api/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
|
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
|
|
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
package/dist/index.js
CHANGED
|
@@ -16,6 +16,12 @@ export declare function parseCookies(cookieHeader?: string): Record<string, stri
|
|
|
16
16
|
* Matching is by path segment, not raw string prefix: middleware at `/admin`
|
|
17
17
|
* covers `/admin` and everything under `/admin/`, but not sibling routes like
|
|
18
18
|
* `/administrator` or `/admin-public` that merely share a textual prefix.
|
|
19
|
+
*
|
|
20
|
+
* The request is compared as the router sees it: each segment decoded once and
|
|
21
|
+
* empty segments dropped. Comparing the raw pathname let `/api/%61dmin/users`,
|
|
22
|
+
* `/api//admin/users` and `//api/admin/users` skip middleware at `/api/admin`
|
|
23
|
+
* while the API router, which decodes segments and ignores empty ones, still
|
|
24
|
+
* served `/api/admin/users`.
|
|
19
25
|
*/
|
|
20
26
|
export declare function middlewareMatchesPath(pathname: string, middlewarePath: string): boolean;
|
|
21
27
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../src/middleware/matching.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../src/middleware/matching.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc1E;AAUD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAMvF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAkChG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { canonicalizeRequestPathSegments } from "@farm.js/core/middleware";
|
|
1
2
|
/**
|
|
2
3
|
* Parse cookies from a Cookie header.
|
|
3
4
|
*
|
|
@@ -34,13 +35,21 @@ function decodeCookieValue(value) {
|
|
|
34
35
|
* Matching is by path segment, not raw string prefix: middleware at `/admin`
|
|
35
36
|
* covers `/admin` and everything under `/admin/`, but not sibling routes like
|
|
36
37
|
* `/administrator` or `/admin-public` that merely share a textual prefix.
|
|
38
|
+
*
|
|
39
|
+
* The request is compared as the router sees it: each segment decoded once and
|
|
40
|
+
* empty segments dropped. Comparing the raw pathname let `/api/%61dmin/users`,
|
|
41
|
+
* `/api//admin/users` and `//api/admin/users` skip middleware at `/api/admin`
|
|
42
|
+
* while the API router, which decodes segments and ignores empty ones, still
|
|
43
|
+
* served `/api/admin/users`.
|
|
37
44
|
*/
|
|
38
45
|
export function middlewareMatchesPath(pathname, middlewarePath) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (pathname === middlewarePath)
|
|
46
|
+
const middlewareSegments = middlewarePath.split("/").filter(Boolean);
|
|
47
|
+
if (middlewareSegments.length === 0)
|
|
42
48
|
return true;
|
|
43
|
-
|
|
49
|
+
const requestSegments = canonicalizeRequestPathSegments(pathname);
|
|
50
|
+
if (requestSegments.length < middlewareSegments.length)
|
|
51
|
+
return false;
|
|
52
|
+
return middlewareSegments.every((segment, index) => requestSegments[index] === segment);
|
|
44
53
|
}
|
|
45
54
|
/**
|
|
46
55
|
* Serialize a cookie.
|
|
@@ -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
|
-
|
|
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,
|
|
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"}
|
package/dist/rsc/entries/rsc.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
package/dist/rsc/index.d.ts
CHANGED
|
@@ -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
|
/**
|
package/dist/rsc/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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"}
|
package/dist/rsc/nitro-build.js
CHANGED
|
@@ -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.
|
package/dist/rsc/types.d.ts
CHANGED
|
@@ -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. */
|
package/dist/rsc/types.d.ts.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
86
|
+
"@farm.js/core": "0.1.0-beta.108"
|
|
87
87
|
},
|
|
88
88
|
"peerDependenciesMeta": {
|
|
89
89
|
"@vitejs/plugin-rsc": {
|