@farm.js/core 0.1.0-beta.1 → 0.1.0-beta.3
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/README.md +1 -1
- package/dist/agent-runtime.d.mts +1 -1
- package/dist/agent-runtime.d.ts +1 -1
- package/dist/api/route-manager.cjs +97 -5
- package/dist/api/route-manager.cjs.map +1 -1
- package/dist/api/route-manager.d.mts +3 -2
- package/dist/api/route-manager.d.ts +3 -2
- package/dist/api/route-manager.mjs +8 -8
- package/dist/api/runtime.cjs +441 -5
- package/dist/api/runtime.cjs.map +1 -1
- package/dist/api/runtime.d.mts +2 -16
- package/dist/api/runtime.d.ts +2 -16
- package/dist/api/runtime.mjs +7 -1
- package/dist/api.cjs +579 -263
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.mts +4 -147
- package/dist/api.d.ts +4 -147
- package/dist/api.mjs +30 -20
- package/dist/{app-BiX4qb-d.d.mts → app-BB3Iu3xh.d.mts} +2 -2
- package/dist/{app-CFRNJXP1.d.ts → app-DOKxo-LH.d.ts} +2 -2
- package/dist/app-markdown.cjs +1 -1
- package/dist/app-markdown.cjs.map +1 -1
- package/dist/app-markdown.d.mts +1 -1
- package/dist/app-markdown.d.ts +1 -1
- package/dist/app-markdown.mjs +1 -1
- package/dist/cache.cjs +19 -0
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.d.mts +21 -1
- package/dist/cache.d.ts +21 -1
- package/dist/cache.mjs +5 -3
- package/dist/{chunk-QF4PHCMA.mjs → chunk-2ED5Q2GH.mjs} +3 -3
- package/dist/chunk-2ED5Q2GH.mjs.map +1 -0
- package/dist/{chunk-GZP5W4K3.mjs → chunk-32W4QEJP.mjs} +1 -1
- package/dist/chunk-32W4QEJP.mjs.map +1 -0
- package/dist/{chunk-AGS7UJ52.mjs → chunk-45LKHSHJ.mjs} +2 -2
- package/dist/{chunk-TU4YJICB.mjs → chunk-5FW6PQ3J.mjs} +1 -1
- package/dist/{chunk-TU4YJICB.mjs.map → chunk-5FW6PQ3J.mjs.map} +1 -1
- package/dist/{chunk-TRORP7E4.mjs → chunk-5QH4IKY3.mjs} +2 -2
- package/dist/{chunk-RKI6TN3A.mjs → chunk-6VS6CKAV.mjs} +2 -2
- package/dist/chunk-6VS6CKAV.mjs.map +1 -0
- package/dist/{chunk-25D7G34K.mjs → chunk-6WXJ54TC.mjs} +4 -4
- package/dist/{chunk-3QJO55ZF.mjs → chunk-BIOIOWXZ.mjs} +5 -3
- package/dist/{chunk-3QJO55ZF.mjs.map → chunk-BIOIOWXZ.mjs.map} +1 -1
- package/dist/{chunk-QFQRHRZS.mjs → chunk-C33RALN7.mjs} +75 -11
- package/dist/chunk-C33RALN7.mjs.map +1 -0
- package/dist/{chunk-B6N4ZB2H.mjs → chunk-CSU4KJJF.mjs} +3 -3
- package/dist/{chunk-JN3UU635.mjs → chunk-EJ7T4TPB.mjs} +2 -2
- package/dist/chunk-EJ7T4TPB.mjs.map +1 -0
- package/dist/{chunk-ZJQNATYV.mjs → chunk-FRPWCMMG.mjs} +3 -3
- package/dist/chunk-FRPWCMMG.mjs.map +1 -0
- package/dist/{chunk-PRNYWD7K.mjs → chunk-G5I34UA6.mjs} +67 -239
- package/dist/chunk-G5I34UA6.mjs.map +1 -0
- package/dist/{chunk-QM6VV26B.mjs → chunk-GQVGIUSN.mjs} +3 -3
- package/dist/{chunk-QM6VV26B.mjs.map → chunk-GQVGIUSN.mjs.map} +1 -1
- package/dist/{chunk-UREJA4GZ.mjs → chunk-GXASWWJU.mjs} +1 -1
- package/dist/{chunk-UREJA4GZ.mjs.map → chunk-GXASWWJU.mjs.map} +1 -1
- package/dist/{chunk-4PTK6KT4.mjs → chunk-GZWT6VI5.mjs} +22 -4
- package/dist/chunk-GZWT6VI5.mjs.map +1 -0
- package/dist/{chunk-JLWMCADZ.mjs → chunk-HZYXGV4K.mjs} +2 -2
- package/dist/chunk-JNYVN7YP.mjs +10 -0
- package/dist/chunk-JNYVN7YP.mjs.map +1 -0
- package/dist/{chunk-YHU7SS6L.mjs → chunk-LG3YINQN.mjs} +11 -11
- package/dist/chunk-LWMGIEJA.mjs +593 -0
- package/dist/chunk-LWMGIEJA.mjs.map +1 -0
- package/dist/{chunk-HXP3ZSPC.mjs → chunk-MH6FKW2I.mjs} +3 -3
- package/dist/{chunk-O3HADRW6.mjs → chunk-MIUW47JX.mjs} +2 -2
- package/dist/{chunk-O3HADRW6.mjs.map → chunk-MIUW47JX.mjs.map} +1 -1
- package/dist/{chunk-6XDUHOEM.mjs → chunk-NRRFGX45.mjs} +3 -3
- package/dist/{chunk-G3B5BRDY.mjs → chunk-OHC6VCDI.mjs} +24 -25
- package/dist/{chunk-G3B5BRDY.mjs.map → chunk-OHC6VCDI.mjs.map} +1 -1
- package/dist/{chunk-S2XHZS7W.mjs → chunk-QGQX7SFC.mjs} +2 -2
- package/dist/chunk-QGQX7SFC.mjs.map +1 -0
- package/dist/{chunk-TXCFGOHW.mjs → chunk-SHRJG6OG.mjs} +25 -1
- package/dist/chunk-SHRJG6OG.mjs.map +1 -0
- package/dist/{chunk-UHE2TTLK.mjs → chunk-T543TMFY.mjs} +8 -8
- package/dist/chunk-T543TMFY.mjs.map +1 -0
- package/dist/{chunk-SXZTEK3V.mjs → chunk-UXUAWNO5.mjs} +2 -2
- package/dist/{chunk-Y2OJJD7R.mjs → chunk-XIVV5IWN.mjs} +7 -9
- package/dist/chunk-XIVV5IWN.mjs.map +1 -0
- package/dist/{chunk-CHFHNEMO.mjs → chunk-XJSHJN4M.mjs} +41 -42
- package/dist/chunk-XJSHJN4M.mjs.map +1 -0
- package/dist/{chunk-Y7A27276.mjs → chunk-XUBZ7JI4.mjs} +178 -15
- package/dist/chunk-XUBZ7JI4.mjs.map +1 -0
- package/dist/{chunk-OYXO65LI.mjs → chunk-YW7OBE6Q.mjs} +4 -4
- package/dist/chunk-YW7OBE6Q.mjs.map +1 -0
- package/dist/{chunk-SOU3Q3ZA.mjs → chunk-ZZ57EH5Z.mjs} +1 -1
- package/dist/chunk-ZZ57EH5Z.mjs.map +1 -0
- package/dist/{client-D_yUjVhe.d.mts → client-DiViK9yK.d.mts} +33 -7
- package/dist/{client-Dkc03WP8.d.ts → client-DpEBJbts.d.ts} +33 -7
- package/dist/{client-plugins-BZnpeTGA.d.ts → client-plugins-CTnsZz_A.d.ts} +1 -0
- package/dist/{client-plugins-g4bzuCmo.d.mts → client-plugins-Cnr0D3kk.d.mts} +1 -0
- package/dist/client-plugins.d.mts +1 -1
- package/dist/client-plugins.d.ts +1 -1
- package/dist/client.cjs +302 -54
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.mts +54 -2
- package/dist/client.d.ts +54 -2
- package/dist/client.mjs +20 -16
- package/dist/config.d.mts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/cron.cjs.map +1 -1
- package/dist/cron.mjs +1 -1
- package/dist/{devtools-AE4RVXCM.mjs → devtools-HE4FTUDN.mjs} +10 -10
- package/dist/{devtools-client-6WPY2AQU.mjs → devtools-client-3XRTBND5.mjs} +2 -11
- package/dist/devtools-client-3XRTBND5.mjs.map +1 -0
- package/dist/docs.cjs +3 -1
- package/dist/docs.cjs.map +1 -1
- package/dist/docs.mjs +10 -10
- package/dist/i18n/server.cjs +2 -2
- package/dist/i18n/server.cjs.map +1 -1
- package/dist/i18n/server.mjs +1 -1
- package/dist/index.cjs +791 -317
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.mjs +125 -110
- package/dist/index.mjs.map +1 -1
- package/dist/integrations.d.mts +1 -1
- package/dist/integrations.d.ts +1 -1
- package/dist/internal/build-runtime.cjs +162 -60
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.d.mts +3 -3
- package/dist/internal/build-runtime.d.ts +3 -3
- package/dist/internal/build-runtime.mjs +26 -25
- package/dist/internal/client-runtime.cjs.map +1 -1
- package/dist/internal/client-runtime.mjs +1 -1
- package/dist/internal/config-runtime.cjs +1 -1
- package/dist/internal/config-runtime.cjs.map +1 -1
- package/dist/internal/config-runtime.d.mts +2 -2
- package/dist/internal/config-runtime.d.ts +2 -2
- package/dist/internal/config-runtime.mjs +9 -9
- package/dist/internal/production-runtime.cjs +3 -3
- package/dist/internal/production-runtime.cjs.map +1 -1
- package/dist/internal/production-runtime.d.mts +3 -3
- package/dist/internal/production-runtime.d.ts +3 -3
- package/dist/internal/production-runtime.mjs +8 -8
- package/dist/{metadata-C9NZxMDW.d.mts → metadata-Dp8AdvsB.d.mts} +1 -1
- package/dist/{metadata-DAXRaOHx.d.ts → metadata-eoVmHoyv.d.ts} +1 -1
- package/dist/middleware.cjs +2 -2
- package/dist/middleware.cjs.map +1 -1
- package/dist/middleware.d.mts +3 -3
- package/dist/middleware.d.ts +3 -3
- package/dist/middleware.mjs +3 -3
- package/dist/navigation.cjs.map +1 -1
- package/dist/navigation.mjs +3 -3
- package/dist/{nitro-KME62MWG.mjs → nitro-QO5LV6QK.mjs} +11 -13
- package/dist/{nitro-KME62MWG.mjs.map → nitro-QO5LV6QK.mjs.map} +1 -1
- package/dist/plugin.cjs +119 -39
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.mts +1 -1
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.mjs +22 -21
- package/dist/{production-runtime-DRkCHUvJ.d.ts → production-runtime-BqTnUTai.d.ts} +1 -1
- package/dist/{production-runtime-flrjp_nC.d.mts → production-runtime-DtDdG9fc.d.mts} +1 -1
- package/dist/routes.cjs.map +1 -1
- package/dist/routes.d.mts +1 -1
- package/dist/routes.d.ts +1 -1
- package/dist/routes.mjs +4 -4
- package/dist/runtime-C1B7pSGT.d.mts +207 -0
- package/dist/runtime-CdPHt0bv.d.ts +207 -0
- package/dist/server-action-security.cjs.map +1 -1
- package/dist/server-action-security.mjs +2 -2
- package/dist/server-fn-client.cjs.map +1 -1
- package/dist/server-fn-client.mjs +1 -1
- package/dist/server-fn.cjs.map +1 -1
- package/dist/server-fn.mjs +3 -3
- package/dist/server-plugins.d.mts +2 -2
- package/dist/server-plugins.d.ts +2 -2
- package/dist/server-query-client.cjs.map +1 -1
- package/dist/server-query-client.mjs +4 -4
- package/dist/server-query.cjs.map +1 -1
- package/dist/server-query.mjs +5 -5
- package/dist/server.cjs +148 -43
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.mts +6 -6
- package/dist/server.d.ts +6 -6
- package/dist/server.mjs +36 -31
- package/dist/server.mjs.map +1 -1
- package/dist/testing.cjs +95 -5
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.mts +3 -3
- package/dist/testing.d.ts +3 -3
- package/dist/testing.mjs +18 -18
- package/dist/{utils-DOXXivjL.d.mts → utils-8USa5BiY.d.mts} +1 -1
- package/dist/{utils-DA1yo54_.d.ts → utils-DKJb6K6G.d.ts} +1 -1
- package/dist/version.cjs +36 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.mts +3 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.mjs +8 -0
- package/dist/version.mjs.map +1 -0
- package/dist/vite.cjs +126 -40
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.mts +1 -1
- package/dist/vite.d.ts +1 -1
- package/dist/vite.mjs +22 -21
- package/dist/workflows.cjs +6 -8
- package/dist/workflows.cjs.map +1 -1
- package/dist/workflows.mjs +1 -1
- package/package.json +12 -5
- package/types/client.d.ts +136 -13
- package/dist/chunk-4PTK6KT4.mjs.map +0 -1
- package/dist/chunk-CHFHNEMO.mjs.map +0 -1
- package/dist/chunk-EVGBEZDF.mjs +0 -215
- package/dist/chunk-EVGBEZDF.mjs.map +0 -1
- package/dist/chunk-GZP5W4K3.mjs.map +0 -1
- package/dist/chunk-JN3UU635.mjs.map +0 -1
- package/dist/chunk-OYXO65LI.mjs.map +0 -1
- package/dist/chunk-PRNYWD7K.mjs.map +0 -1
- package/dist/chunk-QF4PHCMA.mjs.map +0 -1
- package/dist/chunk-QFQRHRZS.mjs.map +0 -1
- package/dist/chunk-RKI6TN3A.mjs.map +0 -1
- package/dist/chunk-S2XHZS7W.mjs.map +0 -1
- package/dist/chunk-SOU3Q3ZA.mjs.map +0 -1
- package/dist/chunk-TXCFGOHW.mjs.map +0 -1
- package/dist/chunk-UHE2TTLK.mjs.map +0 -1
- package/dist/chunk-Y2OJJD7R.mjs.map +0 -1
- package/dist/chunk-Y7A27276.mjs.map +0 -1
- package/dist/chunk-ZJQNATYV.mjs.map +0 -1
- package/dist/devtools-client-6WPY2AQU.mjs.map +0 -1
- /package/dist/{chunk-AGS7UJ52.mjs.map → chunk-45LKHSHJ.mjs.map} +0 -0
- /package/dist/{chunk-TRORP7E4.mjs.map → chunk-5QH4IKY3.mjs.map} +0 -0
- /package/dist/{chunk-25D7G34K.mjs.map → chunk-6WXJ54TC.mjs.map} +0 -0
- /package/dist/{chunk-B6N4ZB2H.mjs.map → chunk-CSU4KJJF.mjs.map} +0 -0
- /package/dist/{chunk-JLWMCADZ.mjs.map → chunk-HZYXGV4K.mjs.map} +0 -0
- /package/dist/{chunk-YHU7SS6L.mjs.map → chunk-LG3YINQN.mjs.map} +0 -0
- /package/dist/{chunk-HXP3ZSPC.mjs.map → chunk-MH6FKW2I.mjs.map} +0 -0
- /package/dist/{chunk-6XDUHOEM.mjs.map → chunk-NRRFGX45.mjs.map} +0 -0
- /package/dist/{chunk-SXZTEK3V.mjs.map → chunk-UXUAWNO5.mjs.map} +0 -0
- /package/dist/{devtools-AE4RVXCM.mjs.map → devtools-HE4FTUDN.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/endpoint.ts","../src/api/runtime.ts"],"sourcesContent":["import { createEndpoint as betterCallEndpoint } from \"better-call\";\nimport {\n createRouteDataCacheKey,\n invalidate,\n revalidatePath,\n type RouteDataCacheKey,\n} from \"../cache\";\n\n// Generic schema type that works with both Zod v3 and v4\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySchema = { _output?: any; _input?: any; parse?: (data: unknown) => any };\n\ntype MaybePromise<T> = T | Promise<T>;\ntype Simplify<T> = { [TKey in keyof T]: T[TKey] } & {};\ntype UnionToIntersection<T> = (T extends unknown ? (value: T) => void : never) extends (\n value: infer TIntersection,\n) => void\n ? TIntersection\n : never;\n\n// Infer output type from schema (works with Zod v3 and v4)\ntype InferOutput<T> = T extends { _output: infer O }\n ? O\n : T extends { parse: (data: unknown) => infer R }\n ? R\n : unknown;\n\ntype InferHeadersOutput<T> = [T] extends [never]\n ? Record<string, string>\n : T extends AnySchema\n ? InferOutput<T>\n : Record<string, string>;\n\nexport type EndpointErrorDefinition<\n TSchema extends AnySchema = AnySchema,\n TStatus extends number = number,\n> = {\n status: TStatus;\n schema: TSchema;\n /** Public message safe to expose to API callers. */\n message?: string;\n};\n\nexport type EndpointErrorDefinitions = Record<string, EndpointErrorDefinition<AnySchema, number>>;\n\nexport type EndpointErrorContracts<TErrors extends EndpointErrorDefinitions> = {\n [TCode in keyof TErrors]: {\n data: InferOutput<TErrors[TCode][\"schema\"]>;\n status: TErrors[TCode][\"status\"];\n };\n};\n\nexport type EndpointFail<TErrors extends EndpointErrorDefinitions> = <\n TCode extends keyof TErrors & string,\n>(\n code: TCode,\n data: InferOutput<TErrors[TCode][\"schema\"]>,\n) => never;\n\nexport class EndpointFailure<TCode extends string = string, TData = unknown> extends Error {\n readonly code: TCode;\n readonly data: TData;\n readonly status: number;\n\n constructor(\n code: TCode,\n data: TData,\n options: {\n status: number;\n message: string;\n },\n ) {\n super(options.message);\n this.name = \"EndpointFailure\";\n this.code = code;\n this.data = data;\n this.status = options.status;\n }\n}\n\nexport function isEndpointFailure(value: unknown): value is EndpointFailure<string, unknown> {\n return value instanceof EndpointFailure;\n}\n\nexport type EndpointParamValue = string | string[];\nexport type EndpointParams = Record<string, EndpointParamValue>;\n\nexport type EndpointMiddlewareContext<\n TContext extends object = {},\n TBody = unknown,\n TQuery = unknown,\n THeaders = Record<string, string>,\n> = {\n body: TBody;\n query: TQuery;\n headers: THeaders;\n request: Request;\n /** Context accumulated from middleware that ran earlier in the chain. */\n context: Readonly<TContext>;\n params: EndpointParams;\n};\n\nexport type EndpointMiddlewareResult<TProvidedContext extends object = object> =\n | TProvidedContext\n | true\n | false\n | Response;\n\n/** A plain async function. No wrapper or `next()` callback is required. */\nexport type EndpointMiddleware<\n TProvidedContext extends object = object,\n TContext extends object = {},\n TBody = unknown,\n TQuery = unknown,\n THeaders = Record<string, string>,\n> = (\n ctx: EndpointMiddlewareContext<TContext, TBody, TQuery, THeaders>,\n) => MaybePromise<EndpointMiddlewareResult<TProvidedContext>>;\n\nexport type AnyEndpointMiddleware = (ctx: EndpointMiddlewareContext<any, any, any, any>) => unknown;\n\nexport type EndpointInvalidationTarget =\n | {\n key: RouteDataCacheKey;\n }\n | {\n path: string;\n };\n\nexport type EndpointInvalidationContext<\n TContext extends object = {},\n TBody = unknown,\n TQuery = unknown,\n THeaders = Record<string, string>,\n> = EndpointMiddlewareContext<TContext, TBody, TQuery, THeaders> & {\n /** The raw value returned by the endpoint handler. */\n result: unknown;\n};\n\nexport type EndpointInvalidations<\n TContext extends object = {},\n TBody = unknown,\n TQuery = unknown,\n THeaders = Record<string, string>,\n> =\n | readonly EndpointInvalidationTarget[]\n | ((\n context: EndpointInvalidationContext<TContext, TBody, TQuery, THeaders>,\n ) => readonly EndpointInvalidationTarget[] | Promise<readonly EndpointInvalidationTarget[]>);\n\ntype ValidateEndpointMiddlewares<TMiddlewares extends readonly AnyEndpointMiddleware[]> = {\n readonly [TIndex in keyof TMiddlewares]: TMiddlewares[TIndex] extends AnyEndpointMiddleware\n ? [Awaited<ReturnType<TMiddlewares[TIndex]>>] extends [EndpointMiddlewareResult<object>]\n ? TMiddlewares[TIndex]\n : never\n : never;\n};\n\ntype ContextFromMiddlewareResult<TResult> =\n Exclude<TResult, Response | boolean> extends infer TContext\n ? [TContext] extends [never]\n ? {}\n : TContext extends object\n ? TContext\n : {}\n : {};\n\ntype ContextFromMiddleware<TMiddleware> = TMiddleware extends (...args: any[]) => infer TResult\n ? ContextFromMiddlewareResult<Awaited<TResult>>\n : {};\n\nexport type InferEndpointMiddlewareContext<\n TMiddlewares extends readonly ((...args: any[]) => any)[],\n TContext extends object = {},\n> = TMiddlewares extends readonly [infer TMiddleware, ...infer TRest]\n ? TMiddleware extends (...args: any[]) => any\n ? TRest extends readonly ((...args: any[]) => any)[]\n ? InferEndpointMiddlewareContext<\n TRest,\n Simplify<TContext & ContextFromMiddleware<TMiddleware>>\n >\n : Simplify<TContext>\n : Simplify<TContext>\n : number extends TMiddlewares[\"length\"]\n ? Simplify<TContext & UnionToIntersection<ContextFromMiddleware<TMiddlewares[number]>>>\n : Simplify<TContext>;\n\nexport type EndpointOptions<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TMiddlewares extends readonly AnyEndpointMiddleware[] = readonly [],\n TErrors extends EndpointErrorDefinitions = {},\n> = {\n method?: \"GET\" | \"HEAD\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\";\n body?: TBody;\n query?: TQuery;\n headers?: THeaders;\n middleware?: TMiddlewares;\n /**\n * Cache keys and route paths made stale after a successful handler result.\n * The resolver receives validated input and middleware context.\n */\n invalidates?: EndpointInvalidations<\n InferEndpointMiddlewareContext<TMiddlewares>,\n InferOutput<TBody>,\n InferOutput<TQuery>,\n InferHeadersOutput<THeaders>\n >;\n errors?: TErrors;\n /** @deprecated Use plain functions in `middleware` for Farm endpoint middleware. */\n use?: any[];\n};\n\nexport type EndpointHandler<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n TContext extends object = {},\n TErrors extends EndpointErrorDefinitions = {},\n> = (ctx: {\n body: InferOutput<TBody>;\n query: InferOutput<TQuery>;\n headers: InferHeadersOutput<THeaders>;\n request: Request;\n context: Readonly<TContext>;\n params: EndpointParams;\n fail: EndpointFail<TErrors>;\n}) => Promise<TResponse> | TResponse;\n\n// Type to represent an endpoint with its input/output types\nexport type TypedEndpoint<\n TBody = never,\n TQuery = never,\n TResponse = any,\n THeaders = Record<string, string>,\n TErrors = never,\n> = {\n __types: {\n body: TBody;\n query: TQuery;\n headers: THeaders;\n response: TResponse;\n errors: TErrors;\n };\n __path?: string;\n __method?: string;\n} & ((options?: { body?: TBody; query?: TQuery }) => Promise<TResponse>);\n\ntype CreatedEndpoint<\n TBody extends AnySchema,\n TQuery extends AnySchema,\n THeaders extends AnySchema,\n TResponse,\n TErrors extends EndpointErrorDefinitions = {},\n> = TypedEndpoint<\n InferOutput<TBody>,\n InferOutput<TQuery>,\n Awaited<TResponse>,\n InferHeadersOutput<THeaders>,\n EndpointErrorContracts<TErrors>\n>;\n\ntype AnyEndpointOptions = EndpointOptions<\n AnySchema,\n AnySchema,\n AnySchema,\n readonly AnyEndpointMiddleware[],\n EndpointErrorDefinitions\n>;\ntype EndpointBodyFromOptions<TOptions> = TOptions extends {\n body: infer TBody extends AnySchema;\n}\n ? TBody\n : never;\ntype EndpointQueryFromOptions<TOptions> = TOptions extends {\n query: infer TQuery extends AnySchema;\n}\n ? TQuery\n : never;\ntype EndpointHeadersFromOptions<TOptions> = TOptions extends {\n headers: infer THeaders extends AnySchema;\n}\n ? THeaders\n : never;\ntype EndpointMiddlewaresFromOptions<TOptions> = TOptions extends {\n middleware: infer TMiddlewares extends readonly AnyEndpointMiddleware[];\n}\n ? TMiddlewares\n : readonly [];\ntype EndpointErrorsFromOptions<TOptions> = TOptions extends {\n errors: infer TErrors extends EndpointErrorDefinitions;\n}\n ? TErrors\n : {};\ntype MethodlessEndpointOptions = Omit<AnyEndpointOptions, \"method\">;\ntype EndpointHandlerFromOptions<TOptions, TResponse> = EndpointHandler<\n EndpointBodyFromOptions<TOptions>,\n EndpointQueryFromOptions<TOptions>,\n EndpointHeadersFromOptions<TOptions>,\n TResponse,\n InferEndpointMiddlewareContext<EndpointMiddlewaresFromOptions<TOptions>>,\n EndpointErrorsFromOptions<TOptions>\n>;\ntype ValidatedEndpointHandlerFromOptions<TOptions, TResponse> = EndpointHandlerFromOptions<\n TOptions,\n TResponse\n> &\n (EndpointMiddlewaresFromOptions<TOptions> extends ValidateEndpointMiddlewares<\n EndpointMiddlewaresFromOptions<TOptions>\n >\n ? unknown\n : never);\ntype CreatedEndpointFromOptions<TOptions, TResponse> = CreatedEndpoint<\n EndpointBodyFromOptions<TOptions>,\n EndpointQueryFromOptions<TOptions>,\n EndpointHeadersFromOptions<TOptions>,\n TResponse,\n EndpointErrorsFromOptions<TOptions>\n>;\n\n/**\n * Create a Farm.js API endpoint\n *\n * Supports two patterns:\n * 1. File-based routing (path auto-inferred from file location):\n * `export const POST = createEndpoint({ method: 'POST', body: schema }, handler)`\n * `createEndpoint({ method: 'GET', query: z.object({...}) }, handler)`\n *\n * 2. Explicit path (for routes.ts at project root):\n * `createEndpoint('/api/hello', { method: 'GET', query: z.object({...}) }, handler)`\n */\nexport function createEndpoint<const TOptions extends AnyEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function createEndpoint<const TOptions extends AnyEndpointOptions, TResponse = any>(\n path: string,\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function createEndpoint<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: EndpointOptions<TBody, TQuery, THeaders, readonly []>,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function createEndpoint<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n path: string,\n options: EndpointOptions<TBody, TQuery, THeaders, readonly []>,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function createEndpoint(\n pathOrOptions:\n | string\n | EndpointOptions<any, any, any, readonly AnyEndpointMiddleware[], EndpointErrorDefinitions>,\n optionsOrHandler:\n | EndpointOptions<any, any, any, readonly AnyEndpointMiddleware[], EndpointErrorDefinitions>\n | EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>,\n maybeHandler?: EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>,\n): TypedEndpoint<any, any, any, any> {\n // Determine if first arg is path or options\n let path: string;\n let options: EndpointOptions<\n any,\n any,\n any,\n readonly AnyEndpointMiddleware[],\n EndpointErrorDefinitions\n >;\n let handler: EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>;\n\n if (typeof pathOrOptions === \"string\") {\n // createEndpoint('/path', options, handler)\n path = pathOrOptions;\n options = optionsOrHandler as typeof options;\n handler = maybeHandler as typeof handler;\n } else {\n // createEndpoint(options, handler) - path will be set by API plugin from file location\n path = \"\";\n options = pathOrOptions;\n handler = optionsOrHandler as typeof handler;\n }\n\n if (typeof handler !== \"function\") {\n throw new TypeError(\"createEndpoint requires a handler function\");\n }\n\n const middleware = normalizeEndpointMiddleware(options.middleware);\n const errors = normalizeEndpointErrors(options.errors);\n const fail = createEndpointFail(errors);\n const wrappedHandler = (async (ctx: EndpointMiddlewareContext<any, any, any, any>) => {\n const execution = await runEndpointMiddleware(\n middleware,\n ctx,\n handler,\n fail,\n options.invalidates,\n );\n return execution.result;\n }) as typeof handler;\n const {\n middleware: _middleware,\n errors: _errors,\n invalidates: _invalidates,\n ...betterCallOptions\n } = options;\n\n // Create the endpoint - path will be set later by API plugin if not provided\n // We use a temporary path that will be replaced when the router is created\n const endpoint = betterCallEndpoint(\n path || \"/__farm_auto_path__\",\n betterCallOptions as any,\n wrappedHandler as any,\n ) as any;\n\n // Store the path and type information on the endpoint for later access\n // Empty/undefined path means it will be inferred from file location by the API plugin\n endpoint.__path = path || undefined;\n endpoint.__method = options.method || \"GET\";\n endpoint.__autoPath = !path; // Flag to indicate path should be auto-inferred\n endpoint.__handler = wrappedHandler; // Used by Farm's route runtime.\n endpoint.__farmInvoke = (ctx: EndpointMiddlewareContext<any, any, any, any>) =>\n runEndpointMiddleware(middleware, ctx, handler, fail, options.invalidates);\n endpoint.__middleware = middleware;\n endpoint.__sourceHandler = handler;\n endpoint.__invalidates = options.invalidates;\n endpoint.__errors = errors;\n\n // Store type information for inference\n endpoint.__types = {\n body: options.body,\n query: options.query,\n headers: options.headers,\n response: null as any,\n errors,\n };\n\n return endpoint as any;\n}\n\nconst EMPTY_ENDPOINT_MIDDLEWARE = Object.freeze([]) as readonly AnyEndpointMiddleware[];\nconst EMPTY_ENDPOINT_CONTEXT = Object.freeze(Object.create(null)) as Readonly<\n Record<string | symbol, unknown>\n>;\nconst UNSAFE_ENDPOINT_CONTEXT_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction normalizeEndpointErrors(\n definitions: EndpointErrorDefinitions | undefined,\n): Readonly<EndpointErrorDefinitions> {\n if (definitions === undefined) return Object.freeze({});\n if (!isPlainEndpointContext(definitions)) {\n throw new TypeError(\"createEndpoint errors must be an object\");\n }\n\n const normalized: EndpointErrorDefinitions = Object.create(null);\n for (const [code, definition] of Object.entries(definitions)) {\n if (!code.trim()) {\n throw new TypeError(\"Endpoint error codes cannot be empty\");\n }\n if (!definition || typeof definition !== \"object\") {\n throw new TypeError(`Endpoint error \"${code}\" must be an object`);\n }\n if (\n !Number.isInteger(definition.status) ||\n definition.status < 400 ||\n definition.status > 599\n ) {\n throw new TypeError(`Endpoint error \"${code}\" status must be an integer between 400 and 599`);\n }\n if (!definition.schema || typeof definition.schema.parse !== \"function\") {\n throw new TypeError(`Endpoint error \"${code}\" requires a schema with parse()`);\n }\n if (definition.message !== undefined && typeof definition.message !== \"string\") {\n throw new TypeError(`Endpoint error \"${code}\" message must be a string`);\n }\n\n normalized[code] = Object.freeze({ ...definition });\n }\n\n return Object.freeze(normalized);\n}\n\nfunction createEndpointFail(\n definitions: Readonly<EndpointErrorDefinitions>,\n): EndpointFail<EndpointErrorDefinitions> {\n return ((code: string, data: unknown): never => {\n const definition = definitions[code];\n if (!definition) {\n throw new TypeError(`Endpoint error \"${code}\" is not declared`);\n }\n\n const parsed = definition.schema.parse!(data);\n throw new EndpointFailure(code, parsed, {\n status: definition.status,\n message: definition.message ?? \"Request failed\",\n });\n }) as EndpointFail<EndpointErrorDefinitions>;\n}\n\nfunction normalizeEndpointMiddleware(\n middleware: readonly AnyEndpointMiddleware[] | undefined,\n): readonly AnyEndpointMiddleware[] {\n if (middleware === undefined) return EMPTY_ENDPOINT_MIDDLEWARE;\n if (!Array.isArray(middleware)) {\n throw new TypeError(\"createEndpoint middleware must be an array of functions\");\n }\n\n const normalized = [...middleware];\n for (const entry of normalized) {\n if (typeof entry !== \"function\") {\n throw new TypeError(\"createEndpoint middleware entries must be functions\");\n }\n }\n\n return Object.freeze(normalized);\n}\n\nasync function runEndpointMiddleware(\n middleware: readonly AnyEndpointMiddleware[],\n handlerContext: EndpointMiddlewareContext<any, any, any, any>,\n handler: EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>,\n fail: EndpointFail<EndpointErrorDefinitions>,\n invalidations: EndpointInvalidations<any, any, any, any> | undefined,\n): Promise<{\n result: unknown;\n context: Readonly<Record<string | symbol, unknown>>;\n handlerExecuted: boolean;\n invalidations: readonly string[];\n}> {\n let context = createInitialEndpointContext(handlerContext.context);\n\n for (let index = 0; index < middleware.length; index++) {\n const result = await middleware[index]({ ...handlerContext, context });\n\n if (isEndpointResponse(result)) {\n return {\n result,\n context,\n handlerExecuted: false,\n invalidations: [],\n };\n }\n if (result === false) {\n return {\n result: forbiddenEndpointResponse(),\n context,\n handlerExecuted: false,\n invalidations: [],\n };\n }\n if (result === true) continue;\n\n if (!isPlainEndpointContext(result)) {\n throw new TypeError(\n `Endpoint middleware ${index + 1} must return an object, true, false, or a Response`,\n );\n }\n\n context = mergeEndpointContext(context, result, index);\n }\n\n const result = await handler({ ...handlerContext, context, fail });\n return {\n result,\n context,\n handlerExecuted: true,\n invalidations: await applyEndpointInvalidations(\n invalidations,\n {\n ...handlerContext,\n context,\n result,\n },\n result,\n ),\n };\n}\n\nasync function applyEndpointInvalidations(\n declaration: EndpointInvalidations<any, any, any, any> | undefined,\n context: EndpointInvalidationContext<any, any, any, any>,\n result: unknown,\n): Promise<readonly string[]> {\n if (!declaration || (isEndpointResponse(result) && result.status >= 400)) {\n return [];\n }\n\n const targets = typeof declaration === \"function\" ? await declaration(context) : declaration;\n if (!Array.isArray(targets)) {\n throw new TypeError(\n \"Endpoint invalidates must resolve to an array of { key } or { path } targets\",\n );\n }\n\n const clientKeys: string[] = [];\n for (const target of targets) {\n assertEndpointInvalidationTarget(target);\n if (\"key\" in target) {\n invalidate(target.key);\n clientKeys.push(createRouteDataCacheKey(target.key));\n } else {\n revalidatePath(target.path);\n }\n }\n\n return Array.from(new Set(clientKeys));\n}\n\nfunction assertEndpointInvalidationTarget(\n target: unknown,\n): asserts target is EndpointInvalidationTarget {\n if (!target || typeof target !== \"object\") {\n throw new TypeError(\"Endpoint invalidation targets must be { key } or { path } objects\");\n }\n\n if (\"key\" in target) {\n const key = (target as { key?: unknown }).key;\n if (typeof key === \"string\" || Array.isArray(key)) return;\n } else if (\"path\" in target && typeof (target as { path?: unknown }).path === \"string\") {\n return;\n }\n\n throw new TypeError(\n \"Endpoint invalidation targets must contain a string/array key or a path string\",\n );\n}\n\nfunction createInitialEndpointContext(value: unknown) {\n if (value === undefined || value === null) return EMPTY_ENDPOINT_CONTEXT;\n if (!isPlainEndpointContext(value)) {\n throw new TypeError(\"Endpoint context must be a plain object\");\n }\n\n return mergeEndpointContext(EMPTY_ENDPOINT_CONTEXT, value);\n}\n\nfunction mergeEndpointContext(\n current: Readonly<Record<string | symbol, unknown>>,\n added: object,\n middlewareIndex?: number,\n) {\n const next = Object.assign(Object.create(null), current) as Record<string | symbol, unknown>;\n\n for (const key of Reflect.ownKeys(added)) {\n if (!Object.prototype.propertyIsEnumerable.call(added, key)) continue;\n if (typeof key === \"string\" && UNSAFE_ENDPOINT_CONTEXT_KEYS.has(key)) {\n throw new TypeError(`Endpoint middleware cannot provide the unsafe context key \"${key}\"`);\n }\n if (Object.prototype.hasOwnProperty.call(current, key)) {\n const source =\n middlewareIndex === undefined\n ? \"Endpoint context\"\n : `Endpoint middleware ${middlewareIndex + 1}`;\n throw new TypeError(`${source} cannot replace the existing context key \"${String(key)}\"`);\n }\n next[key] = (added as Record<string | symbol, unknown>)[key];\n }\n\n return Object.freeze(next);\n}\n\nfunction isPlainEndpointContext(value: unknown): value is object {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isEndpointResponse(value: unknown): value is Response {\n return (\n value instanceof Response ||\n (typeof value === \"object\" &&\n value !== null &&\n \"headers\" in value &&\n \"status\" in value &&\n typeof (value as Response).arrayBuffer === \"function\")\n );\n}\n\nfunction forbiddenEndpointResponse() {\n return new Response(JSON.stringify({ error: \"Forbidden\" }), {\n status: 403,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\n/**\n * Convenience method for GET requests\n */\nexport function GET<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function GET<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function GET<\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<never, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<never, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<never, TQuery, THeaders, TResponse>;\nexport function GET(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"GET\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"GET\" }, args[1]);\n}\n\n/**\n * Convenience method for HEAD requests\n */\nexport function HEAD<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function HEAD<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function HEAD<\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<never, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<never, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<never, TQuery, THeaders, TResponse>;\nexport function HEAD(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"HEAD\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"HEAD\" }, args[1]);\n}\n\n/**\n * Convenience method for POST requests\n */\nexport function POST<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function POST<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function POST<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function POST(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"POST\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"POST\" }, args[1]);\n}\n\n/**\n * Convenience method for PUT requests\n */\nexport function PUT<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function PUT<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function PUT<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function PUT(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"PUT\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"PUT\" }, args[1]);\n}\n\n/**\n * Convenience method for DELETE requests\n */\nexport function DELETE<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function DELETE<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function DELETE<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function DELETE(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"DELETE\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"DELETE\" }, args[1]);\n}\n\n/**\n * Convenience method for PATCH requests\n */\nexport function PATCH<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function PATCH<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function PATCH<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function PATCH(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"PATCH\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"PATCH\" }, args[1]);\n}\n\n/**\n * Convenience method for OPTIONS requests\n */\nexport function OPTIONS<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function OPTIONS<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function OPTIONS<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function OPTIONS(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"OPTIONS\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"OPTIONS\" }, args[1]);\n}\n","import { _runWithCurrentRequest } from \"../server/request\";\nimport {\n decodeFarmCacheInvalidations,\n encodeFarmCacheInvalidations,\n FARM_CACHE_INVALIDATION_HEADER,\n} from \"../cache-invalidation\";\nimport { isEndpointFailure, type EndpointFailure } from \"./endpoint\";\n\nexport type APIRouteParamValue = string | string[];\nexport type APIRouteParams = Record<string, APIRouteParamValue>;\n\nexport interface APIRouteMatch<T extends { path: string }> {\n route: T;\n params: APIRouteParams;\n}\n\nexport function matchAPIRoute<T extends { path: string }>(\n routes: Map<string, T>,\n pathname: string,\n): APIRouteMatch<T> | null {\n const exactRoute = routes.get(pathname);\n if (exactRoute) {\n return { route: exactRoute, params: {} };\n }\n\n const normalizedPathname = normalizePathname(pathname);\n if (normalizedPathname !== pathname) {\n const normalizedRoute = routes.get(normalizedPathname);\n if (normalizedRoute) {\n return { route: normalizedRoute, params: {} };\n }\n }\n\n for (const route of routes.values()) {\n const params = matchRoutePath(route.path, pathname);\n if (params) {\n return { route, params };\n }\n }\n\n return null;\n}\n\nexport async function invokeAPIRouteEndpoint(\n endpoint: any,\n request: Request,\n params: APIRouteParams = {},\n): Promise<Response> {\n return _runWithCurrentRequest(request, () =>\n invokeAPIRouteEndpointInContext(endpoint, request, params),\n );\n}\n\nasync function invokeAPIRouteEndpointInContext(\n endpoint: any,\n request: Request,\n params: APIRouteParams,\n): Promise<Response> {\n const farmHandler = endpoint.__handler || (isFarmContextHandler(endpoint) ? endpoint : null);\n\n if (!farmHandler) {\n const result = await endpoint(request, {\n params: Promise.resolve(params),\n });\n return normalizeRouteResponse(result);\n }\n\n const url = new URL(request.url);\n const query: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n let body: any = undefined;\n if (request.method.toUpperCase() !== \"GET\" && request.method.toUpperCase() !== \"HEAD\") {\n body = await readJSONBody(request);\n }\n\n const headers = Object.fromEntries(request.headers.entries());\n const types = endpoint.__types || {};\n\n const queryValidation = validateInput(types.query, query, \"Invalid query parameters\");\n if (queryValidation instanceof Response) {\n return queryValidation;\n }\n\n const bodyValidation = validateInput(types.body, body, \"Invalid request body\");\n if (bodyValidation instanceof Response) {\n return bodyValidation;\n }\n\n const headersValidation = validateInput(types.headers, headers, \"Invalid request headers\");\n if (headersValidation instanceof Response) {\n return headersValidation;\n }\n\n const handlerContext = {\n query: queryValidation,\n body: bodyValidation,\n headers: headersValidation,\n request,\n context: {},\n params,\n };\n let execution: {\n result: unknown;\n context: unknown;\n handlerExecuted: boolean;\n invalidations: readonly string[];\n };\n try {\n execution =\n typeof endpoint.__farmInvoke === \"function\"\n ? await endpoint.__farmInvoke(handlerContext)\n : {\n result: await farmHandler(handlerContext),\n context: handlerContext.context,\n handlerExecuted: true,\n invalidations: [],\n };\n } catch (error) {\n if (isEndpointFailure(error)) {\n return createEndpointFailureResponse(error);\n }\n throw error;\n }\n\n const response = normalizeRouteResponse(execution.result);\n return attachEndpointInvalidations(response, execution.invalidations);\n}\n\nexport function normalizeRouteResponse(result: unknown): Response {\n if (isWebResponse(result)) {\n return result;\n }\n\n if (result === undefined) {\n return new Response(null, { status: 204 });\n }\n\n return new Response(JSON.stringify(result), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\nexport function isWebResponse(value: unknown): value is Response {\n return (\n value instanceof Response ||\n (typeof value === \"object\" &&\n value !== null &&\n \"headers\" in value &&\n \"status\" in value &&\n typeof (value as Response).arrayBuffer === \"function\")\n );\n}\n\nfunction attachEndpointInvalidations(response: Response, keys: readonly string[]): Response {\n const existing = decodeFarmCacheInvalidations(\n response.headers.get(FARM_CACHE_INVALIDATION_HEADER),\n );\n const encoded = encodeFarmCacheInvalidations([...existing, ...keys]);\n if (!encoded) return response;\n\n const headers = new Headers(response.headers);\n headers.set(FARM_CACHE_INVALIDATION_HEADER, encoded);\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nexport function createEndpointFailureResponse(failure: EndpointFailure<string, unknown>): Response {\n return new Response(\n JSON.stringify({\n error: {\n code: failure.code,\n message: failure.message,\n data: failure.data,\n },\n }),\n {\n status: failure.status,\n headers: {\n \"cache-control\": \"no-store\",\n \"content-type\": \"application/json\",\n },\n },\n );\n}\n\nfunction isFarmContextHandler(endpoint: unknown): boolean {\n if (typeof endpoint !== \"function\") {\n return false;\n }\n\n const source = Function.prototype.toString.call(endpoint).trim();\n const arrowMatch = source.match(/^(?:async\\s*)?(?:\\(([^)]*)\\)|([A-Za-z_$][\\w$]*))\\s*=>/);\n const functionMatch = source.match(/^(?:async\\s*)?function[^(]*\\(([^)]*)\\)/);\n const firstParameter = (arrowMatch?.[1] || arrowMatch?.[2] || functionMatch?.[1] || \"\")\n .split(\",\")[0]\n .trim();\n\n return firstParameter === \"ctx\" || firstParameter === \"context\" || firstParameter.startsWith(\"{\");\n}\n\nasync function readJSONBody(request: Request): Promise<unknown> {\n try {\n const text = await request.clone().text();\n if (text) {\n return JSON.parse(text);\n }\n } catch {\n // Body might not be JSON.\n }\n\n return undefined;\n}\n\nfunction validateInput(schema: any, value: unknown, error: string): unknown | Response {\n if (!schema || typeof schema.parse !== \"function\") {\n return value;\n }\n\n try {\n return schema.parse(value);\n } catch (validationError: any) {\n return new Response(\n JSON.stringify({\n error,\n details: validationError.errors || validationError.issues || validationError.message,\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n\nfunction matchRoutePath(routePath: string, pathname: string): APIRouteParams | null {\n const routeSegments = getPathSegments(routePath);\n const pathnameSegments = getPathSegments(pathname);\n const params: APIRouteParams = {};\n let pathIndex = 0;\n\n for (const routeSegment of routeSegments) {\n const dynamicSegment = parseDynamicSegment(routeSegment);\n\n if (dynamicSegment?.catchAll) {\n const remainingSegments = pathnameSegments.slice(pathIndex).map(decodePathSegment);\n if (remainingSegments.length === 0 && !dynamicSegment.optional) {\n return null;\n }\n if (remainingSegments.length > 0) {\n params[dynamicSegment.name] = remainingSegments;\n }\n pathIndex = pathnameSegments.length;\n continue;\n }\n\n const pathnameSegment = pathnameSegments[pathIndex];\n if (pathnameSegment === undefined) {\n return null;\n }\n\n if (dynamicSegment) {\n params[dynamicSegment.name] = decodePathSegment(pathnameSegment);\n pathIndex++;\n continue;\n }\n\n if (routeSegment !== pathnameSegment) {\n return null;\n }\n\n pathIndex++;\n }\n\n return pathIndex === pathnameSegments.length ? params : null;\n}\n\nfunction getPathSegments(pathname: string): string[] {\n return normalizePathname(pathname)\n .split(\"/\")\n .filter((segment) => segment.length > 0);\n}\n\nfunction normalizePathname(pathname: string): string {\n if (pathname.length > 1 && pathname.endsWith(\"/\")) {\n return pathname.replace(/\\/+$/, \"\");\n }\n\n return pathname;\n}\n\nfunction parseDynamicSegment(\n segment: string,\n): { name: string; catchAll: boolean; optional: boolean } | null {\n const optionalCatchAll = segment.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/);\n if (optionalCatchAll?.[1]) {\n return { name: optionalCatchAll[1], catchAll: true, optional: true };\n }\n\n const catchAll = segment.match(/^\\[\\.\\.\\.(.+)\\]$/);\n if (catchAll?.[1]) {\n return { name: catchAll[1], catchAll: true, optional: false };\n }\n\n const dynamic = segment.match(/^\\[(.+)\\]$/);\n if (dynamic?.[1]) {\n return { name: dynamic[1], catchAll: false, optional: false };\n }\n\n return null;\n}\n\nfunction decodePathSegment(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n"],"mappings":"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","names":["result"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getFarmClientDataCache
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NRRFGX45.mjs";
|
|
4
4
|
import {
|
|
5
5
|
isFarmServerQueryResult
|
|
6
6
|
} from "./chunk-SCFX4UTD.mjs";
|
|
7
7
|
import {
|
|
8
8
|
createFarmCacheKey
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-GZWT6VI5.mjs";
|
|
10
10
|
import {
|
|
11
11
|
__name
|
|
12
12
|
} from "./chunk-CGILA3WO.mjs";
|
|
@@ -208,4 +208,4 @@ export {
|
|
|
208
208
|
prefetchServerQuery,
|
|
209
209
|
useServerQuery
|
|
210
210
|
};
|
|
211
|
-
//# sourceMappingURL=chunk-
|
|
211
|
+
//# sourceMappingURL=chunk-MH6FKW2I.mjs.map
|
|
@@ -552,7 +552,7 @@ var _MiddlewareManager = class _MiddlewareManager {
|
|
|
552
552
|
if (!nestedMatch.matched) {
|
|
553
553
|
return { matched: false };
|
|
554
554
|
}
|
|
555
|
-
const params = { ...nestedMatch.params
|
|
555
|
+
const params = { ...nestedMatch.params };
|
|
556
556
|
delete params.__farmRest;
|
|
557
557
|
return {
|
|
558
558
|
matched: true,
|
|
@@ -636,4 +636,4 @@ export {
|
|
|
636
636
|
createContext,
|
|
637
637
|
MiddlewareManager
|
|
638
638
|
};
|
|
639
|
-
//# sourceMappingURL=chunk-
|
|
639
|
+
//# sourceMappingURL=chunk-MIUW47JX.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware/context.ts","../src/middleware/manager.ts"],"sourcesContent":["/**\n * Middleware Context Implementation\n */\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { ViteDevServer } from \"vite\";\nimport type { MiddlewareContext, CookieJar, CookieOptions } from \"./types\";\n\n/**\n * Parse cookies from Cookie header\n */\nfunction parseCookies(cookieHeader?: string): Record<string, string> {\n if (!cookieHeader) return {};\n\n return cookieHeader.split(\";\").reduce(\n (cookies, cookie) => {\n const [name, ...rest] = cookie.split(\"=\");\n const value = rest.join(\"=\").trim();\n if (name && value) {\n cookies[name.trim()] = decodeURIComponent(value);\n }\n return cookies;\n },\n {} as Record<string, string>,\n );\n}\n\n/**\n * Serialize a cookie\n */\nfunction serializeCookie(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n\n if (options.maxAge) {\n cookie += `; Max-Age=${options.maxAge}`;\n }\n\n if (options.expires) {\n cookie += `; Expires=${options.expires.toUTCString()}`;\n }\n\n if (options.path) {\n cookie += `; Path=${options.path}`;\n } else {\n cookie += \"; Path=/\";\n }\n\n if (options.domain) {\n cookie += `; Domain=${options.domain}`;\n }\n\n if (options.secure) {\n cookie += \"; Secure\";\n }\n\n if (options.httpOnly) {\n cookie += \"; HttpOnly\";\n }\n\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1)}`;\n }\n\n return cookie;\n}\n\n/**\n * Cookie Jar implementation\n */\nclass CookieJarImpl implements CookieJar {\n private cookies: Record<string, string>;\n private setCookies: string[] = [];\n\n constructor(\n private req: IncomingMessage,\n private res: ServerResponse,\n ) {\n this.cookies = parseCookies(req.headers.cookie);\n }\n\n get(name: string): string | undefined {\n return this.cookies[name];\n }\n\n set(name: string, value: string, options: CookieOptions = {}): void {\n this.cookies[name] = value;\n const cookieString = serializeCookie(name, value, options);\n this.setCookies.push(cookieString);\n\n // Update Set-Cookie header\n this.res.setHeader(\"Set-Cookie\", this.setCookies);\n }\n\n delete(name: string): void {\n delete this.cookies[name];\n const cookieString = serializeCookie(name, \"\", {\n maxAge: 0,\n expires: new Date(0),\n });\n this.setCookies.push(cookieString);\n this.res.setHeader(\"Set-Cookie\", this.setCookies);\n }\n\n getAll(): Record<string, string> {\n return { ...this.cookies };\n }\n}\n\n/**\n * Create a middleware context from request/response\n */\nexport function createContext(\n req: IncomingMessage,\n res: ServerResponse,\n viteServer?: ViteDevServer,\n parent?: MiddlewareContext[\"parent\"],\n): MiddlewareContext {\n const url = new URL(req.url || \"/\", `http://${req.headers.host || \"localhost\"}`);\n const headers = new Map<string, string>();\n const data = parent?.data ? new Map(parent.data) : new Map<string, any>();\n const locals = parent?.locals ? new Map(parent.locals) : new Map<string, any>();\n const cookies = new CookieJarImpl(req, res);\n\n // Copy existing headers\n Object.entries(req.headers).forEach(([key, value]) => {\n if (typeof value === \"string\") {\n headers.set(key, value);\n } else if (Array.isArray(value)) {\n headers.set(key, value.join(\", \"));\n }\n });\n\n if (parent?.headers) {\n for (const [key, value] of Object.entries(parent.headers)) {\n headers.set(key, value);\n }\n }\n\n let handled = false;\n\n const ctx: MiddlewareContext = {\n request: req,\n response: res,\n url,\n pathname: url.pathname,\n searchParams: url.searchParams,\n method: req.method || \"GET\",\n params: {},\n route: url.pathname,\n parent,\n vite: {\n isDev: process.env.NODE_ENV !== \"production\",\n hmr: !!viteServer?.hot,\n server: viteServer,\n },\n data,\n locals,\n headers,\n cookies,\n _handled: false,\n\n redirect(redirectUrl: string, status = 307): void {\n if (handled) {\n console.warn(\"Response already sent, cannot redirect\");\n return;\n }\n\n ctx._redirectUrl = redirectUrl;\n ctx._handled = true;\n handled = true;\n\n res.writeHead(status, {\n Location: redirectUrl,\n \"Content-Type\": \"text/plain\",\n });\n res.end(`Redirecting to ${redirectUrl}`);\n },\n\n rewrite(rewriteUrl: string): void {\n ctx._rewriteUrl = rewriteUrl;\n // Update the URL for downstream middleware\n const newUrl = new URL(rewriteUrl, `http://${req.headers.host || \"localhost\"}`);\n ctx.url = newUrl;\n ctx.pathname = newUrl.pathname;\n ctx.searchParams = newUrl.searchParams;\n // Update the original request URL\n req.url = rewriteUrl;\n },\n\n json(jsonData: any, status = 200): void {\n if (handled) {\n console.warn(\"Response already sent, cannot send JSON\");\n return;\n }\n\n ctx._handled = true;\n handled = true;\n\n res.writeHead(status, {\n \"Content-Type\": \"application/json\",\n });\n res.end(JSON.stringify(jsonData));\n },\n\n text(content: string, status = 200): void {\n if (handled) {\n console.warn(\"Response already sent, cannot send text\");\n return;\n }\n\n ctx._handled = true;\n handled = true;\n\n res.writeHead(status, {\n \"Content-Type\": \"text/plain\",\n });\n res.end(content);\n },\n\n html(content: string, status = 200): void {\n if (handled) {\n console.warn(\"Response already sent, cannot send HTML\");\n return;\n }\n\n ctx._handled = true;\n handled = true;\n\n res.writeHead(status, {\n \"Content-Type\": \"text/html\",\n });\n res.end(content);\n },\n };\n\n return ctx;\n}\n","/**\n * Middleware Manager\n *\n * Discovers and executes middleware files in the file system\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { ViteDevServer } from \"vite\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type {\n FarmMiddlewareConfig,\n MiddlewareFunction,\n MiddlewareMatcher,\n MiddlewareConfig,\n MiddlewareContext,\n MiddlewareResult,\n} from \"./types\";\nimport { createContext } from \"./context\";\nimport { normalizeMiddlewareModule } from \"./module\";\nimport { logger } from \"../utils\";\nimport { sendWebResponse } from \"../server/response\";\nimport { emitFarmEvent } from \"../observability\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\n\nexport interface DiscoveredMiddleware {\n path: string;\n filePath: string;\n handlers: MiddlewareFunction[];\n config?: MiddlewareConfig;\n source?: \"config\" | \"file\";\n}\n\nfunction isMiddlewareResponse(value: unknown): value is Response {\n return value instanceof Response;\n}\n\n/**\n * Middleware Manager - discovers and executes middleware\n */\nexport class MiddlewareManager {\n private middleware: DiscoveredMiddleware[] = [];\n private configMiddleware: DiscoveredMiddleware[] = [];\n private globalConfig?: MiddlewareConfig;\n private viteServer?: ViteDevServer;\n private appDirs: string[];\n private i18n?: ResolvedFarmI18nConfig;\n\n constructor(\n appDir: string | readonly string[],\n viteServer?: ViteDevServer,\n config?: FarmMiddlewareConfig,\n i18n?: ResolvedFarmI18nConfig,\n ) {\n this.appDirs = Array.isArray(appDir) ? [...appDir] : [appDir as string];\n this.viteServer = viteServer;\n this.i18n = i18n;\n this.configure(config);\n }\n\n configure(config?: FarmMiddlewareConfig): void {\n this.configMiddleware = [];\n this.globalConfig = undefined;\n\n if (!config) return;\n\n const entries = Array.isArray(config) ? config : [config];\n\n for (const [index, entry] of entries.entries()) {\n const handlers = this.getConfigHandlers(entry);\n const middlewareConfig = this.toMiddlewareConfig(entry);\n\n if (handlers.length === 0) {\n this.globalConfig = middlewareConfig;\n continue;\n }\n\n this.configMiddleware.push({\n path: \"/\",\n filePath: `farm.config.ts#middleware-${index}`,\n handlers,\n config: middlewareConfig,\n source: \"config\",\n });\n }\n }\n\n /**\n * Discover all middleware.ts files\n */\n async discover(): Promise<void> {\n const middlewareByPath = new Map<string, DiscoveredMiddleware>();\n for (const appDir of this.appDirs) {\n const discovered: DiscoveredMiddleware[] = [];\n await this.discoverInDirectory(appDir, \"/\", discovered);\n for (const middleware of discovered) {\n middlewareByPath.set(middleware.path, middleware);\n }\n }\n this.middleware = Array.from(middlewareByPath.values());\n\n // Sort by path depth (root first, then nested)\n this.middleware.sort((a, b) => {\n const depthA = a.path.split(\"/\").length;\n const depthB = b.path.split(\"/\").length;\n return depthA - depthB;\n });\n\n if (process.env.FARM_VERBOSE && this.middleware.length > 0) {\n logger.success(`Discovered ${this.middleware.length} middleware files`);\n for (const mw of this.middleware) {\n logger.info(` ${mw.path} (${mw.handlers.length} handlers)`);\n }\n }\n }\n\n /**\n * Recursively discover middleware files\n */\n private async discoverInDirectory(\n dir: string,\n routePath: string,\n discovered: DiscoveredMiddleware[],\n ): Promise<void> {\n if (!fs.existsSync(dir)) {\n return;\n }\n\n // Check for middleware.ts in current directory\n const middlewareFile = this.findMiddlewareFile(dir);\n if (middlewareFile) {\n const middleware = await this.loadMiddleware(middlewareFile, routePath);\n if (middleware) {\n discovered.push(middleware);\n }\n }\n\n // Recursively check subdirectories\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && !entry.name.startsWith(\"_\")) {\n const subPath = path.join(dir, entry.name);\n const subRoutePath = path.posix.join(routePath, entry.name);\n await this.discoverInDirectory(subPath, subRoutePath, discovered);\n }\n }\n }\n\n /**\n * Find middleware file in directory\n */\n private findMiddlewareFile(dir: string): string | null {\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\"];\n for (const ext of extensions) {\n const filePath = path.join(dir, `middleware${ext}`);\n if (fs.existsSync(filePath)) {\n return filePath;\n }\n }\n return null;\n }\n\n /**\n * Load a middleware file\n */\n private async loadMiddleware(\n filePath: string,\n routePath: string,\n ): Promise<DiscoveredMiddleware | null> {\n try {\n // Load the module\n let module: any;\n if (this.viteServer) {\n module = await this.viteServer.ssrLoadModule(filePath);\n } else {\n const fileUrl = `file://${filePath}`;\n module = await import(/* @vite-ignore */ fileUrl);\n }\n\n const normalized = normalizeMiddlewareModule(module, routePath);\n if (!normalized) {\n logger.warn(\n `Middleware file ${filePath} must export a default handler or a named middleware handler`,\n );\n return null;\n }\n\n return {\n path: routePath,\n filePath,\n handlers: normalized.handlers,\n config: normalized.config,\n source: \"file\",\n };\n } catch (error) {\n logger.error(`Failed to load middleware ${filePath}: ${error}`);\n return null;\n }\n }\n\n /**\n * Execute middleware for a request\n */\n async execute(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\n const url = new URL(req.url || \"/\", `http://${req.headers.host || \"localhost\"}`);\n const pathname = url.pathname;\n const routePathname = this.i18n?.enabled\n ? stripFarmLocaleFromPathname(pathname, this.i18n)\n : pathname;\n const method = req.method || \"GET\";\n const startTime = Date.now();\n\n let parentData: MiddlewareContext[\"parent\"] | undefined;\n let ctx = createContext(req, res, this.viteServer);\n\n if (this.globalConfig) {\n const globalMatch = this.matchesConfig(routePathname, this.globalConfig, ctx);\n if (!globalMatch.matched) {\n return false;\n }\n if (globalMatch.params) {\n ctx.params = { ...ctx.params, ...globalMatch.params };\n }\n }\n\n // Find applicable middleware (config entries first, then cascading files)\n const applicable: Array<{\n mw: DiscoveredMiddleware;\n routeMatch: { matched: boolean; params?: Record<string, string> };\n }> = [\n ...this.configMiddleware.map((mw) => ({ mw, routeMatch: { matched: true } })),\n ...this.middleware\n .map((mw) => ({ mw, routeMatch: this.matchRoutePath(routePathname, mw.path) }))\n .filter((entry) => entry.routeMatch.matched),\n ];\n\n if (applicable.length === 0) {\n return false; // No middleware to run\n }\n try {\n const pc = require(\"picocolors\");\n const middlewarePaths = applicable.map(({ mw }) => mw.path).join(\", \");\n const log = [\n pc.dim(\"[\") + pc.bold(pc.blue(\"FARM\")) + pc.dim(\"]\"),\n pc.dim(\"[\") + pc.bold(pc.magenta(\"MIDDLEWARE\")) + pc.dim(\"]\"),\n pc.dim(\"[\") + pc.bold(pc.white(method.padEnd(3))) + pc.dim(\"]\"),\n pc.gray(\"Executing middleware: \"),\n pc.gray(pathname),\n pc.dim(` (${(Date.now() - startTime).toFixed(2)}ms)`),\n ].join(\" \");\n console.log(log);\n } catch {\n console.log(\n `[FARM] [MIDDLEWARE] [${method}] Executing ${pathname} (${applicable.length} middleware)`,\n );\n }\n\n // Execute middleware in cascade order\n for (const entry of applicable) {\n // Check matcher configuration\n const { mw, routeMatch } = entry;\n const configMatch = mw.config\n ? this.matchesConfig(routePathname, mw.config, ctx)\n : { matched: true };\n if (!configMatch.matched) {\n continue;\n }\n if (routeMatch.params) {\n ctx.params = { ...ctx.params, ...routeMatch.params };\n }\n if (configMatch.params) {\n ctx.params = { ...ctx.params, ...configMatch.params };\n }\n\n // Create new context with parent data\n if (parentData) {\n ctx = createContext(req, res, this.viteServer, parentData);\n if (routeMatch.params) {\n ctx.params = { ...ctx.params, ...routeMatch.params };\n }\n if (configMatch.params) {\n ctx.params = { ...ctx.params, ...configMatch.params };\n }\n }\n\n const middlewareStartTime = Date.now();\n const middlewareEvent = {\n route: mw.path,\n pathname,\n name: mw.filePath,\n };\n emitFarmEvent({ type: \"middleware.start\", ...middlewareEvent });\n\n try {\n // Execute all handlers in this middleware\n let handlerIndex = 0;\n let returnedResponse: Response | undefined;\n const executeNext = async (): Promise<MiddlewareResult> => {\n if (handlerIndex < mw.handlers.length) {\n const handler = mw.handlers[handlerIndex++];\n const result = await handler(ctx, executeNext);\n if (isMiddlewareResponse(result)) {\n returnedResponse = result;\n return result;\n }\n }\n return returnedResponse;\n };\n\n const result = await executeNext();\n const response = isMiddlewareResponse(result) ? result : returnedResponse;\n if (response) {\n if (!res.headersSent && !res.writableEnded) {\n for (const [key, value] of ctx.headers) {\n try {\n res.setHeader(key, value);\n } catch (error) {}\n }\n }\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: response.status,\n });\n await sendWebResponse(res, response);\n return true;\n }\n\n // Check if response has been sent or handled by middleware helpers.\n if (ctx._handled || res.headersSent || res.writableEnded) {\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: res.statusCode,\n });\n return true;\n }\n\n emitFarmEvent({\n type: \"middleware.complete\",\n ...middlewareEvent,\n durationMs: Date.now() - middlewareStartTime,\n });\n } catch (error) {\n emitFarmEvent({\n type: \"middleware.error\",\n ...middlewareEvent,\n error,\n });\n throw error;\n }\n\n parentData = {\n data: new Map(ctx.data),\n locals: new Map(ctx.locals),\n headers: Object.fromEntries(ctx.headers),\n };\n }\n\n if (!res.headersSent && !res.writableEnded) {\n for (const [key, value] of ctx.headers) {\n try {\n res.setHeader(key, value);\n } catch (error) {}\n }\n }\n\n (req as any).__FARM_MIDDLEWARE_DATA__ = new Map(ctx.data);\n (req as any).__FARM_MIDDLEWARE_CONTEXT__ = new Map(ctx.locals);\n\n return false; // Continue to page rendering\n }\n\n /**\n * Check if pathname matches middleware config\n */\n private matchesConfig(\n pathname: string,\n config: MiddlewareConfig,\n ctx: MiddlewareContext,\n ): { matched: boolean; params?: Record<string, string> } {\n // Check exclusions\n if (config.exclude) {\n for (const pattern of config.exclude) {\n if (this.matchPattern(pattern, pathname).matched) {\n return { matched: false };\n }\n }\n }\n\n // Check matchers\n if (config.matcher) {\n for (const matcher of this.toMatcherList(config.matcher)) {\n if (typeof matcher === \"string\" || matcher instanceof RegExp) {\n const result = this.matchPattern(matcher, pathname);\n if (result.matched) {\n return result;\n }\n } else if (typeof matcher === \"function\") {\n return { matched: matcher(ctx) };\n }\n }\n return { matched: false };\n }\n\n return { matched: true };\n }\n\n /**\n * Match a pattern against pathname\n */\n private matchPattern(\n pattern: string | RegExp,\n pathname: string,\n ): { matched: boolean; params?: Record<string, string> } {\n if (pattern instanceof RegExp) {\n pattern.lastIndex = 0;\n const match = pattern.exec(pathname);\n return {\n matched: !!match,\n params: match?.groups ? { ...match.groups } : undefined,\n };\n }\n\n if (pattern === \"*\" || pattern === \"/(.*)\") {\n return { matched: true };\n }\n\n if (pattern.endsWith(\"(.*)\")) {\n const prefix = pattern.slice(0, -4);\n return { matched: pathname === prefix || pathname.startsWith(`${prefix}/`) };\n }\n\n const { regex, params } = this.compilePathPattern(pattern);\n const match = regex.exec(pathname);\n if (!match) {\n return { matched: false };\n }\n\n const values: Record<string, string> = {};\n params.forEach((param, index) => {\n values[param] = decodeURIComponent(match[index + 1] || \"\");\n });\n\n return {\n matched: true,\n params: Object.keys(values).length > 0 ? values : undefined,\n };\n }\n\n /**\n * Reload middleware (for HMR)\n */\n async reload(): Promise<void> {\n await this.discover();\n }\n\n getMiddlewares(): DiscoveredMiddleware[] {\n return [...this.configMiddleware, ...this.middleware];\n }\n\n hasMiddleware(): boolean {\n return this.configMiddleware.length > 0 || this.middleware.length > 0;\n }\n\n private matchRoutePath(\n pathname: string,\n middlewarePath: string,\n ): { matched: boolean; params?: Record<string, string> } {\n if (middlewarePath === \"/\") return { matched: true };\n\n const exactMatch = this.matchPattern(middlewarePath, pathname);\n if (exactMatch.matched) {\n return exactMatch;\n }\n\n const nestedMatch = this.matchPattern(`${middlewarePath}/:__farmRest*`, pathname);\n if (!nestedMatch.matched) {\n return { matched: false };\n }\n\n const params = { ...(nestedMatch.params || {}) };\n delete params.__farmRest;\n return {\n matched: true,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n }\n\n private toMatcherList(matcher: MiddlewareConfig[\"matcher\"]): MiddlewareMatcher[] {\n if (!matcher) return [];\n return Array.isArray(matcher) ? matcher : [matcher];\n }\n\n private getConfigHandlers(\n entry:\n | MiddlewareConfig\n | (MiddlewareConfig & {\n handler?: MiddlewareFunction;\n handlers?: MiddlewareFunction[];\n }),\n ): MiddlewareFunction[] {\n const handlers: MiddlewareFunction[] = [];\n if (\"handler\" in entry && typeof entry.handler === \"function\") {\n handlers.push(entry.handler);\n }\n if (\"handlers\" in entry && Array.isArray(entry.handlers)) {\n handlers.push(...entry.handlers.filter((handler) => typeof handler === \"function\"));\n }\n return handlers;\n }\n\n private toMiddlewareConfig(\n entry: MiddlewareConfig & {\n handler?: MiddlewareFunction;\n handlers?: MiddlewareFunction[];\n },\n ): MiddlewareConfig {\n const { matcher, exclude, runtime } = entry;\n return { matcher, exclude, runtime };\n }\n\n private compilePathPattern(pattern: string): { regex: RegExp; params: string[] } {\n const params: string[] = [];\n const segments = pattern.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) {\n return { regex: /^\\/$/, params };\n }\n\n const parts = segments.map((segment) => {\n if (segment === \"**\") {\n return \"(?:/.*)?\";\n }\n\n if (segment === \"*\") {\n return \"/[^/]+\";\n }\n\n if (segment.startsWith(\":\")) {\n const { name, modifier } = this.parseColonParam(segment);\n params.push(name);\n\n if (modifier === \"*\") {\n return \"(?:/(.*))?\";\n }\n if (modifier === \"+\") {\n return \"/(.+)\";\n }\n return \"/([^/]+)\";\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n params.push(segment.slice(4, -1));\n return \"(?:/(.*))?\";\n }\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n params.push(segment.slice(1, -1));\n return \"/([^/]+)\";\n }\n\n return `/${this.escapeRegex(segment).replace(/\\\\\\*/g, \"[^/]*\")}`;\n });\n\n return {\n regex: new RegExp(`^${parts.join(\"\")}$`),\n params,\n };\n }\n\n private parseColonParam(segment: string): { name: string; modifier?: string } {\n const raw = segment.slice(1);\n const last = raw[raw.length - 1];\n const modifier = last === \"*\" || last === \"+\" || last === \"?\" ? last : undefined;\n return {\n name: modifier ? raw.slice(0, -1) : raw,\n modifier,\n };\n }\n\n private escapeRegex(value: string): string {\n return value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n }\n}\n"],"mappings":"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","names":["result","match"]}
|
|
1
|
+
{"version":3,"sources":["../src/middleware/context.ts","../src/middleware/manager.ts"],"sourcesContent":["/**\n * Middleware Context Implementation\n */\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { ViteDevServer } from \"vite\";\nimport type { MiddlewareContext, CookieJar, CookieOptions } from \"./types\";\n\n/**\n * Parse cookies from Cookie header\n */\nfunction parseCookies(cookieHeader?: string): Record<string, string> {\n if (!cookieHeader) return {};\n\n return cookieHeader.split(\";\").reduce(\n (cookies, cookie) => {\n const [name, ...rest] = cookie.split(\"=\");\n const value = rest.join(\"=\").trim();\n if (name && value) {\n cookies[name.trim()] = decodeURIComponent(value);\n }\n return cookies;\n },\n {} as Record<string, string>,\n );\n}\n\n/**\n * Serialize a cookie\n */\nfunction serializeCookie(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n\n if (options.maxAge) {\n cookie += `; Max-Age=${options.maxAge}`;\n }\n\n if (options.expires) {\n cookie += `; Expires=${options.expires.toUTCString()}`;\n }\n\n if (options.path) {\n cookie += `; Path=${options.path}`;\n } else {\n cookie += \"; Path=/\";\n }\n\n if (options.domain) {\n cookie += `; Domain=${options.domain}`;\n }\n\n if (options.secure) {\n cookie += \"; Secure\";\n }\n\n if (options.httpOnly) {\n cookie += \"; HttpOnly\";\n }\n\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1)}`;\n }\n\n return cookie;\n}\n\n/**\n * Cookie Jar implementation\n */\nclass CookieJarImpl implements CookieJar {\n private cookies: Record<string, string>;\n private setCookies: string[] = [];\n\n constructor(\n private req: IncomingMessage,\n private res: ServerResponse,\n ) {\n this.cookies = parseCookies(req.headers.cookie);\n }\n\n get(name: string): string | undefined {\n return this.cookies[name];\n }\n\n set(name: string, value: string, options: CookieOptions = {}): void {\n this.cookies[name] = value;\n const cookieString = serializeCookie(name, value, options);\n this.setCookies.push(cookieString);\n\n // Update Set-Cookie header\n this.res.setHeader(\"Set-Cookie\", this.setCookies);\n }\n\n delete(name: string): void {\n delete this.cookies[name];\n const cookieString = serializeCookie(name, \"\", {\n maxAge: 0,\n expires: new Date(0),\n });\n this.setCookies.push(cookieString);\n this.res.setHeader(\"Set-Cookie\", this.setCookies);\n }\n\n getAll(): Record<string, string> {\n return { ...this.cookies };\n }\n}\n\n/**\n * Create a middleware context from request/response\n */\nexport function createContext(\n req: IncomingMessage,\n res: ServerResponse,\n viteServer?: ViteDevServer,\n parent?: MiddlewareContext[\"parent\"],\n): MiddlewareContext {\n const url = new URL(req.url || \"/\", `http://${req.headers.host || \"localhost\"}`);\n const headers = new Map<string, string>();\n const data = parent?.data ? new Map(parent.data) : new Map<string, any>();\n const locals = parent?.locals ? new Map(parent.locals) : new Map<string, any>();\n const cookies = new CookieJarImpl(req, res);\n\n // Copy existing headers\n Object.entries(req.headers).forEach(([key, value]) => {\n if (typeof value === \"string\") {\n headers.set(key, value);\n } else if (Array.isArray(value)) {\n headers.set(key, value.join(\", \"));\n }\n });\n\n if (parent?.headers) {\n for (const [key, value] of Object.entries(parent.headers)) {\n headers.set(key, value);\n }\n }\n\n let handled = false;\n\n const ctx: MiddlewareContext = {\n request: req,\n response: res,\n url,\n pathname: url.pathname,\n searchParams: url.searchParams,\n method: req.method || \"GET\",\n params: {},\n route: url.pathname,\n parent,\n vite: {\n isDev: process.env.NODE_ENV !== \"production\",\n hmr: !!viteServer?.hot,\n server: viteServer,\n },\n data,\n locals,\n headers,\n cookies,\n _handled: false,\n\n redirect(redirectUrl: string, status = 307): void {\n if (handled) {\n console.warn(\"Response already sent, cannot redirect\");\n return;\n }\n\n ctx._redirectUrl = redirectUrl;\n ctx._handled = true;\n handled = true;\n\n res.writeHead(status, {\n Location: redirectUrl,\n \"Content-Type\": \"text/plain\",\n });\n res.end(`Redirecting to ${redirectUrl}`);\n },\n\n rewrite(rewriteUrl: string): void {\n ctx._rewriteUrl = rewriteUrl;\n // Update the URL for downstream middleware\n const newUrl = new URL(rewriteUrl, `http://${req.headers.host || \"localhost\"}`);\n ctx.url = newUrl;\n ctx.pathname = newUrl.pathname;\n ctx.searchParams = newUrl.searchParams;\n // Update the original request URL\n req.url = rewriteUrl;\n },\n\n json(jsonData: any, status = 200): void {\n if (handled) {\n console.warn(\"Response already sent, cannot send JSON\");\n return;\n }\n\n ctx._handled = true;\n handled = true;\n\n res.writeHead(status, {\n \"Content-Type\": \"application/json\",\n });\n res.end(JSON.stringify(jsonData));\n },\n\n text(content: string, status = 200): void {\n if (handled) {\n console.warn(\"Response already sent, cannot send text\");\n return;\n }\n\n ctx._handled = true;\n handled = true;\n\n res.writeHead(status, {\n \"Content-Type\": \"text/plain\",\n });\n res.end(content);\n },\n\n html(content: string, status = 200): void {\n if (handled) {\n console.warn(\"Response already sent, cannot send HTML\");\n return;\n }\n\n ctx._handled = true;\n handled = true;\n\n res.writeHead(status, {\n \"Content-Type\": \"text/html\",\n });\n res.end(content);\n },\n };\n\n return ctx;\n}\n","/**\n * Middleware Manager\n *\n * Discovers and executes middleware files in the file system\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { ViteDevServer } from \"vite\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type {\n FarmMiddlewareConfig,\n MiddlewareFunction,\n MiddlewareMatcher,\n MiddlewareConfig,\n MiddlewareContext,\n MiddlewareResult,\n} from \"./types\";\nimport { createContext } from \"./context\";\nimport { normalizeMiddlewareModule } from \"./module\";\nimport { logger } from \"../utils\";\nimport { sendWebResponse } from \"../server/response\";\nimport { emitFarmEvent } from \"../observability\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\n\nexport interface DiscoveredMiddleware {\n path: string;\n filePath: string;\n handlers: MiddlewareFunction[];\n config?: MiddlewareConfig;\n source?: \"config\" | \"file\";\n}\n\nfunction isMiddlewareResponse(value: unknown): value is Response {\n return value instanceof Response;\n}\n\n/**\n * Middleware Manager - discovers and executes middleware\n */\nexport class MiddlewareManager {\n private middleware: DiscoveredMiddleware[] = [];\n private configMiddleware: DiscoveredMiddleware[] = [];\n private globalConfig?: MiddlewareConfig;\n private viteServer?: ViteDevServer;\n private appDirs: string[];\n private i18n?: ResolvedFarmI18nConfig;\n\n constructor(\n appDir: string | readonly string[],\n viteServer?: ViteDevServer,\n config?: FarmMiddlewareConfig,\n i18n?: ResolvedFarmI18nConfig,\n ) {\n this.appDirs = Array.isArray(appDir) ? [...appDir] : [appDir as string];\n this.viteServer = viteServer;\n this.i18n = i18n;\n this.configure(config);\n }\n\n configure(config?: FarmMiddlewareConfig): void {\n this.configMiddleware = [];\n this.globalConfig = undefined;\n\n if (!config) return;\n\n const entries = Array.isArray(config) ? config : [config];\n\n for (const [index, entry] of entries.entries()) {\n const handlers = this.getConfigHandlers(entry);\n const middlewareConfig = this.toMiddlewareConfig(entry);\n\n if (handlers.length === 0) {\n this.globalConfig = middlewareConfig;\n continue;\n }\n\n this.configMiddleware.push({\n path: \"/\",\n filePath: `farm.config.ts#middleware-${index}`,\n handlers,\n config: middlewareConfig,\n source: \"config\",\n });\n }\n }\n\n /**\n * Discover all middleware.ts files\n */\n async discover(): Promise<void> {\n const middlewareByPath = new Map<string, DiscoveredMiddleware>();\n for (const appDir of this.appDirs) {\n const discovered: DiscoveredMiddleware[] = [];\n await this.discoverInDirectory(appDir, \"/\", discovered);\n for (const middleware of discovered) {\n middlewareByPath.set(middleware.path, middleware);\n }\n }\n this.middleware = Array.from(middlewareByPath.values());\n\n // Sort by path depth (root first, then nested)\n this.middleware.sort((a, b) => {\n const depthA = a.path.split(\"/\").length;\n const depthB = b.path.split(\"/\").length;\n return depthA - depthB;\n });\n\n if (process.env.FARM_VERBOSE && this.middleware.length > 0) {\n logger.success(`Discovered ${this.middleware.length} middleware files`);\n for (const mw of this.middleware) {\n logger.info(` ${mw.path} (${mw.handlers.length} handlers)`);\n }\n }\n }\n\n /**\n * Recursively discover middleware files\n */\n private async discoverInDirectory(\n dir: string,\n routePath: string,\n discovered: DiscoveredMiddleware[],\n ): Promise<void> {\n if (!fs.existsSync(dir)) {\n return;\n }\n\n // Check for middleware.ts in current directory\n const middlewareFile = this.findMiddlewareFile(dir);\n if (middlewareFile) {\n const middleware = await this.loadMiddleware(middlewareFile, routePath);\n if (middleware) {\n discovered.push(middleware);\n }\n }\n\n // Recursively check subdirectories\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && !entry.name.startsWith(\"_\")) {\n const subPath = path.join(dir, entry.name);\n const subRoutePath = path.posix.join(routePath, entry.name);\n await this.discoverInDirectory(subPath, subRoutePath, discovered);\n }\n }\n }\n\n /**\n * Find middleware file in directory\n */\n private findMiddlewareFile(dir: string): string | null {\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\"];\n for (const ext of extensions) {\n const filePath = path.join(dir, `middleware${ext}`);\n if (fs.existsSync(filePath)) {\n return filePath;\n }\n }\n return null;\n }\n\n /**\n * Load a middleware file\n */\n private async loadMiddleware(\n filePath: string,\n routePath: string,\n ): Promise<DiscoveredMiddleware | null> {\n try {\n // Load the module\n let module: any;\n if (this.viteServer) {\n module = await this.viteServer.ssrLoadModule(filePath);\n } else {\n const fileUrl = `file://${filePath}`;\n module = await import(/* @vite-ignore */ fileUrl);\n }\n\n const normalized = normalizeMiddlewareModule(module, routePath);\n if (!normalized) {\n logger.warn(\n `Middleware file ${filePath} must export a default handler or a named middleware handler`,\n );\n return null;\n }\n\n return {\n path: routePath,\n filePath,\n handlers: normalized.handlers,\n config: normalized.config,\n source: \"file\",\n };\n } catch (error) {\n logger.error(`Failed to load middleware ${filePath}: ${error}`);\n return null;\n }\n }\n\n /**\n * Execute middleware for a request\n */\n async execute(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\n const url = new URL(req.url || \"/\", `http://${req.headers.host || \"localhost\"}`);\n const pathname = url.pathname;\n const routePathname = this.i18n?.enabled\n ? stripFarmLocaleFromPathname(pathname, this.i18n)\n : pathname;\n const method = req.method || \"GET\";\n const startTime = Date.now();\n\n let parentData: MiddlewareContext[\"parent\"] | undefined;\n let ctx = createContext(req, res, this.viteServer);\n\n if (this.globalConfig) {\n const globalMatch = this.matchesConfig(routePathname, this.globalConfig, ctx);\n if (!globalMatch.matched) {\n return false;\n }\n if (globalMatch.params) {\n ctx.params = { ...ctx.params, ...globalMatch.params };\n }\n }\n\n // Find applicable middleware (config entries first, then cascading files)\n const applicable: Array<{\n mw: DiscoveredMiddleware;\n routeMatch: { matched: boolean; params?: Record<string, string> };\n }> = [\n ...this.configMiddleware.map((mw) => ({ mw, routeMatch: { matched: true } })),\n ...this.middleware\n .map((mw) => ({ mw, routeMatch: this.matchRoutePath(routePathname, mw.path) }))\n .filter((entry) => entry.routeMatch.matched),\n ];\n\n if (applicable.length === 0) {\n return false; // No middleware to run\n }\n try {\n const pc = require(\"picocolors\");\n const middlewarePaths = applicable.map(({ mw }) => mw.path).join(\", \");\n const log = [\n pc.dim(\"[\") + pc.bold(pc.blue(\"FARM\")) + pc.dim(\"]\"),\n pc.dim(\"[\") + pc.bold(pc.magenta(\"MIDDLEWARE\")) + pc.dim(\"]\"),\n pc.dim(\"[\") + pc.bold(pc.white(method.padEnd(3))) + pc.dim(\"]\"),\n pc.gray(\"Executing middleware: \"),\n pc.gray(pathname),\n pc.dim(` (${(Date.now() - startTime).toFixed(2)}ms)`),\n ].join(\" \");\n console.log(log);\n } catch {\n console.log(\n `[FARM] [MIDDLEWARE] [${method}] Executing ${pathname} (${applicable.length} middleware)`,\n );\n }\n\n // Execute middleware in cascade order\n for (const entry of applicable) {\n // Check matcher configuration\n const { mw, routeMatch } = entry;\n const configMatch = mw.config\n ? this.matchesConfig(routePathname, mw.config, ctx)\n : { matched: true };\n if (!configMatch.matched) {\n continue;\n }\n if (routeMatch.params) {\n ctx.params = { ...ctx.params, ...routeMatch.params };\n }\n if (configMatch.params) {\n ctx.params = { ...ctx.params, ...configMatch.params };\n }\n\n // Create new context with parent data\n if (parentData) {\n ctx = createContext(req, res, this.viteServer, parentData);\n if (routeMatch.params) {\n ctx.params = { ...ctx.params, ...routeMatch.params };\n }\n if (configMatch.params) {\n ctx.params = { ...ctx.params, ...configMatch.params };\n }\n }\n\n const middlewareStartTime = Date.now();\n const middlewareEvent = {\n route: mw.path,\n pathname,\n name: mw.filePath,\n };\n emitFarmEvent({ type: \"middleware.start\", ...middlewareEvent });\n\n try {\n // Execute all handlers in this middleware\n let handlerIndex = 0;\n let returnedResponse: Response | undefined;\n const executeNext = async (): Promise<MiddlewareResult> => {\n if (handlerIndex < mw.handlers.length) {\n const handler = mw.handlers[handlerIndex++];\n const result = await handler(ctx, executeNext);\n if (isMiddlewareResponse(result)) {\n returnedResponse = result;\n return result;\n }\n }\n return returnedResponse;\n };\n\n const result = await executeNext();\n const response = isMiddlewareResponse(result) ? result : returnedResponse;\n if (response) {\n if (!res.headersSent && !res.writableEnded) {\n for (const [key, value] of ctx.headers) {\n try {\n res.setHeader(key, value);\n } catch (error) {}\n }\n }\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: response.status,\n });\n await sendWebResponse(res, response);\n return true;\n }\n\n // Check if response has been sent or handled by middleware helpers.\n if (ctx._handled || res.headersSent || res.writableEnded) {\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: res.statusCode,\n });\n return true;\n }\n\n emitFarmEvent({\n type: \"middleware.complete\",\n ...middlewareEvent,\n durationMs: Date.now() - middlewareStartTime,\n });\n } catch (error) {\n emitFarmEvent({\n type: \"middleware.error\",\n ...middlewareEvent,\n error,\n });\n throw error;\n }\n\n parentData = {\n data: new Map(ctx.data),\n locals: new Map(ctx.locals),\n headers: Object.fromEntries(ctx.headers),\n };\n }\n\n if (!res.headersSent && !res.writableEnded) {\n for (const [key, value] of ctx.headers) {\n try {\n res.setHeader(key, value);\n } catch (error) {}\n }\n }\n\n (req as any).__FARM_MIDDLEWARE_DATA__ = new Map(ctx.data);\n (req as any).__FARM_MIDDLEWARE_CONTEXT__ = new Map(ctx.locals);\n\n return false; // Continue to page rendering\n }\n\n /**\n * Check if pathname matches middleware config\n */\n private matchesConfig(\n pathname: string,\n config: MiddlewareConfig,\n ctx: MiddlewareContext,\n ): { matched: boolean; params?: Record<string, string> } {\n // Check exclusions\n if (config.exclude) {\n for (const pattern of config.exclude) {\n if (this.matchPattern(pattern, pathname).matched) {\n return { matched: false };\n }\n }\n }\n\n // Check matchers\n if (config.matcher) {\n for (const matcher of this.toMatcherList(config.matcher)) {\n if (typeof matcher === \"string\" || matcher instanceof RegExp) {\n const result = this.matchPattern(matcher, pathname);\n if (result.matched) {\n return result;\n }\n } else if (typeof matcher === \"function\") {\n return { matched: matcher(ctx) };\n }\n }\n return { matched: false };\n }\n\n return { matched: true };\n }\n\n /**\n * Match a pattern against pathname\n */\n private matchPattern(\n pattern: string | RegExp,\n pathname: string,\n ): { matched: boolean; params?: Record<string, string> } {\n if (pattern instanceof RegExp) {\n pattern.lastIndex = 0;\n const match = pattern.exec(pathname);\n return {\n matched: !!match,\n params: match?.groups ? { ...match.groups } : undefined,\n };\n }\n\n if (pattern === \"*\" || pattern === \"/(.*)\") {\n return { matched: true };\n }\n\n if (pattern.endsWith(\"(.*)\")) {\n const prefix = pattern.slice(0, -4);\n return { matched: pathname === prefix || pathname.startsWith(`${prefix}/`) };\n }\n\n const { regex, params } = this.compilePathPattern(pattern);\n const match = regex.exec(pathname);\n if (!match) {\n return { matched: false };\n }\n\n const values: Record<string, string> = {};\n params.forEach((param, index) => {\n values[param] = decodeURIComponent(match[index + 1] || \"\");\n });\n\n return {\n matched: true,\n params: Object.keys(values).length > 0 ? values : undefined,\n };\n }\n\n /**\n * Reload middleware (for HMR)\n */\n async reload(): Promise<void> {\n await this.discover();\n }\n\n getMiddlewares(): DiscoveredMiddleware[] {\n return [...this.configMiddleware, ...this.middleware];\n }\n\n hasMiddleware(): boolean {\n return this.configMiddleware.length > 0 || this.middleware.length > 0;\n }\n\n private matchRoutePath(\n pathname: string,\n middlewarePath: string,\n ): { matched: boolean; params?: Record<string, string> } {\n if (middlewarePath === \"/\") return { matched: true };\n\n const exactMatch = this.matchPattern(middlewarePath, pathname);\n if (exactMatch.matched) {\n return exactMatch;\n }\n\n const nestedMatch = this.matchPattern(`${middlewarePath}/:__farmRest*`, pathname);\n if (!nestedMatch.matched) {\n return { matched: false };\n }\n\n const params = { ...nestedMatch.params };\n delete params.__farmRest;\n return {\n matched: true,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n }\n\n private toMatcherList(matcher: MiddlewareConfig[\"matcher\"]): MiddlewareMatcher[] {\n if (!matcher) return [];\n return Array.isArray(matcher) ? matcher : [matcher];\n }\n\n private getConfigHandlers(\n entry:\n | MiddlewareConfig\n | (MiddlewareConfig & {\n handler?: MiddlewareFunction;\n handlers?: MiddlewareFunction[];\n }),\n ): MiddlewareFunction[] {\n const handlers: MiddlewareFunction[] = [];\n if (\"handler\" in entry && typeof entry.handler === \"function\") {\n handlers.push(entry.handler);\n }\n if (\"handlers\" in entry && Array.isArray(entry.handlers)) {\n handlers.push(...entry.handlers.filter((handler) => typeof handler === \"function\"));\n }\n return handlers;\n }\n\n private toMiddlewareConfig(\n entry: MiddlewareConfig & {\n handler?: MiddlewareFunction;\n handlers?: MiddlewareFunction[];\n },\n ): MiddlewareConfig {\n const { matcher, exclude, runtime } = entry;\n return { matcher, exclude, runtime };\n }\n\n private compilePathPattern(pattern: string): { regex: RegExp; params: string[] } {\n const params: string[] = [];\n const segments = pattern.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) {\n return { regex: /^\\/$/, params };\n }\n\n const parts = segments.map((segment) => {\n if (segment === \"**\") {\n return \"(?:/.*)?\";\n }\n\n if (segment === \"*\") {\n return \"/[^/]+\";\n }\n\n if (segment.startsWith(\":\")) {\n const { name, modifier } = this.parseColonParam(segment);\n params.push(name);\n\n if (modifier === \"*\") {\n return \"(?:/(.*))?\";\n }\n if (modifier === \"+\") {\n return \"/(.+)\";\n }\n return \"/([^/]+)\";\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n params.push(segment.slice(4, -1));\n return \"(?:/(.*))?\";\n }\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n params.push(segment.slice(1, -1));\n return \"/([^/]+)\";\n }\n\n return `/${this.escapeRegex(segment).replace(/\\\\\\*/g, \"[^/]*\")}`;\n });\n\n return {\n regex: new RegExp(`^${parts.join(\"\")}$`),\n params,\n };\n }\n\n private parseColonParam(segment: string): { name: string; modifier?: string } {\n const raw = segment.slice(1);\n const last = raw[raw.length - 1];\n const modifier = last === \"*\" || last === \"+\" || last === \"?\" ? last : undefined;\n return {\n name: modifier ? raw.slice(0, -1) : raw,\n modifier,\n };\n }\n\n private escapeRegex(value: string): string {\n return value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n }\n}\n"],"mappings":"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","names":["result","match"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createRouteDataCacheKey
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-GZWT6VI5.mjs";
|
|
4
4
|
import {
|
|
5
5
|
subscribeFarmCacheInvalidation
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SHRJG6OG.mjs";
|
|
7
7
|
import {
|
|
8
8
|
__name
|
|
9
9
|
} from "./chunk-CGILA3WO.mjs";
|
|
@@ -154,4 +154,4 @@ export {
|
|
|
154
154
|
getFarmClientDataCache,
|
|
155
155
|
normalizeFarmClientCacheKey
|
|
156
156
|
};
|
|
157
|
-
//# sourceMappingURL=chunk-
|
|
157
|
+
//# sourceMappingURL=chunk-NRRFGX45.mjs.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
FARM_DOCS_LAST_MODIFIED_MANIFEST,
|
|
10
10
|
createFarmDocsLastModifiedManifest,
|
|
11
11
|
getFarmDocsRouteTypeEntries
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-BIOIOWXZ.mjs";
|
|
13
13
|
import {
|
|
14
14
|
generateFarmDocsSearchClientRuntime,
|
|
15
15
|
isFarmDocsSearchEnabled,
|
|
@@ -17,11 +17,11 @@ import {
|
|
|
17
17
|
} from "./chunk-V7RBCSDJ.mjs";
|
|
18
18
|
import {
|
|
19
19
|
mergeFarmViteConfig
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-6VS6CKAV.mjs";
|
|
21
21
|
import {
|
|
22
22
|
hasCustomFarmRouteContext,
|
|
23
23
|
resolveDeployOutputPath
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-T543TMFY.mjs";
|
|
25
25
|
import {
|
|
26
26
|
PluginManager
|
|
27
27
|
} from "./chunk-C3DLZMBU.mjs";
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
generateFarmTypeArtifacts,
|
|
32
32
|
getClientModuleMetadata,
|
|
33
33
|
resolveRouteRenderingConfigFromFile
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-XJSHJN4M.mjs";
|
|
35
35
|
import {
|
|
36
36
|
farmEnvironmentFunctionsPlugin
|
|
37
37
|
} from "./chunk-V6WE6JSZ.mjs";
|
|
@@ -40,32 +40,29 @@ import {
|
|
|
40
40
|
} from "./chunk-74YTBPTY.mjs";
|
|
41
41
|
import {
|
|
42
42
|
routeRulesToNitroRouteRules
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-YW7OBE6Q.mjs";
|
|
44
44
|
import {
|
|
45
45
|
isFarmMarkdownPageFile
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-QGQX7SFC.mjs";
|
|
47
47
|
import {
|
|
48
48
|
applyFarmWorkflowVercelCrons,
|
|
49
49
|
prepareFarmWorkflowsForNitro
|
|
50
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-XIVV5IWN.mjs";
|
|
51
51
|
import {
|
|
52
52
|
applyFarmCronVercelCrons,
|
|
53
53
|
createFarmCronCloudflareConfig,
|
|
54
54
|
mergeScheduledTasks,
|
|
55
55
|
prepareFarmCronForNitro
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-GXASWWJU.mjs";
|
|
57
57
|
import {
|
|
58
58
|
getFarmIntegrationPluginServerRuntime
|
|
59
59
|
} from "./chunk-K4667E2Q.mjs";
|
|
60
60
|
import {
|
|
61
61
|
APIRouteManager
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-LG3YINQN.mjs";
|
|
63
63
|
import {
|
|
64
64
|
readFarmI18nCatalogs
|
|
65
|
-
} from "./chunk-
|
|
66
|
-
import {
|
|
67
|
-
logger
|
|
68
|
-
} from "./chunk-J4FNJ5IU.mjs";
|
|
65
|
+
} from "./chunk-2ED5Q2GH.mjs";
|
|
69
66
|
import {
|
|
70
67
|
createFarmRouteRuntimeKey,
|
|
71
68
|
getFarmRouteRuntimeConfig,
|
|
@@ -74,7 +71,10 @@ import {
|
|
|
74
71
|
normalizeFarmRouteRuntimeConfig,
|
|
75
72
|
resolveFarmRouteRuleRuntimeConfig,
|
|
76
73
|
resolveFarmRouteRuntimeConfig
|
|
77
|
-
} from "./chunk-
|
|
74
|
+
} from "./chunk-GQVGIUSN.mjs";
|
|
75
|
+
import {
|
|
76
|
+
logger
|
|
77
|
+
} from "./chunk-J4FNJ5IU.mjs";
|
|
78
78
|
import {
|
|
79
79
|
__name
|
|
80
80
|
} from "./chunk-CGILA3WO.mjs";
|
|
@@ -299,8 +299,8 @@ function compareRuntimeRoutes(left, right) {
|
|
|
299
299
|
__name(compareRuntimeRoutes, "compareRuntimeRoutes");
|
|
300
300
|
function getPatternSpecificity(pattern) {
|
|
301
301
|
return normalizePattern(pattern).split("/").filter(Boolean).reduce((score, segment) => {
|
|
302
|
-
if (segment === "**" ||
|
|
303
|
-
if (segment === "*" ||
|
|
302
|
+
if (segment === "**" || segment.startsWith("[[...")) return score + 1;
|
|
303
|
+
if (segment === "*" || segment.startsWith("[...")) return score + 10;
|
|
304
304
|
if (/^\[.+\]$/.test(segment)) return score + 50;
|
|
305
305
|
return score + 100;
|
|
306
306
|
}, 0);
|
|
@@ -4876,9 +4876,8 @@ async function buildNitroUniversal(config, routeManager, apiRouteManager, server
|
|
|
4876
4876
|
const nitroEntryPath = path3.join(ssrOutputDir, "nitro-entry.mjs");
|
|
4877
4877
|
const nitroEntryCode = `
|
|
4878
4878
|
// Farm.js Nitro Entry
|
|
4879
|
-
// This file
|
|
4879
|
+
// This file adapts Farm's Web fetch handler to Nitro's event handler contract.
|
|
4880
4880
|
|
|
4881
|
-
import { defineEventHandler } from 'h3'
|
|
4882
4881
|
import handler from './${ssrEntryFile}'
|
|
4883
4882
|
|
|
4884
4883
|
function mergeVaryHeaders(target, source) {
|
|
@@ -4916,8 +4915,8 @@ function createResponseFinishedHook(event) {
|
|
|
4916
4915
|
}
|
|
4917
4916
|
}
|
|
4918
4917
|
|
|
4919
|
-
// Export the
|
|
4920
|
-
export default
|
|
4918
|
+
// Export the event handler for Nitro
|
|
4919
|
+
export default async function farmNitroEventHandler(event) {
|
|
4921
4920
|
const response = await handler.fetch(event.req, {
|
|
4922
4921
|
waitUntil: (promise) => event.waitUntil(promise),
|
|
4923
4922
|
onResponseFinished: createResponseFinishedHook(event),
|
|
@@ -4928,7 +4927,7 @@ export default defineEventHandler(async (event) => {
|
|
|
4928
4927
|
const farmVary = response.headers.get('Vary')
|
|
4929
4928
|
if (farmVary) mergeVaryHeaders(event.res.headers, farmVary)
|
|
4930
4929
|
return response
|
|
4931
|
-
}
|
|
4930
|
+
}
|
|
4932
4931
|
`.trim();
|
|
4933
4932
|
await fs.writeFile(nitroEntryPath, nitroEntryCode);
|
|
4934
4933
|
const prebuiltSSRPlugin = createExternalSSRBundlePlugin(
|
|
@@ -5346,8 +5345,8 @@ async function copySharpRuntime(config, root, nitroFuncDir, fs) {
|
|
|
5346
5345
|
await fs.mkdir(path3.dirname(targetDir), { recursive: true });
|
|
5347
5346
|
const packageRequire = createRequire(packageJsonPath);
|
|
5348
5347
|
const dependencies = {
|
|
5349
|
-
...packageJson.dependencies
|
|
5350
|
-
...packageJson.optionalDependencies
|
|
5348
|
+
...packageJson.dependencies,
|
|
5349
|
+
...packageJson.optionalDependencies
|
|
5351
5350
|
};
|
|
5352
5351
|
await Promise.all([
|
|
5353
5352
|
fs.cp(packageDir, targetDir, {
|
|
@@ -5667,7 +5666,7 @@ async function buildSSR(viteBuild, config, root, srcDir, outputDir) {
|
|
|
5667
5666
|
__name(buildSSR, "buildSSR");
|
|
5668
5667
|
async function buildNitro(config, routeManager, apiRouteManager, serverRenderer, preset, root, distDir, pluginManager) {
|
|
5669
5668
|
const [{ createNitroConfig }, { createNitro, build: nitroBuild }] = await Promise.all([
|
|
5670
|
-
import("./nitro-
|
|
5669
|
+
import("./nitro-QO5LV6QK.mjs"),
|
|
5671
5670
|
import("nitro")
|
|
5672
5671
|
]);
|
|
5673
5672
|
let nitroConfig = await createNitroConfig(
|
|
@@ -5760,4 +5759,4 @@ __name(buildNitro, "buildNitro");
|
|
|
5760
5759
|
export {
|
|
5761
5760
|
build
|
|
5762
5761
|
};
|
|
5763
|
-
//# sourceMappingURL=chunk-
|
|
5762
|
+
//# sourceMappingURL=chunk-OHC6VCDI.mjs.map
|