alchemy 2.0.0-beta.47 → 2.0.0-beta.48

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 (214) hide show
  1. package/bin/exec.js.map +1 -1
  2. package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
  3. package/lib/AWS/Lambda/BucketEventSource.d.ts.map +1 -1
  4. package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
  5. package/lib/AWS/Lambda/EventBridgeEventSource.d.ts.map +1 -1
  6. package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
  7. package/lib/AWS/Lambda/QueueEventSource.d.ts.map +1 -1
  8. package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
  9. package/lib/AWS/Lambda/StreamEventSource.d.ts.map +1 -1
  10. package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
  11. package/lib/AWS/Lambda/TableEventSource.d.ts.map +1 -1
  12. package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
  13. package/lib/AWS/Lambda/TopicEventSource.d.ts.map +1 -1
  14. package/lib/Cli/commands/cloudflare.d.ts +4 -1
  15. package/lib/Cli/commands/cloudflare.d.ts.map +1 -1
  16. package/lib/Cli/commands/cloudflare.js +274 -1
  17. package/lib/Cli/commands/cloudflare.js.map +1 -1
  18. package/lib/Cloudflare/AiGateway/AiGateway.d.ts.map +1 -1
  19. package/lib/Cloudflare/AiGateway/AiGateway.js +2 -1
  20. package/lib/Cloudflare/AiGateway/AiGateway.js.map +1 -1
  21. package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts +40 -2
  22. package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -1
  23. package/lib/Cloudflare/ApiToken/AccountApiToken.js +49 -6
  24. package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -1
  25. package/lib/Cloudflare/ApiToken/Common.d.ts +26 -3
  26. package/lib/Cloudflare/ApiToken/Common.d.ts.map +1 -1
  27. package/lib/Cloudflare/ApiToken/Common.js +8 -0
  28. package/lib/Cloudflare/ApiToken/Common.js.map +1 -1
  29. package/lib/Cloudflare/ApiToken/UserApiToken.d.ts +38 -2
  30. package/lib/Cloudflare/ApiToken/UserApiToken.d.ts.map +1 -1
  31. package/lib/Cloudflare/ApiToken/UserApiToken.js +47 -6
  32. package/lib/Cloudflare/ApiToken/UserApiToken.js.map +1 -1
  33. package/lib/Cloudflare/Browser/Browser.d.ts +121 -0
  34. package/lib/Cloudflare/Browser/Browser.d.ts.map +1 -0
  35. package/lib/Cloudflare/{BrowserRendering/BrowserRendering.js → Browser/Browser.js} +19 -26
  36. package/lib/Cloudflare/Browser/Browser.js.map +1 -0
  37. package/lib/Cloudflare/Browser/BrowserBinding.d.ts +55 -0
  38. package/lib/Cloudflare/Browser/BrowserBinding.d.ts.map +1 -0
  39. package/lib/Cloudflare/{BrowserRendering/BrowserRenderingBinding.js → Browser/BrowserBinding.js} +11 -11
  40. package/lib/Cloudflare/Browser/BrowserBinding.js.map +1 -0
  41. package/lib/Cloudflare/Browser/index.d.ts +3 -0
  42. package/lib/Cloudflare/Browser/index.d.ts.map +1 -0
  43. package/lib/Cloudflare/Browser/index.js +3 -0
  44. package/lib/Cloudflare/Browser/index.js.map +1 -0
  45. package/lib/Cloudflare/Container/ContainerBinding.d.ts +2 -1
  46. package/lib/Cloudflare/Container/ContainerBinding.d.ts.map +1 -1
  47. package/lib/Cloudflare/D1/D1Database.d.ts.map +1 -1
  48. package/lib/Cloudflare/D1/D1Database.js +2 -1
  49. package/lib/Cloudflare/D1/D1Database.js.map +1 -1
  50. package/lib/Cloudflare/Email/EmailRouting.d.ts +1 -1
  51. package/lib/Cloudflare/Email/EmailRouting.d.ts.map +1 -1
  52. package/lib/Cloudflare/Email/EmailRouting.js +1 -1
  53. package/lib/Cloudflare/Email/EmailRouting.js.map +1 -1
  54. package/lib/Cloudflare/Email/EmailRule.d.ts +1 -1
  55. package/lib/Cloudflare/Email/EmailRule.d.ts.map +1 -1
  56. package/lib/Cloudflare/Email/EmailRule.js +1 -1
  57. package/lib/Cloudflare/Email/EmailRule.js.map +1 -1
  58. package/lib/Cloudflare/Images/Images.d.ts +32 -23
  59. package/lib/Cloudflare/Images/Images.d.ts.map +1 -1
  60. package/lib/Cloudflare/Images/Images.js +10 -13
  61. package/lib/Cloudflare/Images/Images.js.map +1 -1
  62. package/lib/Cloudflare/Providers.d.ts.map +1 -1
  63. package/lib/Cloudflare/Providers.js +10 -3
  64. package/lib/Cloudflare/Providers.js.map +1 -1
  65. package/lib/Cloudflare/R2/R2Bucket.d.ts +1 -1
  66. package/lib/Cloudflare/R2/R2Bucket.d.ts.map +1 -1
  67. package/lib/Cloudflare/R2/R2Bucket.js +13 -7
  68. package/lib/Cloudflare/R2/R2Bucket.js.map +1 -1
  69. package/lib/Cloudflare/RateLimit/RateLimit.d.ts +132 -0
  70. package/lib/Cloudflare/RateLimit/RateLimit.d.ts.map +1 -0
  71. package/lib/Cloudflare/RateLimit/RateLimit.js +80 -0
  72. package/lib/Cloudflare/RateLimit/RateLimit.js.map +1 -0
  73. package/lib/Cloudflare/RateLimit/RateLimitBinding.d.ts +30 -0
  74. package/lib/Cloudflare/RateLimit/RateLimitBinding.d.ts.map +1 -0
  75. package/lib/Cloudflare/RateLimit/RateLimitBinding.js +50 -0
  76. package/lib/Cloudflare/RateLimit/RateLimitBinding.js.map +1 -0
  77. package/lib/Cloudflare/RateLimit/index.d.ts +3 -0
  78. package/lib/Cloudflare/RateLimit/index.d.ts.map +1 -0
  79. package/lib/Cloudflare/RateLimit/index.js +3 -0
  80. package/lib/Cloudflare/RateLimit/index.js.map +1 -0
  81. package/lib/Cloudflare/SecretsStore/Secret.d.ts +2 -1
  82. package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -1
  83. package/lib/Cloudflare/SecretsStore/Secret.js +7 -4
  84. package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -1
  85. package/lib/Cloudflare/Tunnel/Tunnel.d.ts +27 -0
  86. package/lib/Cloudflare/Tunnel/Tunnel.d.ts.map +1 -1
  87. package/lib/Cloudflare/Tunnel/Tunnel.js +27 -0
  88. package/lib/Cloudflare/Tunnel/Tunnel.js.map +1 -1
  89. package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts +48 -0
  90. package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts.map +1 -0
  91. package/lib/Cloudflare/Tunnel/TunnelBinding.js +56 -0
  92. package/lib/Cloudflare/Tunnel/TunnelBinding.js.map +1 -0
  93. package/lib/Cloudflare/Tunnel/TunnelRead.d.ts +83 -0
  94. package/lib/Cloudflare/Tunnel/TunnelRead.d.ts.map +1 -0
  95. package/lib/Cloudflare/Tunnel/TunnelRead.js +79 -0
  96. package/lib/Cloudflare/Tunnel/TunnelRead.js.map +1 -0
  97. package/lib/Cloudflare/Tunnel/TunnelReadWrite.d.ts +70 -0
  98. package/lib/Cloudflare/Tunnel/TunnelReadWrite.d.ts.map +1 -0
  99. package/lib/Cloudflare/Tunnel/TunnelReadWrite.js +63 -0
  100. package/lib/Cloudflare/Tunnel/TunnelReadWrite.js.map +1 -0
  101. package/lib/Cloudflare/Tunnel/TunnelWrite.d.ts +92 -0
  102. package/lib/Cloudflare/Tunnel/TunnelWrite.d.ts.map +1 -0
  103. package/lib/Cloudflare/Tunnel/TunnelWrite.js +88 -0
  104. package/lib/Cloudflare/Tunnel/TunnelWrite.js.map +1 -0
  105. package/lib/Cloudflare/Tunnel/index.d.ts +4 -0
  106. package/lib/Cloudflare/Tunnel/index.d.ts.map +1 -1
  107. package/lib/Cloudflare/Tunnel/index.js +4 -0
  108. package/lib/Cloudflare/Tunnel/index.js.map +1 -1
  109. package/lib/Cloudflare/Vectorize/VectorizeIndex.js +1 -0
  110. package/lib/Cloudflare/Vectorize/VectorizeIndex.js.map +1 -1
  111. package/lib/Cloudflare/VpcService/VpcService.d.ts +1 -1
  112. package/lib/Cloudflare/VpcService/VpcService.d.ts.map +1 -1
  113. package/lib/Cloudflare/VpcService/VpcService.js.map +1 -1
  114. package/lib/Cloudflare/Workers/DynamicWorkerLoader.d.ts +119 -11
  115. package/lib/Cloudflare/Workers/DynamicWorkerLoader.d.ts.map +1 -1
  116. package/lib/Cloudflare/Workers/DynamicWorkerLoader.js +88 -9
  117. package/lib/Cloudflare/Workers/DynamicWorkerLoader.js.map +1 -1
  118. package/lib/Cloudflare/Workers/InferEnv.d.ts +1 -1
  119. package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
  120. package/lib/Cloudflare/Workers/LocalWorkerProvider.js +2 -0
  121. package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
  122. package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
  123. package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +18 -2
  124. package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
  125. package/lib/Cloudflare/Workers/WorkerBinding.d.ts +5 -3
  126. package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
  127. package/lib/Cloudflare/Workers/WorkerBinding.js +1 -1
  128. package/lib/Cloudflare/Workers/WorkerBinding.js.map +1 -1
  129. package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts +1 -1
  130. package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts.map +1 -1
  131. package/lib/Cloudflare/Zaraz/ZarazConfig.js +1 -1
  132. package/lib/Cloudflare/Zaraz/ZarazConfig.js.map +1 -1
  133. package/lib/Cloudflare/Zone/Zone.d.ts +170 -0
  134. package/lib/Cloudflare/Zone/Zone.d.ts.map +1 -0
  135. package/lib/Cloudflare/Zone/Zone.js +180 -0
  136. package/lib/Cloudflare/Zone/Zone.js.map +1 -0
  137. package/lib/Cloudflare/Zone/index.d.ts +3 -0
  138. package/lib/Cloudflare/Zone/index.d.ts.map +1 -0
  139. package/lib/Cloudflare/Zone/index.js +3 -0
  140. package/lib/Cloudflare/Zone/index.js.map +1 -0
  141. package/lib/Cloudflare/Zone/lookup.d.ts +33 -0
  142. package/lib/Cloudflare/Zone/lookup.d.ts.map +1 -0
  143. package/lib/Cloudflare/{Zone.js → Zone/lookup.js} +2 -2
  144. package/lib/Cloudflare/Zone/lookup.js.map +1 -0
  145. package/lib/Cloudflare/index.d.ts +3 -1
  146. package/lib/Cloudflare/index.d.ts.map +1 -1
  147. package/lib/Cloudflare/index.js +3 -1
  148. package/lib/Cloudflare/index.js.map +1 -1
  149. package/lib/Platform.d.ts +5 -5
  150. package/lib/Platform.d.ts.map +1 -1
  151. package/lib/Platform.js.map +1 -1
  152. package/lib/RemovalPolicy.js +2 -2
  153. package/lib/RemovalPolicy.js.map +1 -1
  154. package/lib/Resource.d.ts +14 -1
  155. package/lib/Resource.d.ts.map +1 -1
  156. package/lib/Resource.js +3 -2
  157. package/lib/Resource.js.map +1 -1
  158. package/lib/tsconfig.test.tsbuildinfo +1 -1
  159. package/package.json +7 -7
  160. package/src/Cli/commands/cloudflare.ts +394 -1
  161. package/src/Cloudflare/AiGateway/AiGateway.ts +2 -1
  162. package/src/Cloudflare/ApiToken/AccountApiToken.ts +60 -7
  163. package/src/Cloudflare/ApiToken/Common.ts +32 -3
  164. package/src/Cloudflare/ApiToken/UserApiToken.ts +58 -7
  165. package/src/Cloudflare/Browser/Browser.ts +140 -0
  166. package/src/Cloudflare/Browser/BrowserBinding.ts +128 -0
  167. package/src/Cloudflare/Browser/index.ts +11 -0
  168. package/src/Cloudflare/D1/D1Database.ts +6 -2
  169. package/src/Cloudflare/Email/EmailRouting.ts +1 -1
  170. package/src/Cloudflare/Email/EmailRule.ts +6 -6
  171. package/src/Cloudflare/Images/Images.ts +40 -27
  172. package/src/Cloudflare/Providers.ts +15 -3
  173. package/src/Cloudflare/R2/R2Bucket.ts +17 -9
  174. package/src/Cloudflare/RateLimit/RateLimit.ts +160 -0
  175. package/src/Cloudflare/RateLimit/RateLimitBinding.ts +90 -0
  176. package/src/Cloudflare/RateLimit/index.ts +2 -0
  177. package/src/Cloudflare/SecretsStore/Secret.ts +12 -6
  178. package/src/Cloudflare/Tunnel/Tunnel.ts +27 -0
  179. package/src/Cloudflare/Tunnel/TunnelBinding.ts +114 -0
  180. package/src/Cloudflare/Tunnel/TunnelRead.ts +168 -0
  181. package/src/Cloudflare/Tunnel/TunnelReadWrite.ts +88 -0
  182. package/src/Cloudflare/Tunnel/TunnelWrite.ts +194 -0
  183. package/src/Cloudflare/Tunnel/index.ts +4 -0
  184. package/src/Cloudflare/Vectorize/VectorizeIndex.ts +2 -1
  185. package/src/Cloudflare/VpcService/VpcService.ts +4 -2
  186. package/src/Cloudflare/Workers/DynamicWorkerLoader.ts +139 -13
  187. package/src/Cloudflare/Workers/InferEnv.ts +19 -15
  188. package/src/Cloudflare/Workers/LocalWorkerProvider.ts +13 -2
  189. package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +16 -2
  190. package/src/Cloudflare/Workers/WorkerBinding.ts +6 -2
  191. package/src/Cloudflare/Zaraz/ZarazConfig.ts +1 -1
  192. package/src/Cloudflare/Zone/Zone.ts +349 -0
  193. package/src/Cloudflare/Zone/index.ts +2 -0
  194. package/src/Cloudflare/{Zone.ts → Zone/lookup.ts} +16 -3
  195. package/src/Cloudflare/index.ts +3 -1
  196. package/src/Platform.ts +8 -12
  197. package/src/RemovalPolicy.ts +2 -2
  198. package/src/Resource.ts +18 -1
  199. package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts +0 -116
  200. package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts.map +0 -1
  201. package/lib/Cloudflare/BrowserRendering/BrowserRendering.js.map +0 -1
  202. package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts +0 -55
  203. package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts.map +0 -1
  204. package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.js.map +0 -1
  205. package/lib/Cloudflare/BrowserRendering/index.d.ts +0 -3
  206. package/lib/Cloudflare/BrowserRendering/index.d.ts.map +0 -1
  207. package/lib/Cloudflare/BrowserRendering/index.js +0 -3
  208. package/lib/Cloudflare/BrowserRendering/index.js.map +0 -1
  209. package/lib/Cloudflare/Zone.d.ts +0 -14
  210. package/lib/Cloudflare/Zone.d.ts.map +0 -1
  211. package/lib/Cloudflare/Zone.js.map +0 -1
  212. package/src/Cloudflare/BrowserRendering/BrowserRendering.ts +0 -132
  213. package/src/Cloudflare/BrowserRendering/BrowserRenderingBinding.ts +0 -137
  214. package/src/Cloudflare/BrowserRendering/index.ts +0 -11
@@ -3,7 +3,7 @@ import * as Provider from "../../Provider.ts";
3
3
  import { Resource } from "../../Resource.ts";
4
4
  import { CloudflareEnvironment } from "../CloudflareEnvironment.ts";
5
5
  import type { Providers } from "../Providers.ts";
6
- import { type ApiTokenProps } from "./Common.ts";
6
+ import { type ApiTokenBinding, type ApiTokenProps } from "./Common.ts";
7
7
  export type AccountApiToken = Resource<"Cloudflare.AccountApiToken", ApiTokenProps, {
8
8
  tokenId: string;
9
9
  name: string;
@@ -15,7 +15,7 @@ export type AccountApiToken = Resource<"Cloudflare.AccountApiToken", ApiTokenPro
15
15
  */
16
16
  value: Redacted.Redacted<string>;
17
17
  accountId: string;
18
- }, never, Providers>;
18
+ }, ApiTokenBinding, Providers>;
19
19
  /**
20
20
  * A Cloudflare account-owned API token (`POST /accounts/{account_id}/tokens`).
21
21
  *
@@ -52,6 +52,44 @@ export type AccountApiToken = Resource<"Cloudflare.AccountApiToken", ApiTokenPro
52
52
  * value: token.value,
53
53
  * });
54
54
  * ```
55
+ *
56
+ * @section Attaching Policies via Bindings
57
+ * @example Let a downstream capability contribute its own policies
58
+ * A token can be created with no `policies` of its own; the policies are
59
+ * supplied through its binding contract (see {@link ApiTokenBinding}). This is
60
+ * how capabilities like {@link CreateTunnel} provision a least-privilege token.
61
+ * ```typescript
62
+ * const token = yield* Cloudflare.AccountApiToken("scoped-token");
63
+ *
64
+ * yield* token.bind("MyCapability", {
65
+ * policies: [
66
+ * {
67
+ * effect: "allow",
68
+ * permissionGroups: ["Cloudflare Tunnel Write"],
69
+ * resources: { [`com.cloudflare.api.account.${accountId}`]: "*" },
70
+ * },
71
+ * ],
72
+ * });
73
+ * ```
74
+ *
75
+ * @section Exposing a Token to a Worker
76
+ * @example Read the token value at runtime
77
+ * Bind the token's outputs in the Worker's Init phase to get runtime
78
+ * accessors. Binding `token.value` injects it as a `secret_text` Worker
79
+ * binding; the returned accessor reads it back (as `Redacted`) at runtime.
80
+ * ```typescript
81
+ * // init
82
+ * const value = yield* token.value; // Accessor<Redacted<string>>
83
+ * const accountId = yield* token.accountId; // Accessor<string>
84
+ *
85
+ * return {
86
+ * fetch: Effect.gen(function* () {
87
+ * const apiToken = yield* value; // Redacted<string>
88
+ * // ... call the Cloudflare API with `apiToken`
89
+ * return HttpServerResponse.text("ok");
90
+ * }),
91
+ * };
92
+ * ```
55
93
  */
56
94
  export declare const AccountApiToken: import("../../Resource.ts").ResourceClass<AccountApiToken>;
57
95
  export declare const AccountApiTokenProvider: () => import("effect/Layer").Layer<Provider.Provider<AccountApiToken>, never, import("effect/unstable/http/HttpClient").HttpClient | import("../../Stage.ts").Stage | import("../../Stack.ts").Stack | import("@distilled.cloud/cloudflare").Credentials | CloudflareEnvironment>;
@@ -1 +1 @@
1
- {"version":3,"file":"AccountApiToken.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/AccountApiToken.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,eAAe,GAAG,QAAQ,CACpC,4BAA4B,EAC5B,aAAa,EACb;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,eAAe,4DAE3B,CAAC;AASF,eAAO,MAAM,uBAAuB,mRAiJjC,CAAC"}
1
+ {"version":3,"file":"AccountApiToken.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/AccountApiToken.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,eAAe,GAAG,QAAQ,CACpC,4BAA4B,EAC5B,aAAa,EACb;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,eAAe,EACf,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AACH,eAAO,MAAM,eAAe,4DAE3B,CAAC;AASF,eAAO,MAAM,uBAAuB,mRA8JjC,CAAC"}
@@ -6,7 +6,7 @@ import { createPhysicalName } from "../../PhysicalName.js";
6
6
  import * as Provider from "../../Provider.js";
7
7
  import { Resource } from "../../Resource.js";
8
8
  import { CloudflareEnvironment } from "../CloudflareEnvironment.js";
9
- import { buildConditionPayload, conditionFingerprint, policyFingerprint, resolvePolicies, } from "./Common.js";
9
+ import { buildConditionPayload, collectPolicies, conditionFingerprint, policyFingerprint, resolvePolicies, } from "./Common.js";
10
10
  /**
11
11
  * A Cloudflare account-owned API token (`POST /accounts/{account_id}/tokens`).
12
12
  *
@@ -43,6 +43,44 @@ import { buildConditionPayload, conditionFingerprint, policyFingerprint, resolve
43
43
  * value: token.value,
44
44
  * });
45
45
  * ```
46
+ *
47
+ * @section Attaching Policies via Bindings
48
+ * @example Let a downstream capability contribute its own policies
49
+ * A token can be created with no `policies` of its own; the policies are
50
+ * supplied through its binding contract (see {@link ApiTokenBinding}). This is
51
+ * how capabilities like {@link CreateTunnel} provision a least-privilege token.
52
+ * ```typescript
53
+ * const token = yield* Cloudflare.AccountApiToken("scoped-token");
54
+ *
55
+ * yield* token.bind("MyCapability", {
56
+ * policies: [
57
+ * {
58
+ * effect: "allow",
59
+ * permissionGroups: ["Cloudflare Tunnel Write"],
60
+ * resources: { [`com.cloudflare.api.account.${accountId}`]: "*" },
61
+ * },
62
+ * ],
63
+ * });
64
+ * ```
65
+ *
66
+ * @section Exposing a Token to a Worker
67
+ * @example Read the token value at runtime
68
+ * Bind the token's outputs in the Worker's Init phase to get runtime
69
+ * accessors. Binding `token.value` injects it as a `secret_text` Worker
70
+ * binding; the returned accessor reads it back (as `Redacted`) at runtime.
71
+ * ```typescript
72
+ * // init
73
+ * const value = yield* token.value; // Accessor<Redacted<string>>
74
+ * const accountId = yield* token.accountId; // Accessor<string>
75
+ *
76
+ * return {
77
+ * fetch: Effect.gen(function* () {
78
+ * const apiToken = yield* value; // Redacted<string>
79
+ * // ... call the Cloudflare API with `apiToken`
80
+ * return HttpServerResponse.text("ok");
81
+ * }),
82
+ * };
83
+ * ```
46
84
  */
47
85
  export const AccountApiToken = Resource("Cloudflare.AccountApiToken");
48
86
  const resolveName = (id, name) => Effect.gen(function* () {
@@ -57,13 +95,13 @@ export const AccountApiTokenProvider = () => Provider.effect(AccountApiToken, Ef
57
95
  const buildAttributes = (tokenData, value, accountId) => ({
58
96
  tokenId: tokenData.id ?? "",
59
97
  name: tokenData.name ?? "",
60
- status: tokenData.status ?? "active",
98
+ status: (tokenData.status ?? "active"),
61
99
  value,
62
100
  accountId,
63
101
  });
64
102
  return {
65
103
  stables: ["tokenId", "accountId"],
66
- diff: Effect.fn(function* ({ id, olds, news, output }) {
104
+ diff: Effect.fn(function* ({ id, olds, news = {}, output }) {
67
105
  if (!isResolved(news))
68
106
  return undefined;
69
107
  const newAccountId = news.accountId ?? defaultAccountId;
@@ -74,7 +112,7 @@ export const AccountApiTokenProvider = () => Provider.effect(AccountApiToken, Ef
74
112
  const oldName = output?.name ?? (yield* resolveName(id, olds?.name));
75
113
  const newName = yield* resolveName(id, news.name);
76
114
  const oldPolicyFp = policyFingerprint(resolvePolicies(olds?.policies ?? []));
77
- const newPolicyFp = policyFingerprint(resolvePolicies(news.policies));
115
+ const newPolicyFp = policyFingerprint(resolvePolicies(news.policies ?? []));
78
116
  const oldCondFp = conditionFingerprint(olds?.condition);
79
117
  const newCondFp = conditionFingerprint(news.condition);
80
118
  if (oldName !== newName ||
@@ -85,10 +123,15 @@ export const AccountApiTokenProvider = () => Provider.effect(AccountApiToken, Ef
85
123
  return { action: "update" };
86
124
  }
87
125
  }),
88
- reconcile: Effect.fn(function* ({ id, news, output }) {
126
+ reconcile: Effect.fn(function* ({ id, news = {}, output, bindings }) {
89
127
  const accountId = news.accountId ?? defaultAccountId;
90
128
  const name = yield* resolveName(id, news.name);
91
- const policies = resolvePolicies(news.policies);
129
+ const collected = collectPolicies(news.policies, bindings);
130
+ if (collected.length === 0) {
131
+ return yield* Effect.die(`Cloudflare requires at least one policy on token "${name}". ` +
132
+ "Pass `policies` or attach them via a binding.");
133
+ }
134
+ const policies = resolvePolicies(collected);
92
135
  // Observe — fetch current state if we already know the token id.
93
136
  // Cloudflare reports a deleted token as `InvalidRoute` or
94
137
  // `TokenNotFound`; both mean "create from scratch".
@@ -1 +1 @@
1
- {"version":3,"file":"AccountApiToken.js","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/AccountApiToken.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AccountApiToken.js","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/AccountApiToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,sCAAsC,CAAC;AACjE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAGhB,MAAM,aAAa,CAAC;AAqBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CACrC,4BAA4B,CAC7B,CAAC;AAIF,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,IAAwB,EAAE,EAAE,CAC3D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,EAAE,CAC1C,QAAQ,CAAC,MAAM,CACb,eAAe,EACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC,CAAC,qBAAqB,CAAC;IACrE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IAChD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IAChD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAE1C,MAAM,eAAe,GAAG,CACtB,SAKC,EACD,KAAgC,EAChC,SAAiB,EACU,EAAE,CAAC,CAAC;QAC/B,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE;QAC3B,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE;QAC1B,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,QAAQ,CAGxB;QACb,KAAK;QACL,SAAS;KACV,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE;YACxD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACxC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;YACxD,MAAM,YAAY,GAChB,MAAM,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,IAAI,gBAAgB,CAAC;YAC3D,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;gBAClC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAW,CAAC;YACxC,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,iBAAiB,CACnC,eAAe,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC,CACtC,CAAC;YACF,MAAM,WAAW,GAAG,iBAAiB,CACnC,eAAe,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CACrC,CAAC;YACF,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,IACE,OAAO,KAAK,OAAO;gBACnB,WAAW,KAAK,WAAW;gBAC3B,SAAS,KAAK,SAAS;gBACvB,CAAC,IAAI,EAAE,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;gBAChE,CAAC,IAAI,EAAE,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,EAChE,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAW,CAAC;YACvC,CAAC;QACH,CAAC,CAAC;QACF,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;YACjE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;YACrD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACtB,qDAAqD,IAAI,KAAK;oBAC5D,+CAA+C,CAClD,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;YAE5C,iEAAiE;YACjE,0DAA0D;YAC1D,oDAAoD;YACpD,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO;gBAC9B,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;oBACd,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;iBACxB,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAC5B,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,CACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAC1B,EACD,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,CACpC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAC1B,CACF;gBACH,CAAC,CAAC,SAAS,CAAC;YAEd,+DAA+D;YAC/D,gEAAgE;YAChE,+DAA+D;YAC/D,gEAAgE;YAChE,8CAA8C;YAC9C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;oBAChC,SAAS;oBACT,IAAI;oBACJ,QAAQ;oBACR,SAAS,EAAE,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC;oBAChD,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACtB,gDAAgD,IAAI,IAAI,CACzD,CAAC;gBACJ,CAAC;gBACD,OAAO,eAAe,CACpB,MAAM,EACN,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3B,SAAS,CACV,CAAC;YACJ,CAAC;YAED,2DAA2D;YAC3D,6DAA6D;YAC7D,+DAA+D;YAC/D,wBAAwB;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;gBAChC,SAAS;gBACT,OAAO,EAAE,MAAO,CAAC,OAAO;gBACxB,IAAI;gBACJ,QAAQ;gBACR,SAAS,EAAE,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC;gBAChD,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YACH,OAAO,eAAe,CAAC,MAAM,EAAE,MAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC,CAAC;QACF,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE;YACrC,KAAK,CAAC,CAAC,WAAW,CAAC;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC,IAAI;YACL,yDAAyD;YACzD,4DAA4D;YAC5D,mEAAmE;YACnE,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAClD,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CACpD,CAAC;QACJ,CAAC,CAAC;QACF,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE;YACnC,IAAI,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO,SAAS,CAAC;YACvC,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC;gBACrB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CACvD,EACD,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAChE,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAClE,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC,CAAC,CACH,CAAC"}
@@ -46,10 +46,11 @@ export type ApiTokenProps = {
46
46
  */
47
47
  accountId?: string;
48
48
  /**
49
- * Access policies attached to the token. At least one policy is required
50
- * by Cloudflare.
49
+ * Access policies attached to the token. Cloudflare requires at least one
50
+ * policy on a token; if you omit `policies` here, the policies must instead
51
+ * be contributed by bindings (see {@link ApiTokenBinding}).
51
52
  */
52
- policies: ApiTokenPolicy[];
53
+ policies?: ApiTokenPolicy[];
53
54
  /** ISO 8601 expiration timestamp. */
54
55
  expiresOn?: string;
55
56
  /** ISO 8601 "not before" timestamp. */
@@ -57,6 +58,28 @@ export type ApiTokenProps = {
57
58
  /** Optional usage conditions (e.g. IP allowlist). */
58
59
  condition?: ApiTokenCondition;
59
60
  };
61
+ /**
62
+ * Binding contract for {@link AccountApiToken} / {@link UserApiToken}.
63
+ *
64
+ * A binding contributes additional access policies to the token. This lets a
65
+ * downstream resource (e.g. a runtime capability that needs to call a specific
66
+ * Cloudflare API) create a token and attach exactly the policies it requires,
67
+ * without the token's owner having to enumerate them up front.
68
+ *
69
+ * Binding-contributed policies are merged with any `policies` passed directly
70
+ * as props; the union must contain at least one policy.
71
+ */
72
+ export type ApiTokenBinding = {
73
+ /** Access policies to attach to the token. */
74
+ policies?: ApiTokenPolicy[];
75
+ };
76
+ /**
77
+ * Collect the policies a token should be created with: those passed directly
78
+ * as props, plus those contributed by bindings.
79
+ */
80
+ export declare const collectPolicies: (props: ApiTokenPolicy[] | undefined, bindings: {
81
+ data: ApiTokenBinding;
82
+ }[]) => ApiTokenPolicy[];
60
83
  export type ResolvedPolicy = {
61
84
  effect: "allow" | "deny";
62
85
  permissionGroups: {
@@ -1 +1 @@
1
- {"version":3,"file":"Common.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/Common.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAC3B,8BAA8B,MAAM,EAAE,GACtC,mCAAmC,MAAM,EAAE,GAC3C,iCAAiC,MAAM,EAAE,GACzC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAClC,mBAAmB,GACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,gBAAgB,EAAE,0BAA0B,EAAE,CAAC;IAC/C,SAAS,EAAE;SAAG,CAAC,IAAI,mBAAmB,CAAC,CAAC,EAAE,MAAM;KAAE,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE;QACV,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,gBAAgB,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,EAAE,CAAC;IAC5E,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,KAAK,0BAA0B;;;;;;cA7CrC,MAAM;gBAAU,MAAM;;CA0DtD,CAAC;AAaF,eAAO,MAAM,eAAe,GAAI,UAAU,cAAc,EAAE,KAAG,cAAc,EAKtE,CAAC;AAEN,eAAO,MAAM,iBAAiB,GAAI,UAAU,cAAc,EAAE,KAAG,MAW5D,CAAC;AAEJ,eAAO,MAAM,oBAAoB,GAC/B,WAAW,iBAAiB,GAAG,SAAS,KACvC,MAIC,CAAC;AAEL,eAAO,MAAM,qBAAqB,GAChC,WAAW,iBAAiB,GAAG,SAAS;;;;;aAW3B,CAAC"}
1
+ {"version":3,"file":"Common.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/Common.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAC3B,8BAA8B,MAAM,EAAE,GACtC,mCAAmC,MAAM,EAAE,GAC3C,iCAAiC,MAAM,EAAE,GACzC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAClC,mBAAmB,GACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,gBAAgB,EAAE,0BAA0B,EAAE,CAAC;IAC/C,SAAS,EAAE;SAAG,CAAC,IAAI,mBAAmB,CAAC,CAAC,EAAE,MAAM;KAAE,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE;QACV,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,cAAc,EAAE,GAAG,SAAS,EACnC,UAAU;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,EAAE,KACpC,cAAc,EAGhB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,gBAAgB,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,EAAE,CAAC;IAC5E,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,KAAK,0BAA0B;;;;;;cA1ErC,MAAM;gBAAU,MAAM;;CAuFtD,CAAC;AAaF,eAAO,MAAM,eAAe,GAAI,UAAU,cAAc,EAAE,KAAG,cAAc,EAKtE,CAAC;AAEN,eAAO,MAAM,iBAAiB,GAAI,UAAU,cAAc,EAAE,KAAG,MAW5D,CAAC;AAEJ,eAAO,MAAM,oBAAoB,GAC/B,WAAW,iBAAiB,GAAG,SAAS,KACvC,MAIC,CAAC;AAEL,eAAO,MAAM,qBAAqB,GAChC,WAAW,iBAAiB,GAAG,SAAS;;;;;aAW3B,CAAC"}
@@ -1,4 +1,12 @@
1
1
  import { PERMISSION_GROUPS_BY_NAME, } from "./PermissionGroups.js";
2
+ /**
3
+ * Collect the policies a token should be created with: those passed directly
4
+ * as props, plus those contributed by bindings.
5
+ */
6
+ export const collectPolicies = (props, bindings) => [
7
+ ...(props ?? []),
8
+ ...bindings.flatMap((binding) => binding.data.policies ?? []),
9
+ ];
2
10
  export const resolvePermissionGroup = (ref) => {
3
11
  if (typeof ref === "string") {
4
12
  const group = PERMISSION_GROUPS_BY_NAME[ref];
@@ -1 +1 @@
1
- {"version":3,"file":"Common.js","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/Common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Common.js","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/Common.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import * as Redacted from "effect/Redacted";
2
2
  import * as Provider from "../../Provider.ts";
3
3
  import { Resource } from "../../Resource.ts";
4
4
  import type { Providers } from "../Providers.ts";
5
- import { type ApiTokenProps } from "./Common.ts";
5
+ import { type ApiTokenBinding, type ApiTokenProps } from "./Common.ts";
6
6
  export type UserApiToken = Resource<"Cloudflare.UserApiToken", ApiTokenProps, {
7
7
  tokenId: string;
8
8
  name: string;
@@ -12,7 +12,7 @@ export type UserApiToken = Resource<"Cloudflare.UserApiToken", ApiTokenProps, {
12
12
  * creation, so we persist it here for downstream consumers.
13
13
  */
14
14
  value: Redacted.Redacted<string>;
15
- }, never, Providers>;
15
+ }, ApiTokenBinding, Providers>;
16
16
  /**
17
17
  * A Cloudflare user-owned API token (`POST /user/tokens`).
18
18
  *
@@ -42,6 +42,42 @@ export type UserApiToken = Resource<"Cloudflare.UserApiToken", ApiTokenProps, {
42
42
  * ],
43
43
  * });
44
44
  * ```
45
+ *
46
+ * @section Attaching Policies via Bindings
47
+ * @example Let a downstream capability contribute its own policies
48
+ * A token can be created with no `policies` of its own; the policies are
49
+ * supplied through its binding contract (see {@link ApiTokenBinding}).
50
+ * ```typescript
51
+ * const token = yield* Cloudflare.UserApiToken("scoped-token");
52
+ *
53
+ * yield* token.bind("MyCapability", {
54
+ * policies: [
55
+ * {
56
+ * effect: "allow",
57
+ * permissionGroups: ["Workers Scripts Read"],
58
+ * resources: { [`com.cloudflare.api.account.${accountId}`]: "*" },
59
+ * },
60
+ * ],
61
+ * });
62
+ * ```
63
+ *
64
+ * @section Exposing a Token to a Worker
65
+ * @example Read the token value at runtime
66
+ * Bind the token's value output in the Worker's Init phase to get a runtime
67
+ * accessor. Binding it injects a `secret_text` Worker binding; the returned
68
+ * accessor reads it back (as `Redacted`) at runtime.
69
+ * ```typescript
70
+ * // init
71
+ * const value = yield* token.value; // Accessor<Redacted<string>>
72
+ *
73
+ * return {
74
+ * fetch: Effect.gen(function* () {
75
+ * const apiToken = yield* value; // Redacted<string>
76
+ * // ... call the Cloudflare API with `apiToken`
77
+ * return HttpServerResponse.text("ok");
78
+ * }),
79
+ * };
80
+ * ```
45
81
  */
46
82
  export declare const UserApiToken: import("../../Resource.ts").ResourceClass<UserApiToken>;
47
83
  export declare const UserApiTokenProvider: () => import("effect/Layer").Layer<Provider.Provider<UserApiToken>, never, import("effect/unstable/http/HttpClient").HttpClient | import("../../Stage.ts").Stage | import("../../Stack.ts").Stack | import("@distilled.cloud/cloudflare").Credentials>;
@@ -1 +1 @@
1
- {"version":3,"file":"UserApiToken.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/UserApiToken.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,YAAY,GAAG,QAAQ,CACjC,yBAAyB,EACzB,aAAa,EACb;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C;;;OAGG;IACH,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CAClC,EACD,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,YAAY,yDAAoD,CAAC;AAS9E,eAAO,MAAM,oBAAoB,wPA4G9B,CAAC"}
1
+ {"version":3,"file":"UserApiToken.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/UserApiToken.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,YAAY,GAAG,QAAQ,CACjC,yBAAyB,EACzB,aAAa,EACb;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C;;;OAGG;IACH,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CAClC,EACD,eAAe,EACf,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,eAAO,MAAM,YAAY,yDAAoD,CAAC;AAS9E,eAAO,MAAM,oBAAoB,wPAyH9B,CAAC"}
@@ -5,7 +5,7 @@ import { isResolved } from "../../Diff.js";
5
5
  import { createPhysicalName } from "../../PhysicalName.js";
6
6
  import * as Provider from "../../Provider.js";
7
7
  import { Resource } from "../../Resource.js";
8
- import { buildConditionPayload, conditionFingerprint, policyFingerprint, resolvePolicies, } from "./Common.js";
8
+ import { buildConditionPayload, collectPolicies, conditionFingerprint, policyFingerprint, resolvePolicies, } from "./Common.js";
9
9
  /**
10
10
  * A Cloudflare user-owned API token (`POST /user/tokens`).
11
11
  *
@@ -35,6 +35,42 @@ import { buildConditionPayload, conditionFingerprint, policyFingerprint, resolve
35
35
  * ],
36
36
  * });
37
37
  * ```
38
+ *
39
+ * @section Attaching Policies via Bindings
40
+ * @example Let a downstream capability contribute its own policies
41
+ * A token can be created with no `policies` of its own; the policies are
42
+ * supplied through its binding contract (see {@link ApiTokenBinding}).
43
+ * ```typescript
44
+ * const token = yield* Cloudflare.UserApiToken("scoped-token");
45
+ *
46
+ * yield* token.bind("MyCapability", {
47
+ * policies: [
48
+ * {
49
+ * effect: "allow",
50
+ * permissionGroups: ["Workers Scripts Read"],
51
+ * resources: { [`com.cloudflare.api.account.${accountId}`]: "*" },
52
+ * },
53
+ * ],
54
+ * });
55
+ * ```
56
+ *
57
+ * @section Exposing a Token to a Worker
58
+ * @example Read the token value at runtime
59
+ * Bind the token's value output in the Worker's Init phase to get a runtime
60
+ * accessor. Binding it injects a `secret_text` Worker binding; the returned
61
+ * accessor reads it back (as `Redacted`) at runtime.
62
+ * ```typescript
63
+ * // init
64
+ * const value = yield* token.value; // Accessor<Redacted<string>>
65
+ *
66
+ * return {
67
+ * fetch: Effect.gen(function* () {
68
+ * const apiToken = yield* value; // Redacted<string>
69
+ * // ... call the Cloudflare API with `apiToken`
70
+ * return HttpServerResponse.text("ok");
71
+ * }),
72
+ * };
73
+ * ```
38
74
  */
39
75
  export const UserApiToken = Resource("Cloudflare.UserApiToken");
40
76
  const resolveName = (id, name) => Effect.gen(function* () {
@@ -48,18 +84,18 @@ export const UserApiTokenProvider = () => Provider.effect(UserApiToken, Effect.g
48
84
  const buildAttributes = (tokenData, value) => ({
49
85
  tokenId: tokenData.id ?? "",
50
86
  name: tokenData.name ?? "",
51
- status: tokenData.status ?? "active",
87
+ status: (tokenData.status ?? "active"),
52
88
  value,
53
89
  });
54
90
  return {
55
91
  stables: ["tokenId"],
56
- diff: Effect.fn(function* ({ id, olds, news, output }) {
92
+ diff: Effect.fn(function* ({ id, olds, news = {}, output }) {
57
93
  if (!isResolved(news))
58
94
  return undefined;
59
95
  const oldName = output?.name ?? (yield* resolveName(id, olds?.name));
60
96
  const newName = yield* resolveName(id, news.name);
61
97
  const oldPolicyFp = policyFingerprint(resolvePolicies(olds?.policies ?? []));
62
- const newPolicyFp = policyFingerprint(resolvePolicies(news.policies));
98
+ const newPolicyFp = policyFingerprint(resolvePolicies(news.policies ?? []));
63
99
  const oldCondFp = conditionFingerprint(olds?.condition);
64
100
  const newCondFp = conditionFingerprint(news.condition);
65
101
  if (oldName !== newName ||
@@ -70,9 +106,14 @@ export const UserApiTokenProvider = () => Provider.effect(UserApiToken, Effect.g
70
106
  return { action: "update" };
71
107
  }
72
108
  }),
73
- reconcile: Effect.fn(function* ({ id, news, output }) {
109
+ reconcile: Effect.fn(function* ({ id, news = {}, output, bindings }) {
74
110
  const name = yield* resolveName(id, news.name);
75
- const policies = resolvePolicies(news.policies);
111
+ const collected = collectPolicies(news.policies, bindings);
112
+ if (collected.length === 0) {
113
+ return yield* Effect.die(`Cloudflare requires at least one policy on token "${name}". ` +
114
+ "Pass `policies` or attach them via a binding.");
115
+ }
116
+ const policies = resolvePolicies(collected);
76
117
  // Observe — fetch current state if we know the token id;
77
118
  // Cloudflare reports a deleted token as `TokenNotFound`, which
78
119
  // we treat as "create from scratch".
@@ -1 +1 @@
1
- {"version":3,"file":"UserApiToken.js","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/UserApiToken.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UserApiToken.js","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/UserApiToken.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import type * as Effect from "effect/Effect";
2
+ import { SingleShotGen } from "effect/Utils";
3
+ import { BrowserBinding, type BrowserClient } from "./BrowserBinding.ts";
4
+ type BrowserTypeId = typeof BrowserTypeId;
5
+ declare const BrowserTypeId: "Cloudflare.Browser";
6
+ export type BrowserProps = {
7
+ /**
8
+ * Binding name used when `Browser` is bound from inside a Worker init phase
9
+ * (`yield* Cloudflare.Browser(...)`). When passed through
10
+ * `Worker({ env: { ... } })`, the object key remains the binding name.
11
+ *
12
+ * @default "BROWSER"
13
+ */
14
+ name?: string;
15
+ };
16
+ /**
17
+ * The Effect yielded when a `Browser` marker is used inside a Worker init
18
+ * phase: it attaches the `browser` binding to the surrounding Worker and
19
+ * resolves to the runtime {@link BrowserClient}.
20
+ */
21
+ type BindEffect = Effect.Effect<BrowserClient, never, BrowserBinding>;
22
+ /**
23
+ * Marker for a Cloudflare Browser Rendering binding.
24
+ *
25
+ * It is a plain data structure (so it can be declared directly on a Worker's
26
+ * `env`) that is **also** yieldable inside an Effect-native Worker. Yielding it
27
+ * (`yield* Cloudflare.Browser(...)`) attaches the binding to the surrounding
28
+ * Worker and returns the runtime {@link BrowserClient} — no separate
29
+ * `.bind(...)` step required.
30
+ *
31
+ * The divergence is achieved via `[Symbol.iterator]`: the object is not an
32
+ * `Effect` (so `InferEnv` resolves it to the native `Fetcher` in the `env`
33
+ * position), but it is iterable as one when `yield*`-ed.
34
+ */
35
+ export interface Browser {
36
+ kind: BrowserTypeId;
37
+ name: string;
38
+ asEffect(): BindEffect;
39
+ [Symbol.iterator](): SingleShotGen<BindEffect, BrowserClient>;
40
+ }
41
+ export declare const isBrowser: (value: unknown) => value is Browser;
42
+ /**
43
+ * A Cloudflare Browser Rendering binding for launching headless browser
44
+ * sessions from Workers via `@cloudflare/puppeteer`.
45
+ *
46
+ * @binding
47
+ *
48
+ * @section Effect-style Worker (recommended)
49
+ * @example Render a page title with managed browser cleanup
50
+ * ```typescript
51
+ * import puppeteer from "@cloudflare/puppeteer";
52
+ * import * as Effect from "effect/Effect";
53
+ *
54
+ * Cloudflare.Worker(
55
+ * "BrowserWorker",
56
+ * { main: import.meta.filename },
57
+ * Effect.gen(function* () {
58
+ * // Attaches the binding to this Worker AND returns the runtime client.
59
+ * const browser = yield* Cloudflare.Browser({ name: "BROWSER" });
60
+ *
61
+ * return {
62
+ * fetch: browser.withBrowser(puppeteer, (browser) =>
63
+ * Effect.gen(function* () {
64
+ * const page = yield* Effect.tryPromise(() => browser.newPage());
65
+ * yield* Effect.tryPromise(() => page.goto("https://example.com"));
66
+ * const title = yield* Effect.tryPromise(() => page.title());
67
+ * return Response.json({ title });
68
+ * }),
69
+ * ),
70
+ * };
71
+ * }).pipe(Effect.provide(Cloudflare.BrowserBindingLive)),
72
+ * );
73
+ * ```
74
+ *
75
+ * @section Worker binding metadata
76
+ * @example
77
+ * ```typescript
78
+ * export const Worker = Cloudflare.Worker("Worker", {
79
+ * main: "./src/worker.ts",
80
+ * env: {
81
+ * BROWSER: Cloudflare.Browser(),
82
+ * },
83
+ * });
84
+ *
85
+ * export type WorkerEnv = Cloudflare.InferEnv<typeof Worker>;
86
+ * // { BROWSER: Fetcher }
87
+ * ```
88
+ *
89
+ * @example Async-style worker with the raw runtime binding
90
+ * ```typescript
91
+ * import puppeteer from "@cloudflare/puppeteer";
92
+ * import type { WorkerEnv } from "../alchemy.run.ts";
93
+ *
94
+ * export default {
95
+ * async fetch(request: Request, env: WorkerEnv) {
96
+ * const browser = await puppeteer.launch(env.BROWSER);
97
+ * const page = await browser.newPage();
98
+ * await page.goto("https://example.com");
99
+ * const screenshot = await page.screenshot();
100
+ * await browser.close();
101
+ *
102
+ * return new Response(screenshot, {
103
+ * headers: { "content-type": "image/png" },
104
+ * });
105
+ * },
106
+ * };
107
+ * ```
108
+ *
109
+ * @see https://developers.cloudflare.com/browser-rendering/workers-binding-api/
110
+ */
111
+ export declare const Browser: {
112
+ (props?: BrowserProps): Browser;
113
+ /**
114
+ * Bind an existing `Browser` marker to the surrounding Worker, returning the
115
+ * runtime client. Equivalent to `yield* browser` — prefer yielding the marker
116
+ * directly.
117
+ */
118
+ bind: typeof BrowserBinding.bind;
119
+ };
120
+ export {};
121
+ //# sourceMappingURL=Browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Browser.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/Browser/Browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzE,KAAK,aAAa,GAAG,OAAO,aAAa,CAAC;AAC1C,QAAA,MAAM,aAAa,EAAG,oBAA6B,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;GAIG;AACH,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAEtE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,IAAI,UAAU,CAAC;IACvB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;CAC/D;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OACqB,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AACH,eAAO,MAAM,OAAO,EAAE;IACpB,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAChC;;;;OAIG;IACH,IAAI,EAAE,OAAO,cAAc,CAAC,IAAI,CAAC;CAelC,CAAC"}