@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
package/dist/server.cjs CHANGED
@@ -922,6 +922,29 @@ var init_search_params = __esm({
922
922
  }
923
923
  });
924
924
 
925
+ // src/utils/runtime-env.ts
926
+ function getFarmRuntimeBindings() {
927
+ const runtimeBindings = globalThis.__env__;
928
+ return runtimeBindings && typeof runtimeBindings === "object" ? runtimeBindings : void 0;
929
+ }
930
+ function readFarmEnvironmentValue(name2) {
931
+ const runtimeValue = getFarmRuntimeBindings()?.[name2];
932
+ if (typeof runtimeValue === "string") return runtimeValue;
933
+ return typeof process !== "undefined" ? process.env?.[name2] : void 0;
934
+ }
935
+ function isFarmDeployedRuntime() {
936
+ if (getFarmRuntimeBindings()) return true;
937
+ return readFarmEnvironmentValue("NODE_ENV") === "production";
938
+ }
939
+ var init_runtime_env = __esm({
940
+ "src/utils/runtime-env.ts"() {
941
+ "use strict";
942
+ __name(getFarmRuntimeBindings, "getFarmRuntimeBindings");
943
+ __name(readFarmEnvironmentValue, "readFarmEnvironmentValue");
944
+ __name(isFarmDeployedRuntime, "isFarmDeployedRuntime");
945
+ }
946
+ });
947
+
925
948
  // src/utils/decode.ts
926
949
  function decodeRouteSegment(segment) {
927
950
  try {
@@ -1491,7 +1514,8 @@ function resolveWorkflowsConfig(workflows) {
1491
1514
  dirs,
1492
1515
  route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),
1493
1516
  secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,
1494
- secret: options.secret
1517
+ secret: options.secret,
1518
+ allowUnsecured: options.allowUnsecured === true
1495
1519
  };
1496
1520
  }
1497
1521
  async function discoverFarmWorkflows(config, options = {}) {
@@ -1617,8 +1641,11 @@ async function prepareFarmWorkflowsForNitro(config) {
1617
1641
  await fs16.mkdir(generatedDir, { recursive: true });
1618
1642
  const tasks = {};
1619
1643
  const scheduledTasks = createScheduledTasks(workflows);
1644
+ const wrapperNames = resolveWorkflowWrapperFileNames(workflows.map((workflow) => workflow.id));
1620
1645
  for (const workflow of workflows) {
1621
- const wrapperPath = toPosixPath(path37.join(generatedDir, `${safeFileName(workflow.id)}.mjs`));
1646
+ const wrapperPath = toPosixPath(
1647
+ path37.join(generatedDir, `${wrapperNames.get(workflow.id)}.mjs`)
1648
+ );
1622
1649
  await fs16.writeFile(wrapperPath, createNitroTaskWrapper(workflow), "utf8");
1623
1650
  tasks[workflow.id] = {
1624
1651
  handler: wrapperPath,
@@ -1979,8 +2006,16 @@ function readScheduledTime(payload) {
1979
2006
  return payload && typeof payload === "object" && "scheduledTime" in payload ? payload.scheduledTime : void 0;
1980
2007
  }
1981
2008
  function verifyWorkflowSecret(request, config) {
1982
- const secret = config.secret || process.env[config.secretEnv] || "";
1983
- if (!secret) return null;
2009
+ const secret = config.secret || readFarmEnvironmentValue(config.secretEnv) || "";
2010
+ if (!secret) {
2011
+ if (config.allowUnsecured === true || !isFarmDeployedRuntime()) return null;
2012
+ return Response.json(
2013
+ {
2014
+ error: "Workflow route requires a secret. Set the CRON_SECRET environment variable, configure workflows.secret, or set workflows.allowUnsecured to true."
2015
+ },
2016
+ { status: 401 }
2017
+ );
2018
+ }
1984
2019
  const authorization = request.headers.get("authorization") || "";
1985
2020
  const bearer = authorization.match(/^Bearer\s+(.+)$/i)?.[1] || "";
1986
2021
  const headerSecret = request.headers.get("x-farm-workflow-secret") || "";
@@ -1993,6 +2028,37 @@ function joinRoute(...parts) {
1993
2028
  function trimSlashes(value) {
1994
2029
  return value.replace(/^\/+|\/+$/g, "");
1995
2030
  }
2031
+ function resolveWorkflowWrapperFileNames(ids) {
2032
+ const groups = /* @__PURE__ */ new Map();
2033
+ for (const id of ids) {
2034
+ const key = safeFileName(id).toLowerCase();
2035
+ groups.set(key, (groups.get(key) ?? 0) + 1);
2036
+ }
2037
+ const resolved = /* @__PURE__ */ new Map();
2038
+ const claimed = /* @__PURE__ */ new Map();
2039
+ for (const id of ids) {
2040
+ const base = safeFileName(id);
2041
+ const key = base.toLowerCase();
2042
+ const fileName = (groups.get(key) ?? 0) > 1 ? `${key}-${workflowIdFingerprint(id)}` : base;
2043
+ const claimedBy = claimed.get(fileName.toLowerCase());
2044
+ if (claimedBy !== void 0) {
2045
+ throw new Error(
2046
+ `Farm workflows ${JSON.stringify(claimedBy)} and ${JSON.stringify(id)} generate the same wrapper file ${JSON.stringify(`${fileName}.mjs`)}. Rename one of them.`
2047
+ );
2048
+ }
2049
+ claimed.set(fileName.toLowerCase(), id);
2050
+ resolved.set(id, fileName);
2051
+ }
2052
+ return resolved;
2053
+ }
2054
+ function workflowIdFingerprint(value) {
2055
+ let hash = 2166136261;
2056
+ for (let index = 0; index < value.length; index += 1) {
2057
+ hash ^= value.charCodeAt(index);
2058
+ hash = Math.imul(hash, 16777619);
2059
+ }
2060
+ return (hash >>> 0).toString(16).padStart(8, "0");
2061
+ }
1996
2062
  function safeFileName(value) {
1997
2063
  return value.replace(/[^a-zA-Z0-9._-]+/g, "-") || "workflow";
1998
2064
  }
@@ -2005,6 +2071,7 @@ var init_workflows = __esm({
2005
2071
  "use strict";
2006
2072
  init_server_http();
2007
2073
  init_search_params();
2074
+ init_runtime_env();
2008
2075
  init_decode();
2009
2076
  init_utils();
2010
2077
  init_route_pattern();
@@ -2044,6 +2111,8 @@ var init_workflows = __esm({
2044
2111
  __name(verifyWorkflowSecret, "verifyWorkflowSecret");
2045
2112
  __name(joinRoute, "joinRoute");
2046
2113
  __name(trimSlashes, "trimSlashes");
2114
+ __name(resolveWorkflowWrapperFileNames, "resolveWorkflowWrapperFileNames");
2115
+ __name(workflowIdFingerprint, "workflowIdFingerprint");
2047
2116
  __name(safeFileName, "safeFileName");
2048
2117
  __name(relativePath, "relativePath");
2049
2118
  }
@@ -2194,6 +2263,7 @@ var init_cron = __esm({
2194
2263
  "src/cron.ts"() {
2195
2264
  "use strict";
2196
2265
  init_utils();
2266
+ init_runtime_env();
2197
2267
  DEFAULT_FARM_CRON_SECRET_ENV = "CRON_SECRET";
2198
2268
  CRON_FIELD_RANGES = [
2199
2269
  [0, 59, "minute"],
@@ -2574,9 +2644,13 @@ function getStorage(namespace) {
2574
2644
  const namespaced = (0, import_unstorage.prefixStorage)(globalStorage, base);
2575
2645
  return {
2576
2646
  ...namespaced,
2577
- async clear() {
2578
- const keys = await namespaced.getKeys();
2579
- await Promise.all(keys.map((key) => namespaced.removeItem(key)));
2647
+ // Scope the wipe to the namespace instead of the whole storage, and keep
2648
+ // the caller's base so `clear("sessions")` cannot take unrelated keys with
2649
+ // it. Dropping the argument silently widens a targeted clear into a
2650
+ // namespace-wide delete.
2651
+ async clear(base2, opts) {
2652
+ const keys = await namespaced.getKeys(base2);
2653
+ await Promise.all(keys.map((key) => namespaced.removeItem(key, opts)));
2580
2654
  }
2581
2655
  };
2582
2656
  }
@@ -3571,6 +3645,114 @@ var init_cache_invalidation = __esm({
3571
3645
  }
3572
3646
  });
3573
3647
 
3648
+ // src/request-origin.ts
3649
+ function getRequestSourceOrigin(request) {
3650
+ const origin = request.headers.get("origin")?.trim();
3651
+ if (origin) {
3652
+ return parseSourceOrigin(origin);
3653
+ }
3654
+ const referer = request.headers.get("referer")?.trim();
3655
+ if (referer) {
3656
+ return parseSourceOrigin(referer);
3657
+ }
3658
+ return { ok: true, origin: null };
3659
+ }
3660
+ function parseSourceOrigin(value) {
3661
+ if (value === "null") {
3662
+ return { ok: false, reason: "opaque-origin" };
3663
+ }
3664
+ try {
3665
+ const parsed = new URL(value);
3666
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
3667
+ return { ok: false, reason: "invalid-origin" };
3668
+ }
3669
+ return { ok: true, origin: parsed.origin };
3670
+ } catch {
3671
+ return { ok: false, reason: "invalid-origin" };
3672
+ }
3673
+ }
3674
+ function matchesHostHeader(sourceOrigin, request) {
3675
+ const host = request.headers.get("host")?.trim().toLowerCase();
3676
+ if (!host) return false;
3677
+ try {
3678
+ const source = new URL(sourceOrigin);
3679
+ const target = new URL(request.url);
3680
+ return source.protocol === target.protocol && source.host.toLowerCase() === host;
3681
+ } catch {
3682
+ return false;
3683
+ }
3684
+ }
3685
+ function matchesAllowedOrigin(sourceOrigin, pattern) {
3686
+ const source = new URL(sourceOrigin);
3687
+ if (!pattern.includes("*")) {
3688
+ return pattern.includes("://") ? source.origin === pattern : source.host === pattern;
3689
+ }
3690
+ const schemeEnd = pattern.indexOf("://");
3691
+ const scheme = schemeEnd === -1 ? null : pattern.slice(0, schemeEnd + 1);
3692
+ const hostPattern = pattern.slice(schemeEnd === -1 ? 0 : schemeEnd + 3);
3693
+ const [wildcardHost, port] = splitHostAndPort(hostPattern);
3694
+ const baseHost = wildcardHost.slice(2);
3695
+ if (scheme && source.protocol !== scheme) return false;
3696
+ if (port && getEffectivePort(source) !== port) return false;
3697
+ if (!port && source.port) return false;
3698
+ return source.hostname.endsWith(`.${baseHost}`) && source.hostname !== baseHost;
3699
+ }
3700
+ function normalizeAllowedOriginPattern(value, label) {
3701
+ const pattern = value.trim().toLowerCase();
3702
+ if (!pattern) {
3703
+ throw new TypeError(`${label} cannot contain empty values`);
3704
+ }
3705
+ if (pattern.includes("*")) {
3706
+ if (!/^(?:https?:\/\/)?\*\.[a-z0-9.-]+(?::\d+)?$/.test(pattern)) {
3707
+ throw new TypeError(`Invalid ${label} pattern: ${JSON.stringify(value)}`);
3708
+ }
3709
+ return pattern;
3710
+ }
3711
+ if (pattern.includes("://")) {
3712
+ let parsed;
3713
+ try {
3714
+ parsed = new URL(pattern);
3715
+ } catch {
3716
+ throw new TypeError(`Invalid ${label} value: ${JSON.stringify(value)}`);
3717
+ }
3718
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
3719
+ throw new TypeError(`${label} must contain origins without paths: ${JSON.stringify(value)}`);
3720
+ }
3721
+ return parsed.origin;
3722
+ }
3723
+ if (/[/@?#]/.test(pattern)) {
3724
+ throw new TypeError(`${label} must contain origins or hosts: ${JSON.stringify(value)}`);
3725
+ }
3726
+ try {
3727
+ return new URL(`http://${pattern}`).host;
3728
+ } catch {
3729
+ throw new TypeError(`Invalid ${label} value: ${JSON.stringify(value)}`);
3730
+ }
3731
+ }
3732
+ function splitHostAndPort(value) {
3733
+ const separator = value.lastIndexOf(":");
3734
+ if (separator === -1) return [value, null];
3735
+ return [value.slice(0, separator), value.slice(separator + 1)];
3736
+ }
3737
+ function getEffectivePort(url) {
3738
+ if (url.port) return url.port;
3739
+ if (url.protocol === "https:") return "443";
3740
+ if (url.protocol === "http:") return "80";
3741
+ return "";
3742
+ }
3743
+ var init_request_origin = __esm({
3744
+ "src/request-origin.ts"() {
3745
+ "use strict";
3746
+ __name(getRequestSourceOrigin, "getRequestSourceOrigin");
3747
+ __name(parseSourceOrigin, "parseSourceOrigin");
3748
+ __name(matchesHostHeader, "matchesHostHeader");
3749
+ __name(matchesAllowedOrigin, "matchesAllowedOrigin");
3750
+ __name(normalizeAllowedOriginPattern, "normalizeAllowedOriginPattern");
3751
+ __name(splitHostAndPort, "splitHostAndPort");
3752
+ __name(getEffectivePort, "getEffectivePort");
3753
+ }
3754
+ });
3755
+
3574
3756
  // src/server-fn-error.ts
3575
3757
  function isServerFnFailure(value) {
3576
3758
  if (!value || typeof value !== "object") return false;
@@ -3614,7 +3796,9 @@ var init_server_fn_error = __esm({
3614
3796
 
3615
3797
  // src/server-action-security.ts
3616
3798
  function resolveServerActionsConfig(config) {
3617
- const allowedOrigins = (config?.allowedOrigins ?? []).map(normalizeAllowedOriginPattern);
3799
+ const allowedOrigins = (config?.allowedOrigins ?? []).map(
3800
+ (value) => normalizeAllowedOriginPattern(value, SERVER_ACTION_ALLOWED_ORIGINS_LABEL)
3801
+ );
3618
3802
  const bodySizeLimit = parseBodySizeLimit(
3619
3803
  config?.bodySizeLimit ?? DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT,
3620
3804
  "serverActions.bodySizeLimit"
@@ -3633,7 +3817,7 @@ function validateServerActionRequest(request, config) {
3633
3817
  );
3634
3818
  }
3635
3819
  const requestUrl = new URL(request.url);
3636
- const sourceOrigin = getRequestSourceOrigin(request);
3820
+ const sourceOrigin = resolveSourceOrigin(request);
3637
3821
  const fetchSite = request.headers.get("sec-fetch-site")?.trim().toLowerCase();
3638
3822
  if (!sourceOrigin) {
3639
3823
  if (fetchSite !== "same-origin") {
@@ -3749,103 +3933,16 @@ function getFallbackAbortController() {
3749
3933
  }
3750
3934
  return globalState2[FALLBACK_ABORT_CONTROLLER_KEY];
3751
3935
  }
3752
- function normalizeAllowedOriginPattern(value) {
3753
- const pattern = value.trim().toLowerCase();
3754
- if (!pattern) {
3755
- throw new TypeError("serverActions.allowedOrigins cannot contain empty values");
3756
- }
3757
- if (pattern.includes("*")) {
3758
- if (!/^(?:https?:\/\/)?\*\.[a-z0-9.-]+(?::\d+)?$/.test(pattern)) {
3759
- throw new TypeError(`Invalid serverActions.allowedOrigins pattern: ${JSON.stringify(value)}`);
3760
- }
3761
- return pattern;
3762
- }
3763
- if (pattern.includes("://")) {
3764
- let parsed;
3765
- try {
3766
- parsed = new URL(pattern);
3767
- } catch {
3768
- throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);
3769
- }
3770
- if (parsed.protocol !== "http:" && parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
3771
- throw new TypeError(
3772
- `serverActions.allowedOrigins must contain origins without paths: ${JSON.stringify(value)}`
3773
- );
3774
- }
3775
- return parsed.origin;
3776
- }
3777
- if (/[/@?#]/.test(pattern)) {
3778
- throw new TypeError(
3779
- `serverActions.allowedOrigins must contain origins or hosts: ${JSON.stringify(value)}`
3936
+ function resolveSourceOrigin(request) {
3937
+ const result = getRequestSourceOrigin(request);
3938
+ if (!result.ok) {
3939
+ throw new ServerActionRequestError(
3940
+ "INVALID_ORIGIN",
3941
+ 403,
3942
+ result.reason === "opaque-origin" ? "Opaque origins are not allowed" : "Invalid request origin"
3780
3943
  );
3781
3944
  }
3782
- try {
3783
- return new URL(`http://${pattern}`).host;
3784
- } catch {
3785
- throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);
3786
- }
3787
- }
3788
- function getRequestSourceOrigin(request) {
3789
- const origin = request.headers.get("origin")?.trim();
3790
- if (origin) {
3791
- return parseSourceOrigin(origin);
3792
- }
3793
- const referer = request.headers.get("referer")?.trim();
3794
- if (referer) {
3795
- return parseSourceOrigin(referer);
3796
- }
3797
- return null;
3798
- }
3799
- function parseSourceOrigin(value) {
3800
- if (value === "null") {
3801
- throw new ServerActionRequestError("INVALID_ORIGIN", 403, "Opaque origins are not allowed");
3802
- }
3803
- try {
3804
- const parsed = new URL(value);
3805
- if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
3806
- throw new Error("Unsupported protocol");
3807
- }
3808
- return parsed.origin;
3809
- } catch {
3810
- throw new ServerActionRequestError("INVALID_ORIGIN", 403, "Invalid request origin");
3811
- }
3812
- }
3813
- function matchesHostHeader(sourceOrigin, request) {
3814
- const host = request.headers.get("host")?.trim().toLowerCase();
3815
- if (!host) return false;
3816
- try {
3817
- const source = new URL(sourceOrigin);
3818
- const target = new URL(request.url);
3819
- return source.protocol === target.protocol && source.host.toLowerCase() === host;
3820
- } catch {
3821
- return false;
3822
- }
3823
- }
3824
- function matchesAllowedOrigin(sourceOrigin, pattern) {
3825
- const source = new URL(sourceOrigin);
3826
- if (!pattern.includes("*")) {
3827
- return pattern.includes("://") ? source.origin === pattern : source.host === pattern;
3828
- }
3829
- const schemeEnd = pattern.indexOf("://");
3830
- const scheme = schemeEnd === -1 ? null : pattern.slice(0, schemeEnd + 1);
3831
- const hostPattern = pattern.slice(schemeEnd === -1 ? 0 : schemeEnd + 3);
3832
- const [wildcardHost, port] = splitHostAndPort(hostPattern);
3833
- const baseHost = wildcardHost.slice(2);
3834
- if (scheme && source.protocol !== scheme) return false;
3835
- if (port && getEffectivePort(source) !== port) return false;
3836
- if (!port && source.port) return false;
3837
- return source.hostname.endsWith(`.${baseHost}`) && source.hostname !== baseHost;
3838
- }
3839
- function splitHostAndPort(value) {
3840
- const separator = value.lastIndexOf(":");
3841
- if (separator === -1) return [value, null];
3842
- return [value.slice(0, separator), value.slice(separator + 1)];
3843
- }
3844
- function getEffectivePort(url) {
3845
- if (url.port) return url.port;
3846
- if (url.protocol === "https:") return "443";
3847
- if (url.protocol === "http:") return "80";
3848
- return "";
3945
+ return result.origin;
3849
3946
  }
3850
3947
  function validateActionId(actionId) {
3851
3948
  if (!actionId || actionId.length > 4096 || hasControlCharacters(actionId)) {
@@ -3966,14 +4063,16 @@ function throwIfAborted2(signal) {
3966
4063
  if (signal.reason !== void 0) throw signal.reason;
3967
4064
  throw new DOMException("The operation was aborted", "AbortError");
3968
4065
  }
3969
- var import_node_async_hooks, DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT, _ServerActionRequestError, ServerActionRequestError, SERVER_ACTION_STORAGE_KEY, FALLBACK_ABORT_CONTROLLER_KEY, FORM_ACTION_CONTENT_TYPES, JAVASCRIPT_ACTION_CONTENT_TYPES;
4066
+ var import_node_async_hooks, SERVER_ACTION_ALLOWED_ORIGINS_LABEL, DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT, _ServerActionRequestError, ServerActionRequestError, SERVER_ACTION_STORAGE_KEY, FALLBACK_ABORT_CONTROLLER_KEY, FORM_ACTION_CONTENT_TYPES, JAVASCRIPT_ACTION_CONTENT_TYPES;
3970
4067
  var init_server_action_security = __esm({
3971
4068
  "src/server-action-security.ts"() {
3972
4069
  "use strict";
3973
4070
  import_node_async_hooks = require("async_hooks");
3974
4071
  init_cache_invalidation();
4072
+ init_request_origin();
3975
4073
  init_server_fn_error();
3976
4074
  init_server_http();
4075
+ SERVER_ACTION_ALLOWED_ORIGINS_LABEL = "serverActions.allowedOrigins";
3977
4076
  DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT = 1e6;
3978
4077
  _ServerActionRequestError = class _ServerActionRequestError extends Error {
3979
4078
  constructor(code, status, message) {
@@ -4014,13 +4113,7 @@ var init_server_action_security = __esm({
4014
4113
  });
4015
4114
  __name(getServerActionStorage, "getServerActionStorage");
4016
4115
  __name(getFallbackAbortController, "getFallbackAbortController");
4017
- __name(normalizeAllowedOriginPattern, "normalizeAllowedOriginPattern");
4018
- __name(getRequestSourceOrigin, "getRequestSourceOrigin");
4019
- __name(parseSourceOrigin, "parseSourceOrigin");
4020
- __name(matchesHostHeader, "matchesHostHeader");
4021
- __name(matchesAllowedOrigin, "matchesAllowedOrigin");
4022
- __name(splitHostAndPort, "splitHostAndPort");
4023
- __name(getEffectivePort, "getEffectivePort");
4116
+ __name(resolveSourceOrigin, "resolveSourceOrigin");
4024
4117
  __name(validateActionId, "validateActionId");
4025
4118
  __name(hasControlCharacters, "hasControlCharacters");
4026
4119
  __name(getSupportedContentType, "getSupportedContentType");
@@ -6398,6 +6491,14 @@ var init_routes = __esm({
6398
6491
  }
6399
6492
  });
6400
6493
 
6494
+ // src/integration-request-security.ts
6495
+ var init_integration_request_security = __esm({
6496
+ "src/integration-request-security.ts"() {
6497
+ "use strict";
6498
+ init_request_origin();
6499
+ }
6500
+ });
6501
+
6401
6502
  // src/integration-api.ts
6402
6503
  function defineIntegrationAPIOperation(operation) {
6403
6504
  return {
@@ -8573,6 +8674,7 @@ var init_integrations = __esm({
8573
8674
  "src/integrations.ts"() {
8574
8675
  "use strict";
8575
8676
  init_route_pattern();
8677
+ init_integration_request_security();
8576
8678
  init_integration_api();
8577
8679
  init_plugin_integration_context();
8578
8680
  init_decode();
@@ -10338,10 +10440,11 @@ function createFarmImageHandler(config, options) {
10338
10440
  "quality"
10339
10441
  );
10340
10442
  const accept = request.headers.get("accept") ?? "";
10443
+ const negotiatedFormat = selectOutputFormat(accept, config.formats) ?? "";
10341
10444
  const cacheKey = `${sourceUrl.href}
10342
10445
  ${width}
10343
10446
  ${quality}
10344
- ${accept}`;
10447
+ ${negotiatedFormat}`;
10345
10448
  let optimized = cache.get(cacheKey);
10346
10449
  if (!optimized) {
10347
10450
  const fetchedSource = await fetchImageSource(
@@ -10368,7 +10471,8 @@ ${accept}`;
10368
10471
  quality,
10369
10472
  accept,
10370
10473
  formats: config.formats,
10371
- signal: request.signal
10474
+ signal: request.signal,
10475
+ maximumResponseBody: config.maximumResponseBody
10372
10476
  });
10373
10477
  throwIfAborted3(request.signal);
10374
10478
  validateTransformedResult(result, config);
@@ -10699,7 +10803,7 @@ function throwIfAborted3(signal) {
10699
10803
  function isAbortError(error) {
10700
10804
  return error instanceof Error && error.name === "AbortError";
10701
10805
  }
10702
- var _FarmImageRequestError, FarmImageRequestError, _FarmImageMemoryCache, FarmImageMemoryCache;
10806
+ var _FarmImageRequestError, FarmImageRequestError, DEFAULT_IMAGE_TRANSFORM_BODY_LIMIT, _FarmImageMemoryCache, FarmImageMemoryCache;
10703
10807
  var init_image_server = __esm({
10704
10808
  "src/image-server.ts"() {
10705
10809
  "use strict";
@@ -10715,6 +10819,7 @@ var init_image_server = __esm({
10715
10819
  __name(_FarmImageRequestError, "FarmImageRequestError");
10716
10820
  FarmImageRequestError = _FarmImageRequestError;
10717
10821
  __name(createFarmImageHandler, "createFarmImageHandler");
10822
+ DEFAULT_IMAGE_TRANSFORM_BODY_LIMIT = 10 * 1024 * 1024;
10718
10823
  __name(selectOutputFormat, "selectOutputFormat");
10719
10824
  __name(isPrivateImageAddress, "isPrivateImageAddress");
10720
10825
  __name(parseAllowedInteger, "parseAllowedInteger");
@@ -23907,7 +24012,7 @@ _setFarmThemeServerSnapshotResolver(() => {
23907
24012
  });
23908
24013
 
23909
24014
  // package.json
23910
- var version = "0.1.0-beta.97";
24015
+ var version = "0.1.0-beta.98";
23911
24016
 
23912
24017
  // src/version.ts
23913
24018
  var FARM_VERSION = version;