@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/island-runtime.ts"],"sourcesContent":["\"use client\";\n\nimport type { FarmIslandStrategy } from \"../island\";\n\nexport interface ScheduleFarmIslandHydrationOptions<T> {\n container: Element;\n strategy?: FarmIslandStrategy | null;\n signal?: AbortSignal;\n hydrate: () => T | Promise<T>;\n}\n\ninterface FarmQueuedClick {\n target?: EventTarget | null;\n}\n\nfunction getPreHydrationClickQueue(): FarmQueuedClick[] | null {\n const windowWithQueue = window as typeof window & {\n __FARM_PREHYDRATION_CLICK_QUEUE__?: FarmQueuedClick[];\n };\n return Array.isArray(windowWithQueue.__FARM_PREHYDRATION_CLICK_QUEUE__)\n ? windowWithQueue.__FARM_PREHYDRATION_CLICK_QUEUE__\n : null;\n}\n\nfunction findQueuedTarget(container: Element): Element | null {\n const queue = getPreHydrationClickQueue();\n if (!queue) return null;\n for (const item of queue) {\n if (item?.target instanceof Element && container.contains(item.target)) return item.target;\n }\n return null;\n}\n\nfunction takeQueuedTargets(container: Element): Element[] {\n const queue = getPreHydrationClickQueue();\n if (!queue) return [];\n\n const targets: Element[] = [];\n for (let index = queue.length - 1; index >= 0; index--) {\n const target = queue[index]?.target;\n if (!(target instanceof Element) || !container.contains(target)) continue;\n queue.splice(index, 1);\n targets.unshift(target);\n }\n return targets;\n}\n\nfunction runWhenIdle(callback: () => void): () => void {\n const windowWithIdleCallback = window as typeof window & {\n requestIdleCallback?: (callback: () => void, options?: { timeout?: number }) => number;\n cancelIdleCallback?: (handle: number) => void;\n };\n\n if (typeof windowWithIdleCallback.requestIdleCallback === \"function\") {\n const handle = windowWithIdleCallback.requestIdleCallback(callback, { timeout: 2_000 });\n return () => windowWithIdleCallback.cancelIdleCallback?.(handle);\n }\n\n const handle = window.setTimeout(callback, 1);\n return () => window.clearTimeout(handle);\n}\n\nfunction replayClick(target: Element): void {\n const clickable = target as Element & { click?: () => void };\n if (typeof clickable.click === \"function\") {\n clickable.click();\n return;\n }\n target.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n}\n\nfunction finishIslandHydration(container: Element, activatingTarget?: Element | null): void {\n const targets = new Set<Element>();\n if (activatingTarget?.isConnected) targets.add(activatingTarget);\n for (const target of takeQueuedTargets(container)) if (target.isConnected) targets.add(target);\n\n if (!container.isConnected) return;\n container.setAttribute(\"data-farm-island-hydrated\", \"true\");\n\n for (const target of targets) {\n window.setTimeout(() => {\n if (\n container.getAttribute(\"data-farm-island-hydrated\") === \"true\" &&\n container.isConnected &&\n target.isConnected &&\n container.contains(target)\n ) {\n replayClick(target);\n }\n }, 0);\n }\n}\n\n/**\n * Defer importing and hydrating a server-rendered client boundary until its\n * configured trigger. The returned promise resolves with the hydration result.\n */\nexport function scheduleFarmIslandHydration<T>({\n container,\n strategy,\n signal,\n hydrate,\n}: ScheduleFarmIslandHydrationOptions<T>): Promise<T | undefined> {\n const resolvedStrategy = strategy ?? \"load\";\n if (signal?.aborted) return Promise.resolve(undefined);\n\n if (resolvedStrategy === \"load\") {\n return Promise.resolve()\n .then(() => (signal?.aborted ? undefined : hydrate()))\n .then((value) => {\n if (signal?.aborted) return undefined;\n finishIslandHydration(container);\n return value;\n });\n }\n\n return new Promise<T | undefined>((resolve, reject) => {\n let started = false;\n let cancelled = false;\n let queuedClickTarget: Element | null = null;\n const triggerCleanups = new Set<() => void>();\n let removeAbortListener: (() => void) | null = null;\n\n const cleanupTriggers = () => {\n for (const dispose of triggerCleanups) dispose();\n triggerCleanups.clear();\n };\n const cleanup = () => {\n cleanupTriggers();\n removeAbortListener?.();\n removeAbortListener = null;\n };\n\n const start = () => {\n if (started || cancelled) return;\n started = true;\n cleanupTriggers();\n Promise.resolve()\n .then(hydrate)\n .then(\n (value) => {\n cleanup();\n if (cancelled || signal?.aborted) return;\n const target = queuedClickTarget;\n queuedClickTarget = null;\n finishIslandHydration(container, target);\n resolve(value);\n },\n (error) => {\n cleanup();\n reject(error);\n },\n );\n };\n\n if (signal) {\n const abort = () => {\n cancelled = true;\n cleanup();\n takeQueuedTargets(container);\n resolve(undefined);\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n removeAbortListener = () => signal.removeEventListener(\"abort\", abort);\n }\n\n if (resolvedStrategy === \"idle\") {\n triggerCleanups.add(runWhenIdle(start));\n return;\n }\n\n if (resolvedStrategy === \"visible\") {\n if (typeof IntersectionObserver !== \"function\") {\n start();\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) start();\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(container);\n triggerCleanups.add(() => observer.disconnect());\n return;\n }\n\n const queueActivatingClick = (event: MouseEvent) => {\n const target =\n event.target instanceof Element\n ? event.target.closest(\n 'button,[role=\"button\"],input[type=\"button\"],input[type=\"submit\"],input[type=\"reset\"]',\n )\n : null;\n if (\n !target ||\n !container.contains(target) ||\n target.closest(\"a[href]\") ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n queuedClickTarget ??= target;\n event.preventDefault();\n event.stopImmediatePropagation();\n start();\n };\n const activateFromQueuedClick = (event: Event) => {\n const target = (event as CustomEvent<{ target?: EventTarget | null }>).detail?.target;\n if (!(target instanceof Element) || !container.contains(target)) return;\n\n queuedClickTarget ??= target;\n start();\n };\n\n document.addEventListener(\"click\", queueActivatingClick, true);\n triggerCleanups.add(() => document.removeEventListener(\"click\", queueActivatingClick, true));\n document.addEventListener(\"farm:island-interaction\", activateFromQueuedClick);\n triggerCleanups.add(() =>\n document.removeEventListener(\"farm:island-interaction\", activateFromQueuedClick),\n );\n\n const queuedTarget = findQueuedTarget(container);\n if (queuedTarget) {\n queuedClickTarget = queuedTarget;\n start();\n }\n });\n}\n"],"mappings":"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","names":["handle"]}
1
+ {"version":3,"sources":["../../src/client/island-runtime.ts"],"sourcesContent":["\"use client\";\n\nimport type { FarmIslandStrategy } from \"../island\";\n\nexport interface ScheduleFarmIslandHydrationOptions<T> {\n container: Element;\n strategy?: FarmIslandStrategy | null;\n signal?: AbortSignal;\n hydrate: () => T | Promise<T>;\n}\n\ninterface FarmQueuedClick {\n target?: EventTarget | null;\n}\n\nfunction getPreHydrationClickQueue(): FarmQueuedClick[] | null {\n const windowWithQueue = window as typeof window & {\n __FARM_PREHYDRATION_CLICK_QUEUE__?: FarmQueuedClick[];\n };\n return Array.isArray(windowWithQueue.__FARM_PREHYDRATION_CLICK_QUEUE__)\n ? windowWithQueue.__FARM_PREHYDRATION_CLICK_QUEUE__\n : null;\n}\n\nfunction findQueuedTarget(container: Element): Element | null {\n const queue = getPreHydrationClickQueue();\n if (!queue) return null;\n for (const item of queue) {\n if (item?.target instanceof Element && container.contains(item.target)) return item.target;\n }\n return null;\n}\n\nfunction takeQueuedTargets(container: Element): Element[] {\n const queue = getPreHydrationClickQueue();\n if (!queue) return [];\n\n const targets: Element[] = [];\n for (let index = queue.length - 1; index >= 0; index--) {\n const target = queue[index]?.target;\n if (!(target instanceof Element) || !container.contains(target)) continue;\n queue.splice(index, 1);\n targets.unshift(target);\n }\n return targets;\n}\n\nfunction runWhenIdle(callback: () => void): () => void {\n const windowWithIdleCallback = window as typeof window & {\n requestIdleCallback?: (callback: () => void, options?: { timeout?: number }) => number;\n cancelIdleCallback?: (handle: number) => void;\n };\n\n if (typeof windowWithIdleCallback.requestIdleCallback === \"function\") {\n const handle = windowWithIdleCallback.requestIdleCallback(callback, { timeout: 2_000 });\n return () => windowWithIdleCallback.cancelIdleCallback?.(handle);\n }\n\n const handle = window.setTimeout(callback, 1);\n return () => window.clearTimeout(handle);\n}\n\nfunction replayClick(target: Element): void {\n const clickable = target as Element & { click?: () => void };\n if (typeof clickable.click === \"function\") {\n clickable.click();\n return;\n }\n target.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n}\n\nfunction finishIslandHydration(container: Element, activatingTarget?: Element | null): void {\n const targets = new Set<Element>();\n if (activatingTarget?.isConnected) targets.add(activatingTarget);\n for (const target of takeQueuedTargets(container)) if (target.isConnected) targets.add(target);\n\n if (!container.isConnected) return;\n container.setAttribute(\"data-farm-island-hydrated\", \"true\");\n\n for (const target of targets) {\n window.setTimeout(() => {\n if (\n container.getAttribute(\"data-farm-island-hydrated\") === \"true\" &&\n container.isConnected &&\n target.isConnected &&\n container.contains(target)\n ) {\n replayClick(target);\n }\n }, 0);\n }\n}\n\n/**\n * Defer importing and hydrating a server-rendered client boundary until its\n * configured trigger. The returned promise resolves with the hydration result.\n */\nexport function scheduleFarmIslandHydration<T>({\n container,\n strategy,\n signal,\n hydrate,\n}: ScheduleFarmIslandHydrationOptions<T>): Promise<T | undefined> {\n const resolvedStrategy = strategy ?? \"load\";\n if (signal?.aborted) return Promise.resolve(undefined);\n\n if (resolvedStrategy === \"load\") {\n return Promise.resolve()\n .then(() => (signal?.aborted ? undefined : hydrate()))\n .then((value) => {\n if (signal?.aborted) return undefined;\n finishIslandHydration(container);\n return value;\n });\n }\n\n return new Promise<T | undefined>((resolve, reject) => {\n let started = false;\n let cancelled = false;\n let queuedClickTarget: Element | null = null;\n const triggerCleanups = new Set<() => void>();\n let removeAbortListener: (() => void) | null = null;\n\n const cleanupTriggers = () => {\n for (const dispose of triggerCleanups) dispose();\n triggerCleanups.clear();\n };\n const cleanup = () => {\n cleanupTriggers();\n removeAbortListener?.();\n removeAbortListener = null;\n };\n\n const start = () => {\n if (started || cancelled) return;\n started = true;\n cleanupTriggers();\n Promise.resolve()\n .then(hydrate)\n .then(\n (value) => {\n cleanup();\n if (cancelled || signal?.aborted) return;\n const target = queuedClickTarget;\n queuedClickTarget = null;\n finishIslandHydration(container, target);\n resolve(value);\n },\n (error) => {\n cleanup();\n reject(error);\n },\n );\n };\n\n if (signal) {\n const abort = () => {\n cancelled = true;\n cleanup();\n takeQueuedTargets(container);\n resolve(undefined);\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n removeAbortListener = () => signal.removeEventListener(\"abort\", abort);\n }\n\n if (resolvedStrategy === \"idle\") {\n triggerCleanups.add(runWhenIdle(start));\n return;\n }\n\n if (resolvedStrategy === \"visible\") {\n if (typeof IntersectionObserver !== \"function\") {\n start();\n return;\n }\n\n // Isolated boundary markers render with display:contents, so the\n // container itself has no box and can never intersect. Observe its\n // element children instead; with nothing observable, start now.\n const targets =\n container.getClientRects().length > 0 ? [container] : Array.from(container.children);\n if (targets.length === 0) {\n start();\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) start();\n },\n { rootMargin: \"200px\" },\n );\n for (const target of targets) observer.observe(target);\n triggerCleanups.add(() => observer.disconnect());\n return;\n }\n\n const queueActivatingClick = (event: MouseEvent) => {\n const target =\n event.target instanceof Element\n ? event.target.closest(\n 'button,[role=\"button\"],input[type=\"button\"],input[type=\"submit\"],input[type=\"reset\"]',\n )\n : null;\n if (\n !target ||\n !container.contains(target) ||\n target.closest(\"a[href]\") ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n queuedClickTarget ??= target;\n event.preventDefault();\n event.stopImmediatePropagation();\n start();\n };\n const activateFromQueuedClick = (event: Event) => {\n const target = (event as CustomEvent<{ target?: EventTarget | null }>).detail?.target;\n if (!(target instanceof Element) || !container.contains(target)) return;\n\n queuedClickTarget ??= target;\n start();\n };\n\n document.addEventListener(\"click\", queueActivatingClick, true);\n triggerCleanups.add(() => document.removeEventListener(\"click\", queueActivatingClick, true));\n document.addEventListener(\"farm:island-interaction\", activateFromQueuedClick);\n triggerCleanups.add(() =>\n document.removeEventListener(\"farm:island-interaction\", activateFromQueuedClick),\n );\n\n const queuedTarget = findQueuedTarget(container);\n if (queuedTarget) {\n queuedClickTarget = queuedTarget;\n start();\n }\n });\n}\n"],"mappings":"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","names":["handle"]}
@@ -392,9 +392,13 @@ function getStorage(namespace) {
392
392
  const namespaced = (0, import_unstorage.prefixStorage)(globalStorage, base);
393
393
  return {
394
394
  ...namespaced,
395
- async clear() {
396
- const keys = await namespaced.getKeys();
397
- await Promise.all(keys.map((key) => namespaced.removeItem(key)));
395
+ // Scope the wipe to the namespace instead of the whole storage, and keep
396
+ // the caller's base so `clear("sessions")` cannot take unrelated keys with
397
+ // it. Dropping the argument silently widens a targeted clear into a
398
+ // namespace-wide delete.
399
+ async clear(base2, opts) {
400
+ const keys = await namespaced.getKeys(base2);
401
+ await Promise.all(keys.map((key) => namespaced.removeItem(key, opts)));
398
402
  }
399
403
  };
400
404
  }
@@ -888,6 +892,41 @@ function validateConfigRouteSource(source, field = "Config route source") {
888
892
  }
889
893
  __name(validateConfigRouteSource, "validateConfigRouteSource");
890
894
 
895
+ // src/request-origin.ts
896
+ function normalizeAllowedOriginPattern(value, label) {
897
+ const pattern = value.trim().toLowerCase();
898
+ if (!pattern) {
899
+ throw new TypeError(`${label} cannot contain empty values`);
900
+ }
901
+ if (pattern.includes("*")) {
902
+ if (!/^(?:https?:\/\/)?\*\.[a-z0-9.-]+(?::\d+)?$/.test(pattern)) {
903
+ throw new TypeError(`Invalid ${label} pattern: ${JSON.stringify(value)}`);
904
+ }
905
+ return pattern;
906
+ }
907
+ if (pattern.includes("://")) {
908
+ let parsed;
909
+ try {
910
+ parsed = new URL(pattern);
911
+ } catch {
912
+ throw new TypeError(`Invalid ${label} value: ${JSON.stringify(value)}`);
913
+ }
914
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
915
+ throw new TypeError(`${label} must contain origins without paths: ${JSON.stringify(value)}`);
916
+ }
917
+ return parsed.origin;
918
+ }
919
+ if (/[/@?#]/.test(pattern)) {
920
+ throw new TypeError(`${label} must contain origins or hosts: ${JSON.stringify(value)}`);
921
+ }
922
+ try {
923
+ return new URL(`http://${pattern}`).host;
924
+ } catch {
925
+ throw new TypeError(`Invalid ${label} value: ${JSON.stringify(value)}`);
926
+ }
927
+ }
928
+ __name(normalizeAllowedOriginPattern, "normalizeAllowedOriginPattern");
929
+
891
930
  // src/integration-api.ts
892
931
  function defineIntegrationAPIOperation(operation) {
893
932
  return {
@@ -3217,7 +3256,8 @@ function resolveWorkflowsConfig(workflows) {
3217
3256
  dirs,
3218
3257
  route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),
3219
3258
  secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,
3220
- secret: options.secret
3259
+ secret: options.secret,
3260
+ allowUnsecured: options.allowUnsecured === true
3221
3261
  };
3222
3262
  }
3223
3263
  __name(resolveWorkflowsConfig, "resolveWorkflowsConfig");
@@ -3731,10 +3771,13 @@ function subscribeFarmCacheTask(listener) {
3731
3771
  __name(subscribeFarmCacheTask, "subscribeFarmCacheTask");
3732
3772
 
3733
3773
  // src/server-action-security.ts
3774
+ var SERVER_ACTION_ALLOWED_ORIGINS_LABEL = "serverActions.allowedOrigins";
3734
3775
  var DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT = 1e6;
3735
3776
  var SERVER_ACTION_STORAGE_KEY = /* @__PURE__ */ Symbol.for("farm.serverActionStorage");
3736
3777
  function resolveServerActionsConfig(config) {
3737
- const allowedOrigins = (config?.allowedOrigins ?? []).map(normalizeAllowedOriginPattern);
3778
+ const allowedOrigins = (config?.allowedOrigins ?? []).map(
3779
+ (value) => normalizeAllowedOriginPattern(value, SERVER_ACTION_ALLOWED_ORIGINS_LABEL)
3780
+ );
3738
3781
  const bodySizeLimit = parseBodySizeLimit(
3739
3782
  config?.bodySizeLimit ?? DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT,
3740
3783
  "serverActions.bodySizeLimit"
@@ -3763,43 +3806,6 @@ function getServerActionStorage() {
3763
3806
  return globalState2[SERVER_ACTION_STORAGE_KEY];
3764
3807
  }
3765
3808
  __name(getServerActionStorage, "getServerActionStorage");
3766
- function normalizeAllowedOriginPattern(value) {
3767
- const pattern = value.trim().toLowerCase();
3768
- if (!pattern) {
3769
- throw new TypeError("serverActions.allowedOrigins cannot contain empty values");
3770
- }
3771
- if (pattern.includes("*")) {
3772
- if (!/^(?:https?:\/\/)?\*\.[a-z0-9.-]+(?::\d+)?$/.test(pattern)) {
3773
- throw new TypeError(`Invalid serverActions.allowedOrigins pattern: ${JSON.stringify(value)}`);
3774
- }
3775
- return pattern;
3776
- }
3777
- if (pattern.includes("://")) {
3778
- let parsed;
3779
- try {
3780
- parsed = new URL(pattern);
3781
- } catch {
3782
- throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);
3783
- }
3784
- if (parsed.protocol !== "http:" && parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
3785
- throw new TypeError(
3786
- `serverActions.allowedOrigins must contain origins without paths: ${JSON.stringify(value)}`
3787
- );
3788
- }
3789
- return parsed.origin;
3790
- }
3791
- if (/[/@?#]/.test(pattern)) {
3792
- throw new TypeError(
3793
- `serverActions.allowedOrigins must contain origins or hosts: ${JSON.stringify(value)}`
3794
- );
3795
- }
3796
- try {
3797
- return new URL(`http://${pattern}`).host;
3798
- } catch {
3799
- throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);
3800
- }
3801
- }
3802
- __name(normalizeAllowedOriginPattern, "normalizeAllowedOriginPattern");
3803
3809
 
3804
3810
  // src/layers.ts
3805
3811
  var import_node_fs = require("fs");
@@ -4912,6 +4918,14 @@ function normalizeCookiePath2(basePath) {
4912
4918
  }
4913
4919
  __name(normalizeCookiePath2, "normalizeCookiePath");
4914
4920
 
4921
+ // src/agent-config.ts
4922
+ function resolveFarmAgentConfig(input) {
4923
+ const jsonLd = input?.jsonLd;
4924
+ if (!jsonLd) return { jsonLd: false };
4925
+ return { jsonLd: jsonLd === true ? {} : jsonLd };
4926
+ }
4927
+ __name(resolveFarmAgentConfig, "resolveFarmAgentConfig");
4928
+
4915
4929
  // src/renderer.ts
4916
4930
  var import_node_module3 = require("module");
4917
4931
  var import_node_path5 = __toESM(require("path"));
@@ -5593,6 +5607,7 @@ async function resolveConfig(userConfig, mode) {
5593
5607
  const openapi = {
5594
5608
  enabled: false,
5595
5609
  route: "/docs/reference",
5610
+ specRoute: "/openapi.json",
5596
5611
  title: "API Documentation",
5597
5612
  description: "Auto-generated API documentation",
5598
5613
  version: "1.0.0",
@@ -5600,6 +5615,7 @@ async function resolveConfig(userConfig, mode) {
5600
5615
  ...userConfig.openapi
5601
5616
  };
5602
5617
  if (openapi.route !== void 0) validateConfigRouteSource(openapi.route, "openapi.route");
5618
+ if (openapi.specRoute) validateConfigRouteSource(openapi.specRoute, "openapi.specRoute");
5603
5619
  const resolved = {
5604
5620
  [FARM_RESOLVED_CUSTOM_CONTEXT]: typeof userConfig.context === "function",
5605
5621
  root,
@@ -5632,6 +5648,7 @@ async function resolveConfig(userConfig, mode) {
5632
5648
  ppr: false,
5633
5649
  ...userConfig.experimental
5634
5650
  },
5651
+ agent: resolveFarmAgentConfig(userConfig.agent),
5635
5652
  plugins: [...resolveIntegrationPlugins(integrations), ...userConfig.plugins || []],
5636
5653
  integrations,
5637
5654
  trailingSlash: userConfig.trailingSlash ?? false,