@alchemy.run/fly 0.0.0 → 2.0.0-beta.85

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 (499) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +57 -4
  3. package/lib/App.d.ts +230 -0
  4. package/lib/App.d.ts.map +1 -0
  5. package/lib/App.js +338 -0
  6. package/lib/App.js.map +1 -0
  7. package/lib/AuthProvider.d.ts +22 -0
  8. package/lib/AuthProvider.d.ts.map +1 -0
  9. package/lib/AuthProvider.js +48 -0
  10. package/lib/AuthProvider.js.map +1 -0
  11. package/lib/BindService.d.ts +159 -0
  12. package/lib/BindService.d.ts.map +1 -0
  13. package/lib/BindService.js +222 -0
  14. package/lib/BindService.js.map +1 -0
  15. package/lib/Bootstrap.d.ts +8 -0
  16. package/lib/Bootstrap.d.ts.map +1 -0
  17. package/lib/Bootstrap.js +41 -0
  18. package/lib/Bootstrap.js.map +1 -0
  19. package/lib/Bucket.d.ts +278 -0
  20. package/lib/Bucket.d.ts.map +1 -0
  21. package/lib/Bucket.js +658 -0
  22. package/lib/Bucket.js.map +1 -0
  23. package/lib/BucketBinding.d.ts +33 -0
  24. package/lib/BucketBinding.d.ts.map +1 -0
  25. package/lib/BucketBinding.js +70 -0
  26. package/lib/BucketBinding.js.map +1 -0
  27. package/lib/Catalog.d.ts +28 -0
  28. package/lib/Catalog.d.ts.map +1 -0
  29. package/lib/Catalog.js +31 -0
  30. package/lib/Catalog.js.map +1 -0
  31. package/lib/Certificate.d.ts +189 -0
  32. package/lib/Certificate.d.ts.map +1 -0
  33. package/lib/Certificate.js +380 -0
  34. package/lib/Certificate.js.map +1 -0
  35. package/lib/Checkpoint.d.ts +55 -0
  36. package/lib/Checkpoint.d.ts.map +1 -0
  37. package/lib/Checkpoint.js +3 -0
  38. package/lib/Checkpoint.js.map +1 -0
  39. package/lib/CheckpointHttp.d.ts +22 -0
  40. package/lib/CheckpointHttp.d.ts.map +1 -0
  41. package/lib/CheckpointHttp.js +53 -0
  42. package/lib/CheckpointHttp.js.map +1 -0
  43. package/lib/ConnectPostgres.d.ts +58 -0
  44. package/lib/ConnectPostgres.d.ts.map +1 -0
  45. package/lib/ConnectPostgres.js +13 -0
  46. package/lib/ConnectPostgres.js.map +1 -0
  47. package/lib/ConnectPostgresHttp.d.ts +26 -0
  48. package/lib/ConnectPostgresHttp.d.ts.map +1 -0
  49. package/lib/ConnectPostgresHttp.js +57 -0
  50. package/lib/ConnectPostgresHttp.js.map +1 -0
  51. package/lib/Contributions.d.ts +7 -0
  52. package/lib/Contributions.d.ts.map +1 -0
  53. package/lib/Contributions.js +6 -0
  54. package/lib/Contributions.js.map +1 -0
  55. package/lib/Credentials.d.ts +33 -0
  56. package/lib/Credentials.d.ts.map +1 -0
  57. package/lib/Credentials.js +55 -0
  58. package/lib/Credentials.js.map +1 -0
  59. package/lib/Decrypt.d.ts +52 -0
  60. package/lib/Decrypt.d.ts.map +1 -0
  61. package/lib/Decrypt.js +3 -0
  62. package/lib/Decrypt.js.map +1 -0
  63. package/lib/DecryptHttp.d.ts +22 -0
  64. package/lib/DecryptHttp.d.ts.map +1 -0
  65. package/lib/DecryptHttp.js +43 -0
  66. package/lib/DecryptHttp.js.map +1 -0
  67. package/lib/DeleteObject.d.ts +29 -0
  68. package/lib/DeleteObject.d.ts.map +1 -0
  69. package/lib/DeleteObject.js +3 -0
  70. package/lib/DeleteObject.js.map +1 -0
  71. package/lib/DeleteObjectHttp.d.ts +12 -0
  72. package/lib/DeleteObjectHttp.d.ts.map +1 -0
  73. package/lib/DeleteObjectHttp.js +17 -0
  74. package/lib/DeleteObjectHttp.js.map +1 -0
  75. package/lib/Deployment.d.ts +51 -0
  76. package/lib/Deployment.d.ts.map +1 -0
  77. package/lib/Deployment.js +62 -0
  78. package/lib/Deployment.js.map +1 -0
  79. package/lib/DeploymentImages.d.ts +18 -0
  80. package/lib/DeploymentImages.d.ts.map +1 -0
  81. package/lib/DeploymentImages.js +61 -0
  82. package/lib/DeploymentImages.js.map +1 -0
  83. package/lib/DeploymentState.d.ts +17 -0
  84. package/lib/DeploymentState.d.ts.map +1 -0
  85. package/lib/DeploymentState.js +87 -0
  86. package/lib/DeploymentState.js.map +1 -0
  87. package/lib/Encrypt.d.ts +50 -0
  88. package/lib/Encrypt.d.ts.map +1 -0
  89. package/lib/Encrypt.js +3 -0
  90. package/lib/Encrypt.js.map +1 -0
  91. package/lib/EncryptHttp.d.ts +22 -0
  92. package/lib/EncryptHttp.d.ts.map +1 -0
  93. package/lib/EncryptHttp.js +39 -0
  94. package/lib/EncryptHttp.js.map +1 -0
  95. package/lib/Environment.d.ts +45 -0
  96. package/lib/Environment.d.ts.map +1 -0
  97. package/lib/Environment.js +43 -0
  98. package/lib/Environment.js.map +1 -0
  99. package/lib/Errors.d.ts +18 -0
  100. package/lib/Errors.d.ts.map +1 -0
  101. package/lib/Errors.js +13 -0
  102. package/lib/Errors.js.map +1 -0
  103. package/lib/Exec.d.ts +41 -0
  104. package/lib/Exec.d.ts.map +1 -0
  105. package/lib/Exec.js +3 -0
  106. package/lib/Exec.js.map +1 -0
  107. package/lib/ExecHttp.d.ts +22 -0
  108. package/lib/ExecHttp.d.ts.map +1 -0
  109. package/lib/ExecHttp.js +39 -0
  110. package/lib/ExecHttp.js.map +1 -0
  111. package/lib/GetObject.d.ts +34 -0
  112. package/lib/GetObject.d.ts.map +1 -0
  113. package/lib/GetObject.js +3 -0
  114. package/lib/GetObject.js.map +1 -0
  115. package/lib/GetObjectHttp.d.ts +12 -0
  116. package/lib/GetObjectHttp.d.ts.map +1 -0
  117. package/lib/GetObjectHttp.js +17 -0
  118. package/lib/GetObjectHttp.js.map +1 -0
  119. package/lib/GetSecret.d.ts +44 -0
  120. package/lib/GetSecret.d.ts.map +1 -0
  121. package/lib/GetSecret.js +3 -0
  122. package/lib/GetSecret.js.map +1 -0
  123. package/lib/GetSecretHttp.d.ts +22 -0
  124. package/lib/GetSecretHttp.d.ts.map +1 -0
  125. package/lib/GetSecretHttp.js +50 -0
  126. package/lib/GetSecretHttp.js.map +1 -0
  127. package/lib/HeadObject.d.ts +29 -0
  128. package/lib/HeadObject.d.ts.map +1 -0
  129. package/lib/HeadObject.js +3 -0
  130. package/lib/HeadObject.js.map +1 -0
  131. package/lib/HeadObjectHttp.d.ts +12 -0
  132. package/lib/HeadObjectHttp.d.ts.map +1 -0
  133. package/lib/HeadObjectHttp.js +17 -0
  134. package/lib/HeadObjectHttp.js.map +1 -0
  135. package/lib/IpAssignment.d.ts +258 -0
  136. package/lib/IpAssignment.d.ts.map +1 -0
  137. package/lib/IpAssignment.js +376 -0
  138. package/lib/IpAssignment.js.map +1 -0
  139. package/lib/ListObjectsV2.d.ts +29 -0
  140. package/lib/ListObjectsV2.d.ts.map +1 -0
  141. package/lib/ListObjectsV2.js +3 -0
  142. package/lib/ListObjectsV2.js.map +1 -0
  143. package/lib/ListObjectsV2Http.d.ts +12 -0
  144. package/lib/ListObjectsV2Http.d.ts.map +1 -0
  145. package/lib/ListObjectsV2Http.js +17 -0
  146. package/lib/ListObjectsV2Http.js.map +1 -0
  147. package/lib/ListSecrets.d.ts +53 -0
  148. package/lib/ListSecrets.d.ts.map +1 -0
  149. package/lib/ListSecrets.js +3 -0
  150. package/lib/ListSecrets.js.map +1 -0
  151. package/lib/ListSecretsHttp.d.ts +22 -0
  152. package/lib/ListSecretsHttp.d.ts.map +1 -0
  153. package/lib/ListSecretsHttp.js +35 -0
  154. package/lib/ListSecretsHttp.js.map +1 -0
  155. package/lib/Machine.d.ts +802 -0
  156. package/lib/Machine.d.ts.map +1 -0
  157. package/lib/Machine.js +773 -0
  158. package/lib/Machine.js.map +1 -0
  159. package/lib/MachineContainers.d.ts +44 -0
  160. package/lib/MachineContainers.d.ts.map +1 -0
  161. package/lib/MachineContainers.js +115 -0
  162. package/lib/MachineContainers.js.map +1 -0
  163. package/lib/Metadata.d.ts +109 -0
  164. package/lib/Metadata.d.ts.map +1 -0
  165. package/lib/Metadata.js +159 -0
  166. package/lib/Metadata.js.map +1 -0
  167. package/lib/MountVolume.d.ts +295 -0
  168. package/lib/MountVolume.d.ts.map +1 -0
  169. package/lib/MountVolume.js +20 -0
  170. package/lib/MountVolume.js.map +1 -0
  171. package/lib/Postgres.d.ts +298 -0
  172. package/lib/Postgres.d.ts.map +1 -0
  173. package/lib/Postgres.js +508 -0
  174. package/lib/Postgres.js.map +1 -0
  175. package/lib/PostgresMigrations.d.ts +20 -0
  176. package/lib/PostgresMigrations.d.ts.map +1 -0
  177. package/lib/PostgresMigrations.js +58 -0
  178. package/lib/PostgresMigrations.js.map +1 -0
  179. package/lib/Providers.d.ts +38 -0
  180. package/lib/Providers.d.ts.map +1 -0
  181. package/lib/Providers.js +95 -0
  182. package/lib/Providers.js.map +1 -0
  183. package/lib/PutObject.d.ts +35 -0
  184. package/lib/PutObject.d.ts.map +1 -0
  185. package/lib/PutObject.js +3 -0
  186. package/lib/PutObject.js.map +1 -0
  187. package/lib/PutObjectHttp.d.ts +12 -0
  188. package/lib/PutObjectHttp.d.ts.map +1 -0
  189. package/lib/PutObjectHttp.js +17 -0
  190. package/lib/PutObjectHttp.js.map +1 -0
  191. package/lib/ReadRedis.d.ts +26 -0
  192. package/lib/ReadRedis.d.ts.map +1 -0
  193. package/lib/ReadRedis.js +3 -0
  194. package/lib/ReadRedis.js.map +1 -0
  195. package/lib/ReadRedisHttp.d.ts +11 -0
  196. package/lib/ReadRedisHttp.d.ts.map +1 -0
  197. package/lib/ReadRedisHttp.js +15 -0
  198. package/lib/ReadRedisHttp.js.map +1 -0
  199. package/lib/ReadWriteRedis.d.ts +29 -0
  200. package/lib/ReadWriteRedis.d.ts.map +1 -0
  201. package/lib/ReadWriteRedis.js +3 -0
  202. package/lib/ReadWriteRedis.js.map +1 -0
  203. package/lib/ReadWriteRedisHttp.d.ts +11 -0
  204. package/lib/ReadWriteRedisHttp.d.ts.map +1 -0
  205. package/lib/ReadWriteRedisHttp.js +15 -0
  206. package/lib/ReadWriteRedisHttp.js.map +1 -0
  207. package/lib/Redis.d.ts +252 -0
  208. package/lib/Redis.d.ts.map +1 -0
  209. package/lib/Redis.js +611 -0
  210. package/lib/Redis.js.map +1 -0
  211. package/lib/RedisBinding.d.ts +7 -0
  212. package/lib/RedisBinding.d.ts.map +1 -0
  213. package/lib/RedisBinding.js +53 -0
  214. package/lib/RedisBinding.js.map +1 -0
  215. package/lib/RedisHttp.d.ts +8 -0
  216. package/lib/RedisHttp.d.ts.map +1 -0
  217. package/lib/RedisHttp.js +11 -0
  218. package/lib/RedisHttp.js.map +1 -0
  219. package/lib/Region.d.ts +16 -0
  220. package/lib/Region.d.ts.map +1 -0
  221. package/lib/Region.js +13 -0
  222. package/lib/Region.js.map +1 -0
  223. package/lib/Secret.d.ts +190 -0
  224. package/lib/Secret.d.ts.map +1 -0
  225. package/lib/Secret.js +310 -0
  226. package/lib/Secret.js.map +1 -0
  227. package/lib/SecretHttp.d.ts +54 -0
  228. package/lib/SecretHttp.d.ts.map +1 -0
  229. package/lib/SecretHttp.js +66 -0
  230. package/lib/SecretHttp.js.map +1 -0
  231. package/lib/SecretKey.d.ts +164 -0
  232. package/lib/SecretKey.d.ts.map +1 -0
  233. package/lib/SecretKey.js +277 -0
  234. package/lib/SecretKey.js.map +1 -0
  235. package/lib/SecretKeyHttp.d.ts +14 -0
  236. package/lib/SecretKeyHttp.d.ts.map +1 -0
  237. package/lib/SecretKeyHttp.js +5 -0
  238. package/lib/SecretKeyHttp.js.map +1 -0
  239. package/lib/Service.d.ts +1017 -0
  240. package/lib/Service.d.ts.map +1 -0
  241. package/lib/Service.js +1430 -0
  242. package/lib/Service.js.map +1 -0
  243. package/lib/Sign.d.ts +36 -0
  244. package/lib/Sign.d.ts.map +1 -0
  245. package/lib/Sign.js +3 -0
  246. package/lib/Sign.js.map +1 -0
  247. package/lib/SignHttp.d.ts +22 -0
  248. package/lib/SignHttp.d.ts.map +1 -0
  249. package/lib/SignHttp.js +36 -0
  250. package/lib/SignHttp.js.map +1 -0
  251. package/lib/Sprite.d.ts +283 -0
  252. package/lib/Sprite.d.ts.map +1 -0
  253. package/lib/Sprite.js +471 -0
  254. package/lib/Sprite.js.map +1 -0
  255. package/lib/SpriteHttp.d.ts +25 -0
  256. package/lib/SpriteHttp.d.ts.map +1 -0
  257. package/lib/SpriteHttp.js +33 -0
  258. package/lib/SpriteHttp.js.map +1 -0
  259. package/lib/Verify.d.ts +37 -0
  260. package/lib/Verify.d.ts.map +1 -0
  261. package/lib/Verify.js +3 -0
  262. package/lib/Verify.js.map +1 -0
  263. package/lib/VerifyHttp.d.ts +22 -0
  264. package/lib/VerifyHttp.d.ts.map +1 -0
  265. package/lib/VerifyHttp.js +38 -0
  266. package/lib/VerifyHttp.js.map +1 -0
  267. package/lib/Volume.d.ts +53 -0
  268. package/lib/Volume.d.ts.map +1 -0
  269. package/lib/Volume.js +188 -0
  270. package/lib/Volume.js.map +1 -0
  271. package/lib/VolumeSnapshot.d.ts +135 -0
  272. package/lib/VolumeSnapshot.d.ts.map +1 -0
  273. package/lib/VolumeSnapshot.js +213 -0
  274. package/lib/VolumeSnapshot.js.map +1 -0
  275. package/lib/Website/AssetDeployment.d.ts +43 -0
  276. package/lib/Website/AssetDeployment.d.ts.map +1 -0
  277. package/lib/Website/AssetDeployment.js +162 -0
  278. package/lib/Website/AssetDeployment.js.map +1 -0
  279. package/lib/Website/Astro.d.ts +89 -0
  280. package/lib/Website/Astro.d.ts.map +1 -0
  281. package/lib/Website/Astro.js +54 -0
  282. package/lib/Website/Astro.js.map +1 -0
  283. package/lib/Website/Foldkit.d.ts +52 -0
  284. package/lib/Website/Foldkit.d.ts.map +1 -0
  285. package/lib/Website/Foldkit.js +45 -0
  286. package/lib/Website/Foldkit.js.map +1 -0
  287. package/lib/Website/FrameworkSite.d.ts +212 -0
  288. package/lib/Website/FrameworkSite.d.ts.map +1 -0
  289. package/lib/Website/FrameworkSite.js +205 -0
  290. package/lib/Website/FrameworkSite.js.map +1 -0
  291. package/lib/Website/Nextjs.d.ts +54 -0
  292. package/lib/Website/Nextjs.d.ts.map +1 -0
  293. package/lib/Website/Nextjs.js +46 -0
  294. package/lib/Website/Nextjs.js.map +1 -0
  295. package/lib/Website/Nuxt.d.ts +51 -0
  296. package/lib/Website/Nuxt.d.ts.map +1 -0
  297. package/lib/Website/Nuxt.js +36 -0
  298. package/lib/Website/Nuxt.js.map +1 -0
  299. package/lib/Website/Octane.d.ts +49 -0
  300. package/lib/Website/Octane.d.ts.map +1 -0
  301. package/lib/Website/Octane.js +39 -0
  302. package/lib/Website/Octane.js.map +1 -0
  303. package/lib/Website/ReactRouter.d.ts +80 -0
  304. package/lib/Website/ReactRouter.d.ts.map +1 -0
  305. package/lib/Website/ReactRouter.js +70 -0
  306. package/lib/Website/ReactRouter.js.map +1 -0
  307. package/lib/Website/SolidStart.d.ts +93 -0
  308. package/lib/Website/SolidStart.d.ts.map +1 -0
  309. package/lib/Website/SolidStart.js +71 -0
  310. package/lib/Website/SolidStart.js.map +1 -0
  311. package/lib/Website/StaticSite.d.ts +162 -0
  312. package/lib/Website/StaticSite.d.ts.map +1 -0
  313. package/lib/Website/StaticSite.js +180 -0
  314. package/lib/Website/StaticSite.js.map +1 -0
  315. package/lib/Website/SvelteKit.d.ts +52 -0
  316. package/lib/Website/SvelteKit.d.ts.map +1 -0
  317. package/lib/Website/SvelteKit.js +37 -0
  318. package/lib/Website/SvelteKit.js.map +1 -0
  319. package/lib/Website/TanStackStart.d.ts +76 -0
  320. package/lib/Website/TanStackStart.d.ts.map +1 -0
  321. package/lib/Website/TanStackStart.js +66 -0
  322. package/lib/Website/TanStackStart.js.map +1 -0
  323. package/lib/Website/Vinext.d.ts +73 -0
  324. package/lib/Website/Vinext.d.ts.map +1 -0
  325. package/lib/Website/Vinext.js +67 -0
  326. package/lib/Website/Vinext.js.map +1 -0
  327. package/lib/Website/Vite.d.ts +112 -0
  328. package/lib/Website/Vite.d.ts.map +1 -0
  329. package/lib/Website/Vite.js +100 -0
  330. package/lib/Website/Vite.js.map +1 -0
  331. package/lib/Website/Vocs.d.ts +52 -0
  332. package/lib/Website/Vocs.d.ts.map +1 -0
  333. package/lib/Website/Vocs.js +38 -0
  334. package/lib/Website/Vocs.js.map +1 -0
  335. package/lib/Website/Waku.d.ts +64 -0
  336. package/lib/Website/Waku.d.ts.map +1 -0
  337. package/lib/Website/Waku.js +39 -0
  338. package/lib/Website/Waku.js.map +1 -0
  339. package/lib/Website/index.d.ts +17 -0
  340. package/lib/Website/index.d.ts.map +1 -0
  341. package/lib/Website/index.js +17 -0
  342. package/lib/Website/index.js.map +1 -0
  343. package/lib/WriteCertificates.d.ts +63 -0
  344. package/lib/WriteCertificates.d.ts.map +1 -0
  345. package/lib/WriteCertificates.js +3 -0
  346. package/lib/WriteCertificates.js.map +1 -0
  347. package/lib/WriteCertificatesHttp.d.ts +25 -0
  348. package/lib/WriteCertificatesHttp.d.ts.map +1 -0
  349. package/lib/WriteCertificatesHttp.js +67 -0
  350. package/lib/WriteCertificatesHttp.js.map +1 -0
  351. package/lib/WriteRedis.d.ts +26 -0
  352. package/lib/WriteRedis.d.ts.map +1 -0
  353. package/lib/WriteRedis.js +3 -0
  354. package/lib/WriteRedis.js.map +1 -0
  355. package/lib/WriteRedisHttp.d.ts +11 -0
  356. package/lib/WriteRedisHttp.d.ts.map +1 -0
  357. package/lib/WriteRedisHttp.js +15 -0
  358. package/lib/WriteRedisHttp.js.map +1 -0
  359. package/lib/WriteSecret.d.ts +68 -0
  360. package/lib/WriteSecret.d.ts.map +1 -0
  361. package/lib/WriteSecret.js +4 -0
  362. package/lib/WriteSecret.js.map +1 -0
  363. package/lib/WriteSecretHttp.d.ts +26 -0
  364. package/lib/WriteSecretHttp.d.ts.map +1 -0
  365. package/lib/WriteSecretHttp.js +54 -0
  366. package/lib/WriteSecretHttp.js.map +1 -0
  367. package/lib/bluegreen.d.ts +36 -0
  368. package/lib/bluegreen.d.ts.map +1 -0
  369. package/lib/bluegreen.js +460 -0
  370. package/lib/bluegreen.js.map +1 -0
  371. package/lib/hosted.d.ts +171 -0
  372. package/lib/hosted.d.ts.map +1 -0
  373. package/lib/hosted.js +458 -0
  374. package/lib/hosted.js.map +1 -0
  375. package/lib/index.d.ts +65 -0
  376. package/lib/index.d.ts.map +1 -0
  377. package/lib/index.js +63 -0
  378. package/lib/index.js.map +1 -0
  379. package/lib/internal/RemoteBuilder.d.ts +28 -0
  380. package/lib/internal/RemoteBuilder.d.ts.map +1 -0
  381. package/lib/internal/RemoteBuilder.js +158 -0
  382. package/lib/internal/RemoteBuilder.js.map +1 -0
  383. package/lib/leases.d.ts +53 -0
  384. package/lib/leases.d.ts.map +1 -0
  385. package/lib/leases.js +279 -0
  386. package/lib/leases.js.map +1 -0
  387. package/lib/ports.d.ts +51 -0
  388. package/lib/ports.d.ts.map +1 -0
  389. package/lib/ports.js +123 -0
  390. package/lib/ports.js.map +1 -0
  391. package/lib/replicas.d.ts +270 -0
  392. package/lib/replicas.d.ts.map +1 -0
  393. package/lib/replicas.js +969 -0
  394. package/lib/replicas.js.map +1 -0
  395. package/lib/rpc.d.ts +35 -0
  396. package/lib/rpc.d.ts.map +1 -0
  397. package/lib/rpc.js +113 -0
  398. package/lib/rpc.js.map +1 -0
  399. package/package.json +83 -3
  400. package/src/App.ts +514 -0
  401. package/src/AuthProvider.ts +68 -0
  402. package/src/BindService.ts +303 -0
  403. package/src/Bootstrap.ts +66 -0
  404. package/src/Bucket.ts +918 -0
  405. package/src/BucketBinding.ts +128 -0
  406. package/src/Catalog.ts +43 -0
  407. package/src/Certificate.ts +548 -0
  408. package/src/Checkpoint.ts +69 -0
  409. package/src/CheckpointHttp.ts +66 -0
  410. package/src/ConnectPostgres.ts +68 -0
  411. package/src/ConnectPostgresHttp.ts +77 -0
  412. package/src/Contributions.ts +9 -0
  413. package/src/Credentials.ts +75 -0
  414. package/src/Decrypt.ts +62 -0
  415. package/src/DecryptHttp.ts +52 -0
  416. package/src/DeleteObject.ts +43 -0
  417. package/src/DeleteObjectHttp.ts +20 -0
  418. package/src/Deployment.ts +121 -0
  419. package/src/DeploymentImages.ts +84 -0
  420. package/src/DeploymentState.ts +104 -0
  421. package/src/Encrypt.ts +60 -0
  422. package/src/EncryptHttp.ts +48 -0
  423. package/src/Environment.ts +81 -0
  424. package/src/Errors.ts +14 -0
  425. package/src/Exec.ts +50 -0
  426. package/src/ExecHttp.ts +47 -0
  427. package/src/GetObject.ts +48 -0
  428. package/src/GetObjectHttp.ts +20 -0
  429. package/src/GetSecret.ts +48 -0
  430. package/src/GetSecretHttp.ts +60 -0
  431. package/src/HeadObject.ts +43 -0
  432. package/src/HeadObjectHttp.ts +20 -0
  433. package/src/IpAssignment.ts +522 -0
  434. package/src/ListObjectsV2.ts +43 -0
  435. package/src/ListObjectsV2Http.ts +20 -0
  436. package/src/ListSecrets.ts +57 -0
  437. package/src/ListSecretsHttp.ts +43 -0
  438. package/src/Machine.ts +1270 -0
  439. package/src/MachineContainers.ts +152 -0
  440. package/src/Metadata.ts +195 -0
  441. package/src/MountVolume.ts +315 -0
  442. package/src/Postgres.ts +777 -0
  443. package/src/PostgresMigrations.ts +93 -0
  444. package/src/Providers.ts +155 -0
  445. package/src/PutObject.ts +49 -0
  446. package/src/PutObjectHttp.ts +20 -0
  447. package/src/ReadRedis.ts +31 -0
  448. package/src/ReadRedisHttp.ts +18 -0
  449. package/src/ReadWriteRedis.ts +33 -0
  450. package/src/ReadWriteRedisHttp.ts +18 -0
  451. package/src/Redis.ts +823 -0
  452. package/src/RedisBinding.ts +64 -0
  453. package/src/RedisHttp.ts +14 -0
  454. package/src/Region.ts +44 -0
  455. package/src/Secret.ts +405 -0
  456. package/src/SecretHttp.ts +149 -0
  457. package/src/SecretKey.ts +389 -0
  458. package/src/SecretKeyHttp.ts +23 -0
  459. package/src/Service.ts +1968 -0
  460. package/src/Sign.ts +46 -0
  461. package/src/SignHttp.ts +44 -0
  462. package/src/Sprite.ts +673 -0
  463. package/src/SpriteHttp.ts +50 -0
  464. package/src/Verify.ts +47 -0
  465. package/src/VerifyHttp.ts +46 -0
  466. package/src/Volume.ts +264 -0
  467. package/src/VolumeSnapshot.ts +321 -0
  468. package/src/Website/AssetDeployment.ts +292 -0
  469. package/src/Website/Astro.ts +92 -0
  470. package/src/Website/Foldkit.ts +54 -0
  471. package/src/Website/FrameworkSite.ts +449 -0
  472. package/src/Website/Nextjs.ts +50 -0
  473. package/src/Website/Nuxt.ts +48 -0
  474. package/src/Website/Octane.ts +44 -0
  475. package/src/Website/ReactRouter.ts +76 -0
  476. package/src/Website/SolidStart.ts +90 -0
  477. package/src/Website/StaticSite.ts +295 -0
  478. package/src/Website/SvelteKit.ts +49 -0
  479. package/src/Website/TanStackStart.ts +72 -0
  480. package/src/Website/Vinext.ts +79 -0
  481. package/src/Website/Vite.ts +121 -0
  482. package/src/Website/Vocs.ts +50 -0
  483. package/src/Website/Waku.ts +65 -0
  484. package/src/Website/index.ts +16 -0
  485. package/src/WriteCertificates.ts +90 -0
  486. package/src/WriteCertificatesHttp.ts +93 -0
  487. package/src/WriteRedis.ts +31 -0
  488. package/src/WriteRedisHttp.ts +18 -0
  489. package/src/WriteSecret.ts +86 -0
  490. package/src/WriteSecretHttp.ts +71 -0
  491. package/src/bluegreen.ts +711 -0
  492. package/src/globals.d.ts +2 -0
  493. package/src/hosted.ts +667 -0
  494. package/src/index.ts +64 -0
  495. package/src/internal/RemoteBuilder.ts +242 -0
  496. package/src/leases.ts +437 -0
  497. package/src/ports.ts +177 -0
  498. package/src/replicas.ts +1480 -0
  499. package/src/rpc.ts +136 -0
@@ -0,0 +1,54 @@
1
+ import { frameworkSite, type FrameworkSiteProps } from "./FrameworkSite.ts";
2
+ import type { ViteProps } from "./Vite.ts";
3
+
4
+ /** Configuration for a Foldkit website. */
5
+ export interface FoldkitProps extends FrameworkSiteProps {
6
+ /** Serializable overrides merged over vite.config.*. */
7
+ vite?: ViteProps["vite"];
8
+ }
9
+
10
+ /**
11
+ * Deploy a [Foldkit](https://foldkit.dev) application to Fly Machines.
12
+ * Browser-only apps use SPA routing. With `ssr.build` enabled in the
13
+ * Foldkit Vite plugin, prerendered pages and assets are served first,
14
+ * followed by Foldkit's generated request handler for SSR and hybrid routes.
15
+ *
16
+ * The build uses `@alchemy.run/frontend-frameworks/foldkit` and the
17
+ * project's Vite configuration. No application adapter is required.
18
+ * Native Foldkit development and live reload run without cloud resources;
19
+ * `Alchemy.remote()` opts into a live deployment during development.
20
+ *
21
+ * ### Creating a Website
22
+ * **Example:** SPA, SSR, or prerendered Foldkit application
23
+ * ```typescript
24
+ * const site = yield* Fly.Website.Foldkit("Web", {
25
+ * rootDir: "./app",
26
+ * });
27
+ * ```
28
+ *
29
+ * ### Server Configuration
30
+ * **Example:** Runtime environment for server-rendered pages
31
+ * ```typescript
32
+ * const site = yield* Fly.Website.Foldkit("Web", {
33
+ * rootDir: "./app",
34
+ * env: { API_BASE: "https://api.example.com" },
35
+ * });
36
+ * ```
37
+ *
38
+ * @resource
39
+ * @product Website
40
+ */
41
+ export const Foldkit = (id: string, props: FoldkitProps = {}) =>
42
+ frameworkSite(id, props, {
43
+ name: "Foldkit",
44
+ framework: "@alchemy.run/frontend-frameworks/foldkit",
45
+ target: "@alchemy.run/frontend-frameworks/foldkit/node",
46
+ options: {
47
+ vite: props.vite,
48
+ notFoundHandling:
49
+ props.assets?.notFoundHandling === "single-page-application"
50
+ ? "spa"
51
+ : props.assets?.notFoundHandling,
52
+ htmlHandling: props.assets?.htmlHandling,
53
+ },
54
+ });
@@ -0,0 +1,449 @@
1
+ import { AlchemyContext } from "alchemy/AlchemyContext";
2
+ import type { MemoOptions } from "alchemy/Command/Memo";
3
+ import * as DNS from "alchemy/DNS/Adapter";
4
+ import type { Input } from "alchemy/Input";
5
+ import * as Namespace from "alchemy/Namespace";
6
+ import * as Output from "alchemy/Output";
7
+ import { ProviderModePolicy } from "alchemy/ProviderMode";
8
+ import { initialCwd } from "alchemy/Util/Node";
9
+ import {
10
+ staticConfigFromAssets,
11
+ type WebsiteAssetsProps,
12
+ type WebsiteNotFoundHandling,
13
+ } from "alchemy/Website/assets";
14
+ import { packSiteExtraFiles } from "alchemy/Website/packExtraFiles";
15
+ import { Server as FrameworkServer, type ServerDevProps } from "alchemy/Website/Server";
16
+ import * as Data from "effect/Data";
17
+ import * as Effect from "effect/Effect";
18
+ import * as FileSystem from "effect/FileSystem";
19
+ import * as Path from "effect/Path";
20
+ import * as Redacted from "effect/Redacted";
21
+ import { App } from "../App.ts";
22
+ import { Bucket } from "../Bucket.ts";
23
+ import { Certificate, type CertificateDnsRequirements } from "../Certificate.ts";
24
+ import { IpAssignment } from "../IpAssignment.ts";
25
+ import type { Providers } from "../Providers.ts";
26
+ import { Service, type ServiceProps } from "../Service.ts";
27
+ import { AssetDeployment } from "./AssetDeployment.ts";
28
+
29
+ /**
30
+ * A resource-valued prop: the resource itself, or an Effect that produces
31
+ * it (so `yield* App(...)` and `App(...)` both type-check).
32
+ */
33
+ export type Ref<T> = T | Effect.Effect<T, never, Providers>;
34
+
35
+ export type { ServerDevProps, WebsiteAssetsProps, WebsiteNotFoundHandling };
36
+ export { staticConfigFromAssets };
37
+
38
+ /**
39
+ * Custom hostname of a Fly website: the hostname itself, or
40
+ * `{ name, dns }` to also publish its DNS records.
41
+ */
42
+ export type WebsiteDomain =
43
+ | string
44
+ | {
45
+ /** Hostname, e.g. `www.example.com`. */
46
+ name: string;
47
+ /**
48
+ * DNS host that publishes the hostname's records (see
49
+ * [DNS Adapters](/infrastructure-as-code/dns-adapters)), e.g.
50
+ * `Cloudflare.DNS.Adapter()`: the ACME challenge `CNAME` Fly lists in
51
+ * the Certificate's `dnsRequirements`, and `A` / `AAAA` records at
52
+ * the site's addresses. Omitted: publish the records yourself.
53
+ */
54
+ dns?: DNS.DnsConfig;
55
+ };
56
+
57
+ /** The hostname of a {@link WebsiteDomain}. */
58
+ export const websiteDomainName = (domain: WebsiteDomain | undefined): string | undefined =>
59
+ domain === undefined || typeof domain === "string" ? domain : domain.name;
60
+
61
+ const acmeChallengeRecords = (
62
+ hostname: string,
63
+ requirements: CertificateDnsRequirements | undefined,
64
+ ): DNS.DnsRecord[] => {
65
+ const challenge = requirements?.acmeChallenge;
66
+ if (challenge?.target === undefined || challenge.target.length === 0) {
67
+ return [];
68
+ }
69
+ const expected = `_acme-challenge.${hostname}`;
70
+ const name =
71
+ challenge.name !== undefined &&
72
+ DNS.normalizeDnsName(challenge.name).endsWith(DNS.normalizeDnsName(hostname))
73
+ ? challenge.name
74
+ : expected;
75
+ return [{ name, type: "CNAME", value: challenge.target }];
76
+ };
77
+
78
+ /**
79
+ * Publish a Fly website's records through `domain.dns`: the Certificate's
80
+ * ACME challenge `CNAME` (`CertificateValidation`) and `A` / `AAAA`
81
+ * records at the site's shared IPv4 plus any IPv6 Fly lists for the
82
+ * hostname (`Domain`). No-op for a plain hostname or an object without
83
+ * `dns`.
84
+ */
85
+ export const publishWebsiteDomainDns = Effect.fn("Fly.Website.publishDomainDns")(function* (args: {
86
+ readonly domain: WebsiteDomain;
87
+ readonly certificate: Certificate;
88
+ readonly ip: IpAssignment;
89
+ }) {
90
+ if (typeof args.domain === "string" || args.domain.dns === undefined) {
91
+ return;
92
+ }
93
+ const dns = yield* DNS.resolve(args.domain.dns);
94
+ const name = args.domain.name;
95
+ yield* dns.records("CertificateValidation", {
96
+ records: Output.map(args.certificate.dnsRequirements, (requirements) =>
97
+ acmeChallengeRecords(name, requirements),
98
+ ) as unknown as Input<DNS.DnsRecord[]>,
99
+ });
100
+ yield* dns.alias("Domain", {
101
+ name,
102
+ target: {
103
+ ipv4: Output.map(args.ip.ip, (ip) => [ip]) as unknown as Input<string[]>,
104
+ ipv6: Output.map(
105
+ args.certificate.dnsRequirements,
106
+ (requirements) => requirements?.aaaa ?? [],
107
+ ) as unknown as Input<string[]>,
108
+ },
109
+ });
110
+ });
111
+
112
+ /**
113
+ * Props shared by every Fly framework website composite.
114
+ */
115
+ export interface FrameworkSiteProps {
116
+ /** Deployment strategy forwarded to the hosted Fly Service. */
117
+ deploy?: ServiceProps["deploy"];
118
+ /** Process shutdown policy. The framework server must handle the signal. */
119
+ shutdown?: ServiceProps["shutdown"];
120
+ /** Named Machine readiness checks. */
121
+ checks?: ServiceProps["checks"];
122
+ /** Override proxy services and their routing health checks. */
123
+ services?: ServiceProps["services"];
124
+ /**
125
+ * Project root directory (the directory containing `package.json`).
126
+ * @default "."
127
+ */
128
+ rootDir?: string;
129
+ /**
130
+ * Controls which files are hashed to decide whether the build re-runs.
131
+ * @default true
132
+ */
133
+ memo?: MemoOptions | boolean;
134
+ /**
135
+ * Parent Fly App. Accepts a `Fly.App` or an Effect that produces one.
136
+ * When omitted, a `Fly.App` is created under this site's namespace.
137
+ */
138
+ app?: Ref<App>;
139
+ /**
140
+ * Process environment for the hosted server. Not Cloudflare Worker
141
+ * bindings — values become Machine env vars. Accepts `Output`s
142
+ * (e.g. `VITE_API_URL: api.url`).
143
+ */
144
+ env?: Record<string, string | Redacted.Redacted<string> | Output.Output<string | undefined>>;
145
+ /**
146
+ * Static-asset routing (`notFoundHandling`, `htmlHandling`). Hashed
147
+ * client files are uploaded to Tigris regardless of this bag.
148
+ */
149
+ assets?: WebsiteAssetsProps;
150
+ /**
151
+ * Options for the local dev server that runs this site under
152
+ * `alchemy dev`.
153
+ */
154
+ dev?: ServerDevProps;
155
+ /**
156
+ * Optional custom hostname. Requests ACME (`Fly.Certificate`) on the
157
+ * App and `url` becomes `https://<domain>`.
158
+ *
159
+ * A string (or `{ name }`) leaves DNS to you. Set `dns` (e.g.
160
+ * `{ name: "www.example.com", dns: Cloudflare.DNS.Adapter() }`) to
161
+ * publish the ACME challenge `CNAME` and the `A` / `AAAA` records
162
+ * through that DNS host. See
163
+ * [DNS Adapters](/infrastructure-as-code/dns-adapters).
164
+ */
165
+ domain?: WebsiteDomain;
166
+ /**
167
+ * User-defined tags. Accepted for API parity; Fly Services do not
168
+ * surface resource tags.
169
+ */
170
+ tags?: Record<string, string>;
171
+ }
172
+
173
+ /** Per-framework wiring for {@link makeFrameworkSite}. */
174
+ export interface FrameworkSiteConfig {
175
+ /** Display name used in error messages (e.g. `"SvelteKit"`). */
176
+ name: string;
177
+ /** Framework-integration module specifier. */
178
+ framework: string;
179
+ /** Node deploy-target module specifier. */
180
+ target: string;
181
+ /**
182
+ * Framework-specific build options forwarded to the integration (e.g.
183
+ * `{ kit }`, `{ nuxt }`, `{ astro }`). Must be JSON-serializable.
184
+ */
185
+ options?: Record<string, unknown> | undefined;
186
+ /**
187
+ * Assets-only routing forwarded to the Node target (Vite SPA fallback).
188
+ * `spa` also publishes client files to Tigris at `/`.
189
+ */
190
+ static?: { spa?: boolean; errorPage?: string } | undefined;
191
+ /**
192
+ * Vocs/Waku: serve `about/index.html` at `/about`.
193
+ * @default "none"
194
+ */
195
+ htmlHandling?: "none" | "drop-trailing-slash";
196
+ /**
197
+ * Packages installed into the Machine image with `npm install` instead
198
+ * of bundling (Next.js needs `next`).
199
+ */
200
+ install?: string[] | undefined;
201
+ /**
202
+ * Skip baking `clientDirectory` at `/app/dist`. Next.js serves `.next`
203
+ * from the image root instead.
204
+ */
205
+ skipClientAssets?: boolean | undefined;
206
+ }
207
+
208
+ export interface FrameworkSite {
209
+ /**
210
+ * Public site URL. Local framework URL under `alchemy dev`;
211
+ * `https://{app}.fly.dev` (or `https://{domain}`) on deploy.
212
+ */
213
+ url: string | Output.Output<string | undefined> | undefined;
214
+ /** Parent Fly App. `undefined` during `alchemy dev`. */
215
+ app: App | undefined;
216
+ /** Hosted Fly Service. `undefined` during `alchemy dev`. */
217
+ service: Service | undefined;
218
+ /** Shared Anycast IPv4 so `{app}.fly.dev` answers. */
219
+ ip: IpAssignment | undefined;
220
+ /** ACME certificate when {@link FrameworkSiteProps.domain} is set. */
221
+ certificate: Certificate | undefined;
222
+ }
223
+
224
+ export class FrameworkSiteError extends Data.TaggedError("FrameworkSiteError")<{
225
+ readonly framework: string;
226
+ readonly message: string;
227
+ readonly cause?: unknown;
228
+ }> {}
229
+
230
+ const DEFAULT_PORT = 3000;
231
+
232
+ const resolveRef = <T>(ref: Ref<T>): Effect.Effect<T, never, Providers> =>
233
+ Effect.isEffect(ref) ? ref : Effect.succeed(ref);
234
+
235
+ const envRecord = (
236
+ env:
237
+ | Record<string, string | Redacted.Redacted<string> | Output.Output<string | undefined>>
238
+ | undefined,
239
+ ): Record<string, string | Output.Output<string | undefined>> | undefined => {
240
+ if (env === undefined) return undefined;
241
+ return Object.fromEntries(
242
+ Object.entries(env).map(([key, value]) => [
243
+ key,
244
+ Redacted.isRedacted(value) ? Redacted.value(value) : value,
245
+ ]),
246
+ );
247
+ };
248
+
249
+ const runFrameworkSite = Effect.fn("Fly.Website.FrameworkSite")(function* (
250
+ _id: string,
251
+ props: FrameworkSiteProps,
252
+ config: FrameworkSiteConfig,
253
+ ) {
254
+ const ctx = yield* AlchemyContext;
255
+ const remoted = yield* ProviderModePolicy;
256
+ const isLocal = ctx.dev && remoted !== true;
257
+ const path = yield* Path.Path;
258
+ const fs = yield* FileSystem.FileSystem;
259
+
260
+ const build = yield* FrameworkServer("Build", {
261
+ framework: config.framework,
262
+ target: config.target,
263
+ root: props.rootDir,
264
+ env: envRecord(props.env),
265
+ options: config.options,
266
+ memo: props.memo,
267
+ dev: props.dev,
268
+ });
269
+
270
+ if (isLocal) {
271
+ return {
272
+ url: build.url,
273
+ app: undefined,
274
+ service: undefined,
275
+ ip: undefined,
276
+ certificate: undefined,
277
+ } satisfies FrameworkSite;
278
+ }
279
+
280
+ // The build runs at APPLY time (`Website.Server` is a resource), so its
281
+ // attributes are Outputs here — derive every deploy input lazily and let
282
+ // the engine resolve them once the build has produced real paths. Reading
283
+ // `build.distDir` eagerly in the composite body would observe an Output
284
+ // proxy, not a string.
285
+ const buildOut = Output.mapEffect(
286
+ ([serverEntry, distDir]: [string | undefined, string | undefined]) =>
287
+ Effect.gen(function* () {
288
+ if (serverEntry === undefined || distDir === undefined) {
289
+ return yield* Effect.die(
290
+ new FrameworkSiteError({
291
+ framework: config.framework,
292
+ message: `The ${config.name} build produced no Node serve entry (serverModules[0]). The Node deploy target should write serve-node.mjs.`,
293
+ }),
294
+ );
295
+ }
296
+ const main = path.resolve(initialCwd, serverEntry);
297
+ if (!(yield* fs.exists(main).pipe(Effect.orElseSucceed(() => false)))) {
298
+ return yield* Effect.die(
299
+ new FrameworkSiteError({
300
+ framework: config.framework,
301
+ message: `The ${config.name} build produced no server entry at ${main}`,
302
+ }),
303
+ );
304
+ }
305
+ return { distDir: path.resolve(initialCwd, distDir), main };
306
+ }),
307
+ )(
308
+ Output.all(
309
+ build.serverEntry as unknown as Output.Output<string | undefined>,
310
+ build.distDir as unknown as Output.Output<string | undefined>,
311
+ ) as unknown as Output.Output<[string | undefined, string | undefined]>,
312
+ );
313
+ const main = Output.map(buildOut, (out) => out.main);
314
+
315
+ const extraFiles = Output.mapEffect((out: { distDir: string; main: string }) =>
316
+ packSiteExtraFiles(out.distDir, config.skipClientAssets === true ? "next" : "client"),
317
+ )(buildOut);
318
+
319
+ const app = props.app !== undefined ? yield* resolveRef(props.app) : yield* App("App");
320
+
321
+ const ip = yield* IpAssignment("Shared", {
322
+ app,
323
+ type: "shared_v4",
324
+ });
325
+
326
+ // SPA: hashed `/assets` at Tigris. HTML and unknown paths stay on
327
+ // origin (NodeServe `notFoundHandling: "spa"`). Intercepting `/` with
328
+ // Tigris hangs SPA fallbacks — Fly does not rewrite `/counter/42` to
329
+ // `index.html`.
330
+ let statics:
331
+ | Output.Output<
332
+ | Array<{
333
+ guestPath: string;
334
+ urlPrefix: string;
335
+ tigrisBucket?: string;
336
+ indexDocument?: string;
337
+ }>
338
+ | undefined
339
+ >
340
+ | undefined;
341
+ if (config.static?.spa === true) {
342
+ const clientDir = Output.map(
343
+ build.clientDir as unknown as Output.Output<string | undefined>,
344
+ (dir) => {
345
+ if (dir === undefined) {
346
+ throw new FrameworkSiteError({
347
+ framework: config.framework,
348
+ message: `The ${config.name} build produced no client assets directory`,
349
+ });
350
+ }
351
+ return path.resolve(initialCwd, dir);
352
+ },
353
+ );
354
+ const bucket = yield* Bucket("Assets", { public: true });
355
+ yield* AssetDeployment("Files", {
356
+ bucket,
357
+ sourcePath: clientDir as unknown as string,
358
+ purge: true,
359
+ });
360
+ statics = Output.mapEffect(([clientDir, bucketName]: [string, string]) =>
361
+ Effect.gen(function* () {
362
+ const assetsDir = path.join(clientDir, "assets");
363
+ const exists = yield* fs.exists(assetsDir).pipe(Effect.orElseSucceed(() => false));
364
+ return exists
365
+ ? [
366
+ {
367
+ guestPath: "/assets",
368
+ urlPrefix: "/assets",
369
+ tigrisBucket: bucketName,
370
+ },
371
+ ]
372
+ : undefined;
373
+ }),
374
+ )(
375
+ Output.all(
376
+ clientDir,
377
+ bucket.name as unknown as Output.Output<string>,
378
+ ) as unknown as Output.Output<[string, string]>,
379
+ );
380
+ }
381
+
382
+ const service = yield* Service("Service", {
383
+ app,
384
+ deploy: props.deploy,
385
+ shutdown: props.shutdown,
386
+ checks: props.checks,
387
+ services: props.services,
388
+ main: main as unknown as string,
389
+ port: DEFAULT_PORT,
390
+ // Node + nitro SSR needs more than the Machine default 256MB.
391
+ guest: { memoryMb: 512 },
392
+ isExternal: true,
393
+ env: props.env,
394
+ extraFiles: extraFiles as unknown as Array<{
395
+ source: string;
396
+ dest: string;
397
+ }>,
398
+ statics: statics as unknown as
399
+ | Array<{
400
+ guestPath: string;
401
+ urlPrefix: string;
402
+ tigrisBucket?: string;
403
+ indexDocument?: string;
404
+ }>
405
+ | undefined,
406
+ build:
407
+ config.install !== undefined && config.install.length > 0
408
+ ? { install: config.install }
409
+ : undefined,
410
+ });
411
+
412
+ const domainName = websiteDomainName(props.domain);
413
+ const certificate =
414
+ domainName !== undefined
415
+ ? yield* Certificate("Certificate", {
416
+ app,
417
+ hostname: domainName,
418
+ kind: "acme",
419
+ })
420
+ : undefined;
421
+ if (props.domain !== undefined && certificate !== undefined) {
422
+ yield* publishWebsiteDomainDns({ domain: props.domain, certificate, ip });
423
+ }
424
+
425
+ const url = domainName !== undefined ? `https://${domainName}` : app.url;
426
+
427
+ return { url, app, service, ip, certificate };
428
+ });
429
+
430
+ /**
431
+ * Shared implementation behind the Fly framework website composites:
432
+ * `Website.Server` runs the framework toolchain (dev sidecar / production
433
+ * build), then a live deploy hosts `serve-node.mjs` on a Fly.Service.
434
+ *
435
+ * Callers pipe `Namespace.push(id)` themselves (the composites do).
436
+ *
437
+ * Composite-level tagged errors (`FrameworkSiteError`, filesystem) are
438
+ * defects — `Alchemy.Stack` only admits `ConfigError` on the user
439
+ * effect, same as Cloudflare/AWS Website composites.
440
+ */
441
+ export const makeFrameworkSite = (
442
+ id: string,
443
+ props: FrameworkSiteProps,
444
+ config: FrameworkSiteConfig,
445
+ ) => runFrameworkSite(id, props, config).pipe(Effect.orDie);
446
+
447
+ /** Push {@link id} then run {@link makeFrameworkSite}. */
448
+ export const frameworkSite = (id: string, props: FrameworkSiteProps, config: FrameworkSiteConfig) =>
449
+ makeFrameworkSite(id, props, config).pipe(Namespace.push(id));
@@ -0,0 +1,50 @@
1
+ import { frameworkSite, type FrameworkSiteProps } from "./FrameworkSite.ts";
2
+
3
+ /**
4
+ * The Next.js-on-Node framework module (`next build` + a custom
5
+ * `next({ dev: false })` server). Not OpenNext.
6
+ */
7
+ export const NEXTJS_NODE_FRAMEWORK_SPECIFIER = "@alchemy.run/frontend-frameworks/nextjs/node";
8
+
9
+ export interface NextjsProps extends FrameworkSiteProps {}
10
+
11
+ /**
12
+ * Deploy a Next.js application to Fly as a long-running Node process:
13
+ * `next build`, then a serve entry that `import("next")` +
14
+ * `next({ dev: false }).prepare()` + `getRequestHandler()`. The `.next`
15
+ * output (and `public/` when present) is baked into the image; `next` is
16
+ * installed unbundled.
17
+ *
18
+ * Do not use OpenNext AWS/CF wrappers — those are Lambda/workerd.
19
+ *
20
+ * During `alchemy dev` the site is `next dev` and no cloud resources are
21
+ * declared; `Alchemy.remote()` opts back into the live Service path.
22
+ *
23
+ *
24
+ * ### Creating Next.js Sites
25
+ * **Example:** Basic Next.js App
26
+ * ```typescript
27
+ * const site = yield* Fly.Website.Nextjs("Web", {
28
+ * rootDir: "./app",
29
+ * });
30
+ * ```
31
+ *
32
+ * **Example:** Custom Domain
33
+ * ```typescript
34
+ * const site = yield* Fly.Website.Nextjs("Web", {
35
+ * rootDir: "./app",
36
+ * domain: "app.example.com",
37
+ * });
38
+ * ```
39
+ *
40
+ * @resource
41
+ * @product Website
42
+ */
43
+ export const Nextjs = (id: string, props: NextjsProps = {}) =>
44
+ frameworkSite(id, props, {
45
+ name: "Next.js",
46
+ framework: NEXTJS_NODE_FRAMEWORK_SPECIFIER,
47
+ target: NEXTJS_NODE_FRAMEWORK_SPECIFIER,
48
+ install: ["next", "react", "react-dom"],
49
+ skipClientAssets: true,
50
+ });
@@ -0,0 +1,48 @@
1
+ import { frameworkSite, type FrameworkSiteProps } from "./FrameworkSite.ts";
2
+
3
+ /** The framework-integration package that drives the Nuxt build. */
4
+ export const NUXT_FRAMEWORK_SPECIFIER = "@alchemy.run/frontend-frameworks/nuxt";
5
+
6
+ /** The Node container deploy target for the Nuxt build. */
7
+ export const NUXT_NODE_TARGET_SPECIFIER = "@alchemy.run/frontend-frameworks/nuxt/node";
8
+
9
+ export interface NuxtProps extends FrameworkSiteProps {
10
+ /**
11
+ * Nuxt config overrides merged over the project's own `nuxt.config.ts`
12
+ * (highest-priority layer). `nitro.preset` is owned by the Node deploy
13
+ * target and may not be set here.
14
+ */
15
+ nuxt?: Record<string, unknown>;
16
+ }
17
+
18
+ /**
19
+ * Deploy a Nuxt application to Fly: the nitro Node server on a Machine,
20
+ * static assets (prerendered pages included) baked into the image.
21
+ *
22
+ *
23
+ * ### Creating Nuxt Sites
24
+ * **Example:** Basic Nuxt App
25
+ * ```typescript
26
+ * const site = yield* Fly.Website.Nuxt("Web", {
27
+ * rootDir: "./app",
28
+ * });
29
+ * ```
30
+ *
31
+ * **Example:** Custom Domain
32
+ * ```typescript
33
+ * const site = yield* Fly.Website.Nuxt("Web", {
34
+ * rootDir: "./app",
35
+ * domain: "app.example.com",
36
+ * });
37
+ * ```
38
+ *
39
+ * @resource
40
+ * @product Website
41
+ */
42
+ export const Nuxt = (id: string, props: NuxtProps = {}) =>
43
+ frameworkSite(id, props, {
44
+ name: "Nuxt",
45
+ framework: NUXT_FRAMEWORK_SPECIFIER,
46
+ target: NUXT_NODE_TARGET_SPECIFIER,
47
+ options: props.nuxt ? { nuxt: props.nuxt } : undefined,
48
+ });
@@ -0,0 +1,44 @@
1
+ import { frameworkSite, type FrameworkSiteProps } from "./FrameworkSite.ts";
2
+
3
+ /** The framework-integration package that drives the Octane build. */
4
+ export const OCTANE_FRAMEWORK_SPECIFIER = "@alchemy.run/frontend-frameworks/octane";
5
+
6
+ /** The Node container deploy target for the Octane build. */
7
+ export const OCTANE_NODE_TARGET_SPECIFIER = "@alchemy.run/frontend-frameworks/octane/node";
8
+
9
+ export interface OctaneProps extends FrameworkSiteProps {}
10
+
11
+ /**
12
+ * Deploy an [OctaneJS](https://octanejs.dev) application to Fly: Octane's
13
+ * SSR server on a Machine, static assets baked into the image.
14
+ *
15
+ * `Fly.Website.Octane` selects hosting and automatically wraps Octane's
16
+ * default native Node output. Keep compiler and route settings in
17
+ * `octane.config.ts` without an adapter. The legacy Node marker adapter
18
+ * remains optional for existing projects.
19
+ *
20
+ * ### Creating Octane Sites
21
+ * **Example:** Basic Octane App
22
+ * ```typescript
23
+ * const site = yield* Fly.Website.Octane("Web", {
24
+ * rootDir: "./app",
25
+ * });
26
+ * ```
27
+ *
28
+ * **Example:** Custom Domain
29
+ * ```typescript
30
+ * const site = yield* Fly.Website.Octane("Web", {
31
+ * rootDir: "./app",
32
+ * domain: "app.example.com",
33
+ * });
34
+ * ```
35
+ *
36
+ * @resource
37
+ * @product Website
38
+ */
39
+ export const Octane = (id: string, props: OctaneProps = {}) =>
40
+ frameworkSite(id, props, {
41
+ name: "Octane",
42
+ framework: OCTANE_FRAMEWORK_SPECIFIER,
43
+ target: OCTANE_NODE_TARGET_SPECIFIER,
44
+ });