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
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { AttachRolePolicyCommand, CreatePolicyCommand, CreatePolicyVersionCommand, DeletePolicyCommand, DeletePolicyVersionCommand, DetachRolePolicyCommand, GetPolicyCommand, GetPolicyVersionCommand, IAMClient, ListPolicyVersionsCommand, NoSuchEntityException, } from "@aws-sdk/client-iam";
|
|
2
|
+
import { ignore } from "../error";
|
|
3
|
+
import { Resource } from "../resource";
|
|
4
|
+
export class Policy extends Resource("iam::Policy", async (ctx, props) => {
|
|
5
|
+
const client = new IAMClient({});
|
|
6
|
+
const policyArn = `arn:aws:iam::${process.env.AWS_ACCOUNT_ID}:policy${props.path || "/"}${props.policyName}`;
|
|
7
|
+
if (ctx.event === "delete") {
|
|
8
|
+
try {
|
|
9
|
+
// List and delete all non-default versions first
|
|
10
|
+
const versions = await client.send(new ListPolicyVersionsCommand({
|
|
11
|
+
PolicyArn: policyArn,
|
|
12
|
+
}));
|
|
13
|
+
for (const version of versions.Versions || []) {
|
|
14
|
+
if (!version.IsDefaultVersion) {
|
|
15
|
+
await client.send(new DeletePolicyVersionCommand({
|
|
16
|
+
PolicyArn: policyArn,
|
|
17
|
+
VersionId: version.VersionId,
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Delete the policy
|
|
22
|
+
await client.send(new DeletePolicyCommand({
|
|
23
|
+
PolicyArn: policyArn,
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error.name !== NoSuchEntityException.name) {
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
...props,
|
|
33
|
+
id: props.policyName,
|
|
34
|
+
arn: policyArn,
|
|
35
|
+
defaultVersionId: "v1",
|
|
36
|
+
attachmentCount: 0,
|
|
37
|
+
createDate: new Date(),
|
|
38
|
+
updateDate: new Date(),
|
|
39
|
+
isAttachable: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
try {
|
|
44
|
+
// Check if policy exists
|
|
45
|
+
const existingPolicy = await client.send(new GetPolicyCommand({
|
|
46
|
+
PolicyArn: policyArn,
|
|
47
|
+
}));
|
|
48
|
+
// Get current policy version
|
|
49
|
+
const currentVersion = await client.send(new GetPolicyVersionCommand({
|
|
50
|
+
PolicyArn: policyArn,
|
|
51
|
+
VersionId: existingPolicy.Policy.DefaultVersionId,
|
|
52
|
+
}));
|
|
53
|
+
const currentDocument = JSON.parse(decodeURIComponent(currentVersion.PolicyVersion.Document));
|
|
54
|
+
// If policy document changed, create new version
|
|
55
|
+
if (JSON.stringify(currentDocument) !== JSON.stringify(props.document)) {
|
|
56
|
+
// List versions to check if we need to delete old ones
|
|
57
|
+
const versions = await client.send(new ListPolicyVersionsCommand({
|
|
58
|
+
PolicyArn: policyArn,
|
|
59
|
+
}));
|
|
60
|
+
// Delete oldest version if we have 5 versions (maximum allowed)
|
|
61
|
+
if (versions.Versions?.length === 5) {
|
|
62
|
+
const oldestVersion = versions.Versions.sort((a, b) => a.CreateDate.getTime() - b.CreateDate.getTime())[0];
|
|
63
|
+
if (!oldestVersion.IsDefaultVersion) {
|
|
64
|
+
await client.send(new DeletePolicyVersionCommand({
|
|
65
|
+
PolicyArn: policyArn,
|
|
66
|
+
VersionId: oldestVersion.VersionId,
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Create new version
|
|
71
|
+
await client.send(new CreatePolicyVersionCommand({
|
|
72
|
+
PolicyArn: policyArn,
|
|
73
|
+
PolicyDocument: JSON.stringify(props.document),
|
|
74
|
+
SetAsDefault: true,
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
const policy = await client.send(new GetPolicyCommand({
|
|
78
|
+
PolicyArn: policyArn,
|
|
79
|
+
}));
|
|
80
|
+
return {
|
|
81
|
+
...props,
|
|
82
|
+
id: props.policyName,
|
|
83
|
+
arn: policy.Policy.Arn,
|
|
84
|
+
defaultVersionId: policy.Policy.DefaultVersionId,
|
|
85
|
+
attachmentCount: policy.Policy.AttachmentCount,
|
|
86
|
+
createDate: policy.Policy.CreateDate,
|
|
87
|
+
updateDate: policy.Policy.UpdateDate,
|
|
88
|
+
isAttachable: policy.Policy.IsAttachable,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (error.name === "NoSuchEntity") {
|
|
93
|
+
// Create new policy
|
|
94
|
+
const newPolicy = await client.send(new CreatePolicyCommand({
|
|
95
|
+
PolicyName: props.policyName,
|
|
96
|
+
PolicyDocument: JSON.stringify(props.document),
|
|
97
|
+
Description: props.description,
|
|
98
|
+
Path: props.path,
|
|
99
|
+
Tags: props.tags
|
|
100
|
+
? Object.entries(props.tags).map(([Key, Value]) => ({
|
|
101
|
+
Key,
|
|
102
|
+
Value,
|
|
103
|
+
}))
|
|
104
|
+
: undefined,
|
|
105
|
+
}));
|
|
106
|
+
return {
|
|
107
|
+
...props,
|
|
108
|
+
id: props.policyName,
|
|
109
|
+
arn: newPolicy.Policy.Arn,
|
|
110
|
+
defaultVersionId: newPolicy.Policy.DefaultVersionId,
|
|
111
|
+
attachmentCount: newPolicy.Policy.AttachmentCount,
|
|
112
|
+
createDate: newPolicy.Policy.CreateDate,
|
|
113
|
+
updateDate: newPolicy.Policy.UpdateDate,
|
|
114
|
+
isAttachable: newPolicy.Policy.IsAttachable,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}) {
|
|
121
|
+
}
|
|
122
|
+
export class PolicyAttachment extends Resource("iam::PolicyAttachment", async (ctx, props) => {
|
|
123
|
+
const client = new IAMClient({});
|
|
124
|
+
if (ctx.event === "delete") {
|
|
125
|
+
await ignore(NoSuchEntityException.name, () => client.send(new DetachRolePolicyCommand({
|
|
126
|
+
PolicyArn: props.policyArn,
|
|
127
|
+
RoleName: props.roleName,
|
|
128
|
+
})));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
await client.send(new AttachRolePolicyCommand({
|
|
132
|
+
PolicyArn: props.policyArn,
|
|
133
|
+
RoleName: props.roleName,
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
return props;
|
|
137
|
+
}) {
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/aws/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export interface QueueProps {
|
|
2
|
+
/**
|
|
3
|
+
* Name of the queue
|
|
4
|
+
* For FIFO queues, the name must end with the .fifo suffix
|
|
5
|
+
*/
|
|
6
|
+
queueName: string;
|
|
7
|
+
/**
|
|
8
|
+
* Whether this is a FIFO queue.
|
|
9
|
+
* If true, the queueName must end with .fifo suffix
|
|
10
|
+
*/
|
|
11
|
+
fifo?: boolean;
|
|
12
|
+
visibilityTimeout?: number;
|
|
13
|
+
messageRetentionPeriod?: number;
|
|
14
|
+
maximumMessageSize?: number;
|
|
15
|
+
delaySeconds?: number;
|
|
16
|
+
receiveMessageWaitTimeSeconds?: number;
|
|
17
|
+
/**
|
|
18
|
+
* Enables content-based deduplication for FIFO queues.
|
|
19
|
+
* Only applicable when fifo is true.
|
|
20
|
+
*/
|
|
21
|
+
contentBasedDeduplication?: boolean;
|
|
22
|
+
deduplicationScope?: "messageGroup" | "queue";
|
|
23
|
+
fifoThroughputLimit?: "perQueue" | "perMessageGroupId";
|
|
24
|
+
tags?: Record<string, string>;
|
|
25
|
+
}
|
|
26
|
+
export interface QueueOutput extends QueueProps {
|
|
27
|
+
id: string;
|
|
28
|
+
arn: string;
|
|
29
|
+
url: string;
|
|
30
|
+
}
|
|
31
|
+
declare const Queue_base: import("../resource").Provider<"sqs::Queue", [props: QueueProps], {
|
|
32
|
+
id: string;
|
|
33
|
+
arn: string;
|
|
34
|
+
url: string;
|
|
35
|
+
/**
|
|
36
|
+
* Name of the queue
|
|
37
|
+
* For FIFO queues, the name must end with the .fifo suffix
|
|
38
|
+
*/
|
|
39
|
+
queueName: string;
|
|
40
|
+
/**
|
|
41
|
+
* Whether this is a FIFO queue.
|
|
42
|
+
* If true, the queueName must end with .fifo suffix
|
|
43
|
+
*/
|
|
44
|
+
fifo?: boolean;
|
|
45
|
+
visibilityTimeout?: number;
|
|
46
|
+
messageRetentionPeriod?: number;
|
|
47
|
+
maximumMessageSize?: number;
|
|
48
|
+
delaySeconds?: number;
|
|
49
|
+
receiveMessageWaitTimeSeconds?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Enables content-based deduplication for FIFO queues.
|
|
52
|
+
* Only applicable when fifo is true.
|
|
53
|
+
*/
|
|
54
|
+
contentBasedDeduplication?: boolean;
|
|
55
|
+
deduplicationScope?: "messageGroup" | "queue";
|
|
56
|
+
fifoThroughputLimit?: "perQueue" | "perMessageGroupId";
|
|
57
|
+
tags?: Record<string, string>;
|
|
58
|
+
}>;
|
|
59
|
+
export declare class Queue extends Queue_base {
|
|
60
|
+
}
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/aws/queue.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B,CAAC,EAAE,MAAM,CAAC;IAEvC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC,kBAAkB,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAC9C,mBAAmB,CAAC,EAAE,UAAU,GAAG,mBAAmB,CAAC;IACvD,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,GAAG,EAAE,MAAM,CAAC;CACb;;;;;IAjCC;;;OAGG;eACQ,MAAM;IAEjB;;;OAGG;WACI,OAAO;wBAEM,MAAM;6BACD,MAAM;yBACV,MAAM;mBACZ,MAAM;oCACW,MAAM;IAEtC;;;OAGG;gCACyB,OAAO;yBAEd,cAAc,GAAG,OAAO;0BACvB,UAAU,GAAG,mBAAmB;WAC/C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;AAS/B,qBAAa,KAAM,SAAQ,UAsM1B;CAAG"}
|
package/lib/aws/queue.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { CreateQueueCommand, DeleteQueueCommand, GetQueueAttributesCommand, GetQueueUrlCommand, SQSClient, } from "@aws-sdk/client-sqs";
|
|
2
|
+
import { Resource } from "../resource";
|
|
3
|
+
export class Queue extends Resource("sqs::Queue", async (ctx, props) => {
|
|
4
|
+
const client = new SQSClient({});
|
|
5
|
+
// Don't automatically add .fifo suffix - user must include it in queueName
|
|
6
|
+
const queueName = props.queueName;
|
|
7
|
+
// Validate that FIFO queues have .fifo suffix
|
|
8
|
+
if (props.fifo && !queueName.endsWith(".fifo")) {
|
|
9
|
+
throw new Error("FIFO queue names must end with .fifo suffix");
|
|
10
|
+
}
|
|
11
|
+
if (ctx.event === "delete") {
|
|
12
|
+
try {
|
|
13
|
+
// Get queue URL first
|
|
14
|
+
const urlResponse = await client.send(new GetQueueUrlCommand({
|
|
15
|
+
QueueName: queueName,
|
|
16
|
+
}));
|
|
17
|
+
// Delete the queue
|
|
18
|
+
await client.send(new DeleteQueueCommand({
|
|
19
|
+
QueueUrl: urlResponse.QueueUrl,
|
|
20
|
+
}));
|
|
21
|
+
// Wait for queue to be deleted
|
|
22
|
+
let queueDeleted = false;
|
|
23
|
+
while (!queueDeleted) {
|
|
24
|
+
try {
|
|
25
|
+
await client.send(new GetQueueUrlCommand({
|
|
26
|
+
QueueName: queueName,
|
|
27
|
+
}));
|
|
28
|
+
// If we get here, queue still exists
|
|
29
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error.name === "QueueDoesNotExist") {
|
|
33
|
+
queueDeleted = true;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error.name !== "QueueDoesNotExist") {
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
...props,
|
|
48
|
+
id: props.queueName,
|
|
49
|
+
arn: `arn:aws:sqs:${client.config.region}:${process.env.AWS_ACCOUNT_ID}:${queueName}`,
|
|
50
|
+
url: "",
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Create queue with attributes
|
|
55
|
+
const attributes = {};
|
|
56
|
+
if (props.visibilityTimeout !== undefined) {
|
|
57
|
+
attributes["VisibilityTimeout"] = props.visibilityTimeout.toString();
|
|
58
|
+
}
|
|
59
|
+
if (props.messageRetentionPeriod !== undefined) {
|
|
60
|
+
attributes["MessageRetentionPeriod"] =
|
|
61
|
+
props.messageRetentionPeriod.toString();
|
|
62
|
+
}
|
|
63
|
+
if (props.maximumMessageSize !== undefined) {
|
|
64
|
+
attributes["MaximumMessageSize"] = props.maximumMessageSize.toString();
|
|
65
|
+
}
|
|
66
|
+
if (props.delaySeconds !== undefined) {
|
|
67
|
+
attributes["DelaySeconds"] = props.delaySeconds.toString();
|
|
68
|
+
}
|
|
69
|
+
if (props.receiveMessageWaitTimeSeconds !== undefined) {
|
|
70
|
+
attributes["ReceiveMessageWaitTimeSeconds"] =
|
|
71
|
+
props.receiveMessageWaitTimeSeconds.toString();
|
|
72
|
+
}
|
|
73
|
+
// FIFO specific attributes
|
|
74
|
+
if (props.fifo) {
|
|
75
|
+
attributes["FifoQueue"] = "true";
|
|
76
|
+
if (props.contentBasedDeduplication) {
|
|
77
|
+
attributes["ContentBasedDeduplication"] = "true";
|
|
78
|
+
}
|
|
79
|
+
if (props.deduplicationScope) {
|
|
80
|
+
attributes["DeduplicationScope"] = props.deduplicationScope;
|
|
81
|
+
}
|
|
82
|
+
if (props.fifoThroughputLimit) {
|
|
83
|
+
attributes["FifoThroughputLimit"] = props.fifoThroughputLimit;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Convert tags to AWS format
|
|
87
|
+
const tags = props.tags
|
|
88
|
+
? Object.entries(props.tags).reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})
|
|
89
|
+
: undefined;
|
|
90
|
+
try {
|
|
91
|
+
// Create the queue
|
|
92
|
+
const createResponse = await client.send(new CreateQueueCommand({
|
|
93
|
+
QueueName: queueName,
|
|
94
|
+
Attributes: attributes,
|
|
95
|
+
tags,
|
|
96
|
+
}));
|
|
97
|
+
// Get queue attributes
|
|
98
|
+
const attributesResponse = await client.send(new GetQueueAttributesCommand({
|
|
99
|
+
QueueUrl: createResponse.QueueUrl,
|
|
100
|
+
AttributeNames: ["QueueArn"],
|
|
101
|
+
}));
|
|
102
|
+
return {
|
|
103
|
+
...props,
|
|
104
|
+
id: props.queueName,
|
|
105
|
+
arn: attributesResponse.Attributes.QueueArn,
|
|
106
|
+
url: createResponse.QueueUrl,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (error.name === "QueueAlreadyExists") {
|
|
111
|
+
// Get existing queue URL
|
|
112
|
+
const urlResponse = await client.send(new GetQueueUrlCommand({
|
|
113
|
+
QueueName: queueName,
|
|
114
|
+
}));
|
|
115
|
+
// Get queue attributes
|
|
116
|
+
const attributesResponse = await client.send(new GetQueueAttributesCommand({
|
|
117
|
+
QueueUrl: urlResponse.QueueUrl,
|
|
118
|
+
AttributeNames: ["QueueArn"],
|
|
119
|
+
}));
|
|
120
|
+
return {
|
|
121
|
+
...props,
|
|
122
|
+
id: props.queueName,
|
|
123
|
+
arn: attributesResponse.Attributes.QueueArn,
|
|
124
|
+
url: urlResponse.QueueUrl,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
else if (error.name === "QueueDeletedRecently") {
|
|
128
|
+
// Queue was recently deleted, wait and retry
|
|
129
|
+
const maxRetries = 3;
|
|
130
|
+
let retryCount = 0;
|
|
131
|
+
while (retryCount < maxRetries) {
|
|
132
|
+
try {
|
|
133
|
+
// Wait for 60 seconds before retrying
|
|
134
|
+
await new Promise((resolve) => setTimeout(resolve, 61000));
|
|
135
|
+
// Retry creating the queue
|
|
136
|
+
const createResponse = await client.send(new CreateQueueCommand({
|
|
137
|
+
QueueName: queueName,
|
|
138
|
+
Attributes: attributes,
|
|
139
|
+
tags,
|
|
140
|
+
}));
|
|
141
|
+
// Get queue attributes
|
|
142
|
+
const attributesResponse = await client.send(new GetQueueAttributesCommand({
|
|
143
|
+
QueueUrl: createResponse.QueueUrl,
|
|
144
|
+
AttributeNames: ["QueueArn"],
|
|
145
|
+
}));
|
|
146
|
+
return {
|
|
147
|
+
...props,
|
|
148
|
+
id: props.queueName,
|
|
149
|
+
arn: attributesResponse.Attributes.QueueArn,
|
|
150
|
+
url: createResponse.QueueUrl,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (retryError) {
|
|
154
|
+
if (retryError.name !== "QueueDeletedRecently" ||
|
|
155
|
+
retryCount === maxRetries - 1) {
|
|
156
|
+
throw retryError;
|
|
157
|
+
}
|
|
158
|
+
retryCount++;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}) {
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/aws/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { PolicyDocument } from "./policy";
|
|
2
|
+
export interface RoleProps {
|
|
3
|
+
roleName: string;
|
|
4
|
+
assumeRolePolicy: PolicyDocument;
|
|
5
|
+
description?: string;
|
|
6
|
+
path?: string;
|
|
7
|
+
maxSessionDuration?: number;
|
|
8
|
+
permissionsBoundary?: string;
|
|
9
|
+
policies?: Array<{
|
|
10
|
+
policyName: string;
|
|
11
|
+
policyDocument: PolicyDocument;
|
|
12
|
+
}>;
|
|
13
|
+
managedPolicyArns?: string[];
|
|
14
|
+
tags?: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export interface RoleOutput extends RoleProps {
|
|
17
|
+
id: string;
|
|
18
|
+
arn: string;
|
|
19
|
+
uniqueId: string;
|
|
20
|
+
roleId: string;
|
|
21
|
+
createDate: Date;
|
|
22
|
+
}
|
|
23
|
+
declare const Role_base: import("../resource").Provider<"iam::Role", [props: RoleProps], RoleOutput>;
|
|
24
|
+
export declare class Role extends Role_base {
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=role.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../src/aws/role.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,cAAc,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,cAAc,CAAC;KAChC,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;CAClB;;AAED,qBAAa,IAAK,SAAQ,SA6QzB;CAAG"}
|
package/lib/aws/role.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role.js","sourceRoot":"","sources":["../../src/aws/role.ts"],"names":[],"mappings":"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"}
|