@homeflare/alchemy 0.1.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 (417) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/cloudflare/client.d.ts +45 -0
  4. package/dist/cloudflare/client.d.ts.map +1 -0
  5. package/dist/cloudflare/index.d.ts +11 -0
  6. package/dist/cloudflare/index.d.ts.map +1 -0
  7. package/dist/cloudflare/index.js +129 -0
  8. package/dist/cloudflare/index.js.map +13 -0
  9. package/dist/cloudflare/lock-rules.d.ts +50 -0
  10. package/dist/cloudflare/lock-rules.d.ts.map +1 -0
  11. package/dist/cloudflare/providers.d.ts +19 -0
  12. package/dist/cloudflare/providers.d.ts.map +1 -0
  13. package/dist/cloudflare/r2-bucket-lock.d.ts +100 -0
  14. package/dist/cloudflare/r2-bucket-lock.d.ts.map +1 -0
  15. package/dist/forgejo/branch-protection-form.d.ts +19 -0
  16. package/dist/forgejo/branch-protection-form.d.ts.map +1 -0
  17. package/dist/forgejo/branch-protection.d.ts +47 -0
  18. package/dist/forgejo/branch-protection.d.ts.map +1 -0
  19. package/dist/forgejo/client.d.ts +37 -0
  20. package/dist/forgejo/client.d.ts.map +1 -0
  21. package/dist/forgejo/index.d.ts +18 -0
  22. package/dist/forgejo/index.d.ts.map +1 -0
  23. package/dist/forgejo/index.js +479 -0
  24. package/dist/forgejo/index.js.map +21 -0
  25. package/dist/forgejo/org-actions-secrets.d.ts +45 -0
  26. package/dist/forgejo/org-actions-secrets.d.ts.map +1 -0
  27. package/dist/forgejo/org-label.d.ts +46 -0
  28. package/dist/forgejo/org-label.d.ts.map +1 -0
  29. package/dist/forgejo/org-team.d.ts +42 -0
  30. package/dist/forgejo/org-team.d.ts.map +1 -0
  31. package/dist/forgejo/repo-webhook-form.d.ts +27 -0
  32. package/dist/forgejo/repo-webhook-form.d.ts.map +1 -0
  33. package/dist/forgejo/repo-webhook.d.ts +46 -0
  34. package/dist/forgejo/repo-webhook.d.ts.map +1 -0
  35. package/dist/forgejo/repository.d.ts +45 -0
  36. package/dist/forgejo/repository.d.ts.map +1 -0
  37. package/dist/forgejo/resource.d.ts +83 -0
  38. package/dist/forgejo/resource.d.ts.map +1 -0
  39. package/dist/forgejo/team-member.d.ts +39 -0
  40. package/dist/forgejo/team-member.d.ts.map +1 -0
  41. package/dist/forgejo/values.d.ts +24 -0
  42. package/dist/forgejo/values.d.ts.map +1 -0
  43. package/dist/index.d.ts +18 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +3 -0
  46. package/dist/index.js.map +9 -0
  47. package/dist/openbao/auth-role-form.d.ts +38 -0
  48. package/dist/openbao/auth-role-form.d.ts.map +1 -0
  49. package/dist/openbao/auth-role.d.ts +20 -0
  50. package/dist/openbao/auth-role.d.ts.map +1 -0
  51. package/dist/openbao/bao-address.d.ts +72 -0
  52. package/dist/openbao/bao-address.d.ts.map +1 -0
  53. package/dist/openbao/bao-http.d.ts +71 -0
  54. package/dist/openbao/bao-http.d.ts.map +1 -0
  55. package/dist/openbao/bao-status.d.ts +74 -0
  56. package/dist/openbao/bao-status.d.ts.map +1 -0
  57. package/dist/openbao/cloudflare-group-scope.d.ts +73 -0
  58. package/dist/openbao/cloudflare-group-scope.d.ts.map +1 -0
  59. package/dist/openbao/cloudflare-parity-catalog.d.ts +28 -0
  60. package/dist/openbao/cloudflare-parity-catalog.d.ts.map +1 -0
  61. package/dist/openbao/cloudflare-parity-snapshot.d.ts +31 -0
  62. package/dist/openbao/cloudflare-parity-snapshot.d.ts.map +1 -0
  63. package/dist/openbao/cloudflare-parity.d.ts +14 -0
  64. package/dist/openbao/cloudflare-parity.d.ts.map +1 -0
  65. package/dist/openbao/cloudflare-permission-groups-solve.d.ts +85 -0
  66. package/dist/openbao/cloudflare-permission-groups-solve.d.ts.map +1 -0
  67. package/dist/openbao/cloudflare-permission-groups.d.ts +87 -0
  68. package/dist/openbao/cloudflare-permission-groups.d.ts.map +1 -0
  69. package/dist/openbao/cloudflare-policy.d.ts +65 -0
  70. package/dist/openbao/cloudflare-policy.d.ts.map +1 -0
  71. package/dist/openbao/cloudflare-role-form.d.ts +110 -0
  72. package/dist/openbao/cloudflare-role-form.d.ts.map +1 -0
  73. package/dist/openbao/cloudflare-role-wire.d.ts +27 -0
  74. package/dist/openbao/cloudflare-role-wire.d.ts.map +1 -0
  75. package/dist/openbao/cloudflare-role.d.ts +35 -0
  76. package/dist/openbao/cloudflare-role.d.ts.map +1 -0
  77. package/dist/openbao/cloudflare-roles-config.d.ts +67 -0
  78. package/dist/openbao/cloudflare-roles-config.d.ts.map +1 -0
  79. package/dist/openbao/cloudflare-roles-expand.d.ts +76 -0
  80. package/dist/openbao/cloudflare-roles-expand.d.ts.map +1 -0
  81. package/dist/openbao/digest.d.ts +24 -0
  82. package/dist/openbao/digest.d.ts.map +1 -0
  83. package/dist/openbao/fake-bao.d.ts +40 -0
  84. package/dist/openbao/fake-bao.d.ts.map +1 -0
  85. package/dist/openbao/forgejo-bootstrap-parse.d.ts +46 -0
  86. package/dist/openbao/forgejo-bootstrap-parse.d.ts.map +1 -0
  87. package/dist/openbao/forgejo-bootstrap.d.ts +29 -0
  88. package/dist/openbao/forgejo-bootstrap.d.ts.map +1 -0
  89. package/dist/openbao/index.d.ts +18 -0
  90. package/dist/openbao/index.d.ts.map +1 -0
  91. package/dist/openbao/index.js +1158 -0
  92. package/dist/openbao/index.js.map +33 -0
  93. package/dist/openbao/mount-form.d.ts +60 -0
  94. package/dist/openbao/mount-form.d.ts.map +1 -0
  95. package/dist/openbao/mount-wire.d.ts +24 -0
  96. package/dist/openbao/mount-wire.d.ts.map +1 -0
  97. package/dist/openbao/mount.d.ts +20 -0
  98. package/dist/openbao/mount.d.ts.map +1 -0
  99. package/dist/openbao/pki-role-form.d.ts +118 -0
  100. package/dist/openbao/pki-role-form.d.ts.map +1 -0
  101. package/dist/openbao/pki-role.d.ts +50 -0
  102. package/dist/openbao/pki-role.d.ts.map +1 -0
  103. package/dist/openbao/policy-assembly.d.ts +13 -0
  104. package/dist/openbao/policy-assembly.d.ts.map +1 -0
  105. package/dist/openbao/policy-wire.d.ts +41 -0
  106. package/dist/openbao/policy-wire.d.ts.map +1 -0
  107. package/dist/openbao/policy.d.ts +83 -0
  108. package/dist/openbao/policy.d.ts.map +1 -0
  109. package/dist/openbao/proxmox-role-form.d.ts +92 -0
  110. package/dist/openbao/proxmox-role-form.d.ts.map +1 -0
  111. package/dist/openbao/proxmox-role.d.ts +47 -0
  112. package/dist/openbao/proxmox-role.d.ts.map +1 -0
  113. package/dist/openbao/ssh-role-form.d.ts +99 -0
  114. package/dist/openbao/ssh-role-form.d.ts.map +1 -0
  115. package/dist/openbao/ssh-role.d.ts +43 -0
  116. package/dist/openbao/ssh-role.d.ts.map +1 -0
  117. package/dist/proxmox/acl.d.ts +72 -0
  118. package/dist/proxmox/acl.d.ts.map +1 -0
  119. package/dist/proxmox/api-token-form.d.ts +59 -0
  120. package/dist/proxmox/api-token-form.d.ts.map +1 -0
  121. package/dist/proxmox/api-token.d.ts +159 -0
  122. package/dist/proxmox/api-token.d.ts.map +1 -0
  123. package/dist/proxmox/backup-job.d.ts +112 -0
  124. package/dist/proxmox/backup-job.d.ts.map +1 -0
  125. package/dist/proxmox/ceph-daemon-form.d.ts +70 -0
  126. package/dist/proxmox/ceph-daemon-form.d.ts.map +1 -0
  127. package/dist/proxmox/ceph-daemon.d.ts +162 -0
  128. package/dist/proxmox/ceph-daemon.d.ts.map +1 -0
  129. package/dist/proxmox/ceph-flag.d.ts +131 -0
  130. package/dist/proxmox/ceph-flag.d.ts.map +1 -0
  131. package/dist/proxmox/ceph-fs-wire.d.ts +106 -0
  132. package/dist/proxmox/ceph-fs-wire.d.ts.map +1 -0
  133. package/dist/proxmox/ceph-fs.d.ts +124 -0
  134. package/dist/proxmox/ceph-fs.d.ts.map +1 -0
  135. package/dist/proxmox/ceph-osd-tree.d.ts +154 -0
  136. package/dist/proxmox/ceph-osd-tree.d.ts.map +1 -0
  137. package/dist/proxmox/ceph-osd-write.d.ts +36 -0
  138. package/dist/proxmox/ceph-osd-write.d.ts.map +1 -0
  139. package/dist/proxmox/ceph-osd.d.ts +102 -0
  140. package/dist/proxmox/ceph-osd.d.ts.map +1 -0
  141. package/dist/proxmox/ceph-pool-form.d.ts +217 -0
  142. package/dist/proxmox/ceph-pool-form.d.ts.map +1 -0
  143. package/dist/proxmox/ceph-pool-settle.d.ts +39 -0
  144. package/dist/proxmox/ceph-pool-settle.d.ts.map +1 -0
  145. package/dist/proxmox/ceph-pool.d.ts +48 -0
  146. package/dist/proxmox/ceph-pool.d.ts.map +1 -0
  147. package/dist/proxmox/client.d.ts +64 -0
  148. package/dist/proxmox/client.d.ts.map +1 -0
  149. package/dist/proxmox/credentials.d.ts +153 -0
  150. package/dist/proxmox/credentials.d.ts.map +1 -0
  151. package/dist/proxmox/firewall-alias-form.d.ts +98 -0
  152. package/dist/proxmox/firewall-alias-form.d.ts.map +1 -0
  153. package/dist/proxmox/firewall-alias.d.ts +141 -0
  154. package/dist/proxmox/firewall-alias.d.ts.map +1 -0
  155. package/dist/proxmox/generated/pbs.d.ts +388 -0
  156. package/dist/proxmox/generated/pbs.d.ts.map +1 -0
  157. package/dist/proxmox/generated/pve.d.ts +4713 -0
  158. package/dist/proxmox/generated/pve.d.ts.map +1 -0
  159. package/dist/proxmox/group.d.ts +104 -0
  160. package/dist/proxmox/group.d.ts.map +1 -0
  161. package/dist/proxmox/ha-resource.d.ts +104 -0
  162. package/dist/proxmox/ha-resource.d.ts.map +1 -0
  163. package/dist/proxmox/ha-rule-form.d.ts +103 -0
  164. package/dist/proxmox/ha-rule-form.d.ts.map +1 -0
  165. package/dist/proxmox/ha-rule.d.ts +156 -0
  166. package/dist/proxmox/ha-rule.d.ts.map +1 -0
  167. package/dist/proxmox/index.d.ts +43 -0
  168. package/dist/proxmox/index.d.ts.map +1 -0
  169. package/dist/proxmox/index.js +2322 -0
  170. package/dist/proxmox/index.js.map +70 -0
  171. package/dist/proxmox/lease-cache.d.ts +98 -0
  172. package/dist/proxmox/lease-cache.d.ts.map +1 -0
  173. package/dist/proxmox/lxc.d.ts +59 -0
  174. package/dist/proxmox/lxc.d.ts.map +1 -0
  175. package/dist/proxmox/members.d.ts +56 -0
  176. package/dist/proxmox/members.d.ts.map +1 -0
  177. package/dist/proxmox/metric-server-form.d.ts +53 -0
  178. package/dist/proxmox/metric-server-form.d.ts.map +1 -0
  179. package/dist/proxmox/metric-server-otel.d.ts +49 -0
  180. package/dist/proxmox/metric-server-otel.d.ts.map +1 -0
  181. package/dist/proxmox/metric-server.d.ts +123 -0
  182. package/dist/proxmox/metric-server.d.ts.map +1 -0
  183. package/dist/proxmox/network-apply-read.d.ts +93 -0
  184. package/dist/proxmox/network-apply-read.d.ts.map +1 -0
  185. package/dist/proxmox/network-apply.d.ts +102 -0
  186. package/dist/proxmox/network-apply.d.ts.map +1 -0
  187. package/dist/proxmox/node-network-form.d.ts +128 -0
  188. package/dist/proxmox/node-network-form.d.ts.map +1 -0
  189. package/dist/proxmox/node-network.d.ts +173 -0
  190. package/dist/proxmox/node-network.d.ts.map +1 -0
  191. package/dist/proxmox/notification-target-form.d.ts +44 -0
  192. package/dist/proxmox/notification-target-form.d.ts.map +1 -0
  193. package/dist/proxmox/notification-target.d.ts +146 -0
  194. package/dist/proxmox/notification-target.d.ts.map +1 -0
  195. package/dist/proxmox/pbs-datastore-form.d.ts +147 -0
  196. package/dist/proxmox/pbs-datastore-form.d.ts.map +1 -0
  197. package/dist/proxmox/pbs-datastore-guard.d.ts +55 -0
  198. package/dist/proxmox/pbs-datastore-guard.d.ts.map +1 -0
  199. package/dist/proxmox/pbs-datastore.d.ts +140 -0
  200. package/dist/proxmox/pbs-datastore.d.ts.map +1 -0
  201. package/dist/proxmox/pbs-prune-job-form.d.ts +97 -0
  202. package/dist/proxmox/pbs-prune-job-form.d.ts.map +1 -0
  203. package/dist/proxmox/pbs-prune-job.d.ts +168 -0
  204. package/dist/proxmox/pbs-prune-job.d.ts.map +1 -0
  205. package/dist/proxmox/pbs-sync-job-form.d.ts +83 -0
  206. package/dist/proxmox/pbs-sync-job-form.d.ts.map +1 -0
  207. package/dist/proxmox/pbs-sync-job.d.ts +246 -0
  208. package/dist/proxmox/pbs-sync-job.d.ts.map +1 -0
  209. package/dist/proxmox/pbs-verify-job-form.d.ts +114 -0
  210. package/dist/proxmox/pbs-verify-job-form.d.ts.map +1 -0
  211. package/dist/proxmox/pbs-verify-job.d.ts +145 -0
  212. package/dist/proxmox/pbs-verify-job.d.ts.map +1 -0
  213. package/dist/proxmox/pool.d.ts +42 -0
  214. package/dist/proxmox/pool.d.ts.map +1 -0
  215. package/dist/proxmox/qemu.d.ts +46 -0
  216. package/dist/proxmox/qemu.d.ts.map +1 -0
  217. package/dist/proxmox/replication-job-form.d.ts +71 -0
  218. package/dist/proxmox/replication-job-form.d.ts.map +1 -0
  219. package/dist/proxmox/replication-job.d.ts +162 -0
  220. package/dist/proxmox/replication-job.d.ts.map +1 -0
  221. package/dist/proxmox/resource.d.ts +157 -0
  222. package/dist/proxmox/resource.d.ts.map +1 -0
  223. package/dist/proxmox/role.d.ts +97 -0
  224. package/dist/proxmox/role.d.ts.map +1 -0
  225. package/dist/proxmox/sdn-apply-read.d.ts +80 -0
  226. package/dist/proxmox/sdn-apply-read.d.ts.map +1 -0
  227. package/dist/proxmox/sdn-apply.d.ts +63 -0
  228. package/dist/proxmox/sdn-apply.d.ts.map +1 -0
  229. package/dist/proxmox/sdn-subnet-form.d.ts +111 -0
  230. package/dist/proxmox/sdn-subnet-form.d.ts.map +1 -0
  231. package/dist/proxmox/sdn-subnet.d.ts +161 -0
  232. package/dist/proxmox/sdn-subnet.d.ts.map +1 -0
  233. package/dist/proxmox/sdn-vnet.d.ts +113 -0
  234. package/dist/proxmox/sdn-vnet.d.ts.map +1 -0
  235. package/dist/proxmox/sdn-zone.d.ts +126 -0
  236. package/dist/proxmox/sdn-zone.d.ts.map +1 -0
  237. package/dist/proxmox/storage.d.ts +120 -0
  238. package/dist/proxmox/storage.d.ts.map +1 -0
  239. package/dist/proxmox/user.d.ts +107 -0
  240. package/dist/proxmox/user.d.ts.map +1 -0
  241. package/dist/proxmox/values.d.ts +134 -0
  242. package/dist/proxmox/values.d.ts.map +1 -0
  243. package/dist/proxmox/zfs-pool-write.d.ts +76 -0
  244. package/dist/proxmox/zfs-pool-write.d.ts.map +1 -0
  245. package/dist/proxmox/zfs-pool.d.ts +146 -0
  246. package/dist/proxmox/zfs-pool.d.ts.map +1 -0
  247. package/dist/talos/credentials.d.ts +30 -0
  248. package/dist/talos/credentials.d.ts.map +1 -0
  249. package/dist/talos/index.d.ts +15 -0
  250. package/dist/talos/index.d.ts.map +1 -0
  251. package/dist/talos/index.js +392 -0
  252. package/dist/talos/index.js.map +16 -0
  253. package/dist/talos/kubeconfig.d.ts +53 -0
  254. package/dist/talos/kubeconfig.d.ts.map +1 -0
  255. package/dist/talos/resource.d.ts +32 -0
  256. package/dist/talos/resource.d.ts.map +1 -0
  257. package/dist/talos/talos-bootstrap.d.ts +27 -0
  258. package/dist/talos/talos-bootstrap.d.ts.map +1 -0
  259. package/dist/talos/talos-cluster-health.d.ts +36 -0
  260. package/dist/talos/talos-cluster-health.d.ts.map +1 -0
  261. package/dist/talos/talos-machine-config.d.ts +41 -0
  262. package/dist/talos/talos-machine-config.d.ts.map +1 -0
  263. package/dist/talos/talosctl.d.ts +29 -0
  264. package/dist/talos/talosctl.d.ts.map +1 -0
  265. package/dist/talos/values.d.ts +20 -0
  266. package/dist/talos/values.d.ts.map +1 -0
  267. package/package.json +57 -0
  268. package/src/cloudflare/client.ts +76 -0
  269. package/src/cloudflare/index.ts +10 -0
  270. package/src/cloudflare/lock-rules.ts +60 -0
  271. package/src/cloudflare/providers.ts +23 -0
  272. package/src/cloudflare/r2-bucket-lock.ts +220 -0
  273. package/src/forgejo/branch-protection-form.ts +29 -0
  274. package/src/forgejo/branch-protection.ts +101 -0
  275. package/src/forgejo/client.ts +136 -0
  276. package/src/forgejo/index.ts +17 -0
  277. package/src/forgejo/org-actions-secrets.ts +99 -0
  278. package/src/forgejo/org-label.ts +100 -0
  279. package/src/forgejo/org-team.ts +105 -0
  280. package/src/forgejo/repo-webhook-form.ts +47 -0
  281. package/src/forgejo/repo-webhook.ts +118 -0
  282. package/src/forgejo/repository.ts +126 -0
  283. package/src/forgejo/resource.ts +171 -0
  284. package/src/forgejo/team-member.ts +97 -0
  285. package/src/forgejo/values.test.ts +48 -0
  286. package/src/forgejo/values.ts +61 -0
  287. package/src/index.ts +18 -0
  288. package/src/openbao/auth-role-form.ts +112 -0
  289. package/src/openbao/auth-role.ts +101 -0
  290. package/src/openbao/bao-address.test.ts +89 -0
  291. package/src/openbao/bao-address.ts +97 -0
  292. package/src/openbao/bao-http-gate.test.ts +88 -0
  293. package/src/openbao/bao-http-unix.test.ts +70 -0
  294. package/src/openbao/bao-http.test.ts +161 -0
  295. package/src/openbao/bao-http.ts +185 -0
  296. package/src/openbao/bao-status.test.ts +114 -0
  297. package/src/openbao/bao-status.ts +137 -0
  298. package/src/openbao/cloudflare-group-scope.test.ts +103 -0
  299. package/src/openbao/cloudflare-group-scope.ts +83 -0
  300. package/src/openbao/cloudflare-parity-catalog.ts +104 -0
  301. package/src/openbao/cloudflare-parity-snapshot.ts +84 -0
  302. package/src/openbao/cloudflare-parity.ts +152 -0
  303. package/src/openbao/cloudflare-permission-groups-solve.test.ts +171 -0
  304. package/src/openbao/cloudflare-permission-groups-solve.ts +197 -0
  305. package/src/openbao/cloudflare-permission-groups.test.ts +369 -0
  306. package/src/openbao/cloudflare-permission-groups.ts +299 -0
  307. package/src/openbao/cloudflare-policy.ts +180 -0
  308. package/src/openbao/cloudflare-role-form.test.ts +177 -0
  309. package/src/openbao/cloudflare-role-form.ts +183 -0
  310. package/src/openbao/cloudflare-role-wire.test.ts +132 -0
  311. package/src/openbao/cloudflare-role-wire.ts +41 -0
  312. package/src/openbao/cloudflare-role.ts +189 -0
  313. package/src/openbao/cloudflare-roles-config.ts +230 -0
  314. package/src/openbao/cloudflare-roles-expand-bucket.test.ts +134 -0
  315. package/src/openbao/cloudflare-roles-expand.ts +231 -0
  316. package/src/openbao/digest.ts +26 -0
  317. package/src/openbao/fake-bao.ts +84 -0
  318. package/src/openbao/forgejo-bootstrap-parse.test.ts +76 -0
  319. package/src/openbao/forgejo-bootstrap-parse.ts +90 -0
  320. package/src/openbao/forgejo-bootstrap.ts +181 -0
  321. package/src/openbao/index.ts +17 -0
  322. package/src/openbao/mount-form.ts +147 -0
  323. package/src/openbao/mount-wire.test.ts +108 -0
  324. package/src/openbao/mount-wire.ts +79 -0
  325. package/src/openbao/mount.ts +132 -0
  326. package/src/openbao/pki-role-form.ts +248 -0
  327. package/src/openbao/pki-role.ts +202 -0
  328. package/src/openbao/policy-assembly.test.ts +28 -0
  329. package/src/openbao/policy-assembly.ts +13 -0
  330. package/src/openbao/policy-wire.test.ts +90 -0
  331. package/src/openbao/policy-wire.ts +53 -0
  332. package/src/openbao/policy.ts +212 -0
  333. package/src/openbao/proxmox-role-form.ts +174 -0
  334. package/src/openbao/proxmox-role.ts +214 -0
  335. package/src/openbao/ssh-role-form.ts +248 -0
  336. package/src/openbao/ssh-role.ts +240 -0
  337. package/src/proxmox/acl.ts +267 -0
  338. package/src/proxmox/api-token-form.ts +122 -0
  339. package/src/proxmox/api-token.ts +222 -0
  340. package/src/proxmox/backup-job.ts +213 -0
  341. package/src/proxmox/ceph-daemon-form.ts +84 -0
  342. package/src/proxmox/ceph-daemon.ts +243 -0
  343. package/src/proxmox/ceph-flag.ts +249 -0
  344. package/src/proxmox/ceph-fs-wire.ts +246 -0
  345. package/src/proxmox/ceph-fs.ts +249 -0
  346. package/src/proxmox/ceph-osd-tree.ts +193 -0
  347. package/src/proxmox/ceph-osd-write.ts +76 -0
  348. package/src/proxmox/ceph-osd.ts +244 -0
  349. package/src/proxmox/ceph-pool-form.ts +249 -0
  350. package/src/proxmox/ceph-pool-settle.ts +70 -0
  351. package/src/proxmox/ceph-pool.ts +212 -0
  352. package/src/proxmox/client.test.ts +185 -0
  353. package/src/proxmox/client.ts +240 -0
  354. package/src/proxmox/credentials.test.ts +144 -0
  355. package/src/proxmox/credentials.ts +254 -0
  356. package/src/proxmox/firewall-alias-form.ts +112 -0
  357. package/src/proxmox/firewall-alias.ts +208 -0
  358. package/src/proxmox/generated/pbs.ts +461 -0
  359. package/src/proxmox/generated/pve.ts +7344 -0
  360. package/src/proxmox/group.ts +199 -0
  361. package/src/proxmox/ha-resource.ts +169 -0
  362. package/src/proxmox/ha-rule-form.ts +185 -0
  363. package/src/proxmox/ha-rule.ts +240 -0
  364. package/src/proxmox/index.ts +42 -0
  365. package/src/proxmox/lease-cache.test.ts +163 -0
  366. package/src/proxmox/lease-cache.ts +131 -0
  367. package/src/proxmox/lxc.ts +117 -0
  368. package/src/proxmox/members.test.ts +54 -0
  369. package/src/proxmox/members.ts +174 -0
  370. package/src/proxmox/metric-server-form.ts +128 -0
  371. package/src/proxmox/metric-server-otel.ts +99 -0
  372. package/src/proxmox/metric-server.ts +214 -0
  373. package/src/proxmox/network-apply-read.ts +228 -0
  374. package/src/proxmox/network-apply.ts +244 -0
  375. package/src/proxmox/node-network-form.ts +213 -0
  376. package/src/proxmox/node-network.ts +243 -0
  377. package/src/proxmox/notification-target-form.ts +104 -0
  378. package/src/proxmox/notification-target.ts +222 -0
  379. package/src/proxmox/pbs-datastore-form.ts +248 -0
  380. package/src/proxmox/pbs-datastore-guard.ts +105 -0
  381. package/src/proxmox/pbs-datastore.ts +271 -0
  382. package/src/proxmox/pbs-prune-job-form.ts +208 -0
  383. package/src/proxmox/pbs-prune-job.ts +227 -0
  384. package/src/proxmox/pbs-sync-job-form.ts +234 -0
  385. package/src/proxmox/pbs-sync-job.ts +258 -0
  386. package/src/proxmox/pbs-verify-job-form.ts +131 -0
  387. package/src/proxmox/pbs-verify-job.ts +227 -0
  388. package/src/proxmox/pool.test.ts +42 -0
  389. package/src/proxmox/pool.ts +80 -0
  390. package/src/proxmox/qemu.ts +89 -0
  391. package/src/proxmox/replication-job-form.ts +89 -0
  392. package/src/proxmox/replication-job.ts +248 -0
  393. package/src/proxmox/resource.ts +257 -0
  394. package/src/proxmox/role.ts +161 -0
  395. package/src/proxmox/sdn-apply-read.test.ts +152 -0
  396. package/src/proxmox/sdn-apply-read.ts +189 -0
  397. package/src/proxmox/sdn-apply.ts +154 -0
  398. package/src/proxmox/sdn-subnet-form.ts +156 -0
  399. package/src/proxmox/sdn-subnet.ts +238 -0
  400. package/src/proxmox/sdn-vnet.ts +228 -0
  401. package/src/proxmox/sdn-zone.ts +246 -0
  402. package/src/proxmox/storage.ts +245 -0
  403. package/src/proxmox/user.ts +214 -0
  404. package/src/proxmox/values.test.ts +193 -0
  405. package/src/proxmox/values.ts +203 -0
  406. package/src/proxmox/zfs-pool-write.ts +130 -0
  407. package/src/proxmox/zfs-pool.ts +253 -0
  408. package/src/talos/credentials.ts +136 -0
  409. package/src/talos/index.ts +14 -0
  410. package/src/talos/kubeconfig.ts +170 -0
  411. package/src/talos/resource.ts +31 -0
  412. package/src/talos/talos-bootstrap.ts +109 -0
  413. package/src/talos/talos-cluster-health.ts +119 -0
  414. package/src/talos/talos-machine-config.ts +146 -0
  415. package/src/talos/talosctl.ts +94 -0
  416. package/src/talos/values.test.ts +80 -0
  417. package/src/talos/values.ts +70 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * One authenticated call to the Forgejo (Gitea) API at `/api/v1`.
3
+ *
4
+ * ★ PLAIN `fetch`, NO TLS ESCAPE HATCH — your Forgejo host serves a real certificate on :443,
5
+ * and the local daemon on :3000 is loopback. There is no `rejectUnauthorized` switch to leave
6
+ * on by accident elsewhere.
7
+ *
8
+ * ⚠️ GITEA DOES NOT WRAP ANSWERS IN `{"data": ...}` THE WAY PVE DOES. MEASURED 2026-09-13 on
9
+ * the live daemon: `GET /api/v1/version` returns `{"version":"16.0.3"}`; `GET /api/v1/user`
10
+ * returns the user object; `GET /api/v1/orgs/HomeFlare/repos` returns a JSON array. A caller
11
+ * that unwraps a non-existent envelope sees `undefined` and calls a healthy object "absent".
12
+ *
13
+ * ⛔ THE TOKEN IS NEVER A PROP. Read `FORGEJO_TOKEN` from the environment at call time only.
14
+ * Alchemy persists attributes unencrypted and this estate's state store is Postgres dumped
15
+ * nightly — nothing stored may be a credential.
16
+ */
17
+ import * as Effect from 'effect/Effect';
18
+ import * as HttpClient from 'effect/unstable/http/HttpClient';
19
+ /**
20
+ * The Forgejo instance, from `FORGEJO_URL`. Trailing slash stripped.
21
+ *
22
+ * ⛔ NO DEFAULT HOSTNAME. This used to fall back to the author's own instance, which is
23
+ * fine inside one estate and wrong in a published package: a consumer who forgets the
24
+ * variable would silently point at someone else's server rather than being told.
25
+ * ⚠️ Read at CALL time, never at module scope — a value captured at import is pinned to
26
+ * whatever the first isolate saw.
27
+ */
28
+ export declare const apiBase: () => string;
29
+ export declare class ForgejoError extends Error {
30
+ readonly status: number;
31
+ readonly method: string;
32
+ readonly path: string;
33
+ constructor(status: number, method: string, path: string, detail: string);
34
+ }
35
+ /** One JSON call. Returns the parsed body, or `undefined` when the response is empty (DELETE). */
36
+ export declare const forgejo: <T>(method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', path: string, body?: Record<string, unknown>) => Effect.Effect<T, ForgejoError, HttpClient.HttpClient>;
37
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/forgejo/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAK9D;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,QAAO,MAQ1B,CAAC;AAkBF,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAHvB,YACW,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EAIf;CACF;AAQD,kGAAkG;AAClG,eAAO,MAAM,OAAO,GAAI,CAAC,UACf,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,QAC7C,MAAM,SACL,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,0DAwD5B,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Forgejo providers for Alchemy.
3
+ *
4
+ * ⛔ THIS BARREL IS THE PUBLIC API, AND IT IS DELIBERATELY SMALLER THAN THE DIRECTORY.
5
+ * These are the symbols a real stack consumes; the rest of the files are internals a
6
+ * provider needs but a consumer should not depend on. An `export *` here would publish
7
+ * every helper as API and make the next refactor a breaking change.
8
+ * ★ Anything unlisted is still reachable by path if you genuinely need it — that is a
9
+ * deliberate, visible act rather than an accident of barrelling.
10
+ */
11
+ export { ForgejoBranchProtectionProvider } from './branch-protection.ts';
12
+ export { ForgejoOrgSecretProvider } from './org-actions-secrets.ts';
13
+ export { ForgejoOrgLabel, ForgejoOrgLabelProvider, type OrgLabelProps } from './org-label.ts';
14
+ export { ForgejoOrgTeamProvider } from './org-team.ts';
15
+ export { ForgejoRepoWebhookProvider } from './repo-webhook.ts';
16
+ export { ForgejoRepository, ForgejoRepositoryProvider } from './repository.ts';
17
+ export { ForgejoTeamMember, ForgejoTeamMemberProvider } from './team-member.ts';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forgejo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,479 @@
1
+ // src/forgejo/branch-protection.ts
2
+ import { Resource } from "alchemy";
3
+ import * as Provider from "alchemy/Provider";
4
+ import * as Effect3 from "effect/Effect";
5
+
6
+ // src/forgejo/branch-protection-form.ts
7
+ var branchProtectionForm = (props) => ({
8
+ ...props.applyToAdmins === undefined ? {} : { apply_to_admins: props.applyToAdmins },
9
+ ...props.dismissStaleApprovals === undefined ? {} : { dismiss_stale_approvals: props.dismissStaleApprovals },
10
+ ...props.enablePush === undefined ? {} : { enable_push: props.enablePush },
11
+ ...props.enableStatusCheck === undefined ? {} : { enable_status_check: props.enableStatusCheck },
12
+ ...props.ignoreStaleApprovals === undefined ? {} : { ignore_stale_approvals: props.ignoreStaleApprovals },
13
+ ...props.requireSignedCommits === undefined ? {} : { require_signed_commits: props.requireSignedCommits },
14
+ ...props.requiredApprovals === undefined ? {} : { required_approvals: props.requiredApprovals },
15
+ ...props.statusCheckContexts === undefined ? {} : { status_check_contexts: props.statusCheckContexts },
16
+ rule_name: props.branchName
17
+ });
18
+
19
+ // src/forgejo/resource.ts
20
+ import { isResolved } from "alchemy/Diff";
21
+ import * as Effect2 from "effect/Effect";
22
+
23
+ // src/forgejo/client.ts
24
+ import * as Effect from "effect/Effect";
25
+ import * as HttpClient from "effect/unstable/http/HttpClient";
26
+ import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
27
+ var PATH_PREFIX = "/api/v1";
28
+ var apiBase = () => {
29
+ const raw = process.env["FORGEJO_URL"];
30
+ if (raw === undefined || raw.trim() === "") {
31
+ throw new Error("FORGEJO_URL is not set. Point it at your Forgejo instance, e.g. https://git.example.com");
32
+ }
33
+ return raw.trim().replace(/\/$/, "");
34
+ };
35
+ var token = () => Effect.gen(function* () {
36
+ const raw = process.env["FORGEJO_TOKEN"];
37
+ if (raw === undefined || raw.trim() === "") {
38
+ return yield* Effect.fail(new ForgejoError(0, "GET", "", "FORGEJO_TOKEN is unset. Mint a scoped token and export it — never store it in Alchemy props."));
39
+ }
40
+ return raw.trim();
41
+ });
42
+
43
+ class ForgejoError extends Error {
44
+ status;
45
+ method;
46
+ path;
47
+ constructor(status, method, path, detail) {
48
+ super(`Forgejo ${method} ${path} -> ${String(status)}: ${detail}`);
49
+ this.status = status;
50
+ this.method = method;
51
+ this.path = path;
52
+ this.name = "ForgejoError";
53
+ }
54
+ }
55
+ var authorization = (value) => ({ Authorization: `token ${value}` });
56
+ var forgejo = (method, path, body) => Effect.gen(function* () {
57
+ const credential = yield* token();
58
+ const url = `${apiBase()}${PATH_PREFIX}/${path.replace(/^\//, "")}`;
59
+ const client = yield* HttpClient.HttpClient;
60
+ const request = HttpClientRequest.make(method)(url).pipe(HttpClientRequest.setHeaders({ ...authorization(credential), Accept: "application/json" }), body === undefined ? (self) => self : HttpClientRequest.bodyText(JSON.stringify(body), "application/json"));
61
+ const response = yield* client.execute(request).pipe(Effect.mapError((cause) => new ForgejoError(0, method, path, String(cause))));
62
+ if (response.status < 200 || response.status >= 300) {
63
+ const detail = yield* response.text.pipe(Effect.orElseSucceed(() => ""));
64
+ return yield* Effect.fail(new ForgejoError(response.status, method, path, detail.slice(0, 300)));
65
+ }
66
+ const text = yield* response.text.pipe(Effect.mapError((cause) => new ForgejoError(0, method, path, String(cause))));
67
+ return text === "" ? undefined : JSON.parse(text);
68
+ });
69
+
70
+ // src/forgejo/resource.ts
71
+ var absentOn404 = (io) => io.pipe(Effect2.catchIf((cause) => cause instanceof ForgejoError && cause.status === 404, () => Effect2.succeed(undefined)));
72
+ var forgejoOperations = (spec) => {
73
+ const fetchLive = (props) => absentOn404(spec.locate !== undefined ? spec.locate(props) : forgejo("GET", spec.path(props)));
74
+ const objectPath = (props, live) => spec.wirePath === undefined ? spec.path(props) : spec.wirePath(props, live);
75
+ const read = (props) => fetchLive(props).pipe(Effect2.map((data) => data === undefined ? undefined : spec.attributes(data, props)));
76
+ return {
77
+ read,
78
+ diff: (news, output) => Effect2.gen(function* () {
79
+ if (output === undefined || !isResolved(news))
80
+ return;
81
+ const live = yield* read(news);
82
+ if (live === undefined)
83
+ return { action: "update" };
84
+ if (spec.matches(live, news))
85
+ return { action: "noop" };
86
+ return spec.updateForm === undefined ? { action: "replace" } : { action: "update" };
87
+ }),
88
+ reconcile: (news) => Effect2.gen(function* () {
89
+ const before = yield* fetchLive(news);
90
+ if (spec.upsert !== undefined) {
91
+ yield* spec.upsert(news, before);
92
+ } else if (before === undefined) {
93
+ yield* forgejo("POST", spec.collection(news), spec.createForm(news));
94
+ } else if (spec.updateForm !== undefined) {
95
+ const mapped = spec.attributes(before, news);
96
+ if (mapped === undefined || spec.matches(mapped, news)) {} else {
97
+ const form = spec.updateForm(news);
98
+ if (Object.keys(form).length > 0) {
99
+ yield* forgejo("PATCH", objectPath(news, before), form);
100
+ }
101
+ }
102
+ }
103
+ const after = yield* read(news);
104
+ if (after === undefined) {
105
+ return yield* Effect2.die(new Error(`${spec.path(news)}: the write returned no error but the object is still absent. ` + "Gitea returns the object directly — read back rather than trusting the status code."));
106
+ }
107
+ return after;
108
+ }),
109
+ destroy: (olds) => Effect2.gen(function* () {
110
+ const live = yield* fetchLive(olds);
111
+ if (live === undefined)
112
+ return;
113
+ yield* forgejo("DELETE", objectPath(olds, live));
114
+ })
115
+ };
116
+ };
117
+ var forgejoHandlers = (spec) => {
118
+ const ops = forgejoOperations(spec);
119
+ return {
120
+ list: () => Effect2.succeed([]),
121
+ read: ({ olds }) => ops.read(olds),
122
+ diff: ({ news, output }) => ops.diff(news, output),
123
+ reconcile: ({ news }) => ops.reconcile(news),
124
+ delete: ({ olds }) => ops.destroy(olds)
125
+ };
126
+ };
127
+
128
+ // src/forgejo/values.ts
129
+ var text = (value, fallback = "") => typeof value === "string" ? value : fallback;
130
+ var color = (value) => text(value).replace(/^#/, "").toLowerCase();
131
+ var bool = (value, fallback = false) => value === undefined || value === null ? fallback : value === true || value === 1 || value === "1";
132
+ var int = (value, fallback = 0) => {
133
+ if (typeof value === "number" && Number.isFinite(value))
134
+ return Math.trunc(value);
135
+ if (typeof value === "string" && value.trim() !== "") {
136
+ const parsed = Number.parseInt(value, 10);
137
+ if (Number.isFinite(parsed))
138
+ return parsed;
139
+ }
140
+ return fallback;
141
+ };
142
+ var stringArray = (value) => Array.isArray(value) ? value.filter((entry) => typeof entry === "string").toSorted() : [];
143
+ var stringRecord = (value) => {
144
+ if (typeof value !== "object" || value === null || Array.isArray(value))
145
+ return {};
146
+ const out = {};
147
+ for (const [key, entry] of Object.entries(value)) {
148
+ if (typeof entry === "string")
149
+ out[key] = entry;
150
+ }
151
+ return out;
152
+ };
153
+ var recordEqual = (left, right) => {
154
+ const leftKeys = Object.keys(left).toSorted();
155
+ const rightKeys = Object.keys(right).toSorted();
156
+ if (leftKeys.length !== rightKeys.length)
157
+ return false;
158
+ return leftKeys.every((key, index) => rightKeys[index] === key && left[key] === right[key]);
159
+ };
160
+ var hookConfigPublic = (value) => {
161
+ const config = stringRecord(value);
162
+ const { secret: _secret, ...rest } = config;
163
+ return rest;
164
+ };
165
+ var orgSecretEnvKey = (org, name) => `FORGEJO_ORG_SECRET_${org}_${name}`.replace(/[^A-Za-z0-9_]/g, "_").toUpperCase();
166
+ var hookSecretEnvKey = (owner, repo, name) => `FORGEJO_HOOK_SECRET_${owner}_${repo}_${name}`.replace(/[^A-Za-z0-9_]/g, "_").toUpperCase();
167
+
168
+ // src/forgejo/branch-protection.ts
169
+ var ForgejoBranchProtection = Resource("Forgejo.BranchProtection", { defaultRemovalPolicy: "retain" });
170
+ var handlers = forgejoHandlers({
171
+ attributes: (live, props) => {
172
+ const ruleName = text(live["rule_name"], text(live["branch_name"]));
173
+ if (ruleName === "")
174
+ return;
175
+ return {
176
+ applyToAdmins: bool(live["apply_to_admins"]),
177
+ branchName: props.branchName,
178
+ dismissStaleApprovals: bool(live["dismiss_stale_approvals"]),
179
+ enablePush: bool(live["enable_push"], true),
180
+ enableStatusCheck: bool(live["enable_status_check"]),
181
+ ignoreStaleApprovals: bool(live["ignore_stale_approvals"]),
182
+ owner: props.owner,
183
+ repo: props.repo,
184
+ requireSignedCommits: bool(live["require_signed_commits"]),
185
+ requiredApprovals: int(live["required_approvals"]),
186
+ statusCheckContexts: stringArray(live["status_check_contexts"])
187
+ };
188
+ },
189
+ collection: (props) => `repos/${props.owner}/${props.repo}/branch_protections`,
190
+ createForm: branchProtectionForm,
191
+ matches: (attributes, props) => attributes.requiredApprovals === (props.requiredApprovals ?? 0) && attributes.enablePush === (props.enablePush ?? true) && attributes.enableStatusCheck === (props.enableStatusCheck ?? false) && attributes.requireSignedCommits === (props.requireSignedCommits ?? false) && attributes.dismissStaleApprovals === (props.dismissStaleApprovals ?? false) && attributes.ignoreStaleApprovals === (props.ignoreStaleApprovals ?? false) && attributes.applyToAdmins === (props.applyToAdmins ?? false) && (props.statusCheckContexts === undefined || stringArray(props.statusCheckContexts).join("\x00") === attributes.statusCheckContexts.join("\x00")),
192
+ path: (props) => `repos/${props.owner}/${props.repo}/branch_protections/${props.branchName}`,
193
+ updateForm: branchProtectionForm
194
+ });
195
+ var ForgejoBranchProtectionProvider = () => Provider.effect(ForgejoBranchProtection, Effect3.succeed(ForgejoBranchProtection.Provider.of(handlers)));
196
+ // src/forgejo/org-actions-secrets.ts
197
+ import { Resource as Resource2 } from "alchemy";
198
+ import * as Provider2 from "alchemy/Provider";
199
+ import * as Effect4 from "effect/Effect";
200
+ var ForgejoOrgSecret = Resource2("Forgejo.OrgSecret");
201
+ var secretData = (org, name) => Effect4.gen(function* () {
202
+ const key = orgSecretEnvKey(org, name);
203
+ const raw = process.env[key];
204
+ if (raw === undefined || raw.trim() === "") {
205
+ return yield* Effect4.fail(new ForgejoError(0, "PUT", `orgs/${org}/actions/secrets/${name}`, `${key} is unset. Export the secret value there — never as an Alchemy prop.`));
206
+ }
207
+ return raw.trim();
208
+ });
209
+ var handlers2 = forgejoHandlers({
210
+ attributes: (live, props) => ({
211
+ createdAt: text(live["created_at"]),
212
+ name: props.name,
213
+ org: props.org
214
+ }),
215
+ collection: (props) => `orgs/${props.org}/actions/secrets/${props.name}`,
216
+ createForm: () => ({}),
217
+ locate: (props) => forgejo("GET", `orgs/${props.org}/actions/secrets?limit=200`).pipe(Effect4.map((rows) => Array.isArray(rows) ? rows.find((row) => row["name"] === props.name) : undefined)),
218
+ matches: () => true,
219
+ path: (props) => `orgs/${props.org}/actions/secrets/${props.name}`,
220
+ upsert: (props, before) => Effect4.gen(function* () {
221
+ if (before !== undefined)
222
+ return;
223
+ const data = yield* secretData(props.org, props.name);
224
+ yield* forgejo("PUT", `orgs/${props.org}/actions/secrets/${props.name}`, { data });
225
+ })
226
+ });
227
+ var ForgejoOrgSecretProvider = () => Provider2.effect(ForgejoOrgSecret, Effect4.succeed(ForgejoOrgSecret.Provider.of(handlers2)));
228
+ // src/forgejo/org-label.ts
229
+ import { Resource as Resource3 } from "alchemy";
230
+ import * as Provider3 from "alchemy/Provider";
231
+ import * as Effect5 from "effect/Effect";
232
+ var ForgejoOrgLabel = Resource3("Forgejo.OrgLabel", {
233
+ defaultRemovalPolicy: "retain"
234
+ });
235
+ var handlers3 = forgejoHandlers({
236
+ attributes: (live, props) => {
237
+ const id = live["id"];
238
+ if (typeof id !== "number")
239
+ return;
240
+ return {
241
+ color: color(live["color"]),
242
+ description: text(live["description"]),
243
+ exclusive: bool(live["exclusive"]),
244
+ labelId: id,
245
+ name: props.name,
246
+ org: props.org
247
+ };
248
+ },
249
+ collection: (props) => `orgs/${props.org}/labels`,
250
+ createForm: (props) => ({
251
+ color: color(props.color),
252
+ description: props.description ?? "",
253
+ exclusive: props.exclusive ?? false,
254
+ name: props.name
255
+ }),
256
+ locate: (props) => forgejo("GET", `orgs/${props.org}/labels?limit=200`).pipe(Effect5.map((rows) => Array.isArray(rows) ? rows.find((row) => row["name"] === props.name) : undefined)),
257
+ matches: (attributes, props) => attributes.color === color(props.color) && attributes.description === (props.description ?? "") && attributes.exclusive === (props.exclusive ?? false),
258
+ path: (props) => `orgs/${props.org}/labels/${props.name}`,
259
+ updateForm: (props) => ({
260
+ color: color(props.color),
261
+ description: props.description ?? "",
262
+ exclusive: props.exclusive ?? false
263
+ }),
264
+ wirePath: (props, live) => `orgs/${props.org}/labels/${String(live["id"])}`
265
+ });
266
+ var ForgejoOrgLabelProvider = () => Provider3.effect(ForgejoOrgLabel, Effect5.succeed(ForgejoOrgLabel.Provider.of(handlers3)));
267
+ // src/forgejo/org-team.ts
268
+ import { Resource as Resource4 } from "alchemy";
269
+ import * as Provider4 from "alchemy/Provider";
270
+ import * as Effect6 from "effect/Effect";
271
+ var ForgejoOrgTeam = Resource4("Forgejo.OrgTeam");
272
+ var teamForm = (props) => ({
273
+ can_create_org_repo: props.canCreateOrgRepo ?? false,
274
+ description: props.description ?? "",
275
+ includes_all_repositories: props.includesAllRepositories ?? false,
276
+ name: props.name,
277
+ ...props.permission === undefined ? {} : { permission: props.permission },
278
+ ...props.units === undefined ? {} : { units: props.units },
279
+ ...props.unitsMap === undefined ? {} : { units_map: props.unitsMap }
280
+ });
281
+ var handlers4 = forgejoHandlers({
282
+ attributes: (live, props) => {
283
+ const id = live["id"];
284
+ if (typeof id !== "number")
285
+ return;
286
+ const permission = text(live["permission"], "read");
287
+ if (permission !== "read" && permission !== "write" && permission !== "admin")
288
+ return;
289
+ return {
290
+ canCreateOrgRepo: bool(live["can_create_org_repo"]),
291
+ description: text(live["description"]),
292
+ includesAllRepositories: bool(live["includes_all_repositories"]),
293
+ name: props.name,
294
+ org: props.org,
295
+ permission,
296
+ teamId: id,
297
+ units: stringArray(live["units"]),
298
+ unitsMap: stringRecord(live["units_map"])
299
+ };
300
+ },
301
+ collection: (props) => `orgs/${props.org}/teams`,
302
+ createForm: teamForm,
303
+ locate: (props) => forgejo("GET", `orgs/${props.org}/teams?limit=200`).pipe(Effect6.map((rows) => Array.isArray(rows) ? rows.find((row) => row["name"] === props.name) : undefined)),
304
+ matches: (attributes, props) => attributes.description === (props.description ?? "") && attributes.permission === (props.permission ?? "read") && attributes.includesAllRepositories === (props.includesAllRepositories ?? false) && attributes.canCreateOrgRepo === (props.canCreateOrgRepo ?? false) && (props.units === undefined || stringArray(props.units).join("\x00") === attributes.units.join("\x00")) && (props.unitsMap === undefined || recordEqual(attributes.unitsMap, props.unitsMap)),
305
+ path: (props) => `orgs/${props.org}/teams/${props.name}`,
306
+ updateForm: teamForm,
307
+ wirePath: (_props, live) => `teams/${String(live["id"])}`
308
+ });
309
+ var ForgejoOrgTeamProvider = () => Provider4.effect(ForgejoOrgTeam, Effect6.succeed(ForgejoOrgTeam.Provider.of(handlers4)));
310
+ // src/forgejo/repo-webhook.ts
311
+ import { Resource as Resource5 } from "alchemy";
312
+ import * as Provider5 from "alchemy/Provider";
313
+ import * as Effect7 from "effect/Effect";
314
+
315
+ // src/forgejo/repo-webhook-form.ts
316
+ var hookUrl = (live) => text(live["url"]) || text(stringRecord(live["config"])["url"]);
317
+ var hookConfigForm = (props, includeSecret) => {
318
+ const config = {
319
+ content_type: props.contentType ?? "json",
320
+ url: props.url
321
+ };
322
+ if (includeSecret) {
323
+ const key = hookSecretEnvKey(props.owner, props.repo, props.name);
324
+ const secret = process.env[key]?.trim();
325
+ if (secret !== undefined && secret !== "")
326
+ config["secret"] = secret;
327
+ }
328
+ return config;
329
+ };
330
+ var createHookForm = (props) => ({
331
+ active: props.active ?? true,
332
+ ...props.authorizationHeader === undefined ? {} : { authorization_header: props.authorizationHeader },
333
+ ...props.branchFilter === undefined ? {} : { branch_filter: props.branchFilter },
334
+ config: hookConfigForm(props, true),
335
+ events: props.events,
336
+ name: props.name,
337
+ type: props.type
338
+ });
339
+ var updateHookForm = (props) => ({
340
+ active: props.active ?? true,
341
+ ...props.authorizationHeader === undefined ? {} : { authorization_header: props.authorizationHeader },
342
+ ...props.branchFilter === undefined ? {} : { branch_filter: props.branchFilter },
343
+ config: hookConfigForm(props, false),
344
+ events: props.events
345
+ });
346
+
347
+ // src/forgejo/repo-webhook.ts
348
+ var ForgejoRepoWebhook = Resource5("Forgejo.RepoWebhook");
349
+ var handlers5 = forgejoHandlers({
350
+ attributes: (live, props) => {
351
+ const id = live["id"];
352
+ if (typeof id !== "number")
353
+ return;
354
+ const config = hookConfigPublic(live["config"]);
355
+ const type = text(live["type"]);
356
+ return {
357
+ active: bool(live["active"], true),
358
+ authorizationHeader: text(live["authorization_header"]),
359
+ branchFilter: text(live["branch_filter"]),
360
+ contentType: text(config["content_type"], text(live["content_type"], "json")),
361
+ events: stringArray(live["events"]),
362
+ hookId: id,
363
+ name: props.name,
364
+ owner: props.owner,
365
+ repo: props.repo,
366
+ type,
367
+ url: hookUrl(live)
368
+ };
369
+ },
370
+ collection: (props) => `repos/${props.owner}/${props.repo}/hooks`,
371
+ createForm: createHookForm,
372
+ locate: (props) => forgejo("GET", `repos/${props.owner}/${props.repo}/hooks?limit=200`).pipe(Effect7.map((rows) => Array.isArray(rows) ? rows.find((row) => text(row["name"]) === props.name || hookUrl(row) === props.url) : undefined)),
373
+ matches: (attributes, props) => attributes.type === props.type && attributes.url === props.url && attributes.active === (props.active ?? true) && attributes.contentType === (props.contentType ?? "json") && attributes.branchFilter === (props.branchFilter ?? "") && attributes.authorizationHeader === (props.authorizationHeader ?? "") && stringArray(props.events).join("\x00") === attributes.events.join("\x00"),
374
+ path: (props) => `repos/${props.owner}/${props.repo}/hooks/${props.name}`,
375
+ updateForm: updateHookForm,
376
+ wirePath: (props, live) => `repos/${props.owner}/${props.repo}/hooks/${String(live["id"])}`
377
+ });
378
+ var ForgejoRepoWebhookProvider = () => Provider5.effect(ForgejoRepoWebhook, Effect7.succeed(ForgejoRepoWebhook.Provider.of(handlers5)));
379
+ // src/forgejo/repository.ts
380
+ import { Resource as Resource6 } from "alchemy";
381
+ import * as Provider6 from "alchemy/Provider";
382
+ import * as Effect8 from "effect/Effect";
383
+ var ForgejoRepository = Resource6("Forgejo.Repository", {
384
+ defaultRemovalPolicy: "retain"
385
+ });
386
+ var handlers6 = forgejoHandlers({
387
+ attributes: (live, props) => {
388
+ const id = live["id"];
389
+ if (typeof id !== "number")
390
+ return;
391
+ return {
392
+ defaultBranch: text(live["default_branch"], "main"),
393
+ description: text(live["description"]),
394
+ empty: bool(live["empty"]),
395
+ hasIssues: bool(live["has_issues"], true),
396
+ hasProjects: bool(live["has_projects"], true),
397
+ hasWiki: bool(live["has_wiki"], true),
398
+ name: props.name,
399
+ org: props.org,
400
+ private: bool(live["private"], true),
401
+ repoId: id
402
+ };
403
+ },
404
+ collection: (props) => `orgs/${props.org}/repos`,
405
+ createForm: (props) => ({
406
+ auto_init: props.autoInit ?? false,
407
+ description: props.description ?? "",
408
+ has_issues: props.hasIssues ?? true,
409
+ has_projects: props.hasProjects ?? true,
410
+ has_wiki: props.hasWiki ?? true,
411
+ name: props.name,
412
+ private: props.private ?? true
413
+ }),
414
+ matches: (attributes, props) => (props.description === undefined || attributes.description === props.description) && (props.private === undefined || attributes.private === props.private) && (props.hasIssues === undefined || attributes.hasIssues === props.hasIssues) && (props.hasWiki === undefined || attributes.hasWiki === props.hasWiki) && (props.hasProjects === undefined || attributes.hasProjects === props.hasProjects) && (props.defaultBranch === undefined || attributes.defaultBranch === props.defaultBranch),
415
+ path: (props) => `repos/${props.org}/${props.name}`,
416
+ updateForm: (props) => ({
417
+ ...props.defaultBranch === undefined ? {} : { default_branch: props.defaultBranch },
418
+ ...props.description === undefined ? {} : { description: props.description },
419
+ ...props.hasIssues === undefined ? {} : { has_issues: props.hasIssues },
420
+ ...props.hasProjects === undefined ? {} : { has_projects: props.hasProjects },
421
+ ...props.hasWiki === undefined ? {} : { has_wiki: props.hasWiki },
422
+ ...props.private === undefined ? {} : { private: props.private }
423
+ })
424
+ });
425
+ var ForgejoRepositoryProvider = () => Provider6.effect(ForgejoRepository, Effect8.succeed(ForgejoRepository.Provider.of(handlers6)));
426
+ // src/forgejo/team-member.ts
427
+ import { Resource as Resource7 } from "alchemy";
428
+ import * as Provider7 from "alchemy/Provider";
429
+ import * as Effect9 from "effect/Effect";
430
+ var ForgejoTeamMember = Resource7("Forgejo.TeamMember");
431
+ var TEAM_ID = "__team_id";
432
+ var teamIdOf = (props) => Effect9.gen(function* () {
433
+ const path = `orgs/${props.org}/teams?limit=200`;
434
+ const rows = yield* forgejo("GET", path);
435
+ const id = (Array.isArray(rows) ? rows : []).find((row) => row["name"] === props.team)?.["id"];
436
+ if (typeof id !== "number") {
437
+ return yield* Effect9.fail(new ForgejoError(0, "GET", path, `no team named ${props.team} in org ${props.org}`));
438
+ }
439
+ return id;
440
+ });
441
+ var memberPath = (id, props) => `teams/${String(id)}/members/${props.username}`;
442
+ var handlers7 = forgejoHandlers({
443
+ attributes: (live, props) => {
444
+ const id = live[TEAM_ID];
445
+ const login = live["login"];
446
+ if (typeof id !== "number" || typeof login !== "string")
447
+ return;
448
+ if (login.toLowerCase() !== props.username.toLowerCase())
449
+ return;
450
+ return { org: props.org, team: props.team, teamId: id, username: props.username };
451
+ },
452
+ collection: (props) => `orgs/${props.org}/teams`,
453
+ createForm: () => ({}),
454
+ locate: (props) => Effect9.gen(function* () {
455
+ const id = yield* teamIdOf(props);
456
+ const user = yield* forgejo("GET", memberPath(id, props));
457
+ return user === undefined ? undefined : { ...user, [TEAM_ID]: id };
458
+ }),
459
+ matches: () => true,
460
+ path: (props) => `orgs/${props.org}/teams/${props.team}/members/${props.username}`,
461
+ upsert: (props, before) => before !== undefined ? Effect9.void : Effect9.flatMap(teamIdOf(props), (id) => Effect9.asVoid(forgejo("PUT", memberPath(id, props)))),
462
+ wirePath: (props, live) => memberPath(Number(live[TEAM_ID]), props)
463
+ });
464
+ var ForgejoTeamMemberProvider = () => Provider7.effect(ForgejoTeamMember, Effect9.succeed(ForgejoTeamMember.Provider.of(handlers7)));
465
+ export {
466
+ ForgejoBranchProtectionProvider,
467
+ ForgejoOrgLabel,
468
+ ForgejoOrgLabelProvider,
469
+ ForgejoOrgSecretProvider,
470
+ ForgejoOrgTeamProvider,
471
+ ForgejoRepoWebhookProvider,
472
+ ForgejoRepository,
473
+ ForgejoRepositoryProvider,
474
+ ForgejoTeamMember,
475
+ ForgejoTeamMemberProvider
476
+ };
477
+
478
+ //# debugId=09F62B41760BE1CD64756E2164756E21
479
+ //# sourceMappingURL=index.js.map