alchemy 0.62.3 → 0.63.1

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 (612) hide show
  1. package/bin/alchemy.js +1517 -1203
  2. package/bin/commands/deploy.ts +2 -0
  3. package/bin/commands/dev.ts +2 -0
  4. package/bin/commands/init.ts +1 -1
  5. package/bin/services/execute-alchemy.ts +11 -0
  6. package/bin/services/github-workflow.ts +2 -2
  7. package/bin/services/template-manager.ts +2 -0
  8. package/bin/types.ts +2 -1
  9. package/lib/alchemy.d.ts +6 -22
  10. package/lib/alchemy.d.ts.map +1 -1
  11. package/lib/alchemy.js +65 -169
  12. package/lib/alchemy.js.map +1 -1
  13. package/lib/apply.d.ts +0 -2
  14. package/lib/apply.d.ts.map +1 -1
  15. package/lib/apply.js +2 -16
  16. package/lib/apply.js.map +1 -1
  17. package/lib/aws/account-id.d.ts.map +1 -1
  18. package/lib/aws/account-id.js +3 -2
  19. package/lib/aws/account-id.js.map +1 -1
  20. package/lib/aws/bucket.d.ts +8 -2
  21. package/lib/aws/bucket.d.ts.map +1 -1
  22. package/lib/aws/bucket.js +21 -14
  23. package/lib/aws/bucket.js.map +1 -1
  24. package/lib/aws/ec2/security-group.d.ts +8 -2
  25. package/lib/aws/ec2/security-group.d.ts.map +1 -1
  26. package/lib/aws/ec2/security-group.js +7 -2
  27. package/lib/aws/ec2/security-group.js.map +1 -1
  28. package/lib/aws/function.d.ts +9 -3
  29. package/lib/aws/function.d.ts.map +1 -1
  30. package/lib/aws/function.js +35 -26
  31. package/lib/aws/function.js.map +1 -1
  32. package/lib/aws/policy-attachment.d.ts.map +1 -1
  33. package/lib/aws/policy-attachment.js +2 -1
  34. package/lib/aws/policy-attachment.js.map +1 -1
  35. package/lib/aws/policy.d.ts +8 -2
  36. package/lib/aws/policy.d.ts.map +1 -1
  37. package/lib/aws/policy.js +13 -4
  38. package/lib/aws/policy.js.map +1 -1
  39. package/lib/aws/queue.d.ts +8 -2
  40. package/lib/aws/queue.d.ts.map +1 -1
  41. package/lib/aws/queue.js +22 -14
  42. package/lib/aws/queue.js.map +1 -1
  43. package/lib/aws/role.d.ts +8 -2
  44. package/lib/aws/role.d.ts.map +1 -1
  45. package/lib/aws/role.js +10 -3
  46. package/lib/aws/role.js.map +1 -1
  47. package/lib/aws/ses.d.ts +1 -1
  48. package/lib/aws/ses.d.ts.map +1 -1
  49. package/lib/aws/ses.js +2 -1
  50. package/lib/aws/ses.js.map +1 -1
  51. package/lib/aws/ssm-parameter.d.ts +8 -2
  52. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  53. package/lib/aws/ssm-parameter.js +15 -10
  54. package/lib/aws/ssm-parameter.js.map +1 -1
  55. package/lib/aws/table.d.ts +8 -2
  56. package/lib/aws/table.d.ts.map +1 -1
  57. package/lib/aws/table.js +17 -9
  58. package/lib/aws/table.js.map +1 -1
  59. package/lib/cloudflare/account-api-token.d.ts +2 -2
  60. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  61. package/lib/cloudflare/account-api-token.js +7 -6
  62. package/lib/cloudflare/account-api-token.js.map +1 -1
  63. package/lib/cloudflare/ai-gateway.d.ts +9 -4
  64. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  65. package/lib/cloudflare/ai-gateway.js +20 -24
  66. package/lib/cloudflare/ai-gateway.js.map +1 -1
  67. package/lib/cloudflare/api-schema.d.ts +2 -2
  68. package/lib/cloudflare/api-schema.d.ts.map +1 -1
  69. package/lib/cloudflare/api-schema.js +6 -2
  70. package/lib/cloudflare/api-schema.js.map +1 -1
  71. package/lib/cloudflare/api-shield.d.ts +5 -1
  72. package/lib/cloudflare/api-shield.d.ts.map +1 -1
  73. package/lib/cloudflare/api-shield.js +6 -1
  74. package/lib/cloudflare/api-shield.js.map +1 -1
  75. package/lib/cloudflare/assets.d.ts +1 -1
  76. package/lib/cloudflare/assets.d.ts.map +1 -1
  77. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  78. package/lib/cloudflare/astro/astro.js +3 -1
  79. package/lib/cloudflare/astro/astro.js.map +1 -1
  80. package/lib/cloudflare/astro/plugin.d.ts +2 -1
  81. package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
  82. package/lib/cloudflare/astro/plugin.js.map +1 -1
  83. package/lib/cloudflare/bindings.d.ts +2 -2
  84. package/lib/cloudflare/bindings.d.ts.map +1 -1
  85. package/lib/cloudflare/bound.d.ts +1 -1
  86. package/lib/cloudflare/bound.d.ts.map +1 -1
  87. package/lib/cloudflare/bucket.d.ts +120 -1
  88. package/lib/cloudflare/bucket.d.ts.map +1 -1
  89. package/lib/cloudflare/bucket.js +80 -2
  90. package/lib/cloudflare/bucket.js.map +1 -1
  91. package/lib/cloudflare/cloudflare-env-proxy.js +1 -1
  92. package/lib/cloudflare/cloudflare-env-proxy.js.map +1 -1
  93. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  94. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  95. package/lib/cloudflare/container.d.ts +10 -4
  96. package/lib/cloudflare/container.d.ts.map +1 -1
  97. package/lib/cloudflare/container.js +12 -9
  98. package/lib/cloudflare/container.js.map +1 -1
  99. package/lib/cloudflare/custom-domain.js +2 -1
  100. package/lib/cloudflare/custom-domain.js.map +1 -1
  101. package/lib/cloudflare/d1-database.d.ts +1 -1
  102. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  103. package/lib/cloudflare/d1-database.js +6 -2
  104. package/lib/cloudflare/d1-database.js.map +1 -1
  105. package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
  106. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  107. package/lib/cloudflare/dispatch-namespace.js +7 -5
  108. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  109. package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -1
  110. package/lib/cloudflare/durable-object-namespace.js.map +1 -1
  111. package/lib/cloudflare/hyperdrive.d.ts +7 -1
  112. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  113. package/lib/cloudflare/hyperdrive.js +3 -2
  114. package/lib/cloudflare/hyperdrive.js.map +1 -1
  115. package/lib/cloudflare/kv-namespace.d.ts +3 -0
  116. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  117. package/lib/cloudflare/kv-namespace.js +11 -2
  118. package/lib/cloudflare/kv-namespace.js.map +1 -1
  119. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
  120. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  121. package/lib/cloudflare/miniflare/paths.d.ts +4 -0
  122. package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
  123. package/lib/cloudflare/miniflare/paths.js +11 -0
  124. package/lib/cloudflare/miniflare/paths.js.map +1 -1
  125. package/lib/cloudflare/pipeline.d.ts +14 -3
  126. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  127. package/lib/cloudflare/pipeline.js +31 -2
  128. package/lib/cloudflare/pipeline.js.map +1 -1
  129. package/lib/cloudflare/queue-consumer.js +1 -1
  130. package/lib/cloudflare/queue-consumer.js.map +1 -1
  131. package/lib/cloudflare/queue.d.ts +4 -2
  132. package/lib/cloudflare/queue.d.ts.map +1 -1
  133. package/lib/cloudflare/queue.js +13 -9
  134. package/lib/cloudflare/queue.js.map +1 -1
  135. package/lib/cloudflare/react-router/plugin.d.ts +1 -1
  136. package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
  137. package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
  138. package/lib/cloudflare/react-router/react-router.js +32 -2
  139. package/lib/cloudflare/react-router/react-router.js.map +1 -1
  140. package/lib/cloudflare/redwood/plugin.d.ts +2 -1
  141. package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
  142. package/lib/cloudflare/redwood/plugin.js.map +1 -1
  143. package/lib/cloudflare/route.js +1 -1
  144. package/lib/cloudflare/route.js.map +1 -1
  145. package/lib/cloudflare/ruleset.d.ts +3 -1
  146. package/lib/cloudflare/ruleset.d.ts.map +1 -1
  147. package/lib/cloudflare/ruleset.js +3 -2
  148. package/lib/cloudflare/ruleset.js.map +1 -1
  149. package/lib/cloudflare/secret.d.ts +6 -23
  150. package/lib/cloudflare/secret.d.ts.map +1 -1
  151. package/lib/cloudflare/secret.js +8 -4
  152. package/lib/cloudflare/secret.js.map +1 -1
  153. package/lib/cloudflare/secrets-store.d.ts +1 -1
  154. package/lib/cloudflare/secrets-store.d.ts.map +1 -1
  155. package/lib/cloudflare/secrets-store.js +5 -2
  156. package/lib/cloudflare/secrets-store.js.map +1 -1
  157. package/lib/cloudflare/tunnel.d.ts +5 -1
  158. package/lib/cloudflare/tunnel.d.ts.map +1 -1
  159. package/lib/cloudflare/tunnel.js +5 -1
  160. package/lib/cloudflare/tunnel.js.map +1 -1
  161. package/lib/cloudflare/vectorize-index.d.ts +7 -1
  162. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  163. package/lib/cloudflare/vectorize-index.js +5 -2
  164. package/lib/cloudflare/vectorize-index.js.map +1 -1
  165. package/lib/cloudflare/vite/plugin.d.ts +2 -1
  166. package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
  167. package/lib/cloudflare/vite/plugin.js.map +1 -1
  168. package/lib/cloudflare/website.js +1 -1
  169. package/lib/cloudflare/website.js.map +1 -1
  170. package/lib/cloudflare/worker-metadata.js +1 -1
  171. package/lib/cloudflare/worker-metadata.js.map +1 -1
  172. package/lib/cloudflare/worker.d.ts +1 -1
  173. package/lib/cloudflare/worker.d.ts.map +1 -1
  174. package/lib/cloudflare/worker.js +12 -7
  175. package/lib/cloudflare/worker.js.map +1 -1
  176. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  177. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  178. package/lib/cloudflare/wrangler.json.js +5 -3
  179. package/lib/cloudflare/wrangler.json.js.map +1 -1
  180. package/lib/docker/container.d.ts +6 -0
  181. package/lib/docker/container.d.ts.map +1 -1
  182. package/lib/docker/container.js +5 -1
  183. package/lib/docker/container.js.map +1 -1
  184. package/lib/docker/network.d.ts +8 -2
  185. package/lib/docker/network.d.ts.map +1 -1
  186. package/lib/docker/network.js +7 -2
  187. package/lib/docker/network.js.map +1 -1
  188. package/lib/docker/volume.d.ts +8 -2
  189. package/lib/docker/volume.d.ts.map +1 -1
  190. package/lib/docker/volume.js +6 -4
  191. package/lib/docker/volume.js.map +1 -1
  192. package/lib/esbuild/bundle.d.ts +1 -1
  193. package/lib/fs/index.d.ts +0 -8
  194. package/lib/fs/index.d.ts.map +1 -1
  195. package/lib/fs/index.js +0 -8
  196. package/lib/fs/index.js.map +1 -1
  197. package/lib/github/client.d.ts +1 -1
  198. package/lib/github/client.d.ts.map +1 -1
  199. package/lib/github/client.js +2 -1
  200. package/lib/github/client.js.map +1 -1
  201. package/lib/github/repository-environment.d.ts +8 -2
  202. package/lib/github/repository-environment.d.ts.map +1 -1
  203. package/lib/github/repository-environment.js +16 -12
  204. package/lib/github/repository-environment.js.map +1 -1
  205. package/lib/neon/project.d.ts +7 -1
  206. package/lib/neon/project.d.ts.map +1 -1
  207. package/lib/neon/project.js +14 -11
  208. package/lib/neon/project.js.map +1 -1
  209. package/lib/planetscale/branch.d.ts +4 -2
  210. package/lib/planetscale/branch.d.ts.map +1 -1
  211. package/lib/planetscale/branch.js +18 -12
  212. package/lib/planetscale/branch.js.map +1 -1
  213. package/lib/planetscale/database.d.ts +8 -2
  214. package/lib/planetscale/database.d.ts.map +1 -1
  215. package/lib/planetscale/database.js +24 -16
  216. package/lib/planetscale/database.js.map +1 -1
  217. package/lib/planetscale/password.d.ts +8 -2
  218. package/lib/planetscale/password.d.ts.map +1 -1
  219. package/lib/planetscale/password.js +2 -2
  220. package/lib/planetscale/password.js.map +1 -1
  221. package/lib/resource.d.ts +0 -2
  222. package/lib/resource.d.ts.map +1 -1
  223. package/lib/resource.js +1 -9
  224. package/lib/resource.js.map +1 -1
  225. package/lib/scope.d.ts +9 -3
  226. package/lib/scope.d.ts.map +1 -1
  227. package/lib/scope.js +21 -34
  228. package/lib/scope.js.map +1 -1
  229. package/lib/sentry/client-key.d.ts +7 -1
  230. package/lib/sentry/client-key.d.ts.map +1 -1
  231. package/lib/sentry/client-key.js +45 -6
  232. package/lib/sentry/client-key.js.map +1 -1
  233. package/lib/sentry/project.d.ts +8 -2
  234. package/lib/sentry/project.d.ts.map +1 -1
  235. package/lib/sentry/project.js +35 -5
  236. package/lib/sentry/project.js.map +1 -1
  237. package/lib/sentry/team.d.ts +8 -2
  238. package/lib/sentry/team.d.ts.map +1 -1
  239. package/lib/sentry/team.js +36 -6
  240. package/lib/sentry/team.js.map +1 -1
  241. package/lib/serde.d.ts +0 -5
  242. package/lib/serde.d.ts.map +1 -1
  243. package/lib/serde.js +0 -28
  244. package/lib/serde.js.map +1 -1
  245. package/lib/state/d1-state-store.d.ts +1 -1
  246. package/lib/state/d1-state-store.d.ts.map +1 -1
  247. package/lib/state/d1-state-store.js +5 -5
  248. package/lib/state/d1-state-store.js.map +1 -1
  249. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  250. package/lib/state/sqlite-state-store.js +7 -11
  251. package/lib/state/sqlite-state-store.js.map +1 -1
  252. package/lib/stripe/card.d.ts.map +1 -1
  253. package/lib/stripe/card.js +3 -2
  254. package/lib/stripe/card.js.map +1 -1
  255. package/lib/stripe/client.d.ts +2 -2
  256. package/lib/stripe/client.d.ts.map +1 -1
  257. package/lib/stripe/client.js +4 -3
  258. package/lib/stripe/client.js.map +1 -1
  259. package/lib/stripe/coupon.d.ts.map +1 -1
  260. package/lib/stripe/coupon.js +4 -3
  261. package/lib/stripe/coupon.js.map +1 -1
  262. package/lib/stripe/customer.js +2 -2
  263. package/lib/stripe/customer.js.map +1 -1
  264. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  265. package/lib/stripe/entitlements-feature.js +3 -2
  266. package/lib/stripe/entitlements-feature.js.map +1 -1
  267. package/lib/stripe/file.d.ts.map +1 -1
  268. package/lib/stripe/file.js +3 -2
  269. package/lib/stripe/file.js.map +1 -1
  270. package/lib/stripe/meter.js +2 -2
  271. package/lib/stripe/meter.js.map +1 -1
  272. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  273. package/lib/stripe/portal-configuration.js +3 -2
  274. package/lib/stripe/portal-configuration.js.map +1 -1
  275. package/lib/stripe/price.d.ts.map +1 -1
  276. package/lib/stripe/price.js +3 -2
  277. package/lib/stripe/price.js.map +1 -1
  278. package/lib/stripe/product-feature.d.ts.map +1 -1
  279. package/lib/stripe/product-feature.js +3 -2
  280. package/lib/stripe/product-feature.js.map +1 -1
  281. package/lib/stripe/product.d.ts.map +1 -1
  282. package/lib/stripe/product.js +3 -2
  283. package/lib/stripe/product.js.map +1 -1
  284. package/lib/stripe/promotion-code.d.ts.map +1 -1
  285. package/lib/stripe/promotion-code.js +3 -2
  286. package/lib/stripe/promotion-code.js.map +1 -1
  287. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  288. package/lib/stripe/shipping-rate.js +4 -3
  289. package/lib/stripe/shipping-rate.js.map +1 -1
  290. package/lib/stripe/tax-rate.d.ts.map +1 -1
  291. package/lib/stripe/tax-rate.js +3 -2
  292. package/lib/stripe/tax-rate.js.map +1 -1
  293. package/lib/stripe/webhook.d.ts.map +1 -1
  294. package/lib/stripe/webhook.js +4 -3
  295. package/lib/stripe/webhook.js.map +1 -1
  296. package/lib/test/vitest.d.ts.map +1 -1
  297. package/lib/test/vitest.js +1 -0
  298. package/lib/test/vitest.js.map +1 -1
  299. package/lib/upstash/redis.d.ts +8 -2
  300. package/lib/upstash/redis.d.ts.map +1 -1
  301. package/lib/upstash/redis.js +6 -5
  302. package/lib/upstash/redis.js.map +1 -1
  303. package/lib/util/idempotent-spawn.d.ts.map +1 -1
  304. package/lib/util/idempotent-spawn.js +21 -2
  305. package/lib/util/idempotent-spawn.js.map +1 -1
  306. package/lib/util/ignore-matcher.d.ts.map +1 -1
  307. package/lib/util/ignore-matcher.js +3 -1
  308. package/lib/util/ignore-matcher.js.map +1 -1
  309. package/lib/util/peer.d.ts +10 -0
  310. package/lib/util/peer.d.ts.map +1 -0
  311. package/lib/util/peer.js +42 -0
  312. package/lib/util/peer.js.map +1 -0
  313. package/lib/util/xml.js +1 -1
  314. package/lib/util/xml.js.map +1 -1
  315. package/lib/vercel/project.d.ts +7 -1
  316. package/lib/vercel/project.d.ts.map +1 -1
  317. package/lib/vercel/project.js +28 -0
  318. package/lib/vercel/project.js.map +1 -1
  319. package/package.json +88 -74
  320. package/src/alchemy.ts +76 -222
  321. package/src/apply.ts +6 -19
  322. package/src/aws/account-id.ts +6 -3
  323. package/src/aws/bucket.ts +43 -32
  324. package/src/aws/ec2/security-group.ts +15 -3
  325. package/src/aws/function.ts +65 -39
  326. package/src/aws/policy-attachment.ts +10 -6
  327. package/src/aws/policy.ts +33 -15
  328. package/src/aws/queue.ts +50 -29
  329. package/src/aws/role.ts +37 -20
  330. package/src/aws/ses.ts +24 -20
  331. package/src/aws/ssm-parameter.ts +40 -20
  332. package/src/aws/table.ts +35 -17
  333. package/src/cloudflare/account-api-token.ts +9 -7
  334. package/src/cloudflare/ai-gateway.ts +37 -34
  335. package/src/cloudflare/api-schema.ts +33 -26
  336. package/src/cloudflare/api-shield.ts +15 -2
  337. package/src/cloudflare/astro/astro.ts +5 -1
  338. package/src/cloudflare/astro/plugin.ts +2 -1
  339. package/src/cloudflare/bindings.ts +2 -2
  340. package/src/cloudflare/bound.ts +1 -1
  341. package/src/cloudflare/bucket.ts +242 -3
  342. package/src/cloudflare/cloudflare-env-proxy.ts +1 -1
  343. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  344. package/src/cloudflare/container.ts +23 -12
  345. package/src/cloudflare/custom-domain.ts +2 -2
  346. package/src/cloudflare/d1-database.ts +10 -3
  347. package/src/cloudflare/dispatch-namespace.ts +10 -7
  348. package/src/cloudflare/durable-object-namespace.ts +0 -1
  349. package/src/cloudflare/hyperdrive.ts +14 -4
  350. package/src/cloudflare/kv-namespace.ts +25 -2
  351. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  352. package/src/cloudflare/miniflare/paths.ts +13 -0
  353. package/src/cloudflare/pipeline.ts +76 -28
  354. package/src/cloudflare/queue-consumer.ts +1 -1
  355. package/src/cloudflare/queue.ts +26 -14
  356. package/src/cloudflare/react-router/react-router.ts +28 -2
  357. package/src/cloudflare/redwood/plugin.ts +3 -2
  358. package/src/cloudflare/route.ts +1 -1
  359. package/src/cloudflare/ruleset.ts +7 -2
  360. package/src/cloudflare/secret.ts +20 -31
  361. package/src/cloudflare/secrets-store.ts +7 -3
  362. package/src/cloudflare/tunnel.ts +13 -2
  363. package/src/cloudflare/vectorize-index.ts +14 -3
  364. package/src/cloudflare/vite/plugin.ts +3 -2
  365. package/src/cloudflare/website.ts +1 -1
  366. package/src/cloudflare/worker-metadata.ts +1 -1
  367. package/src/cloudflare/worker.ts +35 -23
  368. package/src/cloudflare/wrangler.json.ts +7 -4
  369. package/src/docker/container.ts +13 -1
  370. package/src/docker/network.ts +18 -3
  371. package/src/docker/volume.ts +17 -6
  372. package/src/fs/index.ts +0 -8
  373. package/src/github/client.ts +6 -2
  374. package/src/github/repository-environment.ts +27 -13
  375. package/src/neon/project.ts +24 -11
  376. package/src/planetscale/branch.ts +24 -13
  377. package/src/planetscale/database.ts +38 -17
  378. package/src/planetscale/password.ts +10 -3
  379. package/src/resource.ts +1 -10
  380. package/src/scope.ts +29 -38
  381. package/src/sentry/client-key.ts +74 -6
  382. package/src/sentry/project.ts +59 -6
  383. package/src/sentry/team.ts +55 -7
  384. package/src/serde.ts +0 -44
  385. package/src/state/d1-state-store.ts +13 -6
  386. package/src/state/sqlite-state-store.ts +16 -17
  387. package/src/stripe/card.ts +5 -2
  388. package/src/stripe/client.ts +10 -3
  389. package/src/stripe/coupon.ts +4 -3
  390. package/src/stripe/customer.ts +2 -2
  391. package/src/stripe/entitlements-feature.ts +5 -2
  392. package/src/stripe/file.ts +3 -2
  393. package/src/stripe/meter.ts +2 -2
  394. package/src/stripe/portal-configuration.ts +5 -2
  395. package/src/stripe/price.ts +3 -2
  396. package/src/stripe/product-feature.ts +5 -2
  397. package/src/stripe/product.ts +3 -2
  398. package/src/stripe/promotion-code.ts +3 -2
  399. package/src/stripe/shipping-rate.ts +4 -3
  400. package/src/stripe/tax-rate.ts +3 -2
  401. package/src/stripe/webhook.ts +4 -3
  402. package/src/test/vitest.ts +1 -0
  403. package/src/upstash/redis.ts +16 -6
  404. package/src/util/idempotent-spawn.ts +23 -2
  405. package/src/util/ignore-matcher.ts +3 -1
  406. package/src/util/peer.ts +53 -0
  407. package/src/util/xml.ts +1 -1
  408. package/src/vercel/project.ts +46 -1
  409. package/templates/hono/README.md +19 -0
  410. package/templates/hono/_env +1 -0
  411. package/templates/hono/_env.example +1 -0
  412. package/templates/hono/_gitignore +34 -0
  413. package/templates/hono/alchemy.run.ts +22 -0
  414. package/templates/hono/package.json +18 -0
  415. package/templates/hono/src/index.ts +17 -0
  416. package/templates/hono/tsconfig.json +13 -0
  417. package/templates/hono/types/env.d.ts +16 -0
  418. package/templates/react-router/vite.config.ts +5 -3
  419. package/workers/cloudflare-state-store.js +69 -74
  420. package/workers/dofs-state-store.js +1 -1
  421. package/bin/bootstrap-s3.ts +0 -255
  422. package/lib/ai/ark.d.ts +0 -12
  423. package/lib/ai/ark.d.ts.map +0 -1
  424. package/lib/ai/ark.js +0 -87
  425. package/lib/ai/ark.js.map +0 -1
  426. package/lib/ai/astro-file.d.ts +0 -138
  427. package/lib/ai/astro-file.d.ts.map +0 -1
  428. package/lib/ai/astro-file.js +0 -158
  429. package/lib/ai/astro-file.js.map +0 -1
  430. package/lib/ai/client.d.ts +0 -51
  431. package/lib/ai/client.d.ts.map +0 -1
  432. package/lib/ai/client.js +0 -58
  433. package/lib/ai/client.js.map +0 -1
  434. package/lib/ai/css-file.d.ts +0 -132
  435. package/lib/ai/css-file.d.ts.map +0 -1
  436. package/lib/ai/css-file.js +0 -142
  437. package/lib/ai/css-file.js.map +0 -1
  438. package/lib/ai/data.d.ts +0 -152
  439. package/lib/ai/data.d.ts.map +0 -1
  440. package/lib/ai/data.js +0 -120
  441. package/lib/ai/data.js.map +0 -1
  442. package/lib/ai/document.d.ts +0 -208
  443. package/lib/ai/document.d.ts.map +0 -1
  444. package/lib/ai/document.js +0 -206
  445. package/lib/ai/document.js.map +0 -1
  446. package/lib/ai/html-file.d.ts +0 -129
  447. package/lib/ai/html-file.d.ts.map +0 -1
  448. package/lib/ai/html-file.js +0 -139
  449. package/lib/ai/html-file.js.map +0 -1
  450. package/lib/ai/index.d.ts +0 -11
  451. package/lib/ai/index.d.ts.map +0 -1
  452. package/lib/ai/index.js +0 -11
  453. package/lib/ai/index.js.map +0 -1
  454. package/lib/ai/json-file.d.ts +0 -161
  455. package/lib/ai/json-file.d.ts.map +0 -1
  456. package/lib/ai/json-file.js +0 -188
  457. package/lib/ai/json-file.js.map +0 -1
  458. package/lib/ai/typescript-file.d.ts +0 -140
  459. package/lib/ai/typescript-file.d.ts.map +0 -1
  460. package/lib/ai/typescript-file.js +0 -146
  461. package/lib/ai/typescript-file.js.map +0 -1
  462. package/lib/ai/vue-file.d.ts +0 -127
  463. package/lib/ai/vue-file.d.ts.map +0 -1
  464. package/lib/ai/vue-file.js +0 -137
  465. package/lib/ai/vue-file.js.map +0 -1
  466. package/lib/ai/yaml-file.d.ts +0 -170
  467. package/lib/ai/yaml-file.d.ts.map +0 -1
  468. package/lib/ai/yaml-file.js +0 -201
  469. package/lib/ai/yaml-file.js.map +0 -1
  470. package/lib/fs/static-astro-file.d.ts +0 -35
  471. package/lib/fs/static-astro-file.d.ts.map +0 -1
  472. package/lib/fs/static-astro-file.js +0 -40
  473. package/lib/fs/static-astro-file.js.map +0 -1
  474. package/lib/fs/static-css-file.d.ts +0 -25
  475. package/lib/fs/static-css-file.d.ts.map +0 -1
  476. package/lib/fs/static-css-file.js +0 -30
  477. package/lib/fs/static-css-file.js.map +0 -1
  478. package/lib/fs/static-html-file.d.ts +0 -32
  479. package/lib/fs/static-html-file.d.ts.map +0 -1
  480. package/lib/fs/static-html-file.js +0 -37
  481. package/lib/fs/static-html-file.js.map +0 -1
  482. package/lib/fs/static-json-file.d.ts +0 -18
  483. package/lib/fs/static-json-file.d.ts.map +0 -1
  484. package/lib/fs/static-json-file.js +0 -19
  485. package/lib/fs/static-json-file.js.map +0 -1
  486. package/lib/fs/static-text-file.d.ts +0 -13
  487. package/lib/fs/static-text-file.d.ts.map +0 -1
  488. package/lib/fs/static-text-file.js +0 -9
  489. package/lib/fs/static-text-file.js.map +0 -1
  490. package/lib/fs/static-typescript-file.d.ts +0 -20
  491. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  492. package/lib/fs/static-typescript-file.js +0 -16
  493. package/lib/fs/static-typescript-file.js.map +0 -1
  494. package/lib/fs/static-vue-file.d.ts +0 -29
  495. package/lib/fs/static-vue-file.d.ts.map +0 -1
  496. package/lib/fs/static-vue-file.js +0 -34
  497. package/lib/fs/static-vue-file.js.map +0 -1
  498. package/lib/fs/static-yaml-file.d.ts +0 -23
  499. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  500. package/lib/fs/static-yaml-file.js +0 -10
  501. package/lib/fs/static-yaml-file.js.map +0 -1
  502. package/lib/internal/docs/providers.d.ts +0 -34
  503. package/lib/internal/docs/providers.d.ts.map +0 -1
  504. package/lib/internal/docs/providers.js +0 -200
  505. package/lib/internal/docs/providers.js.map +0 -1
  506. package/lib/runtime/bind.d.ts +0 -25
  507. package/lib/runtime/bind.d.ts.map +0 -1
  508. package/lib/runtime/bind.js +0 -76
  509. package/lib/runtime/bind.js.map +0 -1
  510. package/lib/runtime/global.d.ts +0 -8
  511. package/lib/runtime/global.d.ts.map +0 -1
  512. package/lib/runtime/global.js +0 -3
  513. package/lib/runtime/global.js.map +0 -1
  514. package/lib/runtime/plugin.d.ts +0 -35
  515. package/lib/runtime/plugin.d.ts.map +0 -1
  516. package/lib/runtime/plugin.js +0 -134
  517. package/lib/runtime/plugin.js.map +0 -1
  518. package/lib/runtime/shims.d.ts +0 -6
  519. package/lib/runtime/shims.d.ts.map +0 -1
  520. package/lib/runtime/shims.js +0 -27
  521. package/lib/runtime/shims.js.map +0 -1
  522. package/lib/runtime/state.d.ts +0 -5
  523. package/lib/runtime/state.d.ts.map +0 -1
  524. package/lib/runtime/state.js +0 -4
  525. package/lib/runtime/state.js.map +0 -1
  526. package/lib/web/astro.d.ts +0 -148
  527. package/lib/web/astro.d.ts.map +0 -1
  528. package/lib/web/astro.js +0 -419
  529. package/lib/web/astro.js.map +0 -1
  530. package/lib/web/shadcn-component.d.ts +0 -30
  531. package/lib/web/shadcn-component.d.ts.map +0 -1
  532. package/lib/web/shadcn-component.js +0 -25
  533. package/lib/web/shadcn-component.js.map +0 -1
  534. package/lib/web/shadcn.d.ts +0 -98
  535. package/lib/web/shadcn.d.ts.map +0 -1
  536. package/lib/web/shadcn.js +0 -102
  537. package/lib/web/shadcn.js.map +0 -1
  538. package/lib/web/tailwind.d.ts +0 -65
  539. package/lib/web/tailwind.d.ts.map +0 -1
  540. package/lib/web/tailwind.js +0 -98
  541. package/lib/web/tailwind.js.map +0 -1
  542. package/lib/web/vite.d.ts +0 -96
  543. package/lib/web/vite.d.ts.map +0 -1
  544. package/lib/web/vite.js +0 -232
  545. package/lib/web/vite.js.map +0 -1
  546. package/lib/web/vitepress/config.d.ts +0 -12
  547. package/lib/web/vitepress/config.d.ts.map +0 -1
  548. package/lib/web/vitepress/config.js +0 -33
  549. package/lib/web/vitepress/config.js.map +0 -1
  550. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  551. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  552. package/lib/web/vitepress/custom-theme.js +0 -337
  553. package/lib/web/vitepress/custom-theme.js.map +0 -1
  554. package/lib/web/vitepress/dependencies.d.ts +0 -13
  555. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  556. package/lib/web/vitepress/dependencies.js +0 -37
  557. package/lib/web/vitepress/dependencies.js.map +0 -1
  558. package/lib/web/vitepress/home-page.d.ts +0 -247
  559. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  560. package/lib/web/vitepress/home-page.js +0 -146
  561. package/lib/web/vitepress/home-page.js.map +0 -1
  562. package/lib/web/vitepress/index.d.ts +0 -6
  563. package/lib/web/vitepress/index.d.ts.map +0 -1
  564. package/lib/web/vitepress/index.js +0 -6
  565. package/lib/web/vitepress/index.js.map +0 -1
  566. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  567. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  568. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  569. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  570. package/lib/web/vitepress/vitepress.d.ts +0 -75
  571. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  572. package/lib/web/vitepress/vitepress.js +0 -254
  573. package/lib/web/vitepress/vitepress.js.map +0 -1
  574. package/src/ai/ark.ts +0 -118
  575. package/src/ai/astro-file.ts +0 -270
  576. package/src/ai/client.ts +0 -117
  577. package/src/ai/css-file.ts +0 -247
  578. package/src/ai/data.ts +0 -221
  579. package/src/ai/document.ts +0 -367
  580. package/src/ai/html-file.ts +0 -244
  581. package/src/ai/index.ts +0 -10
  582. package/src/ai/json-file.ts +0 -325
  583. package/src/ai/typescript-file.ts +0 -259
  584. package/src/ai/vue-file.ts +0 -242
  585. package/src/ai/yaml-file.ts +0 -328
  586. package/src/fs/static-astro-file.ts +0 -45
  587. package/src/fs/static-css-file.ts +0 -35
  588. package/src/fs/static-html-file.ts +0 -42
  589. package/src/fs/static-json-file.ts +0 -38
  590. package/src/fs/static-text-file.ts +0 -23
  591. package/src/fs/static-typescript-file.ts +0 -37
  592. package/src/fs/static-vue-file.ts +0 -39
  593. package/src/fs/static-yaml-file.ts +0 -33
  594. package/src/internal/docs/providers.ts +0 -286
  595. package/src/runtime/bind.ts +0 -95
  596. package/src/runtime/global.ts +0 -10
  597. package/src/runtime/plugin.ts +0 -163
  598. package/src/runtime/shims.js +0 -34
  599. package/src/runtime/state.ts +0 -9
  600. package/src/web/astro.ts +0 -643
  601. package/src/web/shadcn-component.ts +0 -72
  602. package/src/web/shadcn.ts +0 -221
  603. package/src/web/tailwind.ts +0 -167
  604. package/src/web/vite.ts +0 -407
  605. package/src/web/vitepress/config.ts +0 -50
  606. package/src/web/vitepress/custom-theme.ts +0 -514
  607. package/src/web/vitepress/dependencies.ts +0 -69
  608. package/src/web/vitepress/home-page.ts +0 -378
  609. package/src/web/vitepress/index.ts +0 -5
  610. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  611. package/src/web/vitepress/vitepress.ts +0 -372
  612. package/templates/sveltekit/bun.lock +0 -1099
@@ -1,242 +0,0 @@
1
- import { generateText } from "ai";
2
- import type { Context } from "../context.ts";
3
- import { StaticVueFile } from "../fs/static-vue-file.ts";
4
- import { Resource } from "../resource.ts";
5
- import type { Secret } from "../secret.ts";
6
- import { type ModelConfig, createModel } from "./client.ts";
7
-
8
- /**
9
- * Properties for creating or updating a VueFile
10
- */
11
- export interface VueFileProps {
12
- /**
13
- * Path to the Vue file
14
- */
15
- path: string;
16
-
17
- /**
18
- * Base URL for the OpenAI API
19
- * @default 'https://api.openai.com/v1'
20
- */
21
- baseURL?: string;
22
-
23
- /**
24
- * Prompt for generating content
25
- * Use alchemy template literals to include file context:
26
- * @example
27
- * prompt: await alchemy`
28
- * Generate a Vue component using:
29
- * ${alchemy.file("src/api.ts")}
30
- * `
31
- */
32
- prompt: string;
33
-
34
- /**
35
- * System prompt for the model
36
- * This is used to provide instructions to the model about how to format the response
37
- * The default system prompt instructs the model to return a single Vue component inside ```vue fences
38
- * @default "You are a Vue component generator. Create a single Vue component based on the user's requirements. Your response MUST include only a single Vue component inside ```vue fences. Do not include any other text, explanations, or multiple code blocks."
39
- */
40
- system?: string;
41
-
42
- /**
43
- * OpenAI API key to use for generating content
44
- * If not provided, will use OPENAI_API_KEY environment variable
45
- */
46
- apiKey?: Secret;
47
-
48
- /**
49
- * Model configuration
50
- */
51
- model?: ModelConfig;
52
-
53
- /**
54
- * Temperature for controlling randomness in generation.
55
- * Higher values (e.g., 0.8) make output more random,
56
- * lower values (e.g., 0.2) make it more deterministic.
57
- * @default 0.7
58
- */
59
- temperature?: number;
60
- }
61
-
62
- /**
63
- * A Vue file that can be created, updated, and deleted
64
- */
65
- export interface VueFile extends VueFileProps, Resource<"ai::VueFile"> {
66
- /**
67
- * Content of the Vue file
68
- */
69
- content: string;
70
-
71
- /**
72
- * Time at which the file was created
73
- */
74
- createdAt: number;
75
-
76
- /**
77
- * Time at which the file was last updated
78
- */
79
- updatedAt: number;
80
- }
81
-
82
- /**
83
- * Default system prompt for Vue file generation
84
- */
85
- const DEFAULT_VUE_SYSTEM_PROMPT =
86
- "You are a Vue component generator. Create a single Vue component based on the user's requirements. Your response MUST include only a single Vue component inside ```vue fences. Do not include any other text, explanations, or multiple code blocks.";
87
-
88
- /**
89
- * Resource for generating Vue files using AI models.
90
- * Extracts Vue code from between ```vue fences and validates the response.
91
- *
92
- * @example
93
- * // Create a simple Vue component
94
- * const button = await VueFile("button-component", {
95
- * path: "./src/components/Button.vue",
96
- * prompt: await alchemy`
97
- * Generate a customizable button Vue component with:
98
- * - Primary, secondary, and outline variants
99
- * - Small, medium, and large sizes
100
- * - Loading state with spinner
101
- * - Disabled state
102
- * `,
103
- * model: {
104
- * id: "gpt-4o",
105
- * provider: "openai"
106
- * }
107
- * });
108
- *
109
- * @example
110
- * // Generate a Vue component using existing files as reference
111
- * const userCard = await VueFile("user-card", {
112
- * path: "./src/components/UserCard.vue",
113
- * prompt: await alchemy`
114
- * Create a UserCard Vue component that displays user information.
115
- * Follow the styling patterns from:
116
- * ${alchemy.file("src/components/Card.vue")}
117
- *
118
- * Use the user type from:
119
- * ${alchemy.file("src/types/User.ts")}
120
- * `,
121
- * temperature: 0.2
122
- * });
123
- *
124
- * @example
125
- * // Generate a complex form component with validation and custom system prompt
126
- * const form = await VueFile("registration-form", {
127
- * path: "./src/components/RegistrationForm.vue",
128
- * prompt: await alchemy`
129
- * Generate a registration form Vue component with:
130
- * - Email, password, and confirm password fields
131
- * - Form validation using Vuelidate or similar
132
- * - Error messages for each field
133
- * - Submit handler that emits form data
134
- *
135
- * Follow these style guidelines:
136
- * ${alchemy.file("src/styles/guidelines.md")}
137
- * `,
138
- * system: "You are an expert Vue component creator specializing in form components with validation. Create a single Vue component inside ```vue fences with no additional text.",
139
- * model: {
140
- * id: "claude-3-opus-20240229",
141
- * provider: "anthropic"
142
- * }
143
- * });
144
- */
145
- export const VueFile = Resource(
146
- "ai::VueFile",
147
- async function (
148
- this: Context<VueFile>,
149
- _id: string,
150
- props: VueFileProps,
151
- ): Promise<VueFile> {
152
- // Handle deletion phase
153
- if (this.phase === "delete") {
154
- return this.destroy();
155
- }
156
-
157
- // Use provided system prompt or default
158
- const system = props.system || DEFAULT_VUE_SYSTEM_PROMPT;
159
-
160
- // Generate initial content
161
- const { text } = await generateText({
162
- model: createModel(props),
163
- prompt: props.prompt,
164
- system,
165
- providerOptions: props.model?.options,
166
- ...(props.temperature === undefined
167
- ? {}
168
- : { temperature: props.temperature }),
169
- });
170
-
171
- // Extract and validate Vue code
172
- let { code, error } = await extractVueCode(text);
173
-
174
- // Re-prompt if there are validation errors
175
- if (error) {
176
- const errorSystem = `${system}\n\nERROR: ${error}\n\nPlease try again and ensure your response contains exactly one Vue component inside \`\`\`vue fences.`;
177
-
178
- const { text: retryText } = await generateText({
179
- model: createModel(props),
180
- prompt: props.prompt,
181
- system: errorSystem,
182
- providerOptions: props.model?.options,
183
- ...(props.temperature === undefined
184
- ? {}
185
- : { temperature: props.temperature }),
186
- });
187
-
188
- const retryResult = await extractVueCode(retryText);
189
-
190
- if (retryResult.error) {
191
- throw new Error(
192
- `Failed to generate valid Vue code: ${retryResult.error}`,
193
- );
194
- }
195
-
196
- code = retryResult.code;
197
- }
198
-
199
- // Use StaticVueFile to create/update the file
200
- const file = await StaticVueFile("file", props.path, code);
201
-
202
- // Return the resource
203
- return this({
204
- ...props,
205
- content: file.content,
206
- createdAt: Date.now(),
207
- updatedAt: Date.now(),
208
- });
209
- },
210
- );
211
-
212
- /**
213
- * Extracts Vue code from between ```vue fences
214
- * Validates that exactly one Vue code block exists
215
- *
216
- * @param text The text to extract Vue code from
217
- * @returns The extracted Vue code or error message
218
- */
219
- async function extractVueCode(
220
- text: string,
221
- ): Promise<{ code: string; error?: string }> {
222
- const vueCodeRegex = /```vue\s*([\s\S]*?)```/g;
223
- const matches = Array.from(text.matchAll(vueCodeRegex));
224
-
225
- if (matches.length === 0) {
226
- return {
227
- code: "",
228
- error:
229
- "No Vue code block found in the response. Please include your code within ```vue fences.",
230
- };
231
- }
232
-
233
- if (matches.length > 1) {
234
- return {
235
- code: "",
236
- error:
237
- "Multiple Vue code blocks found in the response. Please provide exactly one code block within ```vue fences.",
238
- };
239
- }
240
-
241
- return { code: matches[0][1].trim() };
242
- }
@@ -1,328 +0,0 @@
1
- import { generateObject, generateText } from "ai";
2
- import type { JsonSchema, Type, type } from "arktype";
3
- import type { Context } from "../context.ts";
4
- import { StaticYamlFile } from "../fs/static-yaml-file.ts";
5
- import { Resource } from "../resource.ts";
6
- import type { Secret } from "../secret.ts";
7
- import { ark } from "./ark.ts";
8
- import { type ModelConfig, createModel } from "./client.ts";
9
-
10
- /**
11
- * Properties for creating or updating a YAMLFile
12
- */
13
- export interface YAMLFileProps<
14
- T extends Type<any, any> | undefined = undefined,
15
- > {
16
- /**
17
- * Path to the YAML file
18
- */
19
- path: string;
20
-
21
- /**
22
- * Optional ArkType schema to validate and structure the generated YAML
23
- * When provided, the resource will use generateObject with schema validation
24
- * When not provided, it will extract YAML from between ```yaml fences
25
- */
26
- schema?: T;
27
-
28
- /**
29
- * Base URL for the OpenAI API
30
- * @default 'https://api.openai.com/v1'
31
- */
32
- baseURL?: string;
33
-
34
- /**
35
- * Prompt for generating content
36
- * Use alchemy template literals to include file context:
37
- * @example
38
- * prompt: await alchemy`
39
- * Generate a YAML configuration for:
40
- * ${alchemy.file("src/serverless.js")}
41
- * `
42
- */
43
- prompt: string;
44
-
45
- /**
46
- * System prompt for the model
47
- * This is used to provide instructions to the model about how to format the response
48
- * @default Depends on whether schema is provided
49
- */
50
- system?: string;
51
-
52
- /**
53
- * OpenAI API key to use for generating content
54
- * If not provided, will use OPENAI_API_KEY environment variable
55
- */
56
- apiKey?: Secret;
57
-
58
- /**
59
- * Model configuration
60
- */
61
- model?: ModelConfig;
62
-
63
- /**
64
- * Temperature for controlling randomness in generation.
65
- * Higher values (e.g., 0.8) make output more random,
66
- * lower values (e.g., 0.2) make it more deterministic.
67
- * @default 0.7
68
- */
69
- temperature?: number;
70
- }
71
-
72
- /**
73
- * A YAML file that can be created, updated, and deleted
74
- */
75
- export interface YAMLFile<T = any>
76
- extends Omit<YAMLFileProps, "schema">,
77
- Resource<"ai::YAMLFile"> {
78
- /**
79
- * Content of the YAML file as a string
80
- */
81
- content: string;
82
-
83
- /**
84
- * Parsed YAML object
85
- */
86
- yaml: T;
87
-
88
- /**
89
- * Schema used to validate the YAML (if provided)
90
- */
91
- schema?: JsonSchema;
92
-
93
- /**
94
- * Time at which the file was created
95
- */
96
- createdAt: number;
97
-
98
- /**
99
- * Time at which the file was last updated
100
- */
101
- updatedAt: number;
102
- }
103
-
104
- /**
105
- * Default system prompt for YAML file generation without schema
106
- */
107
- const DEFAULT_YAML_SYSTEM_PROMPT =
108
- "You are a YAML generator. Create valid YAML based on the user's requirements. Your response MUST include only YAML inside ```yaml fences. Do not include any other text, explanations, or multiple code blocks. Use standard YAML syntax with proper indentation. Use quotes around strings that contain special characters when necessary.";
109
-
110
- /**
111
- * Resource for generating YAML files using AI models.
112
- * Can operate in two modes:
113
- * 1. With schema: Uses generateObject with type validation, then converts to YAML
114
- * 2. Without schema: Extracts YAML from between ```yaml fences
115
- *
116
- * @example
117
- * // Generate a serverless configuration file
118
- * const serverlessConfig = await YAMLFile("serverless-config", {
119
- * path: "./serverless.yml",
120
- * prompt: await alchemy`
121
- * Generate a serverless.yml configuration for an AWS Lambda API with:
122
- * - A service name "user-api"
123
- * - Node.js 16.x runtime
124
- * - Three functions: createUser, getUser, and listUsers
125
- * - API Gateway endpoints for each function
126
- * - DynamoDB table for users
127
- * - IAM permissions for DynamoDB access
128
- * `,
129
- * model: {
130
- * id: "gpt-4o",
131
- * provider: "openai"
132
- * }
133
- * });
134
- *
135
- * @example
136
- * // Generate YAML with schema validation
137
- * import { type } from "arktype";
138
- *
139
- * const k8sConfigSchema = type({
140
- * apiVersion: "string",
141
- * kind: "string",
142
- * metadata: {
143
- * name: "string",
144
- * namespace: "string?",
145
- * labels: "Record<string, string>?"
146
- * },
147
- * spec: {
148
- * replicas: "number",
149
- * selector: {
150
- * matchLabels: "Record<string, string>"
151
- * },
152
- * template: {
153
- * metadata: {
154
- * labels: "Record<string, string>"
155
- * },
156
- * spec: {
157
- * containers: [{
158
- * name: "string",
159
- * image: "string",
160
- * ports: [{
161
- * containerPort: "number"
162
- * }]
163
- * }]
164
- * }
165
- * }
166
- * }
167
- * });
168
- *
169
- * const deployment = await YAMLFile("k8s-deployment", {
170
- * path: "./kubernetes/deployment.yaml",
171
- * schema: k8sConfigSchema,
172
- * prompt: "Generate a Kubernetes deployment for a web application named 'frontend' with 3 replicas using the nginx:latest image and exposing port 80",
173
- * temperature: 0.2
174
- * });
175
- *
176
- * @example
177
- * // Generate GitHub Actions workflow with custom system prompt
178
- * const workflow = await YAMLFile("github-workflow", {
179
- * path: "./.github/workflows/ci.yml",
180
- * prompt: await alchemy`
181
- * Create a GitHub Actions workflow for a Node.js project that:
182
- * - Runs on push to main and pull requests
183
- * - Sets up Node.js 18
184
- * - Installs dependencies with npm
185
- * - Runs linting and tests
186
- * - Builds the project
187
- * - Deploys to GitHub Pages on success (main branch only)
188
- * `,
189
- * system: "You are a DevOps expert specializing in GitHub Actions workflows. Create a single YAML file inside ```yaml fences with no additional text. Follow GitHub Actions best practices and use proper YAML syntax.",
190
- * model: {
191
- * id: "claude-3-opus-20240229",
192
- * provider: "anthropic"
193
- * }
194
- * });
195
- */
196
- export const YAMLFile = Resource("ai::YAMLFile", async function <
197
- const T extends Type<any, any> | undefined = undefined,
198
- >(this: Context<YAMLFile<T extends Type<any, any> ? type.infer<T> : any>>, _id: string, props: YAMLFileProps<T>): Promise<
199
- YAMLFile<T extends Type<any, any> ? type.infer<T> : any>
200
- > {
201
- // Handle deletion phase
202
- if (this.phase === "delete") {
203
- return this.destroy();
204
- }
205
-
206
- let yamlContent: string;
207
- let yamlObject: any;
208
-
209
- // Check if schema is provided
210
- if (props.schema) {
211
- // Use schema-based generation
212
- const { object } = await generateObject({
213
- model: createModel(props),
214
- schema: ark.schema<type.infer<typeof props.schema>>(props.schema),
215
- providerOptions: props.model?.options,
216
- system:
217
- props.system ||
218
- "Generate a valid object based on the provided requirements.",
219
- prompt: props.prompt,
220
- ...(props.temperature === undefined
221
- ? {}
222
- : { temperature: props.temperature }),
223
- });
224
-
225
- yamlObject = object;
226
-
227
- // Let StaticYamlFile handle the YAML conversion
228
- const file = await StaticYamlFile("file", props.path, yamlObject);
229
- yamlContent = file.content;
230
- } else {
231
- // Use fence-based extraction
232
- // Use provided system prompt or default
233
- const system = props.system || DEFAULT_YAML_SYSTEM_PROMPT;
234
-
235
- // Generate initial content
236
- const { text } = await generateText({
237
- model: createModel(props),
238
- prompt: props.prompt,
239
- system,
240
- providerOptions: props.model?.options,
241
- ...(props.temperature === undefined
242
- ? {}
243
- : { temperature: props.temperature }),
244
- });
245
-
246
- // Extract and validate YAML content
247
- let { content, error } = await extractYAMLContent(text);
248
-
249
- // Re-prompt if there are validation errors
250
- if (error) {
251
- const errorSystem = `${system}\n\nERROR: ${error}\n\nPlease try again and ensure your response contains exactly one YAML block inside \`\`\`yaml fences.`;
252
-
253
- const { text: retryText } = await generateText({
254
- model: createModel(props),
255
- prompt: props.prompt,
256
- system: errorSystem,
257
- providerOptions: props.model?.options,
258
- ...(props.temperature === undefined
259
- ? {}
260
- : { temperature: props.temperature }),
261
- });
262
-
263
- const retryResult = await extractYAMLContent(retryText);
264
-
265
- if (retryResult.error) {
266
- throw new Error(`Failed to generate valid YAML: ${retryResult.error}`);
267
- }
268
-
269
- content = retryResult.content;
270
- }
271
-
272
- yamlContent = content;
273
-
274
- // Create the file with the string content
275
- const _file = await StaticYamlFile("file", props.path, yamlContent);
276
-
277
- // We need to parse the YAML to get the object representation
278
- const yaml = await import("yaml");
279
- yamlObject = yaml.parse(yamlContent);
280
- }
281
-
282
- // Return the resource
283
- return this({
284
- ...props,
285
- schema: props.schema,
286
- content: yamlContent,
287
- yaml: yamlObject,
288
- createdAt: Date.now(),
289
- updatedAt: Date.now(),
290
- });
291
- });
292
-
293
- /**
294
- * Extracts YAML content from between ```yaml fences
295
- * Validates that exactly one YAML code block exists
296
- *
297
- * @param text The text to extract YAML from
298
- * @returns The extracted YAML or error message
299
- */
300
- async function extractYAMLContent(
301
- text: string,
302
- ): Promise<{ content: string; error?: string }> {
303
- // Check for yaml or yml fence blocks
304
- const yamlCodeRegex = /```(yaml|yml)\s*([\s\S]*?)```/g;
305
- const matches = Array.from(text.matchAll(yamlCodeRegex));
306
-
307
- if (matches.length === 0) {
308
- return {
309
- content: "",
310
- error:
311
- "No YAML code block found in the response. Please include your YAML within ```yaml fences.",
312
- };
313
- }
314
-
315
- if (matches.length > 1) {
316
- return {
317
- content: "",
318
- error:
319
- "Multiple YAML code blocks found in the response. Please provide exactly one YAML block within ```yaml fences.",
320
- };
321
- }
322
-
323
- const content = matches[0][2].trim();
324
-
325
- // We don't validate YAML parsing here because js-yaml might not be available
326
- // Validation will happen at usage time if needed
327
- return { content };
328
- }
@@ -1,45 +0,0 @@
1
- import { File } from "./file.ts";
2
-
3
- export type StaticAstroFile = File;
4
-
5
- /**
6
- * Creates a static Astro component file
7
- *
8
- * @example
9
- * // Create an Astro component file with content
10
- * const header = await StaticAstroFile("Header.astro",
11
- * `---
12
- * import Logo from '../components/Logo.astro';
13
- * const navItems = ['Home', 'About', 'Contact'];
14
- * ---
15
- *
16
- * <header class="header">
17
- * <Logo />
18
- * <nav>
19
- * <ul>
20
- * {navItems.map(item => (
21
- * <li><a href={`/${item.toLowerCase()}`}>{item}</a></li>
22
- * ))}
23
- * </ul>
24
- * </nav>
25
- * </header>
26
- *
27
- * <style>
28
- * .header {
29
- * display: flex;
30
- * justify-content: space-between;
31
- * padding: 1rem;
32
- * }
33
- * </style>`
34
- * );
35
- */
36
- export function StaticAstroFile(
37
- id: string,
38
- ...args: [content: string] | [path: string, content: string]
39
- ): Promise<StaticAstroFile> {
40
- const [path, content] = args.length === 1 ? [id, args[0]] : args;
41
- return File(id, {
42
- path,
43
- content,
44
- });
45
- }
@@ -1,35 +0,0 @@
1
- import { File } from "./file.ts";
2
-
3
- export type StaticCSSFile = File;
4
-
5
- /**
6
- * Creates a static CSS file
7
- *
8
- * @example
9
- * // Create a CSS file with styles
10
- * const styles = await StaticCSSFile("styles.css",
11
- * `.container {
12
- * max-width: 1200px;
13
- * margin: 0 auto;
14
- * padding: 0 1rem;
15
- * }
16
- *
17
- * .button {
18
- * background-color: #0062ff;
19
- * color: white;
20
- * border: none;
21
- * padding: 0.5rem 1rem;
22
- * border-radius: 4px;
23
- * }`
24
- * );
25
- */
26
- export function StaticCSSFile(
27
- id: string,
28
- ...args: [content: string] | [path: string, content: string]
29
- ): Promise<StaticCSSFile> {
30
- const [path, content] = args.length === 1 ? [id, args[0]] : args;
31
- return File(id, {
32
- path,
33
- content,
34
- });
35
- }
@@ -1,42 +0,0 @@
1
- import { File } from "./file.ts";
2
-
3
- export type StaticHTMLFile = File;
4
-
5
- /**
6
- * Creates a static HTML file
7
- *
8
- * @example
9
- * // Create an HTML file with content
10
- * const page = await StaticHTMLFile("index.html",
11
- * `<!DOCTYPE html>
12
- * <html lang="en">
13
- * <head>
14
- * <meta charset="UTF-8">
15
- * <meta name="viewport" content="width=device-width, initial-scale=1.0">
16
- * <title>My Website</title>
17
- * <link rel="stylesheet" href="styles.css">
18
- * </head>
19
- * <body>
20
- * <header>
21
- * <h1>Welcome to My Website</h1>
22
- * </header>
23
- * <main>
24
- * <p>This is the main content of the page.</p>
25
- * </main>
26
- * <footer>
27
- * <p>&copy; 2024 My Company</p>
28
- * </footer>
29
- * </body>
30
- * </html>`
31
- * );
32
- */
33
- export function StaticHTMLFile(
34
- id: string,
35
- ...args: [content: string] | [path: string, content: string]
36
- ): Promise<StaticHTMLFile> {
37
- const [path, content] = args.length === 1 ? [id, args[0]] : args;
38
- return File(id, {
39
- path,
40
- content,
41
- });
42
- }