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.
- package/bin/exec.js.map +1 -1
- package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/BucketEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/EventBridgeEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/QueueEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/StreamEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TableEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TopicEventSource.d.ts.map +1 -1
- package/lib/Cli/commands/cloudflare.d.ts +4 -1
- package/lib/Cli/commands/cloudflare.d.ts.map +1 -1
- package/lib/Cli/commands/cloudflare.js +274 -1
- package/lib/Cli/commands/cloudflare.js.map +1 -1
- package/lib/Cloudflare/AiGateway/AiGateway.d.ts.map +1 -1
- package/lib/Cloudflare/AiGateway/AiGateway.js +2 -1
- package/lib/Cloudflare/AiGateway/AiGateway.js.map +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts +40 -2
- package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.js +49 -6
- package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -1
- package/lib/Cloudflare/ApiToken/Common.d.ts +26 -3
- package/lib/Cloudflare/ApiToken/Common.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/Common.js +8 -0
- package/lib/Cloudflare/ApiToken/Common.js.map +1 -1
- package/lib/Cloudflare/ApiToken/UserApiToken.d.ts +38 -2
- package/lib/Cloudflare/ApiToken/UserApiToken.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/UserApiToken.js +47 -6
- package/lib/Cloudflare/ApiToken/UserApiToken.js.map +1 -1
- package/lib/Cloudflare/Browser/Browser.d.ts +121 -0
- package/lib/Cloudflare/Browser/Browser.d.ts.map +1 -0
- package/lib/Cloudflare/{BrowserRendering/BrowserRendering.js → Browser/Browser.js} +19 -26
- package/lib/Cloudflare/Browser/Browser.js.map +1 -0
- package/lib/Cloudflare/Browser/BrowserBinding.d.ts +55 -0
- package/lib/Cloudflare/Browser/BrowserBinding.d.ts.map +1 -0
- package/lib/Cloudflare/{BrowserRendering/BrowserRenderingBinding.js → Browser/BrowserBinding.js} +11 -11
- package/lib/Cloudflare/Browser/BrowserBinding.js.map +1 -0
- package/lib/Cloudflare/Browser/index.d.ts +3 -0
- package/lib/Cloudflare/Browser/index.d.ts.map +1 -0
- package/lib/Cloudflare/Browser/index.js +3 -0
- package/lib/Cloudflare/Browser/index.js.map +1 -0
- package/lib/Cloudflare/Container/ContainerBinding.d.ts +2 -1
- package/lib/Cloudflare/Container/ContainerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/D1/D1Database.d.ts.map +1 -1
- package/lib/Cloudflare/D1/D1Database.js +2 -1
- package/lib/Cloudflare/D1/D1Database.js.map +1 -1
- package/lib/Cloudflare/Email/EmailRouting.d.ts +1 -1
- package/lib/Cloudflare/Email/EmailRouting.d.ts.map +1 -1
- package/lib/Cloudflare/Email/EmailRouting.js +1 -1
- package/lib/Cloudflare/Email/EmailRouting.js.map +1 -1
- package/lib/Cloudflare/Email/EmailRule.d.ts +1 -1
- package/lib/Cloudflare/Email/EmailRule.d.ts.map +1 -1
- package/lib/Cloudflare/Email/EmailRule.js +1 -1
- package/lib/Cloudflare/Email/EmailRule.js.map +1 -1
- package/lib/Cloudflare/Images/Images.d.ts +32 -23
- package/lib/Cloudflare/Images/Images.d.ts.map +1 -1
- package/lib/Cloudflare/Images/Images.js +10 -13
- package/lib/Cloudflare/Images/Images.js.map +1 -1
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Providers.js +10 -3
- package/lib/Cloudflare/Providers.js.map +1 -1
- package/lib/Cloudflare/R2/R2Bucket.d.ts +1 -1
- package/lib/Cloudflare/R2/R2Bucket.d.ts.map +1 -1
- package/lib/Cloudflare/R2/R2Bucket.js +13 -7
- package/lib/Cloudflare/R2/R2Bucket.js.map +1 -1
- package/lib/Cloudflare/RateLimit/RateLimit.d.ts +132 -0
- package/lib/Cloudflare/RateLimit/RateLimit.d.ts.map +1 -0
- package/lib/Cloudflare/RateLimit/RateLimit.js +80 -0
- package/lib/Cloudflare/RateLimit/RateLimit.js.map +1 -0
- package/lib/Cloudflare/RateLimit/RateLimitBinding.d.ts +30 -0
- package/lib/Cloudflare/RateLimit/RateLimitBinding.d.ts.map +1 -0
- package/lib/Cloudflare/RateLimit/RateLimitBinding.js +50 -0
- package/lib/Cloudflare/RateLimit/RateLimitBinding.js.map +1 -0
- package/lib/Cloudflare/RateLimit/index.d.ts +3 -0
- package/lib/Cloudflare/RateLimit/index.d.ts.map +1 -0
- package/lib/Cloudflare/RateLimit/index.js +3 -0
- package/lib/Cloudflare/RateLimit/index.js.map +1 -0
- package/lib/Cloudflare/SecretsStore/Secret.d.ts +2 -1
- package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -1
- package/lib/Cloudflare/SecretsStore/Secret.js +7 -4
- package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -1
- package/lib/Cloudflare/Tunnel/Tunnel.d.ts +27 -0
- package/lib/Cloudflare/Tunnel/Tunnel.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/Tunnel.js +27 -0
- package/lib/Cloudflare/Tunnel/Tunnel.js.map +1 -1
- package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts +48 -0
- package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelBinding.js +56 -0
- package/lib/Cloudflare/Tunnel/TunnelBinding.js.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelRead.d.ts +83 -0
- package/lib/Cloudflare/Tunnel/TunnelRead.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelRead.js +79 -0
- package/lib/Cloudflare/Tunnel/TunnelRead.js.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelReadWrite.d.ts +70 -0
- package/lib/Cloudflare/Tunnel/TunnelReadWrite.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelReadWrite.js +63 -0
- package/lib/Cloudflare/Tunnel/TunnelReadWrite.js.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelWrite.d.ts +92 -0
- package/lib/Cloudflare/Tunnel/TunnelWrite.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelWrite.js +88 -0
- package/lib/Cloudflare/Tunnel/TunnelWrite.js.map +1 -0
- package/lib/Cloudflare/Tunnel/index.d.ts +4 -0
- package/lib/Cloudflare/Tunnel/index.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/index.js +4 -0
- package/lib/Cloudflare/Tunnel/index.js.map +1 -1
- package/lib/Cloudflare/Vectorize/VectorizeIndex.js +1 -0
- package/lib/Cloudflare/Vectorize/VectorizeIndex.js.map +1 -1
- package/lib/Cloudflare/VpcService/VpcService.d.ts +1 -1
- package/lib/Cloudflare/VpcService/VpcService.d.ts.map +1 -1
- package/lib/Cloudflare/VpcService/VpcService.js.map +1 -1
- package/lib/Cloudflare/Workers/DynamicWorkerLoader.d.ts +119 -11
- package/lib/Cloudflare/Workers/DynamicWorkerLoader.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DynamicWorkerLoader.js +88 -9
- package/lib/Cloudflare/Workers/DynamicWorkerLoader.js.map +1 -1
- package/lib/Cloudflare/Workers/InferEnv.d.ts +1 -1
- package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +2 -0
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +18 -2
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts +5 -3
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.js +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.js.map +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts.map +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.js +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.js.map +1 -1
- package/lib/Cloudflare/Zone/Zone.d.ts +170 -0
- package/lib/Cloudflare/Zone/Zone.d.ts.map +1 -0
- package/lib/Cloudflare/Zone/Zone.js +180 -0
- package/lib/Cloudflare/Zone/Zone.js.map +1 -0
- package/lib/Cloudflare/Zone/index.d.ts +3 -0
- package/lib/Cloudflare/Zone/index.d.ts.map +1 -0
- package/lib/Cloudflare/Zone/index.js +3 -0
- package/lib/Cloudflare/Zone/index.js.map +1 -0
- package/lib/Cloudflare/Zone/lookup.d.ts +33 -0
- package/lib/Cloudflare/Zone/lookup.d.ts.map +1 -0
- package/lib/Cloudflare/{Zone.js → Zone/lookup.js} +2 -2
- package/lib/Cloudflare/Zone/lookup.js.map +1 -0
- package/lib/Cloudflare/index.d.ts +3 -1
- package/lib/Cloudflare/index.d.ts.map +1 -1
- package/lib/Cloudflare/index.js +3 -1
- package/lib/Cloudflare/index.js.map +1 -1
- package/lib/Platform.d.ts +5 -5
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js.map +1 -1
- package/lib/RemovalPolicy.js +2 -2
- package/lib/RemovalPolicy.js.map +1 -1
- package/lib/Resource.d.ts +14 -1
- package/lib/Resource.d.ts.map +1 -1
- package/lib/Resource.js +3 -2
- package/lib/Resource.js.map +1 -1
- package/lib/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/Cli/commands/cloudflare.ts +394 -1
- package/src/Cloudflare/AiGateway/AiGateway.ts +2 -1
- package/src/Cloudflare/ApiToken/AccountApiToken.ts +60 -7
- package/src/Cloudflare/ApiToken/Common.ts +32 -3
- package/src/Cloudflare/ApiToken/UserApiToken.ts +58 -7
- package/src/Cloudflare/Browser/Browser.ts +140 -0
- package/src/Cloudflare/Browser/BrowserBinding.ts +128 -0
- package/src/Cloudflare/Browser/index.ts +11 -0
- package/src/Cloudflare/D1/D1Database.ts +6 -2
- package/src/Cloudflare/Email/EmailRouting.ts +1 -1
- package/src/Cloudflare/Email/EmailRule.ts +6 -6
- package/src/Cloudflare/Images/Images.ts +40 -27
- package/src/Cloudflare/Providers.ts +15 -3
- package/src/Cloudflare/R2/R2Bucket.ts +17 -9
- package/src/Cloudflare/RateLimit/RateLimit.ts +160 -0
- package/src/Cloudflare/RateLimit/RateLimitBinding.ts +90 -0
- package/src/Cloudflare/RateLimit/index.ts +2 -0
- package/src/Cloudflare/SecretsStore/Secret.ts +12 -6
- package/src/Cloudflare/Tunnel/Tunnel.ts +27 -0
- package/src/Cloudflare/Tunnel/TunnelBinding.ts +114 -0
- package/src/Cloudflare/Tunnel/TunnelRead.ts +168 -0
- package/src/Cloudflare/Tunnel/TunnelReadWrite.ts +88 -0
- package/src/Cloudflare/Tunnel/TunnelWrite.ts +194 -0
- package/src/Cloudflare/Tunnel/index.ts +4 -0
- package/src/Cloudflare/Vectorize/VectorizeIndex.ts +2 -1
- package/src/Cloudflare/VpcService/VpcService.ts +4 -2
- package/src/Cloudflare/Workers/DynamicWorkerLoader.ts +139 -13
- package/src/Cloudflare/Workers/InferEnv.ts +19 -15
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +13 -2
- package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +16 -2
- package/src/Cloudflare/Workers/WorkerBinding.ts +6 -2
- package/src/Cloudflare/Zaraz/ZarazConfig.ts +1 -1
- package/src/Cloudflare/Zone/Zone.ts +349 -0
- package/src/Cloudflare/Zone/index.ts +2 -0
- package/src/Cloudflare/{Zone.ts → Zone/lookup.ts} +16 -3
- package/src/Cloudflare/index.ts +3 -1
- package/src/Platform.ts +8 -12
- package/src/RemovalPolicy.ts +2 -2
- package/src/Resource.ts +18 -1
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts +0 -116
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts.map +0 -1
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.js.map +0 -1
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts +0 -55
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts.map +0 -1
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.js.map +0 -1
- package/lib/Cloudflare/BrowserRendering/index.d.ts +0 -3
- package/lib/Cloudflare/BrowserRendering/index.d.ts.map +0 -1
- package/lib/Cloudflare/BrowserRendering/index.js +0 -3
- package/lib/Cloudflare/BrowserRendering/index.js.map +0 -1
- package/lib/Cloudflare/Zone.d.ts +0 -14
- package/lib/Cloudflare/Zone.d.ts.map +0 -1
- package/lib/Cloudflare/Zone.js.map +0 -1
- package/src/Cloudflare/BrowserRendering/BrowserRendering.ts +0 -132
- package/src/Cloudflare/BrowserRendering/BrowserRenderingBinding.ts +0 -137
- 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
|
-
},
|
|
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,
|
|
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
|
|
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":"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,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,
|
|
1
|
+
{"version":3,"file":"AccountApiToken.js","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/AccountApiToken.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,10 +46,11 @@ export type ApiTokenProps = {
|
|
|
46
46
|
*/
|
|
47
47
|
accountId?: string;
|
|
48
48
|
/**
|
|
49
|
-
* Access policies attached to the token.
|
|
50
|
-
*
|
|
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
|
|
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
|
|
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":"AAAA,OAAO,EACL,yBAAyB,GAE1B,MAAM,uBAAuB,CAAC;
|
|
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
|
-
},
|
|
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,
|
|
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
|
|
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":"AAAA,OAAO,KAAK,IAAI,MAAM,kCAAkC,CAAC;AACzD,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;AAE7C,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,
|
|
1
|
+
{"version":3,"file":"UserApiToken.js","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/UserApiToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,kCAAkC,CAAC;AACzD,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;AAE7C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAGhB,MAAM,aAAa,CAAC;AAmBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAe,yBAAyB,CAAC,CAAC;AAI9E,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,oBAAoB,GAAG,GAAG,EAAE,CACvC,QAAQ,CAAC,MAAM,CACb,YAAY,EACZ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IAEtC,MAAM,eAAe,GAAG,CACtB,SAKC,EACD,KAAgC,EACR,EAAE,CAAC,CAAC;QAC5B,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;KACN,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,CAAC,SAAS,CAAC;QACpB,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,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,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,yDAAyD;YACzD,+DAA+D;YAC/D,qCAAqC;YACrC,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO;gBAC9B,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAC5B,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,6DAA6D;YAC7D,gEAAgE;YAChE,2BAA2B;YAC3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;oBAChC,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,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9D,CAAC;YAED,gEAAgE;YAChE,6DAA6D;YAC7D,gCAAgC;YAChC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;gBAChC,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,CAAC,CAAC;QAChD,CAAC,CAAC;QACF,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE;YACrC,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAClD,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,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CACtD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAC3D,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"}
|
|
@@ -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"}
|