@farm.js/core 0.1.0-beta.21 → 0.1.0-beta.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/after.d.mts +25 -0
- package/dist/after.d.ts +25 -0
- package/dist/agent-runtime.d.mts +96 -0
- package/dist/agent-runtime.d.ts +96 -0
- package/dist/api/route-manager.d.mts +68 -0
- package/dist/api/route-manager.d.ts +68 -0
- package/dist/api/runtime.d.mts +3 -0
- package/dist/api/runtime.d.ts +3 -0
- package/dist/api.cjs +22 -19
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.mts +50 -0
- package/dist/api.d.ts +50 -0
- package/dist/api.mjs +2 -1
- package/dist/app-BB8GCH1g.d.ts +306 -0
- package/dist/app-DwsTpyNZ.d.mts +306 -0
- package/dist/app-markdown.d.mts +24 -0
- package/dist/app-markdown.d.ts +24 -0
- package/dist/cache.d.mts +192 -0
- package/dist/cache.d.ts +192 -0
- package/dist/{chunk-MIUW47JX.mjs → chunk-2PEJGY5V.mjs} +15 -20
- package/dist/chunk-2PEJGY5V.mjs.map +1 -0
- package/dist/{chunk-RIXKJPGI.mjs → chunk-42325TLU.mjs} +2 -2
- package/dist/{chunk-I3UWA2P2.mjs → chunk-DAUR3WUZ.mjs} +2 -2
- package/dist/{chunk-I3UWA2P2.mjs.map → chunk-DAUR3WUZ.mjs.map} +1 -1
- package/dist/chunk-GIELMNBG.mjs +15 -0
- package/dist/chunk-GIELMNBG.mjs.map +1 -0
- package/dist/{chunk-4EATUJFO.mjs → chunk-ICTGDDV4.mjs} +20 -22
- package/dist/chunk-ICTGDDV4.mjs.map +1 -0
- package/dist/{chunk-FKKM7HVF.mjs → chunk-XBKXKJX5.mjs} +30 -35
- package/dist/chunk-XBKXKJX5.mjs.map +1 -0
- package/dist/{chunk-VIC7NJ77.mjs → chunk-ZP73P4VR.mjs} +2 -2
- package/dist/chunk-recovery-lnQFzcQP.d.mts +26 -0
- package/dist/chunk-recovery-lnQFzcQP.d.ts +26 -0
- package/dist/client-BT1mFQas.d.mts +447 -0
- package/dist/client-Nn0q4eO4.d.ts +447 -0
- package/dist/client-cache-CIlyBlmx.d.ts +6 -0
- package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
- package/dist/client-plugins-CbRum1fj.d.ts +2088 -0
- package/dist/client-plugins-QQntVkrv.d.mts +2088 -0
- package/dist/client-plugins.d.mts +24 -0
- package/dist/client-plugins.d.ts +24 -0
- package/dist/client.d.mts +452 -0
- package/dist/client.d.ts +452 -0
- package/dist/config.d.mts +31 -0
- package/dist/config.d.ts +31 -0
- package/dist/cron.d.mts +78 -0
- package/dist/cron.d.ts +78 -0
- package/dist/deferred.d.mts +42 -0
- package/dist/deferred.d.ts +42 -0
- package/dist/deployment.d.mts +36 -0
- package/dist/deployment.d.ts +36 -0
- package/dist/docs.d.mts +80 -0
- package/dist/docs.d.ts +80 -0
- package/dist/env-types.d.mts +12 -0
- package/dist/env-types.d.ts +12 -0
- package/dist/env.d.mts +45 -0
- package/dist/env.d.ts +45 -0
- package/dist/environment/vite.d.mts +22 -0
- package/dist/environment/vite.d.ts +22 -0
- package/dist/environment.d.mts +18 -0
- package/dist/environment.d.ts +18 -0
- package/dist/font.d.mts +95 -0
- package/dist/font.d.ts +95 -0
- package/dist/headers.d.mts +22 -0
- package/dist/headers.d.ts +22 -0
- package/dist/i18n/client.d.mts +32 -0
- package/dist/i18n/client.d.ts +32 -0
- package/dist/i18n/index.d.mts +20 -0
- package/dist/i18n/index.d.ts +20 -0
- package/dist/i18n/server.d.mts +30 -0
- package/dist/i18n/server.d.ts +30 -0
- package/dist/image/server.d.mts +37 -0
- package/dist/image/server.d.ts +37 -0
- package/dist/image/sharp.d.mts +7 -0
- package/dist/image/sharp.d.ts +7 -0
- package/dist/image-config-Duob7wER.d.mts +50 -0
- package/dist/image-config-Duob7wER.d.ts +50 -0
- package/dist/image.d.mts +39 -0
- package/dist/image.d.ts +39 -0
- package/dist/index.cjs +66 -69
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +477 -0
- package/dist/index.d.ts +477 -0
- package/dist/index.mjs +7 -6
- package/dist/index.mjs.map +1 -1
- package/dist/integration-api-CHT2OKAf.d.mts +93 -0
- package/dist/integration-api-CHT2OKAf.d.ts +93 -0
- package/dist/integrations.d.mts +24 -0
- package/dist/integrations.d.ts +24 -0
- package/dist/internal/build-runtime.cjs +50 -50
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.d.mts +41 -0
- package/dist/internal/build-runtime.d.ts +41 -0
- package/dist/internal/build-runtime.mjs +5 -4
- package/dist/internal/client-runtime.d.mts +17 -0
- package/dist/internal/client-runtime.d.ts +17 -0
- package/dist/internal/config-runtime.d.mts +41 -0
- package/dist/internal/config-runtime.d.ts +41 -0
- package/dist/internal/metadata-image-runtime.d.mts +25 -0
- package/dist/internal/metadata-image-runtime.d.ts +25 -0
- package/dist/internal/production-node-env.d.mts +12 -0
- package/dist/internal/production-node-env.d.ts +12 -0
- package/dist/internal/production-runtime.d.mts +66 -0
- package/dist/internal/production-runtime.d.ts +66 -0
- package/dist/island-CfGru1MO.d.mts +9 -0
- package/dist/island-CfGru1MO.d.ts +9 -0
- package/dist/markdown.d.mts +60 -0
- package/dist/markdown.d.ts +60 -0
- package/dist/metadata-B5jBJHq1.d.ts +22 -0
- package/dist/metadata-BxOJ4FJl.d.mts +22 -0
- package/dist/middleware.cjs +17 -17
- package/dist/middleware.cjs.map +1 -1
- package/dist/middleware.d.mts +171 -0
- package/dist/middleware.d.ts +171 -0
- package/dist/middleware.mjs +3 -2
- package/dist/navigation-errors-Dvwpzaer.d.mts +13 -0
- package/dist/navigation-errors-Dvwpzaer.d.ts +13 -0
- package/dist/navigation.d.mts +14 -0
- package/dist/navigation.d.ts +14 -0
- package/dist/observability.d.mts +335 -0
- package/dist/observability.d.ts +335 -0
- package/dist/params-BALtrRim.d.ts +15 -0
- package/dist/params-ry-lxqmy.d.mts +15 -0
- package/dist/plugin-BJDf43dc.d.mts +165 -0
- package/dist/plugin-BJDf43dc.d.ts +165 -0
- package/dist/plugin.cjs +42 -48
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.mts +24 -0
- package/dist/plugin.d.ts +24 -0
- package/dist/plugin.mjs +4 -3
- package/dist/production-runtime-Bxua86uR.d.mts +81 -0
- package/dist/production-runtime-CZqXjRVi.d.ts +81 -0
- package/dist/query/client.d.mts +61 -0
- package/dist/query/client.d.ts +61 -0
- package/dist/query/index.d.mts +90 -0
- package/dist/query/index.d.ts +90 -0
- package/dist/query/parsers.d.mts +25 -0
- package/dist/query/parsers.d.ts +25 -0
- package/dist/query/server.d.mts +55 -0
- package/dist/query/server.d.ts +55 -0
- package/dist/request-7V0GaZK_.d.mts +6 -0
- package/dist/request-B5XYBv5a.d.ts +6 -0
- package/dist/request.d.mts +25 -0
- package/dist/request.d.ts +25 -0
- package/dist/resolver-DJqjLMg_.d.mts +14 -0
- package/dist/resolver-IH4RmPEl.d.ts +14 -0
- package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
- package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
- package/dist/router.d.mts +36 -0
- package/dist/router.d.ts +36 -0
- package/dist/routes.d.mts +226 -0
- package/dist/routes.d.ts +226 -0
- package/dist/runtime-Bpp-c28k.d.ts +231 -0
- package/dist/runtime-Cxpq6xZN.d.mts +27 -0
- package/dist/runtime-Q3u74Nbq.d.mts +231 -0
- package/dist/runtime-bv63eUiO.d.ts +27 -0
- package/dist/server-action-security.d.mts +45 -0
- package/dist/server-action-security.d.ts +45 -0
- package/dist/server-fn-client.d.mts +33 -0
- package/dist/server-fn-client.d.ts +33 -0
- package/dist/server-fn-error-DDh14a0V.d.mts +26 -0
- package/dist/server-fn-error-DDh14a0V.d.ts +26 -0
- package/dist/server-fn.d.mts +121 -0
- package/dist/server-fn.d.ts +121 -0
- package/dist/server-plugins.d.mts +57 -0
- package/dist/server-plugins.d.ts +57 -0
- package/dist/server-query-client.d.mts +51 -0
- package/dist/server-query-client.d.ts +51 -0
- package/dist/server-query.d.mts +37 -0
- package/dist/server-query.d.ts +37 -0
- package/dist/server.cjs +45 -67
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.mts +51 -0
- package/dist/server.d.ts +51 -0
- package/dist/server.mjs +8 -22
- package/dist/server.mjs.map +1 -1
- package/dist/storage.d.mts +52 -0
- package/dist/storage.d.ts +52 -0
- package/dist/testing.d.mts +103 -0
- package/dist/testing.d.ts +103 -0
- package/dist/transport-BmbGTXA5.d.mts +49 -0
- package/dist/transport-BmbGTXA5.d.ts +49 -0
- package/dist/types-BMxWr97v.d.mts +81 -0
- package/dist/types-BMxWr97v.d.ts +81 -0
- package/dist/types-D1A6-XvH.d.mts +73 -0
- package/dist/types-D1A6-XvH.d.ts +73 -0
- package/dist/types-DTzm4TCl.d.mts +78 -0
- package/dist/types-DTzm4TCl.d.ts +78 -0
- package/dist/utils-s9pN0Yep.d.mts +23 -0
- package/dist/utils-xTFxzu47.d.ts +23 -0
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.mts +3 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +44 -50
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.mts +24 -0
- package/dist/vite.d.ts +24 -0
- package/dist/vite.mjs +4 -3
- package/dist/workflows-CusFV6mn.d.mts +153 -0
- package/dist/workflows-CusFV6mn.d.ts +153 -0
- package/dist/workflows.d.mts +1 -0
- package/dist/workflows.d.ts +1 -0
- package/package.json +1 -1
- package/dist/chunk-4EATUJFO.mjs.map +0 -1
- package/dist/chunk-FKKM7HVF.mjs.map +0 -1
- package/dist/chunk-MIUW47JX.mjs.map +0 -1
- /package/dist/{chunk-RIXKJPGI.mjs.map → chunk-42325TLU.mjs.map} +0 -0
- /package/dist/{chunk-VIC7NJ77.mjs.map → chunk-ZP73P4VR.mjs.map} +0 -0
package/dist/vite.d.mts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import 'vite';
|
|
2
|
+
export { d as defineConfig, dy as farmI18nClientBridgePlugin, f as farmPlugin, dz as rewriteEarlySsrRelativeImports } from './client-plugins-QQntVkrv.mjs';
|
|
3
|
+
import './plugin-BJDf43dc.mjs';
|
|
4
|
+
import 'react';
|
|
5
|
+
import 'http';
|
|
6
|
+
import './types-D1A6-XvH.mjs';
|
|
7
|
+
import 'db0';
|
|
8
|
+
import 'unstorage';
|
|
9
|
+
import './integration-api-CHT2OKAf.mjs';
|
|
10
|
+
import '@farming-labs/orm';
|
|
11
|
+
import './types-DTzm4TCl.mjs';
|
|
12
|
+
import '@farming-labs/docs';
|
|
13
|
+
import './markdown.mjs';
|
|
14
|
+
import './observability.mjs';
|
|
15
|
+
import './workflows-CusFV6mn.mjs';
|
|
16
|
+
import './cron.mjs';
|
|
17
|
+
import './env.mjs';
|
|
18
|
+
import './server-action-security.mjs';
|
|
19
|
+
import './server-fn-error-DDh14a0V.mjs';
|
|
20
|
+
import './image-config-Duob7wER.mjs';
|
|
21
|
+
import './types-BMxWr97v.mjs';
|
|
22
|
+
import './cache.mjs';
|
|
23
|
+
import './route-runtime-DoOHzCAD.mjs';
|
|
24
|
+
import './font.mjs';
|
package/dist/vite.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import 'vite';
|
|
2
|
+
export { d as defineConfig, dy as farmI18nClientBridgePlugin, f as farmPlugin, dz as rewriteEarlySsrRelativeImports } from './client-plugins-CbRum1fj.js';
|
|
3
|
+
import './plugin-BJDf43dc.js';
|
|
4
|
+
import 'react';
|
|
5
|
+
import 'http';
|
|
6
|
+
import './types-D1A6-XvH.js';
|
|
7
|
+
import 'db0';
|
|
8
|
+
import 'unstorage';
|
|
9
|
+
import './integration-api-CHT2OKAf.js';
|
|
10
|
+
import '@farming-labs/orm';
|
|
11
|
+
import './types-DTzm4TCl.js';
|
|
12
|
+
import '@farming-labs/docs';
|
|
13
|
+
import './markdown.js';
|
|
14
|
+
import './observability.js';
|
|
15
|
+
import './workflows-CusFV6mn.js';
|
|
16
|
+
import './cron.js';
|
|
17
|
+
import './env.js';
|
|
18
|
+
import './server-action-security.js';
|
|
19
|
+
import './server-fn-error-DDh14a0V.js';
|
|
20
|
+
import './image-config-Duob7wER.js';
|
|
21
|
+
import './types-BMxWr97v.js';
|
|
22
|
+
import './cache.js';
|
|
23
|
+
import './route-runtime-DoOHzCAD.js';
|
|
24
|
+
import './font.js';
|
package/dist/vite.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
farmI18nClientBridgePlugin,
|
|
4
4
|
farmPlugin,
|
|
5
5
|
rewriteEarlySsrRelativeImports
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XBKXKJX5.mjs";
|
|
7
7
|
import "./chunk-LGHEOHBU.mjs";
|
|
8
8
|
import "./chunk-FRPWCMMG.mjs";
|
|
9
9
|
import "./chunk-53MVSX3R.mjs";
|
|
@@ -28,9 +28,10 @@ import "./chunk-4E6VRJ6P.mjs";
|
|
|
28
28
|
import "./chunk-GXASWWJU.mjs";
|
|
29
29
|
import "./chunk-CRN3AH35.mjs";
|
|
30
30
|
import "./chunk-T4QJQK76.mjs";
|
|
31
|
-
import "./chunk-
|
|
31
|
+
import "./chunk-2PEJGY5V.mjs";
|
|
32
32
|
import "./chunk-P7QDS5AT.mjs";
|
|
33
33
|
import "./chunk-E6EPN5BT.mjs";
|
|
34
|
+
import "./chunk-GIELMNBG.mjs";
|
|
34
35
|
import "./chunk-QGOHVJ6J.mjs";
|
|
35
36
|
import "./chunk-KALXVY5L.mjs";
|
|
36
37
|
import "./chunk-2ED5Q2GH.mjs";
|
|
@@ -44,7 +45,7 @@ import "./chunk-KQCOGTU7.mjs";
|
|
|
44
45
|
import "./chunk-YTMDIHQN.mjs";
|
|
45
46
|
import "./chunk-RHIFZZUI.mjs";
|
|
46
47
|
import "./chunk-LM2YNO4U.mjs";
|
|
47
|
-
import "./chunk-
|
|
48
|
+
import "./chunk-DAUR3WUZ.mjs";
|
|
48
49
|
import "./chunk-B3FFOIWS.mjs";
|
|
49
50
|
import "./chunk-ITN462YM.mjs";
|
|
50
51
|
import "./chunk-3HIVDX7J.mjs";
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
type FarmServerDuration = number | `${number}${"ms" | "s" | "m" | "h"}`;
|
|
2
|
+
interface FarmServerHealthConfig {
|
|
3
|
+
/** Liveness endpoint. It remains healthy while a production process drains. */
|
|
4
|
+
livenessPath?: string;
|
|
5
|
+
/** Readiness endpoint. It returns 503 until startup completes and while draining. */
|
|
6
|
+
readinessPath?: string;
|
|
7
|
+
}
|
|
8
|
+
interface ResolvedFarmServerHealthConfig {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
livenessPath: string;
|
|
11
|
+
readinessPath: string;
|
|
12
|
+
}
|
|
13
|
+
interface FarmServerConfig {
|
|
14
|
+
/** Maximum request body size for API routes, integrations, workflows, and uploads. */
|
|
15
|
+
bodySizeLimit?: number | string;
|
|
16
|
+
/** Trust proxy-provided client IP headers. Enable only behind a trusted proxy. */
|
|
17
|
+
trustProxy?: boolean;
|
|
18
|
+
/** Maximum time for a Node client to send complete request headers. */
|
|
19
|
+
headersTimeout?: FarmServerDuration;
|
|
20
|
+
/** Maximum time for a Node client to send the complete request. */
|
|
21
|
+
requestTimeout?: FarmServerDuration;
|
|
22
|
+
/** How long an idle Node keep-alive connection remains open after a response. */
|
|
23
|
+
keepAliveTimeout?: FarmServerDuration;
|
|
24
|
+
/** Maximum time the Node adapter drains traffic before forcing shutdown. */
|
|
25
|
+
gracefulShutdownTimeout?: FarmServerDuration;
|
|
26
|
+
/** Production liveness and readiness endpoints. Set to false to disable them. */
|
|
27
|
+
health?: false | FarmServerHealthConfig;
|
|
28
|
+
}
|
|
29
|
+
interface ResolvedFarmServerConfig {
|
|
30
|
+
bodySizeLimit: number;
|
|
31
|
+
trustProxy: boolean;
|
|
32
|
+
headersTimeout: number;
|
|
33
|
+
requestTimeout: number;
|
|
34
|
+
keepAliveTimeout: number;
|
|
35
|
+
gracefulShutdownTimeout: number;
|
|
36
|
+
health: ResolvedFarmServerHealthConfig;
|
|
37
|
+
}
|
|
38
|
+
declare function resolveFarmServerConfig(config: FarmServerConfig | ResolvedFarmServerConfig | undefined): ResolvedFarmServerConfig;
|
|
39
|
+
declare function bufferFarmRequestBody(request: Request, limit: number): Promise<Request>;
|
|
40
|
+
declare function createFarmRequestBodyErrorResponse(error: unknown): Response | null;
|
|
41
|
+
|
|
42
|
+
type FarmWorkflowSchedule = string | string[];
|
|
43
|
+
interface FarmWorkflowsUserConfig {
|
|
44
|
+
/** Enable or disable Farm workflow discovery. Enabled by default. */
|
|
45
|
+
enabled?: boolean;
|
|
46
|
+
/** Directory or directories to scan for workflow modules. */
|
|
47
|
+
dir?: string | string[];
|
|
48
|
+
/** Alias for dir. */
|
|
49
|
+
dirs?: string[];
|
|
50
|
+
/** HTTP route used for manual and URL-based cron invocation. */
|
|
51
|
+
route?: string;
|
|
52
|
+
/** Environment variable that stores the optional runner secret. */
|
|
53
|
+
secretEnv?: string;
|
|
54
|
+
/** Inline runner secret. Prefer secretEnv for deployed apps. */
|
|
55
|
+
secret?: string;
|
|
56
|
+
}
|
|
57
|
+
interface FarmWorkflowsResolvedConfig {
|
|
58
|
+
enabled: boolean;
|
|
59
|
+
dirs: string[];
|
|
60
|
+
route: string;
|
|
61
|
+
secretEnv: string;
|
|
62
|
+
secret?: string;
|
|
63
|
+
}
|
|
64
|
+
interface FarmWorkflowLogger {
|
|
65
|
+
info: (...args: unknown[]) => void;
|
|
66
|
+
warn: (...args: unknown[]) => void;
|
|
67
|
+
error: (...args: unknown[]) => void;
|
|
68
|
+
}
|
|
69
|
+
interface FarmWorkflowRunContext<TPayload = unknown> {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
payload: TPayload;
|
|
73
|
+
scheduledTime?: number | string;
|
|
74
|
+
request?: Request;
|
|
75
|
+
event?: unknown;
|
|
76
|
+
env: Record<string, string | undefined>;
|
|
77
|
+
data: Map<string, unknown>;
|
|
78
|
+
log: FarmWorkflowLogger;
|
|
79
|
+
}
|
|
80
|
+
interface FarmWorkflowDefinition<TPayload = unknown, TResult = unknown> {
|
|
81
|
+
kind?: "farm-workflow";
|
|
82
|
+
id?: string;
|
|
83
|
+
description?: string;
|
|
84
|
+
schedule?: FarmWorkflowSchedule;
|
|
85
|
+
timezone?: string;
|
|
86
|
+
run: (ctx: FarmWorkflowRunContext<TPayload>) => TResult | Promise<TResult>;
|
|
87
|
+
}
|
|
88
|
+
interface FarmCronDefinition<TPayload = unknown, TResult = unknown> extends FarmWorkflowDefinition<TPayload, TResult> {
|
|
89
|
+
schedule: FarmWorkflowSchedule;
|
|
90
|
+
}
|
|
91
|
+
interface FarmDiscoveredWorkflow {
|
|
92
|
+
id: string;
|
|
93
|
+
filePath: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
schedule: string[];
|
|
96
|
+
timezone?: string;
|
|
97
|
+
routePath: string;
|
|
98
|
+
}
|
|
99
|
+
interface PreparedFarmWorkflows {
|
|
100
|
+
workflows: FarmDiscoveredWorkflow[];
|
|
101
|
+
tasks: Record<string, {
|
|
102
|
+
handler: string;
|
|
103
|
+
description: string;
|
|
104
|
+
}>;
|
|
105
|
+
scheduledTasks: Record<string, string | string[]>;
|
|
106
|
+
handlerPath?: string;
|
|
107
|
+
manifestPath?: string;
|
|
108
|
+
}
|
|
109
|
+
interface FarmWorkflowHTTPHandlerOptions {
|
|
110
|
+
workflows: FarmDiscoveredWorkflow[];
|
|
111
|
+
config: FarmWorkflowsResolvedConfig;
|
|
112
|
+
loadModule: (workflow: FarmDiscoveredWorkflow) => Promise<Record<string, any>>;
|
|
113
|
+
server?: FarmServerConfig | ResolvedFarmServerConfig;
|
|
114
|
+
}
|
|
115
|
+
declare const DEFAULT_FARM_WORKFLOW_DIRS: string[];
|
|
116
|
+
declare const DEFAULT_FARM_WORKFLOW_ROUTE = "/api/_farm/workflows";
|
|
117
|
+
declare const DEFAULT_FARM_WORKFLOW_SECRET_ENV = "CRON_SECRET";
|
|
118
|
+
declare function defineWorkflow<const TPayload = unknown, TResult = unknown>(definition: FarmWorkflowDefinition<TPayload, TResult>): FarmWorkflowDefinition<TPayload, TResult>;
|
|
119
|
+
declare function defineTask<const TPayload = unknown, TResult = unknown>(definition: FarmWorkflowDefinition<TPayload, TResult>): FarmWorkflowDefinition<TPayload, TResult>;
|
|
120
|
+
/**
|
|
121
|
+
* @deprecated Configure `cron` in `farm.config.ts` and point it at an API route.
|
|
122
|
+
*/
|
|
123
|
+
declare function defineCron<const TPayload = unknown, TResult = unknown>(definition: FarmCronDefinition<TPayload, TResult>): FarmCronDefinition<TPayload, TResult>;
|
|
124
|
+
declare function resolveWorkflowsConfig(workflows: FarmWorkflowsUserConfig | boolean | undefined): FarmWorkflowsResolvedConfig;
|
|
125
|
+
declare function discoverFarmWorkflows(config: {
|
|
126
|
+
root?: string;
|
|
127
|
+
workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;
|
|
128
|
+
}, options?: {
|
|
129
|
+
loadModule?: (filePath: string) => Promise<Record<string, any>>;
|
|
130
|
+
}): Promise<FarmDiscoveredWorkflow[]>;
|
|
131
|
+
declare function createFarmWorkflowRequestHandler(options: FarmWorkflowHTTPHandlerOptions): (request: Request) => Promise<Response | null>;
|
|
132
|
+
declare function runFarmWorkflowModule(module: Record<string, any>, context: {
|
|
133
|
+
id: string;
|
|
134
|
+
name?: string;
|
|
135
|
+
payload?: unknown;
|
|
136
|
+
scheduledTime?: number | string;
|
|
137
|
+
request?: Request;
|
|
138
|
+
event?: unknown;
|
|
139
|
+
env?: Record<string, string | undefined>;
|
|
140
|
+
}): Promise<unknown>;
|
|
141
|
+
declare function prepareFarmWorkflowsForNitro(config: {
|
|
142
|
+
root?: string;
|
|
143
|
+
distDir?: string;
|
|
144
|
+
workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;
|
|
145
|
+
server?: FarmServerConfig | ResolvedFarmServerConfig;
|
|
146
|
+
}): Promise<PreparedFarmWorkflows>;
|
|
147
|
+
declare function createFarmWorkflowVercelCrons(workflows: FarmDiscoveredWorkflow[]): Array<{
|
|
148
|
+
path: string;
|
|
149
|
+
schedule: string;
|
|
150
|
+
}>;
|
|
151
|
+
declare function applyFarmWorkflowVercelCrons(vercelConfig: Record<string, any>, workflows: FarmDiscoveredWorkflow[]): Record<string, any>;
|
|
152
|
+
|
|
153
|
+
export { applyFarmWorkflowVercelCrons as A, DEFAULT_FARM_WORKFLOW_DIRS as D, type FarmWorkflowsResolvedConfig as F, type PreparedFarmWorkflows as P, type ResolvedFarmServerConfig as R, type FarmServerConfig as a, bufferFarmRequestBody as b, createFarmRequestBodyErrorResponse as c, type FarmServerDuration as d, type FarmServerHealthConfig as e, type ResolvedFarmServerHealthConfig as f, type FarmWorkflowsUserConfig as g, type FarmWorkflowSchedule as h, type FarmWorkflowLogger as i, type FarmWorkflowRunContext as j, type FarmWorkflowDefinition as k, type FarmCronDefinition as l, type FarmDiscoveredWorkflow as m, type FarmWorkflowHTTPHandlerOptions as n, DEFAULT_FARM_WORKFLOW_ROUTE as o, DEFAULT_FARM_WORKFLOW_SECRET_ENV as p, defineWorkflow as q, resolveFarmServerConfig as r, defineTask as s, defineCron as t, resolveWorkflowsConfig as u, discoverFarmWorkflows as v, createFarmWorkflowRequestHandler as w, runFarmWorkflowModule as x, prepareFarmWorkflowsForNitro as y, createFarmWorkflowVercelCrons as z };
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
type FarmServerDuration = number | `${number}${"ms" | "s" | "m" | "h"}`;
|
|
2
|
+
interface FarmServerHealthConfig {
|
|
3
|
+
/** Liveness endpoint. It remains healthy while a production process drains. */
|
|
4
|
+
livenessPath?: string;
|
|
5
|
+
/** Readiness endpoint. It returns 503 until startup completes and while draining. */
|
|
6
|
+
readinessPath?: string;
|
|
7
|
+
}
|
|
8
|
+
interface ResolvedFarmServerHealthConfig {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
livenessPath: string;
|
|
11
|
+
readinessPath: string;
|
|
12
|
+
}
|
|
13
|
+
interface FarmServerConfig {
|
|
14
|
+
/** Maximum request body size for API routes, integrations, workflows, and uploads. */
|
|
15
|
+
bodySizeLimit?: number | string;
|
|
16
|
+
/** Trust proxy-provided client IP headers. Enable only behind a trusted proxy. */
|
|
17
|
+
trustProxy?: boolean;
|
|
18
|
+
/** Maximum time for a Node client to send complete request headers. */
|
|
19
|
+
headersTimeout?: FarmServerDuration;
|
|
20
|
+
/** Maximum time for a Node client to send the complete request. */
|
|
21
|
+
requestTimeout?: FarmServerDuration;
|
|
22
|
+
/** How long an idle Node keep-alive connection remains open after a response. */
|
|
23
|
+
keepAliveTimeout?: FarmServerDuration;
|
|
24
|
+
/** Maximum time the Node adapter drains traffic before forcing shutdown. */
|
|
25
|
+
gracefulShutdownTimeout?: FarmServerDuration;
|
|
26
|
+
/** Production liveness and readiness endpoints. Set to false to disable them. */
|
|
27
|
+
health?: false | FarmServerHealthConfig;
|
|
28
|
+
}
|
|
29
|
+
interface ResolvedFarmServerConfig {
|
|
30
|
+
bodySizeLimit: number;
|
|
31
|
+
trustProxy: boolean;
|
|
32
|
+
headersTimeout: number;
|
|
33
|
+
requestTimeout: number;
|
|
34
|
+
keepAliveTimeout: number;
|
|
35
|
+
gracefulShutdownTimeout: number;
|
|
36
|
+
health: ResolvedFarmServerHealthConfig;
|
|
37
|
+
}
|
|
38
|
+
declare function resolveFarmServerConfig(config: FarmServerConfig | ResolvedFarmServerConfig | undefined): ResolvedFarmServerConfig;
|
|
39
|
+
declare function bufferFarmRequestBody(request: Request, limit: number): Promise<Request>;
|
|
40
|
+
declare function createFarmRequestBodyErrorResponse(error: unknown): Response | null;
|
|
41
|
+
|
|
42
|
+
type FarmWorkflowSchedule = string | string[];
|
|
43
|
+
interface FarmWorkflowsUserConfig {
|
|
44
|
+
/** Enable or disable Farm workflow discovery. Enabled by default. */
|
|
45
|
+
enabled?: boolean;
|
|
46
|
+
/** Directory or directories to scan for workflow modules. */
|
|
47
|
+
dir?: string | string[];
|
|
48
|
+
/** Alias for dir. */
|
|
49
|
+
dirs?: string[];
|
|
50
|
+
/** HTTP route used for manual and URL-based cron invocation. */
|
|
51
|
+
route?: string;
|
|
52
|
+
/** Environment variable that stores the optional runner secret. */
|
|
53
|
+
secretEnv?: string;
|
|
54
|
+
/** Inline runner secret. Prefer secretEnv for deployed apps. */
|
|
55
|
+
secret?: string;
|
|
56
|
+
}
|
|
57
|
+
interface FarmWorkflowsResolvedConfig {
|
|
58
|
+
enabled: boolean;
|
|
59
|
+
dirs: string[];
|
|
60
|
+
route: string;
|
|
61
|
+
secretEnv: string;
|
|
62
|
+
secret?: string;
|
|
63
|
+
}
|
|
64
|
+
interface FarmWorkflowLogger {
|
|
65
|
+
info: (...args: unknown[]) => void;
|
|
66
|
+
warn: (...args: unknown[]) => void;
|
|
67
|
+
error: (...args: unknown[]) => void;
|
|
68
|
+
}
|
|
69
|
+
interface FarmWorkflowRunContext<TPayload = unknown> {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
payload: TPayload;
|
|
73
|
+
scheduledTime?: number | string;
|
|
74
|
+
request?: Request;
|
|
75
|
+
event?: unknown;
|
|
76
|
+
env: Record<string, string | undefined>;
|
|
77
|
+
data: Map<string, unknown>;
|
|
78
|
+
log: FarmWorkflowLogger;
|
|
79
|
+
}
|
|
80
|
+
interface FarmWorkflowDefinition<TPayload = unknown, TResult = unknown> {
|
|
81
|
+
kind?: "farm-workflow";
|
|
82
|
+
id?: string;
|
|
83
|
+
description?: string;
|
|
84
|
+
schedule?: FarmWorkflowSchedule;
|
|
85
|
+
timezone?: string;
|
|
86
|
+
run: (ctx: FarmWorkflowRunContext<TPayload>) => TResult | Promise<TResult>;
|
|
87
|
+
}
|
|
88
|
+
interface FarmCronDefinition<TPayload = unknown, TResult = unknown> extends FarmWorkflowDefinition<TPayload, TResult> {
|
|
89
|
+
schedule: FarmWorkflowSchedule;
|
|
90
|
+
}
|
|
91
|
+
interface FarmDiscoveredWorkflow {
|
|
92
|
+
id: string;
|
|
93
|
+
filePath: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
schedule: string[];
|
|
96
|
+
timezone?: string;
|
|
97
|
+
routePath: string;
|
|
98
|
+
}
|
|
99
|
+
interface PreparedFarmWorkflows {
|
|
100
|
+
workflows: FarmDiscoveredWorkflow[];
|
|
101
|
+
tasks: Record<string, {
|
|
102
|
+
handler: string;
|
|
103
|
+
description: string;
|
|
104
|
+
}>;
|
|
105
|
+
scheduledTasks: Record<string, string | string[]>;
|
|
106
|
+
handlerPath?: string;
|
|
107
|
+
manifestPath?: string;
|
|
108
|
+
}
|
|
109
|
+
interface FarmWorkflowHTTPHandlerOptions {
|
|
110
|
+
workflows: FarmDiscoveredWorkflow[];
|
|
111
|
+
config: FarmWorkflowsResolvedConfig;
|
|
112
|
+
loadModule: (workflow: FarmDiscoveredWorkflow) => Promise<Record<string, any>>;
|
|
113
|
+
server?: FarmServerConfig | ResolvedFarmServerConfig;
|
|
114
|
+
}
|
|
115
|
+
declare const DEFAULT_FARM_WORKFLOW_DIRS: string[];
|
|
116
|
+
declare const DEFAULT_FARM_WORKFLOW_ROUTE = "/api/_farm/workflows";
|
|
117
|
+
declare const DEFAULT_FARM_WORKFLOW_SECRET_ENV = "CRON_SECRET";
|
|
118
|
+
declare function defineWorkflow<const TPayload = unknown, TResult = unknown>(definition: FarmWorkflowDefinition<TPayload, TResult>): FarmWorkflowDefinition<TPayload, TResult>;
|
|
119
|
+
declare function defineTask<const TPayload = unknown, TResult = unknown>(definition: FarmWorkflowDefinition<TPayload, TResult>): FarmWorkflowDefinition<TPayload, TResult>;
|
|
120
|
+
/**
|
|
121
|
+
* @deprecated Configure `cron` in `farm.config.ts` and point it at an API route.
|
|
122
|
+
*/
|
|
123
|
+
declare function defineCron<const TPayload = unknown, TResult = unknown>(definition: FarmCronDefinition<TPayload, TResult>): FarmCronDefinition<TPayload, TResult>;
|
|
124
|
+
declare function resolveWorkflowsConfig(workflows: FarmWorkflowsUserConfig | boolean | undefined): FarmWorkflowsResolvedConfig;
|
|
125
|
+
declare function discoverFarmWorkflows(config: {
|
|
126
|
+
root?: string;
|
|
127
|
+
workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;
|
|
128
|
+
}, options?: {
|
|
129
|
+
loadModule?: (filePath: string) => Promise<Record<string, any>>;
|
|
130
|
+
}): Promise<FarmDiscoveredWorkflow[]>;
|
|
131
|
+
declare function createFarmWorkflowRequestHandler(options: FarmWorkflowHTTPHandlerOptions): (request: Request) => Promise<Response | null>;
|
|
132
|
+
declare function runFarmWorkflowModule(module: Record<string, any>, context: {
|
|
133
|
+
id: string;
|
|
134
|
+
name?: string;
|
|
135
|
+
payload?: unknown;
|
|
136
|
+
scheduledTime?: number | string;
|
|
137
|
+
request?: Request;
|
|
138
|
+
event?: unknown;
|
|
139
|
+
env?: Record<string, string | undefined>;
|
|
140
|
+
}): Promise<unknown>;
|
|
141
|
+
declare function prepareFarmWorkflowsForNitro(config: {
|
|
142
|
+
root?: string;
|
|
143
|
+
distDir?: string;
|
|
144
|
+
workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;
|
|
145
|
+
server?: FarmServerConfig | ResolvedFarmServerConfig;
|
|
146
|
+
}): Promise<PreparedFarmWorkflows>;
|
|
147
|
+
declare function createFarmWorkflowVercelCrons(workflows: FarmDiscoveredWorkflow[]): Array<{
|
|
148
|
+
path: string;
|
|
149
|
+
schedule: string;
|
|
150
|
+
}>;
|
|
151
|
+
declare function applyFarmWorkflowVercelCrons(vercelConfig: Record<string, any>, workflows: FarmDiscoveredWorkflow[]): Record<string, any>;
|
|
152
|
+
|
|
153
|
+
export { applyFarmWorkflowVercelCrons as A, DEFAULT_FARM_WORKFLOW_DIRS as D, type FarmWorkflowsResolvedConfig as F, type PreparedFarmWorkflows as P, type ResolvedFarmServerConfig as R, type FarmServerConfig as a, bufferFarmRequestBody as b, createFarmRequestBodyErrorResponse as c, type FarmServerDuration as d, type FarmServerHealthConfig as e, type ResolvedFarmServerHealthConfig as f, type FarmWorkflowsUserConfig as g, type FarmWorkflowSchedule as h, type FarmWorkflowLogger as i, type FarmWorkflowRunContext as j, type FarmWorkflowDefinition as k, type FarmCronDefinition as l, type FarmDiscoveredWorkflow as m, type FarmWorkflowHTTPHandlerOptions as n, DEFAULT_FARM_WORKFLOW_ROUTE as o, DEFAULT_FARM_WORKFLOW_SECRET_ENV as p, defineWorkflow as q, resolveFarmServerConfig as r, defineTask as s, defineCron as t, resolveWorkflowsConfig as u, discoverFarmWorkflows as v, createFarmWorkflowRequestHandler as w, runFarmWorkflowModule as x, prepareFarmWorkflowsForNitro as y, createFarmWorkflowVercelCrons as z };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { D as DEFAULT_FARM_WORKFLOW_DIRS, o as DEFAULT_FARM_WORKFLOW_ROUTE, p as DEFAULT_FARM_WORKFLOW_SECRET_ENV, l as FarmCronDefinition, m as FarmDiscoveredWorkflow, k as FarmWorkflowDefinition, n as FarmWorkflowHTTPHandlerOptions, i as FarmWorkflowLogger, j as FarmWorkflowRunContext, h as FarmWorkflowSchedule, F as FarmWorkflowsResolvedConfig, g as FarmWorkflowsUserConfig, P as PreparedFarmWorkflows, A as applyFarmWorkflowVercelCrons, w as createFarmWorkflowRequestHandler, z as createFarmWorkflowVercelCrons, t as defineCron, s as defineTask, q as defineWorkflow, v as discoverFarmWorkflows, y as prepareFarmWorkflowsForNitro, u as resolveWorkflowsConfig, x as runFarmWorkflowModule } from './workflows-CusFV6mn.mjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { D as DEFAULT_FARM_WORKFLOW_DIRS, o as DEFAULT_FARM_WORKFLOW_ROUTE, p as DEFAULT_FARM_WORKFLOW_SECRET_ENV, l as FarmCronDefinition, m as FarmDiscoveredWorkflow, k as FarmWorkflowDefinition, n as FarmWorkflowHTTPHandlerOptions, i as FarmWorkflowLogger, j as FarmWorkflowRunContext, h as FarmWorkflowSchedule, F as FarmWorkflowsResolvedConfig, g as FarmWorkflowsUserConfig, P as PreparedFarmWorkflows, A as applyFarmWorkflowVercelCrons, w as createFarmWorkflowRequestHandler, z as createFarmWorkflowVercelCrons, t as defineCron, s as defineTask, q as defineWorkflow, v as discoverFarmWorkflows, y as prepareFarmWorkflowsForNitro, u as resolveWorkflowsConfig, x as runFarmWorkflowModule } from './workflows-CusFV6mn.js';
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/vite-plugin.ts"],"sourcesContent":["/**\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\";\nimport {\n createFarmRequestBodyErrorResponse,\n readNodeRequestBody,\n resolveFarmServerConfig,\n} from \"../server-http\";\n\nexport interface FarmApiPluginOptions {\n /** Source directory containing the api folder (default: 'src') */\n srcDir?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Maximum request body size, for example `\"10mb\"`. */\n bodySizeLimit?: number | string;\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 const bodySizeLimit = resolveFarmServerConfig({\n bodySizeLimit: options.bodySizeLimit,\n }).bodySizeLimit;\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, bodySizeLimit);\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(\n _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: Buffer | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n body = await readNodeRequestBody(req as any, bodySizeLimit);\n }\n\n const request = new Request(fullUrl, {\n method,\n headers,\n body: body\n ? (body.buffer.slice(\n body.byteOffset,\n body.byteOffset + body.byteLength,\n ) as ArrayBuffer)\n : 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 bodyErrorResponse = createFarmRequestBodyErrorResponse(error);\n if (bodyErrorResponse) {\n await sendWebResponse(res, bodyErrorResponse);\n return;\n }\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\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"]}
|