alchemy-effect 0.4.0 → 0.6.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 (251) hide show
  1. package/README.md +13 -7
  2. package/bin/alchemy-effect.js +307 -266
  3. package/bin/alchemy-effect.js.map +1 -1
  4. package/lib/apply.d.ts.map +1 -1
  5. package/lib/apply.js +253 -246
  6. package/lib/apply.js.map +1 -1
  7. package/lib/aws/client.d.ts.map +1 -1
  8. package/lib/aws/client.js +15 -2
  9. package/lib/aws/client.js.map +1 -1
  10. package/lib/aws/dynamodb/secondary-index.d.ts.map +1 -1
  11. package/lib/aws/dynamodb/table.d.ts.map +1 -1
  12. package/lib/aws/dynamodb/table.js.map +1 -1
  13. package/lib/aws/dynamodb/table.provider.d.ts.map +1 -1
  14. package/lib/aws/dynamodb/table.provider.js +10 -2
  15. package/lib/aws/dynamodb/table.provider.js.map +1 -1
  16. package/lib/aws/ec2/egress-only-igw.d.ts +55 -0
  17. package/lib/aws/ec2/egress-only-igw.d.ts.map +1 -0
  18. package/lib/aws/ec2/egress-only-igw.js +4 -0
  19. package/lib/aws/ec2/egress-only-igw.js.map +1 -0
  20. package/lib/aws/ec2/egress-only-igw.provider.d.ts +6 -0
  21. package/lib/aws/ec2/egress-only-igw.provider.d.ts.map +1 -0
  22. package/lib/aws/ec2/egress-only-igw.provider.js +114 -0
  23. package/lib/aws/ec2/egress-only-igw.provider.js.map +1 -0
  24. package/lib/aws/ec2/eip.d.ts +85 -0
  25. package/lib/aws/ec2/eip.d.ts.map +1 -0
  26. package/lib/aws/ec2/eip.js +4 -0
  27. package/lib/aws/ec2/eip.js.map +1 -0
  28. package/lib/aws/ec2/eip.provider.d.ts +6 -0
  29. package/lib/aws/ec2/eip.provider.d.ts.map +1 -0
  30. package/lib/aws/ec2/eip.provider.js +135 -0
  31. package/lib/aws/ec2/eip.provider.js.map +1 -0
  32. package/lib/aws/ec2/index.d.ts +18 -0
  33. package/lib/aws/ec2/index.d.ts.map +1 -1
  34. package/lib/aws/ec2/index.js +18 -0
  35. package/lib/aws/ec2/index.js.map +1 -1
  36. package/lib/aws/ec2/internet-gateway.d.ts.map +1 -1
  37. package/lib/aws/ec2/internet-gateway.provider.d.ts.map +1 -1
  38. package/lib/aws/ec2/internet-gateway.provider.js +9 -5
  39. package/lib/aws/ec2/internet-gateway.provider.js.map +1 -1
  40. package/lib/aws/ec2/nat-gateway.d.ts +127 -0
  41. package/lib/aws/ec2/nat-gateway.d.ts.map +1 -0
  42. package/lib/aws/ec2/nat-gateway.js +4 -0
  43. package/lib/aws/ec2/nat-gateway.js.map +1 -0
  44. package/lib/aws/ec2/nat-gateway.provider.d.ts +6 -0
  45. package/lib/aws/ec2/nat-gateway.provider.d.ts.map +1 -0
  46. package/lib/aws/ec2/nat-gateway.provider.js +222 -0
  47. package/lib/aws/ec2/nat-gateway.provider.js.map +1 -0
  48. package/lib/aws/ec2/network-acl-association.d.ts +44 -0
  49. package/lib/aws/ec2/network-acl-association.d.ts.map +1 -0
  50. package/lib/aws/ec2/network-acl-association.js +4 -0
  51. package/lib/aws/ec2/network-acl-association.js.map +1 -0
  52. package/lib/aws/ec2/network-acl-association.provider.d.ts +4 -0
  53. package/lib/aws/ec2/network-acl-association.provider.d.ts.map +1 -0
  54. package/lib/aws/ec2/network-acl-association.provider.js +115 -0
  55. package/lib/aws/ec2/network-acl-association.provider.js.map +1 -0
  56. package/lib/aws/ec2/network-acl-entry.d.ts +118 -0
  57. package/lib/aws/ec2/network-acl-entry.d.ts.map +1 -0
  58. package/lib/aws/ec2/network-acl-entry.js +3 -0
  59. package/lib/aws/ec2/network-acl-entry.js.map +1 -0
  60. package/lib/aws/ec2/network-acl-entry.provider.d.ts +4 -0
  61. package/lib/aws/ec2/network-acl-entry.provider.d.ts.map +1 -0
  62. package/lib/aws/ec2/network-acl-entry.provider.js +129 -0
  63. package/lib/aws/ec2/network-acl-entry.provider.js.map +1 -0
  64. package/lib/aws/ec2/network-acl.d.ts +82 -0
  65. package/lib/aws/ec2/network-acl.d.ts.map +1 -0
  66. package/lib/aws/ec2/network-acl.js +4 -0
  67. package/lib/aws/ec2/network-acl.js.map +1 -0
  68. package/lib/aws/ec2/network-acl.provider.d.ts +6 -0
  69. package/lib/aws/ec2/network-acl.provider.d.ts.map +1 -0
  70. package/lib/aws/ec2/network-acl.provider.js +136 -0
  71. package/lib/aws/ec2/network-acl.provider.js.map +1 -0
  72. package/lib/aws/ec2/route-table-association.d.ts.map +1 -1
  73. package/lib/aws/ec2/route-table-association.provider.d.ts.map +1 -1
  74. package/lib/aws/ec2/route-table-association.provider.js.map +1 -1
  75. package/lib/aws/ec2/route-table.d.ts.map +1 -1
  76. package/lib/aws/ec2/route-table.provider.d.ts.map +1 -1
  77. package/lib/aws/ec2/route-table.provider.js.map +1 -1
  78. package/lib/aws/ec2/route.d.ts.map +1 -1
  79. package/lib/aws/ec2/route.provider.d.ts.map +1 -1
  80. package/lib/aws/ec2/route.provider.js.map +1 -1
  81. package/lib/aws/ec2/security-group-rule.d.ts +118 -0
  82. package/lib/aws/ec2/security-group-rule.d.ts.map +1 -0
  83. package/lib/aws/ec2/security-group-rule.js +4 -0
  84. package/lib/aws/ec2/security-group-rule.js.map +1 -0
  85. package/lib/aws/ec2/security-group-rule.provider.d.ts +4 -0
  86. package/lib/aws/ec2/security-group-rule.provider.d.ts.map +1 -0
  87. package/lib/aws/ec2/security-group-rule.provider.js +193 -0
  88. package/lib/aws/ec2/security-group-rule.provider.js.map +1 -0
  89. package/lib/aws/ec2/security-group.d.ts +147 -0
  90. package/lib/aws/ec2/security-group.d.ts.map +1 -0
  91. package/lib/aws/ec2/security-group.js +4 -0
  92. package/lib/aws/ec2/security-group.js.map +1 -0
  93. package/lib/aws/ec2/security-group.provider.d.ts +6 -0
  94. package/lib/aws/ec2/security-group.provider.d.ts.map +1 -0
  95. package/lib/aws/ec2/security-group.provider.js +291 -0
  96. package/lib/aws/ec2/security-group.provider.js.map +1 -0
  97. package/lib/aws/ec2/subnet.d.ts.map +1 -1
  98. package/lib/aws/ec2/subnet.provider.d.ts.map +1 -1
  99. package/lib/aws/ec2/subnet.provider.js +33 -30
  100. package/lib/aws/ec2/subnet.provider.js.map +1 -1
  101. package/lib/aws/ec2/vpc-endpoint.d.ts +176 -0
  102. package/lib/aws/ec2/vpc-endpoint.d.ts.map +1 -0
  103. package/lib/aws/ec2/vpc-endpoint.js +4 -0
  104. package/lib/aws/ec2/vpc-endpoint.js.map +1 -0
  105. package/lib/aws/ec2/vpc-endpoint.provider.d.ts +6 -0
  106. package/lib/aws/ec2/vpc-endpoint.provider.d.ts.map +1 -0
  107. package/lib/aws/ec2/vpc-endpoint.provider.js +315 -0
  108. package/lib/aws/ec2/vpc-endpoint.provider.js.map +1 -0
  109. package/lib/aws/ec2/vpc.d.ts.map +1 -1
  110. package/lib/aws/ec2/vpc.provider.d.ts.map +1 -1
  111. package/lib/aws/ec2/vpc.provider.js +38 -32
  112. package/lib/aws/ec2/vpc.provider.js.map +1 -1
  113. package/lib/aws/index.d.ts +2 -2
  114. package/lib/aws/index.d.ts.map +1 -1
  115. package/lib/aws/index.js +1 -1
  116. package/lib/aws/index.js.map +1 -1
  117. package/lib/aws/lambda/function.d.ts.map +1 -1
  118. package/lib/aws/lambda/function.invoke.d.ts.map +1 -1
  119. package/lib/aws/lambda/function.invoke.js.map +1 -1
  120. package/lib/aws/lambda/function.js.map +1 -1
  121. package/lib/aws/lambda/function.provider.d.ts.map +1 -1
  122. package/lib/aws/lambda/function.provider.js +19 -23
  123. package/lib/aws/lambda/function.provider.js.map +1 -1
  124. package/lib/aws/sqs/queue.d.ts +1 -2
  125. package/lib/aws/sqs/queue.d.ts.map +1 -1
  126. package/lib/aws/sqs/queue.event-source.d.ts.map +1 -1
  127. package/lib/aws/sqs/queue.event-source.js +2 -2
  128. package/lib/aws/sqs/queue.event-source.js.map +1 -1
  129. package/lib/aws/sqs/queue.js.map +1 -1
  130. package/lib/aws/sqs/queue.provider.d.ts +1 -2
  131. package/lib/aws/sqs/queue.provider.d.ts.map +1 -1
  132. package/lib/aws/sqs/queue.provider.js +35 -20
  133. package/lib/aws/sqs/queue.provider.js.map +1 -1
  134. package/lib/aws/sqs/queue.send-message.d.ts.map +1 -1
  135. package/lib/aws/sqs/queue.send-message.js.map +1 -1
  136. package/lib/binding.d.ts.map +1 -1
  137. package/lib/cli/components/PlanProgress.d.ts.map +1 -1
  138. package/lib/cli/components/PlanProgress.js.map +1 -1
  139. package/lib/cli/index.d.ts +8 -4
  140. package/lib/cli/index.d.ts.map +1 -1
  141. package/lib/cli/index.js.map +1 -1
  142. package/lib/cloudflare/kv/namespace.binding.d.ts.map +1 -1
  143. package/lib/cloudflare/kv/namespace.binding.js.map +1 -1
  144. package/lib/cloudflare/kv/namespace.d.ts.map +1 -1
  145. package/lib/cloudflare/kv/namespace.provider.d.ts +1 -2
  146. package/lib/cloudflare/kv/namespace.provider.d.ts.map +1 -1
  147. package/lib/cloudflare/kv/namespace.provider.js +11 -8
  148. package/lib/cloudflare/kv/namespace.provider.js.map +1 -1
  149. package/lib/cloudflare/r2/bucket.binding.d.ts.map +1 -1
  150. package/lib/cloudflare/r2/bucket.binding.js +1 -1
  151. package/lib/cloudflare/r2/bucket.binding.js.map +1 -1
  152. package/lib/cloudflare/r2/bucket.d.ts +1 -1
  153. package/lib/cloudflare/r2/bucket.d.ts.map +1 -1
  154. package/lib/cloudflare/r2/bucket.provider.d.ts +1 -2
  155. package/lib/cloudflare/r2/bucket.provider.d.ts.map +1 -1
  156. package/lib/cloudflare/r2/bucket.provider.js +20 -14
  157. package/lib/cloudflare/r2/bucket.provider.js.map +1 -1
  158. package/lib/cloudflare/worker/worker.d.ts +2 -2
  159. package/lib/cloudflare/worker/worker.d.ts.map +1 -1
  160. package/lib/cloudflare/worker/worker.provider.d.ts +1 -2
  161. package/lib/cloudflare/worker/worker.provider.d.ts.map +1 -1
  162. package/lib/cloudflare/worker/worker.provider.js +40 -13
  163. package/lib/cloudflare/worker/worker.provider.js.map +1 -1
  164. package/lib/instance-id.d.ts +5 -1
  165. package/lib/instance-id.d.ts.map +1 -1
  166. package/lib/instance-id.js +4 -0
  167. package/lib/instance-id.js.map +1 -1
  168. package/lib/output.d.ts.map +1 -1
  169. package/lib/output.js.map +1 -1
  170. package/lib/physical-name.d.ts +15 -4
  171. package/lib/physical-name.d.ts.map +1 -1
  172. package/lib/physical-name.js +12 -3
  173. package/lib/physical-name.js.map +1 -1
  174. package/lib/plan.d.ts +2 -2
  175. package/lib/plan.d.ts.map +1 -1
  176. package/lib/plan.js +73 -24
  177. package/lib/plan.js.map +1 -1
  178. package/lib/provider.d.ts +1 -2
  179. package/lib/provider.d.ts.map +1 -1
  180. package/lib/resource.d.ts +3 -2
  181. package/lib/resource.d.ts.map +1 -1
  182. package/lib/resource.js.map +1 -1
  183. package/lib/runtime.d.ts.map +1 -1
  184. package/lib/tags.d.ts +12 -0
  185. package/lib/tags.d.ts.map +1 -1
  186. package/lib/tags.js +24 -0
  187. package/lib/tags.js.map +1 -1
  188. package/lib/tsconfig.test.tsbuildinfo +1 -1
  189. package/package.json +51 -51
  190. package/src/apply.ts +316 -297
  191. package/src/aws/client.ts +22 -1
  192. package/src/aws/dynamodb/secondary-index.ts +5 -5
  193. package/src/aws/dynamodb/table.provider.ts +15 -4
  194. package/src/aws/dynamodb/table.ts +8 -11
  195. package/src/aws/ec2/egress-only-igw.provider.ts +181 -0
  196. package/src/aws/ec2/egress-only-igw.ts +77 -0
  197. package/src/aws/ec2/eip.provider.ts +191 -0
  198. package/src/aws/ec2/eip.ts +106 -0
  199. package/src/aws/ec2/index.ts +18 -0
  200. package/src/aws/ec2/internet-gateway.provider.ts +15 -6
  201. package/src/aws/ec2/internet-gateway.ts +6 -6
  202. package/src/aws/ec2/nat-gateway.provider.ts +341 -0
  203. package/src/aws/ec2/nat-gateway.ts +155 -0
  204. package/src/aws/ec2/network-acl-association.provider.ts +181 -0
  205. package/src/aws/ec2/network-acl-association.ts +60 -0
  206. package/src/aws/ec2/network-acl-entry.provider.ts +218 -0
  207. package/src/aws/ec2/network-acl-entry.ts +140 -0
  208. package/src/aws/ec2/network-acl.provider.ts +195 -0
  209. package/src/aws/ec2/network-acl.ts +102 -0
  210. package/src/aws/ec2/route-table-association.provider.ts +1 -2
  211. package/src/aws/ec2/route-table-association.ts +6 -6
  212. package/src/aws/ec2/route-table.provider.ts +1 -2
  213. package/src/aws/ec2/route-table.ts +6 -6
  214. package/src/aws/ec2/route.provider.ts +1 -2
  215. package/src/aws/ec2/route.ts +6 -6
  216. package/src/aws/ec2/security-group-rule.provider.ts +264 -0
  217. package/src/aws/ec2/security-group-rule.ts +151 -0
  218. package/src/aws/ec2/security-group.provider.ts +392 -0
  219. package/src/aws/ec2/security-group.ts +182 -0
  220. package/src/aws/ec2/subnet.provider.ts +57 -56
  221. package/src/aws/ec2/subnet.ts +6 -6
  222. package/src/aws/ec2/vpc-endpoint.provider.ts +466 -0
  223. package/src/aws/ec2/vpc-endpoint.ts +213 -0
  224. package/src/aws/ec2/vpc.provider.ts +60 -52
  225. package/src/aws/ec2/vpc.ts +6 -6
  226. package/src/aws/index.ts +9 -0
  227. package/src/aws/lambda/function.invoke.ts +4 -2
  228. package/src/aws/lambda/function.provider.ts +42 -31
  229. package/src/aws/lambda/function.ts +4 -2
  230. package/src/aws/sqs/queue.event-source.ts +12 -14
  231. package/src/aws/sqs/queue.provider.ts +40 -24
  232. package/src/aws/sqs/queue.send-message.ts +4 -2
  233. package/src/aws/sqs/queue.ts +1 -8
  234. package/src/binding.ts +7 -7
  235. package/src/cli/components/PlanProgress.tsx +3 -2
  236. package/src/cloudflare/kv/namespace.binding.ts +4 -2
  237. package/src/cloudflare/kv/namespace.provider.ts +18 -16
  238. package/src/cloudflare/kv/namespace.ts +6 -6
  239. package/src/cloudflare/r2/bucket.binding.ts +5 -3
  240. package/src/cloudflare/r2/bucket.provider.ts +34 -30
  241. package/src/cloudflare/r2/bucket.ts +7 -7
  242. package/src/cloudflare/worker/worker.provider.ts +39 -13
  243. package/src/cloudflare/worker/worker.ts +2 -2
  244. package/src/instance-id.ts +5 -1
  245. package/src/output.ts +5 -3
  246. package/src/physical-name.ts +27 -5
  247. package/src/plan.ts +108 -41
  248. package/src/provider.ts +12 -12
  249. package/src/resource.ts +17 -6
  250. package/src/runtime.ts +2 -2
  251. package/src/tags.ts +29 -0
@@ -22,7 +22,7 @@ import * as Redacted from "effect/Redacted";
22
22
  import * as Schema from "effect/Schema";
23
23
  import * as EffectSecret from "effect/Secret";
24
24
  import * as Context from "effect/Context";
25
- import * as Layer from "effect/Layer";
25
+ import * as Layer$1 from "effect/Layer";
26
26
  import * as Terminal from "@effect/platform/Terminal";
27
27
  import * as Effectable from "effect/Effectable";
28
28
  import * as Data from "effect/Data";
@@ -43,7 +43,7 @@ import * as ConfigProvider from "effect/ConfigProvider";
43
43
  import { NodeContext, NodeRuntime } from "@effect/platform-node";
44
44
  import * as PlatformConfigProvider from "@effect/platform/PlatformConfigProvider";
45
45
  import * as FetchHttpClient from "@effect/platform/FetchHttpClient";
46
- import { pipe as pipe$1 } from "effect";
46
+ import { Layer, pipe as pipe$1 } from "effect";
47
47
  import { omit } from "effect/Struct";
48
48
  import { PassThrough, Stream } from "node:stream";
49
49
  import process$1, { cwd, env } from "node:process";
@@ -14042,7 +14042,7 @@ const asEffect = (effect) => Effect.isEffect(effect) ? effect : Effect.succeed(e
14042
14042
 
14043
14043
  //#endregion
14044
14044
  //#region package.json
14045
- var version = "0.4.0";
14045
+ var version = "0.6.0";
14046
14046
 
14047
14047
  //#endregion
14048
14048
  //#region src/resource.ts
@@ -14054,7 +14054,7 @@ const isResource = (r) => {
14054
14054
  //#region src/state.ts
14055
14055
  var StateStoreError = class extends Data.TaggedError("StateStoreError") {};
14056
14056
  var State = class extends Context.Tag("AWS::Lambda::State")() {};
14057
- const localFs = Layer.effect(State, Effect.gen(function* () {
14057
+ const localFs = Layer$1.effect(State, Effect.gen(function* () {
14058
14058
  const fs$1 = yield* FileSystem.FileSystem;
14059
14059
  const path$3 = yield* Path$1.Path;
14060
14060
  const dotAlchemy$1 = path$3.join(process.cwd(), ".alchemy");
@@ -14093,7 +14093,7 @@ const localFs = Layer.effect(State, Effect.gen(function* () {
14093
14093
  //#endregion
14094
14094
  //#region src/app.ts
14095
14095
  var App$1 = class extends Context.Tag("App")() {};
14096
- const app = (input) => Layer.succeed(App$1, App$1.of(input));
14096
+ const app = (input) => Layer$1.succeed(App$1, App$1.of(input));
14097
14097
  const make = app;
14098
14098
 
14099
14099
  //#endregion
@@ -14102,6 +14102,8 @@ var CLI = class extends Context.Tag("CLIService")() {};
14102
14102
 
14103
14103
  //#endregion
14104
14104
  //#region src/instance-id.ts
14105
+ /** A 16-byte (128-bit) random hex-encoded string representing an physical instance of a logical resource */
14106
+ var InstanceId = class extends Context.Tag("instance-id")() {};
14105
14107
  /**
14106
14108
  * @returns Hex-encoded instance ID (16 random bytes)
14107
14109
  */
@@ -14295,7 +14297,7 @@ const plan = (..._resources) => Effect.gen(function* () {
14295
14297
  stack: app$1.name,
14296
14298
  stage: app$1.stage,
14297
14299
  resourceId: id
14298
- })));
14300
+ })), { concurrency: "unbounded" });
14299
14301
  const resolvedResources = {};
14300
14302
  const resolveResource = (resourceExpr) => Effect.gen(function* () {
14301
14303
  return yield* resolvedResources[resourceExpr.src.id] ??= yield* Effect.cached(Effect.gen(function* () {
@@ -14315,7 +14317,7 @@ const plan = (..._resources) => Effect.gen(function* () {
14315
14317
  instanceId: oldState.instanceId,
14316
14318
  news: props,
14317
14319
  output: oldState.attr
14318
- }) : Effect.succeed(void 0);
14320
+ }).pipe(Effect.provide(Layer$1.succeed(InstanceId, oldState.instanceId))) : Effect.succeed(void 0);
14319
14321
  const stables = [...provider.stables ?? [], ...diff$1?.stables ?? []];
14320
14322
  const withStables = (output) => stables.length > 0 ? new ResourceExpr(resourceExpr.src, Object.fromEntries(stables.map((stable) => [stable, output?.[stable]]))) : resourceExpr;
14321
14323
  if (diff$1 == null) {
@@ -14329,8 +14331,8 @@ const plan = (..._resources) => Effect.gen(function* () {
14329
14331
  const resolveInput = (input) => Effect.gen(function* () {
14330
14332
  if (!input) return input;
14331
14333
  else if (isExpr(input)) return yield* resolveOutput(input);
14332
- else if (Array.isArray(input)) return yield* Effect.all(input.map(resolveInput));
14333
- else if (typeof input === "object") return Object.fromEntries(yield* Effect.all(Object.entries(input).map(([key, value]) => resolveInput(value).pipe(Effect.map((value$1) => [key, value$1])))));
14334
+ else if (Array.isArray(input)) return yield* Effect.all(input.map(resolveInput), { concurrency: "unbounded" });
14335
+ else if (typeof input === "object") return Object.fromEntries(yield* Effect.all(Object.entries(input).map(([key, value]) => resolveInput(value).pipe(Effect.map((value$1) => [key, value$1]))), { concurrency: "unbounded" }));
14334
14336
  return input;
14335
14337
  });
14336
14338
  const resolveOutput = (expr) => Effect.gen(function* () {
@@ -14342,7 +14344,7 @@ const plan = (..._resources) => Effect.gen(function* () {
14342
14344
  } else if (isEffectExpr(expr)) {
14343
14345
  const upstream$1 = yield* resolveOutput(expr.expr);
14344
14346
  return hasOutputs(upstream$1) ? expr : yield* expr.f(upstream$1);
14345
- } else if (isAllExpr(expr)) return yield* Effect.all(expr.outs.map(resolveOutput));
14347
+ } else if (isAllExpr(expr)) return yield* Effect.all(expr.outs.map(resolveOutput), { concurrency: "unbounded" });
14346
14348
  return yield* Effect.die(/* @__PURE__ */ new Error("Not implemented yet"));
14347
14349
  });
14348
14350
  const oldDownstreamDependencies = Object.fromEntries(oldResources.filter((resource) => !!resource).map((resource) => [resource.logicalId, resource.downstream]));
@@ -14385,6 +14387,25 @@ const plan = (..._resources) => Effect.gen(function* () {
14385
14387
  props: news,
14386
14388
  state: oldState
14387
14389
  });
14390
+ else if (oldState.status === "creating" && oldState.attr === void 0) {
14391
+ if (provider.read) {
14392
+ const attr = yield* provider.read({
14393
+ id,
14394
+ instanceId: oldState.instanceId,
14395
+ olds: oldState.props,
14396
+ output: oldState.attr,
14397
+ bindings
14398
+ });
14399
+ if (attr) return Node$1({
14400
+ action: "create",
14401
+ props: news,
14402
+ state: {
14403
+ ...oldState,
14404
+ attr
14405
+ }
14406
+ });
14407
+ }
14408
+ }
14388
14409
  const oldProps = oldState.props;
14389
14410
  const diff$1 = yield* asEffect(provider.diff ? provider.diff({
14390
14411
  id,
@@ -14392,7 +14413,7 @@ const plan = (..._resources) => Effect.gen(function* () {
14392
14413
  instanceId: oldState.instanceId,
14393
14414
  output: oldState.attr,
14394
14415
  news
14395
- }) : void 0).pipe(Effect.map((diff$2) => diff$2 ?? { action: arePropsChanged(oldProps, news) ? "update" : "noop" }));
14416
+ }).pipe(Effect.provide(Layer$1.succeed(InstanceId, oldState.instanceId))) : void 0).pipe(Effect.map((diff$2) => diff$2 ?? { action: arePropsChanged(oldProps, news) ? "update" : "noop" }));
14396
14417
  if (oldState.status === "creating") if (diff$1.action === "noop") return Node$1({
14397
14418
  action: "create",
14398
14419
  props: news,
@@ -14470,7 +14491,7 @@ const plan = (..._resources) => Effect.gen(function* () {
14470
14491
  action: "noop",
14471
14492
  state: oldState
14472
14493
  });
14473
- })))).map((update) => [update.resource.id, update]));
14494
+ })), { concurrency: "unbounded" })).map((update) => [update.resource.id, update]));
14474
14495
  const deletions = Object.fromEntries((yield* Effect.all((yield* state.list({
14475
14496
  stack: app$1.name,
14476
14497
  stage: app$1.stage
@@ -14481,20 +14502,36 @@ const plan = (..._resources) => Effect.gen(function* () {
14481
14502
  stage: app$1.stage,
14482
14503
  resourceId: id
14483
14504
  });
14484
- if (oldState) return [id, {
14485
- action: "delete",
14486
- state: oldState,
14487
- bindings: [],
14488
- provider: yield* getProviderByType(oldState.resourceType),
14489
- resource: {
14490
- id,
14491
- type: oldState.resourceType,
14492
- attr: oldState.attr,
14493
- props: oldState.props
14494
- },
14495
- downstream: oldDownstreamDependencies[id] ?? []
14496
- }];
14497
- })))).filter((v) => !!v));
14505
+ let attr = oldState?.attr;
14506
+ if (oldState) {
14507
+ const provider = yield* getProviderByType(oldState.resourceType);
14508
+ if (oldState.attr === void 0) {
14509
+ if (provider.read) attr = yield* provider.read({
14510
+ id,
14511
+ instanceId: oldState.instanceId,
14512
+ olds: oldState.props,
14513
+ output: oldState.attr,
14514
+ bindings: oldState.bindings ?? []
14515
+ }).pipe(Effect.provide(Layer$1.succeed(InstanceId, oldState.instanceId)));
14516
+ }
14517
+ return [id, {
14518
+ action: "delete",
14519
+ state: {
14520
+ ...oldState,
14521
+ attr
14522
+ },
14523
+ bindings: [],
14524
+ provider,
14525
+ resource: {
14526
+ id,
14527
+ type: oldState.resourceType,
14528
+ attr,
14529
+ props: oldState.props
14530
+ },
14531
+ downstream: oldDownstreamDependencies[id] ?? []
14532
+ }];
14533
+ }
14534
+ })), { concurrency: "unbounded" })).filter((v) => !!v));
14498
14535
  for (const [resourceId, deletion] of Object.entries(deletions)) {
14499
14536
  const dependencies = deletion.state.downstream.filter((d) => d in resourceGraph);
14500
14537
  if (dependencies.length > 0) return yield* Effect.fail(new DeleteResourceHasDownstreamDependencies({
@@ -14550,7 +14587,7 @@ const diffBindings = Effect.fn(function* ({ oldState, bindings, target }) {
14550
14587
  attr: oldBinding.attr
14551
14588
  };
14552
14589
  });
14553
- return (yield* Effect.all(bindings.map(diffBinding))).filter((action) => action !== null);
14590
+ return (yield* Effect.all(bindings.map(diffBinding), { concurrency: "unbounded" })).filter((action) => action !== null);
14554
14591
  });
14555
14592
  const isBindingDiff = Effect.fn(function* ({ target, oldBinding: { binding: oldBinding }, newBinding }) {
14556
14593
  const oldCap = oldBinding.capability;
@@ -14559,18 +14596,20 @@ const isBindingDiff = Effect.fn(function* ({ target, oldBinding: { binding: oldB
14559
14596
  const provider = yield* newBinding.Tag;
14560
14597
  if (provider.diff) {
14561
14598
  const oldState = yield* (yield* State).get(oldCap.resource.id);
14562
- const diff$1 = yield* provider.diff({
14563
- source: {
14564
- id: oldCap.resource.id,
14565
- props: newCap.resource.props,
14566
- oldProps: oldState?.props,
14567
- oldAttr: oldState?.attr
14568
- },
14569
- props: newBinding.props,
14570
- attr: oldBinding.attr,
14571
- target
14572
- });
14573
- if (diff$1?.action === "update" || diff$1?.action === "replace") return diff$1;
14599
+ if (oldState) {
14600
+ const diff$1 = yield* provider.diff({
14601
+ source: {
14602
+ id: oldCap.resource.id,
14603
+ props: newCap.resource.props,
14604
+ oldProps: oldState?.props,
14605
+ oldAttr: oldState?.attr
14606
+ },
14607
+ props: newBinding.props,
14608
+ attr: oldBinding.attr,
14609
+ target
14610
+ }).pipe(Effect.provide(Layer$1.succeed(InstanceId, oldState.instanceId)));
14611
+ if (diff$1?.action === "update" || diff$1?.action === "replace") return diff$1;
14612
+ }
14574
14613
  }
14575
14614
  return { action: oldBinding.capability.action !== newBinding.capability.action || oldBinding.capability?.resource?.id !== newBinding.capability?.resource?.id ? "update" : "noop" };
14576
14615
  });
@@ -14654,7 +14693,7 @@ const expandAndPivot = Effect.fnUntraced(function* (plan$1, session) {
14654
14693
  };
14655
14694
  }
14656
14695
  return oldBindingOutput;
14657
- })));
14696
+ })), { concurrency: "unbounded" });
14658
14697
  const apply = (node) => Effect.gen(function* () {
14659
14698
  const commit = (value) => state.set({
14660
14699
  stack: app$1.name,
@@ -14680,7 +14719,7 @@ const expandAndPivot = Effect.fnUntraced(function* (plan$1, session) {
14680
14719
  status
14681
14720
  });
14682
14721
  if (node.action === "noop") return node.state.attr;
14683
- const upstream$1 = Object.fromEntries(yield* Effect.all(Object.entries(resolveUpstream(node.props)).map(([id$1]) => resolveUpstream$1(id$1).pipe(Effect.map(({ upstreamAttr }) => [id$1, upstreamAttr])))));
14722
+ const upstream$1 = Object.fromEntries(yield* Effect.all(Object.entries(resolveUpstream(node.props)).map(([id$1]) => resolveUpstream$1(id$1).pipe(Effect.map(({ upstreamAttr }) => [id$1, upstreamAttr]))), { concurrency: "unbounded" }));
14684
14723
  const instanceId = yield* Effect.gen(function* () {
14685
14724
  if (node.action === "create" && !node.state?.instanceId) {
14686
14725
  const instanceId$1 = yield* generateInstanceId();
@@ -14714,248 +14753,250 @@ const expandAndPivot = Effect.fnUntraced(function* (plan$1, session) {
14714
14753
  } else if (node.state?.instanceId) return node.state.instanceId;
14715
14754
  return yield* Effect.dieMessage(`Instance ID not found for resource '${id}' and action is '${node.action}'`);
14716
14755
  });
14717
- if (node.action === "create") {
14718
- const news = yield* evaluate(node.props, upstream$1);
14719
- const checkpoint = (attr$1) => commit({
14720
- status: "creating",
14721
- logicalId: id,
14722
- instanceId,
14723
- resourceType: node.resource.type,
14724
- props: news,
14725
- attr: attr$1,
14726
- providerVersion: node.provider.version ?? 0,
14727
- bindings: node.bindings,
14728
- downstream: node.downstream
14729
- });
14730
- if (!node.state) yield* checkpoint(void 0);
14731
- let attr;
14732
- if (node.action === "create" && node.provider.precreate && node.state?.attr === void 0) {
14733
- yield* report("pre-creating");
14734
- attr = yield* node.provider.precreate({
14756
+ return yield* Effect.gen(function* () {
14757
+ if (node.action === "create") {
14758
+ const news = yield* evaluate(node.props, upstream$1);
14759
+ const checkpoint = (attr$1) => commit({
14760
+ status: "creating",
14761
+ logicalId: id,
14762
+ instanceId,
14763
+ resourceType: node.resource.type,
14764
+ props: news,
14765
+ attr: attr$1,
14766
+ providerVersion: node.provider.version ?? 0,
14767
+ bindings: node.bindings,
14768
+ downstream: node.downstream
14769
+ });
14770
+ if (!node.state) yield* checkpoint(void 0);
14771
+ let attr;
14772
+ if (node.action === "create" && node.provider.precreate && node.state?.attr === void 0) {
14773
+ yield* report("pre-creating");
14774
+ attr = yield* node.provider.precreate({
14775
+ id,
14776
+ news: node.props,
14777
+ session: scopedSession,
14778
+ instanceId
14779
+ });
14780
+ yield* checkpoint(attr);
14781
+ }
14782
+ yield* report("attaching");
14783
+ let bindingOutputs = yield* attachBindings({
14784
+ resource,
14785
+ bindings: node.bindings,
14786
+ target: {
14787
+ id,
14788
+ props: news,
14789
+ attr
14790
+ }
14791
+ });
14792
+ yield* report("creating");
14793
+ attr = yield* node.provider.create({
14735
14794
  id,
14736
- news: node.props,
14737
- session: scopedSession,
14738
- instanceId
14795
+ news,
14796
+ instanceId,
14797
+ bindings: bindingOutputs,
14798
+ session: scopedSession
14739
14799
  });
14740
14800
  yield* checkpoint(attr);
14741
- }
14742
- yield* report("attaching");
14743
- let bindingOutputs = yield* attachBindings({
14744
- resource,
14745
- bindings: node.bindings,
14746
- target: {
14747
- id,
14801
+ yield* report("post-attach");
14802
+ bindingOutputs = yield* postAttachBindings({
14803
+ resource,
14804
+ bindings: node.bindings,
14805
+ bindingOutputs,
14806
+ target: {
14807
+ id,
14808
+ props: news,
14809
+ attr
14810
+ }
14811
+ });
14812
+ yield* commit({
14813
+ status: "created",
14814
+ logicalId: id,
14815
+ instanceId,
14816
+ resourceType: node.resource.type,
14748
14817
  props: news,
14749
- attr
14750
- }
14751
- });
14752
- yield* report("creating");
14753
- attr = yield* node.provider.create({
14754
- id,
14755
- news,
14756
- instanceId,
14757
- bindings: bindingOutputs,
14758
- session: scopedSession
14759
- });
14760
- yield* checkpoint(attr);
14761
- yield* report("post-attach");
14762
- bindingOutputs = yield* postAttachBindings({
14763
- resource,
14764
- bindings: node.bindings,
14765
- bindingOutputs,
14766
- target: {
14818
+ attr,
14819
+ bindings: node.bindings.map((binding, i) => ({
14820
+ ...binding,
14821
+ attr: bindingOutputs[i]
14822
+ })),
14823
+ providerVersion: node.provider.version ?? 0,
14824
+ downstream: node.downstream
14825
+ });
14826
+ yield* report("created");
14827
+ return attr;
14828
+ } else if (node.action === "update") {
14829
+ const upstream$2 = Object.fromEntries(yield* Effect.all(Object.entries(resolveUpstream(node.props)).map(([id$1]) => resolveUpstream$1(id$1).pipe(Effect.map(({ upstreamAttr }) => [id$1, upstreamAttr]))), { concurrency: "unbounded" }));
14830
+ const news = yield* evaluate(node.props, upstream$2);
14831
+ const checkpoint = (attr$1) => {
14832
+ if (node.state.status === "replaced") return commit({
14833
+ ...node.state,
14834
+ attr: attr$1,
14835
+ props: news
14836
+ });
14837
+ else return commit({
14838
+ status: "updating",
14839
+ logicalId: id,
14840
+ instanceId,
14841
+ resourceType: node.resource.type,
14842
+ props: news,
14843
+ attr: attr$1,
14844
+ providerVersion: node.provider.version ?? 0,
14845
+ bindings: node.bindings,
14846
+ downstream: node.downstream,
14847
+ old: node.state.status === "updating" ? node.state.old : node.state
14848
+ });
14849
+ };
14850
+ yield* checkpoint(node.state.attr);
14851
+ yield* report("attaching");
14852
+ let bindingOutputs = yield* attachBindings({
14853
+ resource,
14854
+ bindings: node.bindings,
14855
+ target: {
14856
+ id,
14857
+ props: news,
14858
+ attr: node.state.attr
14859
+ }
14860
+ });
14861
+ yield* report("updating");
14862
+ const attr = yield* node.provider.update({
14767
14863
  id,
14768
- props: news,
14769
- attr
14770
- }
14771
- });
14772
- yield* commit({
14773
- status: "created",
14774
- logicalId: id,
14775
- instanceId,
14776
- resourceType: node.resource.type,
14777
- props: news,
14778
- attr,
14779
- bindings: node.bindings.map((binding, i) => ({
14780
- ...binding,
14781
- attr: bindingOutputs[i]
14782
- })),
14783
- providerVersion: node.provider.version ?? 0,
14784
- downstream: node.downstream
14785
- });
14786
- yield* report("created");
14787
- return attr;
14788
- } else if (node.action === "update") {
14789
- const upstream$2 = Object.fromEntries(yield* Effect.all(Object.entries(resolveUpstream(node.props)).map(([id$1]) => resolveUpstream$1(id$1).pipe(Effect.map(({ upstreamAttr }) => [id$1, upstreamAttr])))));
14790
- const news = yield* evaluate(node.props, upstream$2);
14791
- const checkpoint = (attr$1) => {
14792
- if (node.state.status === "replaced") return commit({
14864
+ news,
14865
+ instanceId,
14866
+ bindings: bindingOutputs,
14867
+ session: scopedSession,
14868
+ olds: node.state.status === "created" || node.state.status === "updated" || node.state.status === "replaced" ? node.state.props : node.state.old.props,
14869
+ output: node.state.attr
14870
+ });
14871
+ yield* checkpoint(attr);
14872
+ yield* report("post-attach");
14873
+ bindingOutputs = yield* postAttachBindings({
14874
+ resource,
14875
+ bindings: node.bindings,
14876
+ bindingOutputs,
14877
+ target: {
14878
+ id,
14879
+ props: news,
14880
+ attr
14881
+ }
14882
+ });
14883
+ if (node.state.status === "replaced") yield* commit({
14793
14884
  ...node.state,
14794
- attr: attr$1,
14885
+ attr,
14795
14886
  props: news
14796
14887
  });
14797
- else return commit({
14798
- status: "updating",
14888
+ else yield* commit({
14889
+ status: "updated",
14890
+ logicalId: id,
14891
+ instanceId,
14892
+ resourceType: node.resource.type,
14893
+ props: news,
14894
+ attr,
14895
+ bindings: node.bindings.map((binding, i) => ({
14896
+ ...binding,
14897
+ attr: bindingOutputs[i]
14898
+ })),
14899
+ providerVersion: node.provider.version ?? 0,
14900
+ downstream: node.downstream
14901
+ });
14902
+ yield* report("updated");
14903
+ return attr;
14904
+ } else if (node.action === "replace") {
14905
+ if (node.state.status === "replaced") return node.state.attr;
14906
+ let state$1;
14907
+ if (node.state.status !== "replacing") yield* commit(state$1 = {
14908
+ status: "replacing",
14909
+ logicalId: id,
14910
+ instanceId,
14911
+ resourceType: node.resource.type,
14912
+ props: node.props,
14913
+ attr: node.state.attr,
14914
+ providerVersion: node.provider.version ?? 0,
14915
+ deleteFirst: node.deleteFirst,
14916
+ old: node.state,
14917
+ downstream: node.downstream
14918
+ });
14919
+ else state$1 = node.state;
14920
+ const upstream$2 = Object.fromEntries(yield* Effect.all(Object.entries(resolveUpstream(node.props)).map(([id$1]) => resolveUpstream$1(id$1).pipe(Effect.map(({ upstreamAttr }) => [id$1, upstreamAttr]))), { concurrency: "unbounded" }));
14921
+ const news = yield* evaluate(node.props, upstream$2);
14922
+ const checkpoint = ({ status, attr: attr$1, bindings }) => commit({
14923
+ status,
14799
14924
  logicalId: id,
14800
14925
  instanceId,
14801
14926
  resourceType: node.resource.type,
14802
14927
  props: news,
14803
14928
  attr: attr$1,
14804
14929
  providerVersion: node.provider.version ?? 0,
14805
- bindings: node.bindings,
14930
+ bindings: bindings ?? node.bindings,
14806
14931
  downstream: node.downstream,
14807
- old: node.state.status === "updating" ? node.state.old : node.state
14932
+ old: state$1.old,
14933
+ deleteFirst: node.deleteFirst
14808
14934
  });
14809
- };
14810
- yield* checkpoint(node.state.attr);
14811
- yield* report("attaching");
14812
- let bindingOutputs = yield* attachBindings({
14813
- resource,
14814
- bindings: node.bindings,
14815
- target: {
14816
- id,
14817
- props: news,
14818
- attr: node.state.attr
14819
- }
14820
- });
14821
- yield* report("updating");
14822
- const attr = yield* node.provider.update({
14823
- id,
14824
- news,
14825
- instanceId,
14826
- bindings: bindingOutputs,
14827
- session: scopedSession,
14828
- olds: node.state.status === "created" || node.state.status === "updated" || node.state.status === "replaced" ? node.state.props : node.state.old.props,
14829
- output: node.state.attr
14830
- });
14831
- yield* checkpoint(attr);
14832
- yield* report("post-attach");
14833
- bindingOutputs = yield* postAttachBindings({
14834
- resource,
14835
- bindings: node.bindings,
14836
- bindingOutputs,
14837
- target: {
14838
- id,
14839
- props: news,
14840
- attr
14935
+ let attr;
14936
+ if (node.provider.precreate && node.state?.attr === void 0) {
14937
+ yield* report("pre-creating");
14938
+ attr = yield* node.provider.precreate({
14939
+ id,
14940
+ news: node.props,
14941
+ session: scopedSession,
14942
+ instanceId
14943
+ });
14944
+ yield* checkpoint({
14945
+ status: "replacing",
14946
+ attr
14947
+ });
14841
14948
  }
14842
- });
14843
- if (node.state.status === "replaced") yield* commit({
14844
- ...node.state,
14845
- attr,
14846
- props: news
14847
- });
14848
- else yield* commit({
14849
- status: "updated",
14850
- logicalId: id,
14851
- instanceId,
14852
- resourceType: node.resource.type,
14853
- props: news,
14854
- attr,
14855
- bindings: node.bindings.map((binding, i) => ({
14856
- ...binding,
14857
- attr: bindingOutputs[i]
14858
- })),
14859
- providerVersion: node.provider.version ?? 0,
14860
- downstream: node.downstream
14861
- });
14862
- yield* report("updated");
14863
- return attr;
14864
- } else if (node.action === "replace") {
14865
- if (node.state.status === "replaced") return node.state.attr;
14866
- let state$1;
14867
- if (node.state.status !== "replacing") yield* commit(state$1 = {
14868
- status: "replacing",
14869
- logicalId: id,
14870
- instanceId,
14871
- resourceType: node.resource.type,
14872
- props: node.props,
14873
- attr: node.state.attr,
14874
- providerVersion: node.provider.version ?? 0,
14875
- deleteFirst: node.deleteFirst,
14876
- old: node.state,
14877
- downstream: node.downstream
14878
- });
14879
- else state$1 = node.state;
14880
- const upstream$2 = Object.fromEntries(yield* Effect.all(Object.entries(resolveUpstream(node.props)).map(([id$1]) => resolveUpstream$1(id$1).pipe(Effect.map(({ upstreamAttr }) => [id$1, upstreamAttr])))));
14881
- const news = yield* evaluate(node.props, upstream$2);
14882
- const checkpoint = ({ status, attr: attr$1, bindings }) => commit({
14883
- status,
14884
- logicalId: id,
14885
- instanceId,
14886
- resourceType: node.resource.type,
14887
- props: news,
14888
- attr: attr$1,
14889
- providerVersion: node.provider.version ?? 0,
14890
- bindings: bindings ?? node.bindings,
14891
- downstream: node.downstream,
14892
- old: state$1.old,
14893
- deleteFirst: node.deleteFirst
14894
- });
14895
- let attr;
14896
- if (node.provider.precreate && node.state?.attr === void 0) {
14897
- yield* report("pre-creating");
14898
- attr = yield* node.provider.precreate({
14949
+ yield* report("attaching");
14950
+ let bindingOutputs = yield* attachBindings({
14951
+ resource,
14952
+ bindings: node.bindings,
14953
+ target: {
14954
+ id,
14955
+ props: news,
14956
+ attr
14957
+ }
14958
+ });
14959
+ yield* report("creating replacement");
14960
+ attr = yield* node.provider.create({
14899
14961
  id,
14900
- news: node.props,
14901
- session: scopedSession,
14902
- instanceId
14962
+ news,
14963
+ instanceId,
14964
+ bindings: bindingOutputs,
14965
+ session: scopedSession
14903
14966
  });
14904
14967
  yield* checkpoint({
14905
14968
  status: "replacing",
14906
14969
  attr
14907
14970
  });
14971
+ yield* report("post-attach");
14972
+ bindingOutputs = yield* postAttachBindings({
14973
+ resource,
14974
+ bindings: node.bindings,
14975
+ bindingOutputs,
14976
+ target: {
14977
+ id,
14978
+ props: news,
14979
+ attr
14980
+ }
14981
+ });
14982
+ yield* checkpoint({
14983
+ status: "replaced",
14984
+ attr,
14985
+ bindings: node.bindings.map((binding, i) => ({
14986
+ ...binding,
14987
+ attr: bindingOutputs[i]
14988
+ }))
14989
+ });
14990
+ yield* report("created");
14991
+ return attr;
14908
14992
  }
14909
- yield* report("attaching");
14910
- let bindingOutputs = yield* attachBindings({
14911
- resource,
14912
- bindings: node.bindings,
14913
- target: {
14914
- id,
14915
- props: news,
14916
- attr
14917
- }
14918
- });
14919
- yield* report("creating replacement");
14920
- attr = yield* node.provider.create({
14921
- id,
14922
- news,
14923
- instanceId,
14924
- bindings: bindingOutputs,
14925
- session: scopedSession
14926
- });
14927
- yield* checkpoint({
14928
- status: "replacing",
14929
- attr
14930
- });
14931
- yield* report("post-attach");
14932
- bindingOutputs = yield* postAttachBindings({
14933
- resource,
14934
- bindings: node.bindings,
14935
- bindingOutputs,
14936
- target: {
14937
- id,
14938
- props: news,
14939
- attr
14940
- }
14941
- });
14942
- yield* checkpoint({
14943
- status: "replaced",
14944
- attr,
14945
- bindings: node.bindings.map((binding, i) => ({
14946
- ...binding,
14947
- attr: bindingOutputs[i]
14948
- }))
14949
- });
14950
- yield* report("created");
14951
- return attr;
14952
- }
14953
- return yield* Effect.dieMessage(`Unknown action: ${node.action}`);
14993
+ return yield* Effect.dieMessage(`Unknown action: ${node.action}`);
14994
+ }).pipe(Effect.provide(Layer.succeed(InstanceId, instanceId)));
14954
14995
  }));
14955
14996
  });
14956
14997
  return Object.fromEntries(yield* Effect.all(Object.entries(plan$1.resources).map(Effect.fn(function* ([id, node]) {
14957
14998
  return [id, yield* apply(node)];
14958
- }))));
14999
+ })), { concurrency: "unbounded" }));
14959
15000
  });
14960
15001
  const collectGarbage = Effect.fnUntraced(function* (plan$1, session) {
14961
15002
  const state = yield* State;
@@ -15009,7 +15050,7 @@ const collectGarbage = Effect.fnUntraced(function* (plan$1, session) {
15009
15050
  })
15010
15051
  };
15011
15052
  return yield* deletions[logicalId] ??= yield* Effect.cached(Effect.gen(function* () {
15012
- yield* Effect.all(downstream.map((dep) => dep in deletionGraph ? deleteResource(deletionGraph[dep]) : Effect.void));
15053
+ yield* Effect.all(downstream.map((dep) => dep in deletionGraph ? deleteResource(deletionGraph[dep]) : Effect.void), { concurrency: "unbounded" });
15013
15054
  yield* report("deleting");
15014
15055
  if (isDeleteNode(node)) yield* commit({
15015
15056
  status: "deleting",
@@ -15022,7 +15063,7 @@ const collectGarbage = Effect.fnUntraced(function* (plan$1, session) {
15022
15063
  providerVersion: provider.version ?? 0,
15023
15064
  bindings: node.bindings
15024
15065
  });
15025
- yield* provider.delete({
15066
+ if (attr !== void 0) yield* provider.delete({
15026
15067
  id: logicalId,
15027
15068
  instanceId,
15028
15069
  olds: props,
@@ -15051,15 +15092,15 @@ const collectGarbage = Effect.fnUntraced(function* (plan$1, session) {
15051
15092
  });
15052
15093
  yield* report("replaced");
15053
15094
  }
15054
- }));
15095
+ }).pipe(Effect.provide(Layer.succeed(InstanceId, instanceId))));
15055
15096
  });
15056
- yield* Effect.all(Object.values(deletionGraph).filter((node) => node !== void 0).map(deleteResource));
15097
+ yield* Effect.all(Object.values(deletionGraph).filter((node) => node !== void 0).map(deleteResource), { concurrency: "unbounded" });
15057
15098
  });
15058
15099
 
15059
15100
  //#endregion
15060
15101
  //#region src/dot-alchemy.ts
15061
15102
  var DotAlchemy = class extends Context.Tag(".alchemy")() {};
15062
- const dotAlchemy = Layer.effect(DotAlchemy, Effect.gen(function* () {
15103
+ const dotAlchemy = Layer$1.effect(DotAlchemy, Effect.gen(function* () {
15063
15104
  const fs$1 = yield* FileSystem.FileSystem;
15064
15105
  const dir = (yield* Path$1.Path).join(process.cwd(), ".alchemy");
15065
15106
  yield* fs$1.makeDirectory(dir, { recursive: true });
@@ -55235,7 +55276,7 @@ function useGlobalSpinner(intervalMs = 80) {
55235
55276
 
55236
55277
  //#endregion
55237
55278
  //#region src/cli/ink-service.tsx
55238
- const inkCLI = () => Layer.succeed(CLI, CLI.of({
55279
+ const inkCLI = () => Layer$1.succeed(CLI, CLI.of({
55239
55280
  approvePlan,
55240
55281
  displayPlan,
55241
55282
  startApplySession
@@ -55325,10 +55366,10 @@ const execStack = Effect.fn(function* ({ main: main$1, stage: stage$1, envFile:
55325
55366
  if (!stack) return yield* Effect.die(/* @__PURE__ */ new Error(`Main file '${main$1}' must export a default stack definition (export default defineStack({...}))`));
55326
55367
  const stackName = stack.name;
55327
55368
  const configProvider = Option.isSome(envFile$1) ? ConfigProvider.orElse(yield* PlatformConfigProvider.fromDotEnv(envFile$1.value), ConfigProvider.fromEnv) : ConfigProvider.fromEnv();
55328
- const stageConfig = yield* asEffect(stack.stages.config(stage$1)).pipe(Effect.provide(stack.layers ?? Layer.empty), Effect.withConfigProvider(configProvider));
55329
- const platform$1 = Layer.mergeAll(NodeContext.layer, FetchHttpClient.layer, Logger.pretty);
55330
- const alchemy = Layer.mergeAll(stack.state ?? localFs, stack.cli ?? inkCLI(), dotAlchemy);
55331
- const layers = Layer.provideMerge(Layer.provideMerge(stack.providers, alchemy), Layer.mergeAll(platform$1, make({
55369
+ const stageConfig = yield* asEffect(stack.stages.config(stage$1)).pipe(Effect.provide(stack.layers ?? Layer$1.empty), Effect.withConfigProvider(configProvider));
55370
+ const platform$1 = Layer$1.mergeAll(NodeContext.layer, FetchHttpClient.layer, Logger.pretty);
55371
+ const alchemy = Layer$1.mergeAll(stack.state ?? localFs, stack.cli ?? inkCLI(), dotAlchemy);
55372
+ const layers = Layer$1.provideMerge(Layer$1.provideMerge(stack.providers, alchemy), Layer$1.mergeAll(platform$1, make({
55332
55373
  name: stackName,
55333
55374
  stage: stage$1,
55334
55375
  config: stageConfig
@@ -55342,7 +55383,7 @@ const execStack = Effect.fn(function* ({ main: main$1, stage: stage$1, envFile:
55342
55383
  if (!(yield* cli.approvePlan(updatePlan))) return;
55343
55384
  }
55344
55385
  const outputs = yield* applyPlan(updatePlan);
55345
- if (outputs && stack.tap) yield* stack.tap(outputs).pipe(Effect.provide(stack.layers ?? Layer.empty));
55386
+ if (outputs && stack.tap) yield* stack.tap(outputs).pipe(Effect.provide(stack.layers ?? Layer$1.empty));
55346
55387
  }
55347
55388
  }).pipe(Effect.provide(layers), Effect.withConfigProvider(configProvider));
55348
55389
  });