@farm.js/core 0.1.0-beta.97 → 0.1.0-beta.99

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 (269) hide show
  1. package/dist/after.cjs.map +1 -0
  2. package/dist/agent-runtime.cjs +7 -3
  3. package/dist/agent-runtime.cjs.map +1 -0
  4. package/dist/agent-runtime.d.mts +2 -2
  5. package/dist/agent-runtime.d.ts +2 -2
  6. package/dist/agent-runtime.mjs +2 -1
  7. package/dist/agent-runtime.mjs.map +1 -1
  8. package/dist/api/route-manager.cjs.map +1 -0
  9. package/dist/api/route-manager.d.mts +2 -2
  10. package/dist/api/route-manager.d.ts +2 -2
  11. package/dist/api/runtime.cjs.map +1 -0
  12. package/dist/api.cjs +26 -1
  13. package/dist/api.cjs.map +1 -0
  14. package/dist/api.d.mts +3 -3
  15. package/dist/api.d.ts +3 -3
  16. package/dist/api.mjs +2 -2
  17. package/dist/{app-CIOx3LvY.d.ts → app-CGjrKNoN.d.ts} +4 -4
  18. package/dist/{app-DBd6437H.d.mts → app-DOcLs_iq.d.mts} +4 -4
  19. package/dist/app-markdown.cjs +21 -0
  20. package/dist/app-markdown.cjs.map +1 -0
  21. package/dist/app-markdown.d.mts +19 -4
  22. package/dist/app-markdown.d.ts +19 -4
  23. package/dist/app-markdown.mjs +7 -1
  24. package/dist/cache.cjs.map +1 -0
  25. package/dist/{chunk-VMCHLH3Y.mjs → chunk-26BCDVJS.mjs} +19 -1
  26. package/dist/chunk-26BCDVJS.mjs.map +1 -0
  27. package/dist/{chunk-FP5Q67FO.mjs → chunk-2HYYZCCI.mjs} +308 -19
  28. package/dist/chunk-2HYYZCCI.mjs.map +1 -0
  29. package/dist/{chunk-WKDAA6V2.mjs → chunk-3BTAMIQE.mjs} +100 -41
  30. package/dist/chunk-3BTAMIQE.mjs.map +1 -0
  31. package/dist/{chunk-WD2EBM3I.mjs → chunk-3CQJV3NC.mjs} +2 -2
  32. package/dist/{chunk-I3OOUWO5.mjs → chunk-3GDRV7SG.mjs} +2 -2
  33. package/dist/{chunk-YIBV77KZ.mjs → chunk-4WLAVHCY.mjs} +2 -2
  34. package/dist/{chunk-KDP5ZSWP.mjs → chunk-7PS5NKOM.mjs} +26 -11
  35. package/dist/chunk-7PS5NKOM.mjs.map +1 -0
  36. package/dist/{chunk-X4SFHKFH.mjs → chunk-BU65A3LZ.mjs} +10 -6
  37. package/dist/chunk-BU65A3LZ.mjs.map +1 -0
  38. package/dist/{chunk-WMJGA32P.mjs → chunk-BXVOHG6B.mjs} +27 -2
  39. package/dist/{chunk-WMJGA32P.mjs.map → chunk-BXVOHG6B.mjs.map} +1 -1
  40. package/dist/{chunk-BZAIS65C.mjs → chunk-DIHNOVZZ.mjs} +40 -13
  41. package/dist/chunk-DIHNOVZZ.mjs.map +1 -0
  42. package/dist/{chunk-ISSFLGJ5.mjs → chunk-FDWECN3W.mjs} +8 -4
  43. package/dist/chunk-FDWECN3W.mjs.map +1 -0
  44. package/dist/chunk-FDWXXTWR.mjs +114 -0
  45. package/dist/chunk-FDWXXTWR.mjs.map +1 -0
  46. package/dist/{chunk-FSIXEIOB.mjs → chunk-L7FSTPGS.mjs} +2 -2
  47. package/dist/{chunk-J3MPQ4MQ.mjs → chunk-LG4XB6RN.mjs} +2 -2
  48. package/dist/{chunk-J3MPQ4MQ.mjs.map → chunk-LG4XB6RN.mjs.map} +1 -1
  49. package/dist/{chunk-AAC66ILR.mjs → chunk-LXXG3K2Y.mjs} +61 -2
  50. package/dist/chunk-LXXG3K2Y.mjs.map +1 -0
  51. package/dist/{chunk-GJ7W6LNK.mjs → chunk-N5RK4LK6.mjs} +3 -3
  52. package/dist/{chunk-D7F7YZ7L.mjs → chunk-NCVFPT67.mjs} +100 -40
  53. package/dist/{chunk-D7F7YZ7L.mjs.map → chunk-NCVFPT67.mjs.map} +1 -1
  54. package/dist/{chunk-UMUWR5XA.mjs → chunk-PURU7FXR.mjs} +2 -2
  55. package/dist/{chunk-2SKCXYLB.mjs → chunk-QQCCBMTH.mjs} +60 -6
  56. package/dist/chunk-QQCCBMTH.mjs.map +1 -0
  57. package/dist/chunk-RKUPOYQV.mjs +28 -0
  58. package/dist/chunk-RKUPOYQV.mjs.map +1 -0
  59. package/dist/{chunk-52BR7LTX.mjs → chunk-STSPSJUI.mjs} +3 -3
  60. package/dist/{chunk-EPDIF432.mjs → chunk-UOGX6UNO.mjs} +37 -17
  61. package/dist/chunk-UOGX6UNO.mjs.map +1 -0
  62. package/dist/{chunk-IZBX2TEU.mjs → chunk-VQG3QWWK.mjs} +2 -2
  63. package/dist/{chunk-35NPLKQJ.mjs → chunk-XWM2C267.mjs} +21 -105
  64. package/dist/chunk-XWM2C267.mjs.map +1 -0
  65. package/dist/{chunk-7ZVN3YZI.mjs → chunk-Z5ARESQG.mjs} +43 -1
  66. package/dist/chunk-Z5ARESQG.mjs.map +1 -0
  67. package/dist/client/lifecycle.cjs.map +1 -0
  68. package/dist/client/lifecycle.mjs +2 -2
  69. package/dist/{client-plugins-B6-07YmP.d.mts → client-plugins-BqtHoJ9C.d.mts} +91 -3
  70. package/dist/{client-plugins-By6MVUX-.d.ts → client-plugins-DYprkCKN.d.ts} +91 -3
  71. package/dist/client-plugins.cjs +1 -1
  72. package/dist/client-plugins.cjs.map +1 -0
  73. package/dist/client-plugins.d.mts +2 -2
  74. package/dist/client-plugins.d.ts +2 -2
  75. package/dist/client-plugins.mjs +2 -2
  76. package/dist/client.cjs +61 -16
  77. package/dist/client.cjs.map +1 -0
  78. package/dist/client.d.mts +5 -5
  79. package/dist/client.d.ts +5 -5
  80. package/dist/client.mjs +7 -7
  81. package/dist/config.cjs.map +1 -0
  82. package/dist/config.d.mts +2 -2
  83. package/dist/config.d.ts +2 -2
  84. package/dist/cron.cjs +48 -12
  85. package/dist/cron.cjs.map +1 -0
  86. package/dist/cron.mjs +2 -1
  87. package/dist/deferred.cjs.map +1 -0
  88. package/dist/deployment.cjs.map +1 -0
  89. package/dist/{devtools-XWZX6CCL.mjs → devtools-24N3U5IG.mjs} +9 -7
  90. package/dist/{devtools-XWZX6CCL.mjs.map → devtools-24N3U5IG.mjs.map} +1 -1
  91. package/dist/docs.cjs +7 -3
  92. package/dist/docs.cjs.map +1 -0
  93. package/dist/docs.mjs +9 -7
  94. package/dist/env-types.cjs.map +1 -0
  95. package/dist/env.cjs.map +1 -0
  96. package/dist/environment/vite.cjs.map +1 -0
  97. package/dist/environment.cjs.map +1 -0
  98. package/dist/font.cjs.map +1 -0
  99. package/dist/headers.cjs.map +1 -0
  100. package/dist/i18n/client.cjs.map +1 -0
  101. package/dist/i18n/index.cjs.map +1 -0
  102. package/dist/i18n/server.cjs.map +1 -0
  103. package/dist/image/server.cjs +99 -40
  104. package/dist/image/server.cjs.map +1 -0
  105. package/dist/image/server.d.mts +6 -0
  106. package/dist/image/server.d.ts +6 -0
  107. package/dist/image/server.mjs +1 -1
  108. package/dist/image/sharp.cjs +1 -0
  109. package/dist/image/sharp.cjs.map +1 -0
  110. package/dist/image/sharp.d.mts +1 -1
  111. package/dist/image/sharp.d.ts +1 -1
  112. package/dist/image/sharp.mjs +1 -1
  113. package/dist/image/sharp.mjs.map +1 -1
  114. package/dist/image.cjs.map +1 -0
  115. package/dist/index.cjs +943 -231
  116. package/dist/index.cjs.map +1 -0
  117. package/dist/index.d.mts +11 -11
  118. package/dist/index.d.ts +11 -11
  119. package/dist/index.mjs +38 -24
  120. package/dist/index.mjs.map +1 -1
  121. package/dist/instrumentation.cjs.map +1 -0
  122. package/dist/{integration-orm-LLW6WZNK.mjs → integration-orm-G5BPBT5X.mjs} +3 -3
  123. package/dist/integrations.cjs +168 -5
  124. package/dist/integrations.cjs.map +1 -0
  125. package/dist/integrations.d.mts +2 -2
  126. package/dist/integrations.d.ts +2 -2
  127. package/dist/integrations.mjs +10 -3
  128. package/dist/internal/build-runtime.cjs +745 -139
  129. package/dist/internal/build-runtime.cjs.map +1 -0
  130. package/dist/internal/build-runtime.d.mts +4 -4
  131. package/dist/internal/build-runtime.d.ts +4 -4
  132. package/dist/internal/build-runtime.mjs +16 -14
  133. package/dist/internal/client-runtime.cjs +7 -2
  134. package/dist/internal/client-runtime.cjs.map +1 -0
  135. package/dist/internal/client-runtime.mjs +8 -3
  136. package/dist/internal/client-runtime.mjs.map +1 -1
  137. package/dist/internal/config-runtime.cjs +59 -42
  138. package/dist/internal/config-runtime.cjs.map +1 -0
  139. package/dist/internal/config-runtime.d.mts +3 -3
  140. package/dist/internal/config-runtime.d.ts +3 -3
  141. package/dist/internal/config-runtime.mjs +8 -6
  142. package/dist/internal/isolated-boundary.cjs.map +1 -0
  143. package/dist/internal/metadata-image-runtime.cjs.map +1 -0
  144. package/dist/internal/product-telemetry-runtime.cjs +52 -5
  145. package/dist/internal/product-telemetry-runtime.cjs.map +1 -0
  146. package/dist/internal/product-telemetry-runtime.d.mts +12 -1
  147. package/dist/internal/product-telemetry-runtime.d.ts +12 -1
  148. package/dist/internal/product-telemetry-runtime.mjs +50 -5
  149. package/dist/internal/product-telemetry-runtime.mjs.map +1 -1
  150. package/dist/internal/production-node-env.cjs.map +1 -0
  151. package/dist/internal/production-runtime.cjs +56 -10
  152. package/dist/internal/production-runtime.cjs.map +1 -0
  153. package/dist/internal/production-runtime.d.mts +8 -8
  154. package/dist/internal/production-runtime.d.ts +8 -8
  155. package/dist/internal/production-runtime.mjs +2 -2
  156. package/dist/markdown.cjs.map +1 -0
  157. package/dist/{metadata-route-8_V3UonT.d.ts → metadata-route-D2be_0kC.d.ts} +17 -2
  158. package/dist/{metadata-route-CWP_HjGU.d.mts → metadata-route-Dw5CrDIZ.d.mts} +17 -2
  159. package/dist/middleware.cjs.map +1 -0
  160. package/dist/middleware.d.mts +4 -4
  161. package/dist/middleware.d.ts +4 -4
  162. package/dist/navigation.cjs.map +1 -0
  163. package/dist/{nitro-EGRNOB5P.mjs → nitro-YJEP3FWM.mjs} +4 -3
  164. package/dist/{nitro-EGRNOB5P.mjs.map → nitro-YJEP3FWM.mjs.map} +1 -1
  165. package/dist/observability.cjs.map +1 -0
  166. package/dist/plugin.cjs +599 -104
  167. package/dist/plugin.cjs.map +1 -0
  168. package/dist/plugin.d.mts +2 -2
  169. package/dist/plugin.d.ts +2 -2
  170. package/dist/plugin.mjs +13 -11
  171. package/dist/{production-runtime-CdmzsDax.d.ts → production-runtime-CTqpD1C8.d.ts} +2 -2
  172. package/dist/{production-runtime-BGRH1dKG.d.mts → production-runtime-HNqNZd4D.d.mts} +2 -2
  173. package/dist/query/client.cjs.map +1 -0
  174. package/dist/query/index.cjs.map +1 -0
  175. package/dist/query/parsers.cjs.map +1 -0
  176. package/dist/query/server.cjs.map +1 -0
  177. package/dist/{render-plan-DLxJYAA5.d.mts → render-plan-COscpW-i.d.mts} +1 -1
  178. package/dist/{render-plan-0GeHiGVZ.d.ts → render-plan-Z4kSxaT_.d.ts} +1 -1
  179. package/dist/renderer/react/client.cjs.map +1 -0
  180. package/dist/renderer/react/server.cjs.map +1 -0
  181. package/dist/renderer/react/vite.cjs.map +1 -0
  182. package/dist/renderer-client.cjs +26 -1
  183. package/dist/renderer-client.cjs.map +1 -0
  184. package/dist/renderer-client.d.mts +4 -4
  185. package/dist/renderer-client.d.ts +4 -4
  186. package/dist/renderer-client.mjs +2 -2
  187. package/dist/renderer.cjs.map +1 -0
  188. package/dist/{request-BstWbZ6O.d.ts → request-BEDb2jE9.d.ts} +1 -1
  189. package/dist/{request-BCNXSXLh.d.mts → request-CbIAqJY9.d.mts} +1 -1
  190. package/dist/request.cjs.map +1 -0
  191. package/dist/request.d.mts +3 -3
  192. package/dist/request.d.ts +3 -3
  193. package/dist/router.cjs.map +1 -0
  194. package/dist/routes.cjs.map +1 -0
  195. package/dist/routes.d.mts +2 -2
  196. package/dist/routes.d.ts +2 -2
  197. package/dist/server-action-security.cjs +117 -104
  198. package/dist/server-action-security.cjs.map +1 -0
  199. package/dist/server-action-security.mjs +2 -1
  200. package/dist/server-fn-client.cjs.map +1 -0
  201. package/dist/server-fn.cjs.map +1 -0
  202. package/dist/server-fn.mjs +3 -2
  203. package/dist/server-plugins.cjs.map +1 -0
  204. package/dist/server-plugins.d.mts +3 -3
  205. package/dist/server-plugins.d.ts +3 -3
  206. package/dist/server-query-client.cjs +26 -1
  207. package/dist/server-query-client.cjs.map +1 -0
  208. package/dist/server-query-client.mjs +3 -3
  209. package/dist/server-query.cjs.map +1 -0
  210. package/dist/server-query.mjs +4 -3
  211. package/dist/server.cjs +686 -170
  212. package/dist/server.cjs.map +1 -0
  213. package/dist/server.d.mts +8 -8
  214. package/dist/server.d.ts +8 -8
  215. package/dist/server.mjs +16 -14
  216. package/dist/server.mjs.map +1 -1
  217. package/dist/{spa-router-COgu4txb.d.ts → spa-router-CjeQites.d.ts} +1 -1
  218. package/dist/{spa-router-BeyAVSc6.d.mts → spa-router-FJbNou1a.d.mts} +1 -1
  219. package/dist/storage.cjs +7 -3
  220. package/dist/storage.cjs.map +1 -0
  221. package/dist/storage.mjs +1 -1
  222. package/dist/testing.cjs.map +1 -0
  223. package/dist/testing.d.mts +2 -2
  224. package/dist/testing.d.ts +2 -2
  225. package/dist/testing.mjs +2 -1
  226. package/dist/testing.mjs.map +1 -1
  227. package/dist/theme/client.cjs.map +1 -0
  228. package/dist/theme/index.cjs.map +1 -0
  229. package/dist/theme/runtime.cjs.map +1 -0
  230. package/dist/theme/server.cjs.map +1 -0
  231. package/dist/{utils-DL2VwDQl.d.mts → utils-BiMJv9Ys.d.mts} +1 -1
  232. package/dist/{utils-DkU2c_1B.d.ts → utils-BpnKRFv9.d.ts} +1 -1
  233. package/dist/version.cjs +1 -1
  234. package/dist/version.cjs.map +1 -0
  235. package/dist/version.mjs +1 -1
  236. package/dist/vite.cjs +599 -104
  237. package/dist/vite.cjs.map +1 -0
  238. package/dist/vite.d.mts +2 -2
  239. package/dist/vite.d.ts +2 -2
  240. package/dist/vite.mjs +13 -11
  241. package/dist/{workflows-ChyK_oTu.d.mts → workflows-BantWytQ.d.mts} +7 -0
  242. package/dist/{workflows-ChyK_oTu.d.ts → workflows-BantWytQ.d.ts} +7 -0
  243. package/dist/workflows.cjs +73 -5
  244. package/dist/workflows.cjs.map +1 -0
  245. package/dist/workflows.d.mts +1 -1
  246. package/dist/workflows.d.ts +1 -1
  247. package/dist/workflows.mjs +2 -1
  248. package/package.json +17 -17
  249. package/dist/chunk-2SKCXYLB.mjs.map +0 -1
  250. package/dist/chunk-35NPLKQJ.mjs.map +0 -1
  251. package/dist/chunk-7ZVN3YZI.mjs.map +0 -1
  252. package/dist/chunk-AAC66ILR.mjs.map +0 -1
  253. package/dist/chunk-BZAIS65C.mjs.map +0 -1
  254. package/dist/chunk-EPDIF432.mjs.map +0 -1
  255. package/dist/chunk-FP5Q67FO.mjs.map +0 -1
  256. package/dist/chunk-ISSFLGJ5.mjs.map +0 -1
  257. package/dist/chunk-KDP5ZSWP.mjs.map +0 -1
  258. package/dist/chunk-VMCHLH3Y.mjs.map +0 -1
  259. package/dist/chunk-WKDAA6V2.mjs.map +0 -1
  260. package/dist/chunk-X4SFHKFH.mjs.map +0 -1
  261. /package/dist/{chunk-WD2EBM3I.mjs.map → chunk-3CQJV3NC.mjs.map} +0 -0
  262. /package/dist/{chunk-I3OOUWO5.mjs.map → chunk-3GDRV7SG.mjs.map} +0 -0
  263. /package/dist/{chunk-YIBV77KZ.mjs.map → chunk-4WLAVHCY.mjs.map} +0 -0
  264. /package/dist/{chunk-FSIXEIOB.mjs.map → chunk-L7FSTPGS.mjs.map} +0 -0
  265. /package/dist/{chunk-GJ7W6LNK.mjs.map → chunk-N5RK4LK6.mjs.map} +0 -0
  266. /package/dist/{chunk-UMUWR5XA.mjs.map → chunk-PURU7FXR.mjs.map} +0 -0
  267. /package/dist/{chunk-52BR7LTX.mjs.map → chunk-STSPSJUI.mjs.map} +0 -0
  268. /package/dist/{chunk-IZBX2TEU.mjs.map → chunk-VQG3QWWK.mjs.map} +0 -0
  269. /package/dist/{integration-orm-LLW6WZNK.mjs.map → integration-orm-G5BPBT5X.mjs.map} +0 -0
package/dist/api.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  export { A as AnyEndpointMiddleware, D as DELETE, d as EndpointErrorContracts, b as EndpointErrorDefinition, c as EndpointErrorDefinitions, e as EndpointErrorHandler, a as EndpointErrorSchema, f as EndpointFail, E as EndpointFailure, q as EndpointHandler, n as EndpointInvalidationContext, m as EndpointInvalidationTarget, o as EndpointInvalidations, l as EndpointMiddleware, j as EndpointMiddlewareContext, k as EndpointMiddlewareResult, p as EndpointOptions, g as EndpointParamValue, h as EndpointParams, F as FarmAPIStream, y as FarmStreamResponse, G as GET, H as HEAD, I as InferEndpointMiddlewareContext, M as MultipartField, x as MultipartSchema, v as MultipartValues, O as OPTIONS, u as PATCH, s as POST, t as PUT, $ as PluginAPIRouter, Z as PluginRoutes, P as PluginRoutesFactory, Q as QUERY, W as RouteDefinition, Y as RouteFactory, U as RouteInputSchemas, V as RouteJSON, S as RouteMethod, X as RouteOptions, R as RoutePathParams, T as TypedEndpoint, w as TypedFormData, r as createEndpoint, _ as createRouteFactory, i as isEndpointFailure, N as isFarmAPIStream, K as isJSONStreamResponse, B as isMultipartSchema, J as jsonStream, z as multipart, L as readJSONStream, a0 as resolvePluginRoutes, C as toFormData } from './route-CvEr4Uc9.mjs';
2
2
  export { APIRoute, APIRouteConflictError, APIRouteHandlerOptions, APIRouteManager, APIRouteManagerOptions, API_ROUTE_METHODS } from './api/route-manager.mjs';
3
3
  export { s as APIClient, h as APIClientError, b as APIClientOptions, i as APIClientSystemError, c as APIClientWithoutIntegrationsOptions, g as APIResult, G as APIRouteManifest, A as APIRouteRefMetadata, u as ApiClients, C as CacheKey, n as CacheOptions, l as CachePolicy, m as CacheScope, q as ClientOptions, a as FARM_API_ROUTE_META_SYMBOL, F as FARM_API_ROUTE_REF_SYMBOL, o as InvalidateOptions, I as InvalidateTarget, p as OptimisticOptions, O as OptimisticUpdate, j as RequestEvent, k as ResponseEvent, R as RetryOptions, r as RouteAPIClient, t as ServerAPIClient, S as ServerAPIClientOptions, d as ServerAPIClientWithoutIntegrationsOptions, f as StatusEvent, e as StatusPhase, B as applyServerFnOptimisticUpdates, w as createAPIClient, v as createApiClients, z as createServerAPIClient, y as getAPIRouteRefMetadata, x as isAPIRouteRef, E as resolveServerFnInvalidateTargets, D as settleServerFnOptimisticUpdates } from './client-DWoLZ3QU.mjs';
4
- import { ah as ResolvedFarmAPIConfig } from './client-plugins-B6-07YmP.mjs';
5
- export { d4 as DEFAULT_FARM_API_BASE_PATH, d7 as FarmAPIConfig, d5 as FarmAPIConfigResolverContext, d6 as FarmAPIConfigValue, db as getFarmAPIBaseURL, da as normalizeFarmAPIBasePath, d9 as normalizeFarmAPIConfig, d8 as resolveFarmAPIConfig, dc as resolveFarmAPIRequestURL } from './client-plugins-B6-07YmP.mjs';
4
+ import { ai as ResolvedFarmAPIConfig } from './client-plugins-BqtHoJ9C.mjs';
5
+ export { dc as DEFAULT_FARM_API_BASE_PATH, df as FarmAPIConfig, dd as FarmAPIConfigResolverContext, de as FarmAPIConfigValue, dj as getFarmAPIBaseURL, di as normalizeFarmAPIBasePath, dh as normalizeFarmAPIConfig, dg as resolveFarmAPIConfig, dk as resolveFarmAPIRequestURL } from './client-plugins-BqtHoJ9C.mjs';
6
6
  import { Plugin } from 'vite';
7
7
  export { getAllowedAPIRouteMethods, invokeAPIRouteEndpoint, isWebResponse, normalizeRouteResponse, resolveAPIRouteEndpoint } from './api/runtime.mjs';
8
8
  export { A as APIRouteMatch, b as APIRouteParamValue, a as APIRouteParams, m as matchAPIRoute } from './route-pattern-W-SsJGSp.mjs';
@@ -24,7 +24,7 @@ import '@farming-labs/docs';
24
24
  import './markdown.mjs';
25
25
  import './observability.mjs';
26
26
  import '@opentelemetry/api';
27
- import './workflows-ChyK_oTu.mjs';
27
+ import './workflows-BantWytQ.mjs';
28
28
  import './cron.mjs';
29
29
  import './env.mjs';
30
30
  import './navigation-errors-Dvwpzaer.mjs';
package/dist/api.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  export { A as AnyEndpointMiddleware, D as DELETE, d as EndpointErrorContracts, b as EndpointErrorDefinition, c as EndpointErrorDefinitions, e as EndpointErrorHandler, a as EndpointErrorSchema, f as EndpointFail, E as EndpointFailure, q as EndpointHandler, n as EndpointInvalidationContext, m as EndpointInvalidationTarget, o as EndpointInvalidations, l as EndpointMiddleware, j as EndpointMiddlewareContext, k as EndpointMiddlewareResult, p as EndpointOptions, g as EndpointParamValue, h as EndpointParams, F as FarmAPIStream, y as FarmStreamResponse, G as GET, H as HEAD, I as InferEndpointMiddlewareContext, M as MultipartField, x as MultipartSchema, v as MultipartValues, O as OPTIONS, u as PATCH, s as POST, t as PUT, $ as PluginAPIRouter, Z as PluginRoutes, P as PluginRoutesFactory, Q as QUERY, W as RouteDefinition, Y as RouteFactory, U as RouteInputSchemas, V as RouteJSON, S as RouteMethod, X as RouteOptions, R as RoutePathParams, T as TypedEndpoint, w as TypedFormData, r as createEndpoint, _ as createRouteFactory, i as isEndpointFailure, N as isFarmAPIStream, K as isJSONStreamResponse, B as isMultipartSchema, J as jsonStream, z as multipart, L as readJSONStream, a0 as resolvePluginRoutes, C as toFormData } from './route-4pd-EVtw.js';
2
2
  export { APIRoute, APIRouteConflictError, APIRouteHandlerOptions, APIRouteManager, APIRouteManagerOptions, API_ROUTE_METHODS } from './api/route-manager.js';
3
3
  export { s as APIClient, h as APIClientError, b as APIClientOptions, i as APIClientSystemError, c as APIClientWithoutIntegrationsOptions, g as APIResult, G as APIRouteManifest, A as APIRouteRefMetadata, u as ApiClients, C as CacheKey, n as CacheOptions, l as CachePolicy, m as CacheScope, q as ClientOptions, a as FARM_API_ROUTE_META_SYMBOL, F as FARM_API_ROUTE_REF_SYMBOL, o as InvalidateOptions, I as InvalidateTarget, p as OptimisticOptions, O as OptimisticUpdate, j as RequestEvent, k as ResponseEvent, R as RetryOptions, r as RouteAPIClient, t as ServerAPIClient, S as ServerAPIClientOptions, d as ServerAPIClientWithoutIntegrationsOptions, f as StatusEvent, e as StatusPhase, B as applyServerFnOptimisticUpdates, w as createAPIClient, v as createApiClients, z as createServerAPIClient, y as getAPIRouteRefMetadata, x as isAPIRouteRef, E as resolveServerFnInvalidateTargets, D as settleServerFnOptimisticUpdates } from './client-DuQuQC1h.js';
4
- import { ah as ResolvedFarmAPIConfig } from './client-plugins-By6MVUX-.js';
5
- export { d4 as DEFAULT_FARM_API_BASE_PATH, d7 as FarmAPIConfig, d5 as FarmAPIConfigResolverContext, d6 as FarmAPIConfigValue, db as getFarmAPIBaseURL, da as normalizeFarmAPIBasePath, d9 as normalizeFarmAPIConfig, d8 as resolveFarmAPIConfig, dc as resolveFarmAPIRequestURL } from './client-plugins-By6MVUX-.js';
4
+ import { ai as ResolvedFarmAPIConfig } from './client-plugins-DYprkCKN.js';
5
+ export { dc as DEFAULT_FARM_API_BASE_PATH, df as FarmAPIConfig, dd as FarmAPIConfigResolverContext, de as FarmAPIConfigValue, dj as getFarmAPIBaseURL, di as normalizeFarmAPIBasePath, dh as normalizeFarmAPIConfig, dg as resolveFarmAPIConfig, dk as resolveFarmAPIRequestURL } from './client-plugins-DYprkCKN.js';
6
6
  import { Plugin } from 'vite';
7
7
  export { getAllowedAPIRouteMethods, invokeAPIRouteEndpoint, isWebResponse, normalizeRouteResponse, resolveAPIRouteEndpoint } from './api/runtime.js';
8
8
  export { A as APIRouteMatch, b as APIRouteParamValue, a as APIRouteParams, m as matchAPIRoute } from './route-pattern-W-SsJGSp.js';
@@ -24,7 +24,7 @@ import '@farming-labs/docs';
24
24
  import './markdown.js';
25
25
  import './observability.js';
26
26
  import '@opentelemetry/api';
27
- import './workflows-ChyK_oTu.js';
27
+ import './workflows-BantWytQ.js';
28
28
  import './cron.js';
29
29
  import './env.js';
30
30
  import './navigation-errors-Dvwpzaer.js';
package/dist/api.mjs CHANGED
@@ -13,9 +13,9 @@ import {
13
13
  isAPIRouteRef,
14
14
  resolveServerFnInvalidateTargets,
15
15
  settleServerFnOptimisticUpdates
16
- } from "./chunk-IZBX2TEU.mjs";
16
+ } from "./chunk-VQG3QWWK.mjs";
17
17
  import "./chunk-DU3PKDVQ.mjs";
18
- import "./chunk-WMJGA32P.mjs";
18
+ import "./chunk-BXVOHG6B.mjs";
19
19
  import "./chunk-YUE4CJNB.mjs";
20
20
  import "./chunk-6JNGOC37.mjs";
21
21
  import {
@@ -1,15 +1,15 @@
1
- import { q as FarmConfig, P as ParsedRoute, ag as ResolvedFarmRouteRuntimeConfig, h as RouteModule, X as LayoutModule, a1 as SSGCollectionResult, Y as FarmRequest, Z as FarmResponse, ah as ResolvedFarmAPIConfig, j as FarmMdxResolvedConfig, ai as ResolvedFarmDevtoolsConfig, aj as ResolvedFarmDevIndicatorsConfig, ak as ResolvedFarmAuthConfig, al as ResolvedFarmPerformanceConfig, am as ResolvedFarmSecurityConfig } from './client-plugins-By6MVUX-.js';
1
+ import { q as FarmConfig, P as ParsedRoute, ah as ResolvedFarmRouteRuntimeConfig, h as RouteModule, X as LayoutModule, a1 as SSGCollectionResult, Y as FarmRequest, Z as FarmResponse, ai as ResolvedFarmAPIConfig, j as FarmMdxResolvedConfig, aj as ResolvedFarmDevtoolsConfig, ak as ResolvedFarmDevIndicatorsConfig, al as ResolvedFarmAuthConfig, am as ResolvedFarmPerformanceConfig, an as ResolvedFarmSecurityConfig } from './client-plugins-DYprkCKN.js';
2
2
  import { F as FarmDocsResolvedConfig } from './types-CKwggz9n.js';
3
3
  import { FarmMarkdownResolvedConfig } from './markdown.js';
4
- import { F as FarmWorkflowsResolvedConfig } from './workflows-ChyK_oTu.js';
4
+ import { F as FarmWorkflowsResolvedConfig } from './workflows-BantWytQ.js';
5
5
  import { FarmCronResolvedConfig } from './cron.js';
6
6
  import { R as ResolvedFarmImageConfig } from './image-config-Duob7wER.js';
7
7
  import { ProgrammaticRedirectRoute, ProgrammaticRouteSearchClientOptions } from './routes.js';
8
8
  import { ViteDevServer } from 'vite';
9
9
  import { F as FarmIslandStrategy } from './island-CfGru1MO.js';
10
- import { M as MetadataImageKind, A as ApplicationMetadataRouteKind } from './metadata-route-8_V3UonT.js';
10
+ import { M as MetadataImageKind, A as ApplicationMetadataRouteKind } from './metadata-route-D2be_0kC.js';
11
11
  import { FarmServerRendererRuntime, FarmRenderer } from './renderer.js';
12
- import { F as FarmRouteRenderPlan } from './render-plan-0GeHiGVZ.js';
12
+ import { F as FarmRouteRenderPlan } from './render-plan-Z4kSxaT_.js';
13
13
  import { R as ResolvedFarmI18nConfig } from './types-CnH8DOqo.js';
14
14
  import { F as FarmI18nRuntime } from './runtime-BgDQzBiu.js';
15
15
  import { R as ResolvedFarmThemeConfig } from './types-DQnyD3VD.js';
@@ -1,15 +1,15 @@
1
- import { q as FarmConfig, P as ParsedRoute, ag as ResolvedFarmRouteRuntimeConfig, h as RouteModule, X as LayoutModule, a1 as SSGCollectionResult, Y as FarmRequest, Z as FarmResponse, ah as ResolvedFarmAPIConfig, j as FarmMdxResolvedConfig, ai as ResolvedFarmDevtoolsConfig, aj as ResolvedFarmDevIndicatorsConfig, ak as ResolvedFarmAuthConfig, al as ResolvedFarmPerformanceConfig, am as ResolvedFarmSecurityConfig } from './client-plugins-B6-07YmP.mjs';
1
+ import { q as FarmConfig, P as ParsedRoute, ah as ResolvedFarmRouteRuntimeConfig, h as RouteModule, X as LayoutModule, a1 as SSGCollectionResult, Y as FarmRequest, Z as FarmResponse, ai as ResolvedFarmAPIConfig, j as FarmMdxResolvedConfig, aj as ResolvedFarmDevtoolsConfig, ak as ResolvedFarmDevIndicatorsConfig, al as ResolvedFarmAuthConfig, am as ResolvedFarmPerformanceConfig, an as ResolvedFarmSecurityConfig } from './client-plugins-BqtHoJ9C.mjs';
2
2
  import { F as FarmDocsResolvedConfig } from './types-CKwggz9n.mjs';
3
3
  import { FarmMarkdownResolvedConfig } from './markdown.mjs';
4
- import { F as FarmWorkflowsResolvedConfig } from './workflows-ChyK_oTu.mjs';
4
+ import { F as FarmWorkflowsResolvedConfig } from './workflows-BantWytQ.mjs';
5
5
  import { FarmCronResolvedConfig } from './cron.mjs';
6
6
  import { R as ResolvedFarmImageConfig } from './image-config-Duob7wER.mjs';
7
7
  import { ProgrammaticRedirectRoute, ProgrammaticRouteSearchClientOptions } from './routes.mjs';
8
8
  import { ViteDevServer } from 'vite';
9
9
  import { F as FarmIslandStrategy } from './island-CfGru1MO.mjs';
10
- import { M as MetadataImageKind, A as ApplicationMetadataRouteKind } from './metadata-route-CWP_HjGU.mjs';
10
+ import { M as MetadataImageKind, A as ApplicationMetadataRouteKind } from './metadata-route-Dw5CrDIZ.mjs';
11
11
  import { FarmServerRendererRuntime, FarmRenderer } from './renderer.mjs';
12
- import { F as FarmRouteRenderPlan } from './render-plan-DLxJYAA5.mjs';
12
+ import { F as FarmRouteRenderPlan } from './render-plan-COscpW-i.mjs';
13
13
  import { R as ResolvedFarmI18nConfig } from './types-CnH8DOqo.mjs';
14
14
  import { F as FarmI18nRuntime } from './runtime-CV2UCV-5.mjs';
15
15
  import { R as ResolvedFarmThemeConfig } from './types-DQnyD3VD.mjs';
@@ -31,10 +31,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  // src/app-markdown.ts
32
32
  var app_markdown_exports = {};
33
33
  __export(app_markdown_exports, {
34
+ FARM_MARKDOWN_CONTENT_TYPE: () => FARM_MARKDOWN_CONTENT_TYPE,
35
+ createFarmMarkdownErrorBody: () => createFarmMarkdownErrorBody,
34
36
  createFarmMarkdownRouteModule: () => createFarmMarkdownRouteModule,
35
37
  createFarmMarkdownRouteModuleFromFile: () => createFarmMarkdownRouteModuleFromFile,
36
38
  createFarmMarkdownSourceResponse: () => createFarmMarkdownSourceResponse,
37
39
  createMarkdownMetadata: () => createMarkdownMetadata,
40
+ farmRequestWantsMarkdown: () => farmRequestWantsMarkdown,
38
41
  isFarmMarkdownPageFile: () => isFarmMarkdownPageFile,
39
42
  loadFarmMdxComponents: () => loadFarmMdxComponents,
40
43
  normalizeFarmMarkdownRoutePath: () => normalizeFarmMarkdownRoutePath,
@@ -78,6 +81,21 @@ function isFarmMarkdownPageFile(filePath) {
78
81
  return /(^|[/\\])page\.mdx?$/i.test(filePath);
79
82
  }
80
83
  __name(isFarmMarkdownPageFile, "isFarmMarkdownPageFile");
84
+ var FARM_MARKDOWN_CONTENT_TYPE = "text/markdown; charset=utf-8";
85
+ function farmRequestWantsMarkdown(pathname, accept) {
86
+ return pathname.toLowerCase().endsWith(".md") || requestAcceptsMarkdown(accept);
87
+ }
88
+ __name(farmRequestWantsMarkdown, "farmRequestWantsMarkdown");
89
+ function createFarmMarkdownErrorBody(status, pathname, homeHref = "/") {
90
+ const heading = status === 404 ? "Page not found" : `Request failed (${status})`;
91
+ return `# ${heading}
92
+
93
+ No page is available at \`${pathname}\`. The URL may be incorrect, or the page has not been published.
94
+
95
+ Browse [the site homepage](${homeHref}) to find available pages.
96
+ `;
97
+ }
98
+ __name(createFarmMarkdownErrorBody, "createFarmMarkdownErrorBody");
81
99
  function normalizeFarmMarkdownRoutePath(pathname) {
82
100
  const withoutExtension = pathname.replace(/\.md$/i, "");
83
101
  const normalized = withoutExtension.startsWith("/") ? withoutExtension : `/${withoutExtension}`;
@@ -232,10 +250,13 @@ async function createFarmMarkdownSourceResponse(options) {
232
250
  __name(createFarmMarkdownSourceResponse, "createFarmMarkdownSourceResponse");
233
251
  // Annotate the CommonJS export names for ESM import in node:
234
252
  0 && (module.exports = {
253
+ FARM_MARKDOWN_CONTENT_TYPE,
254
+ createFarmMarkdownErrorBody,
235
255
  createFarmMarkdownRouteModule,
236
256
  createFarmMarkdownRouteModuleFromFile,
237
257
  createFarmMarkdownSourceResponse,
238
258
  createMarkdownMetadata,
259
+ farmRequestWantsMarkdown,
239
260
  isFarmMarkdownPageFile,
240
261
  loadFarmMdxComponents,
241
262
  normalizeFarmMarkdownRoutePath,
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app-markdown.ts","../src/markdown.ts","../src/app-markdown-config.ts"],"sourcesContent":["import { readFile } from \"fs/promises\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport type { Metadata, RouteModule } from \"./types\";\nimport type { ComponentType } from \"react\";\nimport { requestAcceptsMarkdown } from \"./markdown\";\nimport {\n resolveMdxConfig,\n type FarmMdxComponents,\n type FarmMdxResolvedConfig,\n} from \"./app-markdown-config\";\nexport {\n resolveMdxConfig,\n type FarmMdxComponent,\n type FarmMdxComponents,\n type FarmMdxResolvedConfig,\n type FarmMdxUserConfig,\n} from \"./app-markdown-config\";\n\nexport interface FarmMarkdownPageSource {\n source: string;\n filePath: string;\n}\n\nexport interface FarmMarkdownPageModuleInput extends FarmMarkdownPageSource {\n components?: FarmMdxComponents;\n config?: FarmMdxResolvedConfig;\n}\n\nexport function isFarmMarkdownPageFile(filePath: string): boolean {\n return /(^|[/\\\\])page\\.mdx?$/i.test(filePath);\n}\n\n/** Content type for Markdown responses, including agent-facing error bodies. */\nexport const FARM_MARKDOWN_CONTENT_TYPE = \"text/markdown; charset=utf-8\";\n\n/**\n * True when the client asked for Markdown — either via a `.md` path or an\n * `Accept: text/markdown` header. Used to serve a Markdown error body to agents\n * that navigate in Markdown, instead of the HTML error shell.\n */\nexport function farmRequestWantsMarkdown(\n pathname: string,\n accept: string | null | undefined,\n): boolean {\n return pathname.toLowerCase().endsWith(\".md\") || requestAcceptsMarkdown(accept);\n}\n\n/**\n * A Markdown error document for agents that requested Markdown but hit an error\n * (typically a 404). Includes a short explanation and a link back to the site so\n * an agent can recover, satisfying the \"Markdown error body\" agent-readiness\n * expectation.\n */\nexport function createFarmMarkdownErrorBody(\n status: number,\n pathname: string,\n homeHref = \"/\",\n): string {\n const heading = status === 404 ? \"Page not found\" : `Request failed (${status})`;\n return (\n `# ${heading}\\n\\n` +\n `No page is available at \\`${pathname}\\`. The URL may be incorrect, ` +\n `or the page has not been published.\\n\\n` +\n `Browse [the site homepage](${homeHref}) to find available pages.\\n`\n );\n}\n\nexport function normalizeFarmMarkdownRoutePath(pathname: string): string {\n const withoutExtension = pathname.replace(/\\.md$/i, \"\");\n const normalized = withoutExtension.startsWith(\"/\") ? withoutExtension : `/${withoutExtension}`;\n return normalized === \"/index\" ? \"/\" : normalized.replace(/\\/+$/g, \"\") || \"/\";\n}\n\nexport function parseMarkdownFrontmatter(source: string): {\n frontmatter: Record<string, string>;\n body: string;\n} {\n if (!source.startsWith(\"---\")) {\n return { frontmatter: {}, body: source };\n }\n\n const endIndex = source.indexOf(\"\\n---\", 3);\n if (endIndex === -1) {\n return { frontmatter: {}, body: source };\n }\n\n const frontmatterSource = source.slice(3, endIndex).trim();\n const closingFenceEnd = endIndex + \"\\n---\".length;\n const bodyStart =\n source.slice(closingFenceEnd, closingFenceEnd + 2) === \"\\r\\n\"\n ? closingFenceEnd + 2\n : source[closingFenceEnd] === \"\\n\"\n ? closingFenceEnd + 1\n : closingFenceEnd;\n const body = source.slice(bodyStart);\n const frontmatter: Record<string, string> = {};\n\n for (const line of frontmatterSource.split(/\\r?\\n/)) {\n const separator = line.indexOf(\":\");\n if (separator === -1) continue;\n const key = line.slice(0, separator).trim();\n const value = line\n .slice(separator + 1)\n .trim()\n .replace(/^[\"']|[\"']$/g, \"\");\n if (key && value) frontmatter[key] = value;\n }\n\n return { frontmatter, body };\n}\n\nexport function titleFromMarkdown(body: string, fallback?: string): string | undefined {\n return body.match(/^#\\s+(.+)$/m)?.[1]?.trim() || fallback;\n}\n\nexport function createMarkdownMetadata(\n source: string,\n filePath: string,\n): (Metadata & Record<string, any>) | undefined {\n const { frontmatter, body } = parseMarkdownFrontmatter(source);\n const routeTitle = titleFromMarkdown(body);\n const title = frontmatter.title || routeTitle;\n const description = frontmatter.description;\n\n if (!title && !description) {\n return undefined;\n }\n\n return {\n ...(title ? { title } : {}),\n ...(description ? { description } : {}),\n source: filePath,\n };\n}\n\nasync function evaluateMdxSource(source: string, filePath: string) {\n const [{ evaluate }, runtime, remarkGfmModule] = await Promise.all([\n import(\"@mdx-js/mdx\"),\n import(\"react/jsx-runtime\"),\n import(\"remark-gfm\"),\n ]);\n const remarkGfm = remarkGfmModule.default;\n\n return evaluate(source, {\n ...runtime,\n baseUrl: pathToFileURL(filePath),\n remarkPlugins: [remarkGfm],\n });\n}\n\nexport function createFarmMarkdownRouteModule(\n input: FarmMarkdownPageModuleInput,\n): RouteModule & { source: string } {\n const { body } = parseMarkdownFrontmatter(input.source);\n const components = input.components || {};\n const className = input.config?.className || \"farm-markdown\";\n let evaluatedPromise: Promise<{ default: ComponentType<any> }> | undefined;\n\n const loadContent = async () => {\n evaluatedPromise ??= evaluateMdxSource(body, input.filePath) as Promise<{\n default: ComponentType<any>;\n }>;\n return evaluatedPromise;\n };\n\n async function FarmMarkdownPage(props: any) {\n const { createElement } = await import(\"react\");\n const evaluated = await loadContent();\n const MDXContent = evaluated.default;\n return createElement(\n \"article\",\n { className, \"data-farm-markdown-page\": \"\" },\n createElement(MDXContent, {\n ...props,\n components: {\n ...components,\n ...props?.components,\n },\n }),\n );\n }\n\n return {\n default: FarmMarkdownPage as unknown as RouteModule[\"default\"],\n metadata: createMarkdownMetadata(input.source, input.filePath),\n source: input.source,\n };\n}\n\nexport async function createFarmMarkdownRouteModuleFromFile(\n filePath: string,\n options: {\n components?: FarmMdxComponents;\n config?: FarmMdxResolvedConfig;\n } = {},\n) {\n const source = await readFile(filePath, \"utf8\");\n return createFarmMarkdownRouteModule({\n source,\n filePath,\n components: options.components,\n config: options.config,\n });\n}\n\nexport async function loadFarmMdxComponents(\n config: FarmMdxResolvedConfig | undefined,\n options: {\n root: string;\n loadModule?: (modulePath: string) => Promise<unknown>;\n },\n): Promise<FarmMdxComponents> {\n const configured = config?.components;\n if (!configured) {\n return {};\n }\n\n if (typeof configured !== \"string\") {\n return configured;\n }\n\n const modulePath = path.isAbsolute(configured) ? configured : path.join(options.root, configured);\n const mod = options.loadModule\n ? await options.loadModule(modulePath)\n : await import(pathToFileURL(modulePath).href);\n const maybeModule = mod as {\n components?: FarmMdxComponents;\n default?: FarmMdxComponents;\n };\n\n return maybeModule.components || maybeModule.default || {};\n}\n\nexport async function createFarmMarkdownSourceResponse(options: {\n request: Request;\n config?: FarmMdxResolvedConfig;\n resolveSource: (\n pathname: string,\n ) => Promise<FarmMarkdownPageSource | null> | FarmMarkdownPageSource | null;\n}): Promise<Response | null> {\n if (options.request.method !== \"GET\" && options.request.method !== \"HEAD\") {\n return null;\n }\n if (options.config?.markdownRoutes === false) {\n return null;\n }\n\n const url = new URL(options.request.url);\n const hasMarkdownExtension = url.pathname.toLowerCase().endsWith(\".md\");\n if (!hasMarkdownExtension && !requestAcceptsMarkdown(options.request.headers.get(\"accept\"))) {\n return null;\n }\n\n const targetPathname = normalizeFarmMarkdownRoutePath(url.pathname);\n const source = await options.resolveSource(targetPathname);\n if (!source) {\n return null;\n }\n\n const headers = new Headers({\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n \"Content-Location\": targetPathname === \"/\" ? \"/index.md\" : `${targetPathname}.md`,\n \"Cache-Control\": \"public, s-maxage=60, stale-while-revalidate=300\",\n \"X-Farm-Markdown-Route\": targetPathname,\n \"X-Farm-Markdown-Source\": source.filePath,\n });\n if (!hasMarkdownExtension) {\n headers.set(\"Vary\", \"Accept\");\n }\n\n return new Response(options.request.method === \"HEAD\" ? null : source.source, {\n status: 200,\n headers,\n });\n}\n","export type FarmMarkdownRouteInput =\n | string\n | {\n route: string;\n title?: string;\n cache?: number | false;\n };\n\nexport interface FarmMarkdownUserConfig {\n /**\n * Enable generated markdown representations for React pages.\n * @default true\n */\n enabled?: boolean;\n /**\n * Routes that may expose generated markdown. Every page is exposed by default.\n */\n expose?: boolean | FarmMarkdownRouteInput[];\n /** @deprecated Use `expose`. */\n routes?: FarmMarkdownRouteInput[];\n cache?: number | false;\n includeMetadata?: boolean;\n}\n\nexport interface FarmMarkdownResolvedRoute {\n route: string;\n title?: string;\n cache?: number | false;\n}\n\nexport interface FarmMarkdownResolvedConfig {\n enabled: boolean;\n expose: true | FarmMarkdownResolvedRoute[];\n cache: number | false;\n includeMetadata: boolean;\n}\n\nexport interface FarmMarkdownMirrorTarget {\n pathname: string;\n route: FarmMarkdownResolvedRoute | null;\n}\n\nexport interface ResolveMarkdownMirrorTargetOptions {\n accept?: string | null;\n}\n\nexport interface CreateMarkdownMirrorResponseOptions {\n request: Request;\n config?: FarmMarkdownResolvedConfig;\n routeExists?: (pathname: string) => boolean;\n renderPage: (request: Request) => Response | Promise<Response>;\n}\n\nexport interface ApplyMarkdownNegotiationHeadersOptions {\n config?: FarmMarkdownResolvedConfig;\n pathname: string;\n}\n\nexport function resolveMarkdownConfig(\n config: FarmMarkdownUserConfig | boolean | undefined,\n): FarmMarkdownResolvedConfig {\n if (config === false) {\n return {\n enabled: false,\n expose: [],\n cache: false,\n includeMetadata: true,\n };\n }\n\n if (config === true || config === undefined) {\n return {\n enabled: true,\n expose: true,\n cache: false,\n includeMetadata: true,\n };\n }\n\n const exposeInput = config.expose ?? config.routes ?? true;\n const expose =\n exposeInput === true\n ? true\n : Array.isArray(exposeInput)\n ? exposeInput.map(normalizeMarkdownRouteInput)\n : [];\n\n return {\n enabled: config.enabled !== false && (expose === true || expose.length > 0),\n expose,\n cache: config.cache ?? false,\n includeMetadata: config.includeMetadata ?? true,\n };\n}\n\nexport function resolveMarkdownMirrorTarget(\n config: FarmMarkdownResolvedConfig | undefined,\n pathname: string,\n options: ResolveMarkdownMirrorTargetOptions = {},\n): FarmMarkdownMirrorTarget | null {\n const hasMarkdownExtension = pathname.toLowerCase().endsWith(\".md\");\n if (!config?.enabled || (!hasMarkdownExtension && !requestAcceptsMarkdown(options.accept))) {\n return null;\n }\n\n const targetPathname = normalizeMarkdownRoute(\n hasMarkdownExtension ? pathname.slice(0, -\".md\".length) || \"/\" : pathname,\n );\n const route = findExposedMarkdownRoute(config, targetPathname);\n if (!route && config.expose !== true) {\n return null;\n }\n\n return {\n pathname: targetPathname,\n route,\n };\n}\n\nexport async function createMarkdownMirrorResponse(\n options: CreateMarkdownMirrorResponseOptions,\n): Promise<Response | null> {\n if (options.request.method !== \"GET\" && options.request.method !== \"HEAD\") {\n return null;\n }\n\n const requestUrl = new URL(options.request.url);\n const hasMarkdownExtension = requestUrl.pathname.toLowerCase().endsWith(\".md\");\n const target = resolveMarkdownMirrorTarget(options.config, requestUrl.pathname, {\n accept: options.request.headers.get(\"accept\"),\n });\n if (!target) {\n return null;\n }\n\n if (options.routeExists && !options.routeExists(target.pathname)) {\n return null;\n }\n\n const pageUrl = new URL(options.request.url);\n pageUrl.pathname = target.pathname;\n const headers = new Headers(options.request.headers);\n headers.set(\"accept\", \"text/html\");\n\n const pageResponse = await options.renderPage(\n new Request(pageUrl, {\n method: \"GET\",\n headers,\n }),\n );\n\n if (!isHtmlResponse(pageResponse)) {\n return null;\n }\n\n const html = await pageResponse.text();\n const markdown = htmlToMarkdown(html, {\n title: target.route?.title,\n includeMetadata: options.config?.includeMetadata ?? true,\n sourcePath: target.pathname,\n });\n const headersOut = new Headers({\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n \"Content-Location\": target.pathname === \"/\" ? \"/index.md\" : `${target.pathname}.md`,\n \"X-Farm-Markdown-Route\": target.pathname,\n });\n if (!hasMarkdownExtension) {\n headersOut.set(\"Vary\", \"Accept\");\n }\n const cache = target.route?.cache ?? options.config?.cache ?? false;\n headersOut.set(\"Cache-Control\", createMarkdownCacheHeader(cache));\n\n return new Response(options.request.method === \"HEAD\" ? null : markdown, {\n status: pageResponse.status,\n headers: headersOut,\n });\n}\n\nexport function applyMarkdownNegotiationHeaders(\n response: Response,\n options: ApplyMarkdownNegotiationHeadersOptions,\n): Response {\n if (!isHtmlResponse(response)) {\n return response;\n }\n\n const target = resolveMarkdownMirrorTarget(options.config, options.pathname, {\n accept: \"text/markdown\",\n });\n if (!target) {\n return response;\n }\n\n const alternatePath = getMarkdownAlternatePath(target.pathname);\n const headers = new Headers(response.headers);\n appendHeaderToken(headers, \"Vary\", \"Accept\");\n headers.append(\"Link\", `<${alternatePath}>; rel=\"alternate\"; type=\"text/markdown\"`);\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nexport function htmlToMarkdown(\n html: string,\n options: {\n title?: string;\n sourcePath?: string;\n includeMetadata?: boolean;\n } = {},\n): string {\n const title = options.title ?? extractHtmlTitle(html);\n let source = extractHtmlBody(html)\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \"\")\n .replace(/<noscript\\b[^>]*>[\\s\\S]*?<\\/noscript>/gi, \"\")\n .replace(/<!--[\\s\\S]*?-->/g, \"\");\n\n source = source.replace(/<pre\\b[^>]*><code\\b[^>]*>([\\s\\S]*?)<\\/code><\\/pre>/gi, (_, code) => {\n return `\\n\\n\\`\\`\\`\\n${decodeHtml(stripTags(code)).trim()}\\n\\`\\`\\`\\n\\n`;\n });\n source = source.replace(/<pre\\b[^>]*>([\\s\\S]*?)<\\/pre>/gi, (_, code) => {\n return `\\n\\n\\`\\`\\`\\n${decodeHtml(stripTags(code)).trim()}\\n\\`\\`\\`\\n\\n`;\n });\n source = source.replace(/<h([1-6])\\b[^>]*>([\\s\\S]*?)<\\/h\\1>/gi, (_, level, content) => {\n return `\\n\\n${\"#\".repeat(Number(level))} ${toInlineMarkdown(content).trim()}\\n\\n`;\n });\n source = source.replace(/<p\\b[^>]*>([\\s\\S]*?)<\\/p>/gi, (_, content) => {\n return `\\n\\n${toInlineMarkdown(content).trim()}\\n\\n`;\n });\n source = source.replace(/<blockquote\\b[^>]*>([\\s\\S]*?)<\\/blockquote>/gi, (_, content) => {\n const quote = htmlToMarkdown(content, { includeMetadata: false })\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0)\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n return `\\n\\n${quote}\\n\\n`;\n });\n source = source.replace(/<li\\b[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, content) => {\n return `\\n- ${toInlineMarkdown(content).trim()}`;\n });\n source = source\n .replace(/<\\/?(ul|ol|main|section|article|header|footer|nav|aside|div)\\b[^>]*>/gi, \"\\n\")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<hr\\s*\\/?>/gi, \"\\n\\n---\\n\\n\");\n\n let markdown = stripTags(source)\n .split(\"\\n\")\n .map((line) => line.replace(/[ \\t]+$/g, \"\"))\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n\n if (options.includeMetadata !== false) {\n const metadata: string[] = [];\n if (title && !markdown.startsWith(\"# \")) {\n metadata.push(`# ${title}`);\n }\n if (options.sourcePath) {\n metadata.push(`Source: ${options.sourcePath}`);\n }\n if (metadata.length) {\n markdown = `${metadata.join(\"\\n\\n\")}${markdown ? `\\n\\n${markdown}` : \"\"}`;\n }\n }\n\n return `${markdown}\\n`;\n}\n\nfunction normalizeMarkdownRouteInput(input: FarmMarkdownRouteInput): FarmMarkdownResolvedRoute {\n if (typeof input === \"string\") {\n return {\n route: normalizeMarkdownRoute(input),\n };\n }\n\n return {\n ...input,\n route: normalizeMarkdownRoute(input.route),\n };\n}\n\nfunction normalizeMarkdownRoute(route: string): string {\n const withoutMarkdownExtension = route.toLowerCase().endsWith(\".md\") ? route.slice(0, -3) : route;\n const withSlash = withoutMarkdownExtension.startsWith(\"/\")\n ? withoutMarkdownExtension\n : `/${withoutMarkdownExtension}`;\n const normalized = withSlash.replace(/\\/+/g, \"/\").replace(/\\/$/g, \"\");\n return normalized === \"\" || normalized === \"/index\" ? \"/\" : normalized;\n}\n\nexport function requestAcceptsMarkdown(accept: string | null | undefined): boolean {\n if (!accept) {\n return false;\n }\n\n return accept.split(\",\").some((entry) => {\n const [mediaType, ...parameters] = entry\n .trim()\n .toLowerCase()\n .split(\";\")\n .map((part) => part.trim());\n if (mediaType !== \"text/markdown\") {\n return false;\n }\n\n const quality = parameters.find((parameter) => parameter.startsWith(\"q=\"));\n return quality === undefined || Number(quality.slice(2)) > 0;\n });\n}\n\nfunction getMarkdownAlternatePath(pathname: string): string {\n return pathname === \"/\" ? \"/index.md\" : `${pathname}.md`;\n}\n\nfunction appendHeaderToken(headers: Headers, name: string, token: string): void {\n const current = headers.get(name);\n if (!current) {\n headers.set(name, token);\n return;\n }\n\n const tokens = current.split(\",\").map((value) => value.trim().toLowerCase());\n if (!tokens.includes(token.toLowerCase())) {\n headers.set(name, `${current}, ${token}`);\n }\n}\n\nfunction findExposedMarkdownRoute(\n config: FarmMarkdownResolvedConfig,\n pathname: string,\n): FarmMarkdownResolvedRoute | null {\n if (config.expose === true) {\n return null;\n }\n\n return config.expose.find((route) => routeMatches(route.route, pathname)) ?? null;\n}\n\nfunction routeMatches(pattern: string, pathname: string): boolean {\n if (pattern === pathname) {\n return true;\n }\n\n const escaped = pattern\n .split(\"/\")\n .map((segment) => {\n if (/^\\[\\.\\.\\.[^\\]]+\\]$/.test(segment)) {\n return \".*\";\n }\n if (/^\\[[^\\]]+\\]$/.test(segment)) {\n return \"[^/]+\";\n }\n return segment.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n })\n .join(\"/\");\n\n return new RegExp(`^${escaped}$`).test(pathname);\n}\n\nfunction isHtmlResponse(response: Response): boolean {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n return contentType.includes(\"text/html\");\n}\n\nfunction createMarkdownCacheHeader(cache: number | false): string {\n if (cache === false || cache <= 0) {\n return \"no-store\";\n }\n\n return `public, max-age=${cache}, s-maxage=${cache}`;\n}\n\nfunction extractHtmlTitle(html: string): string | undefined {\n const match = html.match(/<title\\b[^>]*>([\\s\\S]*?)<\\/title>/i);\n return match ? decodeHtml(stripTags(match[1])).trim() : undefined;\n}\n\nfunction extractHtmlBody(html: string): string {\n const rootMatch = html.match(\n /<div\\b[^>]*id=[\"']root[\"'][^>]*>([\\s\\S]*?)<\\/div>\\s*(?:<script|<\\/body>|$)/i,\n );\n const bodyMatch = html.match(/<body\\b[^>]*>([\\s\\S]*?)<\\/body>/i);\n const body = rootMatch ? rootMatch[1] : bodyMatch ? bodyMatch[1] : html;\n return extractFirstElementContent(body, [\"main\", \"article\"]) ?? body;\n}\n\nfunction extractFirstElementContent(html: string, tagNames: string[]): string | undefined {\n for (const tagName of tagNames) {\n const match = html.match(new RegExp(`<${tagName}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${tagName}>`, \"i\"));\n if (match) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\nfunction toInlineMarkdown(html: string): string {\n let source = html\n .replace(/<a\\b[^>]*href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi, (_, href, text) => {\n const label: string = toInlineMarkdown(text).trim() || href;\n return `[${label}](${decodeHtml(href)})`;\n })\n .replace(\n /<img\\b[^>]*src=[\"']([^\"']+)[\"'][^>]*alt=[\"']([^\"']*)[\"'][^>]*\\/?>/gi,\n (_, src, alt) => {\n return `![${decodeHtml(alt)}](${decodeHtml(src)})`;\n },\n )\n .replace(/<strong\\b[^>]*>([\\s\\S]*?)<\\/strong>/gi, (_, content) => {\n return `**${toInlineMarkdown(content).trim()}**`;\n })\n .replace(/<b\\b[^>]*>([\\s\\S]*?)<\\/b>/gi, (_, content) => {\n return `**${toInlineMarkdown(content).trim()}**`;\n })\n .replace(/<em\\b[^>]*>([\\s\\S]*?)<\\/em>/gi, (_, content) => {\n return `_${toInlineMarkdown(content).trim()}_`;\n })\n .replace(/<i\\b[^>]*>([\\s\\S]*?)<\\/i>/gi, (_, content) => {\n return `_${toInlineMarkdown(content).trim()}_`;\n })\n .replace(/<code\\b[^>]*>([\\s\\S]*?)<\\/code>/gi, (_, content) => {\n return `\\`${decodeHtml(stripTags(content)).trim()}\\``;\n })\n .replace(/<br\\s*\\/?>/gi, \"\\n\");\n\n source = stripTags(source);\n return decodeHtml(source).replace(/\\s+/g, \" \");\n}\n\nfunction stripTags(input: string): string {\n return input.replace(/<[^>]+>/g, \"\");\n}\n\nfunction decodeHtml(input: string): string {\n return input.replace(/&(?:nbsp|amp|lt|gt|quot|#39|#(?:x|X)[0-9a-fA-F]+|#[0-9]+);/g, (entity) => {\n switch (entity) {\n case \"&nbsp;\":\n return \" \";\n case \"&amp;\":\n return \"&\";\n case \"&lt;\":\n return \"<\";\n case \"&gt;\":\n return \">\";\n case \"&quot;\":\n return '\"';\n case \"&#39;\":\n return \"'\";\n }\n\n const hexadecimal = entity[2] === \"x\" || entity[2] === \"X\";\n const codePoint = Number.parseInt(entity.slice(hexadecimal ? 3 : 2, -1), hexadecimal ? 16 : 10);\n return codePoint === 0 || codePoint > 0x10ffff || (codePoint >= 0xd800 && codePoint <= 0xdfff)\n ? \"\\uFFFD\"\n : String.fromCodePoint(codePoint);\n });\n}\n","import type React from \"react\";\n\nexport type FarmMdxComponent = React.ComponentType<any> | keyof React.JSX.IntrinsicElements;\nexport type FarmMdxComponents = Record<string, FarmMdxComponent>;\n\nexport interface FarmMdxUserConfig {\n /**\n * Component map or module path that exports `components` or a default component map.\n * Relative paths resolve from the project root.\n */\n components?: string | FarmMdxComponents;\n /**\n * Serve source-authored markdown pages at `/route.md`.\n * Enabled by default for `page.md` and `page.mdx`.\n */\n markdownRoutes?: boolean;\n /** Class name used for the wrapper around rendered markdown content. */\n className?: string;\n}\n\nexport interface FarmMdxResolvedConfig {\n components?: string | FarmMdxComponents;\n markdownRoutes: boolean;\n className: string;\n}\n\nexport function resolveMdxConfig(config: FarmMdxUserConfig | undefined): FarmMdxResolvedConfig {\n return {\n components: config?.components,\n markdownRoutes: config?.markdownRoutes ?? true,\n className: config?.className ?? \"farm-markdown\",\n };\n}\n"],"mappings":"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","names":["path"]}
@@ -1,5 +1,5 @@
1
- import { i as FarmMdxComponents, j as FarmMdxResolvedConfig, M as Metadata, h as RouteModule } from './client-plugins-B6-07YmP.mjs';
2
- export { k as FarmMdxComponent, l as FarmMdxUserConfig, r as resolveMdxConfig } from './client-plugins-B6-07YmP.mjs';
1
+ import { i as FarmMdxComponents, j as FarmMdxResolvedConfig, M as Metadata, h as RouteModule } from './client-plugins-BqtHoJ9C.mjs';
2
+ export { k as FarmMdxComponent, l as FarmMdxUserConfig, r as resolveMdxConfig } from './client-plugins-BqtHoJ9C.mjs';
3
3
  import './lifecycle-De0vQG45.mjs';
4
4
  import './route-CvEr4Uc9.mjs';
5
5
  import './cache.mjs';
@@ -17,7 +17,7 @@ import './markdown.mjs';
17
17
  import './observability.mjs';
18
18
  import '@opentelemetry/api';
19
19
  import 'vite';
20
- import './workflows-ChyK_oTu.mjs';
20
+ import './workflows-BantWytQ.mjs';
21
21
  import './cron.mjs';
22
22
  import './env.mjs';
23
23
  import './navigation-errors-Dvwpzaer.mjs';
@@ -41,6 +41,21 @@ interface FarmMarkdownPageModuleInput extends FarmMarkdownPageSource {
41
41
  config?: FarmMdxResolvedConfig;
42
42
  }
43
43
  declare function isFarmMarkdownPageFile(filePath: string): boolean;
44
+ /** Content type for Markdown responses, including agent-facing error bodies. */
45
+ declare const FARM_MARKDOWN_CONTENT_TYPE = "text/markdown; charset=utf-8";
46
+ /**
47
+ * True when the client asked for Markdown — either via a `.md` path or an
48
+ * `Accept: text/markdown` header. Used to serve a Markdown error body to agents
49
+ * that navigate in Markdown, instead of the HTML error shell.
50
+ */
51
+ declare function farmRequestWantsMarkdown(pathname: string, accept: string | null | undefined): boolean;
52
+ /**
53
+ * A Markdown error document for agents that requested Markdown but hit an error
54
+ * (typically a 404). Includes a short explanation and a link back to the site so
55
+ * an agent can recover, satisfying the "Markdown error body" agent-readiness
56
+ * expectation.
57
+ */
58
+ declare function createFarmMarkdownErrorBody(status: number, pathname: string, homeHref?: string): string;
44
59
  declare function normalizeFarmMarkdownRoutePath(pathname: string): string;
45
60
  declare function parseMarkdownFrontmatter(source: string): {
46
61
  frontmatter: Record<string, string>;
@@ -67,4 +82,4 @@ declare function createFarmMarkdownSourceResponse(options: {
67
82
  resolveSource: (pathname: string) => Promise<FarmMarkdownPageSource | null> | FarmMarkdownPageSource | null;
68
83
  }): Promise<Response | null>;
69
84
 
70
- export { type FarmMarkdownPageModuleInput, type FarmMarkdownPageSource, FarmMdxComponents, FarmMdxResolvedConfig, createFarmMarkdownRouteModule, createFarmMarkdownRouteModuleFromFile, createFarmMarkdownSourceResponse, createMarkdownMetadata, isFarmMarkdownPageFile, loadFarmMdxComponents, normalizeFarmMarkdownRoutePath, parseMarkdownFrontmatter, titleFromMarkdown };
85
+ export { FARM_MARKDOWN_CONTENT_TYPE, type FarmMarkdownPageModuleInput, type FarmMarkdownPageSource, FarmMdxComponents, FarmMdxResolvedConfig, createFarmMarkdownErrorBody, createFarmMarkdownRouteModule, createFarmMarkdownRouteModuleFromFile, createFarmMarkdownSourceResponse, createMarkdownMetadata, farmRequestWantsMarkdown, isFarmMarkdownPageFile, loadFarmMdxComponents, normalizeFarmMarkdownRoutePath, parseMarkdownFrontmatter, titleFromMarkdown };
@@ -1,5 +1,5 @@
1
- import { i as FarmMdxComponents, j as FarmMdxResolvedConfig, M as Metadata, h as RouteModule } from './client-plugins-By6MVUX-.js';
2
- export { k as FarmMdxComponent, l as FarmMdxUserConfig, r as resolveMdxConfig } from './client-plugins-By6MVUX-.js';
1
+ import { i as FarmMdxComponents, j as FarmMdxResolvedConfig, M as Metadata, h as RouteModule } from './client-plugins-DYprkCKN.js';
2
+ export { k as FarmMdxComponent, l as FarmMdxUserConfig, r as resolveMdxConfig } from './client-plugins-DYprkCKN.js';
3
3
  import './lifecycle-De0vQG45.js';
4
4
  import './route-4pd-EVtw.js';
5
5
  import './cache.js';
@@ -17,7 +17,7 @@ import './markdown.js';
17
17
  import './observability.js';
18
18
  import '@opentelemetry/api';
19
19
  import 'vite';
20
- import './workflows-ChyK_oTu.js';
20
+ import './workflows-BantWytQ.js';
21
21
  import './cron.js';
22
22
  import './env.js';
23
23
  import './navigation-errors-Dvwpzaer.js';
@@ -41,6 +41,21 @@ interface FarmMarkdownPageModuleInput extends FarmMarkdownPageSource {
41
41
  config?: FarmMdxResolvedConfig;
42
42
  }
43
43
  declare function isFarmMarkdownPageFile(filePath: string): boolean;
44
+ /** Content type for Markdown responses, including agent-facing error bodies. */
45
+ declare const FARM_MARKDOWN_CONTENT_TYPE = "text/markdown; charset=utf-8";
46
+ /**
47
+ * True when the client asked for Markdown — either via a `.md` path or an
48
+ * `Accept: text/markdown` header. Used to serve a Markdown error body to agents
49
+ * that navigate in Markdown, instead of the HTML error shell.
50
+ */
51
+ declare function farmRequestWantsMarkdown(pathname: string, accept: string | null | undefined): boolean;
52
+ /**
53
+ * A Markdown error document for agents that requested Markdown but hit an error
54
+ * (typically a 404). Includes a short explanation and a link back to the site so
55
+ * an agent can recover, satisfying the "Markdown error body" agent-readiness
56
+ * expectation.
57
+ */
58
+ declare function createFarmMarkdownErrorBody(status: number, pathname: string, homeHref?: string): string;
44
59
  declare function normalizeFarmMarkdownRoutePath(pathname: string): string;
45
60
  declare function parseMarkdownFrontmatter(source: string): {
46
61
  frontmatter: Record<string, string>;
@@ -67,4 +82,4 @@ declare function createFarmMarkdownSourceResponse(options: {
67
82
  resolveSource: (pathname: string) => Promise<FarmMarkdownPageSource | null> | FarmMarkdownPageSource | null;
68
83
  }): Promise<Response | null>;
69
84
 
70
- export { type FarmMarkdownPageModuleInput, type FarmMarkdownPageSource, FarmMdxComponents, FarmMdxResolvedConfig, createFarmMarkdownRouteModule, createFarmMarkdownRouteModuleFromFile, createFarmMarkdownSourceResponse, createMarkdownMetadata, isFarmMarkdownPageFile, loadFarmMdxComponents, normalizeFarmMarkdownRoutePath, parseMarkdownFrontmatter, titleFromMarkdown };
85
+ export { FARM_MARKDOWN_CONTENT_TYPE, type FarmMarkdownPageModuleInput, type FarmMarkdownPageSource, FarmMdxComponents, FarmMdxResolvedConfig, createFarmMarkdownErrorBody, createFarmMarkdownRouteModule, createFarmMarkdownRouteModuleFromFile, createFarmMarkdownSourceResponse, createMarkdownMetadata, farmRequestWantsMarkdown, isFarmMarkdownPageFile, loadFarmMdxComponents, normalizeFarmMarkdownRoutePath, parseMarkdownFrontmatter, titleFromMarkdown };
@@ -1,24 +1,30 @@
1
1
  import {
2
+ FARM_MARKDOWN_CONTENT_TYPE,
3
+ createFarmMarkdownErrorBody,
2
4
  createFarmMarkdownRouteModule,
3
5
  createFarmMarkdownRouteModuleFromFile,
4
6
  createFarmMarkdownSourceResponse,
5
7
  createMarkdownMetadata,
8
+ farmRequestWantsMarkdown,
6
9
  isFarmMarkdownPageFile,
7
10
  loadFarmMdxComponents,
8
11
  normalizeFarmMarkdownRoutePath,
9
12
  parseMarkdownFrontmatter,
10
13
  titleFromMarkdown
11
- } from "./chunk-VMCHLH3Y.mjs";
14
+ } from "./chunk-26BCDVJS.mjs";
12
15
  import {
13
16
  resolveMdxConfig
14
17
  } from "./chunk-A5VG2BDG.mjs";
15
18
  import "./chunk-EUYRVVXL.mjs";
16
19
  import "./chunk-CGILA3WO.mjs";
17
20
  export {
21
+ FARM_MARKDOWN_CONTENT_TYPE,
22
+ createFarmMarkdownErrorBody,
18
23
  createFarmMarkdownRouteModule,
19
24
  createFarmMarkdownRouteModuleFromFile,
20
25
  createFarmMarkdownSourceResponse,
21
26
  createMarkdownMetadata,
27
+ farmRequestWantsMarkdown,
22
28
  isFarmMarkdownPageFile,
23
29
  loadFarmMdxComponents,
24
30
  normalizeFarmMarkdownRoutePath,