alchemy 0.62.2 → 0.63.0

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 (611) hide show
  1. package/bin/alchemy.js +1518 -1204
  2. package/bin/commands/deploy.ts +2 -0
  3. package/bin/commands/dev.ts +2 -0
  4. package/bin/services/execute-alchemy.ts +11 -0
  5. package/bin/services/template-manager.ts +2 -0
  6. package/bin/types.ts +2 -1
  7. package/lib/alchemy.d.ts +6 -22
  8. package/lib/alchemy.d.ts.map +1 -1
  9. package/lib/alchemy.js +65 -169
  10. package/lib/alchemy.js.map +1 -1
  11. package/lib/apply.d.ts +0 -2
  12. package/lib/apply.d.ts.map +1 -1
  13. package/lib/apply.js +2 -16
  14. package/lib/apply.js.map +1 -1
  15. package/lib/aws/account-id.d.ts.map +1 -1
  16. package/lib/aws/account-id.js +3 -2
  17. package/lib/aws/account-id.js.map +1 -1
  18. package/lib/aws/bucket.d.ts +8 -2
  19. package/lib/aws/bucket.d.ts.map +1 -1
  20. package/lib/aws/bucket.js +21 -14
  21. package/lib/aws/bucket.js.map +1 -1
  22. package/lib/aws/ec2/security-group.d.ts +8 -2
  23. package/lib/aws/ec2/security-group.d.ts.map +1 -1
  24. package/lib/aws/ec2/security-group.js +7 -2
  25. package/lib/aws/ec2/security-group.js.map +1 -1
  26. package/lib/aws/function.d.ts +9 -3
  27. package/lib/aws/function.d.ts.map +1 -1
  28. package/lib/aws/function.js +35 -26
  29. package/lib/aws/function.js.map +1 -1
  30. package/lib/aws/policy-attachment.d.ts.map +1 -1
  31. package/lib/aws/policy-attachment.js +2 -1
  32. package/lib/aws/policy-attachment.js.map +1 -1
  33. package/lib/aws/policy.d.ts +8 -2
  34. package/lib/aws/policy.d.ts.map +1 -1
  35. package/lib/aws/policy.js +13 -4
  36. package/lib/aws/policy.js.map +1 -1
  37. package/lib/aws/queue.d.ts +8 -2
  38. package/lib/aws/queue.d.ts.map +1 -1
  39. package/lib/aws/queue.js +22 -14
  40. package/lib/aws/queue.js.map +1 -1
  41. package/lib/aws/role.d.ts +8 -2
  42. package/lib/aws/role.d.ts.map +1 -1
  43. package/lib/aws/role.js +10 -3
  44. package/lib/aws/role.js.map +1 -1
  45. package/lib/aws/ses.d.ts +1 -1
  46. package/lib/aws/ses.d.ts.map +1 -1
  47. package/lib/aws/ses.js +2 -1
  48. package/lib/aws/ses.js.map +1 -1
  49. package/lib/aws/ssm-parameter.d.ts +8 -2
  50. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  51. package/lib/aws/ssm-parameter.js +15 -10
  52. package/lib/aws/ssm-parameter.js.map +1 -1
  53. package/lib/aws/table.d.ts +8 -2
  54. package/lib/aws/table.d.ts.map +1 -1
  55. package/lib/aws/table.js +17 -9
  56. package/lib/aws/table.js.map +1 -1
  57. package/lib/cloudflare/account-api-token.d.ts +2 -2
  58. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  59. package/lib/cloudflare/account-api-token.js +7 -6
  60. package/lib/cloudflare/account-api-token.js.map +1 -1
  61. package/lib/cloudflare/ai-gateway.d.ts +9 -4
  62. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  63. package/lib/cloudflare/ai-gateway.js +20 -24
  64. package/lib/cloudflare/ai-gateway.js.map +1 -1
  65. package/lib/cloudflare/api-schema.d.ts +2 -2
  66. package/lib/cloudflare/api-schema.d.ts.map +1 -1
  67. package/lib/cloudflare/api-schema.js +6 -2
  68. package/lib/cloudflare/api-schema.js.map +1 -1
  69. package/lib/cloudflare/api-shield.d.ts +5 -1
  70. package/lib/cloudflare/api-shield.d.ts.map +1 -1
  71. package/lib/cloudflare/api-shield.js +6 -1
  72. package/lib/cloudflare/api-shield.js.map +1 -1
  73. package/lib/cloudflare/assets.d.ts +1 -1
  74. package/lib/cloudflare/assets.d.ts.map +1 -1
  75. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  76. package/lib/cloudflare/astro/astro.js +3 -1
  77. package/lib/cloudflare/astro/astro.js.map +1 -1
  78. package/lib/cloudflare/astro/plugin.d.ts +2 -1
  79. package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
  80. package/lib/cloudflare/astro/plugin.js.map +1 -1
  81. package/lib/cloudflare/bindings.d.ts +2 -2
  82. package/lib/cloudflare/bindings.d.ts.map +1 -1
  83. package/lib/cloudflare/bound.d.ts +1 -1
  84. package/lib/cloudflare/bound.d.ts.map +1 -1
  85. package/lib/cloudflare/bucket.d.ts +120 -1
  86. package/lib/cloudflare/bucket.d.ts.map +1 -1
  87. package/lib/cloudflare/bucket.js +80 -2
  88. package/lib/cloudflare/bucket.js.map +1 -1
  89. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  90. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  91. package/lib/cloudflare/container.d.ts +10 -4
  92. package/lib/cloudflare/container.d.ts.map +1 -1
  93. package/lib/cloudflare/container.js +12 -9
  94. package/lib/cloudflare/container.js.map +1 -1
  95. package/lib/cloudflare/custom-domain.js +2 -1
  96. package/lib/cloudflare/custom-domain.js.map +1 -1
  97. package/lib/cloudflare/d1-database.d.ts +1 -1
  98. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  99. package/lib/cloudflare/d1-database.js +7 -3
  100. package/lib/cloudflare/d1-database.js.map +1 -1
  101. package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
  102. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  103. package/lib/cloudflare/dispatch-namespace.js +7 -5
  104. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  105. package/lib/cloudflare/hyperdrive.d.ts +7 -1
  106. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  107. package/lib/cloudflare/hyperdrive.js +2 -1
  108. package/lib/cloudflare/hyperdrive.js.map +1 -1
  109. package/lib/cloudflare/kv-namespace.d.ts +3 -0
  110. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  111. package/lib/cloudflare/kv-namespace.js +11 -2
  112. package/lib/cloudflare/kv-namespace.js.map +1 -1
  113. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
  114. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  115. package/lib/cloudflare/miniflare/paths.d.ts +4 -0
  116. package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
  117. package/lib/cloudflare/miniflare/paths.js +11 -0
  118. package/lib/cloudflare/miniflare/paths.js.map +1 -1
  119. package/lib/cloudflare/pipeline.d.ts +14 -3
  120. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  121. package/lib/cloudflare/pipeline.js +31 -2
  122. package/lib/cloudflare/pipeline.js.map +1 -1
  123. package/lib/cloudflare/queue-consumer.js +1 -1
  124. package/lib/cloudflare/queue-consumer.js.map +1 -1
  125. package/lib/cloudflare/queue.d.ts +6 -4
  126. package/lib/cloudflare/queue.d.ts.map +1 -1
  127. package/lib/cloudflare/queue.js +13 -9
  128. package/lib/cloudflare/queue.js.map +1 -1
  129. package/lib/cloudflare/react-router/plugin.d.ts +1 -1
  130. package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
  131. package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
  132. package/lib/cloudflare/react-router/react-router.js +32 -2
  133. package/lib/cloudflare/react-router/react-router.js.map +1 -1
  134. package/lib/cloudflare/redwood/plugin.d.ts +2 -1
  135. package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
  136. package/lib/cloudflare/redwood/plugin.js.map +1 -1
  137. package/lib/cloudflare/route.js +1 -1
  138. package/lib/cloudflare/route.js.map +1 -1
  139. package/lib/cloudflare/ruleset.d.ts +3 -1
  140. package/lib/cloudflare/ruleset.d.ts.map +1 -1
  141. package/lib/cloudflare/ruleset.js +3 -2
  142. package/lib/cloudflare/ruleset.js.map +1 -1
  143. package/lib/cloudflare/secret.d.ts +6 -23
  144. package/lib/cloudflare/secret.d.ts.map +1 -1
  145. package/lib/cloudflare/secret.js +8 -4
  146. package/lib/cloudflare/secret.js.map +1 -1
  147. package/lib/cloudflare/secrets-store.d.ts +1 -1
  148. package/lib/cloudflare/secrets-store.d.ts.map +1 -1
  149. package/lib/cloudflare/secrets-store.js +5 -2
  150. package/lib/cloudflare/secrets-store.js.map +1 -1
  151. package/lib/cloudflare/tunnel.d.ts +5 -1
  152. package/lib/cloudflare/tunnel.d.ts.map +1 -1
  153. package/lib/cloudflare/tunnel.js +5 -1
  154. package/lib/cloudflare/tunnel.js.map +1 -1
  155. package/lib/cloudflare/vectorize-index.d.ts +7 -1
  156. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  157. package/lib/cloudflare/vectorize-index.js +5 -2
  158. package/lib/cloudflare/vectorize-index.js.map +1 -1
  159. package/lib/cloudflare/vite/plugin.d.ts +2 -1
  160. package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
  161. package/lib/cloudflare/vite/plugin.js.map +1 -1
  162. package/lib/cloudflare/vite/vite.d.ts +1 -1
  163. package/lib/cloudflare/vite/vite.d.ts.map +1 -1
  164. package/lib/cloudflare/vite/vite.js +1 -1
  165. package/lib/cloudflare/vite/vite.js.map +1 -1
  166. package/lib/cloudflare/website.js +1 -1
  167. package/lib/cloudflare/website.js.map +1 -1
  168. package/lib/cloudflare/worker.d.ts +1 -1
  169. package/lib/cloudflare/worker.d.ts.map +1 -1
  170. package/lib/cloudflare/worker.js +12 -7
  171. package/lib/cloudflare/worker.js.map +1 -1
  172. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  173. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  174. package/lib/cloudflare/wrangler.json.js +5 -3
  175. package/lib/cloudflare/wrangler.json.js.map +1 -1
  176. package/lib/docker/container.d.ts +6 -0
  177. package/lib/docker/container.d.ts.map +1 -1
  178. package/lib/docker/container.js +5 -1
  179. package/lib/docker/container.js.map +1 -1
  180. package/lib/docker/network.d.ts +8 -2
  181. package/lib/docker/network.d.ts.map +1 -1
  182. package/lib/docker/network.js +7 -2
  183. package/lib/docker/network.js.map +1 -1
  184. package/lib/docker/volume.d.ts +8 -2
  185. package/lib/docker/volume.d.ts.map +1 -1
  186. package/lib/docker/volume.js +6 -4
  187. package/lib/docker/volume.js.map +1 -1
  188. package/lib/esbuild/bundle.d.ts +1 -1
  189. package/lib/fs/index.d.ts +0 -8
  190. package/lib/fs/index.d.ts.map +1 -1
  191. package/lib/fs/index.js +0 -8
  192. package/lib/fs/index.js.map +1 -1
  193. package/lib/github/client.d.ts +1 -1
  194. package/lib/github/client.d.ts.map +1 -1
  195. package/lib/github/client.js +2 -1
  196. package/lib/github/client.js.map +1 -1
  197. package/lib/github/repository-environment.d.ts +8 -2
  198. package/lib/github/repository-environment.d.ts.map +1 -1
  199. package/lib/github/repository-environment.js +16 -12
  200. package/lib/github/repository-environment.js.map +1 -1
  201. package/lib/neon/project.d.ts +7 -1
  202. package/lib/neon/project.d.ts.map +1 -1
  203. package/lib/neon/project.js +10 -6
  204. package/lib/neon/project.js.map +1 -1
  205. package/lib/planetscale/branch.d.ts +4 -2
  206. package/lib/planetscale/branch.d.ts.map +1 -1
  207. package/lib/planetscale/branch.js +18 -12
  208. package/lib/planetscale/branch.js.map +1 -1
  209. package/lib/planetscale/database.d.ts +8 -2
  210. package/lib/planetscale/database.d.ts.map +1 -1
  211. package/lib/planetscale/database.js +24 -16
  212. package/lib/planetscale/database.js.map +1 -1
  213. package/lib/planetscale/password.d.ts +8 -2
  214. package/lib/planetscale/password.d.ts.map +1 -1
  215. package/lib/planetscale/password.js +2 -2
  216. package/lib/planetscale/password.js.map +1 -1
  217. package/lib/resource.d.ts +0 -2
  218. package/lib/resource.d.ts.map +1 -1
  219. package/lib/resource.js +1 -9
  220. package/lib/resource.js.map +1 -1
  221. package/lib/scope.d.ts +9 -3
  222. package/lib/scope.d.ts.map +1 -1
  223. package/lib/scope.js +21 -34
  224. package/lib/scope.js.map +1 -1
  225. package/lib/sentry/client-key.d.ts +7 -1
  226. package/lib/sentry/client-key.d.ts.map +1 -1
  227. package/lib/sentry/client-key.js +45 -6
  228. package/lib/sentry/client-key.js.map +1 -1
  229. package/lib/sentry/project.d.ts +8 -2
  230. package/lib/sentry/project.d.ts.map +1 -1
  231. package/lib/sentry/project.js +35 -5
  232. package/lib/sentry/project.js.map +1 -1
  233. package/lib/sentry/team.d.ts +8 -2
  234. package/lib/sentry/team.d.ts.map +1 -1
  235. package/lib/sentry/team.js +36 -6
  236. package/lib/sentry/team.js.map +1 -1
  237. package/lib/serde.d.ts +0 -5
  238. package/lib/serde.d.ts.map +1 -1
  239. package/lib/serde.js +0 -28
  240. package/lib/serde.js.map +1 -1
  241. package/lib/state/d1-state-store.d.ts +1 -1
  242. package/lib/state/d1-state-store.d.ts.map +1 -1
  243. package/lib/state/d1-state-store.js +5 -5
  244. package/lib/state/d1-state-store.js.map +1 -1
  245. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  246. package/lib/state/sqlite-state-store.js +7 -11
  247. package/lib/state/sqlite-state-store.js.map +1 -1
  248. package/lib/stripe/card.d.ts.map +1 -1
  249. package/lib/stripe/card.js +3 -2
  250. package/lib/stripe/card.js.map +1 -1
  251. package/lib/stripe/client.d.ts +2 -2
  252. package/lib/stripe/client.d.ts.map +1 -1
  253. package/lib/stripe/client.js +4 -3
  254. package/lib/stripe/client.js.map +1 -1
  255. package/lib/stripe/coupon.d.ts.map +1 -1
  256. package/lib/stripe/coupon.js +4 -3
  257. package/lib/stripe/coupon.js.map +1 -1
  258. package/lib/stripe/customer.js +2 -2
  259. package/lib/stripe/customer.js.map +1 -1
  260. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  261. package/lib/stripe/entitlements-feature.js +3 -2
  262. package/lib/stripe/entitlements-feature.js.map +1 -1
  263. package/lib/stripe/file.d.ts.map +1 -1
  264. package/lib/stripe/file.js +3 -2
  265. package/lib/stripe/file.js.map +1 -1
  266. package/lib/stripe/meter.js +2 -2
  267. package/lib/stripe/meter.js.map +1 -1
  268. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  269. package/lib/stripe/portal-configuration.js +3 -2
  270. package/lib/stripe/portal-configuration.js.map +1 -1
  271. package/lib/stripe/price.d.ts.map +1 -1
  272. package/lib/stripe/price.js +3 -2
  273. package/lib/stripe/price.js.map +1 -1
  274. package/lib/stripe/product-feature.d.ts.map +1 -1
  275. package/lib/stripe/product-feature.js +3 -2
  276. package/lib/stripe/product-feature.js.map +1 -1
  277. package/lib/stripe/product.d.ts.map +1 -1
  278. package/lib/stripe/product.js +3 -2
  279. package/lib/stripe/product.js.map +1 -1
  280. package/lib/stripe/promotion-code.d.ts.map +1 -1
  281. package/lib/stripe/promotion-code.js +3 -2
  282. package/lib/stripe/promotion-code.js.map +1 -1
  283. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  284. package/lib/stripe/shipping-rate.js +4 -3
  285. package/lib/stripe/shipping-rate.js.map +1 -1
  286. package/lib/stripe/tax-rate.d.ts.map +1 -1
  287. package/lib/stripe/tax-rate.js +3 -2
  288. package/lib/stripe/tax-rate.js.map +1 -1
  289. package/lib/stripe/webhook.d.ts.map +1 -1
  290. package/lib/stripe/webhook.js +4 -3
  291. package/lib/stripe/webhook.js.map +1 -1
  292. package/lib/test/vitest.d.ts.map +1 -1
  293. package/lib/test/vitest.js +1 -0
  294. package/lib/test/vitest.js.map +1 -1
  295. package/lib/upstash/redis.d.ts +8 -2
  296. package/lib/upstash/redis.d.ts.map +1 -1
  297. package/lib/upstash/redis.js +5 -4
  298. package/lib/upstash/redis.js.map +1 -1
  299. package/lib/util/ignore-matcher.d.ts.map +1 -1
  300. package/lib/util/ignore-matcher.js +3 -1
  301. package/lib/util/ignore-matcher.js.map +1 -1
  302. package/lib/util/peer.d.ts +10 -0
  303. package/lib/util/peer.d.ts.map +1 -0
  304. package/lib/util/peer.js +42 -0
  305. package/lib/util/peer.js.map +1 -0
  306. package/lib/util/telemetry/constants.d.ts.map +1 -1
  307. package/lib/util/telemetry/constants.js +2 -2
  308. package/lib/util/telemetry/constants.js.map +1 -1
  309. package/lib/vercel/project.d.ts +7 -1
  310. package/lib/vercel/project.d.ts.map +1 -1
  311. package/lib/vercel/project.js +28 -0
  312. package/lib/vercel/project.js.map +1 -1
  313. package/package.json +88 -74
  314. package/src/alchemy.ts +76 -222
  315. package/src/apply.ts +6 -19
  316. package/src/aws/account-id.ts +6 -3
  317. package/src/aws/bucket.ts +43 -32
  318. package/src/aws/ec2/security-group.ts +15 -3
  319. package/src/aws/function.ts +65 -39
  320. package/src/aws/policy-attachment.ts +10 -6
  321. package/src/aws/policy.ts +33 -15
  322. package/src/aws/queue.ts +50 -29
  323. package/src/aws/role.ts +37 -20
  324. package/src/aws/ses.ts +24 -20
  325. package/src/aws/ssm-parameter.ts +40 -20
  326. package/src/aws/table.ts +35 -17
  327. package/src/cloudflare/account-api-token.ts +9 -7
  328. package/src/cloudflare/ai-gateway.ts +37 -34
  329. package/src/cloudflare/api-schema.ts +33 -26
  330. package/src/cloudflare/api-shield.ts +15 -2
  331. package/src/cloudflare/astro/astro.ts +5 -1
  332. package/src/cloudflare/astro/plugin.ts +2 -1
  333. package/src/cloudflare/bindings.ts +2 -2
  334. package/src/cloudflare/bound.ts +1 -1
  335. package/src/cloudflare/bucket.ts +242 -3
  336. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  337. package/src/cloudflare/container.ts +23 -12
  338. package/src/cloudflare/custom-domain.ts +2 -2
  339. package/src/cloudflare/d1-database.ts +11 -4
  340. package/src/cloudflare/dispatch-namespace.ts +10 -7
  341. package/src/cloudflare/hyperdrive.ts +13 -3
  342. package/src/cloudflare/kv-namespace.ts +25 -2
  343. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  344. package/src/cloudflare/miniflare/paths.ts +13 -0
  345. package/src/cloudflare/pipeline.ts +76 -28
  346. package/src/cloudflare/queue-consumer.ts +1 -1
  347. package/src/cloudflare/queue.ts +65 -54
  348. package/src/cloudflare/react-router/react-router.ts +28 -2
  349. package/src/cloudflare/redwood/plugin.ts +3 -2
  350. package/src/cloudflare/route.ts +1 -1
  351. package/src/cloudflare/ruleset.ts +7 -2
  352. package/src/cloudflare/secret.ts +20 -31
  353. package/src/cloudflare/secrets-store.ts +7 -3
  354. package/src/cloudflare/tunnel.ts +13 -2
  355. package/src/cloudflare/vectorize-index.ts +14 -3
  356. package/src/cloudflare/vite/plugin.ts +3 -2
  357. package/src/cloudflare/vite/vite.ts +2 -3
  358. package/src/cloudflare/website.ts +1 -1
  359. package/src/cloudflare/worker.ts +35 -23
  360. package/src/cloudflare/wrangler.json.ts +7 -4
  361. package/src/docker/container.ts +13 -1
  362. package/src/docker/network.ts +18 -3
  363. package/src/docker/volume.ts +17 -6
  364. package/src/fs/index.ts +0 -8
  365. package/src/github/client.ts +6 -2
  366. package/src/github/repository-environment.ts +27 -13
  367. package/src/neon/project.ts +20 -6
  368. package/src/planetscale/branch.ts +24 -13
  369. package/src/planetscale/database.ts +38 -17
  370. package/src/planetscale/password.ts +10 -3
  371. package/src/resource.ts +1 -10
  372. package/src/scope.ts +29 -38
  373. package/src/sentry/client-key.ts +74 -6
  374. package/src/sentry/project.ts +59 -6
  375. package/src/sentry/team.ts +55 -7
  376. package/src/serde.ts +0 -44
  377. package/src/state/d1-state-store.ts +13 -6
  378. package/src/state/sqlite-state-store.ts +16 -17
  379. package/src/stripe/card.ts +5 -2
  380. package/src/stripe/client.ts +10 -3
  381. package/src/stripe/coupon.ts +4 -3
  382. package/src/stripe/customer.ts +2 -2
  383. package/src/stripe/entitlements-feature.ts +5 -2
  384. package/src/stripe/file.ts +3 -2
  385. package/src/stripe/meter.ts +2 -2
  386. package/src/stripe/portal-configuration.ts +5 -2
  387. package/src/stripe/price.ts +3 -2
  388. package/src/stripe/product-feature.ts +5 -2
  389. package/src/stripe/product.ts +3 -2
  390. package/src/stripe/promotion-code.ts +3 -2
  391. package/src/stripe/shipping-rate.ts +4 -3
  392. package/src/stripe/tax-rate.ts +3 -2
  393. package/src/stripe/webhook.ts +4 -3
  394. package/src/test/vitest.ts +1 -0
  395. package/src/upstash/redis.ts +15 -5
  396. package/src/util/ignore-matcher.ts +3 -1
  397. package/src/util/peer.ts +53 -0
  398. package/src/util/telemetry/constants.ts +2 -2
  399. package/src/vercel/project.ts +46 -1
  400. package/templates/astro/_gitignore +2 -1
  401. package/templates/hono/README.md +19 -0
  402. package/templates/hono/_env +1 -0
  403. package/templates/hono/_env.example +1 -0
  404. package/templates/hono/_gitignore +34 -0
  405. package/templates/hono/alchemy.run.ts +22 -0
  406. package/templates/hono/package.json +18 -0
  407. package/templates/hono/src/index.ts +17 -0
  408. package/templates/hono/tsconfig.json +13 -0
  409. package/templates/hono/types/env.d.ts +16 -0
  410. package/templates/nuxt/_gitignore +2 -1
  411. package/templates/react-router/_gitignore +1 -0
  412. package/templates/react-router/vite.config.ts +5 -3
  413. package/templates/rwsdk/_gitignore +2 -3
  414. package/templates/sveltekit/_gitignore +2 -1
  415. package/templates/tanstack-start/_gitignore +2 -1
  416. package/templates/typescript/_gitignore +2 -1
  417. package/templates/vite/_gitignore +2 -1
  418. package/workers/cloudflare-state-store.js +69 -74
  419. package/workers/dofs-state-store.js +1 -1
  420. package/bin/bootstrap-s3.ts +0 -255
  421. package/lib/ai/ark.d.ts +0 -12
  422. package/lib/ai/ark.d.ts.map +0 -1
  423. package/lib/ai/ark.js +0 -87
  424. package/lib/ai/ark.js.map +0 -1
  425. package/lib/ai/astro-file.d.ts +0 -138
  426. package/lib/ai/astro-file.d.ts.map +0 -1
  427. package/lib/ai/astro-file.js +0 -158
  428. package/lib/ai/astro-file.js.map +0 -1
  429. package/lib/ai/client.d.ts +0 -51
  430. package/lib/ai/client.d.ts.map +0 -1
  431. package/lib/ai/client.js +0 -58
  432. package/lib/ai/client.js.map +0 -1
  433. package/lib/ai/css-file.d.ts +0 -132
  434. package/lib/ai/css-file.d.ts.map +0 -1
  435. package/lib/ai/css-file.js +0 -142
  436. package/lib/ai/css-file.js.map +0 -1
  437. package/lib/ai/data.d.ts +0 -152
  438. package/lib/ai/data.d.ts.map +0 -1
  439. package/lib/ai/data.js +0 -120
  440. package/lib/ai/data.js.map +0 -1
  441. package/lib/ai/document.d.ts +0 -208
  442. package/lib/ai/document.d.ts.map +0 -1
  443. package/lib/ai/document.js +0 -206
  444. package/lib/ai/document.js.map +0 -1
  445. package/lib/ai/html-file.d.ts +0 -129
  446. package/lib/ai/html-file.d.ts.map +0 -1
  447. package/lib/ai/html-file.js +0 -139
  448. package/lib/ai/html-file.js.map +0 -1
  449. package/lib/ai/index.d.ts +0 -11
  450. package/lib/ai/index.d.ts.map +0 -1
  451. package/lib/ai/index.js +0 -11
  452. package/lib/ai/index.js.map +0 -1
  453. package/lib/ai/json-file.d.ts +0 -161
  454. package/lib/ai/json-file.d.ts.map +0 -1
  455. package/lib/ai/json-file.js +0 -188
  456. package/lib/ai/json-file.js.map +0 -1
  457. package/lib/ai/typescript-file.d.ts +0 -140
  458. package/lib/ai/typescript-file.d.ts.map +0 -1
  459. package/lib/ai/typescript-file.js +0 -146
  460. package/lib/ai/typescript-file.js.map +0 -1
  461. package/lib/ai/vue-file.d.ts +0 -127
  462. package/lib/ai/vue-file.d.ts.map +0 -1
  463. package/lib/ai/vue-file.js +0 -137
  464. package/lib/ai/vue-file.js.map +0 -1
  465. package/lib/ai/yaml-file.d.ts +0 -170
  466. package/lib/ai/yaml-file.d.ts.map +0 -1
  467. package/lib/ai/yaml-file.js +0 -201
  468. package/lib/ai/yaml-file.js.map +0 -1
  469. package/lib/fs/static-astro-file.d.ts +0 -35
  470. package/lib/fs/static-astro-file.d.ts.map +0 -1
  471. package/lib/fs/static-astro-file.js +0 -40
  472. package/lib/fs/static-astro-file.js.map +0 -1
  473. package/lib/fs/static-css-file.d.ts +0 -25
  474. package/lib/fs/static-css-file.d.ts.map +0 -1
  475. package/lib/fs/static-css-file.js +0 -30
  476. package/lib/fs/static-css-file.js.map +0 -1
  477. package/lib/fs/static-html-file.d.ts +0 -32
  478. package/lib/fs/static-html-file.d.ts.map +0 -1
  479. package/lib/fs/static-html-file.js +0 -37
  480. package/lib/fs/static-html-file.js.map +0 -1
  481. package/lib/fs/static-json-file.d.ts +0 -18
  482. package/lib/fs/static-json-file.d.ts.map +0 -1
  483. package/lib/fs/static-json-file.js +0 -19
  484. package/lib/fs/static-json-file.js.map +0 -1
  485. package/lib/fs/static-text-file.d.ts +0 -13
  486. package/lib/fs/static-text-file.d.ts.map +0 -1
  487. package/lib/fs/static-text-file.js +0 -9
  488. package/lib/fs/static-text-file.js.map +0 -1
  489. package/lib/fs/static-typescript-file.d.ts +0 -20
  490. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  491. package/lib/fs/static-typescript-file.js +0 -16
  492. package/lib/fs/static-typescript-file.js.map +0 -1
  493. package/lib/fs/static-vue-file.d.ts +0 -29
  494. package/lib/fs/static-vue-file.d.ts.map +0 -1
  495. package/lib/fs/static-vue-file.js +0 -34
  496. package/lib/fs/static-vue-file.js.map +0 -1
  497. package/lib/fs/static-yaml-file.d.ts +0 -23
  498. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  499. package/lib/fs/static-yaml-file.js +0 -10
  500. package/lib/fs/static-yaml-file.js.map +0 -1
  501. package/lib/internal/docs/providers.d.ts +0 -34
  502. package/lib/internal/docs/providers.d.ts.map +0 -1
  503. package/lib/internal/docs/providers.js +0 -200
  504. package/lib/internal/docs/providers.js.map +0 -1
  505. package/lib/runtime/bind.d.ts +0 -25
  506. package/lib/runtime/bind.d.ts.map +0 -1
  507. package/lib/runtime/bind.js +0 -76
  508. package/lib/runtime/bind.js.map +0 -1
  509. package/lib/runtime/global.d.ts +0 -8
  510. package/lib/runtime/global.d.ts.map +0 -1
  511. package/lib/runtime/global.js +0 -3
  512. package/lib/runtime/global.js.map +0 -1
  513. package/lib/runtime/plugin.d.ts +0 -35
  514. package/lib/runtime/plugin.d.ts.map +0 -1
  515. package/lib/runtime/plugin.js +0 -134
  516. package/lib/runtime/plugin.js.map +0 -1
  517. package/lib/runtime/shims.d.ts +0 -6
  518. package/lib/runtime/shims.d.ts.map +0 -1
  519. package/lib/runtime/shims.js +0 -27
  520. package/lib/runtime/shims.js.map +0 -1
  521. package/lib/runtime/state.d.ts +0 -5
  522. package/lib/runtime/state.d.ts.map +0 -1
  523. package/lib/runtime/state.js +0 -4
  524. package/lib/runtime/state.js.map +0 -1
  525. package/lib/web/astro.d.ts +0 -148
  526. package/lib/web/astro.d.ts.map +0 -1
  527. package/lib/web/astro.js +0 -419
  528. package/lib/web/astro.js.map +0 -1
  529. package/lib/web/shadcn-component.d.ts +0 -30
  530. package/lib/web/shadcn-component.d.ts.map +0 -1
  531. package/lib/web/shadcn-component.js +0 -25
  532. package/lib/web/shadcn-component.js.map +0 -1
  533. package/lib/web/shadcn.d.ts +0 -98
  534. package/lib/web/shadcn.d.ts.map +0 -1
  535. package/lib/web/shadcn.js +0 -102
  536. package/lib/web/shadcn.js.map +0 -1
  537. package/lib/web/tailwind.d.ts +0 -65
  538. package/lib/web/tailwind.d.ts.map +0 -1
  539. package/lib/web/tailwind.js +0 -98
  540. package/lib/web/tailwind.js.map +0 -1
  541. package/lib/web/vite.d.ts +0 -96
  542. package/lib/web/vite.d.ts.map +0 -1
  543. package/lib/web/vite.js +0 -232
  544. package/lib/web/vite.js.map +0 -1
  545. package/lib/web/vitepress/config.d.ts +0 -12
  546. package/lib/web/vitepress/config.d.ts.map +0 -1
  547. package/lib/web/vitepress/config.js +0 -33
  548. package/lib/web/vitepress/config.js.map +0 -1
  549. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  550. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  551. package/lib/web/vitepress/custom-theme.js +0 -337
  552. package/lib/web/vitepress/custom-theme.js.map +0 -1
  553. package/lib/web/vitepress/dependencies.d.ts +0 -13
  554. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  555. package/lib/web/vitepress/dependencies.js +0 -37
  556. package/lib/web/vitepress/dependencies.js.map +0 -1
  557. package/lib/web/vitepress/home-page.d.ts +0 -247
  558. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  559. package/lib/web/vitepress/home-page.js +0 -146
  560. package/lib/web/vitepress/home-page.js.map +0 -1
  561. package/lib/web/vitepress/index.d.ts +0 -6
  562. package/lib/web/vitepress/index.d.ts.map +0 -1
  563. package/lib/web/vitepress/index.js +0 -6
  564. package/lib/web/vitepress/index.js.map +0 -1
  565. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  566. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  567. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  568. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  569. package/lib/web/vitepress/vitepress.d.ts +0 -75
  570. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  571. package/lib/web/vitepress/vitepress.js +0 -254
  572. package/lib/web/vitepress/vitepress.js.map +0 -1
  573. package/src/ai/ark.ts +0 -118
  574. package/src/ai/astro-file.ts +0 -270
  575. package/src/ai/client.ts +0 -117
  576. package/src/ai/css-file.ts +0 -247
  577. package/src/ai/data.ts +0 -221
  578. package/src/ai/document.ts +0 -367
  579. package/src/ai/html-file.ts +0 -244
  580. package/src/ai/index.ts +0 -10
  581. package/src/ai/json-file.ts +0 -325
  582. package/src/ai/typescript-file.ts +0 -259
  583. package/src/ai/vue-file.ts +0 -242
  584. package/src/ai/yaml-file.ts +0 -328
  585. package/src/fs/static-astro-file.ts +0 -45
  586. package/src/fs/static-css-file.ts +0 -35
  587. package/src/fs/static-html-file.ts +0 -42
  588. package/src/fs/static-json-file.ts +0 -38
  589. package/src/fs/static-text-file.ts +0 -23
  590. package/src/fs/static-typescript-file.ts +0 -37
  591. package/src/fs/static-vue-file.ts +0 -39
  592. package/src/fs/static-yaml-file.ts +0 -33
  593. package/src/internal/docs/providers.ts +0 -286
  594. package/src/runtime/bind.ts +0 -95
  595. package/src/runtime/global.ts +0 -10
  596. package/src/runtime/plugin.ts +0 -163
  597. package/src/runtime/shims.js +0 -34
  598. package/src/runtime/state.ts +0 -9
  599. package/src/web/astro.ts +0 -643
  600. package/src/web/shadcn-component.ts +0 -72
  601. package/src/web/shadcn.ts +0 -221
  602. package/src/web/tailwind.ts +0 -167
  603. package/src/web/vite.ts +0 -407
  604. package/src/web/vitepress/config.ts +0 -50
  605. package/src/web/vitepress/custom-theme.ts +0 -514
  606. package/src/web/vitepress/dependencies.ts +0 -69
  607. package/src/web/vitepress/home-page.ts +0 -378
  608. package/src/web/vitepress/index.ts +0 -5
  609. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  610. package/src/web/vitepress/vitepress.ts +0 -372
  611. package/templates/sveltekit/bun.lock +0 -1099
@@ -1,325 +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 { StaticJsonFile } from "../fs/static-json-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 JSONFile
12
- */
13
- export interface JSONFileProps<
14
- T extends Type<any, any> | undefined = undefined,
15
- > {
16
- /**
17
- * Path to the JSON file
18
- */
19
- path: string;
20
-
21
- /**
22
- * Optional ArkType schema to validate and structure the generated JSON
23
- * When provided, the resource will use generateObject with schema validation
24
- * When not provided, it will extract JSON from between ```json 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 JSON configuration for:
40
- * ${alchemy.file("src/config.ts")}
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
- * Whether to pretty-print the JSON with indentation
73
- * @default true
74
- */
75
- pretty?: boolean;
76
-
77
- /**
78
- * Number of spaces to use for indentation when pretty-printing
79
- * @default 2
80
- */
81
- indent?: number;
82
- }
83
-
84
- /**
85
- * A JSON file that can be created, updated, and deleted
86
- */
87
- export interface JSONFile<T = any>
88
- extends Omit<JSONFileProps, "schema">,
89
- Resource<"ai::JSONFile"> {
90
- /**
91
- * Content of the JSON file as a string
92
- */
93
- content: string;
94
-
95
- /**
96
- * Parsed JSON object
97
- */
98
- json: T;
99
-
100
- /**
101
- * Schema used to validate the JSON (if provided)
102
- */
103
- schema?: JsonSchema;
104
-
105
- /**
106
- * Time at which the file was created
107
- */
108
- createdAt: number;
109
-
110
- /**
111
- * Time at which the file was last updated
112
- */
113
- updatedAt: number;
114
- }
115
-
116
- /**
117
- * Default system prompt for JSON file generation without schema
118
- */
119
- const DEFAULT_JSON_SYSTEM_PROMPT =
120
- "You are a JSON generator. Create valid JSON based on the user's requirements. Your response MUST include only JSON inside ```json fences. Do not include any other text, explanations, or multiple code blocks.";
121
-
122
- /**
123
- * Resource for generating JSON files using AI models.
124
- * Can operate in two modes:
125
- * 1. With schema: Uses generateObject with type validation
126
- * 2. Without schema: Extracts JSON from between ```json fences
127
- *
128
- * @example
129
- * // Generate a configuration file with freeform JSON
130
- * const config = await JSONFile("app-config", {
131
- * path: "./config/app.json",
132
- * prompt: await alchemy`
133
- * Generate a configuration for a web application with:
134
- * - Server settings (port, host, timeout)
135
- * - Database connection details (redact any passwords)
136
- * - Logging configuration
137
- * - Feature flags
138
- * `,
139
- * model: {
140
- * id: "gpt-4o",
141
- * provider: "openai"
142
- * }
143
- * });
144
- *
145
- * @example
146
- * // Generate JSON with schema validation
147
- * import { type } from "arktype";
148
- *
149
- * const userSchema = type({
150
- * users: [{
151
- * id: "string",
152
- * name: "string",
153
- * email: "string",
154
- * role: "'admin' | 'user' | 'guest'",
155
- * permissions: "string[]",
156
- * active: "boolean"
157
- * }]
158
- * });
159
- *
160
- * const userData = await JSONFile("user-data", {
161
- * path: "./data/users.json",
162
- * schema: userSchema,
163
- * prompt: "Generate sample user data for an application with various roles and permissions",
164
- * temperature: 0.2
165
- * });
166
- *
167
- * // Type-safe access to the generated data
168
- * console.log(userData.json.users[0].role); // Typed as 'admin' | 'user' | 'guest'
169
- *
170
- * @example
171
- * // Generate API mock data with custom system prompt
172
- * const apiMock = await JSONFile("api-mock", {
173
- * path: "./mocks/products-api.json",
174
- * prompt: await alchemy`
175
- * Create mock data for a product catalog API response with:
176
- * - 10 products with different categories
177
- * - Each product should have id, name, price, category, inventory, and image_url
178
- * - Include pagination metadata (total, page, limit)
179
- * `,
180
- * system: "You are an API design expert. Create realistic mock JSON data that follows REST API best practices. Your response must be valid JSON inside ```json fences.",
181
- * model: {
182
- * id: "claude-3-opus-20240229",
183
- * provider: "anthropic"
184
- * },
185
- * pretty: true,
186
- * indent: 4
187
- * });
188
- */
189
- export const JSONFile = Resource("ai::JSONFile", async function <
190
- const T extends Type<any, any> | undefined = undefined,
191
- >(this: Context<JSONFile<T extends Type<any, any> ? type.infer<T> : any>>, _id: string, props: JSONFileProps<T>): Promise<
192
- JSONFile<T extends Type<any, any> ? type.infer<T> : any>
193
- > {
194
- // Handle deletion phase
195
- if (this.phase === "delete") {
196
- return this.destroy();
197
- }
198
-
199
- let jsonContent: string;
200
- let jsonObject: any;
201
-
202
- // Check if schema is provided
203
- if (props.schema) {
204
- // Use schema-based generation
205
- const { object } = await generateObject({
206
- model: createModel(props),
207
- schema: ark.schema<type.infer<typeof props.schema>>(props.schema),
208
- providerOptions: props.model?.options,
209
- system:
210
- props.system ||
211
- "Generate a valid JSON object based on the provided requirements.",
212
- prompt: props.prompt,
213
- ...(props.temperature === undefined
214
- ? {}
215
- : { temperature: props.temperature }),
216
- });
217
-
218
- jsonObject = object;
219
-
220
- // Use StaticJsonFile to create the file
221
- const file = await StaticJsonFile("file", props.path, jsonObject);
222
- jsonContent = file.content;
223
- } else {
224
- // Use fence-based extraction
225
- // Use provided system prompt or default
226
- const system = props.system || DEFAULT_JSON_SYSTEM_PROMPT;
227
-
228
- // Generate initial content
229
- const { text } = await generateText({
230
- model: createModel(props),
231
- prompt: props.prompt,
232
- system,
233
- providerOptions: props.model?.options,
234
- ...(props.temperature === undefined
235
- ? {}
236
- : { temperature: props.temperature }),
237
- });
238
-
239
- // Extract and validate JSON content
240
- let { content, error } = await extractJSONContent(text);
241
-
242
- // Re-prompt if there are validation errors
243
- if (error) {
244
- const errorSystem = `${system}\n\nERROR: ${error}\n\nPlease try again and ensure your response contains exactly one valid JSON block inside \`\`\`json fences.`;
245
-
246
- const { text: retryText } = await generateText({
247
- model: createModel(props),
248
- prompt: props.prompt,
249
- system: errorSystem,
250
- providerOptions: props.model?.options,
251
- ...(props.temperature === undefined
252
- ? {}
253
- : { temperature: props.temperature }),
254
- });
255
-
256
- const retryResult = await extractJSONContent(retryText);
257
-
258
- if (retryResult.error) {
259
- throw new Error(`Failed to generate valid JSON: ${retryResult.error}`);
260
- }
261
-
262
- content = retryResult.content;
263
- }
264
-
265
- // Parse JSON to get the object representation
266
- jsonObject = JSON.parse(content);
267
-
268
- // Use StaticJsonFile to create the file
269
- const file = await StaticJsonFile("file", props.path, jsonObject);
270
- jsonContent = file.content;
271
- }
272
-
273
- // Return the resource
274
- return this({
275
- ...props,
276
- schema: props.schema,
277
- content: jsonContent,
278
- json: jsonObject,
279
- createdAt: Date.now(),
280
- updatedAt: Date.now(),
281
- });
282
- });
283
-
284
- /**
285
- * Extracts JSON content from between ```json fences
286
- * Validates that exactly one JSON code block exists
287
- *
288
- * @param text The text to extract JSON from
289
- * @returns The extracted JSON or error message
290
- */
291
- async function extractJSONContent(
292
- text: string,
293
- ): Promise<{ content: string; error?: string }> {
294
- const jsonCodeRegex = /```json\s*([\s\S]*?)```/g;
295
- const matches = Array.from(text.matchAll(jsonCodeRegex));
296
-
297
- if (matches.length === 0) {
298
- return {
299
- content: "",
300
- error:
301
- "No JSON code block found in the response. Please include your JSON within ```json fences.",
302
- };
303
- }
304
-
305
- if (matches.length > 1) {
306
- return {
307
- content: "",
308
- error:
309
- "Multiple JSON code blocks found in the response. Please provide exactly one JSON block within ```json fences.",
310
- };
311
- }
312
-
313
- const content = matches[0][1].trim();
314
-
315
- // Validate JSON can be parsed
316
- try {
317
- JSON.parse(content);
318
- return { content };
319
- } catch (e) {
320
- return {
321
- content: "",
322
- error: `Invalid JSON: ${(e as Error).message}. Please provide valid JSON syntax.`,
323
- };
324
- }
325
- }
@@ -1,259 +0,0 @@
1
- import { generateText } from "ai";
2
- import type { Context } from "../context.ts";
3
- import { StaticTypeScriptFile } from "../fs/static-typescript-file.ts";
4
- import { Resource } from "../resource.ts";
5
- import type { Secret } from "../secret.ts";
6
- import { createModel, type ModelConfig } from "./client.ts";
7
-
8
- /**
9
- * Properties for creating or updating a TypeScriptFile
10
- */
11
- export interface TypeScriptFileProps {
12
- /**
13
- * Path to the TypeScript 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 TypeScript utility function using:
29
- * ${alchemy.file("src/types.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 TypeScript code inside ```ts fences
38
- * @default "You are a TypeScript code generator. Create TypeScript code based on the user's requirements. Your response MUST include only TypeScript code inside ```ts 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
- * Prettier configuration to use for formatting the TypeScript code
63
- * If not provided, will use the default Prettier configuration
64
- */
65
- prettierConfig?: object;
66
- }
67
-
68
- /**
69
- * A TypeScript file that can be created, updated, and deleted
70
- */
71
- export interface TypeScriptFile
72
- extends TypeScriptFileProps,
73
- Resource<"ai::TypeScriptFile"> {
74
- /**
75
- * Content of the TypeScript file
76
- */
77
- content: string;
78
-
79
- /**
80
- * Time at which the file was created
81
- */
82
- createdAt: number;
83
-
84
- /**
85
- * Time at which the file was last updated
86
- */
87
- updatedAt: number;
88
- }
89
-
90
- /**
91
- * Default system prompt for TypeScript file generation
92
- */
93
- const DEFAULT_TS_SYSTEM_PROMPT =
94
- "You are a TypeScript code generator. Create TypeScript code based on the user's requirements. Your response MUST include only TypeScript code inside ```ts fences. Do not include any other text, explanations, or multiple code blocks.";
95
-
96
- /**
97
- * Resource for generating TypeScript files using AI models.
98
- * Extracts TypeScript code from between ```ts fences, validates the response,
99
- * and formats the code with Prettier.
100
- *
101
- * @example
102
- * // Create a utility function
103
- * const utils = await TypeScriptFile("string-utils", {
104
- * path: "./src/utils/string-utils.ts",
105
- * prompt: await alchemy`
106
- * Generate TypeScript utility functions for string manipulation:
107
- * - Capitalize first letter
108
- * - Truncate with ellipsis
109
- * - Convert to camelCase and kebab-case
110
- * - Remove special characters
111
- * `,
112
- * model: {
113
- * id: "gpt-4o",
114
- * provider: "openai"
115
- * }
116
- * });
117
- *
118
- * @example
119
- * // Generate a TypeScript class with custom formatting
120
- * const userService = await TypeScriptFile("user-service", {
121
- * path: "./src/services/UserService.ts",
122
- * prompt: await alchemy`
123
- * Create a UserService class that handles user authentication and profile management.
124
- * The service should use the User type from:
125
- * ${alchemy.file("src/types/User.ts")}
126
- *
127
- * Include methods for:
128
- * - login(email, password)
129
- * - register(user)
130
- * - updateProfile(userId, profileData)
131
- * - deleteAccount(userId)
132
- * `,
133
- * temperature: 0.2,
134
- * prettierConfig: {
135
- * semi: false,
136
- * singleQuote: true,
137
- * printWidth: 120
138
- * }
139
- * });
140
- *
141
- * @example
142
- * // Generate a React hook with custom system prompt
143
- * const useFormHook = await TypeScriptFile("use-form", {
144
- * path: "./src/hooks/useForm.ts",
145
- * prompt: await alchemy`
146
- * Create a custom React hook called useForm that handles form state, validation, and submission.
147
- * It should support:
148
- * - Initial values
149
- * - Validation rules
150
- * - Field errors
151
- * - Form submission with loading state
152
- * - Reset functionality
153
- * `,
154
- * system: "You are an expert React developer specializing in TypeScript hooks. Create a single TypeScript file inside ```ts fences with no additional text. Follow React best practices and include proper typing.",
155
- * model: {
156
- * id: "claude-3-opus-20240229",
157
- * provider: "anthropic"
158
- * }
159
- * });
160
- */
161
- export const TypeScriptFile = Resource(
162
- "ai::TypeScriptFile",
163
- async function (
164
- this: Context<TypeScriptFile>,
165
- _id: string,
166
- props: TypeScriptFileProps,
167
- ): Promise<TypeScriptFile> {
168
- // Handle delete phase
169
- if (this.phase === "delete") {
170
- // StaticTypeScriptFile will handle the deletion
171
- return this.destroy();
172
- }
173
-
174
- // Use provided system prompt or default
175
- const system = props.system || DEFAULT_TS_SYSTEM_PROMPT;
176
-
177
- // Generate initial content
178
- const { text } = await generateText({
179
- model: createModel(props),
180
- prompt: props.prompt,
181
- system,
182
- providerOptions: props.model?.options,
183
- ...(props.temperature === undefined
184
- ? {}
185
- : { temperature: props.temperature }),
186
- });
187
-
188
- // Extract and validate TypeScript code
189
- let { code, error } = await extractTypeScriptCode(text);
190
-
191
- // Re-prompt if there are validation errors
192
- if (error) {
193
- const errorSystem = `${system}\n\nERROR: ${error}\n\nPlease try again and ensure your response contains exactly one TypeScript code block inside \`\`\`ts fences.`;
194
-
195
- const { text: retryText } = await generateText({
196
- model: createModel(props),
197
- prompt: props.prompt,
198
- system: errorSystem,
199
- providerOptions: props.model?.options,
200
- ...(props.temperature === undefined
201
- ? {}
202
- : { temperature: props.temperature }),
203
- });
204
-
205
- const retryResult = await extractTypeScriptCode(retryText);
206
-
207
- if (retryResult.error) {
208
- throw new Error(
209
- `Failed to generate valid TypeScript code: ${retryResult.error}`,
210
- );
211
- }
212
-
213
- code = retryResult.code;
214
- }
215
-
216
- // Use StaticTypeScriptFile to create/update the file
217
- const file = await StaticTypeScriptFile("file", props.path, code);
218
-
219
- // Return the resource
220
- return this({
221
- ...props,
222
- content: file.content,
223
- createdAt: Date.now(),
224
- updatedAt: Date.now(),
225
- });
226
- },
227
- );
228
-
229
- /**
230
- * Extracts TypeScript code from between ```ts fences
231
- * Validates that exactly one TypeScript code block exists
232
- *
233
- * @param text The text to extract TypeScript code from
234
- * @returns The extracted TypeScript code or error message
235
- */
236
- async function extractTypeScriptCode(
237
- text: string,
238
- ): Promise<{ code: string; error?: string }> {
239
- const tsCodeRegex = /```ts\s*([\s\S]*?)```/g;
240
- const matches = Array.from(text.matchAll(tsCodeRegex));
241
-
242
- if (matches.length === 0) {
243
- return {
244
- code: "",
245
- error:
246
- "No TypeScript code block found in the response. Please include your code within ```ts fences.",
247
- };
248
- }
249
-
250
- if (matches.length > 1) {
251
- return {
252
- code: "",
253
- error:
254
- "Multiple TypeScript code blocks found in the response. Please provide exactly one code block within ```ts fences.",
255
- };
256
- }
257
-
258
- return { code: matches[0][1].trim() };
259
- }