alchemy-effect 0.4.0 → 0.5.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 (73) hide show
  1. package/bin/alchemy-effect.js +295 -253
  2. package/bin/alchemy-effect.js.map +1 -1
  3. package/lib/apply.d.ts.map +1 -1
  4. package/lib/apply.js +237 -232
  5. package/lib/apply.js.map +1 -1
  6. package/lib/aws/dynamodb/table.provider.d.ts.map +1 -1
  7. package/lib/aws/dynamodb/table.provider.js +10 -2
  8. package/lib/aws/dynamodb/table.provider.js.map +1 -1
  9. package/lib/aws/ec2/vpc.provider.d.ts +2 -2
  10. package/lib/aws/ec2/vpc.provider.d.ts.map +1 -1
  11. package/lib/aws/ec2/vpc.provider.js +6 -7
  12. package/lib/aws/ec2/vpc.provider.js.map +1 -1
  13. package/lib/aws/lambda/function.provider.d.ts.map +1 -1
  14. package/lib/aws/lambda/function.provider.js +19 -23
  15. package/lib/aws/lambda/function.provider.js.map +1 -1
  16. package/lib/aws/sqs/queue.provider.d.ts +1 -2
  17. package/lib/aws/sqs/queue.provider.d.ts.map +1 -1
  18. package/lib/aws/sqs/queue.provider.js +14 -7
  19. package/lib/aws/sqs/queue.provider.js.map +1 -1
  20. package/lib/cli/index.d.ts +7 -3
  21. package/lib/cli/index.d.ts.map +1 -1
  22. package/lib/cloudflare/kv/namespace.provider.d.ts.map +1 -1
  23. package/lib/cloudflare/kv/namespace.provider.js +11 -6
  24. package/lib/cloudflare/kv/namespace.provider.js.map +1 -1
  25. package/lib/cloudflare/r2/bucket.binding.js +1 -1
  26. package/lib/cloudflare/r2/bucket.binding.js.map +1 -1
  27. package/lib/cloudflare/r2/bucket.d.ts +1 -1
  28. package/lib/cloudflare/r2/bucket.d.ts.map +1 -1
  29. package/lib/cloudflare/r2/bucket.provider.d.ts +1 -2
  30. package/lib/cloudflare/r2/bucket.provider.d.ts.map +1 -1
  31. package/lib/cloudflare/r2/bucket.provider.js +20 -14
  32. package/lib/cloudflare/r2/bucket.provider.js.map +1 -1
  33. package/lib/cloudflare/worker/worker.d.ts +2 -2
  34. package/lib/cloudflare/worker/worker.d.ts.map +1 -1
  35. package/lib/cloudflare/worker/worker.provider.d.ts +1 -2
  36. package/lib/cloudflare/worker/worker.provider.d.ts.map +1 -1
  37. package/lib/cloudflare/worker/worker.provider.js +40 -13
  38. package/lib/cloudflare/worker/worker.provider.js.map +1 -1
  39. package/lib/instance-id.d.ts +5 -1
  40. package/lib/instance-id.d.ts.map +1 -1
  41. package/lib/instance-id.js +4 -0
  42. package/lib/instance-id.js.map +1 -1
  43. package/lib/physical-name.d.ts +15 -4
  44. package/lib/physical-name.d.ts.map +1 -1
  45. package/lib/physical-name.js +12 -3
  46. package/lib/physical-name.js.map +1 -1
  47. package/lib/plan.d.ts.map +1 -1
  48. package/lib/plan.js +65 -17
  49. package/lib/plan.js.map +1 -1
  50. package/lib/provider.d.ts +0 -1
  51. package/lib/provider.d.ts.map +1 -1
  52. package/lib/provider.js.map +1 -1
  53. package/lib/resource.d.ts +3 -2
  54. package/lib/resource.d.ts.map +1 -1
  55. package/lib/resource.js.map +1 -1
  56. package/lib/tsconfig.test.tsbuildinfo +1 -1
  57. package/package.json +1 -1
  58. package/src/apply.ts +296 -286
  59. package/src/aws/dynamodb/table.provider.ts +15 -4
  60. package/src/aws/ec2/vpc.provider.ts +10 -9
  61. package/src/aws/lambda/function.provider.ts +42 -31
  62. package/src/aws/sqs/queue.provider.ts +15 -9
  63. package/src/cloudflare/kv/namespace.provider.ts +18 -14
  64. package/src/cloudflare/r2/bucket.binding.ts +1 -1
  65. package/src/cloudflare/r2/bucket.provider.ts +34 -30
  66. package/src/cloudflare/r2/bucket.ts +1 -1
  67. package/src/cloudflare/worker/worker.provider.ts +39 -13
  68. package/src/cloudflare/worker/worker.ts +2 -2
  69. package/src/instance-id.ts +5 -1
  70. package/src/physical-name.ts +27 -5
  71. package/src/plan.ts +90 -29
  72. package/src/provider.ts +0 -1
  73. package/src/resource.ts +17 -6
@@ -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.5.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
  */
@@ -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) {
@@ -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,
@@ -14481,19 +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
- }];
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
+ if (attr === void 0) return;
14517
+ }
14518
+ return [id, {
14519
+ action: "delete",
14520
+ state: {
14521
+ ...oldState,
14522
+ attr
14523
+ },
14524
+ bindings: [],
14525
+ provider,
14526
+ resource: {
14527
+ id,
14528
+ type: oldState.resourceType,
14529
+ attr,
14530
+ props: oldState.props
14531
+ },
14532
+ downstream: oldDownstreamDependencies[id] ?? []
14533
+ }];
14534
+ }
14497
14535
  })))).filter((v) => !!v));
14498
14536
  for (const [resourceId, deletion] of Object.entries(deletions)) {
14499
14537
  const dependencies = deletion.state.downstream.filter((d) => d in resourceGraph);
@@ -14559,18 +14597,20 @@ const isBindingDiff = Effect.fn(function* ({ target, oldBinding: { binding: oldB
14559
14597
  const provider = yield* newBinding.Tag;
14560
14598
  if (provider.diff) {
14561
14599
  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;
14600
+ if (oldState) {
14601
+ const diff$1 = yield* provider.diff({
14602
+ source: {
14603
+ id: oldCap.resource.id,
14604
+ props: newCap.resource.props,
14605
+ oldProps: oldState?.props,
14606
+ oldAttr: oldState?.attr
14607
+ },
14608
+ props: newBinding.props,
14609
+ attr: oldBinding.attr,
14610
+ target
14611
+ }).pipe(Effect.provide(Layer$1.succeed(InstanceId, oldState.instanceId)));
14612
+ if (diff$1?.action === "update" || diff$1?.action === "replace") return diff$1;
14613
+ }
14574
14614
  }
14575
14615
  return { action: oldBinding.capability.action !== newBinding.capability.action || oldBinding.capability?.resource?.id !== newBinding.capability?.resource?.id ? "update" : "noop" };
14576
14616
  });
@@ -14714,243 +14754,245 @@ const expandAndPivot = Effect.fnUntraced(function* (plan$1, session) {
14714
14754
  } else if (node.state?.instanceId) return node.state.instanceId;
14715
14755
  return yield* Effect.dieMessage(`Instance ID not found for resource '${id}' and action is '${node.action}'`);
14716
14756
  });
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({
14757
+ return yield* Effect.gen(function* () {
14758
+ if (node.action === "create") {
14759
+ const news = yield* evaluate(node.props, upstream$1);
14760
+ const checkpoint = (attr$1) => commit({
14761
+ status: "creating",
14762
+ logicalId: id,
14763
+ instanceId,
14764
+ resourceType: node.resource.type,
14765
+ props: news,
14766
+ attr: attr$1,
14767
+ providerVersion: node.provider.version ?? 0,
14768
+ bindings: node.bindings,
14769
+ downstream: node.downstream
14770
+ });
14771
+ if (!node.state) yield* checkpoint(void 0);
14772
+ let attr;
14773
+ if (node.action === "create" && node.provider.precreate && node.state?.attr === void 0) {
14774
+ yield* report("pre-creating");
14775
+ attr = yield* node.provider.precreate({
14776
+ id,
14777
+ news: node.props,
14778
+ session: scopedSession,
14779
+ instanceId
14780
+ });
14781
+ yield* checkpoint(attr);
14782
+ }
14783
+ yield* report("attaching");
14784
+ let bindingOutputs = yield* attachBindings({
14785
+ resource,
14786
+ bindings: node.bindings,
14787
+ target: {
14788
+ id,
14789
+ props: news,
14790
+ attr
14791
+ }
14792
+ });
14793
+ yield* report("creating");
14794
+ attr = yield* node.provider.create({
14735
14795
  id,
14736
- news: node.props,
14737
- session: scopedSession,
14738
- instanceId
14796
+ news,
14797
+ instanceId,
14798
+ bindings: bindingOutputs,
14799
+ session: scopedSession
14739
14800
  });
14740
14801
  yield* checkpoint(attr);
14741
- }
14742
- yield* report("attaching");
14743
- let bindingOutputs = yield* attachBindings({
14744
- resource,
14745
- bindings: node.bindings,
14746
- target: {
14747
- id,
14802
+ yield* report("post-attach");
14803
+ bindingOutputs = yield* postAttachBindings({
14804
+ resource,
14805
+ bindings: node.bindings,
14806
+ bindingOutputs,
14807
+ target: {
14808
+ id,
14809
+ props: news,
14810
+ attr
14811
+ }
14812
+ });
14813
+ yield* commit({
14814
+ status: "created",
14815
+ logicalId: id,
14816
+ instanceId,
14817
+ resourceType: node.resource.type,
14748
14818
  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: {
14819
+ attr,
14820
+ bindings: node.bindings.map((binding, i) => ({
14821
+ ...binding,
14822
+ attr: bindingOutputs[i]
14823
+ })),
14824
+ providerVersion: node.provider.version ?? 0,
14825
+ downstream: node.downstream
14826
+ });
14827
+ yield* report("created");
14828
+ return attr;
14829
+ } else if (node.action === "update") {
14830
+ 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])))));
14831
+ const news = yield* evaluate(node.props, upstream$2);
14832
+ const checkpoint = (attr$1) => {
14833
+ if (node.state.status === "replaced") return commit({
14834
+ ...node.state,
14835
+ attr: attr$1,
14836
+ props: news
14837
+ });
14838
+ else return commit({
14839
+ status: "updating",
14840
+ logicalId: id,
14841
+ instanceId,
14842
+ resourceType: node.resource.type,
14843
+ props: news,
14844
+ attr: attr$1,
14845
+ providerVersion: node.provider.version ?? 0,
14846
+ bindings: node.bindings,
14847
+ downstream: node.downstream,
14848
+ old: node.state.status === "updating" ? node.state.old : node.state
14849
+ });
14850
+ };
14851
+ yield* checkpoint(node.state.attr);
14852
+ yield* report("attaching");
14853
+ let bindingOutputs = yield* attachBindings({
14854
+ resource,
14855
+ bindings: node.bindings,
14856
+ target: {
14857
+ id,
14858
+ props: news,
14859
+ attr: node.state.attr
14860
+ }
14861
+ });
14862
+ yield* report("updating");
14863
+ const attr = yield* node.provider.update({
14767
14864
  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({
14865
+ news,
14866
+ instanceId,
14867
+ bindings: bindingOutputs,
14868
+ session: scopedSession,
14869
+ olds: node.state.status === "created" || node.state.status === "updated" || node.state.status === "replaced" ? node.state.props : node.state.old.props,
14870
+ output: node.state.attr
14871
+ });
14872
+ yield* checkpoint(attr);
14873
+ yield* report("post-attach");
14874
+ bindingOutputs = yield* postAttachBindings({
14875
+ resource,
14876
+ bindings: node.bindings,
14877
+ bindingOutputs,
14878
+ target: {
14879
+ id,
14880
+ props: news,
14881
+ attr
14882
+ }
14883
+ });
14884
+ if (node.state.status === "replaced") yield* commit({
14793
14885
  ...node.state,
14794
- attr: attr$1,
14886
+ attr,
14795
14887
  props: news
14796
14888
  });
14797
- else return commit({
14798
- status: "updating",
14889
+ else yield* commit({
14890
+ status: "updated",
14891
+ logicalId: id,
14892
+ instanceId,
14893
+ resourceType: node.resource.type,
14894
+ props: news,
14895
+ attr,
14896
+ bindings: node.bindings.map((binding, i) => ({
14897
+ ...binding,
14898
+ attr: bindingOutputs[i]
14899
+ })),
14900
+ providerVersion: node.provider.version ?? 0,
14901
+ downstream: node.downstream
14902
+ });
14903
+ yield* report("updated");
14904
+ return attr;
14905
+ } else if (node.action === "replace") {
14906
+ if (node.state.status === "replaced") return node.state.attr;
14907
+ let state$1;
14908
+ if (node.state.status !== "replacing") yield* commit(state$1 = {
14909
+ status: "replacing",
14910
+ logicalId: id,
14911
+ instanceId,
14912
+ resourceType: node.resource.type,
14913
+ props: node.props,
14914
+ attr: node.state.attr,
14915
+ providerVersion: node.provider.version ?? 0,
14916
+ deleteFirst: node.deleteFirst,
14917
+ old: node.state,
14918
+ downstream: node.downstream
14919
+ });
14920
+ else state$1 = node.state;
14921
+ 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])))));
14922
+ const news = yield* evaluate(node.props, upstream$2);
14923
+ const checkpoint = ({ status, attr: attr$1, bindings }) => commit({
14924
+ status,
14799
14925
  logicalId: id,
14800
14926
  instanceId,
14801
14927
  resourceType: node.resource.type,
14802
14928
  props: news,
14803
14929
  attr: attr$1,
14804
14930
  providerVersion: node.provider.version ?? 0,
14805
- bindings: node.bindings,
14931
+ bindings: bindings ?? node.bindings,
14806
14932
  downstream: node.downstream,
14807
- old: node.state.status === "updating" ? node.state.old : node.state
14933
+ old: state$1.old,
14934
+ deleteFirst: node.deleteFirst
14808
14935
  });
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
14936
+ let attr;
14937
+ if (node.provider.precreate && node.state?.attr === void 0) {
14938
+ yield* report("pre-creating");
14939
+ attr = yield* node.provider.precreate({
14940
+ id,
14941
+ news: node.props,
14942
+ session: scopedSession,
14943
+ instanceId
14944
+ });
14945
+ yield* checkpoint({
14946
+ status: "replacing",
14947
+ attr
14948
+ });
14841
14949
  }
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({
14950
+ yield* report("attaching");
14951
+ let bindingOutputs = yield* attachBindings({
14952
+ resource,
14953
+ bindings: node.bindings,
14954
+ target: {
14955
+ id,
14956
+ props: news,
14957
+ attr
14958
+ }
14959
+ });
14960
+ yield* report("creating replacement");
14961
+ attr = yield* node.provider.create({
14899
14962
  id,
14900
- news: node.props,
14901
- session: scopedSession,
14902
- instanceId
14963
+ news,
14964
+ instanceId,
14965
+ bindings: bindingOutputs,
14966
+ session: scopedSession
14903
14967
  });
14904
14968
  yield* checkpoint({
14905
14969
  status: "replacing",
14906
14970
  attr
14907
14971
  });
14972
+ yield* report("post-attach");
14973
+ bindingOutputs = yield* postAttachBindings({
14974
+ resource,
14975
+ bindings: node.bindings,
14976
+ bindingOutputs,
14977
+ target: {
14978
+ id,
14979
+ props: news,
14980
+ attr
14981
+ }
14982
+ });
14983
+ yield* checkpoint({
14984
+ status: "replaced",
14985
+ attr,
14986
+ bindings: node.bindings.map((binding, i) => ({
14987
+ ...binding,
14988
+ attr: bindingOutputs[i]
14989
+ }))
14990
+ });
14991
+ yield* report("created");
14992
+ return attr;
14908
14993
  }
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}`);
14994
+ return yield* Effect.dieMessage(`Unknown action: ${node.action}`);
14995
+ }).pipe(Effect.provide(Layer.succeed(InstanceId, instanceId)));
14954
14996
  }));
14955
14997
  });
14956
14998
  return Object.fromEntries(yield* Effect.all(Object.entries(plan$1.resources).map(Effect.fn(function* ([id, node]) {
@@ -15051,7 +15093,7 @@ const collectGarbage = Effect.fnUntraced(function* (plan$1, session) {
15051
15093
  });
15052
15094
  yield* report("replaced");
15053
15095
  }
15054
- }));
15096
+ }).pipe(Effect.provide(Layer.succeed(InstanceId, instanceId))));
15055
15097
  });
15056
15098
  yield* Effect.all(Object.values(deletionGraph).filter((node) => node !== void 0).map(deleteResource));
15057
15099
  });
@@ -15059,7 +15101,7 @@ const collectGarbage = Effect.fnUntraced(function* (plan$1, session) {
15059
15101
  //#endregion
15060
15102
  //#region src/dot-alchemy.ts
15061
15103
  var DotAlchemy = class extends Context.Tag(".alchemy")() {};
15062
- const dotAlchemy = Layer.effect(DotAlchemy, Effect.gen(function* () {
15104
+ const dotAlchemy = Layer$1.effect(DotAlchemy, Effect.gen(function* () {
15063
15105
  const fs$1 = yield* FileSystem.FileSystem;
15064
15106
  const dir = (yield* Path$1.Path).join(process.cwd(), ".alchemy");
15065
15107
  yield* fs$1.makeDirectory(dir, { recursive: true });
@@ -55235,7 +55277,7 @@ function useGlobalSpinner(intervalMs = 80) {
55235
55277
 
55236
55278
  //#endregion
55237
55279
  //#region src/cli/ink-service.tsx
55238
- const inkCLI = () => Layer.succeed(CLI, CLI.of({
55280
+ const inkCLI = () => Layer$1.succeed(CLI, CLI.of({
55239
55281
  approvePlan,
55240
55282
  displayPlan,
55241
55283
  startApplySession
@@ -55325,10 +55367,10 @@ const execStack = Effect.fn(function* ({ main: main$1, stage: stage$1, envFile:
55325
55367
  if (!stack) return yield* Effect.die(/* @__PURE__ */ new Error(`Main file '${main$1}' must export a default stack definition (export default defineStack({...}))`));
55326
55368
  const stackName = stack.name;
55327
55369
  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({
55370
+ const stageConfig = yield* asEffect(stack.stages.config(stage$1)).pipe(Effect.provide(stack.layers ?? Layer$1.empty), Effect.withConfigProvider(configProvider));
55371
+ const platform$1 = Layer$1.mergeAll(NodeContext.layer, FetchHttpClient.layer, Logger.pretty);
55372
+ const alchemy = Layer$1.mergeAll(stack.state ?? localFs, stack.cli ?? inkCLI(), dotAlchemy);
55373
+ const layers = Layer$1.provideMerge(Layer$1.provideMerge(stack.providers, alchemy), Layer$1.mergeAll(platform$1, make({
55332
55374
  name: stackName,
55333
55375
  stage: stage$1,
55334
55376
  config: stageConfig
@@ -55342,7 +55384,7 @@ const execStack = Effect.fn(function* ({ main: main$1, stage: stage$1, envFile:
55342
55384
  if (!(yield* cli.approvePlan(updatePlan))) return;
55343
55385
  }
55344
55386
  const outputs = yield* applyPlan(updatePlan);
55345
- if (outputs && stack.tap) yield* stack.tap(outputs).pipe(Effect.provide(stack.layers ?? Layer.empty));
55387
+ if (outputs && stack.tap) yield* stack.tap(outputs).pipe(Effect.provide(stack.layers ?? Layer$1.empty));
55346
55388
  }
55347
55389
  }).pipe(Effect.provide(layers), Effect.withConfigProvider(configProvider));
55348
55390
  });