@farm.js/core 0.1.0-beta.21 → 0.1.0-beta.23

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.
Files changed (266) hide show
  1. package/dist/after.d.mts +25 -0
  2. package/dist/after.d.ts +25 -0
  3. package/dist/agent-runtime.d.mts +97 -0
  4. package/dist/agent-runtime.d.ts +97 -0
  5. package/dist/api/route-manager.d.mts +68 -0
  6. package/dist/api/route-manager.d.ts +68 -0
  7. package/dist/api/runtime.d.mts +3 -0
  8. package/dist/api/runtime.d.ts +3 -0
  9. package/dist/api.cjs +22 -19
  10. package/dist/api.cjs.map +1 -1
  11. package/dist/api.d.mts +50 -0
  12. package/dist/api.d.ts +50 -0
  13. package/dist/api.mjs +2 -1
  14. package/dist/app-CTFnOJaI.d.ts +308 -0
  15. package/dist/app-DA6ospIq.d.mts +308 -0
  16. package/dist/app-markdown.d.mts +25 -0
  17. package/dist/app-markdown.d.ts +25 -0
  18. package/dist/cache.d.mts +192 -0
  19. package/dist/cache.d.ts +192 -0
  20. package/dist/{chunk-MIUW47JX.mjs → chunk-2PEJGY5V.mjs} +15 -20
  21. package/dist/chunk-2PEJGY5V.mjs.map +1 -0
  22. package/dist/{chunk-RIXKJPGI.mjs → chunk-42325TLU.mjs} +2 -2
  23. package/dist/chunk-4IVNW5QD.mjs +82 -0
  24. package/dist/chunk-4IVNW5QD.mjs.map +1 -0
  25. package/dist/{chunk-I3UWA2P2.mjs → chunk-5NOVWCFL.mjs} +2 -2
  26. package/dist/chunk-5NOVWCFL.mjs.map +1 -0
  27. package/dist/chunk-D42BNPZH.mjs +79 -0
  28. package/dist/chunk-D42BNPZH.mjs.map +1 -0
  29. package/dist/{chunk-LLPN5SEZ.mjs → chunk-DVPRBMU2.mjs} +2 -2
  30. package/dist/{chunk-VIC7NJ77.mjs → chunk-FJGTYLCO.mjs} +67 -20
  31. package/dist/chunk-FJGTYLCO.mjs.map +1 -0
  32. package/dist/chunk-GIELMNBG.mjs +15 -0
  33. package/dist/chunk-GIELMNBG.mjs.map +1 -0
  34. package/dist/chunk-GQVQESLY.mjs +25 -0
  35. package/dist/chunk-GQVQESLY.mjs.map +1 -0
  36. package/dist/chunk-H53KVQUU.mjs +48 -0
  37. package/dist/chunk-H53KVQUU.mjs.map +1 -0
  38. package/dist/chunk-HCGQYYHI.mjs +1 -0
  39. package/dist/chunk-HCGQYYHI.mjs.map +1 -0
  40. package/dist/{chunk-4EATUJFO.mjs → chunk-ICTGDDV4.mjs} +20 -22
  41. package/dist/chunk-ICTGDDV4.mjs.map +1 -0
  42. package/dist/{chunk-UCYWGN2P.mjs → chunk-OHNSROHS.mjs} +1 -1
  43. package/dist/{chunk-FRPWCMMG.mjs → chunk-SBWOTAX4.mjs} +63 -2
  44. package/dist/chunk-SBWOTAX4.mjs.map +1 -0
  45. package/dist/{chunk-FKKM7HVF.mjs → chunk-TX54PXAJ.mjs} +109 -58
  46. package/dist/chunk-TX54PXAJ.mjs.map +1 -0
  47. package/dist/{chunk-CEVMYGDL.mjs → chunk-YD5IRKVS.mjs} +13 -9
  48. package/dist/chunk-YD5IRKVS.mjs.map +1 -0
  49. package/dist/chunk-recovery-lnQFzcQP.d.mts +26 -0
  50. package/dist/chunk-recovery-lnQFzcQP.d.ts +26 -0
  51. package/dist/client-BT1mFQas.d.mts +447 -0
  52. package/dist/client-Nn0q4eO4.d.ts +447 -0
  53. package/dist/client-cache-CIlyBlmx.d.ts +6 -0
  54. package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
  55. package/dist/client-plugins-CCilIb_G.d.mts +2092 -0
  56. package/dist/client-plugins-DuuleQKk.d.ts +2092 -0
  57. package/dist/client-plugins.d.mts +25 -0
  58. package/dist/client-plugins.d.ts +25 -0
  59. package/dist/client.cjs +122 -35
  60. package/dist/client.cjs.map +1 -1
  61. package/dist/client.d.mts +454 -0
  62. package/dist/client.d.ts +454 -0
  63. package/dist/client.mjs +13 -2
  64. package/dist/config.d.mts +32 -0
  65. package/dist/config.d.ts +32 -0
  66. package/dist/cron.d.mts +78 -0
  67. package/dist/cron.d.ts +78 -0
  68. package/dist/deferred.d.mts +42 -0
  69. package/dist/deferred.d.ts +42 -0
  70. package/dist/deployment.d.mts +36 -0
  71. package/dist/deployment.d.ts +36 -0
  72. package/dist/{devtools-52FYXIEK.mjs → devtools-326RBQCN.mjs} +7 -6
  73. package/dist/{devtools-52FYXIEK.mjs.map → devtools-326RBQCN.mjs.map} +1 -1
  74. package/dist/docs.cjs.map +1 -1
  75. package/dist/docs.d.mts +80 -0
  76. package/dist/docs.d.ts +80 -0
  77. package/dist/docs.mjs +6 -5
  78. package/dist/env-types.d.mts +12 -0
  79. package/dist/env-types.d.ts +12 -0
  80. package/dist/env.d.mts +45 -0
  81. package/dist/env.d.ts +45 -0
  82. package/dist/environment/vite.d.mts +22 -0
  83. package/dist/environment/vite.d.ts +22 -0
  84. package/dist/environment.d.mts +18 -0
  85. package/dist/environment.d.ts +18 -0
  86. package/dist/font.d.mts +95 -0
  87. package/dist/font.d.ts +95 -0
  88. package/dist/headers.d.mts +22 -0
  89. package/dist/headers.d.ts +22 -0
  90. package/dist/i18n/client.d.mts +32 -0
  91. package/dist/i18n/client.d.ts +32 -0
  92. package/dist/i18n/index.d.mts +20 -0
  93. package/dist/i18n/index.d.ts +20 -0
  94. package/dist/i18n/server.d.mts +30 -0
  95. package/dist/i18n/server.d.ts +30 -0
  96. package/dist/image/server.d.mts +37 -0
  97. package/dist/image/server.d.ts +37 -0
  98. package/dist/image/sharp.d.mts +7 -0
  99. package/dist/image/sharp.d.ts +7 -0
  100. package/dist/image-config-Duob7wER.d.mts +50 -0
  101. package/dist/image-config-Duob7wER.d.ts +50 -0
  102. package/dist/image.d.mts +39 -0
  103. package/dist/image.d.ts +39 -0
  104. package/dist/index.cjs +496 -123
  105. package/dist/index.cjs.map +1 -1
  106. package/dist/index.d.mts +480 -0
  107. package/dist/index.d.ts +480 -0
  108. package/dist/index.mjs +70 -52
  109. package/dist/index.mjs.map +1 -1
  110. package/dist/integration-api-CHT2OKAf.d.mts +93 -0
  111. package/dist/integration-api-CHT2OKAf.d.ts +93 -0
  112. package/dist/integrations.d.mts +25 -0
  113. package/dist/integrations.d.ts +25 -0
  114. package/dist/internal/build-runtime.cjs +386 -83
  115. package/dist/internal/build-runtime.cjs.map +1 -1
  116. package/dist/internal/build-runtime.d.mts +42 -0
  117. package/dist/internal/build-runtime.d.ts +42 -0
  118. package/dist/internal/build-runtime.mjs +17 -13
  119. package/dist/internal/client-runtime.d.mts +17 -0
  120. package/dist/internal/client-runtime.d.ts +17 -0
  121. package/dist/internal/config-runtime.cjs +41 -0
  122. package/dist/internal/config-runtime.cjs.map +1 -1
  123. package/dist/internal/config-runtime.d.mts +42 -0
  124. package/dist/internal/config-runtime.d.ts +42 -0
  125. package/dist/internal/config-runtime.mjs +5 -4
  126. package/dist/internal/metadata-image-runtime.d.mts +25 -0
  127. package/dist/internal/metadata-image-runtime.d.ts +25 -0
  128. package/dist/internal/production-node-env.d.mts +12 -0
  129. package/dist/internal/production-node-env.d.ts +12 -0
  130. package/dist/internal/production-runtime.cjs +178 -0
  131. package/dist/internal/production-runtime.cjs.map +1 -1
  132. package/dist/internal/production-runtime.d.mts +80 -0
  133. package/dist/internal/production-runtime.d.ts +80 -0
  134. package/dist/internal/production-runtime.mjs +13 -1
  135. package/dist/internal/production-runtime.mjs.map +1 -1
  136. package/dist/island-CfGru1MO.d.mts +9 -0
  137. package/dist/island-CfGru1MO.d.ts +9 -0
  138. package/dist/markdown.d.mts +60 -0
  139. package/dist/markdown.d.ts +60 -0
  140. package/dist/metadata-DyPRG0wX.d.ts +22 -0
  141. package/dist/metadata-_GHcAySx.d.mts +22 -0
  142. package/dist/middleware.cjs +17 -17
  143. package/dist/middleware.cjs.map +1 -1
  144. package/dist/middleware.d.mts +172 -0
  145. package/dist/middleware.d.ts +172 -0
  146. package/dist/middleware.mjs +3 -2
  147. package/dist/navigation-errors-Dvwpzaer.d.mts +13 -0
  148. package/dist/navigation-errors-Dvwpzaer.d.ts +13 -0
  149. package/dist/navigation.d.mts +14 -0
  150. package/dist/navigation.d.ts +14 -0
  151. package/dist/observability.d.mts +335 -0
  152. package/dist/observability.d.ts +335 -0
  153. package/dist/params-BALtrRim.d.ts +15 -0
  154. package/dist/params-ry-lxqmy.d.mts +15 -0
  155. package/dist/plugin-BJDf43dc.d.mts +165 -0
  156. package/dist/plugin-BJDf43dc.d.ts +165 -0
  157. package/dist/plugin.cjs +261 -62
  158. package/dist/plugin.cjs.map +1 -1
  159. package/dist/plugin.d.mts +25 -0
  160. package/dist/plugin.d.ts +25 -0
  161. package/dist/plugin.mjs +13 -9
  162. package/dist/production-runtime-C4cO3esK.d.mts +81 -0
  163. package/dist/production-runtime-DrEy8kBO.d.ts +81 -0
  164. package/dist/query/client.d.mts +61 -0
  165. package/dist/query/client.d.ts +61 -0
  166. package/dist/query/index.d.mts +90 -0
  167. package/dist/query/index.d.ts +90 -0
  168. package/dist/query/parsers.d.mts +25 -0
  169. package/dist/query/parsers.d.ts +25 -0
  170. package/dist/query/server.d.mts +55 -0
  171. package/dist/query/server.d.ts +55 -0
  172. package/dist/request-B2PpOxYK.d.mts +6 -0
  173. package/dist/request-D40lt6aN.d.ts +6 -0
  174. package/dist/request.d.mts +26 -0
  175. package/dist/request.d.ts +26 -0
  176. package/dist/resolver-DJqjLMg_.d.mts +14 -0
  177. package/dist/resolver-IH4RmPEl.d.ts +14 -0
  178. package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
  179. package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
  180. package/dist/router.d.mts +36 -0
  181. package/dist/router.d.ts +36 -0
  182. package/dist/routes.d.mts +227 -0
  183. package/dist/routes.d.ts +227 -0
  184. package/dist/runtime-Bpp-c28k.d.ts +231 -0
  185. package/dist/runtime-Cxpq6xZN.d.mts +27 -0
  186. package/dist/runtime-Q3u74Nbq.d.mts +231 -0
  187. package/dist/runtime-bv63eUiO.d.ts +27 -0
  188. package/dist/server-action-security.d.mts +45 -0
  189. package/dist/server-action-security.d.ts +45 -0
  190. package/dist/server-fn-client.d.mts +33 -0
  191. package/dist/server-fn-client.d.ts +33 -0
  192. package/dist/server-fn-error-DDh14a0V.d.mts +26 -0
  193. package/dist/server-fn-error-DDh14a0V.d.ts +26 -0
  194. package/dist/server-fn.d.mts +121 -0
  195. package/dist/server-fn.d.ts +121 -0
  196. package/dist/server-plugins.d.mts +58 -0
  197. package/dist/server-plugins.d.ts +58 -0
  198. package/dist/server-query-client.d.mts +51 -0
  199. package/dist/server-query-client.d.ts +51 -0
  200. package/dist/server-query.d.mts +37 -0
  201. package/dist/server-query.d.ts +37 -0
  202. package/dist/server.cjs +285 -85
  203. package/dist/server.cjs.map +1 -1
  204. package/dist/server.d.mts +53 -0
  205. package/dist/server.d.ts +53 -0
  206. package/dist/server.mjs +26 -31
  207. package/dist/server.mjs.map +1 -1
  208. package/dist/storage.d.mts +52 -0
  209. package/dist/storage.d.ts +52 -0
  210. package/dist/testing.d.mts +104 -0
  211. package/dist/testing.d.ts +104 -0
  212. package/dist/theme/client.cjs +115 -0
  213. package/dist/theme/client.cjs.map +1 -0
  214. package/dist/theme/client.d.mts +17 -0
  215. package/dist/theme/client.d.ts +17 -0
  216. package/dist/theme/client.mjs +16 -0
  217. package/dist/theme/client.mjs.map +1 -0
  218. package/dist/theme/index.cjs +71 -0
  219. package/dist/theme/index.cjs.map +1 -0
  220. package/dist/theme/index.d.mts +6 -0
  221. package/dist/theme/index.d.ts +6 -0
  222. package/dist/theme/index.mjs +9 -0
  223. package/dist/theme/index.mjs.map +1 -0
  224. package/dist/theme/server.cjs +191 -0
  225. package/dist/theme/server.cjs.map +1 -0
  226. package/dist/theme/server.d.mts +8 -0
  227. package/dist/theme/server.d.ts +8 -0
  228. package/dist/theme/server.mjs +18 -0
  229. package/dist/theme/server.mjs.map +1 -0
  230. package/dist/transport-BmbGTXA5.d.mts +49 -0
  231. package/dist/transport-BmbGTXA5.d.ts +49 -0
  232. package/dist/types-BMxWr97v.d.mts +81 -0
  233. package/dist/types-BMxWr97v.d.ts +81 -0
  234. package/dist/types-CsR8fpgF.d.mts +30 -0
  235. package/dist/types-CsR8fpgF.d.ts +30 -0
  236. package/dist/types-D1A6-XvH.d.mts +73 -0
  237. package/dist/types-D1A6-XvH.d.ts +73 -0
  238. package/dist/types-DTzm4TCl.d.mts +78 -0
  239. package/dist/types-DTzm4TCl.d.ts +78 -0
  240. package/dist/utils-3sQgfkya.d.ts +23 -0
  241. package/dist/utils-Bop7bly-.d.mts +23 -0
  242. package/dist/version.cjs +1 -1
  243. package/dist/version.cjs.map +1 -1
  244. package/dist/version.d.mts +3 -0
  245. package/dist/version.d.ts +3 -0
  246. package/dist/version.mjs +1 -1
  247. package/dist/vite.cjs +285 -64
  248. package/dist/vite.cjs.map +1 -1
  249. package/dist/vite.d.mts +25 -0
  250. package/dist/vite.d.ts +25 -0
  251. package/dist/vite.mjs +13 -9
  252. package/dist/workflows-CusFV6mn.d.mts +153 -0
  253. package/dist/workflows-CusFV6mn.d.ts +153 -0
  254. package/dist/workflows.d.mts +1 -0
  255. package/dist/workflows.d.ts +1 -0
  256. package/package.json +25 -1
  257. package/dist/chunk-4EATUJFO.mjs.map +0 -1
  258. package/dist/chunk-CEVMYGDL.mjs.map +0 -1
  259. package/dist/chunk-FKKM7HVF.mjs.map +0 -1
  260. package/dist/chunk-FRPWCMMG.mjs.map +0 -1
  261. package/dist/chunk-I3UWA2P2.mjs.map +0 -1
  262. package/dist/chunk-MIUW47JX.mjs.map +0 -1
  263. package/dist/chunk-VIC7NJ77.mjs.map +0 -1
  264. /package/dist/{chunk-RIXKJPGI.mjs.map → chunk-42325TLU.mjs.map} +0 -0
  265. /package/dist/{chunk-LLPN5SEZ.mjs.map → chunk-DVPRBMU2.mjs.map} +0 -0
  266. /package/dist/{chunk-UCYWGN2P.mjs.map → chunk-OHNSROHS.mjs.map} +0 -0
package/dist/cron.d.ts ADDED
@@ -0,0 +1,78 @@
1
+ type FarmCronSchedule = string | string[];
2
+ interface FarmCronJobConfig {
3
+ /** Portable five-field cron expression, or a list of expressions. */
4
+ schedule: FarmCronSchedule;
5
+ /** Farm API route invoked with GET when the schedule fires. */
6
+ path: string;
7
+ /** Human-readable purpose shown by local tooling and deployment manifests. */
8
+ description?: string;
9
+ /** Disable this schedule without removing its configuration. */
10
+ enabled?: boolean;
11
+ }
12
+ type FarmCronUserConfig = Record<string, FarmCronJobConfig>;
13
+ interface FarmCronJob {
14
+ name: string;
15
+ schedule: string[];
16
+ path: string;
17
+ description?: string;
18
+ }
19
+ interface FarmCronResolvedConfig {
20
+ enabled: boolean;
21
+ secretEnv: typeof DEFAULT_FARM_CRON_SECRET_ENV;
22
+ jobs: FarmCronJob[];
23
+ }
24
+ interface PreparedFarmCron {
25
+ jobs: FarmCronJob[];
26
+ tasks: Record<string, {
27
+ handler: string;
28
+ description: string;
29
+ }>;
30
+ scheduledTasks: Record<string, string | string[]>;
31
+ manifestPath?: string;
32
+ }
33
+ interface FarmCronRouteOptions {
34
+ /** Environment variable containing the bearer token. */
35
+ secretEnv?: string;
36
+ /** Inline token, primarily useful in tests. Environment variables are preferred. */
37
+ secret?: string;
38
+ /** Allow a production route without a secret. Defaults to false. */
39
+ allowUnsecured?: boolean;
40
+ }
41
+ interface FarmCronCloudflareConfig {
42
+ deployConfig: true;
43
+ wrangler: {
44
+ triggers: {
45
+ crons: string[];
46
+ };
47
+ };
48
+ }
49
+ declare const DEFAULT_FARM_CRON_SECRET_ENV = "CRON_SECRET";
50
+ declare const FARM_CRON_MANIFEST = "cron-manifest.json";
51
+ declare function resolveCronConfig(cron: FarmCronResolvedConfig | FarmCronUserConfig | false | undefined): FarmCronResolvedConfig;
52
+ declare function prepareFarmCronForNitro(config: {
53
+ root?: string;
54
+ distDir?: string;
55
+ cron?: FarmCronResolvedConfig | FarmCronUserConfig | false;
56
+ }): Promise<PreparedFarmCron>;
57
+ declare function createFarmCronManifest(cron: FarmCronResolvedConfig): {
58
+ schemaVersion: number;
59
+ secretEnv: "CRON_SECRET";
60
+ jobs: {
61
+ name: string;
62
+ schedule: string[];
63
+ path: string;
64
+ description: string | null;
65
+ }[];
66
+ };
67
+ declare function createFarmCronVercelCrons(jobs: FarmCronJob[]): Array<{
68
+ path: string;
69
+ schedule: string;
70
+ }>;
71
+ declare function applyFarmCronVercelCrons(vercelConfig: Record<string, any>, jobs: FarmCronJob[]): Record<string, any>;
72
+ declare function createFarmCronCloudflareTriggers(jobs: FarmCronJob[]): string[];
73
+ declare function createFarmCronCloudflareConfig(jobs: FarmCronJob[]): FarmCronCloudflareConfig | undefined;
74
+ declare function mergeScheduledTasks(...maps: Array<Record<string, string | string[]> | undefined>): Record<string, string | string[]>;
75
+ declare function isCronRequestAuthorized(request: Request, options?: FarmCronRouteOptions): boolean;
76
+ declare function cronRoute<TArgs extends unknown[], TResult>(handler: (request: Request, ...args: TArgs) => TResult, options?: FarmCronRouteOptions): (request: Request, ...args: TArgs) => TResult | Promise<Response>;
77
+
78
+ export { DEFAULT_FARM_CRON_SECRET_ENV, FARM_CRON_MANIFEST, type FarmCronCloudflareConfig, type FarmCronJob, type FarmCronJobConfig, type FarmCronResolvedConfig, type FarmCronRouteOptions, type FarmCronSchedule, type FarmCronUserConfig, type PreparedFarmCron, applyFarmCronVercelCrons, createFarmCronCloudflareConfig, createFarmCronCloudflareTriggers, createFarmCronManifest, createFarmCronVercelCrons, cronRoute, isCronRequestAuthorized, mergeScheduledTasks, prepareFarmCronForNitro, resolveCronConfig };
@@ -0,0 +1,42 @@
1
+ declare const FARM_DEFERRED_CONTENT_TYPE = "application/x-farm-deferred+json";
2
+ declare const FARM_DEFERRED_ERROR_CODE = "FARM_DEFERRED_DATA_ERROR";
3
+ declare const FARM_DEFERRED_BRAND: unique symbol;
4
+ interface Deferred<T> extends Promise<T> {
5
+ readonly [FARM_DEFERRED_BRAND]: true;
6
+ }
7
+ interface PreparedDeferredData {
8
+ data: unknown;
9
+ records: readonly DeferredRecord[];
10
+ }
11
+ interface DeferredRecord {
12
+ id: string;
13
+ promise: Deferred<unknown>;
14
+ }
15
+ type DeferredSettlement = {
16
+ status: "fulfilled";
17
+ value: unknown;
18
+ } | {
19
+ status: "rejected";
20
+ error: {
21
+ code: typeof FARM_DEFERRED_ERROR_CODE;
22
+ message: string;
23
+ };
24
+ };
25
+ type DeferredSettlements = Record<string, DeferredSettlement>;
26
+ interface DeferredDataResponseOptions {
27
+ onError?: (error: unknown, id: string) => void;
28
+ }
29
+ declare class DeferredDataError extends Error {
30
+ readonly name = "DeferredDataError";
31
+ readonly code = "FARM_DEFERRED_DATA_ERROR";
32
+ constructor(message?: string);
33
+ }
34
+ declare function defer<T>(value: PromiseLike<T>): Deferred<Awaited<T>>;
35
+ declare function isDeferred<T = unknown>(value: unknown): value is Deferred<T>;
36
+ declare function prepareDeferredData(value: unknown): PreparedDeferredData;
37
+ declare function snapshotDeferredData(records: readonly DeferredRecord[]): DeferredSettlements;
38
+ declare function reviveDeferredData<T>(value: T, settlements: DeferredSettlements): T;
39
+ declare function createDeferredDataResponse(value: unknown, init?: ResponseInit, options?: DeferredDataResponseOptions): Response;
40
+ declare function readDeferredDataResponse<T>(response: Response): Promise<T>;
41
+
42
+ export { type Deferred, DeferredDataError, type DeferredDataResponseOptions, type DeferredRecord, type DeferredSettlement, type DeferredSettlements, FARM_DEFERRED_BRAND, FARM_DEFERRED_CONTENT_TYPE, FARM_DEFERRED_ERROR_CODE, type PreparedDeferredData, createDeferredDataResponse, defer, isDeferred, prepareDeferredData, readDeferredDataResponse, reviveDeferredData, snapshotDeferredData };
@@ -0,0 +1,42 @@
1
+ declare const FARM_DEFERRED_CONTENT_TYPE = "application/x-farm-deferred+json";
2
+ declare const FARM_DEFERRED_ERROR_CODE = "FARM_DEFERRED_DATA_ERROR";
3
+ declare const FARM_DEFERRED_BRAND: unique symbol;
4
+ interface Deferred<T> extends Promise<T> {
5
+ readonly [FARM_DEFERRED_BRAND]: true;
6
+ }
7
+ interface PreparedDeferredData {
8
+ data: unknown;
9
+ records: readonly DeferredRecord[];
10
+ }
11
+ interface DeferredRecord {
12
+ id: string;
13
+ promise: Deferred<unknown>;
14
+ }
15
+ type DeferredSettlement = {
16
+ status: "fulfilled";
17
+ value: unknown;
18
+ } | {
19
+ status: "rejected";
20
+ error: {
21
+ code: typeof FARM_DEFERRED_ERROR_CODE;
22
+ message: string;
23
+ };
24
+ };
25
+ type DeferredSettlements = Record<string, DeferredSettlement>;
26
+ interface DeferredDataResponseOptions {
27
+ onError?: (error: unknown, id: string) => void;
28
+ }
29
+ declare class DeferredDataError extends Error {
30
+ readonly name = "DeferredDataError";
31
+ readonly code = "FARM_DEFERRED_DATA_ERROR";
32
+ constructor(message?: string);
33
+ }
34
+ declare function defer<T>(value: PromiseLike<T>): Deferred<Awaited<T>>;
35
+ declare function isDeferred<T = unknown>(value: unknown): value is Deferred<T>;
36
+ declare function prepareDeferredData(value: unknown): PreparedDeferredData;
37
+ declare function snapshotDeferredData(records: readonly DeferredRecord[]): DeferredSettlements;
38
+ declare function reviveDeferredData<T>(value: T, settlements: DeferredSettlements): T;
39
+ declare function createDeferredDataResponse(value: unknown, init?: ResponseInit, options?: DeferredDataResponseOptions): Response;
40
+ declare function readDeferredDataResponse<T>(response: Response): Promise<T>;
41
+
42
+ export { type Deferred, DeferredDataError, type DeferredDataResponseOptions, type DeferredRecord, type DeferredSettlement, type DeferredSettlements, FARM_DEFERRED_BRAND, FARM_DEFERRED_CONTENT_TYPE, FARM_DEFERRED_ERROR_CODE, type PreparedDeferredData, createDeferredDataResponse, defer, isDeferred, prepareDeferredData, readDeferredDataResponse, reviveDeferredData, snapshotDeferredData };
@@ -0,0 +1,36 @@
1
+ declare const FARM_DEPLOYMENT_ID_HEADER = "x-farm-deployment-id";
2
+ declare const FARM_DEPLOYMENT_MISMATCH_HEADER = "x-farm-deployment-mismatch";
3
+ declare const FARM_DEPLOYMENT_COOKIE = "__farm_deployment";
4
+ declare const FARM_DEPLOYMENT_MISMATCH_CODE = "FARM_DEPLOYMENT_MISMATCH";
5
+ declare const FARM_DEPLOYMENT_MISMATCH_STATUS = 409;
6
+ type FarmPresetRuntime = "node" | "edge" | "unknown";
7
+ declare function getFarmPresetRuntime(preset: string): FarmPresetRuntime;
8
+ interface FarmDeploymentMismatch {
9
+ clientDeploymentId: string;
10
+ serverDeploymentId: string;
11
+ }
12
+ interface FarmDeploymentResponseOptions {
13
+ setCookie?: boolean;
14
+ cookiePath?: string;
15
+ secureCookie?: boolean;
16
+ }
17
+ declare class FarmDeploymentMismatchError extends Error {
18
+ readonly clientDeploymentId: string;
19
+ readonly serverDeploymentId: string;
20
+ readonly name = "FarmDeploymentMismatchError";
21
+ readonly code = "FARM_DEPLOYMENT_MISMATCH";
22
+ readonly retryable = false;
23
+ constructor(clientDeploymentId: string, serverDeploymentId: string);
24
+ }
25
+ declare function normalizeFarmDeploymentId(value: unknown): string;
26
+ declare function createFarmDeploymentRequestHeaders(deploymentId: string | undefined, init?: HeadersInit): Headers;
27
+ declare function getFarmRequestDeploymentId(request: Pick<Request, "headers" | "method">): string | undefined;
28
+ declare function getFarmDeploymentMismatch(request: Pick<Request, "headers" | "method">, serverDeploymentId: string | undefined): FarmDeploymentMismatch | null;
29
+ declare function createFarmDeploymentMismatchResponse(mismatch: FarmDeploymentMismatch): Response;
30
+ declare function withFarmDeploymentResponse(response: Response, deploymentId: string | undefined, options?: FarmDeploymentResponseOptions): Response;
31
+ declare function getFarmResponseDeploymentId(response: Pick<Response, "headers">): string | undefined;
32
+ declare function isFarmDeploymentMismatchResponse(response: Pick<Response, "headers" | "status">, clientDeploymentId: string | undefined): boolean;
33
+ declare function createFarmDeploymentMismatchError(response: Pick<Response, "headers">, clientDeploymentId: string): FarmDeploymentMismatchError;
34
+ declare function createFarmDeploymentCookie(deploymentId: string, path?: string, secure?: boolean): string;
35
+
36
+ export { FARM_DEPLOYMENT_COOKIE, FARM_DEPLOYMENT_ID_HEADER, FARM_DEPLOYMENT_MISMATCH_CODE, FARM_DEPLOYMENT_MISMATCH_HEADER, FARM_DEPLOYMENT_MISMATCH_STATUS, type FarmDeploymentMismatch, FarmDeploymentMismatchError, type FarmDeploymentResponseOptions, type FarmPresetRuntime, createFarmDeploymentCookie, createFarmDeploymentMismatchError, createFarmDeploymentMismatchResponse, createFarmDeploymentRequestHeaders, getFarmDeploymentMismatch, getFarmPresetRuntime, getFarmRequestDeploymentId, getFarmResponseDeploymentId, isFarmDeploymentMismatchResponse, normalizeFarmDeploymentId, withFarmDeploymentResponse };
@@ -0,0 +1,36 @@
1
+ declare const FARM_DEPLOYMENT_ID_HEADER = "x-farm-deployment-id";
2
+ declare const FARM_DEPLOYMENT_MISMATCH_HEADER = "x-farm-deployment-mismatch";
3
+ declare const FARM_DEPLOYMENT_COOKIE = "__farm_deployment";
4
+ declare const FARM_DEPLOYMENT_MISMATCH_CODE = "FARM_DEPLOYMENT_MISMATCH";
5
+ declare const FARM_DEPLOYMENT_MISMATCH_STATUS = 409;
6
+ type FarmPresetRuntime = "node" | "edge" | "unknown";
7
+ declare function getFarmPresetRuntime(preset: string): FarmPresetRuntime;
8
+ interface FarmDeploymentMismatch {
9
+ clientDeploymentId: string;
10
+ serverDeploymentId: string;
11
+ }
12
+ interface FarmDeploymentResponseOptions {
13
+ setCookie?: boolean;
14
+ cookiePath?: string;
15
+ secureCookie?: boolean;
16
+ }
17
+ declare class FarmDeploymentMismatchError extends Error {
18
+ readonly clientDeploymentId: string;
19
+ readonly serverDeploymentId: string;
20
+ readonly name = "FarmDeploymentMismatchError";
21
+ readonly code = "FARM_DEPLOYMENT_MISMATCH";
22
+ readonly retryable = false;
23
+ constructor(clientDeploymentId: string, serverDeploymentId: string);
24
+ }
25
+ declare function normalizeFarmDeploymentId(value: unknown): string;
26
+ declare function createFarmDeploymentRequestHeaders(deploymentId: string | undefined, init?: HeadersInit): Headers;
27
+ declare function getFarmRequestDeploymentId(request: Pick<Request, "headers" | "method">): string | undefined;
28
+ declare function getFarmDeploymentMismatch(request: Pick<Request, "headers" | "method">, serverDeploymentId: string | undefined): FarmDeploymentMismatch | null;
29
+ declare function createFarmDeploymentMismatchResponse(mismatch: FarmDeploymentMismatch): Response;
30
+ declare function withFarmDeploymentResponse(response: Response, deploymentId: string | undefined, options?: FarmDeploymentResponseOptions): Response;
31
+ declare function getFarmResponseDeploymentId(response: Pick<Response, "headers">): string | undefined;
32
+ declare function isFarmDeploymentMismatchResponse(response: Pick<Response, "headers" | "status">, clientDeploymentId: string | undefined): boolean;
33
+ declare function createFarmDeploymentMismatchError(response: Pick<Response, "headers">, clientDeploymentId: string): FarmDeploymentMismatchError;
34
+ declare function createFarmDeploymentCookie(deploymentId: string, path?: string, secure?: boolean): string;
35
+
36
+ export { FARM_DEPLOYMENT_COOKIE, FARM_DEPLOYMENT_ID_HEADER, FARM_DEPLOYMENT_MISMATCH_CODE, FARM_DEPLOYMENT_MISMATCH_HEADER, FARM_DEPLOYMENT_MISMATCH_STATUS, type FarmDeploymentMismatch, FarmDeploymentMismatchError, type FarmDeploymentResponseOptions, type FarmPresetRuntime, createFarmDeploymentCookie, createFarmDeploymentMismatchError, createFarmDeploymentMismatchResponse, createFarmDeploymentRequestHeaders, getFarmDeploymentMismatch, getFarmPresetRuntime, getFarmRequestDeploymentId, getFarmResponseDeploymentId, isFarmDeploymentMismatchResponse, normalizeFarmDeploymentId, withFarmDeploymentResponse };
@@ -1,21 +1,22 @@
1
1
  import {
2
2
  getDeployTargetForPreset
3
- } from "./chunk-CEVMYGDL.mjs";
3
+ } from "./chunk-YD5IRKVS.mjs";
4
4
  import "./chunk-UVCIEUJC.mjs";
5
5
  import "./chunk-RQ633A5I.mjs";
6
6
  import "./chunk-E257KFBU.mjs";
7
7
  import "./chunk-7MABZJIM.mjs";
8
8
  import "./chunk-YW7OBE6Q.mjs";
9
9
  import "./chunk-74YTBPTY.mjs";
10
- import "./chunk-7ZVN3YZI.mjs";
11
10
  import "./chunk-GY2STC2S.mjs";
12
- import "./chunk-WORFTBLU.mjs";
13
- import "./chunk-ZVWA4ZQ3.mjs";
14
- import "./chunk-7FBJLMQH.mjs";
11
+ import "./chunk-7ZVN3YZI.mjs";
15
12
  import "./chunk-4E6VRJ6P.mjs";
16
13
  import {
17
14
  resolveCronConfig
18
15
  } from "./chunk-GXASWWJU.mjs";
16
+ import "./chunk-WORFTBLU.mjs";
17
+ import "./chunk-H53KVQUU.mjs";
18
+ import "./chunk-ZVWA4ZQ3.mjs";
19
+ import "./chunk-7FBJLMQH.mjs";
19
20
  import "./chunk-CRN3AH35.mjs";
20
21
  import "./chunk-QGOHVJ6J.mjs";
21
22
  import "./chunk-FQYDHKKU.mjs";
@@ -370,4 +371,4 @@ __name(createFarmDevtoolsSnapshot, "createFarmDevtoolsSnapshot");
370
371
  export {
371
372
  createFarmDevtoolsSnapshot
372
373
  };
373
- //# sourceMappingURL=devtools-52FYXIEK.mjs.map
374
+ //# sourceMappingURL=devtools-326RBQCN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/devtools.ts"],"sourcesContent":["import path from \"node:path\";\nimport { getDeployTargetForPreset } from \"./config\";\nimport { resolveCronConfig, type FarmCronJob } from \"./cron\";\nimport {\n mergeFarmRouteRuntimeConfigs,\n resolveFarmRouteRuleRuntimeConfig,\n resolveFarmRouteRuntimeConfig,\n type ResolvedFarmRouteRuntimeConfig,\n} from \"./route-runtime\";\nimport type { FarmConfig } from \"./types\";\nimport type { FarmDiscoveredWorkflow } from \"./workflows\";\n\ntype RouteMapEntry = {\n pattern: string;\n modulePath: string;\n};\n\ntype RouteManagerLike = {\n getRoutes(): Map<string, RouteMapEntry>;\n getLayouts(): Map<string, RouteMapEntry>;\n getLoadings(): Map<string, RouteMapEntry>;\n getErrors(): Map<string, RouteMapEntry>;\n resolveRouteRuntimeConfig?(\n pattern: string,\n ): Promise<ResolvedFarmRouteRuntimeConfig> | ResolvedFarmRouteRuntimeConfig;\n};\n\ntype APIRouteManagerLike = {\n getRoutes(): Map<\n string,\n {\n path: string;\n filePath: string;\n methods: string[];\n runtime?: \"auto\" | \"node\" | \"edge\";\n regions?: \"auto\" | readonly string[];\n maxDuration?: \"auto\" | number;\n }\n >;\n};\n\ntype MiddlewareManagerLike = {\n getMiddlewares(): Array<{\n path: string;\n filePath: string;\n handlers: unknown[];\n source?: \"config\" | \"file\";\n }>;\n};\n\ntype IntegrationLike = {\n kind?: string;\n type?: string;\n category?: string;\n serverRuntime?: boolean;\n routes?: ReadonlyArray<{\n path: string;\n method?: string;\n methods?: readonly string[];\n }>;\n middleware?: readonly unknown[];\n providers?: readonly unknown[];\n schema?: {\n models?: Record<string, unknown>;\n };\n};\n\nexport type FarmDevtoolsRuntime = {\n runtime: \"auto\" | \"node\" | \"edge\";\n regions?: string[];\n maxDuration?: number;\n};\n\nexport type FarmDevtoolsDiagnostic = {\n severity: \"error\" | \"warning\" | \"info\";\n code: string;\n title: string;\n message: string;\n action?: string;\n};\n\nexport type FarmDevtoolsSnapshot = {\n generatedAt: string;\n health: \"ready\" | \"attention\" | \"error\";\n project: {\n name: string;\n root: string;\n srcDir: string;\n basePath: string;\n deploymentId: string;\n };\n deployment: {\n target: string;\n preset: string;\n outputDir?: string;\n };\n counts: {\n pages: number;\n layouts: number;\n loadingBoundaries: number;\n errorBoundaries: number;\n apiRoutes: number;\n middleware: number;\n integrations: number;\n storageMounts: number;\n cronJobs: number;\n workflows: number;\n layers: number;\n diagnostics: number;\n };\n routes: Array<{\n kind: \"page\" | \"layout\" | \"loading\" | \"error\";\n pattern: string;\n filePath: string;\n runtime?: FarmDevtoolsRuntime;\n }>;\n apiRoutes: Array<{\n path: string;\n methods: string[];\n filePath: string;\n runtime: FarmDevtoolsRuntime;\n }>;\n middleware: Array<{\n path: string;\n source: \"config\" | \"file\";\n filePath: string;\n handlerCount: number;\n }>;\n integrations: Array<{\n key: string;\n type: string;\n category: string;\n serverRuntime: boolean;\n routes: Array<{ path: string; methods: string[] }>;\n middlewareCount: number;\n providerCount: number;\n schemaModelCount: number;\n }>;\n storage: Array<{\n mount: string;\n driver: string;\n default: boolean;\n }>;\n cron: FarmCronJob[];\n workflows: Array<{\n id: string;\n filePath: string;\n routePath: string;\n schedule: string[];\n timezone?: string;\n }>;\n layers: Array<{\n name: string;\n source: string;\n srcDir: string;\n }>;\n environment: {\n server: string[];\n public: string[];\n };\n docs: {\n enabled: boolean;\n entry?: string;\n };\n features: {\n openapi: boolean;\n markdown: boolean;\n serverComponents: boolean;\n serverActions: boolean;\n optimizedBoundary: boolean;\n observability: boolean;\n };\n diagnostics: FarmDevtoolsDiagnostic[];\n};\n\nexport interface CreateFarmDevtoolsSnapshotInput {\n root: string;\n srcDir: string;\n routeManager: RouteManagerLike;\n apiRouteManager: APIRouteManagerLike;\n middlewareManager: MiddlewareManagerLike;\n config?: FarmConfig & { openapi?: { enabled?: boolean } };\n workflows?: readonly FarmDiscoveredWorkflow[];\n now?: () => Date;\n env?: Record<string, string | undefined>;\n}\n\nfunction normalizePath(value: string): string {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction toProjectPath(root: string, filePath: string): string {\n const normalizedRoot = normalizePath(root).replace(/\\/$/, \"\");\n const normalizedFile = normalizePath(filePath);\n if (normalizedFile.startsWith(normalizedRoot + \"/\")) {\n return normalizedFile.slice(normalizedRoot.length + 1);\n }\n return normalizedFile;\n}\n\nfunction sortByPath<T extends { path?: string; pattern?: string }>(items: T[]): T[] {\n return [...items].sort((a, b) =>\n (a.path || a.pattern || \"\").localeCompare(b.path || b.pattern || \"\"),\n );\n}\n\nfunction toRuntime(value: ResolvedFarmRouteRuntimeConfig): FarmDevtoolsRuntime {\n return {\n runtime: value.runtime,\n ...(value.regions ? { regions: [...value.regions] } : {}),\n ...(value.maxDuration ? { maxDuration: value.maxDuration } : {}),\n };\n}\n\nasync function collectRoutes(\n root: string,\n kind: FarmDevtoolsSnapshot[\"routes\"][number][\"kind\"],\n routes: Map<string, RouteMapEntry>,\n routeManager: RouteManagerLike,\n diagnostics: FarmDevtoolsDiagnostic[],\n): Promise<FarmDevtoolsSnapshot[\"routes\"]> {\n return Promise.all(\n Array.from(routes.values()).map(async (route) => {\n let runtime: FarmDevtoolsRuntime | undefined;\n if (kind === \"page\" && routeManager.resolveRouteRuntimeConfig) {\n try {\n runtime = toRuntime(await routeManager.resolveRouteRuntimeConfig(route.pattern));\n } catch (error) {\n diagnostics.push({\n severity: \"warning\",\n code: \"ROUTE_RUNTIME_UNRESOLVED\",\n title: `Could not inspect ${route.pattern}`,\n message: error instanceof Error ? error.message : String(error),\n action: \"Check the route and inherited layout runtime exports.\",\n });\n }\n }\n\n return {\n kind,\n pattern: route.pattern,\n filePath: toProjectPath(root, route.modulePath),\n ...(runtime ? { runtime } : {}),\n };\n }),\n );\n}\n\nfunction collectIntegrations(integrations: FarmConfig[\"integrations\"] | undefined) {\n if (!integrations || typeof integrations !== \"object\") return [];\n\n return Object.entries(integrations)\n .filter((entry): entry is [string, NonNullable<(typeof entry)[1]>] => Boolean(entry[1]))\n .map(([key, value]) => {\n const integration = value as IntegrationLike;\n const routes = (integration.routes || []).map((route) => ({\n path: route.path,\n methods: [...(route.methods || (route.method ? [route.method] : [\"ALL\"]))]\n .map((method) => method.toUpperCase())\n .sort(),\n }));\n\n return {\n key,\n type: integration.type || key,\n category: integration.category || \"custom\",\n serverRuntime: integration.serverRuntime !== false,\n routes: sortByPath(routes),\n middlewareCount: integration.middleware?.length || 0,\n providerCount: integration.providers?.length || 0,\n schemaModelCount: Object.keys(integration.schema?.models || {}).length,\n };\n })\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nfunction collectStorage(storage: FarmConfig[\"storage\"] | undefined): {\n entries: FarmDevtoolsSnapshot[\"storage\"];\n configured: boolean;\n} {\n if (!storage || typeof storage !== \"object\") {\n return {\n entries: [{ mount: \"root\", driver: \"memory\", default: true }],\n configured: false,\n };\n }\n\n const value = storage as Record<string, any>;\n if (value.kind === \"farm-storage-client\") {\n return {\n entries: [{ mount: \"root\", driver: \"storage client\", default: false }],\n configured: true,\n };\n }\n\n const configured = Object.keys(value).length > 0;\n const rootDriver = value.client\n ? describeStorageDriver(value.client)\n : describeStorageDriver(value.driver);\n const entries: FarmDevtoolsSnapshot[\"storage\"] = [\n {\n mount: \"root\",\n driver: rootDriver,\n default: !configured,\n },\n ];\n\n if (value.mounts && typeof value.mounts === \"object\") {\n for (const [mount, mountConfig] of Object.entries(value.mounts)) {\n entries.push({\n mount,\n driver: describeStorageDriver(mountConfig),\n default: false,\n });\n }\n }\n\n return {\n entries: entries.sort((a, b) => {\n if (a.mount === \"root\") return -1;\n if (b.mount === \"root\") return 1;\n return a.mount.localeCompare(b.mount);\n }),\n configured,\n };\n}\n\nfunction describeStorageDriver(value: unknown): string {\n if (!value) return \"memory\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"function\") return \"custom\";\n if (typeof value !== \"object\") return \"custom\";\n\n const record = value as Record<string, unknown>;\n if (record.kind === \"farm-storage-client\") return \"storage client\";\n if (typeof record.driver === \"string\") return record.driver;\n if (typeof record.driver === \"function\") return \"custom\";\n return \"custom\";\n}\n\nfunction featureEnabled(value: unknown): boolean {\n if (!value) return false;\n if (typeof value === \"object\" && \"enabled\" in value) {\n return (value as { enabled?: boolean }).enabled !== false;\n }\n return value !== false;\n}\n\nfunction collectEnvironmentKeys(config: FarmConfig | undefined) {\n const env = config?.env as\n | { server?: Record<string, unknown>; public?: Record<string, unknown> }\n | undefined;\n return {\n server: Object.keys(env?.server || {}).sort(),\n public: Object.keys(env?.public || {}).sort(),\n };\n}\n\nfunction resolveHealth(diagnostics: FarmDevtoolsDiagnostic[]): FarmDevtoolsSnapshot[\"health\"] {\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"error\")) return \"error\";\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"warning\")) return \"attention\";\n return \"ready\";\n}\n\nexport async function createFarmDevtoolsSnapshot(\n input: CreateFarmDevtoolsSnapshotInput,\n): Promise<FarmDevtoolsSnapshot> {\n const config = input.config || {};\n const diagnostics: FarmDevtoolsDiagnostic[] = [];\n const pageRoutes = await collectRoutes(\n input.root,\n \"page\",\n input.routeManager.getRoutes(),\n input.routeManager,\n diagnostics,\n );\n const layoutRoutes = await collectRoutes(\n input.root,\n \"layout\",\n input.routeManager.getLayouts(),\n input.routeManager,\n diagnostics,\n );\n const loadingRoutes = await collectRoutes(\n input.root,\n \"loading\",\n input.routeManager.getLoadings(),\n input.routeManager,\n diagnostics,\n );\n const errorRoutes = await collectRoutes(\n input.root,\n \"error\",\n input.routeManager.getErrors(),\n input.routeManager,\n diagnostics,\n );\n const apiRoutes = sortByPath(\n Array.from(input.apiRouteManager.getRoutes().values()).map((route) => {\n const runtime = resolveFarmRouteRuntimeConfig(\n mergeFarmRouteRuntimeConfigs(\n resolveFarmRouteRuleRuntimeConfig(route.path, config.routeRules),\n route,\n ),\n `API route \"${route.path}\"`,\n );\n return {\n path: route.path,\n methods: [...route.methods].sort(),\n filePath: toProjectPath(input.root, route.filePath),\n runtime: toRuntime(runtime),\n };\n }),\n );\n const middleware = sortByPath(\n input.middlewareManager.getMiddlewares().map((entry) => ({\n path: entry.path,\n source: entry.source || \"file\",\n filePath: toProjectPath(input.root, entry.filePath),\n handlerCount: entry.handlers.length,\n })),\n );\n const integrations = collectIntegrations(config.integrations);\n const storage = collectStorage(config.storage);\n const cron = resolveCronConfig(config.cron);\n const workflows = (input.workflows || [])\n .map((workflow) => ({\n id: workflow.id,\n filePath: toProjectPath(input.root, workflow.filePath),\n routePath: workflow.routePath,\n schedule: [...workflow.schedule],\n ...(workflow.timezone ? { timezone: workflow.timezone } : {}),\n }))\n .sort((a, b) => a.id.localeCompare(b.id));\n const layers = (config.layers || []).map((layer) => ({\n name: layer.name,\n source: layer.source,\n srcDir: layer.srcDir,\n }));\n const deploymentPreset = String(config.deploy?.preset || config.preset || \"node-server\");\n const deploymentTarget = String(\n config.deploy?.target || getDeployTargetForPreset(deploymentPreset) || \"node\",\n );\n const env = input.env || process.env;\n\n if (pageRoutes.length === 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"NO_PAGE_ROUTES\",\n title: \"No page routes found\",\n message: `Farm did not discover a page under ${input.srcDir}/app.`,\n action: `Add ${input.srcDir}/app/page.tsx or a programmatic page route.`,\n });\n }\n if (layoutRoutes.length === 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"ROOT_LAYOUT_MISSING\",\n title: \"Root layout is missing\",\n message: \"The application has no shared root layout.\",\n action: `Add ${input.srcDir}/app/layout.tsx for shared metadata and application chrome.`,\n });\n }\n\n const apiPaths = new Set(apiRoutes.map((route) => route.path));\n for (const job of cron.jobs) {\n if (!apiPaths.has(job.path)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"CRON_ROUTE_MISSING\",\n title: `Cron route ${job.path} was not found`,\n message: `${job.name} is scheduled, but its GET API route is not registered.`,\n action: \"Add the target API route or update the cron path in farm.config.ts.\",\n });\n }\n }\n if (cron.jobs.length > 0 && !env[cron.secretEnv]) {\n diagnostics.push({\n severity: \"info\",\n code: \"CRON_SECRET_NOT_SET\",\n title: `${cron.secretEnv} is not set`,\n message: \"Local manual runs remain available, but production cron routes fail closed.\",\n action: `Set ${cron.secretEnv} in the deployment environment before production.`,\n });\n }\n if (\n storage.configured &&\n storage.entries[0]?.driver === \"memory\" &&\n [\"vercel\", \"cloudflare\", \"netlify\"].includes(deploymentTarget)\n ) {\n diagnostics.push({\n severity: \"warning\",\n code: \"EPHEMERAL_PRODUCTION_STORAGE\",\n title: \"Production storage is in memory\",\n message: `${deploymentTarget} instances do not preserve in-memory data across executions.`,\n action: \"Configure a durable storage driver or mount for production state.\",\n });\n }\n\n const environment = collectEnvironmentKeys(config);\n const docs = config.docs;\n const docsEnabled = featureEnabled(docs);\n const allRoutes = sortByPath([...pageRoutes, ...layoutRoutes, ...loadingRoutes, ...errorRoutes]);\n\n return {\n generatedAt: (input.now?.() || new Date()).toISOString(),\n health: resolveHealth(diagnostics),\n project: {\n name: path.basename(path.resolve(input.root)),\n root: input.root,\n srcDir: input.srcDir,\n basePath: config.basePath || \"/\",\n deploymentId: config.deploymentId || \"development\",\n },\n deployment: {\n target: deploymentTarget,\n preset: deploymentPreset,\n ...(config.deploy?.outputDir ? { outputDir: config.deploy.outputDir } : {}),\n },\n counts: {\n pages: pageRoutes.length,\n layouts: layoutRoutes.length,\n loadingBoundaries: loadingRoutes.length,\n errorBoundaries: errorRoutes.length,\n apiRoutes: apiRoutes.length,\n middleware: middleware.length,\n integrations: integrations.length,\n storageMounts: storage.entries.length,\n cronJobs: cron.jobs.length,\n workflows: workflows.length,\n layers: layers.length,\n diagnostics: diagnostics.length,\n },\n routes: allRoutes,\n apiRoutes,\n middleware,\n integrations,\n storage: storage.entries,\n cron: cron.jobs,\n workflows,\n layers,\n environment,\n docs: {\n enabled: docsEnabled,\n entry:\n docsEnabled && docs && typeof docs === \"object\" && \"entry\" in docs\n ? String(docs.entry)\n : undefined,\n },\n features: {\n openapi: Boolean(config.openapi?.enabled),\n markdown: featureEnabled(config.md),\n serverComponents: Boolean(config.experimental?.serverComponents),\n serverActions: Boolean(config.experimental?.serverActions),\n optimizedBoundary: Boolean(config.experimental?.optimizedBoundary),\n observability: featureEnabled(config.observability),\n },\n diagnostics,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/devtools.ts"],"sourcesContent":["import path from \"node:path\";\nimport { getDeployTargetForPreset } from \"./config\";\nimport { resolveCronConfig, type FarmCronJob } from \"./cron\";\nimport {\n mergeFarmRouteRuntimeConfigs,\n resolveFarmRouteRuleRuntimeConfig,\n resolveFarmRouteRuntimeConfig,\n type ResolvedFarmRouteRuntimeConfig,\n} from \"./route-runtime\";\nimport type { FarmConfig } from \"./types\";\nimport type { FarmDiscoveredWorkflow } from \"./workflows\";\n\ntype RouteMapEntry = {\n pattern: string;\n modulePath: string;\n};\n\ntype RouteManagerLike = {\n getRoutes(): Map<string, RouteMapEntry>;\n getLayouts(): Map<string, RouteMapEntry>;\n getLoadings(): Map<string, RouteMapEntry>;\n getErrors(): Map<string, RouteMapEntry>;\n resolveRouteRuntimeConfig?(\n pattern: string,\n ): Promise<ResolvedFarmRouteRuntimeConfig> | ResolvedFarmRouteRuntimeConfig;\n};\n\ntype APIRouteManagerLike = {\n getRoutes(): Map<\n string,\n {\n path: string;\n filePath: string;\n methods: string[];\n runtime?: \"auto\" | \"node\" | \"edge\";\n regions?: \"auto\" | readonly string[];\n maxDuration?: \"auto\" | number;\n }\n >;\n};\n\ntype MiddlewareManagerLike = {\n getMiddlewares(): Array<{\n path: string;\n filePath: string;\n handlers: unknown[];\n source?: \"config\" | \"file\";\n }>;\n};\n\ntype IntegrationLike = {\n kind?: string;\n type?: string;\n category?: string;\n serverRuntime?: boolean;\n routes?: ReadonlyArray<{\n path: string;\n method?: string;\n methods?: readonly string[];\n }>;\n middleware?: readonly unknown[];\n providers?: readonly unknown[];\n schema?: {\n models?: Record<string, unknown>;\n };\n};\n\nexport type FarmDevtoolsRuntime = {\n runtime: \"auto\" | \"node\" | \"edge\";\n regions?: string[];\n maxDuration?: number;\n};\n\nexport type FarmDevtoolsDiagnostic = {\n severity: \"error\" | \"warning\" | \"info\";\n code: string;\n title: string;\n message: string;\n action?: string;\n};\n\nexport type FarmDevtoolsSnapshot = {\n generatedAt: string;\n health: \"ready\" | \"attention\" | \"error\";\n project: {\n name: string;\n root: string;\n srcDir: string;\n basePath: string;\n deploymentId: string;\n };\n deployment: {\n target: string;\n preset: string;\n outputDir?: string;\n };\n counts: {\n pages: number;\n layouts: number;\n loadingBoundaries: number;\n errorBoundaries: number;\n apiRoutes: number;\n middleware: number;\n integrations: number;\n storageMounts: number;\n cronJobs: number;\n workflows: number;\n layers: number;\n diagnostics: number;\n };\n routes: Array<{\n kind: \"page\" | \"layout\" | \"loading\" | \"error\";\n pattern: string;\n filePath: string;\n runtime?: FarmDevtoolsRuntime;\n }>;\n apiRoutes: Array<{\n path: string;\n methods: string[];\n filePath: string;\n runtime: FarmDevtoolsRuntime;\n }>;\n middleware: Array<{\n path: string;\n source: \"config\" | \"file\";\n filePath: string;\n handlerCount: number;\n }>;\n integrations: Array<{\n key: string;\n type: string;\n category: string;\n serverRuntime: boolean;\n routes: Array<{ path: string; methods: string[] }>;\n middlewareCount: number;\n providerCount: number;\n schemaModelCount: number;\n }>;\n storage: Array<{\n mount: string;\n driver: string;\n default: boolean;\n }>;\n cron: FarmCronJob[];\n workflows: Array<{\n id: string;\n filePath: string;\n routePath: string;\n schedule: string[];\n timezone?: string;\n }>;\n layers: Array<{\n name: string;\n source: string;\n srcDir: string;\n }>;\n environment: {\n server: string[];\n public: string[];\n };\n docs: {\n enabled: boolean;\n entry?: string;\n };\n features: {\n openapi: boolean;\n markdown: boolean;\n serverComponents: boolean;\n serverActions: boolean;\n optimizedBoundary: boolean;\n observability: boolean;\n };\n diagnostics: FarmDevtoolsDiagnostic[];\n};\n\nexport interface CreateFarmDevtoolsSnapshotInput {\n root: string;\n srcDir: string;\n routeManager: RouteManagerLike;\n apiRouteManager: APIRouteManagerLike;\n middlewareManager: MiddlewareManagerLike;\n config?: FarmConfig & { openapi?: { enabled?: boolean } };\n workflows?: readonly FarmDiscoveredWorkflow[];\n now?: () => Date;\n env?: Record<string, string | undefined>;\n}\n\nfunction normalizePath(value: string): string {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction toProjectPath(root: string, filePath: string): string {\n const normalizedRoot = normalizePath(root).replace(/\\/$/, \"\");\n const normalizedFile = normalizePath(filePath);\n if (normalizedFile.startsWith(normalizedRoot + \"/\")) {\n return normalizedFile.slice(normalizedRoot.length + 1);\n }\n return normalizedFile;\n}\n\nfunction sortByPath<T extends { path?: string; pattern?: string }>(items: T[]): T[] {\n return [...items].sort((a, b) =>\n (a.path || a.pattern || \"\").localeCompare(b.path || b.pattern || \"\"),\n );\n}\n\nfunction toRuntime(value: ResolvedFarmRouteRuntimeConfig): FarmDevtoolsRuntime {\n return {\n runtime: value.runtime,\n ...(value.regions ? { regions: [...value.regions] } : {}),\n ...(value.maxDuration ? { maxDuration: value.maxDuration } : {}),\n };\n}\n\nasync function collectRoutes(\n root: string,\n kind: FarmDevtoolsSnapshot[\"routes\"][number][\"kind\"],\n routes: Map<string, RouteMapEntry>,\n routeManager: RouteManagerLike,\n diagnostics: FarmDevtoolsDiagnostic[],\n): Promise<FarmDevtoolsSnapshot[\"routes\"]> {\n return Promise.all(\n Array.from(routes.values()).map(async (route) => {\n let runtime: FarmDevtoolsRuntime | undefined;\n if (kind === \"page\" && routeManager.resolveRouteRuntimeConfig) {\n try {\n runtime = toRuntime(await routeManager.resolveRouteRuntimeConfig(route.pattern));\n } catch (error) {\n diagnostics.push({\n severity: \"warning\",\n code: \"ROUTE_RUNTIME_UNRESOLVED\",\n title: `Could not inspect ${route.pattern}`,\n message: error instanceof Error ? error.message : String(error),\n action: \"Check the route and inherited layout runtime exports.\",\n });\n }\n }\n\n return {\n kind,\n pattern: route.pattern,\n filePath: toProjectPath(root, route.modulePath),\n ...(runtime ? { runtime } : {}),\n };\n }),\n );\n}\n\nfunction collectIntegrations(integrations: FarmConfig[\"integrations\"] | undefined) {\n if (!integrations || typeof integrations !== \"object\") return [];\n\n return Object.entries(integrations)\n .filter((entry): entry is [string, NonNullable<(typeof entry)[1]>] => Boolean(entry[1]))\n .map(([key, value]) => {\n const integration = value as IntegrationLike;\n const routes = (integration.routes || []).map((route) => ({\n path: route.path,\n methods: [...(route.methods || (route.method ? [route.method] : [\"ALL\"]))]\n .map((method) => method.toUpperCase())\n .sort(),\n }));\n\n return {\n key,\n type: integration.type || key,\n category: integration.category || \"custom\",\n serverRuntime: integration.serverRuntime !== false,\n routes: sortByPath(routes),\n middlewareCount: integration.middleware?.length || 0,\n providerCount: integration.providers?.length || 0,\n schemaModelCount: Object.keys(integration.schema?.models || {}).length,\n };\n })\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nfunction collectStorage(storage: FarmConfig[\"storage\"] | undefined): {\n entries: FarmDevtoolsSnapshot[\"storage\"];\n configured: boolean;\n} {\n if (!storage || typeof storage !== \"object\") {\n return {\n entries: [{ mount: \"root\", driver: \"memory\", default: true }],\n configured: false,\n };\n }\n\n const value = storage as Record<string, any>;\n if (value.kind === \"farm-storage-client\") {\n return {\n entries: [{ mount: \"root\", driver: \"storage client\", default: false }],\n configured: true,\n };\n }\n\n const configured = Object.keys(value).length > 0;\n const rootDriver = value.client\n ? describeStorageDriver(value.client)\n : describeStorageDriver(value.driver);\n const entries: FarmDevtoolsSnapshot[\"storage\"] = [\n {\n mount: \"root\",\n driver: rootDriver,\n default: !configured,\n },\n ];\n\n if (value.mounts && typeof value.mounts === \"object\") {\n for (const [mount, mountConfig] of Object.entries(value.mounts)) {\n entries.push({\n mount,\n driver: describeStorageDriver(mountConfig),\n default: false,\n });\n }\n }\n\n return {\n entries: entries.sort((a, b) => {\n if (a.mount === \"root\") return -1;\n if (b.mount === \"root\") return 1;\n return a.mount.localeCompare(b.mount);\n }),\n configured,\n };\n}\n\nfunction describeStorageDriver(value: unknown): string {\n if (!value) return \"memory\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"function\") return \"custom\";\n if (typeof value !== \"object\") return \"custom\";\n\n const record = value as Record<string, unknown>;\n if (record.kind === \"farm-storage-client\") return \"storage client\";\n if (typeof record.driver === \"string\") return record.driver;\n if (typeof record.driver === \"function\") return \"custom\";\n return \"custom\";\n}\n\nfunction featureEnabled(value: unknown): boolean {\n if (!value) return false;\n if (typeof value === \"object\" && \"enabled\" in value) {\n return (value as { enabled?: boolean }).enabled !== false;\n }\n return value !== false;\n}\n\nfunction collectEnvironmentKeys(config: FarmConfig | undefined) {\n const env = config?.env as\n | { server?: Record<string, unknown>; public?: Record<string, unknown> }\n | undefined;\n return {\n server: Object.keys(env?.server || {}).sort(),\n public: Object.keys(env?.public || {}).sort(),\n };\n}\n\nfunction resolveHealth(diagnostics: FarmDevtoolsDiagnostic[]): FarmDevtoolsSnapshot[\"health\"] {\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"error\")) return \"error\";\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"warning\")) return \"attention\";\n return \"ready\";\n}\n\nexport async function createFarmDevtoolsSnapshot(\n input: CreateFarmDevtoolsSnapshotInput,\n): Promise<FarmDevtoolsSnapshot> {\n const config = input.config || {};\n const diagnostics: FarmDevtoolsDiagnostic[] = [];\n const pageRoutes = await collectRoutes(\n input.root,\n \"page\",\n input.routeManager.getRoutes(),\n input.routeManager,\n diagnostics,\n );\n const layoutRoutes = await collectRoutes(\n input.root,\n \"layout\",\n input.routeManager.getLayouts(),\n input.routeManager,\n diagnostics,\n );\n const loadingRoutes = await collectRoutes(\n input.root,\n \"loading\",\n input.routeManager.getLoadings(),\n input.routeManager,\n diagnostics,\n );\n const errorRoutes = await collectRoutes(\n input.root,\n \"error\",\n input.routeManager.getErrors(),\n input.routeManager,\n diagnostics,\n );\n const apiRoutes = sortByPath(\n Array.from(input.apiRouteManager.getRoutes().values()).map((route) => {\n const runtime = resolveFarmRouteRuntimeConfig(\n mergeFarmRouteRuntimeConfigs(\n resolveFarmRouteRuleRuntimeConfig(route.path, config.routeRules),\n route,\n ),\n `API route \"${route.path}\"`,\n );\n return {\n path: route.path,\n methods: [...route.methods].sort(),\n filePath: toProjectPath(input.root, route.filePath),\n runtime: toRuntime(runtime),\n };\n }),\n );\n const middleware = sortByPath(\n input.middlewareManager.getMiddlewares().map((entry) => ({\n path: entry.path,\n source: entry.source || \"file\",\n filePath: toProjectPath(input.root, entry.filePath),\n handlerCount: entry.handlers.length,\n })),\n );\n const integrations = collectIntegrations(config.integrations);\n const storage = collectStorage(config.storage);\n const cron = resolveCronConfig(config.cron);\n const workflows = (input.workflows || [])\n .map((workflow) => ({\n id: workflow.id,\n filePath: toProjectPath(input.root, workflow.filePath),\n routePath: workflow.routePath,\n schedule: [...workflow.schedule],\n ...(workflow.timezone ? { timezone: workflow.timezone } : {}),\n }))\n .sort((a, b) => a.id.localeCompare(b.id));\n const layers = (config.layers || []).map((layer) => ({\n name: layer.name,\n source: layer.source,\n srcDir: layer.srcDir,\n }));\n const deploymentPreset = String(config.deploy?.preset || config.preset || \"node-server\");\n const deploymentTarget = String(\n config.deploy?.target || getDeployTargetForPreset(deploymentPreset) || \"node\",\n );\n const env = input.env || process.env;\n\n if (pageRoutes.length === 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"NO_PAGE_ROUTES\",\n title: \"No page routes found\",\n message: `Farm did not discover a page under ${input.srcDir}/app.`,\n action: `Add ${input.srcDir}/app/page.tsx or a programmatic page route.`,\n });\n }\n if (layoutRoutes.length === 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"ROOT_LAYOUT_MISSING\",\n title: \"Root layout is missing\",\n message: \"The application has no shared root layout.\",\n action: `Add ${input.srcDir}/app/layout.tsx for shared metadata and application chrome.`,\n });\n }\n\n const apiPaths = new Set(apiRoutes.map((route) => route.path));\n for (const job of cron.jobs) {\n if (!apiPaths.has(job.path)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"CRON_ROUTE_MISSING\",\n title: `Cron route ${job.path} was not found`,\n message: `${job.name} is scheduled, but its GET API route is not registered.`,\n action: \"Add the target API route or update the cron path in farm.config.ts.\",\n });\n }\n }\n if (cron.jobs.length > 0 && !env[cron.secretEnv]) {\n diagnostics.push({\n severity: \"info\",\n code: \"CRON_SECRET_NOT_SET\",\n title: `${cron.secretEnv} is not set`,\n message: \"Local manual runs remain available, but production cron routes fail closed.\",\n action: `Set ${cron.secretEnv} in the deployment environment before production.`,\n });\n }\n if (\n storage.configured &&\n storage.entries[0]?.driver === \"memory\" &&\n [\"vercel\", \"cloudflare\", \"netlify\"].includes(deploymentTarget)\n ) {\n diagnostics.push({\n severity: \"warning\",\n code: \"EPHEMERAL_PRODUCTION_STORAGE\",\n title: \"Production storage is in memory\",\n message: `${deploymentTarget} instances do not preserve in-memory data across executions.`,\n action: \"Configure a durable storage driver or mount for production state.\",\n });\n }\n\n const environment = collectEnvironmentKeys(config);\n const docs = config.docs;\n const docsEnabled = featureEnabled(docs);\n const allRoutes = sortByPath([...pageRoutes, ...layoutRoutes, ...loadingRoutes, ...errorRoutes]);\n\n return {\n generatedAt: (input.now?.() || new Date()).toISOString(),\n health: resolveHealth(diagnostics),\n project: {\n name: path.basename(path.resolve(input.root)),\n root: input.root,\n srcDir: input.srcDir,\n basePath: config.basePath || \"/\",\n deploymentId: config.deploymentId || \"development\",\n },\n deployment: {\n target: deploymentTarget,\n preset: deploymentPreset,\n ...(config.deploy?.outputDir ? { outputDir: config.deploy.outputDir } : {}),\n },\n counts: {\n pages: pageRoutes.length,\n layouts: layoutRoutes.length,\n loadingBoundaries: loadingRoutes.length,\n errorBoundaries: errorRoutes.length,\n apiRoutes: apiRoutes.length,\n middleware: middleware.length,\n integrations: integrations.length,\n storageMounts: storage.entries.length,\n cronJobs: cron.jobs.length,\n workflows: workflows.length,\n layers: layers.length,\n diagnostics: diagnostics.length,\n },\n routes: allRoutes,\n apiRoutes,\n middleware,\n integrations,\n storage: storage.entries,\n cron: cron.jobs,\n workflows,\n layers,\n environment,\n docs: {\n enabled: docsEnabled,\n entry:\n docsEnabled && docs && typeof docs === \"object\" && \"entry\" in docs\n ? String(docs.entry)\n : undefined,\n },\n features: {\n openapi: Boolean(config.openapi?.enabled),\n markdown: featureEnabled(config.md),\n serverComponents: Boolean(config.experimental?.serverComponents),\n serverActions: Boolean(config.experimental?.serverActions),\n optimizedBoundary: Boolean(config.experimental?.optimizedBoundary),\n observability: featureEnabled(config.observability),\n },\n diagnostics,\n };\n}\n"],"mappings":"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","names":[]}