alchemy 0.1.16 → 0.1.17
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/lib/$.d.ts +12 -0
- package/lib/$.d.ts.map +1 -0
- package/lib/$.js +42 -0
- package/lib/$.js.map +1 -0
- package/lib/alchemize.d.ts +43 -0
- package/lib/alchemize.d.ts.map +1 -0
- package/lib/alchemize.js +112 -0
- package/lib/alchemize.js.map +1 -0
- package/lib/apply.d.ts +23 -0
- package/lib/aws/account-id.d.ts +5 -0
- package/lib/aws/account-id.d.ts.map +1 -0
- package/lib/aws/account-id.js +10 -0
- package/lib/aws/account-id.js.map +1 -0
- package/lib/aws/bucket.d.ts +21 -0
- package/lib/aws/bucket.d.ts.map +1 -0
- package/lib/aws/bucket.js +114 -0
- package/lib/aws/bucket.js.map +1 -0
- package/lib/aws/function.d.ts +53 -0
- package/lib/aws/function.d.ts.map +1 -0
- package/lib/aws/function.js +195 -0
- package/lib/aws/function.js.map +1 -0
- package/lib/aws/index.d.ts +9 -0
- package/lib/aws/index.d.ts.map +1 -0
- package/lib/aws/index.js +9 -0
- package/lib/aws/index.js.map +1 -0
- package/lib/aws/oidc/github-oidc-provider.d.ts +11 -0
- package/lib/aws/oidc/github-oidc-provider.d.ts.map +1 -0
- package/lib/aws/oidc/github-oidc-provider.js +22 -0
- package/lib/aws/oidc/github-oidc-provider.js.map +1 -0
- package/lib/aws/oidc/index.d.ts +3 -0
- package/lib/aws/oidc/index.d.ts.map +1 -0
- package/lib/aws/oidc/index.js +3 -0
- package/lib/aws/oidc/index.js.map +1 -0
- package/lib/aws/oidc/oidc-provider.d.ts +60 -0
- package/lib/aws/oidc/oidc-provider.d.ts.map +1 -0
- package/lib/aws/oidc/oidc-provider.js +140 -0
- package/lib/aws/oidc/oidc-provider.js.map +1 -0
- package/lib/aws/policy.d.ts +46 -0
- package/lib/aws/policy.d.ts.map +1 -0
- package/lib/aws/policy.js +139 -0
- package/lib/aws/policy.js.map +1 -0
- package/lib/aws/queue.d.ts +62 -0
- package/lib/aws/queue.d.ts.map +1 -0
- package/lib/aws/queue.js +167 -0
- package/lib/aws/queue.js.map +1 -0
- package/lib/aws/role.d.ts +27 -0
- package/lib/aws/role.d.ts.map +1 -0
- package/lib/aws/role.js +197 -0
- package/lib/aws/role.js.map +1 -0
- package/lib/aws/ses.d.ts +75 -0
- package/lib/aws/ses.d.ts.map +1 -0
- package/lib/aws/ses.js +189 -0
- package/lib/aws/ses.js.map +1 -0
- package/lib/aws/table.d.ts +26 -0
- package/lib/aws/table.d.ts.map +1 -0
- package/lib/aws/table.js +154 -0
- package/lib/aws/table.js.map +1 -0
- package/lib/cloudflare/api.d.ts +88 -0
- package/lib/cloudflare/api.d.ts.map +1 -0
- package/lib/cloudflare/api.js +184 -0
- package/lib/cloudflare/api.js.map +1 -0
- package/lib/cloudflare/asset-manifest.d.ts +15 -0
- package/lib/cloudflare/asset-manifest.d.ts.map +1 -0
- package/lib/cloudflare/asset-manifest.js +2 -0
- package/lib/cloudflare/asset-manifest.js.map +1 -0
- package/lib/cloudflare/auth.d.ts +52 -0
- package/lib/cloudflare/auth.d.ts.map +1 -0
- package/lib/cloudflare/auth.js +114 -0
- package/lib/cloudflare/auth.js.map +1 -0
- package/lib/cloudflare/bindings.d.ts +260 -0
- package/lib/cloudflare/bindings.d.ts.map +1 -0
- package/lib/cloudflare/bindings.js +2 -0
- package/lib/cloudflare/bindings.js.map +1 -0
- package/lib/cloudflare/bucket.d.ts +54 -0
- package/lib/cloudflare/bucket.d.ts.map +1 -0
- package/lib/cloudflare/bucket.js +120 -0
- package/lib/cloudflare/bucket.js.map +1 -0
- package/lib/cloudflare/durable-object-namespace.d.ts +20 -0
- package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -0
- package/lib/cloudflare/durable-object-namespace.js +21 -0
- package/lib/cloudflare/durable-object-namespace.js.map +1 -0
- package/lib/cloudflare/generate-asset-manifest.d.ts +3 -0
- package/lib/cloudflare/generate-asset-manifest.d.ts.map +1 -0
- package/lib/cloudflare/generate-asset-manifest.js +69 -0
- package/lib/cloudflare/generate-asset-manifest.js.map +1 -0
- package/lib/cloudflare/index.d.ts +8 -0
- package/lib/cloudflare/index.d.ts.map +1 -0
- package/lib/cloudflare/index.js +8 -0
- package/lib/cloudflare/index.js.map +1 -0
- package/lib/cloudflare/kv-namespace.d.ts +64 -0
- package/lib/cloudflare/kv-namespace.d.ts.map +1 -0
- package/lib/cloudflare/kv-namespace.js +114 -0
- package/lib/cloudflare/kv-namespace.js.map +1 -0
- package/lib/cloudflare/state.d.ts +83 -0
- package/lib/cloudflare/state.d.ts.map +1 -0
- package/lib/cloudflare/state.js +109 -0
- package/lib/cloudflare/state.js.map +1 -0
- package/lib/cloudflare/static-site-router.d.ts +19 -0
- package/lib/cloudflare/static-site-router.d.ts.map +1 -0
- package/lib/cloudflare/static-site-router.js +110 -0
- package/lib/cloudflare/static-site-router.js.map +1 -0
- package/lib/cloudflare/static-site.d.ts +166 -0
- package/lib/cloudflare/static-site.d.ts.map +1 -0
- package/lib/cloudflare/static-site.js +161 -0
- package/lib/cloudflare/static-site.js.map +1 -0
- package/lib/cloudflare/types.d.ts +52 -0
- package/lib/cloudflare/types.d.ts.map +1 -0
- package/lib/cloudflare/types.js +21 -0
- package/lib/cloudflare/types.js.map +1 -0
- package/lib/cloudflare/upload-asset-manifest.d.ts +12 -0
- package/lib/cloudflare/upload-asset-manifest.d.ts.map +1 -0
- package/lib/cloudflare/upload-asset-manifest.js +55 -0
- package/lib/cloudflare/upload-asset-manifest.js.map +1 -0
- package/lib/cloudflare/worker-metadata.d.ts +130 -0
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -0
- package/lib/cloudflare/worker-metadata.js +2 -0
- package/lib/cloudflare/worker-metadata.js.map +1 -0
- package/lib/cloudflare/worker-migration.d.ts +110 -0
- package/lib/cloudflare/worker-migration.d.ts.map +1 -0
- package/lib/cloudflare/worker-migration.js +11 -0
- package/lib/cloudflare/worker-migration.js.map +1 -0
- package/lib/cloudflare/worker.d.ts +108 -0
- package/lib/cloudflare/worker.d.ts.map +1 -0
- package/lib/cloudflare/worker.js +407 -0
- package/lib/cloudflare/worker.js.map +1 -0
- package/lib/destroy.d.ts +19 -0
- package/lib/error.d.ts +2 -0
- package/lib/error.d.ts.map +1 -0
- package/lib/error.js +13 -0
- package/lib/error.js.map +1 -0
- package/lib/esbuild.d.ts +152 -0
- package/lib/esbuild.d.ts.map +1 -0
- package/lib/esbuild.js +67 -0
- package/lib/esbuild.js.map +1 -0
- package/lib/fs.d.ts +12 -0
- package/lib/fs.d.ts.map +1 -0
- package/lib/fs.js +41 -0
- package/lib/fs.js.map +1 -0
- package/lib/github/client.d.ts +34 -0
- package/lib/github/client.d.ts.map +1 -0
- package/lib/github/client.js +91 -0
- package/lib/github/client.js.map +1 -0
- package/lib/github/index.d.ts +2 -0
- package/lib/github/index.d.ts.map +1 -0
- package/lib/github/index.js +2 -0
- package/lib/github/index.js.map +1 -0
- package/lib/github/secret.d.ts +46 -0
- package/lib/github/secret.d.ts.map +1 -0
- package/lib/github/secret.js +103 -0
- package/lib/github/secret.js.map +1 -0
- package/lib/global.d.ts +16 -0
- package/lib/global.d.ts.map +1 -0
- package/lib/global.js +42 -0
- package/lib/global.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -0
- package/lib/input.d.ts +6 -0
- package/lib/input.d.ts.map +1 -0
- package/lib/input.js +2 -0
- package/lib/input.js.map +1 -0
- package/lib/main.d.ts +3 -0
- package/lib/main.d.ts.map +1 -0
- package/lib/main.js +32 -0
- package/lib/main.js.map +1 -0
- package/lib/output.d.ts +24 -0
- package/lib/output.d.ts.map +1 -0
- package/lib/output.js +23 -0
- package/lib/output.js.map +1 -0
- package/lib/print.d.ts +7 -0
- package/lib/print.d.ts.map +1 -0
- package/lib/print.js +10 -0
- package/lib/print.js.map +1 -0
- package/lib/resource.d.ts +71 -0
- package/lib/resource.d.ts.map +1 -0
- package/lib/resource.js +276 -0
- package/lib/resource.js.map +1 -0
- package/lib/scope.d.ts +18 -0
- package/lib/scope.d.ts.map +1 -0
- package/lib/scope.js +30 -0
- package/lib/scope.js.map +1 -0
- package/lib/slug.d.ts +2 -0
- package/lib/slug.d.ts.map +1 -0
- package/lib/slug.js +4 -0
- package/lib/slug.js.map +1 -0
- package/lib/state.d.ts +40 -0
- package/lib/state.d.ts.map +1 -0
- package/lib/state.js +73 -0
- package/lib/state.js.map +1 -0
- package/lib/stripe/index.d.ts +4 -0
- package/lib/stripe/index.d.ts.map +1 -0
- package/lib/stripe/index.js +4 -0
- package/lib/stripe/index.js.map +1 -0
- package/lib/stripe/price.d.ts +109 -0
- package/lib/stripe/price.d.ts.map +1 -0
- package/lib/stripe/price.js +112 -0
- package/lib/stripe/price.js.map +1 -0
- package/lib/stripe/product.d.ts +86 -0
- package/lib/stripe/product.d.ts.map +1 -0
- package/lib/stripe/product.js +90 -0
- package/lib/stripe/product.js.map +1 -0
- package/lib/stripe/webhook.d.ts +73 -0
- package/lib/stripe/webhook.d.ts.map +1 -0
- package/lib/stripe/webhook.js +94 -0
- package/lib/stripe/webhook.js.map +1 -0
- package/lib/utils/content-type.d.ts +8 -0
- package/lib/utils/content-type.d.ts.map +1 -0
- package/lib/utils/content-type.js +41 -0
- package/lib/utils/content-type.js.map +1 -0
- package/lib/utils/retry.d.ts +13 -0
- package/lib/utils/retry.d.ts.map +1 -0
- package/lib/utils/retry.js +32 -0
- package/lib/utils/retry.js.map +1 -0
- package/package.json +1 -1
- package/src/cloudflare/bindings.ts +7 -1
- package/src/cloudflare/bucket.ts +240 -0
- package/src/cloudflare/index.ts +1 -0
- package/src/cloudflare/static-site.ts +13 -1
- package/src/cloudflare/worker.ts +7 -0
package/lib/aws/ses.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type DeliveryOptions, type ReputationOptions, type SendingOptions, type SuppressionOptions, type TrackingOptions } from "@aws-sdk/client-sesv2";
|
|
2
|
+
/**
|
|
3
|
+
* Properties for configuring AWS SES resources
|
|
4
|
+
*/
|
|
5
|
+
export interface SESProps {
|
|
6
|
+
/**
|
|
7
|
+
* Name of the configuration set
|
|
8
|
+
*/
|
|
9
|
+
configurationSetName?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Email identity to verify (email address or domain)
|
|
12
|
+
*/
|
|
13
|
+
emailIdentity?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Whether to enable DKIM signing for the email identity
|
|
16
|
+
*/
|
|
17
|
+
enableDkim?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Sending options for the configuration set
|
|
20
|
+
*/
|
|
21
|
+
sendingOptions?: SendingOptions;
|
|
22
|
+
/**
|
|
23
|
+
* Reputation options for the configuration set
|
|
24
|
+
*/
|
|
25
|
+
reputationOptions?: ReputationOptions;
|
|
26
|
+
/**
|
|
27
|
+
* Tracking options for the configuration set
|
|
28
|
+
*/
|
|
29
|
+
trackingOptions?: TrackingOptions;
|
|
30
|
+
/**
|
|
31
|
+
* Suppression options for the configuration set
|
|
32
|
+
*/
|
|
33
|
+
suppressionOptions?: SuppressionOptions;
|
|
34
|
+
/**
|
|
35
|
+
* Delivery options for the configuration set
|
|
36
|
+
*/
|
|
37
|
+
deliveryOptions?: DeliveryOptions;
|
|
38
|
+
/**
|
|
39
|
+
* Tags to apply to the SES resources
|
|
40
|
+
*/
|
|
41
|
+
tags?: Record<string, string>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Output returned after SES resource creation/update
|
|
45
|
+
*/
|
|
46
|
+
export interface SESOutput extends SESProps {
|
|
47
|
+
/**
|
|
48
|
+
* Resource ID
|
|
49
|
+
*/
|
|
50
|
+
id: string;
|
|
51
|
+
/**
|
|
52
|
+
* ARN of the configuration set if created
|
|
53
|
+
*/
|
|
54
|
+
configurationSetArn?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Email identity verification status if an identity was created
|
|
57
|
+
*/
|
|
58
|
+
emailIdentityVerificationStatus?: string;
|
|
59
|
+
/**
|
|
60
|
+
* DKIM verification status if DKIM was enabled
|
|
61
|
+
*/
|
|
62
|
+
dkimVerificationStatus?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Email identity ARN if an identity was created
|
|
65
|
+
*/
|
|
66
|
+
emailIdentityArn?: string;
|
|
67
|
+
}
|
|
68
|
+
declare const SES_base: import("../resource").Provider<"aws::SES", [props: SESProps], SESOutput>;
|
|
69
|
+
/**
|
|
70
|
+
* AWS SES resource for creating and configuring Simple Email Service
|
|
71
|
+
*/
|
|
72
|
+
export declare class SES extends SES_base {
|
|
73
|
+
}
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=ses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ses.d.ts","sourceRoot":"","sources":["../../src/aws/ses.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,eAAe,EAUpB,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;OAEG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAEtC;;OAEG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC;;OAEG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IAExC;;OAEG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,+BAA+B,CAAC,EAAE,MAAM,CAAC;IAEzC;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;;AAED;;GAEG;AACH,qBAAa,GAAI,SAAQ,QA0OxB;CAAG"}
|
package/lib/aws/ses.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { CreateConfigurationSetCommand, CreateEmailIdentityCommand, DeleteConfigurationSetCommand, DeleteEmailIdentityCommand, GetConfigurationSetCommand, GetEmailIdentityCommand, NotFoundException, PutConfigurationSetDeliveryOptionsCommand, PutConfigurationSetReputationOptionsCommand, PutConfigurationSetSendingOptionsCommand, PutConfigurationSetSuppressionOptionsCommand, PutConfigurationSetTrackingOptionsCommand, PutEmailIdentityDkimAttributesCommand, SESv2Client, } from "@aws-sdk/client-sesv2";
|
|
2
|
+
import { ignore } from "../error";
|
|
3
|
+
import { Resource } from "../resource";
|
|
4
|
+
/**
|
|
5
|
+
* AWS SES resource for creating and configuring Simple Email Service
|
|
6
|
+
*/
|
|
7
|
+
export class SES extends Resource("aws::SES", async (ctx, props) => {
|
|
8
|
+
// Create SES client
|
|
9
|
+
const client = new SESv2Client({});
|
|
10
|
+
// Resource ID is either based on the configuration set name or email identity
|
|
11
|
+
const id = props.configurationSetName || props.emailIdentity || ctx.resourceID;
|
|
12
|
+
// Handle deletion
|
|
13
|
+
if (ctx.event === "delete") {
|
|
14
|
+
const output = ctx.output;
|
|
15
|
+
// Delete configuration set if it exists
|
|
16
|
+
if (output?.configurationSetName) {
|
|
17
|
+
await ignore(NotFoundException.name, () => client.send(new DeleteConfigurationSetCommand({
|
|
18
|
+
ConfigurationSetName: output.configurationSetName,
|
|
19
|
+
})));
|
|
20
|
+
}
|
|
21
|
+
// Delete email identity if it exists
|
|
22
|
+
if (output?.emailIdentity) {
|
|
23
|
+
await ignore(NotFoundException.name, () => client.send(new DeleteEmailIdentityCommand({
|
|
24
|
+
EmailIdentity: output.emailIdentity,
|
|
25
|
+
})));
|
|
26
|
+
}
|
|
27
|
+
// Return empty output for delete
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Created resources
|
|
31
|
+
let configurationSetArn;
|
|
32
|
+
let emailIdentityArn;
|
|
33
|
+
let emailIdentityVerificationStatus;
|
|
34
|
+
let dkimVerificationStatus;
|
|
35
|
+
// Create or update configuration set if specified
|
|
36
|
+
if (props.configurationSetName) {
|
|
37
|
+
try {
|
|
38
|
+
// Check if configuration set exists
|
|
39
|
+
let configSetExists = false;
|
|
40
|
+
try {
|
|
41
|
+
await client.send(new GetConfigurationSetCommand({
|
|
42
|
+
ConfigurationSetName: props.configurationSetName,
|
|
43
|
+
}));
|
|
44
|
+
configSetExists = true;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (error instanceof NotFoundException) {
|
|
48
|
+
configSetExists = false;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (configSetExists) {
|
|
55
|
+
// Update existing configuration set using appropriate update commands
|
|
56
|
+
if (props.sendingOptions) {
|
|
57
|
+
await client.send(new PutConfigurationSetSendingOptionsCommand({
|
|
58
|
+
ConfigurationSetName: props.configurationSetName,
|
|
59
|
+
SendingEnabled: props.sendingOptions.SendingEnabled,
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
if (props.reputationOptions) {
|
|
63
|
+
await client.send(new PutConfigurationSetReputationOptionsCommand({
|
|
64
|
+
ConfigurationSetName: props.configurationSetName,
|
|
65
|
+
ReputationMetricsEnabled: props.reputationOptions.ReputationMetricsEnabled,
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
if (props.trackingOptions) {
|
|
69
|
+
await client.send(new PutConfigurationSetTrackingOptionsCommand({
|
|
70
|
+
ConfigurationSetName: props.configurationSetName,
|
|
71
|
+
CustomRedirectDomain: props.trackingOptions.CustomRedirectDomain,
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
if (props.suppressionOptions) {
|
|
75
|
+
await client.send(new PutConfigurationSetSuppressionOptionsCommand({
|
|
76
|
+
ConfigurationSetName: props.configurationSetName,
|
|
77
|
+
SuppressedReasons: props.suppressionOptions.SuppressedReasons,
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
if (props.deliveryOptions) {
|
|
81
|
+
await client.send(new PutConfigurationSetDeliveryOptionsCommand({
|
|
82
|
+
ConfigurationSetName: props.configurationSetName,
|
|
83
|
+
TlsPolicy: props.deliveryOptions.TlsPolicy,
|
|
84
|
+
SendingPoolName: props.deliveryOptions.SendingPoolName,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
// In SESv2, the ARN isn't directly returned in the response
|
|
88
|
+
configurationSetArn = `arn:aws:ses:${process.env.AWS_REGION}:${process.env.AWS_ACCOUNT_ID}:configuration-set/${props.configurationSetName}`;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Create new configuration set
|
|
92
|
+
await client.send(new CreateConfigurationSetCommand({
|
|
93
|
+
ConfigurationSetName: props.configurationSetName,
|
|
94
|
+
SendingOptions: props.sendingOptions,
|
|
95
|
+
ReputationOptions: props.reputationOptions,
|
|
96
|
+
TrackingOptions: props.trackingOptions,
|
|
97
|
+
SuppressionOptions: props.suppressionOptions,
|
|
98
|
+
DeliveryOptions: props.deliveryOptions,
|
|
99
|
+
Tags: Object.entries(props.tags || {}).map(([Key, Value]) => ({
|
|
100
|
+
Key,
|
|
101
|
+
Value,
|
|
102
|
+
})),
|
|
103
|
+
}));
|
|
104
|
+
// In SESv2, the ARN isn't directly returned in the response
|
|
105
|
+
configurationSetArn = `arn:aws:ses:${process.env.AWS_REGION}:${process.env.AWS_ACCOUNT_ID}:configuration-set/${props.configurationSetName}`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Create or verify email identity if specified
|
|
113
|
+
if (props.emailIdentity) {
|
|
114
|
+
try {
|
|
115
|
+
// Check if identity exists
|
|
116
|
+
let getIdentityResult;
|
|
117
|
+
try {
|
|
118
|
+
getIdentityResult = await client.send(new GetEmailIdentityCommand({
|
|
119
|
+
EmailIdentity: props.emailIdentity,
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (error instanceof NotFoundException) {
|
|
124
|
+
getIdentityResult = null;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!getIdentityResult) {
|
|
131
|
+
// Create new email identity
|
|
132
|
+
const createIdentityResult = await client.send(new CreateEmailIdentityCommand({
|
|
133
|
+
EmailIdentity: props.emailIdentity,
|
|
134
|
+
Tags: Object.entries(props.tags || {}).map(([Key, Value]) => ({
|
|
135
|
+
Key,
|
|
136
|
+
Value,
|
|
137
|
+
})),
|
|
138
|
+
}));
|
|
139
|
+
// If it's an email address, we don't need to explicitly verify in v2
|
|
140
|
+
// The verification email is automatically sent by SES in v2
|
|
141
|
+
// Store the identity information
|
|
142
|
+
emailIdentityArn = `arn:aws:ses:${process.env.AWS_REGION}:${process.env.AWS_ACCOUNT_ID}:identity/${props.emailIdentity}`;
|
|
143
|
+
emailIdentityVerificationStatus =
|
|
144
|
+
createIdentityResult.VerifiedForSendingStatus
|
|
145
|
+
? "VERIFIED"
|
|
146
|
+
: "PENDING";
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Store the identity information
|
|
150
|
+
emailIdentityArn = `arn:aws:ses:${process.env.AWS_REGION}:${process.env.AWS_ACCOUNT_ID}:identity/${props.emailIdentity}`;
|
|
151
|
+
emailIdentityVerificationStatus =
|
|
152
|
+
getIdentityResult.VerifiedForSendingStatus ? "VERIFIED" : "PENDING";
|
|
153
|
+
// Update DKIM settings if requested
|
|
154
|
+
if (props.enableDkim !== undefined) {
|
|
155
|
+
if (props.enableDkim) {
|
|
156
|
+
await client.send(new PutEmailIdentityDkimAttributesCommand({
|
|
157
|
+
EmailIdentity: props.emailIdentity,
|
|
158
|
+
SigningEnabled: true,
|
|
159
|
+
}));
|
|
160
|
+
// We can check the current status of DKIM
|
|
161
|
+
dkimVerificationStatus = "PENDING"; // Default to pending
|
|
162
|
+
// Get the updated identity to check DKIM status
|
|
163
|
+
const updatedIdentity = await client.send(new GetEmailIdentityCommand({
|
|
164
|
+
EmailIdentity: props.emailIdentity,
|
|
165
|
+
}));
|
|
166
|
+
if (updatedIdentity.DkimAttributes?.Status) {
|
|
167
|
+
dkimVerificationStatus = updatedIdentity.DkimAttributes.Status;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
console.error(`Error configuring email identity ${props.emailIdentity}:`, error);
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Return the resource output
|
|
179
|
+
return {
|
|
180
|
+
...props,
|
|
181
|
+
id,
|
|
182
|
+
configurationSetArn,
|
|
183
|
+
emailIdentityArn,
|
|
184
|
+
emailIdentityVerificationStatus,
|
|
185
|
+
dkimVerificationStatus,
|
|
186
|
+
};
|
|
187
|
+
}) {
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=ses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ses.js","sourceRoot":"","sources":["../../src/aws/ses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface TableProps {
|
|
2
|
+
tableName: string;
|
|
3
|
+
partitionKey: {
|
|
4
|
+
name: string;
|
|
5
|
+
type: "S" | "N" | "B";
|
|
6
|
+
};
|
|
7
|
+
sortKey?: {
|
|
8
|
+
name: string;
|
|
9
|
+
type: "S" | "N" | "B";
|
|
10
|
+
};
|
|
11
|
+
billingMode?: "PROVISIONED" | "PAY_PER_REQUEST";
|
|
12
|
+
readCapacity?: number;
|
|
13
|
+
writeCapacity?: number;
|
|
14
|
+
tags?: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export interface TableOutput extends TableProps {
|
|
17
|
+
id: string;
|
|
18
|
+
arn: string;
|
|
19
|
+
streamArn?: string;
|
|
20
|
+
tableId: string;
|
|
21
|
+
}
|
|
22
|
+
declare const Table_base: import("../resource").Provider<"dynamo::Table", [props: TableProps], TableOutput>;
|
|
23
|
+
export declare class Table extends Table_base {
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/aws/table.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;KACvB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;KACvB,CAAC;IACF,WAAW,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;;AAED,qBAAa,KAAM,SAAQ,UA2L1B;CAAG"}
|
package/lib/aws/table.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { CreateTableCommand, DeleteTableCommand, DescribeTableCommand, DynamoDBClient, InternalServerError, ResourceInUseException, ResourceNotFoundException, } from "@aws-sdk/client-dynamodb";
|
|
2
|
+
import { ignore } from "../error";
|
|
3
|
+
import { Resource } from "../resource";
|
|
4
|
+
import { withExponentialBackoff } from "../utils/retry";
|
|
5
|
+
export class Table extends Resource("dynamo::Table", async (ctx, props) => {
|
|
6
|
+
const client = new DynamoDBClient({});
|
|
7
|
+
if (ctx.event === "delete") {
|
|
8
|
+
await withExponentialBackoff(async () => {
|
|
9
|
+
await ignore(ResourceNotFoundException.name, () => client.send(new DeleteTableCommand({
|
|
10
|
+
TableName: props.tableName,
|
|
11
|
+
})));
|
|
12
|
+
}, (error) => error instanceof ResourceInUseException ||
|
|
13
|
+
error instanceof InternalServerError, 10, // Max attempts
|
|
14
|
+
200);
|
|
15
|
+
// Wait for table to be deleted
|
|
16
|
+
let tableDeleted = false;
|
|
17
|
+
let retryCount = 0;
|
|
18
|
+
const maxRetries = 60; // Wait up to 60 seconds
|
|
19
|
+
while (!tableDeleted && retryCount < maxRetries) {
|
|
20
|
+
try {
|
|
21
|
+
await client.send(new DescribeTableCommand({
|
|
22
|
+
TableName: props.tableName,
|
|
23
|
+
}));
|
|
24
|
+
// If we get here, table still exists
|
|
25
|
+
retryCount++;
|
|
26
|
+
// Increasing delay for each retry with some jitter
|
|
27
|
+
const delay = Math.min(1000 * (1 + 0.1 * Math.random()), 5000);
|
|
28
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error instanceof ResourceNotFoundException) {
|
|
32
|
+
tableDeleted = true;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!tableDeleted) {
|
|
40
|
+
throw new Error(`Timed out waiting for table ${props.tableName} to be deleted`);
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Setup for table creation
|
|
46
|
+
const attributeDefinitions = [
|
|
47
|
+
{
|
|
48
|
+
AttributeName: props.partitionKey.name,
|
|
49
|
+
AttributeType: props.partitionKey.type,
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
const keySchema = [
|
|
53
|
+
{
|
|
54
|
+
AttributeName: props.partitionKey.name,
|
|
55
|
+
KeyType: "HASH",
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
if (props.sortKey) {
|
|
59
|
+
attributeDefinitions.push({
|
|
60
|
+
AttributeName: props.sortKey.name,
|
|
61
|
+
AttributeType: props.sortKey.type,
|
|
62
|
+
});
|
|
63
|
+
keySchema.push({
|
|
64
|
+
AttributeName: props.sortKey.name,
|
|
65
|
+
KeyType: "RANGE",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Attempt to create the table with exponential backoff for ResourceInUseException
|
|
69
|
+
await withExponentialBackoff(async () => {
|
|
70
|
+
try {
|
|
71
|
+
// First check if table already exists
|
|
72
|
+
const describeResponse = await client.send(new DescribeTableCommand({
|
|
73
|
+
TableName: props.tableName,
|
|
74
|
+
}));
|
|
75
|
+
// If table exists and is ACTIVE, no need to create it
|
|
76
|
+
if (describeResponse.Table?.TableStatus === "ACTIVE") {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// If table exists but not ACTIVE, wait for it in the polling loop below
|
|
80
|
+
if (describeResponse.Table) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error instanceof ResourceNotFoundException) {
|
|
86
|
+
// Table doesn't exist, try to create it
|
|
87
|
+
await client.send(new CreateTableCommand({
|
|
88
|
+
TableName: props.tableName,
|
|
89
|
+
AttributeDefinitions: attributeDefinitions,
|
|
90
|
+
KeySchema: keySchema,
|
|
91
|
+
BillingMode: props.billingMode || "PAY_PER_REQUEST",
|
|
92
|
+
ProvisionedThroughput: props.billingMode === "PROVISIONED"
|
|
93
|
+
? {
|
|
94
|
+
ReadCapacityUnits: props.readCapacity || 5,
|
|
95
|
+
WriteCapacityUnits: props.writeCapacity || 5,
|
|
96
|
+
}
|
|
97
|
+
: undefined,
|
|
98
|
+
Tags: props.tags
|
|
99
|
+
? Object.entries(props.tags).map(([Key, Value]) => ({
|
|
100
|
+
Key,
|
|
101
|
+
Value,
|
|
102
|
+
}))
|
|
103
|
+
: undefined,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}, (error) => error instanceof ResourceInUseException, 10, // Max attempts
|
|
111
|
+
200);
|
|
112
|
+
// Wait for table to be active with timeout
|
|
113
|
+
let tableActive = false;
|
|
114
|
+
let tableDescription;
|
|
115
|
+
let retryCount = 0;
|
|
116
|
+
const maxRetries = 60; // Wait up to 60 seconds
|
|
117
|
+
while (!tableActive && retryCount < maxRetries) {
|
|
118
|
+
try {
|
|
119
|
+
const response = await client.send(new DescribeTableCommand({
|
|
120
|
+
TableName: props.tableName,
|
|
121
|
+
}));
|
|
122
|
+
tableActive = response.Table?.TableStatus === "ACTIVE";
|
|
123
|
+
if (tableActive) {
|
|
124
|
+
tableDescription = response.Table;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
retryCount++;
|
|
128
|
+
// Increasing delay for each retry with some jitter
|
|
129
|
+
const delay = Math.min(1000 * (1 + 0.1 * Math.random()), 5000);
|
|
130
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
retryCount++;
|
|
135
|
+
if (!(error instanceof ResourceNotFoundException)) {
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (!tableActive) {
|
|
142
|
+
throw new Error(`Timed out waiting for table ${props.tableName} to become active`);
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
...props,
|
|
146
|
+
id: props.tableName,
|
|
147
|
+
arn: tableDescription.TableArn,
|
|
148
|
+
streamArn: tableDescription.LatestStreamArn,
|
|
149
|
+
tableId: tableDescription.TableId,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}) {
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/aws/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for Cloudflare API requests
|
|
3
|
+
*/
|
|
4
|
+
export interface CloudflareApiOptions {
|
|
5
|
+
/**
|
|
6
|
+
* API Key to use (overrides CLOUDFLARE_API_KEY env var)
|
|
7
|
+
*/
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Account ID to use (overrides CLOUDFLARE_ACCOUNT_ID env var)
|
|
11
|
+
* If not provided, will be automatically retrieved from the Cloudflare API
|
|
12
|
+
*/
|
|
13
|
+
accountId?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Zone ID to use (overrides CLOUDFLARE_ZONE_ID env var)
|
|
16
|
+
*/
|
|
17
|
+
zoneId?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Email to use with API Key authentication
|
|
20
|
+
* If not provided, will attempt to discover from Cloudflare API
|
|
21
|
+
*/
|
|
22
|
+
email?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Creates a CloudflareApi instance with automatic account ID discovery if not provided
|
|
26
|
+
*
|
|
27
|
+
* @param options API options
|
|
28
|
+
* @returns Promise resolving to a CloudflareApi instance
|
|
29
|
+
*/
|
|
30
|
+
export declare function createCloudflareApi(options?: CloudflareApiOptions): Promise<CloudflareApi>;
|
|
31
|
+
/**
|
|
32
|
+
* Cloudflare API client using raw fetch
|
|
33
|
+
*/
|
|
34
|
+
export declare class CloudflareApi {
|
|
35
|
+
/** Base URL for Cloudflare API */
|
|
36
|
+
readonly baseUrl: string;
|
|
37
|
+
/** Cloudflare API Key */
|
|
38
|
+
readonly apiKey: string;
|
|
39
|
+
/** Cloudflare account ID */
|
|
40
|
+
readonly accountId: string;
|
|
41
|
+
/** Cloudflare zone ID (if provided) */
|
|
42
|
+
readonly zoneId: string | null;
|
|
43
|
+
/** User email (when using API Key auth) */
|
|
44
|
+
readonly email?: string;
|
|
45
|
+
/** Auth options for making requests */
|
|
46
|
+
private readonly authOptions;
|
|
47
|
+
/**
|
|
48
|
+
* Create a new Cloudflare API client
|
|
49
|
+
* Use createCloudflareApi factory function instead of direct constructor
|
|
50
|
+
* for automatic account ID discovery.
|
|
51
|
+
*
|
|
52
|
+
* @param options API options
|
|
53
|
+
*/
|
|
54
|
+
constructor(options?: CloudflareApiOptions);
|
|
55
|
+
/**
|
|
56
|
+
* Make a fetch request to the Cloudflare API
|
|
57
|
+
*
|
|
58
|
+
* @param path API path (without base URL)
|
|
59
|
+
* @param init Fetch init options
|
|
60
|
+
* @returns Raw Response object from fetch
|
|
61
|
+
*/
|
|
62
|
+
fetch(path: string, init?: RequestInit): Promise<Response>;
|
|
63
|
+
/**
|
|
64
|
+
* Helper for GET requests
|
|
65
|
+
*/
|
|
66
|
+
get(path: string, init?: RequestInit): Promise<Response>;
|
|
67
|
+
/**
|
|
68
|
+
* Helper for HEAD requests
|
|
69
|
+
*/
|
|
70
|
+
head(path: string, init?: RequestInit): Promise<Response>;
|
|
71
|
+
/**
|
|
72
|
+
* Helper for POST requests
|
|
73
|
+
*/
|
|
74
|
+
post(path: string, body: any, init?: RequestInit): Promise<Response>;
|
|
75
|
+
/**
|
|
76
|
+
* Helper for PUT requests
|
|
77
|
+
*/
|
|
78
|
+
put(path: string, body: any, init?: RequestInit): Promise<Response>;
|
|
79
|
+
/**
|
|
80
|
+
* Helper for PATCH requests
|
|
81
|
+
*/
|
|
82
|
+
patch(path: string, body: any, init?: RequestInit): Promise<Response>;
|
|
83
|
+
/**
|
|
84
|
+
* Helper for DELETE requests
|
|
85
|
+
*/
|
|
86
|
+
delete(path: string, init?: RequestInit): Promise<Response>;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/cloudflare/api.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAUD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAexB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,uCAAuC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IAEpD;;;;;;OAMG;gBACS,OAAO,GAAE,oBAAyB;IAqC9C;;;;;;OAMG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2CpE;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIlE;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAGnE;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAUpB;;OAEG;IACG,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAKpB;;OAEG;IACG,KAAK,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAQpB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAGtE"}
|