@farm.js/core 0.1.0-beta.1 → 0.1.0-beta.4
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 +2 -1
- package/dist/agent-runtime.d.ts +2 -1
- package/dist/api/route-manager.cjs +410 -15
- package/dist/api/route-manager.cjs.map +1 -1
- package/dist/api/route-manager.d.mts +4 -2
- package/dist/api/route-manager.d.ts +4 -2
- package/dist/api/route-manager.mjs +9 -8
- package/dist/api/runtime.cjs +748 -9
- package/dist/api/runtime.cjs.map +1 -1
- package/dist/api/runtime.d.mts +3 -16
- package/dist/api/runtime.d.ts +3 -16
- package/dist/api/runtime.mjs +8 -1
- package/dist/api.cjs +1243 -342
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.mts +5 -147
- package/dist/api.d.ts +5 -147
- package/dist/api.mjs +51 -21
- package/dist/{app-CFRNJXP1.d.ts → app-BjN-da13.d.ts} +38 -3
- package/dist/{app-BiX4qb-d.d.mts → app-CakAr8Be.d.mts} +38 -3
- package/dist/app-markdown.cjs +1 -1
- package/dist/app-markdown.cjs.map +1 -1
- package/dist/app-markdown.d.mts +2 -1
- package/dist/app-markdown.d.ts +2 -1
- package/dist/app-markdown.mjs +1 -1
- package/dist/cache.cjs +414 -12
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.d.mts +120 -6
- package/dist/cache.d.ts +120 -6
- package/dist/cache.mjs +11 -3
- package/dist/{chunk-Y7A27276.mjs → chunk-2CUKEMVR.mjs} +349 -15
- package/dist/chunk-2CUKEMVR.mjs.map +1 -0
- 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-TRORP7E4.mjs → chunk-3U3ZUQAQ.mjs} +2 -2
- package/dist/{chunk-25D7G34K.mjs → chunk-65A7QIKI.mjs} +5 -5
- package/dist/{chunk-25D7G34K.mjs.map → chunk-65A7QIKI.mjs.map} +1 -1
- package/dist/{chunk-G3B5BRDY.mjs → chunk-AJWRO5WE.mjs} +539 -61
- package/dist/chunk-AJWRO5WE.mjs.map +1 -0
- package/dist/chunk-ALCLXXTY.mjs +187 -0
- package/dist/chunk-ALCLXXTY.mjs.map +1 -0
- package/dist/{chunk-CHFHNEMO.mjs → chunk-AOBXKNS5.mjs} +627 -84
- package/dist/chunk-AOBXKNS5.mjs.map +1 -0
- package/dist/{chunk-B6N4ZB2H.mjs → chunk-C2ROET2V.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-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-3QJO55ZF.mjs → chunk-HNIQFZKB.mjs} +5 -3
- package/dist/{chunk-3QJO55ZF.mjs.map → chunk-HNIQFZKB.mjs.map} +1 -1
- package/dist/{chunk-PRNYWD7K.mjs → chunk-JDEOUK5V.mjs} +67 -239
- package/dist/chunk-JDEOUK5V.mjs.map +1 -0
- 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-UHE2TTLK.mjs → chunk-NM3CRAAL.mjs} +9 -8
- package/dist/chunk-NM3CRAAL.mjs.map +1 -0
- package/dist/chunk-PFE6GMNE.mjs +603 -0
- package/dist/chunk-PFE6GMNE.mjs.map +1 -0
- package/dist/{chunk-S2XHZS7W.mjs → chunk-QGQX7SFC.mjs} +2 -2
- package/dist/chunk-QGQX7SFC.mjs.map +1 -0
- package/dist/{chunk-RKI6TN3A.mjs → chunk-QM746KUO.mjs} +9 -2
- package/dist/chunk-QM746KUO.mjs.map +1 -0
- package/dist/chunk-RBRLLZL5.mjs +81 -0
- package/dist/chunk-RBRLLZL5.mjs.map +1 -0
- package/dist/{chunk-HXP3ZSPC.mjs → chunk-SADGIRS2.mjs} +3 -3
- package/dist/{chunk-6XDUHOEM.mjs → chunk-TQAEEJB4.mjs} +3 -3
- package/dist/{chunk-AGS7UJ52.mjs → chunk-UB5UOSHB.mjs} +24 -12
- package/dist/chunk-UB5UOSHB.mjs.map +1 -0
- package/dist/{chunk-SXZTEK3V.mjs → chunk-UXUAWNO5.mjs} +2 -2
- package/dist/chunk-V3XURYJO.mjs +756 -0
- package/dist/chunk-V3XURYJO.mjs.map +1 -0
- package/dist/{chunk-TU4YJICB.mjs → chunk-VVKWFZAH.mjs} +41 -16
- package/dist/chunk-VVKWFZAH.mjs.map +1 -0
- package/dist/{chunk-JLWMCADZ.mjs → chunk-VY2UYN5R.mjs} +24 -4
- package/dist/chunk-VY2UYN5R.mjs.map +1 -0
- package/dist/{chunk-QFQRHRZS.mjs → chunk-W2CRQFF6.mjs} +151 -23
- package/dist/chunk-W2CRQFF6.mjs.map +1 -0
- package/dist/chunk-W4UIVMVI.mjs +10 -0
- package/dist/chunk-W4UIVMVI.mjs.map +1 -0
- package/dist/{chunk-Y2OJJD7R.mjs → chunk-XIVV5IWN.mjs} +7 -9
- package/dist/chunk-XIVV5IWN.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-YHU7SS6L.mjs → chunk-Z5CQMP54.mjs} +11 -11
- 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-BT1mFQas.d.mts} +55 -10
- package/dist/{client-Dkc03WP8.d.ts → client-Nn0q4eO4.d.ts} +55 -10
- package/dist/{client-plugins-BZnpeTGA.d.ts → client-plugins-Cw4qUGsw.d.ts} +7 -0
- package/dist/{client-plugins-g4bzuCmo.d.mts → client-plugins-DQQ1adXM.d.mts} +7 -0
- package/dist/client-plugins.d.mts +2 -1
- package/dist/client-plugins.d.ts +2 -1
- package/dist/client.cjs +922 -91
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.mts +121 -3
- package/dist/client.d.ts +121 -3
- package/dist/client.mjs +23 -16
- package/dist/config.d.mts +2 -1
- package/dist/config.d.ts +2 -1
- package/dist/cron.cjs.map +1 -1
- package/dist/cron.mjs +1 -1
- package/dist/{devtools-AE4RVXCM.mjs → devtools-LVC3VB5P.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 +14 -2
- 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 +2852 -463
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +13 -12
- package/dist/index.d.ts +13 -12
- package/dist/index.mjs +152 -109
- package/dist/index.mjs.map +1 -1
- package/dist/integrations.d.mts +2 -1
- package/dist/integrations.d.ts +2 -1
- package/dist/internal/build-runtime.cjs +1616 -149
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.d.mts +4 -3
- package/dist/internal/build-runtime.d.ts +4 -3
- package/dist/internal/build-runtime.mjs +27 -25
- package/dist/internal/client-runtime.cjs.map +1 -1
- package/dist/internal/client-runtime.mjs +1 -1
- package/dist/internal/config-runtime.cjs +13 -2
- package/dist/internal/config-runtime.cjs.map +1 -1
- package/dist/internal/config-runtime.d.mts +3 -2
- package/dist/internal/config-runtime.d.ts +3 -2
- package/dist/internal/config-runtime.mjs +9 -9
- package/dist/internal/production-runtime.cjs +285 -9
- package/dist/internal/production-runtime.cjs.map +1 -1
- package/dist/internal/production-runtime.d.mts +4 -4
- package/dist/internal/production-runtime.d.ts +4 -4
- package/dist/internal/production-runtime.mjs +10 -8
- package/dist/{metadata-DAXRaOHx.d.ts → metadata-BAPg_Nmo.d.ts} +1 -1
- package/dist/{metadata-C9NZxMDW.d.mts → metadata-_6i9oFG3.d.mts} +1 -1
- package/dist/middleware.cjs +2 -2
- package/dist/middleware.cjs.map +1 -1
- package/dist/middleware.d.mts +4 -3
- package/dist/middleware.d.ts +4 -3
- package/dist/middleware.mjs +3 -3
- package/dist/navigation.cjs +40 -15
- 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 +1032 -92
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.mts +2 -1
- package/dist/plugin.d.ts +2 -1
- package/dist/plugin.mjs +23 -21
- package/dist/{production-runtime-DRkCHUvJ.d.ts → production-runtime-BoJDc5mc.d.ts} +1 -1
- package/dist/{production-runtime-flrjp_nC.d.mts → production-runtime-DPfgMV9Y.d.mts} +1 -1
- package/dist/routes.cjs +276 -6
- 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-9nQjVM7X.d.mts +206 -0
- package/dist/runtime-DgeS2skB.d.ts +206 -0
- package/dist/server-action-security.cjs +28 -10
- package/dist/server-action-security.cjs.map +1 -1
- package/dist/server-action-security.d.mts +2 -1
- package/dist/server-action-security.d.ts +2 -1
- package/dist/server-action-security.mjs +2 -2
- package/dist/server-fn-client.cjs.map +1 -1
- package/dist/server-fn-client.d.mts +1 -0
- package/dist/server-fn-client.d.ts +1 -0
- package/dist/server-fn-client.mjs +1 -1
- package/dist/server-fn.cjs +785 -3
- package/dist/server-fn.cjs.map +1 -1
- package/dist/server-fn.d.mts +10 -1
- package/dist/server-fn.d.ts +10 -1
- package/dist/server-fn.mjs +6 -3
- package/dist/server-plugins.d.mts +3 -2
- package/dist/server-plugins.d.ts +3 -2
- package/dist/server-query-client.cjs +278 -7
- package/dist/server-query-client.cjs.map +1 -1
- package/dist/server-query-client.mjs +4 -4
- package/dist/server-query.cjs +381 -10
- package/dist/server-query.cjs.map +1 -1
- package/dist/server-query.mjs +5 -5
- package/dist/server.cjs +1233 -118
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.mts +8 -7
- package/dist/server.d.ts +8 -7
- package/dist/server.mjs +53 -33
- package/dist/server.mjs.map +1 -1
- package/dist/testing.cjs +436 -25
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.mts +4 -3
- package/dist/testing.d.ts +4 -3
- package/dist/testing.mjs +19 -18
- package/dist/testing.mjs.map +1 -1
- package/dist/transport-BmbGTXA5.d.mts +49 -0
- package/dist/transport-BmbGTXA5.d.ts +49 -0
- package/dist/{utils-DOXXivjL.d.mts → utils-CHXlMDkg.d.mts} +1 -1
- package/dist/{utils-DA1yo54_.d.ts → utils-Drsyz1Vj.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 +1039 -93
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.mts +2 -1
- package/dist/vite.d.ts +2 -1
- package/dist/vite.mjs +23 -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/api.d.ts +44 -0
- package/types/client.d.ts +220 -16
- package/dist/chunk-4PTK6KT4.mjs +0 -364
- package/dist/chunk-4PTK6KT4.mjs.map +0 -1
- package/dist/chunk-AGS7UJ52.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-G3B5BRDY.mjs.map +0 -1
- package/dist/chunk-GZP5W4K3.mjs.map +0 -1
- package/dist/chunk-JLWMCADZ.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-TU4YJICB.mjs.map +0 -1
- package/dist/chunk-TXCFGOHW.mjs +0 -42
- 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-TRORP7E4.mjs.map → chunk-3U3ZUQAQ.mjs.map} +0 -0
- /package/dist/{chunk-B6N4ZB2H.mjs.map → chunk-C2ROET2V.mjs.map} +0 -0
- /package/dist/{chunk-HXP3ZSPC.mjs.map → chunk-SADGIRS2.mjs.map} +0 -0
- /package/dist/{chunk-6XDUHOEM.mjs.map → chunk-TQAEEJB4.mjs.map} +0 -0
- /package/dist/{chunk-SXZTEK3V.mjs.map → chunk-UXUAWNO5.mjs.map} +0 -0
- /package/dist/{chunk-YHU7SS6L.mjs.map → chunk-Z5CQMP54.mjs.map} +0 -0
- /package/dist/{devtools-AE4RVXCM.mjs.map → devtools-LVC3VB5P.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server-fn-client.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { ServerFn } from \"./server-fn\";\n\nexport type ServerFnActionStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport type ServerFnSubmit<TInput, TResult> = [unknown] extends [TInput]\n ? (input?: TInput | FormData) => Promise<TResult>\n : (input: TInput | FormData) => Promise<TResult>;\n\nexport type ServerFnOptimisticContext<TInput, TResult> = {\n input: TInput | FormData | undefined;\n formData?: FormData;\n current: TResult | null;\n};\n\nexport type UseServerFnOptions<\n TResult,\n TError extends Error = Error,\n TInput = unknown,\n> = {\n initialResult?: TResult | null;\n resetOnSubmit?: boolean;\n throwOnFormError?: boolean;\n optimistic?: (context: ServerFnOptimisticContext<TInput, TResult>) => TResult | null | undefined;\n rollbackOnError?: boolean;\n onSuccess?: (result: TResult) => void;\n onError?: (error: TError) => void;\n onSettled?: (result: TResult | null, error: TError | null) => void;\n};\n\nexport type UseServerFnReturn<TInput, TResult, TError extends Error = Error> = {\n pending: boolean;\n status: ServerFnActionStatus;\n result: TResult | null;\n error: TError | null;\n submit: ServerFnSubmit<TInput, TResult>;\n formAction: (formData: FormData) => Promise<void>;\n reset: () => void;\n};\n\ntype ServerFnActionState<TResult, TError extends Error> = {\n pendingCount: number;\n status: ServerFnActionStatus;\n result: TResult | null;\n error: TError | null;\n};\n\ntype ServerFnActionCallbacks<TResult, TError extends Error> = Pick<\n UseServerFnOptions<TResult, TError, unknown>,\n \"onError\" | \"onSettled\" | \"onSuccess\" | \"throwOnFormError\"\n>;\n\nexport function useServerFn<TInput, TResult, TError extends Error = Error>(\n serverFn: ServerFn<TInput, TResult>,\n options: UseServerFnOptions<TResult, TError, TInput> = {},\n): UseServerFnReturn<TInput, TResult, TError> {\n const { initialResult = null, resetOnSubmit = true } = options;\n const callbacksRef = useRef<ServerFnActionCallbacks<TResult, TError>>({});\n const requestIdRef = useRef(0);\n const initialState: ServerFnActionState<TResult, TError> = {\n pendingCount: 0,\n status: \"idle\",\n result: initialResult,\n error: null,\n };\n const stateRef = useRef<ServerFnActionState<TResult, TError>>(initialState);\n const [state, setState] = useState<ServerFnActionState<TResult, TError>>(initialState);\n const setActionState = useCallback(\n (\n value:\n | ServerFnActionState<TResult, TError>\n | ((\n current: ServerFnActionState<TResult, TError>,\n ) => ServerFnActionState<TResult, TError>),\n ) => {\n setState((current) => {\n const next = typeof value === \"function\" ? value(current) : value;\n stateRef.current = next;\n return next;\n });\n },\n [],\n );\n\n callbacksRef.current = {\n onError: options.onError,\n onSettled: options.onSettled,\n onSuccess: options.onSuccess,\n throwOnFormError: options.throwOnFormError,\n };\n\n const submit = useCallback(\n async (input?: TInput | FormData) => {\n const requestId = ++requestIdRef.current;\n const formData = isFormData(input) ? input : undefined;\n const previousResult = stateRef.current.result;\n const optimisticResult = options.optimistic?.({\n input,\n formData,\n current: previousResult,\n });\n const hasOptimisticResult = optimisticResult !== undefined;\n\n setActionState((current) => ({\n pendingCount: current.pendingCount + 1,\n status: \"pending\",\n result: hasOptimisticResult\n ? optimisticResult\n : resetOnSubmit\n ? null\n : current.result,\n error: null,\n }));\n\n try {\n const result = await serverFn(input as TInput | FormData);\n const isLatestRequest = requestId === requestIdRef.current;\n\n setActionState((current) => {\n const pendingCount = Math.max(0, current.pendingCount - 1);\n\n if (!isLatestRequest) {\n return {\n ...current,\n pendingCount,\n status: pendingCount > 0 ? \"pending\" : current.status,\n };\n }\n\n return {\n pendingCount,\n status: pendingCount > 0 ? \"pending\" : \"success\",\n result,\n error: null,\n };\n });\n\n if (isLatestRequest) {\n callbacksRef.current.onSuccess?.(result);\n callbacksRef.current.onSettled?.(result, null);\n }\n\n return result;\n } catch (cause) {\n const error = normalizeServerFnError(cause) as TError;\n const isLatestRequest = requestId === requestIdRef.current;\n\n setActionState((current) => {\n const pendingCount = Math.max(0, current.pendingCount - 1);\n\n if (!isLatestRequest) {\n return {\n ...current,\n pendingCount,\n status: pendingCount > 0 ? \"pending\" : current.status,\n };\n }\n\n return {\n pendingCount,\n status: pendingCount > 0 ? \"pending\" : \"error\",\n result:\n hasOptimisticResult && options.rollbackOnError\n ? previousResult\n : resetOnSubmit\n ? null\n : current.result,\n error,\n };\n });\n\n if (isLatestRequest) {\n callbacksRef.current.onError?.(error);\n callbacksRef.current.onSettled?.(null, error);\n }\n\n throw error;\n }\n },\n [options.optimistic, options.rollbackOnError, resetOnSubmit, serverFn, setActionState],\n ) as ServerFnSubmit<TInput, TResult>;\n\n const formAction = useCallback(\n async (formData: FormData) => {\n try {\n await submit(formData as TInput | FormData);\n } catch (error) {\n if (callbacksRef.current.throwOnFormError) {\n throw error;\n }\n }\n },\n [submit],\n );\n\n const reset = useCallback(() => {\n requestIdRef.current += 1;\n setActionState({\n pendingCount: 0,\n status: \"idle\",\n result: initialResult,\n error: null,\n });\n }, [initialResult, setActionState]);\n\n return useMemo(\n () => ({\n pending: state.pendingCount > 0,\n status: state.status,\n result: state.result,\n error: state.error,\n submit,\n formAction,\n reset,\n }),\n [formAction, reset, state.error, state.pendingCount, state.result, state.status, submit],\n );\n}\n\nfunction normalizeServerFnError(error: unknown) {\n if (error instanceof Error) return error;\n\n const normalized = new Error(typeof error === \"string\" ? error : \"Server function failed\");\n (normalized as Error & { cause?: unknown }).cause = error;\n return normalized;\n}\n\nfunction isFormData(value: unknown): value is FormData {\n if (!value || typeof value !== \"object\") return false;\n\n if (typeof FormData !== \"undefined\" && value instanceof FormData) {\n return true;\n }\n\n return (\n Object.prototype.toString.call(value) === \"[object FormData]\" &&\n typeof (value as { entries?: unknown }).entries === \"function\"\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server-fn.ts"],"sourcesContent":["import { getServerActionExecutionContext, getServerActionSignal } from \"./server-action-security\";\nimport { _resolveCurrentRequest } from \"./server/request-bridge\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\n// Generic schema type that works with Zod v3/v4 and similar validator APIs.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ServerFnSchema = {\n _input?: any;\n _output?: any;\n parse?: (data: unknown) => any;\n parseAsync?: (data: unknown) => Promise<any>;\n safeParse?: (data: unknown) => any;\n safeParseAsync?: (data: unknown) => Promise<any>;\n};\n\nexport type InferServerFnSchemaInput<T> = T extends { _input: infer I } ? I : unknown;\nexport type InferServerFnSchemaOutput<T> = T extends { _output: infer O }\n ? O\n : T extends { parse: (data: unknown) => infer R }\n ? R\n : unknown;\n\nexport type ServerFnFormInput = FormData;\n\ntype Simplify<T> = { [TKey in keyof T]: T[TKey] } & {};\ntype AssignContext<TCurrent extends object, TNext extends object> = Simplify<\n Omit<TCurrent, keyof TNext> & TNext\n>;\ntype MiddlewareContext<TMiddleware> =\n TMiddleware extends ServerFnMiddleware<infer TContext> ? TContext : {};\n\nexport type ServerFnMiddlewareContext<\n TMiddlewares extends readonly AnyServerFnMiddleware[],\n TContext extends object = {},\n> = TMiddlewares extends readonly [infer TMiddleware, ...infer TRest]\n ? TMiddleware extends AnyServerFnMiddleware\n ? TRest extends readonly AnyServerFnMiddleware[]\n ? ServerFnMiddlewareContext<TRest, AssignContext<TContext, MiddlewareContext<TMiddleware>>>\n : TContext\n : TContext\n : number extends TMiddlewares[\"length\"]\n ? Simplify<TContext & MiddlewareContext<TMiddlewares[number]>>\n : Simplify<TContext>;\n\ndeclare const SERVER_FN_MIDDLEWARE_CONTEXT: unique symbol;\n\nexport type ServerFnMiddlewareContinuation<TContext extends object = {}> = {\n readonly [SERVER_FN_MIDDLEWARE_CONTEXT]: TContext;\n};\n\nexport type ServerFnMiddlewareNext = <TContext extends object = {}>(options?: {\n context?: TContext;\n}) => Promise<ServerFnMiddlewareContinuation<TContext>>;\n\nexport type ServerFnContext<TInput, TContext extends object = {}> = {\n input: TInput;\n rawInput: unknown;\n formData?: FormData;\n /** The action request when invoked across the network. Undefined for direct server calls. */\n request?: Request;\n /** Aborts when the underlying action request is cancelled. */\n signal: AbortSignal;\n /** Context produced by this server function's middleware chain. */\n context: Readonly<TContext>;\n};\n\nexport type ServerFnHandler<TInput, TResult, TContext extends object = {}> = (\n ctx: ServerFnContext<TInput, TContext>,\n) => MaybePromise<TResult>;\n\nexport type ServerFnMiddlewareHandlerContext<TContext extends object = {}> = ServerFnContext<\n unknown,\n TContext\n> & {\n next: ServerFnMiddlewareNext;\n};\n\nexport type ServerFnMiddlewareHandler<\n TContext extends object = {},\n TProvidedContext extends object = {},\n> = (\n ctx: ServerFnMiddlewareHandlerContext<TContext>,\n) => MaybePromise<ServerFnMiddlewareContinuation<TProvidedContext>>;\n\nexport type ServerFnMiddleware<TContext extends object = {}> = {\n readonly __farmServerFnMiddleware: true;\n readonly __farmServerFnMiddlewareContext?: TContext;\n readonly middleware: readonly AnyServerFnMiddleware[];\n readonly handler: ServerFnMiddlewareHandler<any, any>;\n};\n\nexport type AnyServerFnMiddleware = ServerFnMiddleware<any>;\n\nexport type ServerFnMiddlewareOptions<\n TMiddlewares extends readonly AnyServerFnMiddleware[],\n TProvidedContext extends object,\n> = {\n middleware?: TMiddlewares;\n handler: ServerFnMiddlewareHandler<ServerFnMiddlewareContext<TMiddlewares>, TProvidedContext>;\n};\n\nexport type ServerFnOptions<\n TSchema extends ServerFnSchema | undefined,\n TResult,\n TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n> = {\n input?: TSchema;\n output?: undefined;\n middleware?: TMiddlewares;\n handler: ServerFnHandler<\n TSchema extends ServerFnSchema ? InferServerFnSchemaOutput<TSchema> : unknown,\n TResult,\n ServerFnMiddlewareContext<TMiddlewares>\n >;\n};\n\nexport type ServerFnOutputOptions<\n TInputSchema extends ServerFnSchema | undefined,\n TOutputSchema extends ServerFnSchema,\n TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n> = {\n input?: TInputSchema;\n output: TOutputSchema;\n middleware?: TMiddlewares;\n handler: ServerFnHandler<\n TInputSchema extends ServerFnSchema ? InferServerFnSchemaOutput<TInputSchema> : unknown,\n unknown,\n ServerFnMiddlewareContext<TMiddlewares>\n >;\n};\n\nexport type ServerFn<TInput, TResult> = ([unknown] extends [TInput]\n ? (input?: TInput | FormData) => Promise<TResult>\n : (input: TInput | FormData) => Promise<TResult>) & {\n readonly __farmServerFn: true;\n readonly __farmServerFnInput?: unknown;\n readonly __farmServerFnOutput?: unknown;\n};\n\nexport const FARM_SERVER_FN_SYMBOL = Symbol.for(\"farm.server-fn\");\n\nconst UNSAFE_FORM_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nexport function createServerMiddleware<\n const TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n TProvidedContext extends object = {},\n>(\n options: ServerFnMiddlewareOptions<TMiddlewares, TProvidedContext>,\n): ServerFnMiddleware<AssignContext<ServerFnMiddlewareContext<TMiddlewares>, TProvidedContext>>;\nexport function createServerMiddleware(options: {\n middleware?: readonly AnyServerFnMiddleware[];\n handler: ServerFnMiddlewareHandler<any, any>;\n}): ServerFnMiddleware<any> {\n if (!options || typeof options.handler !== \"function\") {\n throw new TypeError(\"createServerMiddleware requires a handler function\");\n }\n\n const middleware = Object.freeze([...(options.middleware ?? [])]);\n for (const entry of middleware) {\n assertServerFnMiddleware(entry);\n }\n\n return Object.freeze({\n __farmServerFnMiddleware: true as const,\n middleware,\n handler: options.handler,\n });\n}\n\nexport function createServerFn<\n TInputSchema extends ServerFnSchema,\n TOutputSchema extends ServerFnSchema,\n const TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n>(\n options: ServerFnOutputOptions<TInputSchema, TOutputSchema, TMiddlewares>,\n): ServerFn<\n InferServerFnSchemaInput<TInputSchema>,\n Awaited<InferServerFnSchemaOutput<TOutputSchema>>\n>;\nexport function createServerFn<\n TOutputSchema extends ServerFnSchema,\n const TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n>(\n options: ServerFnOutputOptions<undefined, TOutputSchema, TMiddlewares>,\n): ServerFn<unknown, Awaited<InferServerFnSchemaOutput<TOutputSchema>>>;\nexport function createServerFn<\n TSchema extends ServerFnSchema,\n TResult,\n const TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n>(\n options: ServerFnOptions<TSchema, TResult, TMiddlewares>,\n): ServerFn<InferServerFnSchemaInput<TSchema>, Awaited<TResult>>;\nexport function createServerFn<\n TResult,\n const TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n>(options: ServerFnOptions<undefined, TResult, TMiddlewares>): ServerFn<unknown, Awaited<TResult>>;\nexport function createServerFn(options: {\n input?: ServerFnSchema;\n output?: ServerFnSchema;\n middleware?: readonly AnyServerFnMiddleware[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handler: ServerFnHandler<any, any, any>;\n}) {\n if (!options || typeof options.handler !== \"function\") {\n throw new TypeError(\"createServerFn requires a handler function\");\n }\n\n const middleware = resolveServerFnMiddleware(options.middleware);\n const serverFn = async (value: unknown) => {\n const formData = isFormData(value) ? value : undefined;\n const rawInput = formData ? formDataToObject(formData) : value;\n const input = await _parseServerFnSchema(options.input, rawInput, \"input\");\n const executionContext = getServerActionExecutionContext();\n const request = executionContext?.request ?? _resolveCurrentRequest();\n const signal = executionContext?.signal ?? request?.signal ?? getServerActionSignal();\n const handlerContext = {\n input,\n rawInput,\n formData,\n request,\n signal,\n };\n const result = await runServerFnMiddleware(middleware, handlerContext, options.handler);\n\n return _parseServerFnSchema(options.output, result, \"output\");\n };\n\n Object.defineProperties(serverFn, {\n [FARM_SERVER_FN_SYMBOL]: {\n value: true,\n enumerable: false,\n },\n __farmServerFn: {\n value: true,\n enumerable: false,\n },\n __farmServerFnInput: {\n value: options.input,\n enumerable: false,\n },\n __farmServerFnOutput: {\n value: options.output,\n enumerable: false,\n },\n __farmServerFnMiddleware: {\n value: middleware,\n enumerable: false,\n },\n });\n\n return serverFn as ServerFn<unknown, unknown>;\n}\n\ntype ServerFnBaseContext = Omit<ServerFnContext<unknown, {}>, \"context\">;\n\nasync function runServerFnMiddleware(\n middleware: readonly AnyServerFnMiddleware[],\n handlerContext: ServerFnBaseContext,\n handler: ServerFnHandler<any, any, any>,\n) {\n const dispatch = async (index: number, context: Readonly<object>): Promise<unknown> => {\n const current = middleware[index];\n if (!current) {\n return handler({ ...handlerContext, context });\n }\n\n let nextCalled = false;\n const result = await current.handler({\n ...handlerContext,\n context,\n next: async (nextOptions) => {\n if (nextCalled) {\n throw new Error(\"Server function middleware next() can only be called once\");\n }\n nextCalled = true;\n\n return dispatch(index + 1, mergeServerFnContext(context, nextOptions?.context)) as Promise<\n ServerFnMiddlewareContinuation<any>\n >;\n },\n });\n\n if (!nextCalled) {\n throw new Error(\"Server function middleware must call next()\");\n }\n\n return result;\n };\n\n return dispatch(0, Object.freeze(Object.create(null)));\n}\n\nfunction resolveServerFnMiddleware(\n middleware: readonly AnyServerFnMiddleware[] | undefined,\n): readonly AnyServerFnMiddleware[] {\n const resolved: AnyServerFnMiddleware[] = [];\n const seen = new Set<AnyServerFnMiddleware>();\n const visiting = new Set<AnyServerFnMiddleware>();\n\n const visit = (entry: AnyServerFnMiddleware) => {\n assertServerFnMiddleware(entry);\n if (seen.has(entry)) return;\n if (visiting.has(entry)) {\n throw new Error(\"Server function middleware dependencies cannot contain a cycle\");\n }\n\n visiting.add(entry);\n for (const dependency of entry.middleware) {\n visit(dependency);\n }\n visiting.delete(entry);\n seen.add(entry);\n resolved.push(entry);\n };\n\n for (const entry of middleware ?? []) {\n visit(entry);\n }\n\n return Object.freeze(resolved);\n}\n\nfunction assertServerFnMiddleware(value: unknown): asserts value is AnyServerFnMiddleware {\n if (\n !value ||\n typeof value !== \"object\" ||\n (value as { __farmServerFnMiddleware?: unknown }).__farmServerFnMiddleware !== true ||\n typeof (value as { handler?: unknown }).handler !== \"function\" ||\n !Array.isArray((value as { middleware?: unknown }).middleware)\n ) {\n throw new TypeError(\"createServerFn middleware must be created with createServerMiddleware\");\n }\n}\n\nfunction mergeServerFnContext(current: Readonly<object>, added: object | undefined) {\n if (\n added !== undefined &&\n (added === null || typeof added !== \"object\" || Array.isArray(added))\n ) {\n throw new TypeError(\"Server function middleware context must be an object\");\n }\n\n return Object.freeze(Object.assign(Object.create(null), current, added));\n}\n\nexport async function _parseServerFnSchema(\n schema: ServerFnSchema | undefined,\n value: unknown,\n contract: \"input\" | \"output\",\n owner = \"createServerFn\",\n) {\n if (!schema) return value;\n\n if (typeof schema.safeParseAsync === \"function\") {\n const result = await schema.safeParseAsync(value);\n return unwrapSafeParseResult(result);\n }\n\n if (typeof schema.safeParse === \"function\") {\n const result = schema.safeParse(value);\n return unwrapSafeParseResult(await result);\n }\n\n if (typeof schema.parseAsync === \"function\") {\n return schema.parseAsync(value);\n }\n\n if (typeof schema.parse === \"function\") {\n return schema.parse(value);\n }\n\n throw new TypeError(`${owner} ${contract} must provide parse, parseAsync, or safeParse`);\n}\n\nfunction unwrapSafeParseResult(result: unknown) {\n if (\n result &&\n typeof result === \"object\" &&\n \"success\" in result &&\n (result as { success: boolean }).success === false\n ) {\n throw (result as { error?: unknown }).error;\n }\n\n if (\n result &&\n typeof result === \"object\" &&\n \"success\" in result &&\n (result as { success: boolean }).success === true\n ) {\n return (result as unknown as { data: unknown }).data;\n }\n\n return result;\n}\n\nfunction formDataToObject(formData: FormData) {\n const output: Record<string, FormDataEntryValue | FormDataEntryValue[]> = Object.create(null);\n\n for (const [key, value] of formData.entries()) {\n if (!isSafeFormKey(key)) continue;\n\n const existing = output[key];\n if (existing === undefined) {\n output[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n output[key] = [existing, value];\n }\n }\n\n return output;\n}\n\nfunction isSafeFormKey(key: string) {\n return !key.startsWith(\"$ACTION_\") && !UNSAFE_FORM_KEYS.has(key);\n}\n\nfunction isFormData(value: unknown): value is FormData {\n if (!value || typeof value !== \"object\") return false;\n\n if (typeof FormData !== \"undefined\" && value instanceof FormData) {\n return true;\n }\n\n return (\n Object.prototype.toString.call(value) === \"[object FormData]\" &&\n typeof (value as { entries?: unknown }).entries === \"function\"\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware/production-runtime.ts"],"sourcesContent":["import type {\n CookieJar,\n CookieOptions,\n FarmMiddlewareConfig,\n MiddlewareConfig,\n MiddlewareContext,\n MiddlewareFunction,\n MiddlewareMatcher,\n MiddlewareModule,\n MiddlewareResult,\n} from \"./types\";\nimport { emitFarmEvent } from \"../observability\";\nimport { normalizeMiddlewareModule } from \"./module\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\n\nexport interface ProductionMiddlewareModuleEntry {\n path: string;\n filePath?: string;\n module: MiddlewareModule | Record<string, any>;\n}\n\nexport interface ProductionMiddlewareRunnerOptions {\n config?: FarmMiddlewareConfig | null;\n modules?: ProductionMiddlewareModuleEntry[];\n i18n?: ResolvedFarmI18nConfig;\n}\n\nexport interface ProductionMiddlewareResult {\n request: Request;\n response: Response | null;\n data: Map<string, any>;\n context: Map<string, any>;\n headers: Headers;\n handled: boolean;\n}\n\ninterface ProductionMiddlewareEntry {\n path: string;\n filePath: string;\n handlers: MiddlewareFunction[];\n config?: MiddlewareConfig;\n source: \"config\" | \"file\";\n}\n\ninterface WebMiddlewareContextState {\n ctx: MiddlewareContext;\n getRequest(): Request;\n getResponse(): Response | null;\n}\n\nfunction parseCookies(cookieHeader?: string | null): 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\nfunction serializeCookie(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n\n if (options.maxAge) cookie += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n cookie += `; Path=${options.path || \"/\"}`;\n if (options.domain) cookie += `; Domain=${options.domain}`;\n if (options.secure) cookie += \"; Secure\";\n if (options.httpOnly) cookie += \"; HttpOnly\";\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase()}${options.sameSite.slice(1)}`;\n }\n\n return cookie;\n}\n\nclass WebCookieJar implements CookieJar {\n private cookies: Record<string, string>;\n private setCookies: string[] = [];\n\n constructor(\n request: Request,\n private headers: Map<string, string>,\n ) {\n this.cookies = parseCookies(request.headers.get(\"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 this.headers.set(\"Set-Cookie\", this.setCookies.join(\", \"));\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.headers.set(\"Set-Cookie\", this.setCookies.join(\", \"));\n }\n\n getAll(): Record<string, string> {\n return { ...this.cookies };\n }\n}\n\nfunction mapToHeaders(map: Map<string, string>): Headers {\n const headers = new Headers();\n for (const [key, value] of map) {\n if (key.toLowerCase() === \"set-cookie\") {\n headers.append(key, value);\n } else {\n headers.set(key, value);\n }\n }\n return headers;\n}\n\nfunction headersToRecord(headers: Map<string, string>): Record<string, string> {\n return Object.fromEntries(headers);\n}\n\nfunction isMiddlewareResponse(value: unknown): value is Response {\n return value instanceof Response;\n}\n\nfunction createResponseShim(headers: Map<string, string>): Record<string, any> {\n return {\n headersSent: false,\n writableEnded: false,\n setHeader(name: string, value: string | string[]) {\n headers.set(name, Array.isArray(value) ? value.join(\", \") : String(value));\n },\n getHeader(name: string) {\n return headers.get(name);\n },\n writeHead(status: number, responseHeaders?: Record<string, string>) {\n this.statusCode = status;\n if (responseHeaders) {\n for (const [key, value] of Object.entries(responseHeaders)) {\n headers.set(key, value);\n }\n }\n this.headersSent = true;\n },\n end() {\n this.writableEnded = true;\n },\n };\n}\n\nfunction withNodeRequestShape(request: Request): Request {\n const requestWithShape = request as Request & {\n socket?: { remoteAddress?: string };\n };\n\n if (!requestWithShape.socket) {\n const forwardedFor = request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim();\n try {\n requestWithShape.socket = {\n remoteAddress: forwardedFor || \"127.0.0.1\",\n };\n } catch {\n // Some Request implementations may not be extensible.\n }\n }\n\n return requestWithShape;\n}\n\nfunction createHandledResponse(\n body: BodyInit | null,\n init: ResponseInit,\n headers: Map<string, string>,\n): Response {\n const responseHeaders = new Headers(init.headers);\n for (const [key, value] of headers) {\n if (key.toLowerCase() === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n return new Response(body, { ...init, headers: responseHeaders });\n}\n\nfunction createWebMiddlewareContext(\n request: Request,\n parent?: MiddlewareContext[\"parent\"],\n): WebMiddlewareContextState {\n let currentRequest = withNodeRequestShape(request);\n let handledResponse: Response | null = null;\n const url = new URL(currentRequest.url);\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 headers = new Map<string, string>();\n\n if (parent?.headers) {\n for (const [key, value] of Object.entries(parent.headers)) {\n headers.set(key, value);\n }\n }\n\n const ctx = {\n request: currentRequest as any,\n response: createResponseShim(headers) as any,\n url,\n pathname: url.pathname,\n searchParams: url.searchParams,\n method: currentRequest.method || \"GET\",\n params: {},\n route: url.pathname,\n parent,\n vite: {\n isDev: false,\n hmr: false,\n },\n data,\n locals,\n headers,\n cookies: new WebCookieJar(currentRequest, headers),\n _handled: false as boolean,\n _redirectUrl: undefined as string | undefined,\n _rewriteUrl: undefined as string | undefined,\n\n redirect(redirectUrl: string, status = 307): void {\n ctx._redirectUrl = redirectUrl;\n ctx._handled = true;\n handledResponse = createHandledResponse(\n `Redirecting to ${redirectUrl}`,\n {\n status,\n headers: {\n Location: redirectUrl,\n \"Content-Type\": \"text/plain\",\n },\n },\n headers,\n );\n },\n\n rewrite(rewriteUrl: string): void {\n ctx._rewriteUrl = rewriteUrl;\n const nextUrl = new URL(rewriteUrl, currentRequest.url);\n currentRequest = withNodeRequestShape(new Request(nextUrl, currentRequest));\n ctx.request = currentRequest as any;\n ctx.url = nextUrl;\n ctx.pathname = nextUrl.pathname;\n ctx.searchParams = nextUrl.searchParams;\n ctx.route = nextUrl.pathname;\n },\n\n json(jsonData: any, status = 200): void {\n ctx._handled = true;\n handledResponse = createHandledResponse(\n JSON.stringify(jsonData),\n {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n headers,\n );\n },\n\n text(content: string, status = 200): void {\n ctx._handled = true;\n handledResponse = createHandledResponse(\n content,\n {\n status,\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n },\n headers,\n );\n },\n\n html(content: string, status = 200): void {\n ctx._handled = true;\n handledResponse = createHandledResponse(\n content,\n {\n status,\n headers: {\n \"Content-Type\": \"text/html\",\n },\n },\n headers,\n );\n },\n } satisfies MiddlewareContext;\n\n return {\n ctx,\n getRequest: () => currentRequest,\n getResponse: () => handledResponse,\n };\n}\n\nfunction toMatcherList(matcher: MiddlewareConfig[\"matcher\"]): MiddlewareMatcher[] {\n if (!matcher) return [];\n return Array.isArray(matcher) ? matcher : [matcher];\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n\nfunction 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\nfunction 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 } = 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 `/${escapeRegex(segment).replace(/\\\\\\*/g, \"[^/]*\")}`;\n });\n\n return {\n regex: new RegExp(`^${parts.join(\"\")}$`),\n params,\n };\n}\n\nfunction 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 } = 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\nfunction matchesConfig(\n pathname: string,\n config: MiddlewareConfig,\n ctx: MiddlewareContext,\n): { matched: boolean; params?: Record<string, string> } {\n if (config.exclude) {\n for (const pattern of config.exclude) {\n if (matchPattern(pattern, pathname).matched) {\n return { matched: false };\n }\n }\n }\n\n if (config.matcher) {\n for (const matcher of toMatcherList(config.matcher)) {\n if (typeof matcher === \"string\" || matcher instanceof RegExp) {\n const result = 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\nfunction matchRoutePath(\n pathname: string,\n middlewarePath: string,\n): { matched: boolean; params?: Record<string, string> } {\n if (middlewarePath === \"/\") return { matched: true };\n\n const exactMatch = matchPattern(middlewarePath, pathname);\n if (exactMatch.matched) {\n return exactMatch;\n }\n\n const nestedMatch = 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\nfunction getConfigHandlers(\n entry: 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\nfunction 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\nfunction normalizeConfigMiddleware(config?: FarmMiddlewareConfig | null): {\n entries: ProductionMiddlewareEntry[];\n globalConfig?: MiddlewareConfig;\n} {\n const entries: ProductionMiddlewareEntry[] = [];\n let globalConfig: MiddlewareConfig | undefined;\n\n if (!config) {\n return { entries, globalConfig };\n }\n\n const configEntries = Array.isArray(config) ? config : [config];\n for (const [index, entry] of configEntries.entries()) {\n const handlers = getConfigHandlers(entry);\n const middlewareConfig = toMiddlewareConfig(entry);\n\n if (handlers.length === 0) {\n globalConfig = middlewareConfig;\n continue;\n }\n\n entries.push({\n path: \"/\",\n filePath: `farm.config.ts#middleware-${index}`,\n handlers,\n config: middlewareConfig,\n source: \"config\",\n });\n }\n\n return { entries, globalConfig };\n}\n\nfunction normalizeFileMiddleware(\n modules: ProductionMiddlewareModuleEntry[] = [],\n): ProductionMiddlewareEntry[] {\n const entries: ProductionMiddlewareEntry[] = [];\n\n for (const moduleEntry of modules) {\n const normalized = normalizeMiddlewareModule(moduleEntry.module, moduleEntry.path);\n if (!normalized) {\n continue;\n }\n\n entries.push({\n path: moduleEntry.path,\n filePath: moduleEntry.filePath || moduleEntry.path,\n handlers: normalized.handlers,\n config: normalized.config,\n source: \"file\",\n });\n }\n\n return entries;\n}\n\nasync function executeHandlers(\n handlers: MiddlewareFunction[],\n ctx: MiddlewareContext,\n): Promise<Response | undefined> {\n let handlerIndex = 0;\n let returnedResponse: Response | undefined;\n const executeNext = async (): Promise<MiddlewareResult> => {\n if (handlerIndex < handlers.length) {\n const handler = 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 return isMiddlewareResponse(result) ? result : returnedResponse;\n}\n\nfunction emptyResult(request: Request): ProductionMiddlewareResult {\n return {\n request,\n response: null,\n data: new Map(),\n context: new Map(),\n headers: new Headers(),\n handled: false,\n };\n}\n\nexport function createProductionMiddlewareRunner(options: ProductionMiddlewareRunnerOptions = {}) {\n const configMiddleware = normalizeConfigMiddleware(options.config);\n const fileMiddleware = normalizeFileMiddleware(options.modules);\n const entries = [...configMiddleware.entries, ...fileMiddleware];\n const globalConfig = configMiddleware.globalConfig;\n\n return async function runProductionMiddleware(\n request: Request,\n ): Promise<ProductionMiddlewareResult> {\n if (!globalConfig && entries.length === 0) {\n return emptyResult(request);\n }\n\n let contextState = createWebMiddlewareContext(request);\n let ctx = contextState.ctx;\n let currentRequest = contextState.getRequest();\n const initialPathname = options.i18n?.enabled\n ? stripFarmLocaleFromPathname(ctx.pathname, options.i18n)\n : ctx.pathname;\n let parentData: MiddlewareContext[\"parent\"] | undefined;\n\n if (globalConfig) {\n const globalMatch = matchesConfig(initialPathname, globalConfig, ctx);\n if (!globalMatch.matched) {\n return emptyResult(request);\n }\n if (globalMatch.params) {\n ctx.params = { ...ctx.params, ...globalMatch.params };\n }\n }\n\n const applicable = entries\n .map((entry) => ({\n entry,\n routeMatch:\n entry.source === \"config\"\n ? { matched: true }\n : matchRoutePath(initialPathname, entry.path),\n }))\n .filter((candidate) => candidate.routeMatch.matched);\n\n if (applicable.length === 0) {\n return {\n request: currentRequest,\n response: null,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(ctx.headers),\n handled: false,\n };\n }\n\n for (const candidate of applicable) {\n const { entry, routeMatch } = candidate;\n const configMatch = entry.config\n ? matchesConfig(initialPathname, entry.config, ctx)\n : { matched: true };\n if (!configMatch.matched) {\n continue;\n }\n\n if (parentData) {\n contextState = createWebMiddlewareContext(currentRequest, parentData);\n ctx = contextState.ctx;\n }\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 const middlewareStartTime = Date.now();\n const middlewareEvent = {\n route: entry.path,\n pathname: initialPathname,\n name: entry.filePath,\n };\n emitFarmEvent({ type: \"middleware.start\", ...middlewareEvent });\n\n try {\n const returnedResponse = await executeHandlers(entry.handlers, ctx);\n currentRequest = contextState.getRequest();\n\n if (returnedResponse) {\n const response = applyProductionMiddlewareHeaders(\n returnedResponse,\n mapToHeaders(ctx.headers),\n );\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: response.status,\n });\n return {\n request: currentRequest,\n response,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(ctx.headers),\n handled: true,\n };\n }\n\n if (ctx._handled) {\n const response = contextState.getResponse() || new Response(null);\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: response.status,\n });\n return {\n request: currentRequest,\n response,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(ctx.headers),\n handled: true,\n };\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: headersToRecord(ctx.headers),\n };\n }\n\n return {\n request: currentRequest,\n response: null,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(ctx.headers),\n handled: false,\n };\n };\n}\n\nexport function applyProductionMiddlewareHeaders(\n response: Response,\n middlewareHeaders?: Headers | null,\n): Response {\n if (!middlewareHeaders || Array.from(middlewareHeaders.keys()).length === 0) {\n return response;\n }\n\n const headers = new Headers(response.headers);\n for (const [key, value] of middlewareHeaders) {\n if (key.toLowerCase() === \"set-cookie\") {\n headers.append(key, value);\n } else {\n headers.set(key, value);\n }\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n"],"mappings":"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","names":["match","result"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/route-rules.ts"],"sourcesContent":["import type { HeaderConfig, RedirectConfig } from \"./config\";\nimport type { FarmRouteRuntimeConfig } from \"./route-runtime\";\nimport { normalizeFarmRouteRuntimeConfig } from \"./route-runtime\";\n\nexport type FarmRouteRuleRenderMode = \"static\" | \"dynamic\";\n\nexport type FarmRouteRuleRedirect =\n | string\n | {\n to: string;\n statusCode?: number;\n permanent?: boolean;\n };\n\nexport type FarmRouteRuleCors =\n | boolean\n | {\n origin?: string;\n methods?: string | readonly string[];\n headers?: string | readonly string[];\n };\n\nexport interface FarmRouteRule extends FarmRouteRuntimeConfig {\n prerender?: boolean;\n render?: FarmRouteRuleRenderMode;\n ssr?: boolean;\n swr?: boolean | number;\n isr?: boolean | number;\n cors?: FarmRouteRuleCors;\n headers?: Record<string, string>;\n redirect?: FarmRouteRuleRedirect;\n}\n\nexport type FarmRouteRules = Record<string, FarmRouteRule>;\n\nexport function normalizeRouteRules(routeRules: FarmRouteRules | undefined): FarmRouteRules {\n if (!routeRules) return {};\n\n const normalized: FarmRouteRules = {};\n for (const [source, rule] of Object.entries(routeRules)) {\n if (!source || !rule) continue;\n const normalizedSource = normalizeRuleSource(source);\n normalized[normalizedSource] = {\n ...rule,\n ...normalizeFarmRouteRuntimeConfig(rule, `Route rule \"${normalizedSource}\"`),\n };\n }\n return normalized;\n}\n\nexport function routeRulesToRedirects(routeRules: FarmRouteRules): RedirectConfig[] {\n return Object.entries(routeRules)\n .filter((entry): entry is [string, FarmRouteRule & { redirect: FarmRouteRuleRedirect }] =>\n Boolean(entry[1].redirect),\n )\n .map(([source, rule]) => {\n const redirect = typeof rule.redirect === \"string\" ? { to: rule.redirect } : rule.redirect;\n return {\n source,\n destination: redirect.to,\n permanent: redirect.permanent,\n statusCode: redirect.statusCode ?? (redirect.permanent === true ? 308 : undefined),\n };\n });\n}\n\nexport function routeRulesToHeaders(routeRules: FarmRouteRules): HeaderConfig[] {\n const configs: HeaderConfig[] = [];\n\n for (const [source, rule] of Object.entries(routeRules)) {\n const headers = {\n ...normalizeCorsHeaders(rule.cors),\n ...(rule.headers || {}),\n };\n\n const entries = Object.entries(headers);\n if (entries.length === 0) continue;\n\n configs.push({\n source,\n headers: entries.map(([key, value]) => ({ key, value })),\n });\n }\n\n return configs;\n}\n\nexport function routeRulesToNitroRouteRules(routeRules: FarmRouteRules): Record<string, any> {\n const nitroRules: Record<string, any> = {};\n\n for (const [source, rule] of Object.entries(routeRules)) {\n const nitroRule: Record<string, any> = { ...rule };\n\n if (rule.render === \"static\") {\n nitroRule.prerender = true;\n } else if (rule.render === \"dynamic\") {\n nitroRule.prerender = false;\n }\n\n if (rule.redirect && typeof rule.redirect !== \"string\") {\n nitroRule.redirect = rule.redirect.to;\n if (rule.redirect.statusCode) {\n nitroRule.statusCode = rule.redirect.statusCode;\n }\n }\n\n if (rule.cors) {\n nitroRule.cors = true;\n nitroRule.headers = {\n ...normalizeCorsHeaders(rule.cors),\n ...(rule.headers || {}),\n };\n }\n\n delete nitroRule.render;\n delete nitroRule.runtime;\n delete nitroRule.regions;\n delete nitroRule.maxDuration;\n nitroRules[source] = nitroRule;\n }\n\n return nitroRules;\n}\n\nfunction normalizeCorsHeaders(cors: FarmRouteRuleCors | undefined): Record<string, string> {\n if (!cors) return {};\n\n if (cors === true) {\n return {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"*\",\n \"Access-Control-Allow-Headers\": \"*\",\n };\n }\n\n return {\n \"Access-Control-Allow-Origin\": cors.origin ?? \"*\",\n \"Access-Control-Allow-Methods\": normalizeList(cors.methods) ?? \"*\",\n \"Access-Control-Allow-Headers\": normalizeList(cors.headers) ?? \"*\",\n };\n}\n\nfunction normalizeList(value: string | readonly string[] | undefined): string | undefined {\n if (!value || typeof value === \"string\") return value;\n return value.join(\", \");\n}\n\nfunction normalizeRuleSource(source: string): string {\n const trimmed = source.trim();\n if (!trimmed) return \"/\";\n return trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/endpoint.ts","../src/api/vite-plugin.ts"],"sourcesContent":["import { createEndpoint as betterCallEndpoint } from \"better-call\";\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 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\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> = {\n method?: \"GET\" | \"HEAD\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\";\n body?: TBody;\n query?: TQuery;\n headers?: THeaders;\n middleware?: TMiddlewares;\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> = (ctx: {\n body: InferOutput<TBody>;\n query: InferOutput<TQuery>;\n headers: InferHeadersOutput<THeaders>;\n request: Request;\n context: Readonly<TContext>;\n params: EndpointParams;\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> = {\n __types: {\n body: TBody;\n query: TQuery;\n headers: THeaders;\n response: TResponse;\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> = TypedEndpoint<\n InferOutput<TBody>,\n InferOutput<TQuery>,\n Awaited<TResponse>,\n InferHeadersOutput<THeaders>\n>;\n\ntype AnyEndpointOptions = EndpointOptions<\n AnySchema,\n AnySchema,\n AnySchema,\n readonly AnyEndpointMiddleware[]\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 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>;\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>;\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: string | EndpointOptions<any, any, any, readonly AnyEndpointMiddleware[]>,\n optionsOrHandler:\n | EndpointOptions<any, any, any, readonly AnyEndpointMiddleware[]>\n | EndpointHandler<any, any, any, any, any>,\n maybeHandler?: EndpointHandler<any, any, any, any, any>,\n): TypedEndpoint<any, any, any, any> {\n // Determine if first arg is path or options\n let path: string;\n let options: EndpointOptions<any, any, any, readonly AnyEndpointMiddleware[]>;\n let handler: EndpointHandler<any, any, any, any, any>;\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 wrappedHandler = ((ctx: EndpointMiddlewareContext<any, any, any, any>) =>\n runEndpointMiddleware(middleware, ctx, handler)) as typeof handler;\n const { middleware: _middleware, ...betterCallOptions } = 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.__middleware = middleware;\n endpoint.__sourceHandler = handler;\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 };\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 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>,\n): Promise<unknown> {\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)) return result;\n if (result === false) return forbiddenEndpointResponse();\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 return handler({ ...handlerContext, context });\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","/**\n * Farm.js API Routes Vite Plugin\n *\n * Standalone API route support that works with any Vite setup.\n * Discovers and handles route.ts files in the api directory.\n * Also supports root routes.ts for custom route definitions.\n *\n * @example\n * ```ts\n * import { farmApiPlugin } from '@farm.js/core'\n *\n * export default defineConfig({\n * plugins: [farmApiPlugin({ srcDir: 'src' })],\n * })\n * ```\n */\n\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { API_ROUTE_METHODS, invokeAPIRouteEndpoint, matchAPIRoute } from \"./route-manager\";\nimport { sendWebResponse } from \"../server/response\";\nimport { _withAfterNodeMiddleware } from \"../after\";\nimport { getProgrammaticRouteManifest, isProgrammaticRoutesFileName } from \"../routes\";\nimport { findProgrammaticRouteFilesInDir } from \"../routes.server\";\nimport { toViteModuleId } from \"../utils\";\n\nexport interface FarmApiPluginOptions {\n /** Source directory containing the api folder (default: 'src') */\n srcDir?: string;\n /** Enable debug logging */\n debug?: boolean;\n}\n\nexport interface ApiRoute {\n path: string;\n filePath: string;\n methods: string[];\n endpoints: Record<string, any>;\n}\n\n/**\n * Farm.js API Routes Vite Plugin\n */\nexport function farmApiPlugin(options: FarmApiPluginOptions = {}): Plugin {\n const srcDir = options.srcDir ?? \"src\";\n const debug = options.debug ?? false;\n\n // API routes cache\n let apiRoutesCache: Map<string, ApiRoute> = new Map();\n let apiRouterHandler: ((req: Request) => Promise<Response>) | null = null;\n let discoveryComplete = false;\n let discoveryPromise: Promise<void> | null = null;\n\n const log = (_message: string) => {};\n const logResponse = (method: string, urlPath: string, status: number, duration: number) => {\n try {\n const pc = require(\"picocolors\");\n let statusColor = pc.green;\n if (status >= 500) statusColor = pc.red;\n else if (status >= 400) statusColor = pc.yellow;\n else if (status >= 300) statusColor = pc.cyan;\n\n const logMsg = [\n pc.dim(\"[\") + pc.bold(pc.blue(\"FARM\")) + pc.dim(\"]\"),\n pc.dim(\"[\") + pc.bold(pc.cyan(\"API\")) + pc.dim(\"]\"),\n pc.dim(\"[\") + pc.bold(pc.white(method.padEnd(3))) + pc.dim(\"]\"),\n pc.gray(urlPath),\n pc.dim(\"-\"),\n statusColor(status.toString()),\n pc.dim(`(${duration}ms)`),\n ].join(\" \");\n console.log(logMsg);\n } catch {\n console.log(`[FARM] [API] [${method}] ${urlPath} - ${status} (${duration}ms)`);\n }\n };\n\n const addEndpoint = (\n routePath: string,\n filePath: string,\n method: string,\n endpoint: any,\n ): void => {\n const normalizedMethod = method.toUpperCase();\n const existing = apiRoutesCache.get(routePath);\n\n if (existing) {\n if (!existing.methods.includes(normalizedMethod)) {\n existing.methods.push(normalizedMethod);\n }\n existing.endpoints[normalizedMethod] = endpoint;\n return;\n }\n\n apiRoutesCache.set(routePath, {\n path: routePath,\n filePath,\n methods: [normalizedMethod],\n endpoints: { [normalizedMethod]: endpoint },\n });\n };\n\n // Create API router handler\n const createRouter = async (): Promise<void> => {\n const totalEndpoints = Array.from(apiRoutesCache.values()).reduce(\n (sum, route) => sum + route.methods.length,\n 0,\n );\n\n apiRouterHandler = null;\n\n if (totalEndpoints > 0) {\n apiRouterHandler = async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n const pathname = url.pathname;\n\n const match = matchAPIRoute(apiRoutesCache, pathname);\n if (!match) {\n return new Response(JSON.stringify({ error: \"Not Found\" }), {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n const { route, params } = match;\n const endpoint = route.endpoints[method];\n if (!endpoint) {\n return new Response(JSON.stringify({ error: \"Method Not Allowed\" }), {\n status: 405,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n try {\n return await invokeAPIRouteEndpoint(endpoint, request, params);\n } catch (error: any) {\n return new Response(JSON.stringify({ error: error.message || \"Internal Server Error\" }), {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n };\n\n log(`API router created with ${totalEndpoints} endpoints`);\n }\n };\n\n return {\n name: \"@farm.js/core:api\",\n enforce: \"pre\",\n\n configureServer(server: ViteDevServer) {\n // Discover API routes in /api directory\n const discoverFileRoutes = async (apiDir: string): Promise<void> => {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n if (!fs.existsSync(apiDir)) {\n log(\"No api directory found\");\n return;\n }\n\n const findRouteFiles = (dir: string): string[] => {\n const files: string[] = [];\n if (!fs.existsSync(dir)) return files;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...findRouteFiles(fullPath));\n } else if (\n entry.name === \"route.ts\" ||\n entry.name === \"route.tsx\" ||\n entry.name === \"route.js\"\n ) {\n files.push(fullPath);\n }\n }\n return files;\n };\n\n const routeFiles = findRouteFiles(apiDir);\n apiRoutesCache.clear();\n\n for (const filePath of routeFiles) {\n try {\n const relativePath = path.relative(apiDir, path.dirname(filePath));\n const routePath =\n \"/api/\" + (relativePath === \".\" ? \"\" : relativePath.replace(/\\\\/g, \"/\"));\n\n const routeModule = await server.ssrLoadModule(filePath);\n const endpoints: Record<string, any> = {};\n const availableMethods: string[] = [];\n\n for (const method of API_ROUTE_METHODS) {\n if (routeModule[method]) {\n availableMethods.push(method);\n endpoints[method] = routeModule[method];\n }\n }\n\n if (availableMethods.length > 0) {\n apiRoutesCache.set(routePath, {\n path: routePath,\n filePath,\n methods: availableMethods,\n endpoints,\n });\n log(`API route discovered: ${availableMethods.join(\", \")} ${routePath}`);\n }\n } catch (e: any) {\n log(`API route load failed at ${filePath}: ${e.message}`);\n }\n }\n };\n\n // Discover routes from root routes.ts file\n const discoverRootRoutes = async (): Promise<void> => {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n const routesFiles = [\n path.join(server.config.root, srcDir, \"routes.ts\"),\n path.join(server.config.root, srcDir, \"routes.tsx\"),\n path.join(server.config.root, srcDir, \"routes.js\"),\n ];\n\n for (const routesFile of routesFiles) {\n if (fs.existsSync(routesFile)) {\n try {\n const routesModule = await server.ssrLoadModule(routesFile);\n\n for (const [exportName, exportValue] of Object.entries(routesModule)) {\n const endpoint = exportValue as any;\n\n if (endpoint && endpoint.__path) {\n const routePath = endpoint.__path;\n const method = String(endpoint.__method || \"GET\").toUpperCase();\n\n addEndpoint(routePath, routesFile, method, endpoint);\n log(`Root route discovered: ${method} ${routePath}`);\n }\n }\n } catch (e: any) {\n log(`Root routes.ts load failed: ${e.message}`);\n }\n break;\n }\n }\n };\n\n const discoverProgrammaticRoutes = async (): Promise<void> => {\n const path = await import(\"path\");\n const srcRoot = path.join(server.config.root, srcDir);\n const routeFiles = findProgrammaticRouteFilesInDir(srcRoot);\n\n for (const routeFile of routeFiles) {\n try {\n const routesModule = await server.ssrLoadModule(\n toViteModuleId(routeFile, server.config.root),\n );\n const manifest = getProgrammaticRouteManifest(routesModule);\n if (!manifest) continue;\n\n for (const definition of manifest.routes) {\n if (definition.kind !== \"api\") continue;\n\n for (const [method, endpoint] of Object.entries(definition.methods)) {\n if (endpoint) {\n addEndpoint(definition.path, routeFile, method, endpoint);\n log(`Programmatic route discovered: ${method} ${definition.path}`);\n }\n }\n }\n } catch (e: any) {\n log(`Programmatic routes file load failed at ${routeFile}: ${e.message}`);\n }\n }\n };\n\n // Initialize discovery\n const initializeDiscovery = async () => {\n const path = await import(\"path\");\n const apiDir = path.join(server.config.root, srcDir, \"api\");\n log(`Discovering API routes in: ${apiDir}`);\n\n await discoverFileRoutes(apiDir);\n await discoverRootRoutes();\n await discoverProgrammaticRoutes();\n await createRouter();\n\n discoveryComplete = true;\n log(`API discovery complete: ${apiRoutesCache.size} routes found`);\n };\n\n discoveryPromise = initializeDiscovery().catch((e) => {\n console.error(\"[FARM] API discovery error:\", e);\n });\n\n // Expose API router for other plugins\n (server as any).__farmApi__ = {\n getHandler: () => apiRouterHandler,\n getRoutes: () => apiRoutesCache,\n isReady: () => discoveryComplete,\n waitForDiscovery: () => discoveryPromise,\n };\n\n // Add middleware to handle API requests\n return () => {\n server.middlewares.use(_withAfterNodeMiddleware(async (req, res, next) => {\n const url = req.url || \"/\";\n const pathname = url.split(\"?\")[0];\n const method = req.method || \"GET\";\n\n if (discoveryPromise && !discoveryComplete) {\n await discoveryPromise;\n }\n\n if (!matchAPIRoute(apiRoutesCache, pathname)) {\n return next();\n }\n\n if (!apiRouterHandler) {\n return next();\n }\n\n const startTime = Date.now();\n\n try {\n // Execute middleware if available\n const farmMiddleware = (server as any).__farmMiddleware__;\n if (farmMiddleware) {\n await farmMiddleware.waitForDiscovery?.();\n const middlewareData = new Map<string, any>();\n const handled = await farmMiddleware.execute(req, res, pathname, middlewareData);\n if (handled) {\n const duration = Date.now() - startTime;\n logResponse(method, pathname, res.statusCode || 200, duration);\n return;\n }\n }\n\n // Convert Node request to Web Request\n const fullUrl = `http://${req.headers.host || \"localhost:3000\"}${url}`;\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n headers.set(key, Array.isArray(value) ? value.join(\", \") : value);\n }\n }\n\n let body: string | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await new Promise<string>((resolve) => {\n let data = \"\";\n req.on(\"data\", (chunk: any) => {\n data += chunk;\n });\n req.on(\"end\", () => {\n resolve(data);\n });\n });\n }\n\n const request = new Request(fullUrl, {\n method,\n headers,\n body: body || undefined,\n });\n\n const response = await apiRouterHandler(request);\n\n const duration = Date.now() - startTime;\n logResponse(method, pathname, response.status, duration);\n\n await sendWebResponse(res, response);\n } catch (error: any) {\n const duration = Date.now() - startTime;\n logResponse(method, pathname, 500, duration);\n console.error(\"[FARM] API error:\", error);\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ error: \"Internal server error\" }));\n }\n }));\n };\n },\n\n async handleHotUpdate({ file, server, modules }) {\n const fileName = file.split(\"/\").pop() || \"\";\n\n // Handle root routes.ts updates\n if (\n fileName === \"routes.ts\" ||\n fileName === \"routes.tsx\" ||\n fileName === \"routes.js\" ||\n isProgrammaticRoutesFileName(fileName)\n ) {\n log(`Root routes file updated: ${fileName}`);\n\n for (const mod of modules) {\n server.moduleGraph.invalidateModule(mod);\n }\n\n // Clear routes from this file\n for (const [routePath, route] of apiRoutesCache) {\n if (route.filePath === file) {\n apiRoutesCache.delete(routePath);\n }\n }\n\n try {\n const routesModule = await server.ssrLoadModule(file);\n\n for (const [exportName, exportValue] of Object.entries(routesModule)) {\n const endpoint = exportValue as any;\n\n if (endpoint && endpoint.__path) {\n const routePath = endpoint.__path;\n const method = String(endpoint.__method || \"GET\").toUpperCase();\n\n addEndpoint(routePath, file, method, endpoint);\n log(`Root route reloaded: ${method} ${routePath}`);\n }\n }\n\n const manifest = getProgrammaticRouteManifest(routesModule);\n if (manifest) {\n for (const definition of manifest.routes) {\n if (definition.kind !== \"api\") continue;\n\n for (const [method, endpoint] of Object.entries(definition.methods)) {\n if (endpoint) {\n addEndpoint(definition.path, file, method, endpoint);\n log(`Programmatic route reloaded: ${method} ${definition.path}`);\n }\n }\n }\n }\n\n await createRouter();\n log(`API router recreated`);\n } catch (e: any) {\n log(`Root routes.ts HMR failed: ${e.message}`);\n }\n\n return [];\n }\n\n // Handle file-based route updates\n if (file.includes(\"/api/\") && fileName.startsWith(\"route.\")) {\n const shortPath = file.split(\"/api/\")[1] || file;\n log(`API route updated: ${shortPath}`);\n\n for (const mod of modules) {\n server.moduleGraph.invalidateModule(mod);\n }\n\n let routePathToUpdate: string | null = null;\n for (const [routePath, route] of apiRoutesCache) {\n if (route.filePath === file) {\n routePathToUpdate = routePath;\n break;\n }\n }\n\n if (routePathToUpdate) {\n try {\n const routeModule = await server.ssrLoadModule(file);\n const endpoints: Record<string, any> = {};\n const availableMethods: string[] = [];\n\n for (const method of API_ROUTE_METHODS) {\n if (routeModule[method]) {\n availableMethods.push(method);\n endpoints[method] = routeModule[method];\n }\n }\n\n if (availableMethods.length > 0) {\n apiRoutesCache.set(routePathToUpdate, {\n path: routePathToUpdate,\n filePath: file,\n methods: availableMethods,\n endpoints,\n });\n log(`API route reloaded: ${routePathToUpdate}`);\n await createRouter();\n log(`API router recreated`);\n }\n } catch (e: any) {\n log(`API route HMR failed: ${e.message}`);\n }\n } else {\n // New route file\n try {\n const path = await import(\"path\");\n const apiDir = path.join(server.config.root, srcDir, \"api\");\n const relativePath = path.relative(apiDir, path.dirname(file));\n const routePath =\n \"/api/\" + (relativePath === \".\" ? \"\" : relativePath.replace(/\\\\/g, \"/\"));\n\n const routeModule = await server.ssrLoadModule(file);\n const endpoints: Record<string, any> = {};\n const availableMethods: string[] = [];\n\n for (const method of API_ROUTE_METHODS) {\n if (routeModule[method]) {\n availableMethods.push(method);\n endpoints[method] = routeModule[method];\n }\n }\n\n if (availableMethods.length > 0) {\n apiRoutesCache.set(routePath, {\n path: routePath,\n filePath: file,\n methods: availableMethods,\n endpoints,\n });\n log(`New API route discovered: ${routePath}`);\n await createRouter();\n }\n } catch (e: any) {\n log(`New API route load failed: ${e.message}`);\n }\n }\n\n return [];\n }\n },\n };\n}\n"],"mappings":"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","names":["duration"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/i18n/server.ts","../src/i18n/runtime.ts","../src/i18n/catalog.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { FarmLocaleResolution } from \"./resolver\";\nimport { _setFarmI18nSnapshotResolver } from \"./bridge\";\nimport { FarmI18nRuntime, createFarmI18nRuntime } from \"./runtime\";\nimport type {\n FarmI18nClientSnapshot,\n FarmI18nLocale,\n FarmI18nLocaleSource,\n FarmI18nMessageArgs,\n FarmI18nMessageKey,\n FarmTranslator,\n} from \"./types\";\n\ninterface FarmI18nRequestState {\n runtime: FarmI18nRuntime;\n resolution: FarmLocaleResolution;\n snapshot: FarmI18nClientSnapshot;\n}\n\ninterface FarmListFormatOptions {\n localeMatcher?: \"lookup\" | \"best fit\";\n type?: \"conjunction\" | \"disjunction\" | \"unit\";\n style?: \"long\" | \"short\" | \"narrow\";\n}\n\nconst FARM_I18N_REQUEST_STORE = Symbol.for(\"farm.i18n.requestStore\");\nconst FARM_I18N_DEFAULT_RUNTIME = Symbol.for(\"farm.i18n.defaultRuntime\");\n\ntype GlobalFarmI18nState = typeof globalThis & {\n [FARM_I18N_REQUEST_STORE]?: AsyncLocalStorage<FarmI18nRequestState>;\n [FARM_I18N_DEFAULT_RUNTIME]?: FarmI18nRuntime;\n};\n\nfunction getRequestStore(): AsyncLocalStorage<FarmI18nRequestState> {\n const state = globalThis as GlobalFarmI18nState;\n return (state[FARM_I18N_REQUEST_STORE] ??= new AsyncLocalStorage<FarmI18nRequestState>());\n}\n\nfunction getState(): FarmI18nRequestState {\n const state = getRequestStore().getStore();\n if (!state) {\n throw new Error(\n \"No Farm i18n request context is active. Use this API while rendering, inside an API route, or use createTranslator(locale).\",\n );\n }\n return state;\n}\n\nexport function _setDefaultFarmI18nRuntime(runtime: FarmI18nRuntime | undefined): void {\n (globalThis as GlobalFarmI18nState)[FARM_I18N_DEFAULT_RUNTIME] = runtime;\n}\n\nexport async function _runWithFarmI18nRequest<T>(\n runtime: FarmI18nRuntime,\n request: Request,\n fn: (resolution: FarmLocaleResolution) => T | Promise<T>,\n options: { redirect?: boolean } = {},\n): Promise<T> {\n const resolution = runtime.resolveRequest(request, options);\n const state: FarmI18nRequestState = {\n runtime,\n resolution,\n snapshot: runtime.getClientSnapshot(resolution),\n };\n return getRequestStore().run(state, () => fn(resolution));\n}\n\nexport async function runWithLocale<T>(\n locale: FarmI18nLocale,\n fn: () => T | Promise<T>,\n): Promise<T> {\n const runtime = getDefaultRuntime();\n assertLocale(runtime, locale);\n const resolution: FarmLocaleResolution = {\n locale,\n source: \"explicit\",\n pathname: \"/\",\n persist: false,\n };\n const state: FarmI18nRequestState = {\n runtime,\n resolution,\n snapshot: runtime.getClientSnapshot(resolution),\n };\n return getRequestStore().run(state, fn);\n}\n\nexport function getLocale(): FarmI18nLocale {\n return getState().resolution.locale as FarmI18nLocale;\n}\n\nexport function getLocaleSource(): FarmI18nLocaleSource {\n return getState().resolution.source;\n}\n\nexport const t = createTranslatorFromState(() => getState());\n\nexport function createTranslator(locale: FarmI18nLocale): FarmTranslator {\n const runtime = getDefaultRuntime();\n assertLocale(runtime, locale);\n return createTranslatorFromState(() => ({\n runtime,\n resolution: {\n locale,\n source: \"explicit\",\n pathname: \"/\",\n persist: false,\n },\n snapshot: runtime.getClientSnapshot({\n locale,\n source: \"explicit\",\n pathname: \"/\",\n persist: false,\n }),\n }));\n}\n\nexport function getFarmI18nClientSnapshot(): FarmI18nClientSnapshot | undefined {\n return getRequestStore().getStore()?.snapshot;\n}\n\nexport const format = {\n number(value: number, options?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(getLocale(), options).format(value);\n },\n currency(\n value: number,\n currency: string,\n options: Omit<Intl.NumberFormatOptions, \"style\" | \"currency\"> = {},\n ): string {\n return new Intl.NumberFormat(getLocale(), {\n ...options,\n style: \"currency\",\n currency,\n }).format(value);\n },\n date(value: Date | number, options?: Intl.DateTimeFormatOptions): string {\n return new Intl.DateTimeFormat(getLocale(), options).format(value);\n },\n relativeTime(\n value: number,\n unit: Intl.RelativeTimeFormatUnit,\n options?: Intl.RelativeTimeFormatOptions,\n ): string {\n return new Intl.RelativeTimeFormat(getLocale(), options).format(value, unit);\n },\n list(values: Iterable<string>, options?: FarmListFormatOptions): string {\n const ListFormat = (Intl as any).ListFormat;\n return new ListFormat(getLocale(), options).format(Array.from(values));\n },\n};\n\nfunction getDefaultRuntime(): FarmI18nRuntime {\n const runtime = (globalThis as GlobalFarmI18nState)[FARM_I18N_DEFAULT_RUNTIME];\n if (!runtime?.config.enabled) {\n throw new Error(\"Farm i18n is not configured for this application.\");\n }\n return runtime;\n}\n\nfunction assertLocale(runtime: FarmI18nRuntime, locale: string): void {\n if (!runtime.config.locales.includes(locale)) {\n throw new Error(`Unsupported Farm i18n locale \"${locale}\".`);\n }\n}\n\nfunction createTranslatorFromState(resolveState: () => FarmI18nRequestState): FarmTranslator {\n const translator = ((key: string, values?: Record<string, unknown>) => {\n const state = resolveState();\n return state.runtime.translate(state.resolution.locale, key, values);\n }) as FarmTranslator;\n translator.rich = (key: string, values?: Record<string, unknown>) => {\n const state = resolveState();\n return state.runtime.translateRich(state.resolution.locale, key, values);\n };\n translator.raw = (key: string) => {\n const state = resolveState();\n return state.runtime.getRawMessage(state.resolution.locale, key);\n };\n translator.has = (key: string) => {\n const state = resolveState();\n return state.runtime.hasMessage(state.resolution.locale, key);\n };\n return translator;\n}\n\n_setFarmI18nSnapshotResolver(() => getFarmI18nClientSnapshot());\n\nexport { FarmI18nRuntime, createFarmI18nRuntime };\nexport type { FarmI18nClientSnapshot, FarmI18nLocale, FarmI18nMessageArgs, FarmI18nMessageKey };\n","import IntlMessageFormat from \"intl-messageformat\";\nimport { readFarmI18nCatalogs } from \"./catalog\";\nimport { getFarmLocaleDirection } from \"./routing\";\nimport { resolveFarmLocaleRequest, type FarmLocaleResolution } from \"./resolver\";\nimport type { FarmI18nCatalogs, FarmI18nClientSnapshot, ResolvedFarmI18nConfig } from \"./types\";\n\nexport class FarmI18nRuntime {\n readonly config: ResolvedFarmI18nConfig;\n private catalogs: FarmI18nCatalogs;\n private compiled = new Map<string, IntlMessageFormat>();\n private warnedMissing = new Set<string>();\n\n constructor(config: ResolvedFarmI18nConfig, catalogs: FarmI18nCatalogs = {}) {\n this.config = config;\n this.catalogs = catalogs;\n }\n\n async initialize(): Promise<void> {\n if (!this.config.enabled) return;\n const bundle = await readFarmI18nCatalogs(this.config);\n this.replaceCatalogs(bundle.catalogs);\n }\n\n async reload(): Promise<void> {\n await this.initialize();\n }\n\n replaceCatalogs(catalogs: FarmI18nCatalogs): void {\n this.catalogs = catalogs;\n this.compiled.clear();\n this.warnedMissing.clear();\n }\n\n getCatalogs(): FarmI18nCatalogs {\n return Object.fromEntries(\n Object.entries(this.catalogs).map(([locale, catalog]) => [locale, { ...catalog }]),\n );\n }\n\n resolveRequest(request: Request, options: { redirect?: boolean } = {}): FarmLocaleResolution {\n return resolveFarmLocaleRequest(request, this.config, options);\n }\n\n translate(locale: string, key: string, values?: Record<string, unknown>): string {\n const result = this.formatMessage(locale, key, values);\n if (Array.isArray(result) && result.some((part) => typeof part !== \"string\")) {\n throw new Error(`Farm i18n message \"${key}\" contains rich content. Render it with t.rich().`);\n }\n return Array.isArray(result) ? result.join(\"\") : String(result);\n }\n\n translateRich(locale: string, key: string, values?: Record<string, unknown>): unknown {\n const result = this.formatMessage(locale, key, values);\n return Array.isArray(result) && result.length === 1 ? result[0] : result;\n }\n\n getRawMessage(locale: string, key: string): string {\n return this.resolveMessage(locale, key);\n }\n\n hasMessage(locale: string, key: string): boolean {\n return (\n (this.catalogs[locale]?.[key] ?? this.catalogs[this.config.fallbackLocale]?.[key]) !==\n undefined\n );\n }\n\n getClientSnapshot(resolution: FarmLocaleResolution): FarmI18nClientSnapshot {\n return {\n locale: resolution.locale,\n source: resolution.source,\n locales: this.config.locales,\n defaultLocale: this.config.defaultLocale,\n routing: this.config.routing,\n cookie: this.config.cookie,\n direction: getFarmLocaleDirection(resolution.locale, this.config.direction),\n messages: {\n ...(this.catalogs[this.config.fallbackLocale] || {}),\n ...(this.catalogs[resolution.locale] || {}),\n },\n };\n }\n\n private formatMessage(locale: string, key: string, values?: Record<string, unknown>): unknown {\n const message = this.resolveMessage(locale, key);\n const cacheKey = `${locale}\\u0000${key}\\u0000${message}`;\n let formatter = this.compiled.get(cacheKey);\n if (!formatter) {\n formatter = new IntlMessageFormat(message, locale);\n this.compiled.set(cacheKey, formatter);\n }\n return formatter.format(values as any);\n }\n\n private resolveMessage(locale: string, key: string): string {\n const message =\n this.catalogs[locale]?.[key] ?? this.catalogs[this.config.fallbackLocale]?.[key];\n if (message !== undefined) return message;\n if (this.config.strict) {\n throw new Error(`Missing Farm i18n message \"${key}\" for locale \"${locale}\".`);\n }\n const warningKey = `${locale}:${key}`;\n if (!this.warnedMissing.has(warningKey)) {\n this.warnedMissing.add(warningKey);\n console.warn(`[Farm.js] Missing i18n message \"${key}\" for locale \"${locale}\".`);\n }\n return key;\n }\n}\n\nexport function createFarmI18nRuntime(\n config: ResolvedFarmI18nConfig,\n catalogs?: FarmI18nCatalogs,\n): FarmI18nRuntime {\n return new FarmI18nRuntime(config, catalogs);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { TYPE, parse, type MessageFormatElement } from \"@formatjs/icu-messageformat-parser\";\nimport { resolveFarmI18nMessagePath } from \"./config\";\nimport type { FarmI18nCatalog, FarmI18nCatalogs, ResolvedFarmI18nConfig } from \"./types\";\n\nexport type FarmI18nArgumentKind = \"string\" | \"number\" | \"date\" | \"select\" | \"rich\";\nexport type FarmI18nMessageSignature = Record<string, FarmI18nArgumentKind>;\n\nexport interface FarmI18nCatalogBundle {\n catalogs: FarmI18nCatalogs;\n signatures: Record<string, FarmI18nMessageSignature>;\n}\n\nexport async function readFarmI18nCatalogs(\n config: ResolvedFarmI18nConfig,\n): Promise<FarmI18nCatalogBundle> {\n if (!config.enabled) {\n return { catalogs: {}, signatures: {} };\n }\n\n const catalogs: FarmI18nCatalogs = {};\n for (const locale of config.locales) {\n const filePath = resolveFarmI18nMessagePath(config, locale);\n let source: string;\n try {\n source = await readFile(filePath, \"utf8\");\n } catch (error) {\n throw new Error(\n `Unable to read Farm i18n catalog for \"${locale}\" at ${filePath}: ${messageOf(error)}`,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`Invalid JSON in Farm i18n catalog ${filePath}: ${messageOf(error)}`);\n }\n catalogs[locale] = flattenFarmI18nCatalog(parsed, filePath);\n }\n\n const reference = catalogs[config.defaultLocale] || {};\n const signatures: Record<string, FarmI18nMessageSignature> = {};\n for (const [key, message] of Object.entries(reference)) {\n signatures[key] = analyzeFarmI18nMessage(message, `${config.defaultLocale}:${key}`);\n }\n\n validateFarmI18nCatalogs(config, catalogs, signatures);\n return { catalogs, signatures };\n}\n\nexport function flattenFarmI18nCatalog(input: unknown, source = \"i18n catalog\"): FarmI18nCatalog {\n if (!isPlainObject(input)) {\n throw new Error(`${source} must contain a JSON object at its root.`);\n }\n\n const output: FarmI18nCatalog = {};\n const visit = (value: unknown, segments: string[]) => {\n if (typeof value === \"string\") {\n const key = segments.join(\".\");\n if (!key) throw new Error(`${source} contains an empty message key.`);\n if (key in output) throw new Error(`${source} contains duplicate message key \"${key}\".`);\n output[key] = value;\n return;\n }\n\n if (!isPlainObject(value)) {\n const key = segments.join(\".\") || \"<root>\";\n throw new Error(`${source} message \"${key}\" must be a string or nested object.`);\n }\n\n for (const [key, nested] of Object.entries(value)) {\n if (!key.trim()) throw new Error(`${source} contains an empty message key.`);\n visit(nested, [...segments, key]);\n }\n };\n\n visit(input, []);\n return output;\n}\n\nexport function analyzeFarmI18nMessage(\n message: string,\n label = \"message\",\n): FarmI18nMessageSignature {\n let ast: MessageFormatElement[];\n try {\n ast = parse(message, { captureLocation: false });\n } catch (error) {\n throw new Error(`Invalid ICU syntax in ${label}: ${messageOf(error)}`);\n }\n\n const signature: FarmI18nMessageSignature = {};\n collectArguments(ast, signature, label);\n return signature;\n}\n\nfunction validateFarmI18nCatalogs(\n config: ResolvedFarmI18nConfig,\n catalogs: FarmI18nCatalogs,\n signatures: Record<string, FarmI18nMessageSignature>,\n): void {\n const referenceKeys = Object.keys(catalogs[config.defaultLocale] || {}).sort();\n\n for (const locale of config.locales) {\n const catalog = catalogs[locale] || {};\n const localeKeys = Object.keys(catalog).sort();\n const missing = referenceKeys.filter((key) => !(key in catalog));\n const extra = localeKeys.filter((key) => !(key in signatures));\n\n if (config.strict && (missing.length > 0 || extra.length > 0)) {\n const details = [\n missing.length ? `missing: ${missing.join(\", \")}` : \"\",\n extra.length ? `extra: ${extra.join(\", \")}` : \"\",\n ]\n .filter(Boolean)\n .join(\"; \");\n throw new Error(\n `Farm i18n catalog \"${locale}\" does not match the default catalog (${details}).`,\n );\n }\n\n for (const [key, message] of Object.entries(catalog)) {\n const actual = analyzeFarmI18nMessage(message, `${locale}:${key}`);\n const expected = signatures[key];\n if (!expected || sameSignature(expected, actual)) continue;\n throw new Error(\n `Farm i18n message \"${key}\" in \"${locale}\" uses different variables than \"${config.defaultLocale}\".`,\n );\n }\n }\n}\n\nfunction collectArguments(\n elements: MessageFormatElement[],\n signature: FarmI18nMessageSignature,\n label: string,\n): void {\n for (const element of elements) {\n switch (element.type) {\n case TYPE.argument:\n addArgument(signature, element.value, \"string\", label);\n break;\n case TYPE.number:\n case TYPE.plural:\n addArgument(signature, element.value, \"number\", label);\n break;\n case TYPE.date:\n case TYPE.time:\n addArgument(signature, element.value, \"date\", label);\n break;\n case TYPE.select:\n addArgument(signature, element.value, \"select\", label);\n break;\n case TYPE.tag:\n addArgument(signature, element.value, \"rich\", label);\n collectArguments(element.children, signature, label);\n break;\n }\n\n if (element.type === TYPE.plural || element.type === TYPE.select) {\n for (const option of Object.values(element.options)) {\n collectArguments(option.value, signature, label);\n }\n }\n }\n}\n\nfunction addArgument(\n signature: FarmI18nMessageSignature,\n name: string,\n kind: FarmI18nArgumentKind,\n label: string,\n): void {\n const existing = signature[name];\n if (existing && existing !== kind) {\n throw new Error(`Farm i18n ${label} uses variable \"${name}\" as both ${existing} and ${kind}.`);\n }\n signature[name] = kind;\n}\n\nfunction sameSignature(\n expected: FarmI18nMessageSignature,\n actual: FarmI18nMessageSignature,\n): boolean {\n const expectedEntries = Object.entries(expected).sort(([a], [b]) => a.localeCompare(b));\n const actualEntries = Object.entries(actual).sort(([a], [b]) => a.localeCompare(b));\n return JSON.stringify(expectedEntries) === JSON.stringify(actualEntries);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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","names":[]}
|