alchemy 0.1.14 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/lib/apply.js +1 -1
  2. package/lib/apply.js.map +1 -1
  3. package/lib/destroy.js +9 -3
  4. package/lib/destroy.js.map +1 -1
  5. package/package.json +1 -2
  6. package/src/apply.ts +1 -1
  7. package/src/aws/table.ts +30 -8
  8. package/src/cloudflare/kv-namespace.ts +34 -15
  9. package/src/cloudflare/worker.ts +66 -41
  10. package/src/destroy.ts +15 -10
  11. package/src/utils/retry.ts +1 -0
  12. package/README.md +0 -334
  13. package/lib/$.d.ts +0 -12
  14. package/lib/$.d.ts.map +0 -1
  15. package/lib/$.js +0 -42
  16. package/lib/$.js.map +0 -1
  17. package/lib/alchemize.d.ts +0 -43
  18. package/lib/alchemize.d.ts.map +0 -1
  19. package/lib/alchemize.js +0 -112
  20. package/lib/alchemize.js.map +0 -1
  21. package/lib/apply.d.ts +0 -23
  22. package/lib/aws/account-id.d.ts +0 -5
  23. package/lib/aws/account-id.d.ts.map +0 -1
  24. package/lib/aws/account-id.js +0 -10
  25. package/lib/aws/account-id.js.map +0 -1
  26. package/lib/aws/bucket.d.ts +0 -21
  27. package/lib/aws/bucket.d.ts.map +0 -1
  28. package/lib/aws/bucket.js +0 -114
  29. package/lib/aws/bucket.js.map +0 -1
  30. package/lib/aws/function.d.ts +0 -53
  31. package/lib/aws/function.d.ts.map +0 -1
  32. package/lib/aws/function.js +0 -195
  33. package/lib/aws/function.js.map +0 -1
  34. package/lib/aws/index.d.ts +0 -9
  35. package/lib/aws/index.d.ts.map +0 -1
  36. package/lib/aws/index.js +0 -9
  37. package/lib/aws/index.js.map +0 -1
  38. package/lib/aws/oidc/github-oidc-provider.d.ts +0 -11
  39. package/lib/aws/oidc/github-oidc-provider.d.ts.map +0 -1
  40. package/lib/aws/oidc/github-oidc-provider.js +0 -22
  41. package/lib/aws/oidc/github-oidc-provider.js.map +0 -1
  42. package/lib/aws/oidc/index.d.ts +0 -3
  43. package/lib/aws/oidc/index.d.ts.map +0 -1
  44. package/lib/aws/oidc/index.js +0 -3
  45. package/lib/aws/oidc/index.js.map +0 -1
  46. package/lib/aws/oidc/oidc-provider.d.ts +0 -60
  47. package/lib/aws/oidc/oidc-provider.d.ts.map +0 -1
  48. package/lib/aws/oidc/oidc-provider.js +0 -140
  49. package/lib/aws/oidc/oidc-provider.js.map +0 -1
  50. package/lib/aws/policy.d.ts +0 -46
  51. package/lib/aws/policy.d.ts.map +0 -1
  52. package/lib/aws/policy.js +0 -139
  53. package/lib/aws/policy.js.map +0 -1
  54. package/lib/aws/queue.d.ts +0 -62
  55. package/lib/aws/queue.d.ts.map +0 -1
  56. package/lib/aws/queue.js +0 -167
  57. package/lib/aws/queue.js.map +0 -1
  58. package/lib/aws/role.d.ts +0 -27
  59. package/lib/aws/role.d.ts.map +0 -1
  60. package/lib/aws/role.js +0 -197
  61. package/lib/aws/role.js.map +0 -1
  62. package/lib/aws/ses.d.ts +0 -75
  63. package/lib/aws/ses.d.ts.map +0 -1
  64. package/lib/aws/ses.js +0 -189
  65. package/lib/aws/ses.js.map +0 -1
  66. package/lib/aws/table.d.ts +0 -26
  67. package/lib/aws/table.d.ts.map +0 -1
  68. package/lib/aws/table.js +0 -142
  69. package/lib/aws/table.js.map +0 -1
  70. package/lib/cloudflare/api.d.ts +0 -88
  71. package/lib/cloudflare/api.d.ts.map +0 -1
  72. package/lib/cloudflare/api.js +0 -184
  73. package/lib/cloudflare/api.js.map +0 -1
  74. package/lib/cloudflare/asset-manifest.d.ts +0 -15
  75. package/lib/cloudflare/asset-manifest.d.ts.map +0 -1
  76. package/lib/cloudflare/asset-manifest.js +0 -2
  77. package/lib/cloudflare/asset-manifest.js.map +0 -1
  78. package/lib/cloudflare/auth.d.ts +0 -52
  79. package/lib/cloudflare/auth.d.ts.map +0 -1
  80. package/lib/cloudflare/auth.js +0 -114
  81. package/lib/cloudflare/auth.js.map +0 -1
  82. package/lib/cloudflare/bindings.d.ts +0 -259
  83. package/lib/cloudflare/bindings.d.ts.map +0 -1
  84. package/lib/cloudflare/bindings.js +0 -2
  85. package/lib/cloudflare/bindings.js.map +0 -1
  86. package/lib/cloudflare/durable-object-namespace.d.ts +0 -20
  87. package/lib/cloudflare/durable-object-namespace.d.ts.map +0 -1
  88. package/lib/cloudflare/durable-object-namespace.js +0 -21
  89. package/lib/cloudflare/durable-object-namespace.js.map +0 -1
  90. package/lib/cloudflare/generate-asset-manifest.d.ts +0 -3
  91. package/lib/cloudflare/generate-asset-manifest.d.ts.map +0 -1
  92. package/lib/cloudflare/generate-asset-manifest.js +0 -69
  93. package/lib/cloudflare/generate-asset-manifest.js.map +0 -1
  94. package/lib/cloudflare/index.d.ts +0 -7
  95. package/lib/cloudflare/index.d.ts.map +0 -1
  96. package/lib/cloudflare/index.js +0 -7
  97. package/lib/cloudflare/index.js.map +0 -1
  98. package/lib/cloudflare/kv-namespace.d.ts +0 -64
  99. package/lib/cloudflare/kv-namespace.d.ts.map +0 -1
  100. package/lib/cloudflare/kv-namespace.js +0 -97
  101. package/lib/cloudflare/kv-namespace.js.map +0 -1
  102. package/lib/cloudflare/state.d.ts +0 -83
  103. package/lib/cloudflare/state.d.ts.map +0 -1
  104. package/lib/cloudflare/state.js +0 -109
  105. package/lib/cloudflare/state.js.map +0 -1
  106. package/lib/cloudflare/static-site-router.d.ts +0 -19
  107. package/lib/cloudflare/static-site-router.d.ts.map +0 -1
  108. package/lib/cloudflare/static-site-router.js +0 -110
  109. package/lib/cloudflare/static-site-router.js.map +0 -1
  110. package/lib/cloudflare/static-site.d.ts +0 -166
  111. package/lib/cloudflare/static-site.d.ts.map +0 -1
  112. package/lib/cloudflare/static-site.js +0 -150
  113. package/lib/cloudflare/static-site.js.map +0 -1
  114. package/lib/cloudflare/types.d.ts +0 -52
  115. package/lib/cloudflare/types.d.ts.map +0 -1
  116. package/lib/cloudflare/types.js +0 -21
  117. package/lib/cloudflare/types.js.map +0 -1
  118. package/lib/cloudflare/upload-asset-manifest.d.ts +0 -12
  119. package/lib/cloudflare/upload-asset-manifest.d.ts.map +0 -1
  120. package/lib/cloudflare/upload-asset-manifest.js +0 -55
  121. package/lib/cloudflare/upload-asset-manifest.js.map +0 -1
  122. package/lib/cloudflare/worker-metadata.d.ts +0 -130
  123. package/lib/cloudflare/worker-metadata.d.ts.map +0 -1
  124. package/lib/cloudflare/worker-metadata.js +0 -2
  125. package/lib/cloudflare/worker-metadata.js.map +0 -1
  126. package/lib/cloudflare/worker-migration.d.ts +0 -110
  127. package/lib/cloudflare/worker-migration.d.ts.map +0 -1
  128. package/lib/cloudflare/worker-migration.js +0 -11
  129. package/lib/cloudflare/worker-migration.js.map +0 -1
  130. package/lib/cloudflare/worker.d.ts +0 -108
  131. package/lib/cloudflare/worker.d.ts.map +0 -1
  132. package/lib/cloudflare/worker.js +0 -384
  133. package/lib/cloudflare/worker.js.map +0 -1
  134. package/lib/destroy.d.ts +0 -19
  135. package/lib/error.d.ts +0 -2
  136. package/lib/error.d.ts.map +0 -1
  137. package/lib/error.js +0 -13
  138. package/lib/error.js.map +0 -1
  139. package/lib/esbuild.d.ts +0 -152
  140. package/lib/esbuild.d.ts.map +0 -1
  141. package/lib/esbuild.js +0 -67
  142. package/lib/esbuild.js.map +0 -1
  143. package/lib/fs.d.ts +0 -12
  144. package/lib/fs.d.ts.map +0 -1
  145. package/lib/fs.js +0 -41
  146. package/lib/fs.js.map +0 -1
  147. package/lib/github/client.d.ts +0 -34
  148. package/lib/github/client.d.ts.map +0 -1
  149. package/lib/github/client.js +0 -91
  150. package/lib/github/client.js.map +0 -1
  151. package/lib/github/index.d.ts +0 -2
  152. package/lib/github/index.d.ts.map +0 -1
  153. package/lib/github/index.js +0 -2
  154. package/lib/github/index.js.map +0 -1
  155. package/lib/github/secret.d.ts +0 -46
  156. package/lib/github/secret.d.ts.map +0 -1
  157. package/lib/github/secret.js +0 -103
  158. package/lib/github/secret.js.map +0 -1
  159. package/lib/global.d.ts +0 -16
  160. package/lib/global.d.ts.map +0 -1
  161. package/lib/global.js +0 -42
  162. package/lib/global.js.map +0 -1
  163. package/lib/index.d.ts +0 -10
  164. package/lib/index.d.ts.map +0 -1
  165. package/lib/index.js +0 -9
  166. package/lib/index.js.map +0 -1
  167. package/lib/input.d.ts +0 -6
  168. package/lib/input.d.ts.map +0 -1
  169. package/lib/input.js +0 -2
  170. package/lib/input.js.map +0 -1
  171. package/lib/main.d.ts +0 -3
  172. package/lib/main.d.ts.map +0 -1
  173. package/lib/main.js +0 -32
  174. package/lib/main.js.map +0 -1
  175. package/lib/output.d.ts +0 -24
  176. package/lib/output.d.ts.map +0 -1
  177. package/lib/output.js +0 -23
  178. package/lib/output.js.map +0 -1
  179. package/lib/print.d.ts +0 -7
  180. package/lib/print.d.ts.map +0 -1
  181. package/lib/print.js +0 -10
  182. package/lib/print.js.map +0 -1
  183. package/lib/resource.d.ts +0 -71
  184. package/lib/resource.d.ts.map +0 -1
  185. package/lib/resource.js +0 -276
  186. package/lib/resource.js.map +0 -1
  187. package/lib/scope.d.ts +0 -18
  188. package/lib/scope.d.ts.map +0 -1
  189. package/lib/scope.js +0 -30
  190. package/lib/scope.js.map +0 -1
  191. package/lib/slug.d.ts +0 -2
  192. package/lib/slug.d.ts.map +0 -1
  193. package/lib/slug.js +0 -4
  194. package/lib/slug.js.map +0 -1
  195. package/lib/state.d.ts +0 -40
  196. package/lib/state.d.ts.map +0 -1
  197. package/lib/state.js +0 -73
  198. package/lib/state.js.map +0 -1
  199. package/lib/stripe/index.d.ts +0 -4
  200. package/lib/stripe/index.d.ts.map +0 -1
  201. package/lib/stripe/index.js +0 -4
  202. package/lib/stripe/index.js.map +0 -1
  203. package/lib/stripe/price.d.ts +0 -109
  204. package/lib/stripe/price.d.ts.map +0 -1
  205. package/lib/stripe/price.js +0 -112
  206. package/lib/stripe/price.js.map +0 -1
  207. package/lib/stripe/product.d.ts +0 -86
  208. package/lib/stripe/product.d.ts.map +0 -1
  209. package/lib/stripe/product.js +0 -90
  210. package/lib/stripe/product.js.map +0 -1
  211. package/lib/stripe/webhook.d.ts +0 -73
  212. package/lib/stripe/webhook.d.ts.map +0 -1
  213. package/lib/stripe/webhook.js +0 -94
  214. package/lib/stripe/webhook.js.map +0 -1
  215. package/lib/utils/content-type.d.ts +0 -8
  216. package/lib/utils/content-type.d.ts.map +0 -1
  217. package/lib/utils/content-type.js +0 -41
  218. package/lib/utils/content-type.js.map +0 -1
  219. package/lib/utils/retry.d.ts +0 -13
  220. package/lib/utils/retry.d.ts.map +0 -1
  221. package/lib/utils/retry.js +0 -31
  222. package/lib/utils/retry.js.map +0 -1
package/lib/aws/role.js DELETED
@@ -1,197 +0,0 @@
1
- import { AttachRolePolicyCommand, CreateRoleCommand, DeleteRoleCommand, DeleteRolePolicyCommand, DetachRolePolicyCommand, EntityAlreadyExistsException, GetRoleCommand, IAMClient, ListAttachedRolePoliciesCommand, NoSuchEntityException, PutRolePolicyCommand, TagRoleCommand, UpdateAssumeRolePolicyCommand, UpdateRoleCommand, } from "@aws-sdk/client-iam";
2
- import { ignore } from "../error";
3
- import { Resource } from "../resource";
4
- export class Role extends Resource("iam::Role", async (ctx, props) => {
5
- const client = new IAMClient({});
6
- if (ctx.event === "delete") {
7
- // Delete any inline policies first
8
- if (props.policies) {
9
- for (const policy of props.policies) {
10
- await ignore(NoSuchEntityException.name, () => client.send(new DeleteRolePolicyCommand({
11
- RoleName: props.roleName,
12
- PolicyName: policy.policyName,
13
- })));
14
- }
15
- }
16
- // We need to detach managed policies before deleting the role
17
- // First, get all attached policies
18
- try {
19
- const attachedPoliciesResponse = await client.send(new ListAttachedRolePoliciesCommand({
20
- RoleName: props.roleName,
21
- }));
22
- // Detach all managed policies
23
- const attachedPolicies = attachedPoliciesResponse.AttachedPolicies || [];
24
- for (const policy of attachedPolicies) {
25
- await client.send(new DetachRolePolicyCommand({
26
- RoleName: props.roleName,
27
- PolicyArn: policy.PolicyArn,
28
- }));
29
- }
30
- }
31
- catch (error) {
32
- if (error.name !== NoSuchEntityException.name) {
33
- throw error;
34
- }
35
- }
36
- await ignore(NoSuchEntityException.name, () => client.send(new DeleteRoleCommand({
37
- RoleName: props.roleName,
38
- })));
39
- return {
40
- ...props,
41
- id: props.roleName,
42
- arn: `arn:aws:iam::${process.env.AWS_ACCOUNT_ID}:role/${props.roleName}`,
43
- uniqueId: "",
44
- roleId: "",
45
- createDate: new Date(),
46
- };
47
- }
48
- const assumeRolePolicyDocument = JSON.stringify(props.assumeRolePolicy);
49
- let role;
50
- try {
51
- if (ctx.event === "create") {
52
- // Try to create the role
53
- await client.send(new CreateRoleCommand({
54
- RoleName: props.roleName,
55
- AssumeRolePolicyDocument: assumeRolePolicyDocument,
56
- Description: props.description,
57
- Path: props.path,
58
- MaxSessionDuration: props.maxSessionDuration,
59
- PermissionsBoundary: props.permissionsBoundary,
60
- Tags: [
61
- ...Object.entries(props.tags || {}).map(([Key, Value]) => ({
62
- Key,
63
- Value,
64
- })),
65
- {
66
- Key: "alchemy_stage",
67
- Value: ctx.stage,
68
- },
69
- {
70
- Key: "alchemy_resource",
71
- Value: ctx.resourceID,
72
- },
73
- ],
74
- }));
75
- }
76
- }
77
- catch (error) {
78
- if (error instanceof EntityAlreadyExistsException &&
79
- ctx.event === "create") {
80
- // Check if we were the ones who created it
81
- const existingRole = await client.send(new GetRoleCommand({
82
- RoleName: props.roleName,
83
- }));
84
- const roleTags = existingRole.Role?.Tags?.reduce((acc, tag) => {
85
- acc[tag.Key] = tag.Value;
86
- return acc;
87
- }, {}) || {};
88
- if (roleTags.alchemy_stage !== ctx.stage ||
89
- roleTags.alchemy_resource !== ctx.resourceID) {
90
- throw error;
91
- }
92
- }
93
- else if (error.name !== NoSuchEntityException.name) {
94
- throw error;
95
- }
96
- }
97
- // Get or update the role
98
- role = await client.send(new GetRoleCommand({
99
- RoleName: props.roleName,
100
- }));
101
- // Update assume role policy if it changed
102
- if (role.Role?.AssumeRolePolicyDocument !== assumeRolePolicyDocument) {
103
- await client.send(new UpdateAssumeRolePolicyCommand({
104
- RoleName: props.roleName,
105
- PolicyDocument: assumeRolePolicyDocument,
106
- }));
107
- }
108
- // Update role description and max session duration if they changed
109
- if (role.Role?.Description !== props.description ||
110
- role.Role?.MaxSessionDuration !== props.maxSessionDuration) {
111
- await client.send(new UpdateRoleCommand({
112
- RoleName: props.roleName,
113
- Description: props.description,
114
- MaxSessionDuration: props.maxSessionDuration,
115
- }));
116
- }
117
- // Update tags
118
- const newTags = {
119
- ...props.tags,
120
- alchemy_stage: ctx.stage,
121
- alchemy_resource: ctx.resourceID,
122
- };
123
- const tags = Object.entries(newTags).map(([Key, Value]) => ({
124
- Key,
125
- Value,
126
- }));
127
- await client.send(new TagRoleCommand({
128
- RoleName: props.roleName,
129
- Tags: tags,
130
- }));
131
- // Handle policy changes
132
- const previousPolicies = ctx.event === "update" ? ctx.output.policies || [] : [];
133
- const currentPolicies = props.policies || [];
134
- // Delete policies that were removed
135
- for (const oldPolicy of previousPolicies) {
136
- if (!currentPolicies.some((p) => p.policyName === oldPolicy.policyName)) {
137
- await ignore(NoSuchEntityException.name, () => client.send(new DeleteRolePolicyCommand({
138
- RoleName: props.roleName,
139
- PolicyName: oldPolicy.policyName,
140
- })));
141
- }
142
- }
143
- // Update or create policies
144
- for (const policy of currentPolicies) {
145
- const oldPolicy = previousPolicies.find((p) => p.policyName === policy.policyName);
146
- if (!oldPolicy ||
147
- JSON.stringify(oldPolicy.policyDocument) !==
148
- JSON.stringify(policy.policyDocument)) {
149
- await client.send(new PutRolePolicyCommand({
150
- RoleName: props.roleName,
151
- PolicyName: policy.policyName,
152
- PolicyDocument: JSON.stringify(policy.policyDocument),
153
- }));
154
- }
155
- }
156
- // Handle managed policy attachments
157
- // Get currently attached policies
158
- const attachedPoliciesResponse = await client.send(new ListAttachedRolePoliciesCommand({
159
- RoleName: props.roleName,
160
- }));
161
- const currentAttachedPolicies = attachedPoliciesResponse.AttachedPolicies || [];
162
- const currentPolicyArns = currentAttachedPolicies.map((p) => p.PolicyArn);
163
- // If we're updating, use an empty array as default when managedPolicyArns is undefined
164
- // to ensure we detach all managed policies
165
- const desiredPolicyArns = props.managedPolicyArns || [];
166
- // Detach policies that are no longer needed
167
- for (const policyArn of currentPolicyArns) {
168
- if (!desiredPolicyArns.includes(policyArn)) {
169
- await client.send(new DetachRolePolicyCommand({
170
- RoleName: props.roleName,
171
- PolicyArn: policyArn,
172
- }));
173
- }
174
- }
175
- // Attach new policies that weren't attached before
176
- for (const policyArn of desiredPolicyArns) {
177
- if (!currentPolicyArns.includes(policyArn)) {
178
- await client.send(new AttachRolePolicyCommand({
179
- RoleName: props.roleName,
180
- PolicyArn: policyArn,
181
- }));
182
- }
183
- }
184
- if (!role?.Role) {
185
- throw new Error(`Failed to create or update role ${props.roleName}`);
186
- }
187
- return {
188
- ...props,
189
- id: props.roleName,
190
- arn: role.Role.Arn,
191
- uniqueId: role.Role.RoleId,
192
- roleId: role.Role.RoleId,
193
- createDate: role.Role.CreateDate,
194
- };
195
- }) {
196
- }
197
- //# sourceMappingURL=role.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"role.js","sourceRoot":"","sources":["../../src/aws/role.ts"],"names":[],"mappings":"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"}
package/lib/aws/ses.d.ts DELETED
@@ -1,75 +0,0 @@
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
@@ -1 +0,0 @@
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 DELETED
@@ -1,189 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"ses.js","sourceRoot":"","sources":["../../src/aws/ses.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/aws/table.ts"],"names":[],"mappings":"AAaA,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,UAsK1B;CAAG"}
package/lib/aws/table.js DELETED
@@ -1,142 +0,0 @@
1
- import { CreateTableCommand, DeleteTableCommand, DescribeTableCommand, DynamoDBClient, 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 ignore(ResourceNotFoundException.name, () => client.send(new DeleteTableCommand({
9
- TableName: props.tableName,
10
- })));
11
- // Wait for table to be deleted
12
- let tableDeleted = false;
13
- while (!tableDeleted) {
14
- try {
15
- await client.send(new DescribeTableCommand({
16
- TableName: props.tableName,
17
- }));
18
- // If we get here, table still exists
19
- await new Promise((resolve) => setTimeout(resolve, 1000));
20
- }
21
- catch (error) {
22
- if (error instanceof ResourceNotFoundException) {
23
- tableDeleted = true;
24
- }
25
- else {
26
- throw error;
27
- }
28
- }
29
- }
30
- return;
31
- }
32
- else {
33
- // Setup for table creation
34
- const attributeDefinitions = [
35
- {
36
- AttributeName: props.partitionKey.name,
37
- AttributeType: props.partitionKey.type,
38
- },
39
- ];
40
- const keySchema = [
41
- {
42
- AttributeName: props.partitionKey.name,
43
- KeyType: "HASH",
44
- },
45
- ];
46
- if (props.sortKey) {
47
- attributeDefinitions.push({
48
- AttributeName: props.sortKey.name,
49
- AttributeType: props.sortKey.type,
50
- });
51
- keySchema.push({
52
- AttributeName: props.sortKey.name,
53
- KeyType: "RANGE",
54
- });
55
- }
56
- // Attempt to create the table with exponential backoff for ResourceInUseException
57
- await withExponentialBackoff(async () => {
58
- try {
59
- // First check if table already exists
60
- const describeResponse = await client.send(new DescribeTableCommand({
61
- TableName: props.tableName,
62
- }));
63
- // If table exists and is ACTIVE, no need to create it
64
- if (describeResponse.Table?.TableStatus === "ACTIVE") {
65
- return;
66
- }
67
- // If table exists but not ACTIVE, wait for it in the polling loop below
68
- if (describeResponse.Table) {
69
- return;
70
- }
71
- }
72
- catch (error) {
73
- if (error instanceof ResourceNotFoundException) {
74
- // Table doesn't exist, try to create it
75
- await client.send(new CreateTableCommand({
76
- TableName: props.tableName,
77
- AttributeDefinitions: attributeDefinitions,
78
- KeySchema: keySchema,
79
- BillingMode: props.billingMode || "PAY_PER_REQUEST",
80
- ProvisionedThroughput: props.billingMode === "PROVISIONED"
81
- ? {
82
- ReadCapacityUnits: props.readCapacity || 5,
83
- WriteCapacityUnits: props.writeCapacity || 5,
84
- }
85
- : undefined,
86
- Tags: props.tags
87
- ? Object.entries(props.tags).map(([Key, Value]) => ({
88
- Key,
89
- Value,
90
- }))
91
- : undefined,
92
- }));
93
- }
94
- else {
95
- throw error;
96
- }
97
- }
98
- }, (error) => error instanceof ResourceInUseException, 10, // Max attempts
99
- 200);
100
- // Wait for table to be active with timeout
101
- let tableActive = false;
102
- let tableDescription;
103
- let retryCount = 0;
104
- const maxRetries = 60; // Wait up to 60 seconds
105
- while (!tableActive && retryCount < maxRetries) {
106
- try {
107
- const response = await client.send(new DescribeTableCommand({
108
- TableName: props.tableName,
109
- }));
110
- tableActive = response.Table?.TableStatus === "ACTIVE";
111
- if (tableActive) {
112
- tableDescription = response.Table;
113
- }
114
- else {
115
- retryCount++;
116
- // Increasing delay for each retry with some jitter
117
- const delay = Math.min(1000 * (1 + 0.1 * Math.random()), 5000);
118
- await new Promise((resolve) => setTimeout(resolve, delay));
119
- }
120
- }
121
- catch (error) {
122
- retryCount++;
123
- if (!(error instanceof ResourceNotFoundException)) {
124
- throw error;
125
- }
126
- await new Promise((resolve) => setTimeout(resolve, 1000));
127
- }
128
- }
129
- if (!tableActive) {
130
- throw new Error(`Timed out waiting for table ${props.tableName} to become active`);
131
- }
132
- return {
133
- ...props,
134
- id: props.tableName,
135
- arn: tableDescription.TableArn,
136
- streamArn: tableDescription.LatestStreamArn,
137
- tableId: tableDescription.TableId,
138
- };
139
- }
140
- }) {
141
- }
142
- //# sourceMappingURL=table.js.map