alchemy-effect 0.3.0 → 0.4.0

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 (158) hide show
  1. package/bin/alchemy-effect.js +539 -223
  2. package/bin/alchemy-effect.js.map +1 -1
  3. package/lib/apply.d.ts +4 -4
  4. package/lib/apply.d.ts.map +1 -1
  5. package/lib/apply.js +411 -131
  6. package/lib/apply.js.map +1 -1
  7. package/lib/aws/dynamodb/table.provider.d.ts.map +1 -1
  8. package/lib/aws/dynamodb/table.provider.js +1 -0
  9. package/lib/aws/dynamodb/table.provider.js.map +1 -1
  10. package/lib/aws/ec2/index.d.ts +8 -0
  11. package/lib/aws/ec2/index.d.ts.map +1 -1
  12. package/lib/aws/ec2/index.js +8 -0
  13. package/lib/aws/ec2/index.js.map +1 -1
  14. package/lib/aws/ec2/internet-gateway.d.ts +65 -0
  15. package/lib/aws/ec2/internet-gateway.d.ts.map +1 -0
  16. package/lib/aws/ec2/internet-gateway.js +4 -0
  17. package/lib/aws/ec2/internet-gateway.js.map +1 -0
  18. package/lib/aws/ec2/internet-gateway.provider.d.ts +6 -0
  19. package/lib/aws/ec2/internet-gateway.provider.d.ts.map +1 -0
  20. package/lib/aws/ec2/internet-gateway.provider.js +193 -0
  21. package/lib/aws/ec2/internet-gateway.provider.js.map +1 -0
  22. package/lib/aws/ec2/route-table-association.d.ts +63 -0
  23. package/lib/aws/ec2/route-table-association.d.ts.map +1 -0
  24. package/lib/aws/ec2/route-table-association.js +4 -0
  25. package/lib/aws/ec2/route-table-association.js.map +1 -0
  26. package/lib/aws/ec2/route-table-association.provider.d.ts +4 -0
  27. package/lib/aws/ec2/route-table-association.provider.d.ts.map +1 -0
  28. package/lib/aws/ec2/route-table-association.provider.js +121 -0
  29. package/lib/aws/ec2/route-table-association.provider.js.map +1 -0
  30. package/lib/aws/ec2/route-table.d.ts +159 -0
  31. package/lib/aws/ec2/route-table.d.ts.map +1 -0
  32. package/lib/aws/ec2/route-table.js +4 -0
  33. package/lib/aws/ec2/route-table.js.map +1 -0
  34. package/lib/aws/ec2/route-table.provider.d.ts +6 -0
  35. package/lib/aws/ec2/route-table.provider.d.ts.map +1 -0
  36. package/lib/aws/ec2/route-table.provider.js +213 -0
  37. package/lib/aws/ec2/route-table.provider.js.map +1 -0
  38. package/lib/aws/ec2/route.d.ts +155 -0
  39. package/lib/aws/ec2/route.d.ts.map +1 -0
  40. package/lib/aws/ec2/route.js +3 -0
  41. package/lib/aws/ec2/route.js.map +1 -0
  42. package/lib/aws/ec2/route.provider.d.ts +4 -0
  43. package/lib/aws/ec2/route.provider.d.ts.map +1 -0
  44. package/lib/aws/ec2/route.provider.js +166 -0
  45. package/lib/aws/ec2/route.provider.js.map +1 -0
  46. package/lib/aws/ec2/subnet.provider.d.ts.map +1 -1
  47. package/lib/aws/ec2/subnet.provider.js +1 -1
  48. package/lib/aws/ec2/subnet.provider.js.map +1 -1
  49. package/lib/aws/ec2/vpc.d.ts +1 -0
  50. package/lib/aws/ec2/vpc.d.ts.map +1 -1
  51. package/lib/aws/ec2/vpc.provider.d.ts +2 -2
  52. package/lib/aws/ec2/vpc.provider.d.ts.map +1 -1
  53. package/lib/aws/ec2/vpc.provider.js +38 -15
  54. package/lib/aws/ec2/vpc.provider.js.map +1 -1
  55. package/lib/aws/index.d.ts +2 -3
  56. package/lib/aws/index.d.ts.map +1 -1
  57. package/lib/aws/index.js +2 -1
  58. package/lib/aws/index.js.map +1 -1
  59. package/lib/aws/lambda/function.provider.d.ts +2 -2
  60. package/lib/aws/lambda/function.provider.d.ts.map +1 -1
  61. package/lib/aws/lambda/function.provider.js +21 -20
  62. package/lib/aws/lambda/function.provider.js.map +1 -1
  63. package/lib/aws/sqs/queue.provider.d.ts +2 -2
  64. package/lib/aws/sqs/queue.provider.d.ts.map +1 -1
  65. package/lib/aws/sqs/queue.provider.js +3 -2
  66. package/lib/aws/sqs/queue.provider.js.map +1 -1
  67. package/lib/cli/index.d.ts +178 -99
  68. package/lib/cli/index.d.ts.map +1 -1
  69. package/lib/cloudflare/kv/namespace.client.d.ts +1 -1
  70. package/lib/cloudflare/kv/namespace.provider.d.ts.map +1 -1
  71. package/lib/cloudflare/kv/namespace.provider.js +1 -0
  72. package/lib/cloudflare/kv/namespace.provider.js.map +1 -1
  73. package/lib/cloudflare/r2/bucket.provider.d.ts.map +1 -1
  74. package/lib/cloudflare/r2/bucket.provider.js +6 -1
  75. package/lib/cloudflare/r2/bucket.provider.js.map +1 -1
  76. package/lib/cloudflare/worker/worker.provider.d.ts +1 -1
  77. package/lib/cloudflare/worker/worker.provider.d.ts.map +1 -1
  78. package/lib/cloudflare/worker/worker.provider.js +6 -2
  79. package/lib/cloudflare/worker/worker.provider.js.map +1 -1
  80. package/lib/diff.d.ts +8 -6
  81. package/lib/diff.d.ts.map +1 -1
  82. package/lib/diff.js +13 -0
  83. package/lib/diff.js.map +1 -1
  84. package/lib/event.d.ts +1 -1
  85. package/lib/event.d.ts.map +1 -1
  86. package/lib/instance-id.d.ts +8 -0
  87. package/lib/instance-id.d.ts.map +1 -0
  88. package/lib/instance-id.js +12 -0
  89. package/lib/instance-id.js.map +1 -0
  90. package/lib/output.d.ts +4 -2
  91. package/lib/output.d.ts.map +1 -1
  92. package/lib/output.js +18 -4
  93. package/lib/output.js.map +1 -1
  94. package/lib/physical-name.d.ts +14 -1
  95. package/lib/physical-name.d.ts.map +1 -1
  96. package/lib/physical-name.js +41 -2
  97. package/lib/physical-name.js.map +1 -1
  98. package/lib/plan.d.ts +49 -42
  99. package/lib/plan.d.ts.map +1 -1
  100. package/lib/plan.js +359 -127
  101. package/lib/plan.js.map +1 -1
  102. package/lib/provider.d.ts +26 -9
  103. package/lib/provider.d.ts.map +1 -1
  104. package/lib/provider.js +9 -0
  105. package/lib/provider.js.map +1 -1
  106. package/lib/resource.d.ts +2 -2
  107. package/lib/resource.d.ts.map +1 -1
  108. package/lib/resource.js.map +1 -1
  109. package/lib/state.d.ts +86 -9
  110. package/lib/state.d.ts.map +1 -1
  111. package/lib/state.js +21 -18
  112. package/lib/state.js.map +1 -1
  113. package/lib/tags.d.ts +15 -0
  114. package/lib/tags.d.ts.map +1 -1
  115. package/lib/tags.js +27 -0
  116. package/lib/tags.js.map +1 -1
  117. package/lib/test.d.ts +2 -2
  118. package/lib/test.d.ts.map +1 -1
  119. package/lib/test.js +4 -4
  120. package/lib/test.js.map +1 -1
  121. package/lib/todo.d.ts +3 -0
  122. package/lib/todo.d.ts.map +1 -0
  123. package/lib/todo.js +3 -0
  124. package/lib/todo.js.map +1 -0
  125. package/lib/tsconfig.test.tsbuildinfo +1 -1
  126. package/package.json +2 -2
  127. package/src/apply.ts +758 -374
  128. package/src/aws/dynamodb/table.provider.ts +1 -0
  129. package/src/aws/ec2/index.ts +8 -0
  130. package/src/aws/ec2/internet-gateway.provider.ts +316 -0
  131. package/src/aws/ec2/internet-gateway.ts +79 -0
  132. package/src/aws/ec2/route-table-association.provider.ts +214 -0
  133. package/src/aws/ec2/route-table-association.ts +82 -0
  134. package/src/aws/ec2/route-table.provider.ts +306 -0
  135. package/src/aws/ec2/route-table.ts +175 -0
  136. package/src/aws/ec2/route.provider.ts +213 -0
  137. package/src/aws/ec2/route.ts +192 -0
  138. package/src/aws/ec2/subnet.provider.ts +2 -2
  139. package/src/aws/ec2/vpc.provider.ts +43 -19
  140. package/src/aws/ec2/vpc.ts +2 -0
  141. package/src/aws/index.ts +4 -1
  142. package/src/aws/lambda/function.provider.ts +25 -23
  143. package/src/aws/sqs/queue.provider.ts +3 -2
  144. package/src/cloudflare/kv/namespace.provider.ts +1 -0
  145. package/src/cloudflare/r2/bucket.provider.ts +7 -1
  146. package/src/cloudflare/worker/worker.provider.ts +6 -2
  147. package/src/diff.ts +35 -17
  148. package/src/event.ts +6 -0
  149. package/src/instance-id.ts +16 -0
  150. package/src/output.ts +29 -5
  151. package/src/physical-name.ts +57 -2
  152. package/src/plan.ts +488 -197
  153. package/src/provider.ts +46 -9
  154. package/src/resource.ts +50 -4
  155. package/src/state.ts +150 -35
  156. package/src/tags.ts +31 -0
  157. package/src/test.ts +5 -5
  158. package/src/todo.ts +4 -0
@@ -0,0 +1,121 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schedule from "effect/Schedule";
3
+ import { EC2Client } from "./client.js";
4
+ import { RouteTableAssociation, } from "./route-table-association.js";
5
+ export const routeTableAssociationProvider = () => RouteTableAssociation.provider.effect(Effect.gen(function* () {
6
+ const ec2 = yield* EC2Client;
7
+ return {
8
+ stables: ["associationId", "subnetId", "gatewayId"],
9
+ diff: Effect.fn(function* ({ news, olds }) {
10
+ // Subnet/Gateway change requires replacement (use ReplaceRouteTableAssociation internally)
11
+ if (olds.subnetId !== news.subnetId) {
12
+ return { action: "replace" };
13
+ }
14
+ if (olds.gatewayId !== news.gatewayId) {
15
+ return { action: "replace" };
16
+ }
17
+ // Route table change can be done via ReplaceRouteTableAssociation
18
+ }),
19
+ create: Effect.fn(function* ({ news, session }) {
20
+ // Call AssociateRouteTable
21
+ const result = yield* ec2
22
+ .associateRouteTable({
23
+ RouteTableId: news.routeTableId,
24
+ SubnetId: news.subnetId,
25
+ GatewayId: news.gatewayId,
26
+ DryRun: false,
27
+ })
28
+ .pipe(Effect.retry({
29
+ // Retry if route table or subnet/gateway is not yet available
30
+ while: (e) => e._tag === "InvalidRouteTableID.NotFound" ||
31
+ e._tag === "InvalidSubnetID.NotFound",
32
+ schedule: Schedule.exponential(100),
33
+ }));
34
+ const associationId = result.AssociationId;
35
+ yield* session.note(`Route table association created: ${associationId}`);
36
+ // Wait for association to be associated
37
+ yield* waitForAssociationState(ec2, news.routeTableId, associationId, "associated", session);
38
+ // Return attributes
39
+ return {
40
+ associationId,
41
+ routeTableId: news.routeTableId,
42
+ subnetId: news.subnetId,
43
+ gatewayId: news.gatewayId,
44
+ associationState: {
45
+ state: result.AssociationState?.State ?? "associated",
46
+ statusMessage: result.AssociationState?.StatusMessage,
47
+ },
48
+ };
49
+ }),
50
+ update: Effect.fn(function* ({ news, olds, output, session }) {
51
+ // If route table changed, use ReplaceRouteTableAssociation
52
+ if (news.routeTableId !== olds.routeTableId) {
53
+ const result = yield* ec2.replaceRouteTableAssociation({
54
+ AssociationId: output.associationId,
55
+ RouteTableId: news.routeTableId,
56
+ DryRun: false,
57
+ });
58
+ const newAssociationId = result.NewAssociationId;
59
+ yield* session.note(`Route table association replaced: ${newAssociationId}`);
60
+ // Wait for new association to be associated
61
+ yield* waitForAssociationState(ec2, news.routeTableId, newAssociationId, "associated", session);
62
+ return {
63
+ associationId: newAssociationId,
64
+ routeTableId: news.routeTableId,
65
+ subnetId: news.subnetId,
66
+ gatewayId: news.gatewayId,
67
+ associationState: {
68
+ state: result.AssociationState?.State ?? "associated",
69
+ statusMessage: result.AssociationState?.StatusMessage,
70
+ },
71
+ };
72
+ }
73
+ // No changes needed
74
+ return output;
75
+ }),
76
+ delete: Effect.fn(function* ({ output, session }) {
77
+ yield* session.note(`Deleting route table association: ${output.associationId}`);
78
+ // Disassociate the route table
79
+ yield* ec2
80
+ .disassociateRouteTable({
81
+ AssociationId: output.associationId,
82
+ DryRun: false,
83
+ })
84
+ .pipe(Effect.tapError(Effect.log), Effect.catchTag("InvalidAssociationID.NotFound", () => Effect.void));
85
+ yield* session.note(`Route table association ${output.associationId} deleted successfully`);
86
+ }),
87
+ };
88
+ }));
89
+ /**
90
+ * Wait for association to reach a specific state
91
+ */
92
+ const waitForAssociationState = (ec2, routeTableId, associationId, targetState, session) => Effect.retry(Effect.gen(function* () {
93
+ const result = yield* ec2
94
+ .describeRouteTables({ RouteTableIds: [routeTableId] })
95
+ .pipe(Effect.catchTag("InvalidRouteTableID.NotFound", () => Effect.succeed({ RouteTables: [] })));
96
+ const routeTable = result.RouteTables?.[0];
97
+ if (!routeTable) {
98
+ return yield* Effect.fail(new Error("Route table not found"));
99
+ }
100
+ const association = routeTable.Associations?.find((a) => a.RouteTableAssociationId === associationId);
101
+ if (!association) {
102
+ // Association might not exist yet, retry
103
+ return yield* Effect.fail(new Error("Association not found"));
104
+ }
105
+ if (association.AssociationState?.State === targetState) {
106
+ return;
107
+ }
108
+ if (association.AssociationState?.State === "failed") {
109
+ return yield* Effect.fail(new Error(`Association failed: ${association.AssociationState.StatusMessage}`));
110
+ }
111
+ // Still in progress, fail to trigger retry
112
+ return yield* Effect.fail(new Error(`Association state: ${association.AssociationState?.State}`));
113
+ }), {
114
+ schedule: Schedule.fixed(1000).pipe(
115
+ // Check every second
116
+ Schedule.intersect(Schedule.recurs(30)), // Max 30 seconds
117
+ Schedule.tapOutput(([, attempt]) => session
118
+ ? session.note(`Waiting for association to be ${targetState}... (${attempt + 1}s)`)
119
+ : Effect.void)),
120
+ });
121
+ //# sourceMappingURL=route-table-association.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-table-association.provider.js","sourceRoot":"","sources":["../../../src/aws/ec2/route-table-association.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import type * as EC2 from "itty-aws/ec2";
2
+ import type { Input } from "../../input.ts";
3
+ import { Resource } from "../../resource.ts";
4
+ import type { AccountID } from "../account.ts";
5
+ import type { RegionID } from "../region.ts";
6
+ import type { VpcId } from "./vpc.ts";
7
+ export declare const RouteTable: (<const ID extends string, const Props extends RouteTableProps>(id: ID, props: Props) => RouteTable<ID, Props>) & {
8
+ new (): RouteTable<string, RouteTableProps> & {
9
+ parent: RouteTable<string, RouteTableProps>;
10
+ };
11
+ type: "AWS.EC2.RouteTable";
12
+ parent: RouteTable<string, RouteTableProps>;
13
+ provider: import("../../resource.ts").ResourceTags<RouteTable<string, RouteTableProps>>;
14
+ } & {
15
+ type: "AWS.EC2.RouteTable";
16
+ provider: import("../../resource.ts").ResourceTags<RouteTable<string, RouteTableProps>>;
17
+ };
18
+ export interface RouteTable<ID extends string = string, Props extends RouteTableProps = RouteTableProps> extends Resource<"AWS.EC2.RouteTable", ID, Props, RouteTableAttrs<Input.Resolve<Props>>, RouteTable> {
19
+ }
20
+ export type RouteTableId<ID extends string = string> = `rtb-${ID}`;
21
+ export declare const RouteTableId: <ID extends string>(id: ID) => ID & RouteTableId<ID>;
22
+ export interface RouteTableProps {
23
+ /**
24
+ * The VPC to create the route table in.
25
+ * Required.
26
+ */
27
+ vpcId: Input<VpcId>;
28
+ /**
29
+ * Tags to assign to the route table.
30
+ * These will be merged with alchemy auto-tags (alchemy::app, alchemy::stage, alchemy::id).
31
+ */
32
+ tags?: Record<string, Input<string>>;
33
+ }
34
+ export interface RouteTableAttrs<Props extends RouteTableProps> {
35
+ /**
36
+ * The ID of the VPC the route table is in.
37
+ */
38
+ vpcId: Props["vpcId"];
39
+ /**
40
+ * The ID of the route table.
41
+ */
42
+ routeTableId: RouteTableId;
43
+ /**
44
+ * The Amazon Resource Name (ARN) of the route table.
45
+ */
46
+ routeTableArn: `arn:aws:ec2:${RegionID}:${AccountID}:route-table/${this["routeTableId"]}`;
47
+ /**
48
+ * The ID of the AWS account that owns the route table.
49
+ */
50
+ ownerId?: string;
51
+ /**
52
+ * The associations between the route table and subnets or gateways.
53
+ */
54
+ associations?: Array<{
55
+ /**
56
+ * Whether this is the main route table for the VPC.
57
+ */
58
+ main: boolean;
59
+ /**
60
+ * The ID of the association.
61
+ */
62
+ routeTableAssociationId?: string;
63
+ /**
64
+ * The ID of the route table.
65
+ */
66
+ routeTableId?: string;
67
+ /**
68
+ * The ID of the subnet (if the association is with a subnet).
69
+ */
70
+ subnetId?: string;
71
+ /**
72
+ * The ID of the gateway (if the association is with a gateway).
73
+ */
74
+ gatewayId?: string;
75
+ /**
76
+ * The state of the association.
77
+ */
78
+ associationState?: {
79
+ state: EC2.RouteTableAssociationStateCode;
80
+ statusMessage?: string;
81
+ };
82
+ }>;
83
+ /**
84
+ * The routes in the route table.
85
+ */
86
+ routes?: Array<{
87
+ /**
88
+ * The IPv4 CIDR block used for the destination match.
89
+ */
90
+ destinationCidrBlock?: string;
91
+ /**
92
+ * The IPv6 CIDR block used for the destination match.
93
+ */
94
+ destinationIpv6CidrBlock?: string;
95
+ /**
96
+ * The prefix of the AWS service.
97
+ */
98
+ destinationPrefixListId?: string;
99
+ /**
100
+ * The ID of the egress-only internet gateway.
101
+ */
102
+ egressOnlyInternetGatewayId?: string;
103
+ /**
104
+ * The ID of the gateway (internet gateway or virtual private gateway).
105
+ */
106
+ gatewayId?: string;
107
+ /**
108
+ * The ID of the NAT instance.
109
+ */
110
+ instanceId?: string;
111
+ /**
112
+ * The ID of AWS account that owns the NAT instance.
113
+ */
114
+ instanceOwnerId?: string;
115
+ /**
116
+ * The ID of the NAT gateway.
117
+ */
118
+ natGatewayId?: string;
119
+ /**
120
+ * The ID of the transit gateway.
121
+ */
122
+ transitGatewayId?: string;
123
+ /**
124
+ * The ID of the local gateway.
125
+ */
126
+ localGatewayId?: string;
127
+ /**
128
+ * The ID of the carrier gateway.
129
+ */
130
+ carrierGatewayId?: string;
131
+ /**
132
+ * The ID of the network interface.
133
+ */
134
+ networkInterfaceId?: string;
135
+ /**
136
+ * Describes how the route was created.
137
+ */
138
+ origin: EC2.RouteOrigin;
139
+ /**
140
+ * The state of the route.
141
+ */
142
+ state: EC2.RouteState;
143
+ /**
144
+ * The ID of the VPC peering connection.
145
+ */
146
+ vpcPeeringConnectionId?: string;
147
+ /**
148
+ * The Amazon Resource Name (ARN) of the core network.
149
+ */
150
+ coreNetworkArn?: string;
151
+ }>;
152
+ /**
153
+ * Any virtual private gateway (VGW) propagating routes.
154
+ */
155
+ propagatingVgws?: Array<{
156
+ gatewayId: string;
157
+ }>;
158
+ }
159
+ //# sourceMappingURL=route-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-table.d.ts","sourceRoot":"","sources":["../../../src/aws/ec2/route-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Resource } from "../../resource.js";
2
+ export const RouteTable = Resource("AWS.EC2.RouteTable");
3
+ export const RouteTableId = (id) => `rtb-${id}`;
4
+ //# sourceMappingURL=route-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-table.js","sourceRoot":"","sources":["../../../src/aws/ec2/route-table.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK7C,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAK/B,oBAAoB,CAAC,CAAC;AAczB,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,EAAM,EACiB,EAAE,CAAC,OAAO,EAAE,EAA2B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Account } from "../account.ts";
2
+ import { Region } from "../region.ts";
3
+ import { EC2Client } from "./client.ts";
4
+ import { RouteTable, type RouteTableProps } from "./route-table.ts";
5
+ export declare const routeTableProvider: () => import("effect/Layer").Layer<import("../../provider.ts").Provider<RouteTable<string, RouteTableProps>>, never, import("../../app.ts").App | Region | Account | EC2Client>;
6
+ //# sourceMappingURL=route-table.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-table.provider.d.ts","sourceRoot":"","sources":["../../../src/aws/ec2/route-table.provider.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,UAAU,EAGV,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,kBAAkB,iLA8N5B,CAAC"}
@@ -0,0 +1,213 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schedule from "effect/Schedule";
3
+ import { createTagger, createTagsList } from "../../tags.js";
4
+ import { Account } from "../account.js";
5
+ import { Region } from "../region.js";
6
+ import { EC2Client } from "./client.js";
7
+ import { RouteTable, } from "./route-table.js";
8
+ export const routeTableProvider = () => RouteTable.provider.effect(Effect.gen(function* () {
9
+ const ec2 = yield* EC2Client;
10
+ const region = yield* Region;
11
+ const accountId = yield* Account;
12
+ const tagged = yield* createTagger();
13
+ return {
14
+ stables: ["routeTableId", "ownerId", "routeTableArn", "vpcId"],
15
+ diff: Effect.fn(function* ({ news, olds }) {
16
+ // VpcId change requires replacement
17
+ if (olds.vpcId !== news.vpcId) {
18
+ return { action: "replace" };
19
+ }
20
+ // Tags can be updated in-place
21
+ }),
22
+ create: Effect.fn(function* ({ id, news, session }) {
23
+ // 1. Prepare tags
24
+ const alchemyTags = tagged(id);
25
+ const userTags = news.tags ?? {};
26
+ const allTags = { ...alchemyTags, ...userTags };
27
+ // 2. Call CreateRouteTable
28
+ const createResult = yield* ec2
29
+ .createRouteTable({
30
+ VpcId: news.vpcId,
31
+ TagSpecifications: [
32
+ {
33
+ ResourceType: "route-table",
34
+ Tags: createTagsList(allTags),
35
+ },
36
+ ],
37
+ DryRun: false,
38
+ })
39
+ .pipe(Effect.retry({
40
+ // Retry if VPC is not yet available
41
+ while: (e) => e._tag === "InvalidVpcID.NotFound",
42
+ schedule: Schedule.exponential(100),
43
+ }));
44
+ const routeTableId = createResult.RouteTable
45
+ .RouteTableId;
46
+ yield* session.note(`Route table created: ${routeTableId}`);
47
+ // 3. Describe to get full details
48
+ const routeTable = yield* describeRouteTable(ec2, routeTableId, session);
49
+ // 4. Return attributes
50
+ return {
51
+ routeTableId,
52
+ routeTableArn: `arn:aws:ec2:${region}:${accountId}:route-table/${routeTableId}`,
53
+ vpcId: news.vpcId,
54
+ ownerId: routeTable.OwnerId,
55
+ associations: routeTable.Associations?.map((assoc) => ({
56
+ main: assoc.Main ?? false,
57
+ routeTableAssociationId: assoc.RouteTableAssociationId,
58
+ routeTableId: assoc.RouteTableId,
59
+ subnetId: assoc.SubnetId,
60
+ gatewayId: assoc.GatewayId,
61
+ associationState: assoc.AssociationState
62
+ ? {
63
+ state: assoc.AssociationState.State,
64
+ statusMessage: assoc.AssociationState.StatusMessage,
65
+ }
66
+ : undefined,
67
+ })),
68
+ routes: routeTable.Routes?.map((route) => ({
69
+ destinationCidrBlock: route.DestinationCidrBlock,
70
+ destinationIpv6CidrBlock: route.DestinationIpv6CidrBlock,
71
+ destinationPrefixListId: route.DestinationPrefixListId,
72
+ egressOnlyInternetGatewayId: route.EgressOnlyInternetGatewayId,
73
+ gatewayId: route.GatewayId,
74
+ instanceId: route.InstanceId,
75
+ instanceOwnerId: route.InstanceOwnerId,
76
+ natGatewayId: route.NatGatewayId,
77
+ transitGatewayId: route.TransitGatewayId,
78
+ localGatewayId: route.LocalGatewayId,
79
+ carrierGatewayId: route.CarrierGatewayId,
80
+ networkInterfaceId: route.NetworkInterfaceId,
81
+ origin: route.Origin,
82
+ state: route.State,
83
+ vpcPeeringConnectionId: route.VpcPeeringConnectionId,
84
+ coreNetworkArn: route.CoreNetworkArn,
85
+ })),
86
+ propagatingVgws: routeTable.PropagatingVgws?.map((vgw) => ({
87
+ gatewayId: vgw.GatewayId,
88
+ })),
89
+ };
90
+ }),
91
+ update: Effect.fn(function* ({ news, olds, output, session }) {
92
+ const routeTableId = output.routeTableId;
93
+ // Handle tag updates
94
+ if (JSON.stringify(news.tags ?? {}) !== JSON.stringify(olds.tags ?? {})) {
95
+ const alchemyTags = tagged(output.routeTableId);
96
+ const userTags = news.tags ?? {};
97
+ const allTags = { ...alchemyTags, ...userTags };
98
+ // Delete old tags that are no longer present
99
+ const oldTagKeys = Object.keys(olds.tags ?? {});
100
+ const newTagKeys = Object.keys(news.tags ?? {});
101
+ const tagsToDelete = oldTagKeys.filter((key) => !newTagKeys.includes(key));
102
+ if (tagsToDelete.length > 0) {
103
+ yield* ec2.deleteTags({
104
+ Resources: [routeTableId],
105
+ Tags: tagsToDelete.map((key) => ({ Key: key })),
106
+ });
107
+ }
108
+ // Create/update tags
109
+ yield* ec2.createTags({
110
+ Resources: [routeTableId],
111
+ Tags: createTagsList(allTags),
112
+ });
113
+ yield* session.note("Updated tags");
114
+ }
115
+ // Re-describe to get current state
116
+ const routeTable = yield* describeRouteTable(ec2, routeTableId, session);
117
+ return {
118
+ ...output,
119
+ associations: routeTable.Associations?.map((assoc) => ({
120
+ main: assoc.Main ?? false,
121
+ routeTableAssociationId: assoc.RouteTableAssociationId,
122
+ routeTableId: assoc.RouteTableId,
123
+ subnetId: assoc.SubnetId,
124
+ gatewayId: assoc.GatewayId,
125
+ associationState: assoc.AssociationState
126
+ ? {
127
+ state: assoc.AssociationState.State,
128
+ statusMessage: assoc.AssociationState.StatusMessage,
129
+ }
130
+ : undefined,
131
+ })),
132
+ routes: routeTable.Routes?.map((route) => ({
133
+ destinationCidrBlock: route.DestinationCidrBlock,
134
+ destinationIpv6CidrBlock: route.DestinationIpv6CidrBlock,
135
+ destinationPrefixListId: route.DestinationPrefixListId,
136
+ egressOnlyInternetGatewayId: route.EgressOnlyInternetGatewayId,
137
+ gatewayId: route.GatewayId,
138
+ instanceId: route.InstanceId,
139
+ instanceOwnerId: route.InstanceOwnerId,
140
+ natGatewayId: route.NatGatewayId,
141
+ transitGatewayId: route.TransitGatewayId,
142
+ localGatewayId: route.LocalGatewayId,
143
+ carrierGatewayId: route.CarrierGatewayId,
144
+ networkInterfaceId: route.NetworkInterfaceId,
145
+ origin: route.Origin,
146
+ state: route.State,
147
+ vpcPeeringConnectionId: route.VpcPeeringConnectionId,
148
+ coreNetworkArn: route.CoreNetworkArn,
149
+ })),
150
+ propagatingVgws: routeTable.PropagatingVgws?.map((vgw) => ({
151
+ gatewayId: vgw.GatewayId,
152
+ })),
153
+ };
154
+ }),
155
+ delete: Effect.fn(function* ({ output, session }) {
156
+ const routeTableId = output.routeTableId;
157
+ yield* session.note(`Deleting route table: ${routeTableId}`);
158
+ // 1. Attempt to delete route table
159
+ yield* ec2
160
+ .deleteRouteTable({
161
+ RouteTableId: routeTableId,
162
+ DryRun: false,
163
+ })
164
+ .pipe(Effect.tapError(Effect.logDebug), Effect.catchTag("InvalidRouteTableID.NotFound", () => Effect.void),
165
+ // Retry on dependency violations (associations still being deleted)
166
+ Effect.retry({
167
+ // DependencyViolation means there are still dependent resources
168
+ while: (e) => {
169
+ return e._tag === "DependencyViolation";
170
+ },
171
+ schedule: Schedule.exponential(1000, 1.5).pipe(Schedule.intersect(Schedule.recurs(10)), // Try up to 10 times
172
+ Schedule.tapOutput(([, attempt]) => session.note(`Waiting for dependencies to clear... (attempt ${attempt + 1})`))),
173
+ }));
174
+ // 2. Wait for route table to be fully deleted
175
+ yield* waitForRouteTableDeleted(ec2, routeTableId, session);
176
+ yield* session.note(`Route table ${routeTableId} deleted successfully`);
177
+ }),
178
+ };
179
+ }));
180
+ /**
181
+ * Describe a route table by ID
182
+ */
183
+ const describeRouteTable = (ec2, routeTableId, _session) => Effect.gen(function* () {
184
+ const result = yield* ec2
185
+ .describeRouteTables({ RouteTableIds: [routeTableId] })
186
+ .pipe(Effect.catchTag("InvalidRouteTableID.NotFound", () => Effect.succeed({ RouteTables: [] })));
187
+ const routeTable = result.RouteTables?.[0];
188
+ if (!routeTable) {
189
+ return yield* Effect.fail(new Error("Route table not found"));
190
+ }
191
+ return routeTable;
192
+ });
193
+ /**
194
+ * Wait for route table to be deleted
195
+ */
196
+ const waitForRouteTableDeleted = (ec2, routeTableId, session) => Effect.gen(function* () {
197
+ yield* Effect.retry(Effect.gen(function* () {
198
+ const result = yield* ec2
199
+ .describeRouteTables({ RouteTableIds: [routeTableId] })
200
+ .pipe(Effect.tapError(Effect.logDebug), Effect.catchTag("InvalidRouteTableID.NotFound", () => Effect.succeed({ RouteTables: [] })));
201
+ if (!result.RouteTables || result.RouteTables.length === 0) {
202
+ return; // Successfully deleted
203
+ }
204
+ // Still exists, fail to trigger retry
205
+ return yield* Effect.fail(new Error("Route table still exists"));
206
+ }), {
207
+ schedule: Schedule.fixed(2000).pipe(
208
+ // Check every 2 seconds
209
+ Schedule.intersect(Schedule.recurs(15)), // Max 30 seconds
210
+ Schedule.tapOutput(([, attempt]) => session.note(`Waiting for route table deletion... (${(attempt + 1) * 2}s)`))),
211
+ });
212
+ });
213
+ //# sourceMappingURL=route-table.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-table.provider.js","sourceRoot":"","sources":["../../../src/aws/ec2/route-table.provider.ts"],"names":[],"mappings":"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"}