alchemy 0.1.18 → 0.2.1
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/README.md +506 -0
- package/lib/alchemy.d.ts +67 -0
- package/lib/alchemy.js +48 -0
- package/lib/apply.d.ts +3 -20
- package/lib/apply.js +95 -82
- package/lib/aws/account-id.d.ts +0 -1
- package/lib/aws/account-id.js +0 -1
- package/lib/aws/bucket.d.ts +4 -7
- package/lib/aws/bucket.js +8 -12
- package/lib/aws/function.d.ts +4 -7
- package/lib/aws/function.js +9 -30
- package/lib/aws/index.d.ts +1 -1
- package/lib/aws/index.js +1 -1
- package/lib/aws/oidc/github-oidc-provider.d.ts +2 -6
- package/lib/aws/oidc/github-oidc-provider.js +10 -15
- package/lib/aws/oidc/index.d.ts +0 -1
- package/lib/aws/oidc/index.js +0 -1
- package/lib/aws/oidc/oidc-provider.d.ts +4 -6
- package/lib/aws/oidc/oidc-provider.js +9 -11
- package/lib/aws/policy-attachment.d.ts +9 -0
- package/lib/aws/policy-attachment.js +20 -0
- package/lib/aws/policy.d.ts +4 -16
- package/lib/aws/policy.js +9 -40
- package/lib/aws/queue.d.ts +4 -34
- package/lib/aws/queue.js +10 -20
- package/lib/aws/role.d.ts +4 -7
- package/lib/aws/role.js +17 -26
- package/lib/aws/ses.d.ts +4 -10
- package/lib/aws/ses.js +118 -131
- package/lib/aws/table.d.ts +4 -7
- package/lib/aws/table.js +8 -11
- package/lib/cloudflare/api.d.ts +0 -1
- package/lib/cloudflare/api.js +0 -1
- package/lib/cloudflare/asset-manifest.d.ts +0 -1
- package/lib/cloudflare/asset-manifest.js +0 -1
- package/lib/cloudflare/auth.d.ts +0 -1
- package/lib/cloudflare/auth.js +0 -1
- package/lib/cloudflare/bindings.d.ts +1 -1
- package/lib/cloudflare/bindings.js +3 -2
- package/lib/cloudflare/bound.d.ts +0 -1
- package/lib/cloudflare/bound.js +0 -1
- package/lib/cloudflare/bucket.d.ts +7 -15
- package/lib/cloudflare/bucket.js +12 -19
- package/lib/cloudflare/durable-object-namespace.d.ts +0 -3
- package/lib/cloudflare/durable-object-namespace.js +0 -4
- package/lib/cloudflare/generate-asset-manifest.d.ts +0 -1
- package/lib/cloudflare/generate-asset-manifest.js +1 -2
- package/lib/cloudflare/index.d.ts +2 -1
- package/lib/cloudflare/index.js +2 -1
- package/lib/cloudflare/kv-namespace.d.ts +6 -9
- package/lib/cloudflare/kv-namespace.js +16 -20
- package/lib/cloudflare/state.d.ts +0 -1
- package/lib/cloudflare/state.js +0 -1
- package/lib/cloudflare/static-site-router.d.ts +0 -1
- package/lib/cloudflare/static-site-router.js +0 -4
- package/lib/cloudflare/static-site.d.ts +5 -11
- package/lib/cloudflare/static-site.js +25 -37
- package/lib/cloudflare/types.d.ts +0 -1
- package/lib/cloudflare/types.js +0 -1
- package/lib/cloudflare/upload-asset-manifest.d.ts +0 -1
- package/lib/cloudflare/upload-asset-manifest.js +0 -1
- package/lib/cloudflare/worker-metadata.d.ts +0 -1
- package/lib/cloudflare/worker-metadata.js +0 -1
- package/lib/cloudflare/worker-migration.d.ts +0 -1
- package/lib/cloudflare/worker-migration.js +0 -1
- package/lib/cloudflare/worker.d.ts +8 -14
- package/lib/cloudflare/worker.js +38 -50
- package/lib/cloudflare/wrangler.json.d.ts +243 -0
- package/lib/cloudflare/wrangler.json.js +35 -0
- package/lib/cloudflare/zone-settings.d.ts +301 -0
- package/lib/cloudflare/zone-settings.js +1 -0
- package/lib/cloudflare/zone.d.ts +196 -0
- package/lib/cloudflare/zone.js +175 -0
- package/lib/context.d.ts +58 -0
- package/lib/context.js +36 -0
- package/lib/destroy.d.ts +10 -13
- package/lib/destroy.js +104 -43
- package/lib/{esbuild.d.ts → esbuild/bundle.d.ts} +4 -18
- package/lib/{esbuild.js → esbuild/bundle.js} +10 -24
- package/lib/esbuild/index.d.ts +1 -0
- package/lib/esbuild/index.js +1 -0
- package/lib/fs/file.d.ts +13 -0
- package/lib/fs/file.js +20 -0
- package/lib/fs/folder.d.ts +10 -0
- package/lib/fs/folder.js +16 -0
- package/lib/fs/index.d.ts +2 -0
- package/lib/fs/index.js +2 -0
- package/lib/github/client.d.ts +0 -1
- package/lib/github/client.js +0 -1
- package/lib/github/index.d.ts +0 -1
- package/lib/github/index.js +0 -1
- package/lib/github/secret.d.ts +4 -6
- package/lib/github/secret.js +10 -12
- package/lib/index.d.ts +6 -10
- package/lib/index.js +5 -9
- package/lib/project/index.d.ts +1 -0
- package/lib/project/index.js +1 -0
- package/lib/project/vite.d.ts +39 -0
- package/lib/project/vite.js +68 -0
- package/lib/resource.d.ts +34 -62
- package/lib/resource.js +29 -270
- package/lib/scope.d.ts +37 -14
- package/lib/scope.js +97 -23
- package/lib/secret.d.ts +2 -7
- package/lib/secret.js +7 -20
- package/lib/state.d.ts +14 -10
- package/lib/state.js +20 -14
- package/lib/stripe/index.d.ts +0 -1
- package/lib/stripe/index.js +0 -1
- package/lib/stripe/price.d.ts +4 -5
- package/lib/stripe/price.js +10 -20
- package/lib/stripe/product.d.ts +4 -5
- package/lib/stripe/product.js +10 -20
- package/lib/stripe/webhook.d.ts +4 -6
- package/lib/stripe/webhook.js +12 -25
- package/lib/test/bun.d.ts +19 -0
- package/lib/test/bun.js +55 -0
- package/lib/{utils → util}/content-type.d.ts +0 -1
- package/lib/{utils → util}/content-type.js +0 -1
- package/lib/{encrypt.d.ts → util/encrypt.d.ts} +0 -1
- package/lib/{encrypt.js → util/encrypt.js} +0 -1
- package/lib/{error.d.ts → util/ignore.d.ts} +0 -1
- package/lib/{error.js → util/ignore.js} +0 -1
- package/lib/{utils → util}/retry.d.ts +0 -1
- package/lib/{utils → util}/retry.js +0 -1
- package/lib/util/rm.d.ts +1 -0
- package/lib/util/rm.js +11 -0
- package/lib/util/serde.d.ts +3 -0
- package/lib/{serde.js → util/serde.js} +19 -10
- package/lib/util/slugify.d.ts +1 -0
- package/lib/util/slugify.js +3 -0
- package/package.json +7 -5
- package/src/alchemy.ts +127 -0
- package/src/apply.ts +116 -115
- package/src/aws/bucket.ts +11 -14
- package/src/aws/function.ts +13 -33
- package/src/aws/index.ts +1 -0
- package/src/aws/oidc/github-oidc-provider.ts +14 -19
- package/src/aws/oidc/oidc-provider.ts +19 -12
- package/src/aws/policy-attachment.ts +51 -0
- package/src/aws/policy.ts +15 -60
- package/src/aws/queue.ts +17 -21
- package/src/aws/role.ts +25 -28
- package/src/aws/ses.ts +150 -164
- package/src/aws/table.ts +15 -15
- package/src/cloudflare/bindings.ts +8 -0
- package/src/cloudflare/bucket.ts +39 -47
- package/src/cloudflare/durable-object-namespace.ts +0 -10
- package/src/cloudflare/generate-asset-manifest.ts +1 -1
- package/src/cloudflare/index.ts +2 -0
- package/src/cloudflare/kv-namespace.ts +35 -33
- package/src/cloudflare/static-site-router.ts +0 -3
- package/src/cloudflare/static-site.ts +55 -71
- package/src/cloudflare/worker.ts +106 -112
- package/src/cloudflare/wrangler.json.ts +309 -0
- package/src/cloudflare/zone-settings.ts +368 -0
- package/src/cloudflare/zone.ts +491 -0
- package/src/context.ts +122 -0
- package/src/destroy.ts +124 -73
- package/src/{esbuild.ts → esbuild/bundle.ts} +16 -28
- package/src/esbuild/index.ts +1 -0
- package/src/fs/file.ts +39 -0
- package/src/fs/folder.ts +32 -0
- package/src/fs/index.ts +2 -0
- package/src/github/secret.ts +19 -16
- package/src/index.ts +7 -15
- package/src/project/index.ts +1 -0
- package/src/project/vite.ts +152 -0
- package/src/resource.ts +101 -462
- package/src/scope.ts +125 -36
- package/src/secret.ts +9 -32
- package/src/state.ts +38 -21
- package/src/stripe/price.ts +17 -22
- package/src/stripe/product.ts +17 -22
- package/src/stripe/webhook.ts +21 -27
- package/src/test/bun.ts +105 -0
- package/src/util/rm.ts +11 -0
- package/src/util/serde.ts +53 -0
- package/src/util/slugify.ts +3 -0
- package/lib/$.d.ts +0 -12
- package/lib/$.d.ts.map +0 -1
- package/lib/$.js +0 -42
- package/lib/$.js.map +0 -1
- package/lib/alchemize.d.ts +0 -47
- package/lib/alchemize.d.ts.map +0 -1
- package/lib/alchemize.js +0 -116
- package/lib/alchemize.js.map +0 -1
- package/lib/apply.d.ts.map +0 -1
- package/lib/apply.js.map +0 -1
- package/lib/aws/account-id.d.ts.map +0 -1
- package/lib/aws/account-id.js.map +0 -1
- package/lib/aws/bucket.d.ts.map +0 -1
- package/lib/aws/bucket.js.map +0 -1
- package/lib/aws/function.d.ts.map +0 -1
- package/lib/aws/function.js.map +0 -1
- package/lib/aws/index.d.ts.map +0 -1
- package/lib/aws/index.js.map +0 -1
- package/lib/aws/oidc/github-oidc-provider.d.ts.map +0 -1
- package/lib/aws/oidc/github-oidc-provider.js.map +0 -1
- package/lib/aws/oidc/index.d.ts.map +0 -1
- package/lib/aws/oidc/index.js.map +0 -1
- package/lib/aws/oidc/oidc-provider.d.ts.map +0 -1
- package/lib/aws/oidc/oidc-provider.js.map +0 -1
- package/lib/aws/policy.d.ts.map +0 -1
- package/lib/aws/policy.js.map +0 -1
- package/lib/aws/queue.d.ts.map +0 -1
- package/lib/aws/queue.js.map +0 -1
- package/lib/aws/role.d.ts.map +0 -1
- package/lib/aws/role.js.map +0 -1
- package/lib/aws/ses.d.ts.map +0 -1
- package/lib/aws/ses.js.map +0 -1
- package/lib/aws/table.d.ts.map +0 -1
- package/lib/aws/table.js.map +0 -1
- package/lib/cloudflare/api.d.ts.map +0 -1
- package/lib/cloudflare/api.js.map +0 -1
- package/lib/cloudflare/asset-manifest.d.ts.map +0 -1
- package/lib/cloudflare/asset-manifest.js.map +0 -1
- package/lib/cloudflare/auth.d.ts.map +0 -1
- package/lib/cloudflare/auth.js.map +0 -1
- package/lib/cloudflare/bindings.d.ts.map +0 -1
- package/lib/cloudflare/bindings.js.map +0 -1
- package/lib/cloudflare/bound.d.ts.map +0 -1
- package/lib/cloudflare/bound.js.map +0 -1
- package/lib/cloudflare/bucket.d.ts.map +0 -1
- package/lib/cloudflare/bucket.js.map +0 -1
- package/lib/cloudflare/durable-object-namespace.d.ts.map +0 -1
- package/lib/cloudflare/durable-object-namespace.js.map +0 -1
- package/lib/cloudflare/generate-asset-manifest.d.ts.map +0 -1
- package/lib/cloudflare/generate-asset-manifest.js.map +0 -1
- package/lib/cloudflare/index.d.ts.map +0 -1
- package/lib/cloudflare/index.js.map +0 -1
- package/lib/cloudflare/kv-namespace.d.ts.map +0 -1
- package/lib/cloudflare/kv-namespace.js.map +0 -1
- package/lib/cloudflare/state.d.ts.map +0 -1
- package/lib/cloudflare/state.js.map +0 -1
- package/lib/cloudflare/static-site-router.d.ts.map +0 -1
- package/lib/cloudflare/static-site-router.js.map +0 -1
- package/lib/cloudflare/static-site.d.ts.map +0 -1
- package/lib/cloudflare/static-site.js.map +0 -1
- package/lib/cloudflare/types.d.ts.map +0 -1
- package/lib/cloudflare/types.js.map +0 -1
- package/lib/cloudflare/upload-asset-manifest.d.ts.map +0 -1
- package/lib/cloudflare/upload-asset-manifest.js.map +0 -1
- package/lib/cloudflare/worker-metadata.d.ts.map +0 -1
- package/lib/cloudflare/worker-metadata.js.map +0 -1
- package/lib/cloudflare/worker-migration.d.ts.map +0 -1
- package/lib/cloudflare/worker-migration.js.map +0 -1
- package/lib/cloudflare/worker.d.ts.map +0 -1
- package/lib/cloudflare/worker.js.map +0 -1
- package/lib/destroy.d.ts.map +0 -1
- package/lib/destroy.js.map +0 -1
- package/lib/encrypt.d.ts.map +0 -1
- package/lib/encrypt.js.map +0 -1
- package/lib/error.d.ts.map +0 -1
- package/lib/error.js.map +0 -1
- package/lib/esbuild.d.ts.map +0 -1
- package/lib/esbuild.js.map +0 -1
- package/lib/fs.d.ts +0 -12
- package/lib/fs.d.ts.map +0 -1
- package/lib/fs.js +0 -41
- package/lib/fs.js.map +0 -1
- package/lib/github/client.d.ts.map +0 -1
- package/lib/github/client.js.map +0 -1
- package/lib/github/index.d.ts.map +0 -1
- package/lib/github/index.js.map +0 -1
- package/lib/github/secret.d.ts.map +0 -1
- package/lib/github/secret.js.map +0 -1
- package/lib/global.d.ts +0 -16
- package/lib/global.d.ts.map +0 -1
- package/lib/global.js +0 -42
- package/lib/global.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/input.d.ts +0 -7
- package/lib/input.d.ts.map +0 -1
- package/lib/input.js +0 -2
- package/lib/input.js.map +0 -1
- package/lib/main.d.ts +0 -3
- package/lib/main.d.ts.map +0 -1
- package/lib/main.js +0 -32
- package/lib/main.js.map +0 -1
- package/lib/output.d.ts +0 -25
- package/lib/output.d.ts.map +0 -1
- package/lib/output.js +0 -23
- package/lib/output.js.map +0 -1
- package/lib/print.d.ts +0 -7
- package/lib/print.d.ts.map +0 -1
- package/lib/print.js +0 -10
- package/lib/print.js.map +0 -1
- package/lib/resource.d.ts.map +0 -1
- package/lib/resource.js.map +0 -1
- package/lib/scope.d.ts.map +0 -1
- package/lib/scope.js.map +0 -1
- package/lib/secret.d.ts.map +0 -1
- package/lib/secret.js.map +0 -1
- package/lib/serde.d.ts +0 -3
- package/lib/serde.d.ts.map +0 -1
- package/lib/serde.js.map +0 -1
- package/lib/slug.d.ts +0 -2
- package/lib/slug.d.ts.map +0 -1
- package/lib/slug.js +0 -4
- package/lib/slug.js.map +0 -1
- package/lib/state.d.ts.map +0 -1
- package/lib/state.js.map +0 -1
- package/lib/stripe/index.d.ts.map +0 -1
- package/lib/stripe/index.js.map +0 -1
- package/lib/stripe/price.d.ts.map +0 -1
- package/lib/stripe/price.js.map +0 -1
- package/lib/stripe/product.d.ts.map +0 -1
- package/lib/stripe/product.js.map +0 -1
- package/lib/stripe/webhook.d.ts.map +0 -1
- package/lib/stripe/webhook.js.map +0 -1
- package/lib/utils/content-type.d.ts.map +0 -1
- package/lib/utils/content-type.js.map +0 -1
- package/lib/utils/retry.d.ts.map +0 -1
- package/lib/utils/retry.js.map +0 -1
- package/src/$.ts +0 -69
- package/src/alchemize.ts +0 -195
- package/src/fs.ts +0 -47
- package/src/global.ts +0 -63
- package/src/input.ts +0 -19
- package/src/main.ts +0 -34
- package/src/output.ts +0 -75
- package/src/print.ts +0 -18
- package/src/serde.ts +0 -46
- package/src/slug.ts +0 -3
- /package/src/{utils → util}/content-type.ts +0 -0
- /package/src/{encrypt.ts → util/encrypt.ts} +0 -0
- /package/src/{error.ts → util/ignore.ts} +0 -0
- /package/src/{utils → util}/retry.ts +0 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { Context } from "../context";
|
|
2
|
+
import { Resource } from "../resource";
|
|
3
|
+
import type { AlwaysUseHTTPSValue, AutomaticHTTPSRewritesValue, BrotliValue, DevelopmentModeValue, EarlyHintsValue, EmailObfuscationValue, HTTP2Value, HTTP3Value, HotlinkProtectionValue, IPv6Value, MinTLSVersionValue, SSLValue, TLS13Value, WebSocketsValue, ZeroRTTValue } from "./zone-settings";
|
|
4
|
+
/**
|
|
5
|
+
* Properties for creating or updating a Zone
|
|
6
|
+
*/
|
|
7
|
+
export interface ZoneProps {
|
|
8
|
+
/**
|
|
9
|
+
* The domain name for the zone
|
|
10
|
+
*/
|
|
11
|
+
name: string;
|
|
12
|
+
/**
|
|
13
|
+
* Account ID to use for the zone
|
|
14
|
+
* If not provided, will use the default account
|
|
15
|
+
*/
|
|
16
|
+
accountId?: string;
|
|
17
|
+
/**
|
|
18
|
+
* The type of zone to create
|
|
19
|
+
* "full" - Full zone implies that DNS is hosted with Cloudflare
|
|
20
|
+
* "partial" - Partial zone is typically a partner-hosted zone or a CNAME setup
|
|
21
|
+
* "secondary" - Secondary zone is a zone that mirrors the primary zone
|
|
22
|
+
* @default "full"
|
|
23
|
+
*/
|
|
24
|
+
type?: "full" | "partial" | "secondary";
|
|
25
|
+
/**
|
|
26
|
+
* Whether to jump start the zone
|
|
27
|
+
* When enabled, Cloudflare will attempt to fetch existing DNS records
|
|
28
|
+
* @default true
|
|
29
|
+
*/
|
|
30
|
+
jumpStart?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Settings to apply to the zone
|
|
33
|
+
*/
|
|
34
|
+
settings?: {
|
|
35
|
+
/**
|
|
36
|
+
* Enable SSL/TLS encryption for the zone
|
|
37
|
+
* "off" - SSL disabled
|
|
38
|
+
* "flexible" - Encrypts traffic between browser and Cloudflare
|
|
39
|
+
* "full" - Encrypts traffic between browser and server, allows self-signed certs
|
|
40
|
+
* "strict" - Encrypts traffic between browser and server, requires valid cert
|
|
41
|
+
*/
|
|
42
|
+
ssl?: SSLValue;
|
|
43
|
+
/**
|
|
44
|
+
* Enable Always Use HTTPS
|
|
45
|
+
* Redirects all HTTP traffic to HTTPS
|
|
46
|
+
* @default "off"
|
|
47
|
+
*/
|
|
48
|
+
alwaysUseHttps?: AlwaysUseHTTPSValue;
|
|
49
|
+
/**
|
|
50
|
+
* Enable Automatic HTTPS Rewrites
|
|
51
|
+
* Automatically rewrites HTTP URLs to HTTPS
|
|
52
|
+
* @default "off"
|
|
53
|
+
*/
|
|
54
|
+
automaticHttpsRewrites?: AutomaticHTTPSRewritesValue;
|
|
55
|
+
/**
|
|
56
|
+
* Enable TLS 1.3
|
|
57
|
+
* Enables the latest version of TLS encryption
|
|
58
|
+
* @default "off"
|
|
59
|
+
*/
|
|
60
|
+
tls13?: TLS13Value;
|
|
61
|
+
/**
|
|
62
|
+
* Enable Early Hints
|
|
63
|
+
* Speeds up page loads by serving Link headers
|
|
64
|
+
* @default "off"
|
|
65
|
+
*/
|
|
66
|
+
earlyHints?: EarlyHintsValue;
|
|
67
|
+
/**
|
|
68
|
+
* Enable Email Obfuscation
|
|
69
|
+
* Obfuscates email addresses on the site
|
|
70
|
+
* @default "off"
|
|
71
|
+
*/
|
|
72
|
+
emailObfuscation?: EmailObfuscationValue;
|
|
73
|
+
/**
|
|
74
|
+
* Enable Browser Cache TTL
|
|
75
|
+
* Sets the browser cache TTL in seconds
|
|
76
|
+
*/
|
|
77
|
+
browserCacheTtl?: number;
|
|
78
|
+
/**
|
|
79
|
+
* Enable Development Mode
|
|
80
|
+
* Disables caching and enables real-time updates
|
|
81
|
+
* @default "off"
|
|
82
|
+
*/
|
|
83
|
+
developmentMode?: DevelopmentModeValue;
|
|
84
|
+
/**
|
|
85
|
+
* Enable HTTP/2
|
|
86
|
+
* @default "on"
|
|
87
|
+
*/
|
|
88
|
+
http2?: HTTP2Value;
|
|
89
|
+
/**
|
|
90
|
+
* Enable HTTP/3
|
|
91
|
+
* @default "on"
|
|
92
|
+
*/
|
|
93
|
+
http3?: HTTP3Value;
|
|
94
|
+
/**
|
|
95
|
+
* Enable IPv6
|
|
96
|
+
* @default "on"
|
|
97
|
+
*/
|
|
98
|
+
ipv6?: IPv6Value;
|
|
99
|
+
/**
|
|
100
|
+
* Enable WebSockets
|
|
101
|
+
* @default "on"
|
|
102
|
+
*/
|
|
103
|
+
websockets?: WebSocketsValue;
|
|
104
|
+
/**
|
|
105
|
+
* Enable Zero-RTT
|
|
106
|
+
* @default "off"
|
|
107
|
+
*/
|
|
108
|
+
zeroRtt?: ZeroRTTValue;
|
|
109
|
+
/**
|
|
110
|
+
* Enable Brotli compression
|
|
111
|
+
* @default "on"
|
|
112
|
+
*/
|
|
113
|
+
brotli?: BrotliValue;
|
|
114
|
+
/**
|
|
115
|
+
* Enable Hotlink Protection
|
|
116
|
+
* @default "off"
|
|
117
|
+
*/
|
|
118
|
+
hotlinkProtection?: HotlinkProtectionValue;
|
|
119
|
+
/**
|
|
120
|
+
* Minimum TLS Version
|
|
121
|
+
* @default "1.0"
|
|
122
|
+
*/
|
|
123
|
+
minTlsVersion?: MinTLSVersionValue;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Output returned after Zone creation/update
|
|
128
|
+
*/
|
|
129
|
+
export interface Zone extends Resource<"cloudflare::Zone"> {
|
|
130
|
+
/**
|
|
131
|
+
* The ID of the zone
|
|
132
|
+
*/
|
|
133
|
+
id: string;
|
|
134
|
+
/**
|
|
135
|
+
* The domain name for the zone
|
|
136
|
+
*/
|
|
137
|
+
name: string;
|
|
138
|
+
/**
|
|
139
|
+
* The type of zone
|
|
140
|
+
*/
|
|
141
|
+
type: "full" | "partial" | "secondary";
|
|
142
|
+
/**
|
|
143
|
+
* The status of the zone
|
|
144
|
+
*/
|
|
145
|
+
status: string;
|
|
146
|
+
/**
|
|
147
|
+
* Whether the zone is paused
|
|
148
|
+
*/
|
|
149
|
+
paused: boolean;
|
|
150
|
+
/**
|
|
151
|
+
* The account ID the zone belongs to
|
|
152
|
+
*/
|
|
153
|
+
accountId: string;
|
|
154
|
+
/**
|
|
155
|
+
* The nameservers assigned to the zone
|
|
156
|
+
*/
|
|
157
|
+
nameservers: string[];
|
|
158
|
+
/**
|
|
159
|
+
* The original nameservers for the zone
|
|
160
|
+
*/
|
|
161
|
+
originalNameservers: string[] | null;
|
|
162
|
+
/**
|
|
163
|
+
* Time at which the zone was created
|
|
164
|
+
*/
|
|
165
|
+
createdAt: number;
|
|
166
|
+
/**
|
|
167
|
+
* Time at which the zone was last modified
|
|
168
|
+
*/
|
|
169
|
+
modifiedAt: number;
|
|
170
|
+
/**
|
|
171
|
+
* Time at which the zone was activated
|
|
172
|
+
*/
|
|
173
|
+
activatedAt: number | null;
|
|
174
|
+
/**
|
|
175
|
+
* The zone's current settings
|
|
176
|
+
*/
|
|
177
|
+
settings: {
|
|
178
|
+
ssl: SSLValue;
|
|
179
|
+
alwaysUseHttps: AlwaysUseHTTPSValue;
|
|
180
|
+
automaticHttpsRewrites: AutomaticHTTPSRewritesValue;
|
|
181
|
+
tls13: TLS13Value;
|
|
182
|
+
earlyHints: EarlyHintsValue;
|
|
183
|
+
emailObfuscation: EmailObfuscationValue;
|
|
184
|
+
browserCacheTtl: number;
|
|
185
|
+
developmentMode: DevelopmentModeValue;
|
|
186
|
+
http2: HTTP2Value;
|
|
187
|
+
http3: HTTP3Value;
|
|
188
|
+
ipv6: IPv6Value;
|
|
189
|
+
websockets: WebSocketsValue;
|
|
190
|
+
zeroRtt: ZeroRTTValue;
|
|
191
|
+
brotli: BrotliValue;
|
|
192
|
+
hotlinkProtection: HotlinkProtectionValue;
|
|
193
|
+
minTlsVersion: MinTLSVersionValue;
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
export declare const Zone: ((this: Context<Zone>, id: string, props: ZoneProps) => Promise<Zone>) | (((this: any, id: string, props: ZoneProps) => never) & (new (_: never) => never));
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { Resource } from "../resource";
|
|
2
|
+
import { createCloudflareApi } from "./api";
|
|
3
|
+
export const Zone = Resource("cloudflare::Zone", async function (id, props) {
|
|
4
|
+
// Create Cloudflare API client with automatic account discovery
|
|
5
|
+
const api = await createCloudflareApi({
|
|
6
|
+
accountId: props.accountId,
|
|
7
|
+
});
|
|
8
|
+
if (this.phase === "delete") {
|
|
9
|
+
if (this.output?.id) {
|
|
10
|
+
// Delete zone
|
|
11
|
+
const deleteResponse = await api.delete(`/zones/${this.output.id}`);
|
|
12
|
+
if (!deleteResponse.ok && deleteResponse.status !== 404) {
|
|
13
|
+
const errorData = await deleteResponse.json().catch(() => ({
|
|
14
|
+
errors: [{ message: deleteResponse.statusText }],
|
|
15
|
+
}));
|
|
16
|
+
throw new Error(`Error deleting zone '${props.name}': ${errorData.errors?.[0]?.message || deleteResponse.statusText}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.warn(`Zone '${props.name}' not found, skipping delete`);
|
|
21
|
+
}
|
|
22
|
+
return this.destroy();
|
|
23
|
+
}
|
|
24
|
+
if (this.phase === "update" && this.output?.id) {
|
|
25
|
+
// Get zone details to verify it exists
|
|
26
|
+
const response = await api.get(`/zones/${this.output.id}`);
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
throw new Error(`Error getting zone '${props.name}': ${response.statusText}`);
|
|
29
|
+
}
|
|
30
|
+
const result = (await response.json());
|
|
31
|
+
const zoneData = result.result;
|
|
32
|
+
// Update zone settings if provided
|
|
33
|
+
if (props.settings) {
|
|
34
|
+
await updateZoneSettings(api, this.output.id, props.settings);
|
|
35
|
+
// Add a small delay to ensure settings are propagated
|
|
36
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
37
|
+
}
|
|
38
|
+
return this({
|
|
39
|
+
id: zoneData.id,
|
|
40
|
+
name: zoneData.name,
|
|
41
|
+
type: zoneData.type,
|
|
42
|
+
status: zoneData.status,
|
|
43
|
+
paused: zoneData.paused,
|
|
44
|
+
accountId: zoneData.account.id,
|
|
45
|
+
nameservers: zoneData.name_servers,
|
|
46
|
+
originalNameservers: zoneData.original_name_servers,
|
|
47
|
+
createdAt: new Date(zoneData.created_on).getTime(),
|
|
48
|
+
modifiedAt: new Date(zoneData.modified_on).getTime(),
|
|
49
|
+
activatedAt: zoneData.activated_on
|
|
50
|
+
? new Date(zoneData.activated_on).getTime()
|
|
51
|
+
: null,
|
|
52
|
+
settings: await getZoneSettings(api, zoneData.id),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Create new zone
|
|
57
|
+
const response = await api.post("/zones", {
|
|
58
|
+
name: props.name,
|
|
59
|
+
type: props.type || "full",
|
|
60
|
+
jump_start: props.jumpStart !== false,
|
|
61
|
+
account: {
|
|
62
|
+
id: api.accountId,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const body = await response.text();
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
if (response.status === 400 && body.includes("already exists")) {
|
|
68
|
+
// TODO: should we error?
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw new Error(`Error creating zone '${props.name}': ${response.statusText}\n${body}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const zoneData = JSON.parse(body).result;
|
|
75
|
+
// Update zone settings if provided
|
|
76
|
+
if (props.settings) {
|
|
77
|
+
await updateZoneSettings(api, zoneData.id, props.settings);
|
|
78
|
+
// Add a small delay to ensure settings are propagated
|
|
79
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
80
|
+
}
|
|
81
|
+
return this({
|
|
82
|
+
id: zoneData.id,
|
|
83
|
+
name: zoneData.name,
|
|
84
|
+
type: zoneData.type,
|
|
85
|
+
status: zoneData.status,
|
|
86
|
+
paused: zoneData.paused,
|
|
87
|
+
accountId: zoneData.account.id,
|
|
88
|
+
nameservers: zoneData.name_servers,
|
|
89
|
+
originalNameservers: zoneData.original_name_servers,
|
|
90
|
+
createdAt: new Date(zoneData.created_on).getTime(),
|
|
91
|
+
modifiedAt: new Date(zoneData.modified_on).getTime(),
|
|
92
|
+
activatedAt: zoneData.activated_on
|
|
93
|
+
? new Date(zoneData.activated_on).getTime()
|
|
94
|
+
: null,
|
|
95
|
+
settings: await getZoneSettings(api, zoneData.id),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
/**
|
|
100
|
+
* Helper function to update zone settings
|
|
101
|
+
*/
|
|
102
|
+
async function updateZoneSettings(api, zoneId, settings) {
|
|
103
|
+
if (!settings)
|
|
104
|
+
return;
|
|
105
|
+
const settingsMap = {
|
|
106
|
+
ssl: "ssl",
|
|
107
|
+
alwaysUseHttps: "always_use_https",
|
|
108
|
+
automaticHttpsRewrites: "automatic_https_rewrites",
|
|
109
|
+
tls13: "tls_1_3",
|
|
110
|
+
earlyHints: "early_hints",
|
|
111
|
+
emailObfuscation: "email_obfuscation",
|
|
112
|
+
browserCacheTtl: "browser_cache_ttl",
|
|
113
|
+
developmentMode: "development_mode",
|
|
114
|
+
http2: "http2",
|
|
115
|
+
http3: "http3",
|
|
116
|
+
ipv6: "ipv6",
|
|
117
|
+
websockets: "websockets",
|
|
118
|
+
zeroRtt: "0rtt",
|
|
119
|
+
brotli: "brotli",
|
|
120
|
+
hotlinkProtection: "hotlink_protection",
|
|
121
|
+
minTlsVersion: "min_tls_version",
|
|
122
|
+
};
|
|
123
|
+
await Promise.all(Object.entries(settings)
|
|
124
|
+
.filter(([_, value]) => value !== undefined)
|
|
125
|
+
.map(async ([key, value]) => {
|
|
126
|
+
const settingId = settingsMap[key];
|
|
127
|
+
if (!settingId)
|
|
128
|
+
return;
|
|
129
|
+
const response = await api.patch(`/zones/${zoneId}/settings/${settingId}`, {
|
|
130
|
+
value,
|
|
131
|
+
});
|
|
132
|
+
if (!response.ok) {
|
|
133
|
+
const data = await response.text();
|
|
134
|
+
if (response.status === 400 && data.includes("already enabled")) {
|
|
135
|
+
console.warn(`Warning: Setting '${key}' already enabled`);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
throw new Error(`Failed to update zone setting ${key}: ${response.statusText}`);
|
|
139
|
+
}
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Helper function to get current zone settings
|
|
144
|
+
*/
|
|
145
|
+
async function getZoneSettings(api, zoneId) {
|
|
146
|
+
const settingsResponse = await api.get(`/zones/${zoneId}/settings`);
|
|
147
|
+
if (!settingsResponse.ok) {
|
|
148
|
+
throw new Error(`Failed to fetch zone settings: ${settingsResponse.status} ${settingsResponse.statusText}`);
|
|
149
|
+
}
|
|
150
|
+
const result = (await settingsResponse.json());
|
|
151
|
+
const settingsData = result.result;
|
|
152
|
+
// Helper to get setting value with default
|
|
153
|
+
const getSetting = (id, defaultValue) => {
|
|
154
|
+
const setting = settingsData.find((s) => s.id === id);
|
|
155
|
+
return setting?.value ?? defaultValue;
|
|
156
|
+
};
|
|
157
|
+
return {
|
|
158
|
+
ssl: getSetting("ssl", "off"),
|
|
159
|
+
alwaysUseHttps: getSetting("always_use_https", "off"),
|
|
160
|
+
automaticHttpsRewrites: getSetting("automatic_https_rewrites", "off"),
|
|
161
|
+
tls13: getSetting("tls_1_3", "off"),
|
|
162
|
+
earlyHints: getSetting("early_hints", "off"),
|
|
163
|
+
emailObfuscation: getSetting("email_obfuscation", "off"),
|
|
164
|
+
browserCacheTtl: getSetting("browser_cache_ttl", 14400),
|
|
165
|
+
developmentMode: getSetting("development_mode", "off"),
|
|
166
|
+
http2: getSetting("http2", "on"),
|
|
167
|
+
http3: getSetting("http3", "on"),
|
|
168
|
+
ipv6: getSetting("ipv6", "on"),
|
|
169
|
+
websockets: getSetting("websockets", "on"),
|
|
170
|
+
zeroRtt: getSetting("0rtt", "off"),
|
|
171
|
+
brotli: getSetting("brotli", "on"),
|
|
172
|
+
hotlinkProtection: getSetting("hotlink_protection", "off"),
|
|
173
|
+
minTlsVersion: getSetting("min_tls_version", "1.0"),
|
|
174
|
+
};
|
|
175
|
+
}
|
package/lib/context.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Resource, ResourceFQN, ResourceID, ResourceKind, ResourceProps } from "./resource";
|
|
2
|
+
import type { Scope } from "./scope";
|
|
3
|
+
import type { State } from "./state";
|
|
4
|
+
export type Context<Out extends Resource> = CreateContext<Out> | UpdateContext<Out> | DeleteContext<Out>;
|
|
5
|
+
export interface CreateContext<Out extends Resource> extends BaseContext<Out> {
|
|
6
|
+
phase: "create";
|
|
7
|
+
output?: undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface UpdateContext<Out extends Resource> extends BaseContext<Out> {
|
|
10
|
+
phase: "update";
|
|
11
|
+
output: Out;
|
|
12
|
+
}
|
|
13
|
+
export interface DeleteContext<Out extends Resource> extends BaseContext<Out> {
|
|
14
|
+
phase: "delete";
|
|
15
|
+
output: Out;
|
|
16
|
+
}
|
|
17
|
+
export interface BaseContext<Out extends Resource> {
|
|
18
|
+
quiet: boolean;
|
|
19
|
+
stage: string;
|
|
20
|
+
id: ResourceID;
|
|
21
|
+
fqn: ResourceFQN;
|
|
22
|
+
scope: Scope;
|
|
23
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
24
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
25
|
+
delete<T>(key: string): Promise<T | undefined>;
|
|
26
|
+
/**
|
|
27
|
+
* Indicate that this resource is being replaced.
|
|
28
|
+
* This will cause the resource to be deleted at the end of the stack's CREATE phase.
|
|
29
|
+
*/
|
|
30
|
+
replace(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Terminate the resource lifecycle handler and destroy the resource.
|
|
33
|
+
*
|
|
34
|
+
* This is the final operation performed during a delete operation.
|
|
35
|
+
*
|
|
36
|
+
* It is so that the resource lifecycle handler can "return never" instead of
|
|
37
|
+
* "return undefined" so that `await MyResource()` always returns a value.
|
|
38
|
+
*/
|
|
39
|
+
destroy(): never;
|
|
40
|
+
/**
|
|
41
|
+
* Create the Resource envelope (with Alchemy + User properties)
|
|
42
|
+
*/
|
|
43
|
+
create(props: Omit<Out, keyof Resource>): Out;
|
|
44
|
+
/**
|
|
45
|
+
* Create the Resource envelope (with Alchemy + User properties)
|
|
46
|
+
*/
|
|
47
|
+
(props: Omit<Out, keyof Resource>): Out;
|
|
48
|
+
}
|
|
49
|
+
export declare function context<Kind extends string, Props extends ResourceProps, Out extends Resource>({ scope, phase, kind, id, fqn, seq, state, replace, }: {
|
|
50
|
+
scope: Scope;
|
|
51
|
+
phase: "create" | "update" | "delete";
|
|
52
|
+
kind: ResourceKind;
|
|
53
|
+
id: ResourceID;
|
|
54
|
+
fqn: ResourceFQN;
|
|
55
|
+
seq: number;
|
|
56
|
+
state: State<Kind, Props, Out>;
|
|
57
|
+
replace: () => void;
|
|
58
|
+
}): Context<Out>;
|
package/lib/context.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { DestroyedSignal } from "./destroy";
|
|
2
|
+
export function context({ scope, phase, kind, id, fqn, seq, state, replace, }) {
|
|
3
|
+
function create(props) {
|
|
4
|
+
return {
|
|
5
|
+
...props,
|
|
6
|
+
Kind: kind,
|
|
7
|
+
ID: id,
|
|
8
|
+
FQN: fqn,
|
|
9
|
+
Scope: scope,
|
|
10
|
+
Seq: seq,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
return Object.assign(create, {
|
|
14
|
+
stage: scope.stage,
|
|
15
|
+
scope,
|
|
16
|
+
id: id,
|
|
17
|
+
fqn: fqn,
|
|
18
|
+
phase,
|
|
19
|
+
output: state.output,
|
|
20
|
+
replace,
|
|
21
|
+
get: (key) => state.data[key],
|
|
22
|
+
set: async (key, value) => {
|
|
23
|
+
state.data[key] = value;
|
|
24
|
+
},
|
|
25
|
+
delete: async (key) => {
|
|
26
|
+
const value = state.data[key];
|
|
27
|
+
delete state.data[key];
|
|
28
|
+
return value;
|
|
29
|
+
},
|
|
30
|
+
quiet: scope.quiet,
|
|
31
|
+
destroy: () => {
|
|
32
|
+
throw new DestroyedSignal();
|
|
33
|
+
},
|
|
34
|
+
create,
|
|
35
|
+
});
|
|
36
|
+
}
|
package/lib/destroy.d.ts
CHANGED
|
@@ -1,19 +1,16 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { type Resource } from "./resource";
|
|
2
|
+
import { Scope } from "./scope";
|
|
3
|
+
export declare class DestroyedSignal extends Error {
|
|
4
|
+
}
|
|
5
5
|
export interface DestroyOptions {
|
|
6
|
-
stage?: string;
|
|
7
|
-
stateStore?: StateStore;
|
|
8
|
-
scope?: Scope;
|
|
9
6
|
quiet?: boolean;
|
|
7
|
+
strategy?: "sequential" | "parallel";
|
|
10
8
|
}
|
|
11
9
|
/**
|
|
12
10
|
* Prune all resources from an Output and "down", i.e. that branches from it.
|
|
13
11
|
*/
|
|
14
|
-
export declare function destroy<
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
//# sourceMappingURL=destroy.d.ts.map
|
|
12
|
+
export declare function destroy<Type extends string>(...args: [scope: Scope, options?: DestroyOptions] | [resource: Resource<Type> | undefined | null, options?: DestroyOptions]): Promise<void>;
|
|
13
|
+
export declare namespace destroy {
|
|
14
|
+
function all(resources: Resource[], options?: DestroyOptions): Promise<void>;
|
|
15
|
+
function sequentially(...resources: (Resource<string> | undefined | null)[]): Promise<void>;
|
|
16
|
+
}
|
package/lib/destroy.js
CHANGED
|
@@ -1,54 +1,115 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { alchemy } from "./alchemy";
|
|
2
|
+
import { context } from "./context";
|
|
3
|
+
import { PROVIDERS } from "./resource";
|
|
4
|
+
import { Scope } from "./scope";
|
|
5
|
+
export class DestroyedSignal extends Error {
|
|
6
|
+
}
|
|
7
|
+
function isScopeArgs(a) {
|
|
8
|
+
return a[0] instanceof Scope;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Prune all resources from an Output and "down", i.e. that branches from it.
|
|
12
|
+
*/
|
|
4
13
|
export async function destroy(...args) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
else if (isResource(args[0])) {
|
|
22
|
-
const resource = args[0];
|
|
23
|
-
// stage = args[1]?.stage ?? defaultStage;
|
|
24
|
-
resourceID = resource[ResourceID];
|
|
25
|
-
stage = args[1]?.stage ?? defaultStage;
|
|
26
|
-
scope = args[1]?.scope ?? rootScope;
|
|
27
|
-
const statePath = scope.getScopePath(stage);
|
|
28
|
-
stateStore = args[1]?.stateStore ?? new defaultStateStore(statePath);
|
|
29
|
-
// First destroy all dependencies
|
|
30
|
-
const _resourceState = await stateStore.get(resourceID);
|
|
31
|
-
if (_resourceState === undefined) {
|
|
32
|
-
// we have no record of this resource, we must assume it's already deleted
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
resourceState = _resourceState;
|
|
36
|
-
resourceProvider = resource[Provider];
|
|
37
|
-
options = args[1];
|
|
14
|
+
if (isScopeArgs(args)) {
|
|
15
|
+
const [scope, options] = args;
|
|
16
|
+
const strategy = options?.strategy ?? "sequential";
|
|
17
|
+
// destroy all active resources
|
|
18
|
+
await destroy.all(Array.from(scope.resources.values()), {
|
|
19
|
+
strategy,
|
|
20
|
+
});
|
|
21
|
+
// then detect orphans and destroy them
|
|
22
|
+
const orphans = await scope.state.all();
|
|
23
|
+
await destroy.all(Object.values(orphans).map((orphan) => ({
|
|
24
|
+
...orphan.output,
|
|
25
|
+
Scope: scope,
|
|
26
|
+
})), options);
|
|
27
|
+
// finally, destroy the scope container
|
|
28
|
+
await scope.deinit();
|
|
29
|
+
return;
|
|
38
30
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
const [instance, options] = args;
|
|
32
|
+
if (!instance) {
|
|
33
|
+
return;
|
|
42
34
|
}
|
|
35
|
+
const Provider = PROVIDERS.get(instance.Kind);
|
|
36
|
+
if (!Provider) {
|
|
37
|
+
throw new Error(`Cannot destroy resource type ${instance.Kind} - no provider found. You may need to import the provider in your alchemy.config.ts.`);
|
|
38
|
+
}
|
|
39
|
+
const scope = instance.Scope;
|
|
40
|
+
if (!scope) {
|
|
41
|
+
console.warn(`Resource "${instance.FQN}" has no scope`);
|
|
42
|
+
}
|
|
43
|
+
const quiet = options?.quiet ?? scope.quiet;
|
|
43
44
|
try {
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
if (!quiet) {
|
|
46
|
+
console.log(`Delete: "${instance.FQN}"`);
|
|
47
|
+
}
|
|
48
|
+
const state = (await scope.state.get(instance.ID));
|
|
49
|
+
if (state === undefined) {
|
|
50
|
+
console.warn(`Resource "${instance.FQN}" not found`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const ctx = context({
|
|
54
|
+
scope,
|
|
55
|
+
phase: "delete",
|
|
56
|
+
kind: instance.Kind,
|
|
57
|
+
id: instance.ID,
|
|
58
|
+
fqn: instance.FQN,
|
|
59
|
+
seq: instance.Seq,
|
|
60
|
+
state,
|
|
61
|
+
replace: () => {
|
|
62
|
+
throw new Error("Cannot replace a resource that is being deleted");
|
|
63
|
+
},
|
|
46
64
|
});
|
|
65
|
+
let nestedScope;
|
|
66
|
+
try {
|
|
67
|
+
// BUG: this does not restore persisted scope
|
|
68
|
+
await alchemy.run(instance.ID, async (scope) => {
|
|
69
|
+
nestedScope = scope;
|
|
70
|
+
return await Provider.handler.bind(ctx)(instance.ID, state.props);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
if (err instanceof DestroyedSignal) {
|
|
75
|
+
// TODO: should we fail if the DestroyedSignal is not thrown?
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (nestedScope) {
|
|
82
|
+
await destroy(nestedScope, options);
|
|
83
|
+
}
|
|
84
|
+
await scope.delete(instance.ID);
|
|
85
|
+
if (!quiet) {
|
|
86
|
+
console.log(`Deleted: "${instance.FQN}"`);
|
|
87
|
+
}
|
|
47
88
|
}
|
|
48
89
|
catch (error) {
|
|
49
90
|
console.error(error);
|
|
50
91
|
throw error;
|
|
51
92
|
}
|
|
52
|
-
await stateStore.delete(resourceID);
|
|
53
93
|
}
|
|
54
|
-
|
|
94
|
+
(function (destroy) {
|
|
95
|
+
async function all(resources, options) {
|
|
96
|
+
if (options?.strategy !== "parallel") {
|
|
97
|
+
const sorted = resources.sort((a, b) => b.Seq - a.Seq);
|
|
98
|
+
for (const resource of sorted) {
|
|
99
|
+
await destroy(resource);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
await Promise.all(resources.map((resource) => destroy(resource, options)));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
destroy.all = all;
|
|
107
|
+
async function sequentially(...resources) {
|
|
108
|
+
for (const resource of resources) {
|
|
109
|
+
if (resource) {
|
|
110
|
+
await destroy(resource);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
destroy.sequentially = sequentially;
|
|
115
|
+
})(destroy || (destroy = {}));
|