devflare 1.0.0-next.19 → 1.0.0-next.20

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 (360) hide show
  1. package/LLM.md +6807 -888
  2. package/README.md +375 -957
  3. package/dist/account-05zgta47.js +475 -0
  4. package/dist/account-b2ag1esh.js +475 -0
  5. package/dist/account-bxtcz61a.js +475 -0
  6. package/dist/account-gyfqg964.js +475 -0
  7. package/dist/account-q6pvs9d9.js +475 -0
  8. package/dist/account-rp4zbvw1.js +475 -0
  9. package/dist/bridge/client.d.ts +5 -0
  10. package/dist/bridge/client.d.ts.map +1 -1
  11. package/dist/bridge/gateway-runtime.d.ts +1 -1
  12. package/dist/bridge/gateway-runtime.d.ts.map +1 -1
  13. package/dist/bridge/miniflare.d.ts +67 -0
  14. package/dist/bridge/miniflare.d.ts.map +1 -1
  15. package/dist/bridge/proxy.d.ts +2 -1
  16. package/dist/bridge/proxy.d.ts.map +1 -1
  17. package/dist/bridge/server.d.ts.map +1 -1
  18. package/dist/browser.d.ts +2520 -40
  19. package/dist/browser.d.ts.map +1 -1
  20. package/dist/browser.js +3 -3
  21. package/dist/build-2s5paw5p.js +54 -0
  22. package/dist/build-4c350cp7.js +54 -0
  23. package/dist/build-e7wym63t.js +54 -0
  24. package/dist/build-ge6qp3t4.js +54 -0
  25. package/dist/build-ta8c6t11.js +54 -0
  26. package/dist/build-wvjj8f28.js +54 -0
  27. package/dist/build-ypg6f2kw.js +54 -0
  28. package/dist/build-yts8wwgf.js +54 -0
  29. package/dist/build-yzkdqexs.js +54 -0
  30. package/dist/cli/build-manifest.d.ts +12 -0
  31. package/dist/cli/build-manifest.d.ts.map +1 -1
  32. package/dist/cli/commands/deploy/metadata.d.ts +18 -0
  33. package/dist/cli/commands/deploy/metadata.d.ts.map +1 -0
  34. package/dist/cli/commands/deploy/prepare.d.ts +23 -0
  35. package/dist/cli/commands/deploy/prepare.d.ts.map +1 -0
  36. package/dist/cli/commands/deploy/runtime.d.ts +4 -0
  37. package/dist/cli/commands/deploy/runtime.d.ts.map +1 -0
  38. package/dist/cli/commands/deploy/verification.d.ts +36 -0
  39. package/dist/cli/commands/deploy/verification.d.ts.map +1 -0
  40. package/dist/cli/commands/deploy.d.ts +2 -2
  41. package/dist/cli/commands/deploy.d.ts.map +1 -1
  42. package/dist/cli/commands/secrets.d.ts +4 -0
  43. package/dist/cli/commands/secrets.d.ts.map +1 -0
  44. package/dist/cli/commands/type-generation/generator.d.ts +67 -1
  45. package/dist/cli/commands/type-generation/generator.d.ts.map +1 -1
  46. package/dist/cli/help-pages/pages/core.d.ts +1 -1
  47. package/dist/cli/help-pages/pages/core.d.ts.map +1 -1
  48. package/dist/cli/help-pages/shared.d.ts +1 -1
  49. package/dist/cli/help-pages/shared.d.ts.map +1 -1
  50. package/dist/cli/index.d.ts.map +1 -1
  51. package/dist/cli/index.js +2 -2
  52. package/dist/cli/package-metadata.d.ts.map +1 -1
  53. package/dist/cli/preview-bindings.d.ts.map +1 -1
  54. package/dist/cloudflare/index.js +2 -2
  55. package/dist/cloudflare/preview-registry-store.d.ts +1 -1
  56. package/dist/cloudflare/preview-registry-store.d.ts.map +1 -1
  57. package/dist/cloudflare/types.d.ts +1 -1
  58. package/dist/cloudflare/types.d.ts.map +1 -1
  59. package/dist/config/binding-resolution-helpers.d.ts +5 -0
  60. package/dist/config/binding-resolution-helpers.d.ts.map +1 -1
  61. package/dist/config/compiler/bindings.d.ts +14 -0
  62. package/dist/config/compiler/bindings.d.ts.map +1 -0
  63. package/dist/config/compiler/core-helpers.d.ts +6 -0
  64. package/dist/config/compiler/core-helpers.d.ts.map +1 -0
  65. package/dist/config/compiler/do-workers.d.ts +34 -0
  66. package/dist/config/compiler/do-workers.d.ts.map +1 -0
  67. package/dist/config/compiler/paths.d.ts +18 -0
  68. package/dist/config/compiler/paths.d.ts.map +1 -0
  69. package/dist/config/compiler/types.d.ts +267 -0
  70. package/dist/config/compiler/types.d.ts.map +1 -0
  71. package/dist/config/compiler.d.ts +11 -175
  72. package/dist/config/compiler.d.ts.map +1 -1
  73. package/dist/config/deploy-resources.d.ts.map +1 -1
  74. package/dist/config/index.d.ts +1 -1
  75. package/dist/config/index.d.ts.map +1 -1
  76. package/dist/config/local-dev-vars.d.ts +15 -0
  77. package/dist/config/local-dev-vars.d.ts.map +1 -0
  78. package/dist/config/preview-resources.d.ts.map +1 -1
  79. package/dist/config/preview.d.ts.map +1 -1
  80. package/dist/config/resolve.d.ts.map +1 -1
  81. package/dist/config/resource-resolution.d.ts.map +1 -1
  82. package/dist/config/schema-bindings.d.ts +559 -19
  83. package/dist/config/schema-bindings.d.ts.map +1 -1
  84. package/dist/config/schema-env.d.ts +1306 -34
  85. package/dist/config/schema-env.d.ts.map +1 -1
  86. package/dist/config/schema-normalization.d.ts +97 -1
  87. package/dist/config/schema-normalization.d.ts.map +1 -1
  88. package/dist/config/schema-runtime.d.ts +245 -7
  89. package/dist/config/schema-runtime.d.ts.map +1 -1
  90. package/dist/config/schema.d.ts +2976 -57
  91. package/dist/config/schema.d.ts.map +1 -1
  92. package/dist/config-6m0n7d84.js +59 -0
  93. package/dist/config-7cf004ag.js +59 -0
  94. package/dist/config-b98dp58n.js +59 -0
  95. package/dist/config-cf3djhqy.js +59 -0
  96. package/dist/config-entry.js +1 -1
  97. package/dist/config-wa7hm0w9.js +59 -0
  98. package/dist/deploy-1jfagtn9.js +1055 -0
  99. package/dist/deploy-2afw0jfg.js +1055 -0
  100. package/dist/deploy-2fzj68kq.js +1055 -0
  101. package/dist/deploy-57nzn9wj.js +1045 -0
  102. package/dist/deploy-asyryrvm.js +1055 -0
  103. package/dist/deploy-hc927rw6.js +1045 -0
  104. package/dist/deploy-pnnf8tgy.js +1045 -0
  105. package/dist/deploy-q33bw715.js +1055 -0
  106. package/dist/deploy-tmdgecs3.js +1055 -0
  107. package/dist/deploy-v0y8kczr.js +1055 -0
  108. package/dist/deploy-xhj6zbcx.js +1055 -0
  109. package/dist/dev-1mvcts8w.js +2515 -0
  110. package/dist/dev-2a283xts.js +2515 -0
  111. package/dist/dev-62nhytf8.js +2505 -0
  112. package/dist/dev-75acm2xj.js +2478 -0
  113. package/dist/dev-802rg9dp.js +2515 -0
  114. package/dist/dev-d1bb2t0f.js +2515 -0
  115. package/dist/dev-dwry8494.js +2489 -0
  116. package/dist/dev-g6112y4w.js +2515 -0
  117. package/dist/dev-h2kneh95.js +2496 -0
  118. package/dist/dev-kybq3mwr.js +2489 -0
  119. package/dist/dev-n8qndkyg.js +2512 -0
  120. package/dist/dev-p32fkbwf.js +2489 -0
  121. package/dist/dev-qm9d4mfh.js +2478 -0
  122. package/dist/dev-rcthnse5.js +2473 -0
  123. package/dist/dev-server/dev-server-state.d.ts +1 -0
  124. package/dist/dev-server/dev-server-state.d.ts.map +1 -1
  125. package/dist/dev-server/miniflare-bindings.d.ts +44 -1
  126. package/dist/dev-server/miniflare-bindings.d.ts.map +1 -1
  127. package/dist/dev-server/miniflare-dev-config.d.ts +1 -0
  128. package/dist/dev-server/miniflare-dev-config.d.ts.map +1 -1
  129. package/dist/dev-server/miniflare-log.d.ts +8 -0
  130. package/dist/dev-server/miniflare-log.d.ts.map +1 -1
  131. package/dist/dev-server/miniflare-worker-config.d.ts +31 -1
  132. package/dist/dev-server/miniflare-worker-config.d.ts.map +1 -1
  133. package/dist/dev-server/server.d.ts.map +1 -1
  134. package/dist/dev-server/vite-process.d.ts +1 -0
  135. package/dist/dev-server/vite-process.d.ts.map +1 -1
  136. package/dist/dev-tgwja5mz.js +2496 -0
  137. package/dist/doctor-2shhdak6.js +245 -0
  138. package/dist/doctor-5g73w40j.js +245 -0
  139. package/dist/doctor-gamefzcs.js +245 -0
  140. package/dist/doctor-rn53ctfs.js +245 -0
  141. package/dist/index-01kehw41.js +348 -0
  142. package/dist/index-06bg0z9y.js +185 -0
  143. package/dist/index-0d7tw5r4.js +136 -0
  144. package/dist/index-0m6e4mxz.js +133 -0
  145. package/dist/index-0vah20er.js +1410 -0
  146. package/dist/index-0wa0ebm1.js +68 -0
  147. package/dist/index-1714y3cz.js +1410 -0
  148. package/dist/index-1qs5gcm7.js +895 -0
  149. package/dist/index-29k04v43.js +574 -0
  150. package/dist/index-2jywf4pz.js +1372 -0
  151. package/dist/index-2qhk9nbx.js +1372 -0
  152. package/dist/index-2vq6bveq.js +574 -0
  153. package/dist/index-36h8gkhb.js +1088 -0
  154. package/dist/index-38fq7pww.js +560 -0
  155. package/dist/index-3bxqn033.js +1410 -0
  156. package/dist/index-3jme4hgw.js +1234 -0
  157. package/dist/index-3p7s9mk9.js +360 -0
  158. package/dist/index-47w35sft.js +244 -0
  159. package/dist/index-4by4c7rm.js +52 -0
  160. package/dist/index-4phjwd6h.js +412 -0
  161. package/dist/index-4z5jrw0j.js +594 -0
  162. package/dist/index-51mzqy0d.js +895 -0
  163. package/dist/index-53pqqpq9.js +74 -0
  164. package/dist/index-5enq8ntr.js +1766 -0
  165. package/dist/index-5fnq9r9m.js +1410 -0
  166. package/dist/index-5w9f2b17.js +695 -0
  167. package/dist/index-627srx16.js +45 -0
  168. package/dist/index-6bqgf5x8.js +227 -0
  169. package/dist/index-6xknvbyk.js +1088 -0
  170. package/dist/index-7ef3ktz5.js +1372 -0
  171. package/dist/index-7hpjfdzh.js +185 -0
  172. package/dist/index-8052df4m.js +627 -0
  173. package/dist/index-82epjzrr.js +1410 -0
  174. package/dist/index-82z7rvz6.js +1238 -0
  175. package/dist/index-8atc1yb9.js +68 -0
  176. package/dist/index-8tj0awnv.js +476 -0
  177. package/dist/index-8x745h59.js +1069 -0
  178. package/dist/index-9bawzcny.js +574 -0
  179. package/dist/index-9bjjqdfc.js +236 -0
  180. package/dist/index-9d7x3vfr.js +236 -0
  181. package/dist/index-9nf8zs4p.js +1069 -0
  182. package/dist/index-acwbmagz.js +412 -0
  183. package/dist/index-aqjdaem7.js +74 -0
  184. package/dist/index-b6448fd0.js +133 -0
  185. package/dist/index-b9j55r7q.js +240 -0
  186. package/dist/index-bdatd1za.js +1372 -0
  187. package/dist/index-c3nxftnp.js +699 -0
  188. package/dist/index-c643s0gv.js +488 -0
  189. package/dist/index-d2md1j3d.js +185 -0
  190. package/dist/index-dbr6bfz6.js +528 -0
  191. package/dist/index-dd1g0g7e.js +360 -0
  192. package/dist/index-dktb9az5.js +1372 -0
  193. package/dist/index-dm9q84c7.js +360 -0
  194. package/dist/index-f51mkh13.js +1088 -0
  195. package/dist/index-f86n1fpd.js +55 -0
  196. package/dist/index-fnk0tkw7.js +412 -0
  197. package/dist/index-g5aq66bj.js +1534 -0
  198. package/dist/index-gj5qh491.js +54 -0
  199. package/dist/index-gq39t0rx.js +895 -0
  200. package/dist/index-h5dqna7q.js +1410 -0
  201. package/dist/index-hjs9j2g9.js +895 -0
  202. package/dist/index-hn5nbxbt.js +147 -0
  203. package/dist/index-hpjh0qjx.js +1723 -0
  204. package/dist/index-hs6ekcfs.js +412 -0
  205. package/dist/index-jdzrvnfj.js +52 -0
  206. package/dist/index-jg720mq7.js +476 -0
  207. package/dist/index-jrzddxvt.js +2167 -0
  208. package/dist/index-kgstnk6g.js +239 -0
  209. package/dist/index-khnw972v.js +117 -0
  210. package/dist/index-kwqff3ba.js +1410 -0
  211. package/dist/index-m2v0fj08.js +74 -0
  212. package/dist/index-mjve6tqn.js +447 -0
  213. package/dist/index-mkxzgn0q.js +1372 -0
  214. package/dist/index-mzmq3v0d.js +1088 -0
  215. package/dist/index-ng9n3znd.js +1372 -0
  216. package/dist/index-nhbkm2ba.js +467 -0
  217. package/dist/index-nrfhk0k5.js +1088 -0
  218. package/dist/index-p0zppqxm.js +467 -0
  219. package/dist/index-pkxf6h87.js +895 -0
  220. package/dist/index-pqp4312v.js +52 -0
  221. package/dist/index-pw9jn6kz.js +574 -0
  222. package/dist/index-q31ne0xa.js +412 -0
  223. package/dist/index-qf2dkqxh.js +249 -0
  224. package/dist/index-qmtdf7k5.js +639 -0
  225. package/dist/index-qwgr4q7s.js +37 -0
  226. package/dist/index-rab2dfh3.js +494 -0
  227. package/dist/index-rz7rx80s.js +1410 -0
  228. package/dist/index-s37h3jgk.js +572 -0
  229. package/dist/index-sb705m7d.js +52 -0
  230. package/dist/index-syscwrjp.js +1576 -0
  231. package/dist/index-t14zr0ys.js +1063 -0
  232. package/dist/index-tjc99447.js +68 -0
  233. package/dist/index-v35460hf.js +574 -0
  234. package/dist/index-v7q00d1e.js +1410 -0
  235. package/dist/index-vkkmx4xe.js +1372 -0
  236. package/dist/index-vrps1gky.js +2202 -0
  237. package/dist/index-w4c9vmvg.js +1517 -0
  238. package/dist/index-wqd8n2qk.js +574 -0
  239. package/dist/index-x12e6fzy.js +476 -0
  240. package/dist/index-xagpz645.js +2199 -0
  241. package/dist/index-xbth1r6e.js +572 -0
  242. package/dist/index-xm9fqhcb.js +447 -0
  243. package/dist/index-y59hnmd0.js +132 -0
  244. package/dist/index-y7mkb00x.js +133 -0
  245. package/dist/index-z40mjts9.js +212 -0
  246. package/dist/index-z5k5bjc7.js +1218 -0
  247. package/dist/index-z73sytma.js +895 -0
  248. package/dist/index-zjv6apef.js +1410 -0
  249. package/dist/index.js +8 -8
  250. package/dist/init-cwpergap.js +180 -0
  251. package/dist/login-83bjfhvz.js +77 -0
  252. package/dist/login-ddw888xb.js +77 -0
  253. package/dist/login-e7pytkdc.js +77 -0
  254. package/dist/login-fe0brfcr.js +77 -0
  255. package/dist/login-h7sm5trm.js +77 -0
  256. package/dist/login-vd0m3xr4.js +77 -0
  257. package/dist/previews-2wfvsjfy.js +1337 -0
  258. package/dist/previews-31feb8r3.js +1337 -0
  259. package/dist/previews-3w4pxqby.js +1337 -0
  260. package/dist/previews-93ttrf5f.js +1337 -0
  261. package/dist/previews-bdrefjzx.js +1337 -0
  262. package/dist/previews-cfcn56b4.js +1337 -0
  263. package/dist/previews-mssq1hrm.js +1337 -0
  264. package/dist/previews-tcaz1gt8.js +1337 -0
  265. package/dist/productions-4h80j2c7.js +505 -0
  266. package/dist/productions-86jaqt7m.js +505 -0
  267. package/dist/productions-bn2q31my.js +505 -0
  268. package/dist/productions-dv8g7f6g.js +505 -0
  269. package/dist/productions-e2m9s4tr.js +505 -0
  270. package/dist/productions-fgshs1m7.js +505 -0
  271. package/dist/productions-hphmt68n.js +505 -0
  272. package/dist/productions-vhq7yx86.js +505 -0
  273. package/dist/runtime/index.js +8 -8
  274. package/dist/secrets/local-secrets.d.ts +46 -0
  275. package/dist/secrets/local-secrets.d.ts.map +1 -0
  276. package/dist/secrets-8wcj47nh.js +91 -0
  277. package/dist/secrets-b2ww34ta.js +91 -0
  278. package/dist/secrets-b7g4z621.js +91 -0
  279. package/dist/shims/local-media-bindings.d.ts +19 -0
  280. package/dist/shims/local-media-bindings.d.ts.map +1 -0
  281. package/dist/shims/local-worker-loader.d.ts +3 -0
  282. package/dist/shims/local-worker-loader.d.ts.map +1 -0
  283. package/dist/sveltekit/index.js +163 -26
  284. package/dist/sveltekit/local-bindings.d.ts +4 -0
  285. package/dist/sveltekit/local-bindings.d.ts.map +1 -0
  286. package/dist/sveltekit/platform.d.ts +8 -0
  287. package/dist/sveltekit/platform.d.ts.map +1 -1
  288. package/dist/test/ai-search.d.ts +39 -0
  289. package/dist/test/ai-search.d.ts.map +1 -0
  290. package/dist/test/binding-hints.d.ts.map +1 -1
  291. package/dist/test/cf.d.ts +3 -3
  292. package/dist/test/containers.d.ts +87 -0
  293. package/dist/test/containers.d.ts.map +1 -0
  294. package/dist/test/index.d.ts +4 -1
  295. package/dist/test/index.d.ts.map +1 -1
  296. package/dist/test/index.js +2833 -543
  297. package/dist/test/local-worker-loader.d.ts +3 -0
  298. package/dist/test/local-worker-loader.d.ts.map +1 -0
  299. package/dist/test/offline-bindings.d.ts +65 -0
  300. package/dist/test/offline-bindings.d.ts.map +1 -0
  301. package/dist/test/queue.d.ts.map +1 -1
  302. package/dist/test/remote-ai.d.ts.map +1 -1
  303. package/dist/test/should-skip.d.ts +14 -0
  304. package/dist/test/should-skip.d.ts.map +1 -1
  305. package/dist/test/simple-context-bindings.d.ts.map +1 -1
  306. package/dist/test/simple-context-durable-objects.d.ts.map +1 -1
  307. package/dist/test/simple-context-gateway-script.d.ts +1 -1
  308. package/dist/test/simple-context-gateway-script.d.ts.map +1 -1
  309. package/dist/test/simple-context-lifecycle.d.ts.map +1 -1
  310. package/dist/test/simple-context-mfconfig.d.ts +4 -1
  311. package/dist/test/simple-context-mfconfig.d.ts.map +1 -1
  312. package/dist/test/simple-context-multi-worker.d.ts.map +1 -1
  313. package/dist/test/simple-context-startup.d.ts.map +1 -1
  314. package/dist/test/tail.d.ts.map +1 -1
  315. package/dist/test/utilities/artifacts.d.ts +11 -0
  316. package/dist/test/utilities/artifacts.d.ts.map +1 -0
  317. package/dist/test/utilities/context.d.ts +39 -0
  318. package/dist/test/utilities/context.d.ts.map +1 -0
  319. package/dist/test/utilities/d1.d.ts +21 -0
  320. package/dist/test/utilities/d1.d.ts.map +1 -0
  321. package/dist/test/utilities/env.d.ts +40 -0
  322. package/dist/test/utilities/env.d.ts.map +1 -0
  323. package/dist/test/utilities/kv.d.ts +11 -0
  324. package/dist/test/utilities/kv.d.ts.map +1 -0
  325. package/dist/test/utilities/media.d.ts +16 -0
  326. package/dist/test/utilities/media.d.ts.map +1 -0
  327. package/dist/test/utilities/platform.d.ts +38 -0
  328. package/dist/test/utilities/platform.d.ts.map +1 -0
  329. package/dist/test/utilities/queue.d.ts +5 -0
  330. package/dist/test/utilities/queue.d.ts.map +1 -0
  331. package/dist/test/utilities/r2.d.ts +12 -0
  332. package/dist/test/utilities/r2.d.ts.map +1 -0
  333. package/dist/test/utilities/workflows.d.ts +26 -0
  334. package/dist/test/utilities/workflows.d.ts.map +1 -0
  335. package/dist/test/utilities.d.ts +10 -106
  336. package/dist/test/utilities.d.ts.map +1 -1
  337. package/dist/types-2ejrbba1.js +695 -0
  338. package/dist/types-7jkbm95a.js +695 -0
  339. package/dist/types-a2fk9yns.js +695 -0
  340. package/dist/types-dyb3c6zw.js +695 -0
  341. package/dist/types-e2n9f3pd.js +695 -0
  342. package/dist/types-j4s6qcrc.js +695 -0
  343. package/dist/utils/send-email.d.ts.map +1 -1
  344. package/dist/utils/send-email.js +1 -1
  345. package/dist/vite/index.js +6 -6
  346. package/dist/vite/plugin-context.d.ts.map +1 -1
  347. package/dist/worker-663em30d.js +513 -0
  348. package/dist/worker-argxc7fb.js +513 -0
  349. package/dist/worker-entry/composed-worker.d.ts.map +1 -1
  350. package/dist/worker-entry/surface-paths.d.ts +2 -0
  351. package/dist/worker-entry/surface-paths.d.ts.map +1 -1
  352. package/dist/worker-fcdsnj14.js +513 -0
  353. package/dist/worker-fk42rzse.js +513 -0
  354. package/dist/worker-jkemk8d2.js +513 -0
  355. package/dist/worker-m4ze8djx.js +513 -0
  356. package/dist/worker-wnan5dca.js +513 -0
  357. package/dist/worker-yw3atfb1.js +513 -0
  358. package/dist/workflows/local-workflow-entrypoints.d.ts +7 -0
  359. package/dist/workflows/local-workflow-entrypoints.d.ts.map +1 -0
  360. package/package.json +13 -12
@@ -0,0 +1,239 @@
1
+ // src/utils/send-email.ts
2
+ var RAW_EMAIL = "EmailMessage::raw";
3
+ var wrappedSendEmailBindings = new WeakMap;
4
+ var wrappedEnvBindings = new WeakMap;
5
+ var localSendEmailBindings = new Map;
6
+ function hasOwn(value, key) {
7
+ return Object.prototype.hasOwnProperty.call(value, key);
8
+ }
9
+ function isRecord(value) {
10
+ return typeof value === "object" && value !== null;
11
+ }
12
+ function isSendEmailBinding(value) {
13
+ if (!isRecord(value)) {
14
+ return false;
15
+ }
16
+ try {
17
+ return typeof value.send === "function" && typeof value.sendBatch !== "function";
18
+ } catch {
19
+ return false;
20
+ }
21
+ }
22
+ function isComposableSendEmailMessage(message) {
23
+ return isRecord(message) && typeof message.from === "string" && (typeof message.to === "string" || Array.isArray(message.to));
24
+ }
25
+ function formatEmailAddress(value) {
26
+ if (!value) {
27
+ return;
28
+ }
29
+ return typeof value === "string" ? value : String(value);
30
+ }
31
+ function formatEmailList(value) {
32
+ if (!value) {
33
+ return;
34
+ }
35
+ return Array.isArray(value) ? value.join(", ") : value;
36
+ }
37
+ function normalizeBodyText(value) {
38
+ return value.replace(/\r?\n/g, `\r
39
+ `);
40
+ }
41
+ function buildMultipartAlternativeBody(message, boundary) {
42
+ const parts = [];
43
+ if (message.text) {
44
+ parts.push(`--${boundary}`, "Content-Type: text/plain; charset=UTF-8", "", normalizeBodyText(message.text));
45
+ }
46
+ if (message.html) {
47
+ parts.push(`--${boundary}`, "Content-Type: text/html; charset=UTF-8", "", normalizeBodyText(message.html));
48
+ }
49
+ parts.push(`--${boundary}--`);
50
+ return parts.join(`\r
51
+ `);
52
+ }
53
+ function buildRawEmail(message) {
54
+ const lines = [];
55
+ const messageId = `<${Date.now()}-${Math.random().toString(36).slice(2)}@devflare.dev>`;
56
+ lines.push(`From: ${message.from}`);
57
+ lines.push(`To: ${formatEmailList(message.to)}`);
58
+ lines.push(`Date: ${new Date().toUTCString()}`);
59
+ lines.push(`Message-ID: ${messageId}`);
60
+ if (message.subject) {
61
+ lines.push(`Subject: ${message.subject}`);
62
+ }
63
+ const replyTo = formatEmailAddress(message.replyTo);
64
+ if (replyTo) {
65
+ lines.push(`Reply-To: ${replyTo}`);
66
+ }
67
+ const cc = formatEmailList(message.cc);
68
+ if (cc) {
69
+ lines.push(`Cc: ${cc}`);
70
+ }
71
+ const bcc = formatEmailList(message.bcc);
72
+ if (bcc) {
73
+ lines.push(`Bcc: ${bcc}`);
74
+ }
75
+ if (message.headers) {
76
+ for (const [key, value] of Object.entries(message.headers)) {
77
+ lines.push(`${key}: ${value}`);
78
+ }
79
+ }
80
+ lines.push("MIME-Version: 1.0");
81
+ if (message.text && message.html) {
82
+ const boundary = `devflare-alt-${crypto.randomUUID()}`;
83
+ lines.push(`Content-Type: multipart/alternative; boundary="${boundary}"`);
84
+ lines.push("");
85
+ lines.push(buildMultipartAlternativeBody(message, boundary));
86
+ return lines.join(`\r
87
+ `);
88
+ }
89
+ lines.push(`Content-Type: ${message.html ? "text/html" : "text/plain"}; charset=UTF-8`);
90
+ lines.push("");
91
+ lines.push(normalizeBodyText(message.html ?? message.text ?? ""));
92
+ return lines.join(`\r
93
+ `);
94
+ }
95
+ function createEmailMessageRaw(raw) {
96
+ if (typeof raw === "string" || raw instanceof ReadableStream) {
97
+ return raw;
98
+ }
99
+ if (raw instanceof Uint8Array) {
100
+ const copy = new Uint8Array(raw.byteLength);
101
+ copy.set(raw);
102
+ return new Blob([copy]).stream();
103
+ }
104
+ if (raw instanceof ArrayBuffer) {
105
+ return new Blob([new Uint8Array(raw.slice(0))]).stream();
106
+ }
107
+ throw new Error("Unsupported EmailMessage raw payload");
108
+ }
109
+ function normalizeSendEmailMessage(message) {
110
+ if (!isComposableSendEmailMessage(message)) {
111
+ return message;
112
+ }
113
+ if (hasOwn(message, RAW_EMAIL)) {
114
+ return message;
115
+ }
116
+ if (hasOwn(message, "raw") && message.raw !== undefined) {
117
+ return {
118
+ from: message.from,
119
+ to: message.to,
120
+ [RAW_EMAIL]: createEmailMessageRaw(message.raw)
121
+ };
122
+ }
123
+ return {
124
+ from: message.from,
125
+ to: message.to,
126
+ [RAW_EMAIL]: createEmailMessageRaw(buildRawEmail(message))
127
+ };
128
+ }
129
+ function wrapSendEmailBinding(binding) {
130
+ const cached = wrappedSendEmailBindings.get(binding);
131
+ if (cached) {
132
+ return cached;
133
+ }
134
+ const wrapped = new Proxy(binding, {
135
+ get(target, prop, receiver) {
136
+ if (prop === "send") {
137
+ return async (message) => target.send(normalizeSendEmailMessage(message));
138
+ }
139
+ const value = Reflect.get(target, prop, receiver);
140
+ return typeof value === "function" ? value.bind(target) : value;
141
+ }
142
+ });
143
+ wrappedSendEmailBindings.set(binding, wrapped);
144
+ return wrapped;
145
+ }
146
+ function createLocalSendEmailBinding(config = {}, options = {}) {
147
+ return {
148
+ async send(message) {
149
+ const normalized = normalizeSendEmailMessage(message);
150
+ if (isRecord(normalized)) {
151
+ const from = typeof normalized.from === "string" ? normalized.from : undefined;
152
+ const recipients = Array.isArray(normalized.to) ? normalized.to.filter((value) => typeof value === "string") : typeof normalized.to === "string" ? [normalized.to] : [];
153
+ if (from && config.allowedSenderAddresses && !config.allowedSenderAddresses.includes(from)) {
154
+ throw new Error(`email from ${from} not allowed`);
155
+ }
156
+ for (const recipient of recipients) {
157
+ if (config.destinationAddress !== undefined && recipient !== config.destinationAddress) {
158
+ throw new Error(`email to ${recipient} not allowed`);
159
+ }
160
+ if (config.allowedDestinationAddresses !== undefined && !config.allowedDestinationAddresses.includes(recipient)) {
161
+ throw new Error(`email to ${recipient} not allowed`);
162
+ }
163
+ }
164
+ }
165
+ await options.onSend?.(normalized);
166
+ return;
167
+ }
168
+ };
169
+ }
170
+ function setLocalSendEmailBindings(bindings) {
171
+ localSendEmailBindings.clear();
172
+ for (const [name, config] of Object.entries(bindings)) {
173
+ localSendEmailBindings.set(name, createLocalSendEmailBinding(config));
174
+ }
175
+ }
176
+ function clearLocalSendEmailBindings() {
177
+ localSendEmailBindings.clear();
178
+ }
179
+ function needsEnvSendEmailWrapping(env) {
180
+ if (localSendEmailBindings.size > 0) {
181
+ return true;
182
+ }
183
+ for (const key of Reflect.ownKeys(env)) {
184
+ const value = Reflect.get(env, key);
185
+ if (isSendEmailBinding(value)) {
186
+ return true;
187
+ }
188
+ }
189
+ return false;
190
+ }
191
+ function wrapEnvSendEmailBindings(env) {
192
+ if (!isRecord(env)) {
193
+ return env;
194
+ }
195
+ if (!needsEnvSendEmailWrapping(env)) {
196
+ return env;
197
+ }
198
+ const cached = wrappedEnvBindings.get(env);
199
+ if (cached) {
200
+ return cached;
201
+ }
202
+ const wrapped = new Proxy(env, {
203
+ get(target, prop, receiver) {
204
+ const value = Reflect.get(target, prop, receiver);
205
+ if (value === undefined && typeof prop === "string") {
206
+ return localSendEmailBindings.get(prop);
207
+ }
208
+ return isSendEmailBinding(value) ? wrapSendEmailBinding(value) : value;
209
+ },
210
+ has(target, prop) {
211
+ return Reflect.has(target, prop) || typeof prop === "string" && localSendEmailBindings.has(prop);
212
+ },
213
+ ownKeys(target) {
214
+ return Array.from(new Set([
215
+ ...Reflect.ownKeys(target),
216
+ ...localSendEmailBindings.keys()
217
+ ]));
218
+ },
219
+ getOwnPropertyDescriptor(target, prop) {
220
+ const descriptor = Reflect.getOwnPropertyDescriptor(target, prop);
221
+ if (descriptor) {
222
+ return descriptor;
223
+ }
224
+ if (typeof prop === "string" && localSendEmailBindings.has(prop)) {
225
+ return {
226
+ configurable: true,
227
+ enumerable: true,
228
+ writable: false,
229
+ value: localSendEmailBindings.get(prop)
230
+ };
231
+ }
232
+ return;
233
+ }
234
+ });
235
+ wrappedEnvBindings.set(env, wrapped);
236
+ return wrapped;
237
+ }
238
+
239
+ export { createEmailMessageRaw, normalizeSendEmailMessage, wrapSendEmailBinding, createLocalSendEmailBinding, setLocalSendEmailBindings, clearLocalSendEmailBindings, wrapEnvSendEmailBindings };
@@ -0,0 +1,117 @@
1
+ import {
2
+ normalizeSecretsStoreBinding
3
+ } from "./index-syscwrjp.js";
4
+
5
+ // src/secrets/local-secrets.ts
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
+ import { dirname, join } from "node:path";
8
+ var LOCAL_SECRETS_PATH = join(".devflare", "secrets.local.json");
9
+ function createEmptyLocalSecretsFile() {
10
+ return {
11
+ version: 1,
12
+ stores: {}
13
+ };
14
+ }
15
+ function getLocalSecretsFilePath(cwd) {
16
+ return join(cwd, LOCAL_SECRETS_PATH);
17
+ }
18
+ function parseLocalSecretsFile(raw) {
19
+ const parsed = JSON.parse(raw);
20
+ if (parsed.version !== 1 || !parsed.stores || typeof parsed.stores !== "object") {
21
+ return createEmptyLocalSecretsFile();
22
+ }
23
+ return {
24
+ version: 1,
25
+ stores: parsed.stores
26
+ };
27
+ }
28
+ function readLocalSecretsFile(cwd) {
29
+ const filePath = getLocalSecretsFilePath(cwd);
30
+ if (!existsSync(filePath)) {
31
+ return createEmptyLocalSecretsFile();
32
+ }
33
+ return parseLocalSecretsFile(readFileSync(filePath, "utf8"));
34
+ }
35
+ function writeLocalSecretsFile(cwd, file) {
36
+ const filePath = getLocalSecretsFilePath(cwd);
37
+ mkdirSync(dirname(filePath), { recursive: true });
38
+ writeFileSync(filePath, `${JSON.stringify(file, null, "\t")}
39
+ `, {
40
+ encoding: "utf8",
41
+ mode: 384
42
+ });
43
+ }
44
+ function writeLocalSecret({ cwd, storeId, name, value }) {
45
+ const file = readLocalSecretsFile(cwd);
46
+ file.stores[storeId] ??= {};
47
+ file.stores[storeId][name] = {
48
+ value,
49
+ updatedAt: new Date().toISOString()
50
+ };
51
+ writeLocalSecretsFile(cwd, file);
52
+ }
53
+ function readLocalSecret({ cwd, storeId, name }) {
54
+ return readLocalSecretsFile(cwd).stores[storeId]?.[name]?.value;
55
+ }
56
+ function deleteLocalSecret({ cwd, storeId, name }) {
57
+ const file = readLocalSecretsFile(cwd);
58
+ const store = file.stores[storeId];
59
+ if (!store || !(name in store)) {
60
+ return false;
61
+ }
62
+ delete store[name];
63
+ if (Object.keys(store).length === 0) {
64
+ delete file.stores[storeId];
65
+ }
66
+ writeLocalSecretsFile(cwd, file);
67
+ return true;
68
+ }
69
+ function listLocalSecrets({ cwd, storeId }) {
70
+ const file = readLocalSecretsFile(cwd);
71
+ const stores = storeId ? { [storeId]: file.stores[storeId] ?? {} } : file.stores;
72
+ return Object.entries(stores).flatMap(([currentStoreId, secrets]) => Object.entries(secrets).map(([name, secret]) => ({
73
+ storeId: currentStoreId,
74
+ name,
75
+ hasValue: typeof secret.value === "string",
76
+ updatedAt: secret.updatedAt
77
+ })));
78
+ }
79
+ function resolveLocalSecretValuesForBindings(config, cwd) {
80
+ const values = {};
81
+ for (const [bindingName, binding] of Object.entries(config.bindings?.secretsStore ?? {})) {
82
+ const normalized = normalizeSecretsStoreBinding(binding, config.secretsStoreId, bindingName);
83
+ const value = readLocalSecret({
84
+ cwd,
85
+ storeId: normalized.storeId,
86
+ name: normalized.secretName
87
+ });
88
+ if (value !== undefined) {
89
+ values[bindingName] = value;
90
+ }
91
+ }
92
+ return values;
93
+ }
94
+ async function getSecretAdmin(miniflare, bindingName) {
95
+ const adminOrFactory = await miniflare.getSecretsStoreSecretAPI(bindingName);
96
+ return typeof adminOrFactory === "function" ? adminOrFactory() : adminOrFactory;
97
+ }
98
+ async function upsertMiniflareSecret(admin, value) {
99
+ if (admin.list && admin.update) {
100
+ const [existing] = await admin.list();
101
+ const id = existing?.metadata?.uuid ?? existing?.name;
102
+ if (id) {
103
+ await admin.update(value, id);
104
+ return;
105
+ }
106
+ }
107
+ await admin.create(value);
108
+ }
109
+ async function seedMiniflareLocalSecrets(miniflare, config, cwd) {
110
+ const values = resolveLocalSecretValuesForBindings(config, cwd);
111
+ for (const [bindingName, value] of Object.entries(values)) {
112
+ const admin = await getSecretAdmin(miniflare, bindingName);
113
+ await upsertMiniflareSecret(admin, value);
114
+ }
115
+ }
116
+
117
+ export { writeLocalSecret, deleteLocalSecret, listLocalSecrets, resolveLocalSecretValuesForBindings, seedMiniflareLocalSecrets };