@farm.js/core 0.1.62 → 0.1.64

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 (194) hide show
  1. package/dist/{agent-mcp-handler-OV4WRFBL.cjs → agent-mcp-handler-OXT73ZBY.cjs} +5 -5
  2. package/dist/{agent-mcp-handler-7QMX2LUY.mjs → agent-mcp-handler-QLFDDTYN.mjs} +4 -4
  3. package/dist/{agent-mcp.d-BKZ3UNbt.d.mts → agent-mcp.d-CO_ABmNK.d.mts} +1 -1
  4. package/dist/{agent-mcp.d-C1zr_nGS.d.ts → agent-mcp.d-QD2WZ9BS.d.ts} +1 -1
  5. package/dist/agent-runtime.d.mts +1 -1
  6. package/dist/agent-runtime.d.ts +1 -1
  7. package/dist/analyzer-ODLF2Z6O.cjs +16 -0
  8. package/dist/{analyzer-YESYU3GK.mjs → analyzer-Q3QXC6PD.mjs} +3 -2
  9. package/dist/api/route-manager.d.mts +3 -3
  10. package/dist/api/route-manager.d.ts +3 -3
  11. package/dist/api/runtime.d.mts +2 -2
  12. package/dist/api/runtime.d.ts +2 -2
  13. package/dist/api.d.mts +3 -3
  14. package/dist/api.d.ts +3 -3
  15. package/dist/{app-manifest.d-ntch_bvA.d.ts → app-manifest.d-BpKxiU_E.d.mts} +9 -1
  16. package/dist/{app-manifest.d-BpvhfKRH.d.mts → app-manifest.d-DDmNkYQQ.d.ts} +9 -1
  17. package/dist/app-markdown.cjs +4 -4
  18. package/dist/app-markdown.d.mts +2 -2
  19. package/dist/app-markdown.d.ts +2 -2
  20. package/dist/app-markdown.mjs +3 -3
  21. package/dist/{app.d-CysWA_8v.d.mts → app.d-kuoVWhWM.d.mts} +4 -4
  22. package/dist/{app.d-AE8_v3Db.d.ts → app.d-x68Cwr0_.d.ts} +4 -4
  23. package/dist/{chunk-LT4VAF5Z.cjs → chunk-2C5L5RPM.cjs} +7 -6
  24. package/dist/{chunk-RMUD75WT.cjs → chunk-3EBHJET2.cjs} +355 -270
  25. package/dist/{chunk-RZNCMRD3.mjs → chunk-6NHSGVVA.mjs} +1 -1
  26. package/dist/{chunk-LVWGURLD.mjs → chunk-6NNYPY5W.mjs} +327 -13
  27. package/dist/{chunk-PRFNLQSP.cjs → chunk-7XGWBPQQ.cjs} +4 -4
  28. package/dist/{chunk-SG57PX7K.cjs → chunk-BTVDYS4B.cjs} +7 -2
  29. package/dist/{chunk-545WJ5UG.cjs → chunk-DUSHDZQL.cjs} +11 -11
  30. package/dist/{chunk-GVOMPU3Y.cjs → chunk-EL4364S2.cjs} +209 -32
  31. package/dist/{chunk-GGNJAGGE.cjs → chunk-FAP7CX7C.cjs} +1056 -529
  32. package/dist/{chunk-T46NNU4D.mjs → chunk-FH45OB37.mjs} +2 -2
  33. package/dist/{chunk-55U5QIXQ.mjs → chunk-FIR62CR3.mjs} +1 -1
  34. package/dist/{chunk-MEQN6DDA.cjs → chunk-FJWN7RV4.cjs} +5 -5
  35. package/dist/chunk-IOEXXZK3.mjs +88 -0
  36. package/dist/{chunk-EXXFSZOC.cjs → chunk-JCPSA4X5.cjs} +135 -134
  37. package/dist/{chunk-YSXTNSXS.mjs → chunk-K7OZAVOI.mjs} +7 -6
  38. package/dist/{chunk-KVW2M6PI.mjs → chunk-KL7SHLQB.mjs} +1 -1
  39. package/dist/{chunk-NT3QDN2E.mjs → chunk-LQDLEWPO.mjs} +1 -1
  40. package/dist/{chunk-UZZ6IEQP.mjs → chunk-MESQF2JC.mjs} +2 -2
  41. package/dist/{chunk-WKJQ2FJA.cjs → chunk-MG356ROI.cjs} +5 -5
  42. package/dist/{chunk-AJB3DHN6.cjs → chunk-N3Z3PLHC.cjs} +2 -2
  43. package/dist/{chunk-2CNKQC3G.mjs → chunk-NNLFW3P4.mjs} +2 -2
  44. package/dist/{chunk-XX32BOMM.cjs → chunk-NXFA7G3Y.cjs} +52 -26
  45. package/dist/{chunk-SM25ZC4S.cjs → chunk-O2XFIPNL.cjs} +1 -1
  46. package/dist/{chunk-VWW4Q3BJ.mjs → chunk-O4FWNLQK.mjs} +4 -4
  47. package/dist/{chunk-DZPR2W6U.cjs → chunk-O6L3YYPM.cjs} +5 -5
  48. package/dist/{chunk-UWI3SJAK.cjs → chunk-O7IEMY55.cjs} +3 -3
  49. package/dist/{chunk-6BJJYOFL.cjs → chunk-OLIGNTWU.cjs} +7 -7
  50. package/dist/{chunk-OUWRNHTV.mjs → chunk-OYF23QLG.mjs} +17 -16
  51. package/dist/{chunk-IQIKPKFP.mjs → chunk-RAH5MT53.mjs} +110 -25
  52. package/dist/{chunk-E72UD6ME.mjs → chunk-RVGSVQWT.mjs} +1 -1
  53. package/dist/{chunk-ZVIEFTUA.cjs → chunk-S25BQIFW.cjs} +16 -16
  54. package/dist/chunk-S7ZW72JH.cjs +254 -0
  55. package/dist/{chunk-VM7X5CKC.mjs → chunk-SLYDIHLW.mjs} +31 -5
  56. package/dist/chunk-SNFTMSHX.mjs +254 -0
  57. package/dist/{chunk-2WZTGPK6.mjs → chunk-SQ5O7I3L.mjs} +7 -2
  58. package/dist/{chunk-PCXIJKPM.mjs → chunk-TNBJ4LZG.mjs} +2 -2
  59. package/dist/{chunk-O27PLNQZ.cjs → chunk-UJ3R2AH2.cjs} +4 -4
  60. package/dist/{chunk-T4TBK5NY.mjs → chunk-VQ4NWOWO.mjs} +2 -2
  61. package/dist/{chunk-ZZ2QKCKW.mjs → chunk-WAY6LOQH.mjs} +1 -1
  62. package/dist/chunk-WBTHHTBO.cjs +88 -0
  63. package/dist/{chunk-ZBUAOGMY.mjs → chunk-WFNAOWH4.mjs} +1 -1
  64. package/dist/{chunk-IWRLV46X.cjs → chunk-WMTBBQHY.cjs} +4 -4
  65. package/dist/{chunk-2JYBLE63.mjs → chunk-WNYRYI4D.mjs} +770 -243
  66. package/dist/{chunk-CI4UNQHO.cjs → chunk-XBSKPLHF.cjs} +2 -2
  67. package/dist/{chunk-IOF4KXMP.mjs → chunk-XVWSDSUM.mjs} +201 -24
  68. package/dist/{chunk-JEJQGZI7.cjs → chunk-XZLZ6YPP.cjs} +346 -32
  69. package/dist/{chunk-QAS7KE7J.cjs → chunk-Y5TOT5F6.cjs} +5 -5
  70. package/dist/{chunk-DPE53XWL.mjs → chunk-ZEXE4TGY.mjs} +1 -1
  71. package/dist/{client-component.d-BoqC2MLC.d.mts → client-component.d-D74pqdea.d.mts} +14 -3
  72. package/dist/{client-component.d-Bgt3x5Fu.d.ts → client-component.d-D8VcypQA.d.ts} +14 -3
  73. package/dist/{client-plugins.d-BcqIy4au.d.ts → client-plugins.d-CXElzotB.d.ts} +18 -2
  74. package/dist/{client-plugins.d-CWyYBxXf.d.mts → client-plugins.d-D4-6hNx7.d.mts} +18 -2
  75. package/dist/client-plugins.d.mts +1 -1
  76. package/dist/client-plugins.d.ts +1 -1
  77. package/dist/client.d.mts +6 -6
  78. package/dist/client.d.ts +6 -6
  79. package/dist/config.d.mts +1 -1
  80. package/dist/config.d.ts +1 -1
  81. package/dist/desktop.d.mts +2 -2
  82. package/dist/desktop.d.ts +2 -2
  83. package/dist/{devtools-NUVXYG7I.mjs → devtools-MX3FE733.mjs} +5 -5
  84. package/dist/{devtools-SVRSGPNC.cjs → devtools-WET5NAKO.cjs} +6 -6
  85. package/dist/docs.cjs +8 -8
  86. package/dist/docs.d.mts +2 -2
  87. package/dist/docs.d.ts +2 -2
  88. package/dist/docs.mjs +7 -7
  89. package/dist/index.cjs +21 -20
  90. package/dist/{index.d-nAncqTXz.d.ts → index.d-A_x10zGS.d.ts} +1 -1
  91. package/dist/{index.d-BDaiu2i5.d.mts → index.d-SSgYDv4D.d.mts} +1 -1
  92. package/dist/index.d.mts +16 -16
  93. package/dist/index.d.ts +16 -16
  94. package/dist/index.mjs +20 -19
  95. package/dist/integrations.d.mts +1 -1
  96. package/dist/integrations.d.ts +1 -1
  97. package/dist/internal/app-markdown-runtime.cjs +3 -3
  98. package/dist/internal/app-markdown-runtime.d.mts +2 -2
  99. package/dist/internal/app-markdown-runtime.d.ts +2 -2
  100. package/dist/internal/app-markdown-runtime.mjs +2 -2
  101. package/dist/internal/build-runtime.cjs +22 -21
  102. package/dist/internal/build-runtime.d.mts +3 -3
  103. package/dist/internal/build-runtime.d.ts +3 -3
  104. package/dist/internal/build-runtime.mjs +21 -20
  105. package/dist/internal/cli-runtime.cjs +7 -7
  106. package/dist/internal/cli-runtime.mjs +6 -6
  107. package/dist/internal/client-error-overlay.cjs +4 -4
  108. package/dist/internal/client-error-overlay.mjs +1 -1
  109. package/dist/internal/client-runtime.d.mts +4 -4
  110. package/dist/internal/client-runtime.d.ts +4 -4
  111. package/dist/internal/compression-runtime.d.mts +1 -1
  112. package/dist/internal/compression-runtime.d.ts +1 -1
  113. package/dist/internal/config-runtime.cjs +7 -7
  114. package/dist/internal/config-runtime.d.mts +4 -4
  115. package/dist/internal/config-runtime.d.ts +4 -4
  116. package/dist/internal/config-runtime.mjs +6 -6
  117. package/dist/internal/infra-analytics-runtime.cjs +11 -9
  118. package/dist/internal/infra-analytics-runtime.mjs +9 -7
  119. package/dist/internal/native-server-fns.cjs +5 -4
  120. package/dist/internal/native-server-fns.mjs +4 -3
  121. package/dist/internal/product-telemetry-runtime.cjs +17 -211
  122. package/dist/internal/product-telemetry-runtime.mjs +10 -204
  123. package/dist/internal/production-runtime.cjs +13 -12
  124. package/dist/internal/production-runtime.d.mts +13 -12
  125. package/dist/internal/production-runtime.d.ts +13 -12
  126. package/dist/internal/production-runtime.mjs +14 -13
  127. package/dist/internal/react-cache.cjs +21 -1
  128. package/dist/internal/react-cache.d.mts +8 -1
  129. package/dist/internal/react-cache.d.ts +8 -1
  130. package/dist/internal/react-cache.mjs +21 -1
  131. package/dist/markdown.cjs +2 -2
  132. package/dist/markdown.d.mts +1 -1
  133. package/dist/markdown.d.ts +1 -1
  134. package/dist/markdown.mjs +1 -1
  135. package/dist/middleware.d.mts +3 -3
  136. package/dist/middleware.d.ts +3 -3
  137. package/dist/mobile.d.mts +2 -2
  138. package/dist/mobile.d.ts +2 -2
  139. package/dist/{native-tree-AS5L3ID3.mjs → native-tree-BPEE2LAL.mjs} +2 -2
  140. package/dist/{native-tree-Z2WYUJEV.cjs → native-tree-WOX3JMBG.cjs} +3 -3
  141. package/dist/{navigation-delegate.d-CSCm8ZxL.d.mts → navigation-delegate.d-DQVYKoaZ.d.mts} +1 -1
  142. package/dist/{navigation-delegate.d-BbUHRXxG.d.ts → navigation-delegate.d-GghbHJuK.d.ts} +1 -1
  143. package/dist/navigation.d.mts +4 -4
  144. package/dist/navigation.d.ts +4 -4
  145. package/dist/plugin.cjs +14 -14
  146. package/dist/plugin.d.mts +3 -3
  147. package/dist/plugin.d.ts +3 -3
  148. package/dist/plugin.mjs +13 -13
  149. package/dist/{production-runtime.d-DgT24A0f.d.ts → production-runtime.d-Bzns3NW9.d.ts} +1 -1
  150. package/dist/{production-runtime.d-CcQiDko5.d.mts → production-runtime.d-DiFa5vHW.d.mts} +1 -1
  151. package/dist/{render-plan.d-CyrX6MDs.d.ts → render-plan.d-CL_Ikfg_.d.ts} +1 -1
  152. package/dist/{render-plan.d-BH9WF-JZ.d.mts → render-plan.d-CcF0MeCf.d.mts} +1 -1
  153. package/dist/renderer-client.d.mts +4 -4
  154. package/dist/renderer-client.d.ts +4 -4
  155. package/dist/{request.d-BB8M8bcD.d.ts → request.d-B1RnTLri.d.ts} +1 -1
  156. package/dist/{request.d-CUrPnCW7.d.mts → request.d-DarDOCk9.d.mts} +1 -1
  157. package/dist/request.d.mts +2 -2
  158. package/dist/request.d.ts +2 -2
  159. package/dist/{route-rendering.d-DYqZMIf4.d.ts → route-rendering.d-BTUYCIj4.d.ts} +1 -1
  160. package/dist/{route-rendering.d-CYxlzaFm.d.mts → route-rendering.d-D_2Ual0-.d.mts} +1 -1
  161. package/dist/{router.d-DaKo507j.d.ts → router.d-CMANF6da.d.ts} +1 -1
  162. package/dist/{router.d-7o24CD8u.d.mts → router.d-Cuv1jntg.d.mts} +1 -1
  163. package/dist/{routes.d-BknKQcTu.d.ts → routes.d-B6yFe6jm.d.ts} +1 -1
  164. package/dist/{routes.d-D1IrO9KK.d.mts → routes.d-c2HKfrfL.d.mts} +1 -1
  165. package/dist/routes.d.mts +1 -1
  166. package/dist/routes.d.ts +1 -1
  167. package/dist/{rsc-pipeline-RFLHDAKD.mjs → rsc-pipeline-3LNVP2OO.mjs} +6 -6
  168. package/dist/{rsc-pipeline-OF2I7PCX.cjs → rsc-pipeline-G5WELVW3.cjs} +7 -7
  169. package/dist/{runtime-LBTK62AD.cjs → runtime-DMEULPE7.cjs} +22 -11
  170. package/dist/{runtime-M6UJCSLA.mjs → runtime-HQJ2LLQL.mjs} +20 -9
  171. package/dist/{runtime.d-CN73a-IL.d.ts → runtime.d-C3RQUj6_.d.ts} +1 -1
  172. package/dist/{runtime.d-CcNuzhX6.d.mts → runtime.d-wvh4ngU0.d.mts} +1 -1
  173. package/dist/server-plugins.d.mts +2 -2
  174. package/dist/server-plugins.d.ts +2 -2
  175. package/dist/server.cjs +31 -31
  176. package/dist/server.d.mts +9 -9
  177. package/dist/server.d.ts +9 -9
  178. package/dist/server.mjs +16 -16
  179. package/dist/{spa-router.d-CNi77LZm.d.mts → spa-router.d-WU_qS5gJ.d.mts} +2 -2
  180. package/dist/{spa-router.d-Cvgf5QP4.d.ts → spa-router.d-m8H_Kl_B.d.ts} +2 -2
  181. package/dist/testing.d.mts +1 -1
  182. package/dist/testing.d.ts +1 -1
  183. package/dist/{utils.d-C3H-14_Y.d.ts → utils.d-C9dQD5Zg.d.ts} +1 -1
  184. package/dist/{utils.d-D8VfzZYn.d.mts → utils.d-W9IiEqmW.d.mts} +1 -1
  185. package/dist/version.cjs +2 -2
  186. package/dist/version.mjs +1 -1
  187. package/dist/vite.cjs +18 -14
  188. package/dist/vite.d.mts +23 -5
  189. package/dist/vite.d.ts +23 -5
  190. package/dist/vite.mjs +17 -13
  191. package/package.json +1 -1
  192. package/dist/analyzer-2AHWJJR7.cjs +0 -15
  193. package/dist/chunk-CSLUBKGG.mjs +0 -44
  194. package/dist/chunk-SGBNF56S.cjs +0 -44
@@ -16,14 +16,18 @@ import {
16
16
  createFarmClientOptimizeDepsEntries,
17
17
  createFarmSourceAlias,
18
18
  createFarmThemeCssPlugin,
19
+ ensureFarmPackageClientReference,
19
20
  farmFontImportsPlugin,
21
+ farmRelativeImportFiles,
20
22
  generateClientCachePersistenceCode,
21
23
  generateFarmClientPluginEntryCode,
22
24
  generateFarmIntegrationProviderClientCode,
23
25
  getClientModuleMetadata,
26
+ getFarmClientReachableModules,
24
27
  getIslandStrategyExport,
25
28
  hasUseClientDirective,
26
29
  inferFarmIslandStrategy,
30
+ invalidateFarmClientReachableModules,
27
31
  isFarmDocsClientConfigModule,
28
32
  isFarmPackageClientBoundary,
29
33
  isIsolatableClientBoundarySource,
@@ -36,8 +40,9 @@ import {
36
40
  resolveFarmRouteRootStrategy,
37
41
  resolveModuleSourcePath,
38
42
  rewriteFarmPackageClientImports,
43
+ rewriteFarmReactServerImports,
39
44
  stripUseClientDirective
40
- } from "./chunk-2JYBLE63.mjs";
45
+ } from "./chunk-WNYRYI4D.mjs";
41
46
  import {
42
47
  loadTailwindVitePlugin
43
48
  } from "./chunk-OM7WILES.mjs";
@@ -61,13 +66,10 @@ import {
61
66
  parseFarmLayoutChainHeader,
62
67
  renderFarmLocaleAlternateLinks,
63
68
  stripRouteGroups
64
- } from "./chunk-PCXIJKPM.mjs";
69
+ } from "./chunk-TNBJ4LZG.mjs";
65
70
  import {
66
71
  FARM_NATIVE_TREE_CONTENT_TYPE
67
72
  } from "./chunk-LLZSYFOM.mjs";
68
- import {
69
- isFarmPreviewDeploymentEnvironment
70
- } from "./chunk-CSLUBKGG.mjs";
71
73
  import {
72
74
  FARM_API_CATALOG_PATH,
73
75
  createFarmAiCatalogResponse,
@@ -82,10 +84,13 @@ import {
82
84
  resolveFarmMCPRouteLabel,
83
85
  resolveFarmMarkdownRouteLabel,
84
86
  setFarmRouteLabel
85
- } from "./chunk-VM7X5CKC.mjs";
87
+ } from "./chunk-SLYDIHLW.mjs";
86
88
  import {
87
89
  FARM_DEFAULT_MCP_PATH
88
- } from "./chunk-UZZ6IEQP.mjs";
90
+ } from "./chunk-MESQF2JC.mjs";
91
+ import {
92
+ isFarmPreviewDeploymentEnvironment
93
+ } from "./chunk-SNFTMSHX.mjs";
89
94
  import {
90
95
  createFarmServerFnBoundaryModule,
91
96
  isFarmServerFnBoundaryId,
@@ -132,10 +137,10 @@ import {
132
137
  FARM_PREVIEW_ROBOTS_TAG,
133
138
  resolveFarmAgentCrawlers,
134
139
  resolveFarmAgentSitemap
135
- } from "./chunk-T4TBK5NY.mjs";
140
+ } from "./chunk-VQ4NWOWO.mjs";
136
141
  import {
137
142
  resolveFarmLlmsTxtConfig
138
- } from "./chunk-KVW2M6PI.mjs";
143
+ } from "./chunk-KL7SHLQB.mjs";
139
144
  import {
140
145
  getFarmAppDirectories,
141
146
  getFarmLayerAliases,
@@ -152,7 +157,7 @@ import {
152
157
  createFarmMarkdownSourceResponse,
153
158
  isFarmMarkdownPageFile,
154
159
  normalizeFarmMarkdownRoutePath
155
- } from "./chunk-E72UD6ME.mjs";
160
+ } from "./chunk-RVGSVQWT.mjs";
156
161
  import {
157
162
  FARM_MARKDOWN_CONTENT_TYPE,
158
163
  createFarmMarkdownErrorBody,
@@ -161,7 +166,7 @@ import {
161
166
  getFarmMarkdownAlternatePath,
162
167
  getFarmMarkdownMirrorPath,
163
168
  resolveMarkdownMirrorTarget
164
- } from "./chunk-YSXTNSXS.mjs";
169
+ } from "./chunk-K7OZAVOI.mjs";
165
170
  import {
166
171
  resolveFarmRouteContext,
167
172
  withFarmRouteContext
@@ -252,7 +257,7 @@ import {
252
257
  } from "./chunk-QDWMCFTH.mjs";
253
258
  import {
254
259
  FARM_VERSION
255
- } from "./chunk-NT3QDN2E.mjs";
260
+ } from "./chunk-LQDLEWPO.mjs";
256
261
  import {
257
262
  DEFAULT_FARM_API_BASE_PATH
258
263
  } from "./chunk-W6QLRQ3V.mjs";
@@ -692,6 +697,11 @@ import { rewriteFormStatusImports } from "@farm.js/islx/compiler";
692
697
  import path5 from "path";
693
698
  import { parseAst } from "rolldown/parseAst";
694
699
  var FARM_REACT_CACHE_MODULE = "@farm.js/core/internal/react-cache";
700
+ var REACT_CACHE_LOCAL = "__farm_react_cache__";
701
+ var REACT_CACHE_APIS = {
702
+ cache: REACT_CACHE_LOCAL,
703
+ cacheSignal: "__farm_react_cache_signal__"
704
+ };
695
705
  function rewriteFarmReactCacheImport(code, file) {
696
706
  if (!code.includes("cache") || !code.includes("react")) return null;
697
707
  const extension = path5.extname(file).slice(1);
@@ -702,15 +712,25 @@ function rewriteFarmReactCacheImport(code, file) {
702
712
  } catch {
703
713
  return null;
704
714
  }
705
- let output = code;
715
+ const edits = [];
706
716
  const declarations = (program.body ?? []).filter(
707
717
  (node) => node.type === "ImportDeclaration" && node.source?.value === "react" && node.importKind !== "type"
708
718
  );
709
- let changed = false;
710
- for (const node of [...declarations].sort((left, right) => right.start - left.start)) {
719
+ const namespaces = /* @__PURE__ */ new Set();
720
+ let memberImportAt = null;
721
+ for (const node of declarations) {
711
722
  const specifiers = node.specifiers ?? [];
723
+ for (const specifier of specifiers) {
724
+ if (specifier.type === "ImportDefaultSpecifier" || specifier.type === "ImportNamespaceSpecifier") {
725
+ namespaces.add(specifier.local.name);
726
+ memberImportAt ?? (memberImportAt = node.end);
727
+ }
728
+ }
712
729
  const caches = specifiers.filter(
713
- (specifier) => specifier.type === "ImportSpecifier" && specifier.importKind !== "type" && (specifier.imported?.name ?? specifier.imported?.value) === "cache"
730
+ (specifier) => specifier.type === "ImportSpecifier" && specifier.importKind !== "type" && Object.prototype.hasOwnProperty.call(
731
+ REACT_CACHE_APIS,
732
+ specifier.imported?.name ?? specifier.imported?.value ?? ""
733
+ )
714
734
  );
715
735
  if (caches.length === 0) continue;
716
736
  const others = specifiers.filter((specifier) => !caches.includes(specifier));
@@ -723,12 +743,48 @@ function rewriteFarmReactCacheImport(code, file) {
723
743
  ].join(", ");
724
744
  const lines = [
725
745
  ...clause ? [`import ${clause} from "react";`] : [],
726
- `import { ${caches.map((specifier) => `cache as ${specifier.local.name}`).join(", ")} } from ${JSON.stringify(FARM_REACT_CACHE_MODULE)};`
746
+ `import { ${caches.map((specifier) => `${specifier.imported?.name ?? specifier.imported?.value} as ${specifier.local.name}`).join(", ")} } from ${JSON.stringify(FARM_REACT_CACHE_MODULE)};`
727
747
  ];
728
- output = output.slice(0, node.start) + lines.join("\n") + output.slice(node.end);
729
- changed = true;
748
+ edits.push({ start: node.start, end: node.end, text: lines.join("\n") });
749
+ }
750
+ if (namespaces.size > 0 && memberImportAt !== null) {
751
+ const used = /* @__PURE__ */ new Set();
752
+ const visit = (node) => {
753
+ if (!node || typeof node !== "object") return;
754
+ if (Array.isArray(node)) {
755
+ for (const child of node) visit(child);
756
+ return;
757
+ }
758
+ const current = node;
759
+ if (typeof current.type !== "string") return;
760
+ if (current.type === "ImportDeclaration") return;
761
+ if (current.type === "MemberExpression" && !current.computed && current.object?.type === "Identifier" && namespaces.has(current.object.name) && Object.prototype.hasOwnProperty.call(REACT_CACHE_APIS, current.property?.name ?? "")) {
762
+ const name = current.property.name;
763
+ edits.push({ start: current.start, end: current.end, text: REACT_CACHE_APIS[name] });
764
+ used.add(name);
765
+ return;
766
+ }
767
+ for (const [key, value] of Object.entries(current)) {
768
+ if (key === "start" || key === "end" || key === "loc" || key === "range") continue;
769
+ if (value && typeof value === "object") visit(value);
770
+ }
771
+ };
772
+ visit(program);
773
+ if (used.size > 0) {
774
+ edits.push({
775
+ start: memberImportAt,
776
+ end: memberImportAt,
777
+ text: `
778
+ import { ${[...used].map((name) => `${name} as ${REACT_CACHE_APIS[name]}`).join(", ")} } from ${JSON.stringify(FARM_REACT_CACHE_MODULE)};`
779
+ });
780
+ }
781
+ }
782
+ if (edits.length === 0) return null;
783
+ let output = code;
784
+ for (const edit of edits.sort((left, right) => right.start - left.start)) {
785
+ output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);
730
786
  }
731
- return changed ? output : null;
787
+ return output;
732
788
  }
733
789
 
734
790
  // src/navigation/page-data-error.ts
@@ -824,7 +880,7 @@ function loadFarmWorkflowsDevRuntime() {
824
880
  return import("./workflows.mjs");
825
881
  }
826
882
  function loadFarmDevtoolsSnapshotRuntime() {
827
- return import("./devtools-NUVXYG7I.mjs");
883
+ return import("./devtools-MX3FE733.mjs");
828
884
  }
829
885
  function loadFarmDevtoolsUIRuntime() {
830
886
  return import("./devtools-ui-CYBVFLPH.mjs");
@@ -850,6 +906,7 @@ function farmI18nClientBridgePlugin() {
850
906
  }
851
907
  var FARM_SERVER_ONLY_ENTRIES = /* @__PURE__ */ new Set(["@farm.js/core/og"]);
852
908
  var SERVER_ONLY_PACKAGE = "server-only";
909
+ var farmReactServerFiles = /* @__PURE__ */ new Set();
853
910
  var FARM_SERVER_ONLY_PACKAGE_ID = "\0farm:server-only";
854
911
  var FARM_PLATFORM_ENTRY = "@farm.js/core/platform";
855
912
  var FARM_PLATFORM_CLIENT_ID = "\0farm:platform-client";
@@ -2430,10 +2487,15 @@ window.__FARM_MANIFEST__ = ${inlineValue({
2430
2487
  return;
2431
2488
  }
2432
2489
  }
2433
- if (options.mobileClient && !viteModuleRequest && (requestMethod === "GET" || requestMethod === "HEAD") && req.headers.accept?.includes(FARM_NATIVE_TREE_CONTENT_TYPE)) {
2434
- const { createFarmNativeTreeResponse } = await import("./native-tree-AS5L3ID3.mjs");
2490
+ if (options.mobileClient && !viteModuleRequest && (requestMethod === "GET" || requestMethod === "HEAD" || requestMethod === "POST") && req.headers.accept?.includes(FARM_NATIVE_TREE_CONTENT_TYPE)) {
2491
+ const { createFarmNativeTreeResponse } = await import("./native-tree-BPEE2LAL.mjs");
2492
+ const treeBodyInit = requestMethod === "POST" ? { body: createFarmNodeRequestBodyStream(req), duplex: "half" } : {};
2435
2493
  const treeResponse = await createFarmNativeTreeResponse({
2436
- request: new Request(fullUrl, { method: requestMethod, headers: docsHeaders }),
2494
+ request: new Request(fullUrl, {
2495
+ method: requestMethod,
2496
+ headers: docsHeaders,
2497
+ ...treeBodyInit
2498
+ }),
2437
2499
  // As for the Markdown mirror: this server's own listener, redirects not followed.
2438
2500
  renderPage: (request) => createFarmDevServerDispatch(server)(
2439
2501
  new Request(request, {
@@ -3619,9 +3681,29 @@ export const manifest = getManifest();
3619
3681
  async transform(code, id, transformOptions) {
3620
3682
  const actionConfig = farmApp?.getConfig() ?? options;
3621
3683
  let rewrotePackageImports = false;
3622
- if (resolveFarmServerComponentsMode(actionConfig.experimental?.serverComponents) === "islands" && !id.includes("/node_modules/") && !id.startsWith("\0") && /\.[cm]?[jt]sx?(?:$|\?)/.test(id) && !hasUseClientDirective(code)) {
3684
+ if (resolveFarmServerComponentsMode(actionConfig.experimental?.serverComponents) === "islands" && (!id.includes("/node_modules/") || transformOptions?.ssr === true && farmReactServerFiles.has(id.split("?", 1)[0])) && !id.startsWith("\0") && /\.[cm]?[jt]sx?(?:$|\?)/.test(id) && !hasUseClientDirective(code)) {
3623
3685
  const file = id.split("?", 1)[0];
3624
3686
  const projectRoot = actionConfig.root || server?.config.root || process.cwd();
3687
+ if (transformOptions?.ssr === true) {
3688
+ if (farmReactServerFiles.has(file)) {
3689
+ for (const child of farmRelativeImportFiles(code, file))
3690
+ farmReactServerFiles.add(child);
3691
+ }
3692
+ const serverModule = farmReactServerFiles.has(file) || !getFarmClientReachableModules(
3693
+ path6.resolve(projectRoot, actionConfig.srcDir || "src"),
3694
+ projectRoot
3695
+ ).has(path6.resolve(file));
3696
+ const reactServer = !serverModule ? null : rewriteFarmReactServerImports({
3697
+ code,
3698
+ file,
3699
+ reference: (specifier, exportName) => ensureFarmPackageClientReference(projectRoot, specifier, exportName),
3700
+ onServerFile: (serverFile) => farmReactServerFiles.add(serverFile)
3701
+ });
3702
+ if (reactServer !== null) {
3703
+ code = reactServer;
3704
+ rewrotePackageImports = true;
3705
+ }
3706
+ }
3625
3707
  const referenced = rewriteFarmPackageClientImports({
3626
3708
  code,
3627
3709
  file,
@@ -3908,6 +3990,9 @@ if (import.meta.hot) {
3908
3990
  logger.error(`SSG build failed: ${error}`);
3909
3991
  }
3910
3992
  },
3993
+ watchChange() {
3994
+ invalidateFarmClientReachableModules();
3995
+ },
3911
3996
  async handleHotUpdate(ctx) {
3912
3997
  const { file, server: server2, modules } = ctx;
3913
3998
  if (initialPluginManager) {
@@ -6,7 +6,7 @@ import {
6
6
  _getFarmMarkdownPageCheckToken,
7
7
  createFarmMarkdownViewResponse,
8
8
  requestAcceptsMarkdown
9
- } from "./chunk-YSXTNSXS.mjs";
9
+ } from "./chunk-K7OZAVOI.mjs";
10
10
 
11
11
  // src/app-markdown-runtime.ts
12
12
  import { pathToFileURL } from "url";
@@ -5,14 +5,14 @@
5
5
 
6
6
 
7
7
 
8
- var _chunkIWRLV46Xcjs = require('./chunk-IWRLV46X.cjs');
8
+ var _chunkWMTBBQHYcjs = require('./chunk-WMTBBQHY.cjs');
9
9
 
10
10
 
11
11
 
12
12
  var _chunkV3UOEWCBcjs = require('./chunk-V3UOEWCB.cjs');
13
13
 
14
14
 
15
- var _chunk545WJ5UGcjs = require('./chunk-545WJ5UG.cjs');
15
+ var _chunkDUSHDZQLcjs = require('./chunk-DUSHDZQL.cjs');
16
16
 
17
17
 
18
18
 
@@ -30,7 +30,7 @@ function hasFarmDocsRuntimeAdapter(docs) {
30
30
  }
31
31
  function assertFarmDocsAdapterServesNoGuardedPages(docs, options, isPathGuarded) {
32
32
  if (!isPathGuarded || !hasFarmDocsRuntimeAdapter(docs)) return;
33
- const guarded = _chunkIWRLV46Xcjs.getFarmDocsRoots.call(void 0, docs).flatMap((root) => _chunkIWRLV46Xcjs.discoverFarmDocsPages.call(void 0, _chunkIWRLV46Xcjs.resolveFarmDocsContentDir.call(void 0, root, options), root)).filter((page) => isPathGuarded(page.href) || isPathGuarded(_chunkIWRLV46Xcjs.getFarmDocsMarkdownPath.call(void 0, page.href))).map((page) => page.href);
33
+ const guarded = _chunkWMTBBQHYcjs.getFarmDocsRoots.call(void 0, docs).flatMap((root) => _chunkWMTBBQHYcjs.discoverFarmDocsPages.call(void 0, _chunkWMTBBQHYcjs.resolveFarmDocsContentDir.call(void 0, root, options), root)).filter((page) => isPathGuarded(page.href) || isPathGuarded(_chunkWMTBBQHYcjs.getFarmDocsMarkdownPath.call(void 0, page.href))).map((page) => page.href);
34
34
  if (guarded.length === 0) return;
35
35
  throw new Error(
36
36
  `Docs pages behind a path guard (${guarded.join(", ")}) would be public: the docs adapter ${JSON.stringify(docs.adapter.id)} serves their content in llms-full.txt, search, Markdown, and MCP without running the app's guards. Move those pages out of the docs content directory, or set docs.adapter = false to use Farm's built-in docs runtime, which keeps guarded pages off anonymous surfaces.`
@@ -56,7 +56,7 @@ function createFarmDocsAdapterRuntimeConfig(docs, options, moduleConfig) {
56
56
  ...moduleConfig ? { ...getFarmDocsConfigModuleRoot(moduleConfig, docs.entry), ...docs.configOverrides } : _nullishCoalesce(docs.runtimeConfig, () => ( docs.config)),
57
57
  entry: docs.config.entry || docs.entry.replace(/^\/+|\/+$/g, "") || "docs",
58
58
  docsPath: docs.entry,
59
- contentDir: _chunkIWRLV46Xcjs.resolveFarmDocsContentDir.call(void 0, docs, options)
59
+ contentDir: _chunkWMTBBQHYcjs.resolveFarmDocsContentDir.call(void 0, docs, options)
60
60
  };
61
61
  }
62
62
  function getFarmDocsAdapterStylesheets(options) {
@@ -123,7 +123,7 @@ async function listFarmDocsAdapterPages(docs, options) {
123
123
  if (typeof serverModule.listFarmDocsPages !== "function") return null;
124
124
  const listPages = serverModule.listFarmDocsPages;
125
125
  const pages = (await Promise.all(
126
- _chunkIWRLV46Xcjs.getFarmDocsRoots.call(void 0, docs).map(
126
+ _chunkWMTBBQHYcjs.getFarmDocsRoots.call(void 0, docs).map(
127
127
  (root) => listPages(createFarmDocsAdapterRuntimeConfig(root, options), { rootDir: options.root })
128
128
  )
129
129
  )).flat();
@@ -162,7 +162,7 @@ async function createFarmDocsAdapterHandler(docs, options) {
162
162
  };
163
163
  if (multiRoot) {
164
164
  return serverModule.createFarmDocsMultiRuntimeHandler(
165
- _chunkIWRLV46Xcjs.getFarmDocsRoots.call(void 0, docs).map(
165
+ _chunkWMTBBQHYcjs.getFarmDocsRoots.call(void 0, docs).map(
166
166
  (root) => createFarmDocsAdapterRuntimeConfig(root, options, moduleConfig)
167
167
  ),
168
168
  handlerOptions
@@ -308,22 +308,22 @@ function getDocsDescription(docs) {
308
308
  return _optionalChain([docs, 'access', _15 => _15.config, 'access', _16 => _16.metadata, 'optionalAccess', _17 => _17.description]);
309
309
  }
310
310
  function getLoadedDocsPages(context) {
311
- return _chunkIWRLV46Xcjs.discoverFarmDocsPages.call(void 0, context.contentDir, context.docs).filter((page) => !context.isPathGuarded(page.href)).map((page) => _chunkIWRLV46Xcjs.loadFarmDocsPage.call(void 0, context.contentDir, context.docs, page.slug)).filter((page) => Boolean(page));
311
+ return _chunkWMTBBQHYcjs.discoverFarmDocsPages.call(void 0, context.contentDir, context.docs).filter((page) => !context.isPathGuarded(page.href)).map((page) => _chunkWMTBBQHYcjs.loadFarmDocsPage.call(void 0, context.contentDir, context.docs, page.slug)).filter((page) => Boolean(page));
312
312
  }
313
313
  function toDocsSourcePage(page) {
314
314
  return {
315
- ..._chunkIWRLV46Xcjs.toFarmDocsMarkdownPage.call(void 0, page),
315
+ ..._chunkWMTBBQHYcjs.toFarmDocsMarkdownPage.call(void 0, page),
316
316
  sourcePath: page.sourcePath
317
317
  };
318
318
  }
319
319
  function toDocsSitemapPage(page) {
320
320
  return {
321
- ..._chunkIWRLV46Xcjs.toFarmDocsMarkdownPage.call(void 0, page),
321
+ ..._chunkWMTBBQHYcjs.toFarmDocsMarkdownPage.call(void 0, page),
322
322
  sourcePath: page.sourcePath
323
323
  };
324
324
  }
325
325
  function toDocsLlmsPage(page) {
326
- return _chunkIWRLV46Xcjs.toFarmDocsMarkdownPage.call(void 0, page);
326
+ return _chunkWMTBBQHYcjs.toFarmDocsMarkdownPage.call(void 0, page);
327
327
  }
328
328
  function getDocsLlmsOptions(context, request) {
329
329
  const configured = isRecord(context.docs.config.llmsTxt) ? context.docs.config.llmsTxt : {};
@@ -410,7 +410,7 @@ function renderAgentsDocument(context, request) {
410
410
  function buildAgentSpec(context, request) {
411
411
  const url = new URL(request.url);
412
412
  const origin = url.origin;
413
- const pages = _chunkIWRLV46Xcjs.discoverFarmDocsPages.call(void 0, context.contentDir, context.docs).filter(
413
+ const pages = _chunkWMTBBQHYcjs.discoverFarmDocsPages.call(void 0, context.contentDir, context.docs).filter(
414
414
  (page) => !context.isPathGuarded(page.href)
415
415
  );
416
416
  const spec = _chunkV3UOEWCBcjs.docsEngine.call(void 0, ).buildDocsAgentDiscoverySpec(getDocsDiscoveryOptions(context, request));
@@ -498,7 +498,7 @@ function buildPublicConfig(context) {
498
498
  };
499
499
  }
500
500
  function buildDiagnostics(context) {
501
- const pages = _chunkIWRLV46Xcjs.discoverFarmDocsPages.call(void 0, context.contentDir, context.docs);
501
+ const pages = _chunkWMTBBQHYcjs.discoverFarmDocsPages.call(void 0, context.contentDir, context.docs);
502
502
  const diagnostics = _chunkV3UOEWCBcjs.docsEngine.call(void 0, ).buildDocsDiagnostics(context.docs.config, {
503
503
  entry: context.docs.entry,
504
504
  mcp: {
@@ -568,13 +568,13 @@ async function resolveAPIContext(options) {
568
568
  config: options.config,
569
569
  configPath: options.configPath
570
570
  }));
571
- const docs = isResolvedDocsConfig(docsInput) ? docsInput : await _chunk545WJ5UGcjs.resolveDocsConfig.call(void 0, docsInput, { root, srcDir });
571
+ const docs = isResolvedDocsConfig(docsInput) ? docsInput : await _chunkDUSHDZQLcjs.resolveDocsConfig.call(void 0, docsInput, { root, srcDir });
572
572
  const guardedPaths = new Set(_nullishCoalesce(_optionalChain([runtimeConfig, 'optionalAccess', _24 => _24.guardedPaths]), () => ( [])));
573
573
  return {
574
574
  root,
575
575
  srcDir,
576
576
  docs,
577
- contentDir: _chunkIWRLV46Xcjs.resolveFarmDocsContentDir.call(void 0, docs, { root, srcDir }),
577
+ contentDir: _chunkWMTBBQHYcjs.resolveFarmDocsContentDir.call(void 0, docs, { root, srcDir }),
578
578
  diagnostics: options.diagnostics === true,
579
579
  isPathGuarded: _nullishCoalesce(options.isPathGuarded, () => ( ((pathname) => guardedPaths.has(pathname))))
580
580
  };
@@ -633,12 +633,12 @@ async function handleDocsAPIGet(request, context) {
633
633
  if (format === "markdown" || url.pathname.endsWith(".md")) {
634
634
  const pathParam = url.searchParams.get("path") || url.searchParams.get("slug");
635
635
  const slug = normalizeDocsApiSlug(_nullishCoalesce(_nullishCoalesce(pathParam, () => ( pathTarget.slug)), () => ( "")), context.docs);
636
- const page = _chunkIWRLV46Xcjs.loadFarmDocsPage.call(void 0, context.contentDir, context.docs, slug);
636
+ const page = _chunkWMTBBQHYcjs.loadFarmDocsPage.call(void 0, context.contentDir, context.docs, slug);
637
637
  if (!page || context.isPathGuarded(page.href)) {
638
638
  return text("Docs page not found\n", "text/plain; charset=utf-8", { status: 404 });
639
639
  }
640
640
  return text(
641
- _chunkV3UOEWCBcjs.docsEngine.call(void 0, ).renderDocsMarkdownDocument(_chunkIWRLV46Xcjs.toFarmDocsMarkdownPage.call(void 0, page), {
641
+ _chunkV3UOEWCBcjs.docsEngine.call(void 0, ).renderDocsMarkdownDocument(_chunkWMTBBQHYcjs.toFarmDocsMarkdownPage.call(void 0, page), {
642
642
  origin: new URL(request.url).origin,
643
643
  llms: getDocsLlmsOptions(context, request),
644
644
  sitemap: context.docs.config.sitemap
@@ -0,0 +1,254 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunkO2XFIPNLcjs = require('./chunk-O2XFIPNL.cjs');
4
+
5
+ // src/deployment-environment.ts
6
+ function isFarmProductionDeploymentEnvironment(env = process.env) {
7
+ const environment = normalizeEnvironment(env.VERCEL_ENV);
8
+ const targetEnvironment = normalizeEnvironment(env.VERCEL_TARGET_ENV);
9
+ if (environment && environment !== "production") return false;
10
+ if (targetEnvironment && targetEnvironment !== "production") return false;
11
+ if (isTrue(env.NETLIFY)) {
12
+ const context = normalizeEnvironment(env.CONTEXT);
13
+ if (context && context !== "production") return false;
14
+ }
15
+ if (isTrue(env.IS_PULL_REQUEST)) return false;
16
+ return true;
17
+ }
18
+ function isFarmPreviewDeploymentEnvironment(env) {
19
+ return resolveFarmPreviewDeployment(env, false);
20
+ }
21
+ function resolveFarmPreviewDeployment(env, builtAsPreview) {
22
+ const explicit = _optionalChain([env, 'optionalAccess', _ => _.FARM_PREVIEW]);
23
+ if (isTrue(explicit)) return true;
24
+ if (isFalse(explicit)) return false;
25
+ if (builtAsPreview || !env) return builtAsPreview;
26
+ if (normalizeEnvironment(env.VERCEL_ENV) === "preview") return true;
27
+ if (isTrue(env.NETLIFY)) {
28
+ const context = normalizeEnvironment(env.CONTEXT);
29
+ if (context === "deploy-preview" || context === "branch-deploy") return true;
30
+ }
31
+ return isTrue(env.IS_PULL_REQUEST);
32
+ }
33
+ function normalizeEnvironment(value) {
34
+ const normalized = _optionalChain([value, 'optionalAccess', _2 => _2.trim, 'call', _3 => _3(), 'access', _4 => _4.toLowerCase, 'call', _5 => _5()]);
35
+ return normalized || void 0;
36
+ }
37
+ function isTrue(value) {
38
+ return value !== void 0 && ["1", "true", "yes", "on"].includes(value.toLowerCase());
39
+ }
40
+ function isFalse(value) {
41
+ return value !== void 0 && ["0", "false", "no", "off"].includes(value.toLowerCase());
42
+ }
43
+
44
+ // src/product-telemetry.ts
45
+ var FARM_PRODUCTION_SITE_TELEMETRY_SCHEMA_VERSION = 1;
46
+ var FARM_PRODUCTION_SITE_TELEMETRY_EVENT_TYPE = "production_site_active";
47
+ var FARM_PRODUCTION_SITE_TELEMETRY_PACKAGE_NAME = "@farm.js/core";
48
+ var FARM_PRODUCTION_SITE_ATTESTATION_PATH = "/.well-known/farm-telemetry";
49
+ var FARM_PRODUCTION_SITE_ATTESTATION_EVENT_TYPE = "production_site_attestation";
50
+ var DEFAULT_SITE_TELEMETRY_ENDPOINT = "https://farmjs.dev/api/telemetry/v1/sites";
51
+ var REQUEST_TIMEOUT_MS = 3e3;
52
+ var REPORT_INTERVAL_MS = 24 * 60 * 60 * 1e3;
53
+ var RETRY_INTERVAL_MS = 5 * 60 * 1e3;
54
+ var MAX_ORIGINS_PER_INSTANCE = 32;
55
+ var SAFE_DETAIL_PATTERN = /^[0-9A-Za-z._-]{1,64}$/;
56
+ function detectFarmProductionSiteOrigin(value) {
57
+ try {
58
+ const url = value instanceof URL ? value : new URL(value);
59
+ return normalizeFarmProductionSiteOrigin(url.origin);
60
+ } catch (e) {
61
+ return void 0;
62
+ }
63
+ }
64
+ function normalizeFarmProductionSiteOrigin(value) {
65
+ const candidate = value.trim();
66
+ if (!candidate || candidate.length > 2048) return void 0;
67
+ try {
68
+ const url = new URL(candidate);
69
+ const hostname = url.hostname.toLowerCase();
70
+ const isIpv4 = /^\d{1,3}(?:\.\d{1,3}){3}$/.test(hostname);
71
+ const isIpv6 = hostname.startsWith("[") && hostname.endsWith("]");
72
+ const isLocal = hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".local");
73
+ const isSingleLabel = !hostname.includes(".");
74
+ if (url.protocol !== "https:" || url.username || url.password || url.search || url.hash || url.pathname !== "/" || isIpv4 || isIpv6 || isLocal || isSingleLabel || hostname.endsWith(".")) {
75
+ return void 0;
76
+ }
77
+ return url.origin;
78
+ } catch (e2) {
79
+ return void 0;
80
+ }
81
+ }
82
+ function createFarmProductionSiteReporter(options) {
83
+ const now = _nullishCoalesce(options.now, () => ( Date.now));
84
+ const reportIntervalMs = _nullishCoalesce(options.reportIntervalMs, () => ( REPORT_INTERVAL_MS));
85
+ const retryIntervalMs = _nullishCoalesce(options.retryIntervalMs, () => ( RETRY_INTERVAL_MS));
86
+ const send = _nullishCoalesce(options.fetch, () => ( globalThis.fetch));
87
+ const reportStates = /* @__PURE__ */ new Map();
88
+ let reportingSkipped;
89
+ const attestation = {
90
+ schemaVersion: FARM_PRODUCTION_SITE_TELEMETRY_SCHEMA_VERSION,
91
+ eventType: FARM_PRODUCTION_SITE_ATTESTATION_EVENT_TYPE,
92
+ packageName: FARM_PRODUCTION_SITE_TELEMETRY_PACKAGE_NAME,
93
+ packageVersion: sanitizeDetail(_chunkO2XFIPNLcjs.FARM_VERSION, "unknown"),
94
+ renderer: sanitizeDetail(options.renderer, "custom"),
95
+ deployTarget: sanitizeDetail(options.deployTarget, "custom")
96
+ };
97
+ return {
98
+ handleAttestation(request) {
99
+ if (!request.url.includes(FARM_PRODUCTION_SITE_ATTESTATION_PATH)) return null;
100
+ if (productionTelemetryDisabled()) return null;
101
+ let pathname;
102
+ try {
103
+ pathname = new URL(request.url).pathname;
104
+ } catch (e3) {
105
+ return null;
106
+ }
107
+ if (pathname !== FARM_PRODUCTION_SITE_ATTESTATION_PATH) return null;
108
+ if (request.method !== "GET" && request.method !== "HEAD") {
109
+ return new Response("Method Not Allowed", {
110
+ status: 405,
111
+ headers: {
112
+ allow: "GET, HEAD",
113
+ "cache-control": "no-store",
114
+ "content-type": "text/plain; charset=utf-8",
115
+ "x-content-type-options": "nosniff"
116
+ }
117
+ });
118
+ }
119
+ return new Response(request.method === "HEAD" ? null : JSON.stringify(attestation), {
120
+ status: 200,
121
+ headers: {
122
+ "cache-control": "no-store",
123
+ "content-type": "application/json; charset=utf-8",
124
+ "x-content-type-options": "nosniff"
125
+ }
126
+ });
127
+ },
128
+ report(requestUrl, waitUntil) {
129
+ if (reportingSkipped === void 0) {
130
+ reportingSkipped = productionTelemetryDisabled() ? "disabled" : isFarmProductionDeploymentEnvironment() ? false : "not-production";
131
+ if (reportingSkipped === "not-production") {
132
+ debug("production-site check-in skipped outside a production deployment");
133
+ }
134
+ }
135
+ if (reportingSkipped) return;
136
+ const siteUrl = detectFarmProductionSiteOrigin(requestUrl);
137
+ if (!siteUrl) return;
138
+ let state = reportStates.get(siteUrl);
139
+ if (!state) {
140
+ if (reportStates.size >= MAX_ORIGINS_PER_INSTANCE) return;
141
+ state = { nextReportAt: 0 };
142
+ reportStates.set(siteUrl, state);
143
+ }
144
+ const attemptedAt = now();
145
+ if (state.pending || attemptedAt < state.nextReportAt) return;
146
+ state.nextReportAt = attemptedAt + reportIntervalMs;
147
+ const payload = {
148
+ schemaVersion: FARM_PRODUCTION_SITE_TELEMETRY_SCHEMA_VERSION,
149
+ eventType: FARM_PRODUCTION_SITE_TELEMETRY_EVENT_TYPE,
150
+ siteUrl,
151
+ packageName: FARM_PRODUCTION_SITE_TELEMETRY_PACKAGE_NAME,
152
+ packageVersion: attestation.packageVersion,
153
+ renderer: attestation.renderer,
154
+ deployTarget: attestation.deployTarget
155
+ };
156
+ state.pending = deliver(send, resolveSiteTelemetryEndpoint(options.endpoint), payload).then((delivered) => {
157
+ if (!delivered) state.nextReportAt = now() + retryIntervalMs;
158
+ }).catch(() => {
159
+ state.nextReportAt = now() + retryIntervalMs;
160
+ }).finally(() => {
161
+ state.pending = void 0;
162
+ });
163
+ if (waitUntil) {
164
+ try {
165
+ waitUntil(state.pending);
166
+ } catch (e4) {
167
+ }
168
+ } else {
169
+ void state.pending;
170
+ }
171
+ }
172
+ };
173
+ }
174
+ async function deliver(send, endpoint, payload) {
175
+ if (!endpoint) {
176
+ debug("invalid or insecure production-site telemetry endpoint; check-in skipped");
177
+ return false;
178
+ }
179
+ const controller = new AbortController();
180
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
181
+ _optionalChain([timeout, 'access', _6 => _6.unref, 'optionalCall', _7 => _7()]);
182
+ try {
183
+ const response = await send(endpoint, {
184
+ method: "POST",
185
+ headers: { "content-type": "application/json" },
186
+ body: JSON.stringify(payload),
187
+ signal: controller.signal
188
+ });
189
+ if (!response.ok) {
190
+ debug(`production-site check-in rejected with HTTP ${response.status}`);
191
+ return false;
192
+ }
193
+ try {
194
+ const result = await response.json();
195
+ if (result && result.stored === false) {
196
+ debug("production-site check-in was accepted but not stored");
197
+ return false;
198
+ }
199
+ } catch (e5) {
200
+ }
201
+ return true;
202
+ } catch (e6) {
203
+ debug("production-site check-in failed");
204
+ return false;
205
+ } finally {
206
+ clearTimeout(timeout);
207
+ }
208
+ }
209
+ function resolveSiteTelemetryEndpoint(explicit) {
210
+ const candidate = explicit || process.env.FARM_TELEMETRY_SITE_ENDPOINT;
211
+ if (!candidate) return DEFAULT_SITE_TELEMETRY_ENDPOINT;
212
+ try {
213
+ const url = new URL(candidate);
214
+ const hostname = url.hostname.toLowerCase().replace(/^\[|\]$/g, "");
215
+ const isLocal = ["localhost", "127.0.0.1", "::1"].includes(hostname);
216
+ if (url.protocol === "https:" || url.protocol === "http:" && isLocal) {
217
+ return url.toString();
218
+ }
219
+ } catch (e7) {
220
+ }
221
+ return void 0;
222
+ }
223
+ function productionTelemetryDisabled() {
224
+ if (process.env.DO_NOT_TRACK !== void 0 && !isFalse2(process.env.DO_NOT_TRACK)) return true;
225
+ if (isTrue2(process.env.FARM_TELEMETRY_DISABLED)) return true;
226
+ return isFalse2(process.env.FARM_TELEMETRY);
227
+ }
228
+ function sanitizeDetail(value, fallback) {
229
+ return value && SAFE_DETAIL_PATTERN.test(value) ? value : fallback;
230
+ }
231
+ function isTrue2(value) {
232
+ return value !== void 0 && ["1", "true", "yes", "on"].includes(value.toLowerCase());
233
+ }
234
+ function isFalse2(value) {
235
+ return value !== void 0 && ["0", "false", "no", "off"].includes(value.toLowerCase());
236
+ }
237
+ function debug(message) {
238
+ if (!isTrue2(process.env.FARM_TELEMETRY_DEBUG)) return;
239
+ process.stderr.write(`[farm.telemetry] ${message}
240
+ `);
241
+ }
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+ exports.isFarmPreviewDeploymentEnvironment = isFarmPreviewDeploymentEnvironment; exports.resolveFarmPreviewDeployment = resolveFarmPreviewDeployment; exports.FARM_PRODUCTION_SITE_TELEMETRY_SCHEMA_VERSION = FARM_PRODUCTION_SITE_TELEMETRY_SCHEMA_VERSION; exports.FARM_PRODUCTION_SITE_TELEMETRY_EVENT_TYPE = FARM_PRODUCTION_SITE_TELEMETRY_EVENT_TYPE; exports.FARM_PRODUCTION_SITE_TELEMETRY_PACKAGE_NAME = FARM_PRODUCTION_SITE_TELEMETRY_PACKAGE_NAME; exports.FARM_PRODUCTION_SITE_ATTESTATION_PATH = FARM_PRODUCTION_SITE_ATTESTATION_PATH; exports.FARM_PRODUCTION_SITE_ATTESTATION_EVENT_TYPE = FARM_PRODUCTION_SITE_ATTESTATION_EVENT_TYPE; exports.detectFarmProductionSiteOrigin = detectFarmProductionSiteOrigin; exports.normalizeFarmProductionSiteOrigin = normalizeFarmProductionSiteOrigin; exports.createFarmProductionSiteReporter = createFarmProductionSiteReporter;