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

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 (248) 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-CJKz2mbi.d.ts} +4 -4
  18. package/dist/{app-DBd6437H.d.mts → app-DMEGFLR2.d.mts} +4 -4
  19. package/dist/app-markdown.cjs.map +1 -0
  20. package/dist/app-markdown.d.mts +3 -3
  21. package/dist/app-markdown.d.ts +3 -3
  22. package/dist/cache.cjs.map +1 -0
  23. package/dist/{chunk-WD2EBM3I.mjs → chunk-3CQJV3NC.mjs} +2 -2
  24. package/dist/{chunk-I3OOUWO5.mjs → chunk-3GDRV7SG.mjs} +2 -2
  25. package/dist/{chunk-X4SFHKFH.mjs → chunk-6KJY25DQ.mjs} +5 -5
  26. package/dist/{chunk-FP5Q67FO.mjs → chunk-AAEZP2EY.mjs} +9 -9
  27. package/dist/{chunk-WMJGA32P.mjs → chunk-BXVOHG6B.mjs} +27 -2
  28. package/dist/{chunk-WMJGA32P.mjs.map → chunk-BXVOHG6B.mjs.map} +1 -1
  29. package/dist/{chunk-BZAIS65C.mjs → chunk-DIHNOVZZ.mjs} +40 -13
  30. package/dist/chunk-DIHNOVZZ.mjs.map +1 -0
  31. package/dist/{chunk-ISSFLGJ5.mjs → chunk-FDWECN3W.mjs} +8 -4
  32. package/dist/chunk-FDWECN3W.mjs.map +1 -0
  33. package/dist/chunk-FDWXXTWR.mjs +114 -0
  34. package/dist/chunk-FDWXXTWR.mjs.map +1 -0
  35. package/dist/{chunk-J3MPQ4MQ.mjs → chunk-IHADQ6J7.mjs} +2 -2
  36. package/dist/{chunk-J3MPQ4MQ.mjs.map → chunk-IHADQ6J7.mjs.map} +1 -1
  37. package/dist/{chunk-FSIXEIOB.mjs → chunk-L7FSTPGS.mjs} +2 -2
  38. package/dist/{chunk-AAC66ILR.mjs → chunk-LXXG3K2Y.mjs} +61 -2
  39. package/dist/chunk-LXXG3K2Y.mjs.map +1 -0
  40. package/dist/{chunk-GJ7W6LNK.mjs → chunk-N5RK4LK6.mjs} +3 -3
  41. package/dist/{chunk-WKDAA6V2.mjs → chunk-NBF56FXB.mjs} +20 -5
  42. package/dist/chunk-NBF56FXB.mjs.map +1 -0
  43. package/dist/chunk-RKUPOYQV.mjs +28 -0
  44. package/dist/chunk-RKUPOYQV.mjs.map +1 -0
  45. package/dist/{chunk-2SKCXYLB.mjs → chunk-RL3THP3L.mjs} +54 -5
  46. package/dist/chunk-RL3THP3L.mjs.map +1 -0
  47. package/dist/{chunk-52BR7LTX.mjs → chunk-STSPSJUI.mjs} +3 -3
  48. package/dist/{chunk-EPDIF432.mjs → chunk-UOGX6UNO.mjs} +37 -17
  49. package/dist/chunk-UOGX6UNO.mjs.map +1 -0
  50. package/dist/{chunk-YIBV77KZ.mjs → chunk-URQELPSH.mjs} +2 -2
  51. package/dist/{chunk-UMUWR5XA.mjs → chunk-UWQ4EEW7.mjs} +2 -2
  52. package/dist/{chunk-IZBX2TEU.mjs → chunk-VQG3QWWK.mjs} +2 -2
  53. package/dist/{chunk-D7F7YZ7L.mjs → chunk-WA77FWAO.mjs} +8 -8
  54. package/dist/{chunk-35NPLKQJ.mjs → chunk-XWM2C267.mjs} +21 -105
  55. package/dist/chunk-XWM2C267.mjs.map +1 -0
  56. package/dist/client/lifecycle.cjs.map +1 -0
  57. package/dist/client/lifecycle.mjs +2 -2
  58. package/dist/{client-plugins-B6-07YmP.d.mts → client-plugins-CyTLPqjP.d.mts} +38 -2
  59. package/dist/{client-plugins-By6MVUX-.d.ts → client-plugins-D-UgzngJ.d.ts} +38 -2
  60. package/dist/client-plugins.cjs +1 -1
  61. package/dist/client-plugins.cjs.map +1 -0
  62. package/dist/client-plugins.d.mts +2 -2
  63. package/dist/client-plugins.d.ts +2 -2
  64. package/dist/client-plugins.mjs +2 -2
  65. package/dist/client.cjs +61 -16
  66. package/dist/client.cjs.map +1 -0
  67. package/dist/client.d.mts +5 -5
  68. package/dist/client.d.ts +5 -5
  69. package/dist/client.mjs +7 -7
  70. package/dist/config.cjs.map +1 -0
  71. package/dist/config.d.mts +2 -2
  72. package/dist/config.d.ts +2 -2
  73. package/dist/cron.cjs +48 -12
  74. package/dist/cron.cjs.map +1 -0
  75. package/dist/cron.mjs +2 -1
  76. package/dist/deferred.cjs.map +1 -0
  77. package/dist/deployment.cjs.map +1 -0
  78. package/dist/{devtools-XWZX6CCL.mjs → devtools-KQ2PXSIC.mjs} +8 -6
  79. package/dist/{devtools-XWZX6CCL.mjs.map → devtools-KQ2PXSIC.mjs.map} +1 -1
  80. package/dist/docs.cjs +7 -3
  81. package/dist/docs.cjs.map +1 -0
  82. package/dist/docs.mjs +8 -6
  83. package/dist/env-types.cjs.map +1 -0
  84. package/dist/env.cjs.map +1 -0
  85. package/dist/environment/vite.cjs.map +1 -0
  86. package/dist/environment.cjs.map +1 -0
  87. package/dist/font.cjs.map +1 -0
  88. package/dist/headers.cjs.map +1 -0
  89. package/dist/i18n/client.cjs.map +1 -0
  90. package/dist/i18n/index.cjs.map +1 -0
  91. package/dist/i18n/server.cjs.map +1 -0
  92. package/dist/image/server.cjs +19 -4
  93. package/dist/image/server.cjs.map +1 -0
  94. package/dist/image/server.d.mts +6 -0
  95. package/dist/image/server.d.ts +6 -0
  96. package/dist/image/server.mjs +1 -1
  97. package/dist/image/sharp.cjs +1 -0
  98. package/dist/image/sharp.cjs.map +1 -0
  99. package/dist/image/sharp.mjs +1 -1
  100. package/dist/image.cjs.map +1 -0
  101. package/dist/index.cjs +370 -143
  102. package/dist/index.cjs.map +1 -0
  103. package/dist/index.d.mts +10 -10
  104. package/dist/index.d.ts +10 -10
  105. package/dist/index.mjs +29 -21
  106. package/dist/index.mjs.map +1 -1
  107. package/dist/instrumentation.cjs.map +1 -0
  108. package/dist/{integration-orm-LLW6WZNK.mjs → integration-orm-G5BPBT5X.mjs} +3 -3
  109. package/dist/integrations.cjs +168 -5
  110. package/dist/integrations.cjs.map +1 -0
  111. package/dist/integrations.d.mts +2 -2
  112. package/dist/integrations.d.ts +2 -2
  113. package/dist/integrations.mjs +10 -3
  114. package/dist/internal/build-runtime.cjs +178 -51
  115. package/dist/internal/build-runtime.cjs.map +1 -0
  116. package/dist/internal/build-runtime.d.mts +4 -4
  117. package/dist/internal/build-runtime.d.ts +4 -4
  118. package/dist/internal/build-runtime.mjs +13 -11
  119. package/dist/internal/client-runtime.cjs +1 -1
  120. package/dist/internal/client-runtime.cjs.map +1 -0
  121. package/dist/internal/client-runtime.mjs +2 -2
  122. package/dist/internal/config-runtime.cjs +48 -42
  123. package/dist/internal/config-runtime.cjs.map +1 -0
  124. package/dist/internal/config-runtime.d.mts +3 -3
  125. package/dist/internal/config-runtime.d.ts +3 -3
  126. package/dist/internal/config-runtime.mjs +7 -5
  127. package/dist/internal/isolated-boundary.cjs.map +1 -0
  128. package/dist/internal/metadata-image-runtime.cjs.map +1 -0
  129. package/dist/internal/product-telemetry-runtime.cjs +6 -2
  130. package/dist/internal/product-telemetry-runtime.cjs.map +1 -0
  131. package/dist/internal/product-telemetry-runtime.mjs +6 -2
  132. package/dist/internal/product-telemetry-runtime.mjs.map +1 -1
  133. package/dist/internal/production-node-env.cjs.map +1 -0
  134. package/dist/internal/production-runtime.cjs.map +1 -0
  135. package/dist/internal/production-runtime.d.mts +8 -8
  136. package/dist/internal/production-runtime.d.ts +8 -8
  137. package/dist/markdown.cjs.map +1 -0
  138. package/dist/{metadata-route-8_V3UonT.d.ts → metadata-route-BpU8K9RI.d.ts} +1 -1
  139. package/dist/{metadata-route-CWP_HjGU.d.mts → metadata-route-D1AYgWni.d.mts} +1 -1
  140. package/dist/middleware.cjs.map +1 -0
  141. package/dist/middleware.d.mts +4 -4
  142. package/dist/middleware.d.ts +4 -4
  143. package/dist/navigation.cjs.map +1 -0
  144. package/dist/{nitro-EGRNOB5P.mjs → nitro-IITKBMUI.mjs} +4 -3
  145. package/dist/{nitro-EGRNOB5P.mjs.map → nitro-IITKBMUI.mjs.map} +1 -1
  146. package/dist/observability.cjs.map +1 -0
  147. package/dist/plugin.cjs +143 -50
  148. package/dist/plugin.cjs.map +1 -0
  149. package/dist/plugin.d.mts +2 -2
  150. package/dist/plugin.d.ts +2 -2
  151. package/dist/plugin.mjs +10 -8
  152. package/dist/{production-runtime-BGRH1dKG.d.mts → production-runtime-BIKA-BVT.d.mts} +2 -2
  153. package/dist/{production-runtime-CdmzsDax.d.ts → production-runtime-DtCUEELY.d.ts} +2 -2
  154. package/dist/query/client.cjs.map +1 -0
  155. package/dist/query/index.cjs.map +1 -0
  156. package/dist/query/parsers.cjs.map +1 -0
  157. package/dist/query/server.cjs.map +1 -0
  158. package/dist/{render-plan-DLxJYAA5.d.mts → render-plan-Dimb23ux.d.mts} +1 -1
  159. package/dist/{render-plan-0GeHiGVZ.d.ts → render-plan-rg3uiSo3.d.ts} +1 -1
  160. package/dist/renderer/react/client.cjs.map +1 -0
  161. package/dist/renderer/react/server.cjs.map +1 -0
  162. package/dist/renderer/react/vite.cjs.map +1 -0
  163. package/dist/renderer-client.cjs +26 -1
  164. package/dist/renderer-client.cjs.map +1 -0
  165. package/dist/renderer-client.d.mts +4 -4
  166. package/dist/renderer-client.d.ts +4 -4
  167. package/dist/renderer-client.mjs +2 -2
  168. package/dist/renderer.cjs.map +1 -0
  169. package/dist/{request-BstWbZ6O.d.ts → request-ColD-ChW.d.ts} +1 -1
  170. package/dist/{request-BCNXSXLh.d.mts → request-D5zvbU2Z.d.mts} +1 -1
  171. package/dist/request.cjs.map +1 -0
  172. package/dist/request.d.mts +3 -3
  173. package/dist/request.d.ts +3 -3
  174. package/dist/router.cjs.map +1 -0
  175. package/dist/routes.cjs.map +1 -0
  176. package/dist/routes.d.mts +2 -2
  177. package/dist/routes.d.ts +2 -2
  178. package/dist/server-action-security.cjs +117 -104
  179. package/dist/server-action-security.cjs.map +1 -0
  180. package/dist/server-action-security.mjs +2 -1
  181. package/dist/server-fn-client.cjs.map +1 -0
  182. package/dist/server-fn.cjs.map +1 -0
  183. package/dist/server-fn.mjs +3 -2
  184. package/dist/server-plugins.cjs.map +1 -0
  185. package/dist/server-plugins.d.mts +3 -3
  186. package/dist/server-plugins.d.ts +3 -3
  187. package/dist/server-query-client.cjs +26 -1
  188. package/dist/server-query-client.cjs.map +1 -0
  189. package/dist/server-query-client.mjs +3 -3
  190. package/dist/server-query.cjs.map +1 -0
  191. package/dist/server-query.mjs +4 -3
  192. package/dist/server.cjs +221 -116
  193. package/dist/server.cjs.map +1 -0
  194. package/dist/server.d.mts +8 -8
  195. package/dist/server.d.ts +8 -8
  196. package/dist/server.mjs +13 -11
  197. package/dist/server.mjs.map +1 -1
  198. package/dist/{spa-router-BeyAVSc6.d.mts → spa-router-BlilYGAN.d.mts} +1 -1
  199. package/dist/{spa-router-COgu4txb.d.ts → spa-router-kXORcsT_.d.ts} +1 -1
  200. package/dist/storage.cjs +7 -3
  201. package/dist/storage.cjs.map +1 -0
  202. package/dist/storage.mjs +1 -1
  203. package/dist/testing.cjs.map +1 -0
  204. package/dist/testing.d.mts +2 -2
  205. package/dist/testing.d.ts +2 -2
  206. package/dist/testing.mjs +2 -1
  207. package/dist/testing.mjs.map +1 -1
  208. package/dist/theme/client.cjs.map +1 -0
  209. package/dist/theme/index.cjs.map +1 -0
  210. package/dist/theme/runtime.cjs.map +1 -0
  211. package/dist/theme/server.cjs.map +1 -0
  212. package/dist/{utils-DkU2c_1B.d.ts → utils-BhvF7Hhl.d.ts} +1 -1
  213. package/dist/{utils-DL2VwDQl.d.mts → utils-uF32evNX.d.mts} +1 -1
  214. package/dist/version.cjs +1 -1
  215. package/dist/version.cjs.map +1 -0
  216. package/dist/version.mjs +1 -1
  217. package/dist/vite.cjs +143 -50
  218. package/dist/vite.cjs.map +1 -0
  219. package/dist/vite.d.mts +2 -2
  220. package/dist/vite.d.ts +2 -2
  221. package/dist/vite.mjs +10 -8
  222. package/dist/{workflows-ChyK_oTu.d.mts → workflows-BantWytQ.d.mts} +7 -0
  223. package/dist/{workflows-ChyK_oTu.d.ts → workflows-BantWytQ.d.ts} +7 -0
  224. package/dist/workflows.cjs +67 -4
  225. package/dist/workflows.cjs.map +1 -0
  226. package/dist/workflows.d.mts +1 -1
  227. package/dist/workflows.d.ts +1 -1
  228. package/dist/workflows.mjs +2 -1
  229. package/package.json +17 -17
  230. package/dist/chunk-2SKCXYLB.mjs.map +0 -1
  231. package/dist/chunk-35NPLKQJ.mjs.map +0 -1
  232. package/dist/chunk-AAC66ILR.mjs.map +0 -1
  233. package/dist/chunk-BZAIS65C.mjs.map +0 -1
  234. package/dist/chunk-EPDIF432.mjs.map +0 -1
  235. package/dist/chunk-ISSFLGJ5.mjs.map +0 -1
  236. package/dist/chunk-WKDAA6V2.mjs.map +0 -1
  237. /package/dist/{chunk-WD2EBM3I.mjs.map → chunk-3CQJV3NC.mjs.map} +0 -0
  238. /package/dist/{chunk-I3OOUWO5.mjs.map → chunk-3GDRV7SG.mjs.map} +0 -0
  239. /package/dist/{chunk-X4SFHKFH.mjs.map → chunk-6KJY25DQ.mjs.map} +0 -0
  240. /package/dist/{chunk-FP5Q67FO.mjs.map → chunk-AAEZP2EY.mjs.map} +0 -0
  241. /package/dist/{chunk-FSIXEIOB.mjs.map → chunk-L7FSTPGS.mjs.map} +0 -0
  242. /package/dist/{chunk-GJ7W6LNK.mjs.map → chunk-N5RK4LK6.mjs.map} +0 -0
  243. /package/dist/{chunk-52BR7LTX.mjs.map → chunk-STSPSJUI.mjs.map} +0 -0
  244. /package/dist/{chunk-YIBV77KZ.mjs.map → chunk-URQELPSH.mjs.map} +0 -0
  245. /package/dist/{chunk-UMUWR5XA.mjs.map → chunk-UWQ4EEW7.mjs.map} +0 -0
  246. /package/dist/{chunk-IZBX2TEU.mjs.map → chunk-VQG3QWWK.mjs.map} +0 -0
  247. /package/dist/{chunk-D7F7YZ7L.mjs.map → chunk-WA77FWAO.mjs.map} +0 -0
  248. /package/dist/{integration-orm-LLW6WZNK.mjs.map → integration-orm-G5BPBT5X.mjs.map} +0 -0
@@ -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
  }
@@ -664,6 +668,7 @@ __export(integrations_exports, {
664
668
  defineIntegrationAPI: () => defineIntegrationAPI,
665
669
  defineIntegrationAPIOperation: () => defineIntegrationAPIOperation,
666
670
  defineIntegrationSchema: () => defineIntegrationSchema,
671
+ describeIntegrationOriginRejection: () => describeIntegrationOriginRejection,
667
672
  dispatchIntegrationRequest: () => dispatchIntegrationRequest,
668
673
  getFarmIntegrationPluginOwner: () => getFarmIntegrationPluginOwner,
669
674
  getFarmIntegrationPluginServerRuntime: () => getFarmIntegrationPluginServerRuntime,
@@ -679,7 +684,9 @@ __export(integrations_exports, {
679
684
  isFarmIntegrationProviderComponentReference: () => isFarmIntegrationProviderComponentReference,
680
685
  matchIntegrationRoute: () => matchIntegrationRoute,
681
686
  matchRegisteredIntegrationRoute: () => matchRegisteredIntegrationRoute,
682
- resolveIntegrationPlugins: () => resolveIntegrationPlugins
687
+ resolveIntegrationAllowedOrigins: () => resolveIntegrationAllowedOrigins,
688
+ resolveIntegrationPlugins: () => resolveIntegrationPlugins,
689
+ validateIntegrationRequestOrigin: () => validateIntegrationRequestOrigin
683
690
  });
684
691
  module.exports = __toCommonJS(integrations_exports);
685
692
 
@@ -864,6 +871,159 @@ function validateConfigRouteSource(source, field = "Config route source") {
864
871
  }
865
872
  __name(validateConfigRouteSource, "validateConfigRouteSource");
866
873
 
874
+ // src/request-origin.ts
875
+ function getRequestSourceOrigin(request) {
876
+ const origin = request.headers.get("origin")?.trim();
877
+ if (origin) {
878
+ return parseSourceOrigin(origin);
879
+ }
880
+ const referer = request.headers.get("referer")?.trim();
881
+ if (referer) {
882
+ return parseSourceOrigin(referer);
883
+ }
884
+ return { ok: true, origin: null };
885
+ }
886
+ __name(getRequestSourceOrigin, "getRequestSourceOrigin");
887
+ function parseSourceOrigin(value) {
888
+ if (value === "null") {
889
+ return { ok: false, reason: "opaque-origin" };
890
+ }
891
+ try {
892
+ const parsed = new URL(value);
893
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
894
+ return { ok: false, reason: "invalid-origin" };
895
+ }
896
+ return { ok: true, origin: parsed.origin };
897
+ } catch {
898
+ return { ok: false, reason: "invalid-origin" };
899
+ }
900
+ }
901
+ __name(parseSourceOrigin, "parseSourceOrigin");
902
+ function matchesHostHeader(sourceOrigin, request) {
903
+ const host = request.headers.get("host")?.trim().toLowerCase();
904
+ if (!host) return false;
905
+ try {
906
+ const source = new URL(sourceOrigin);
907
+ const target = new URL(request.url);
908
+ return source.protocol === target.protocol && source.host.toLowerCase() === host;
909
+ } catch {
910
+ return false;
911
+ }
912
+ }
913
+ __name(matchesHostHeader, "matchesHostHeader");
914
+ function matchesAllowedOrigin(sourceOrigin, pattern) {
915
+ const source = new URL(sourceOrigin);
916
+ if (!pattern.includes("*")) {
917
+ return pattern.includes("://") ? source.origin === pattern : source.host === pattern;
918
+ }
919
+ const schemeEnd = pattern.indexOf("://");
920
+ const scheme = schemeEnd === -1 ? null : pattern.slice(0, schemeEnd + 1);
921
+ const hostPattern = pattern.slice(schemeEnd === -1 ? 0 : schemeEnd + 3);
922
+ const [wildcardHost, port] = splitHostAndPort(hostPattern);
923
+ const baseHost = wildcardHost.slice(2);
924
+ if (scheme && source.protocol !== scheme) return false;
925
+ if (port && getEffectivePort(source) !== port) return false;
926
+ if (!port && source.port) return false;
927
+ return source.hostname.endsWith(`.${baseHost}`) && source.hostname !== baseHost;
928
+ }
929
+ __name(matchesAllowedOrigin, "matchesAllowedOrigin");
930
+ function normalizeAllowedOriginPattern(value, label) {
931
+ const pattern = value.trim().toLowerCase();
932
+ if (!pattern) {
933
+ throw new TypeError(`${label} cannot contain empty values`);
934
+ }
935
+ if (pattern.includes("*")) {
936
+ if (!/^(?:https?:\/\/)?\*\.[a-z0-9.-]+(?::\d+)?$/.test(pattern)) {
937
+ throw new TypeError(`Invalid ${label} pattern: ${JSON.stringify(value)}`);
938
+ }
939
+ return pattern;
940
+ }
941
+ if (pattern.includes("://")) {
942
+ let parsed;
943
+ try {
944
+ parsed = new URL(pattern);
945
+ } catch {
946
+ throw new TypeError(`Invalid ${label} value: ${JSON.stringify(value)}`);
947
+ }
948
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
949
+ throw new TypeError(`${label} must contain origins without paths: ${JSON.stringify(value)}`);
950
+ }
951
+ return parsed.origin;
952
+ }
953
+ if (/[/@?#]/.test(pattern)) {
954
+ throw new TypeError(`${label} must contain origins or hosts: ${JSON.stringify(value)}`);
955
+ }
956
+ try {
957
+ return new URL(`http://${pattern}`).host;
958
+ } catch {
959
+ throw new TypeError(`Invalid ${label} value: ${JSON.stringify(value)}`);
960
+ }
961
+ }
962
+ __name(normalizeAllowedOriginPattern, "normalizeAllowedOriginPattern");
963
+ function splitHostAndPort(value) {
964
+ const separator = value.lastIndexOf(":");
965
+ if (separator === -1) return [value, null];
966
+ return [value.slice(0, separator), value.slice(separator + 1)];
967
+ }
968
+ __name(splitHostAndPort, "splitHostAndPort");
969
+ function getEffectivePort(url) {
970
+ if (url.port) return url.port;
971
+ if (url.protocol === "https:") return "443";
972
+ if (url.protocol === "http:") return "80";
973
+ return "";
974
+ }
975
+ __name(getEffectivePort, "getEffectivePort");
976
+
977
+ // src/integration-request-security.ts
978
+ function resolveIntegrationAllowedOrigins(values, label) {
979
+ return Object.freeze((values ?? []).map((value) => normalizeAllowedOriginPattern(value, label)));
980
+ }
981
+ __name(resolveIntegrationAllowedOrigins, "resolveIntegrationAllowedOrigins");
982
+ function validateIntegrationRequestOrigin(request, policy = {}) {
983
+ const allowedOrigins = policy.allowedOrigins ?? [];
984
+ const requireOriginMetadata = policy.requireOriginMetadata ?? true;
985
+ const fetchSite = request.headers.get("sec-fetch-site")?.trim().toLowerCase();
986
+ const source = getRequestSourceOrigin(request);
987
+ if (!source.ok) {
988
+ return { ok: false, reason: source.reason };
989
+ }
990
+ if (source.origin === null) {
991
+ if (fetchSite === "same-origin") {
992
+ return { ok: true };
993
+ }
994
+ if (requireOriginMetadata) {
995
+ return { ok: false, reason: fetchSite === "cross-site" ? "cross-site" : "missing-origin" };
996
+ }
997
+ return fetchSite === "cross-site" ? { ok: false, reason: "cross-site" } : { ok: true };
998
+ }
999
+ const requestUrl = new URL(request.url);
1000
+ const matchesConfiguredOrigin = allowedOrigins.some(
1001
+ (pattern) => matchesAllowedOrigin(source.origin, pattern)
1002
+ );
1003
+ const matchesRequest = source.origin === requestUrl.origin || matchesHostHeader(source.origin, request);
1004
+ if (!matchesRequest && !matchesConfiguredOrigin) {
1005
+ return { ok: false, reason: "cross-site" };
1006
+ }
1007
+ if (fetchSite === "cross-site" && !matchesConfiguredOrigin) {
1008
+ return { ok: false, reason: "cross-site" };
1009
+ }
1010
+ return { ok: true };
1011
+ }
1012
+ __name(validateIntegrationRequestOrigin, "validateIntegrationRequestOrigin");
1013
+ function describeIntegrationOriginRejection(reason) {
1014
+ switch (reason) {
1015
+ case "missing-origin":
1016
+ return "Request is missing same-origin metadata.";
1017
+ case "opaque-origin":
1018
+ return "Opaque origins are not allowed.";
1019
+ case "invalid-origin":
1020
+ return "Invalid request origin.";
1021
+ case "cross-site":
1022
+ return "Cross-site request was rejected.";
1023
+ }
1024
+ }
1025
+ __name(describeIntegrationOriginRejection, "describeIntegrationOriginRejection");
1026
+
867
1027
  // src/integration-api.ts
868
1028
  function defineIntegrationAPIOperation(operation2) {
869
1029
  return {
@@ -3554,6 +3714,7 @@ __name(normalizeMatcher, "normalizeMatcher");
3554
3714
  defineIntegrationAPI,
3555
3715
  defineIntegrationAPIOperation,
3556
3716
  defineIntegrationSchema,
3717
+ describeIntegrationOriginRejection,
3557
3718
  dispatchIntegrationRequest,
3558
3719
  getFarmIntegrationPluginOwner,
3559
3720
  getFarmIntegrationPluginServerRuntime,
@@ -3569,6 +3730,8 @@ __name(normalizeMatcher, "normalizeMatcher");
3569
3730
  isFarmIntegrationProviderComponentReference,
3570
3731
  matchIntegrationRoute,
3571
3732
  matchRegisteredIntegrationRoute,
3572
- resolveIntegrationPlugins
3733
+ resolveIntegrationAllowedOrigins,
3734
+ resolveIntegrationPlugins,
3735
+ validateIntegrationRequestOrigin
3573
3736
  });
3574
3737
  //# sourceMappingURL=integrations.cjs.map