alchemy-effect 0.7.1 → 0.9.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 (54) hide show
  1. package/bin/alchemy-effect.js +29 -21
  2. package/bin/alchemy-effect.js.map +1 -1
  3. package/bin/alchemy-effect.ts +32 -68
  4. package/lib/cli/index.d.ts +1 -0
  5. package/lib/cli/index.d.ts.map +1 -1
  6. package/package.json +3 -2
  7. package/src/AWS/AutoScaling/LaunchTemplate.ts +5 -4
  8. package/src/AWS/EC2/Instance.ts +3 -4
  9. package/src/AWS/ECS/Task.ts +36 -34
  10. package/src/AWS/Lambda/Function.ts +68 -68
  11. package/src/Apply.ts +2 -0
  12. package/src/Artifacts.ts +10 -1
  13. package/src/Binding.ts +20 -5
  14. package/src/Cloudflare/Container.ts +210 -109
  15. package/src/Cloudflare/D1/D1Database.ts +32 -32
  16. package/src/Cloudflare/KV/Delete.ts +7 -5
  17. package/src/Cloudflare/KV/Get.ts +5 -5
  18. package/src/Cloudflare/KV/GetWithMetadata.ts +5 -5
  19. package/src/Cloudflare/KV/{Namespace.ts → KVNamespace.ts} +6 -6
  20. package/src/Cloudflare/KV/{NamespaceBinding.ts → KVNamespaceBinding.ts} +2 -2
  21. package/src/Cloudflare/KV/List.ts +5 -5
  22. package/src/Cloudflare/KV/Put.ts +5 -5
  23. package/src/Cloudflare/KV/index.ts +1 -1
  24. package/src/Cloudflare/Providers.ts +2 -8
  25. package/src/Cloudflare/R2/{Bucket.ts → R2Bucket.ts} +19 -19
  26. package/src/Cloudflare/R2/R2BucketBinding.ts +322 -0
  27. package/src/Cloudflare/R2/index.ts +2 -9
  28. package/src/Cloudflare/Workers/Assets.ts +11 -5
  29. package/src/Cloudflare/Workers/DurableObject.ts +4 -33
  30. package/src/Cloudflare/Workers/HttpServer.ts +1 -0
  31. package/src/Cloudflare/Workers/InferEnv.ts +23 -0
  32. package/src/Cloudflare/Workers/WebSocket.ts +4 -3
  33. package/src/Cloudflare/Workers/Worker.ts +480 -165
  34. package/src/Cloudflare/Workers/cloudflare_workers.ts +13 -21
  35. package/src/Cloudflare/Workers/index.ts +1 -0
  36. package/src/Cloudflare/index.ts +2 -2
  37. package/src/Platform.ts +36 -55
  38. package/src/Provider.ts +1 -0
  39. package/src/Resource.ts +3 -2
  40. package/src/Stack.ts +5 -4
  41. package/src/Test/Bun.ts +207 -0
  42. package/src/Util/ConfigProvider.ts +25 -0
  43. package/src/Util/FileLogger.ts +22 -0
  44. package/src/Util/effect.ts +24 -0
  45. package/src/Cloudflare/R2/BucketBinding.ts +0 -31
  46. package/src/Cloudflare/R2/CreateMultipartUpload.ts +0 -59
  47. package/src/Cloudflare/R2/DeleteObject.ts +0 -41
  48. package/src/Cloudflare/R2/GetObject.ts +0 -47
  49. package/src/Cloudflare/R2/HeadObject.ts +0 -41
  50. package/src/Cloudflare/R2/ListObjects.ts +0 -45
  51. package/src/Cloudflare/R2/MultipartUploadClient.ts +0 -40
  52. package/src/Cloudflare/R2/PutObject.ts +0 -55
  53. package/src/Cloudflare/R2/ResumeMultipartUpload.ts +0 -48
  54. package/src/Cloudflare/R2/UploadValue.ts +0 -10
@@ -5,7 +5,6 @@ import * as Config from "effect/Config";
5
5
  import * as ConfigProvider from "effect/ConfigProvider";
6
6
  import * as Console from "effect/Console";
7
7
  import * as Effect from "effect/Effect";
8
- import * as FileSystem from "effect/FileSystem";
9
8
  import * as Layer from "effect/Layer";
10
9
  import * as Logger from "effect/Logger";
11
10
  import * as Option from "effect/Option";
@@ -23,6 +22,7 @@ import * as Data from "effect/Data";
23
22
  import { pipe } from "effect/Function";
24
23
  import { SingleShotGen } from "effect/Utils";
25
24
  import "effect/Pipeable";
25
+ import * as FileSystem from "effect/FileSystem";
26
26
  import "@distilled.cloud/aws/sts";
27
27
  import { Region, Region as Region$1 } from "@distilled.cloud/aws/Region";
28
28
  import * as s3 from "@distilled.cloud/aws/s3";
@@ -69,7 +69,7 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
69
69
 
70
70
  //#endregion
71
71
  //#region package.json
72
- var version = "0.7.1";
72
+ var version = "0.9.0";
73
73
 
74
74
  //#endregion
75
75
  //#region src/Artifacts.ts
@@ -706,7 +706,8 @@ const executeNode = (fqn, node, tracker, ready, terminalStatuses, session, state
706
706
  id: logicalId,
707
707
  news: node.props,
708
708
  session: scopedSession,
709
- instanceId
709
+ instanceId,
710
+ bindings: excludeDeletedBindings(node.bindings)
710
711
  }).pipe(provideLifecycleScope(fqn, instanceId));
711
712
  yield* commit({
712
713
  status: "creating",
@@ -873,7 +874,8 @@ const executeNode = (fqn, node, tracker, ready, terminalStatuses, session, state
873
874
  id: logicalId,
874
875
  news: node.props,
875
876
  session: scopedSession,
876
- instanceId
877
+ instanceId,
878
+ bindings: excludeDeletedBindings(node.bindings)
877
879
  }).pipe(provideLifecycleScope(fqn, instanceId));
878
880
  yield* commit({
879
881
  status: "replacing",
@@ -44641,6 +44643,27 @@ const providePlanScope = (fqn, instanceId) => (effect) => Effect.serviceOption(A
44641
44643
  var DeleteResourceHasDownstreamDependencies = class extends Data.TaggedError("DeleteResourceHasDownstreamDependencies") {};
44642
44644
  var UnsatisfiedResourceCycle = class extends Data.TaggedError("UnsatisfiedResourceCycle") {};
44643
44645
 
44646
+ //#endregion
44647
+ //#region src/Util/ConfigProvider.ts
44648
+ const loadConfigProvider = (envFile$1) => {
44649
+ if (Option.isSome(envFile$1)) return ConfigProvider.fromDotEnv({ path: envFile$1.value }).pipe(Effect.map((dotEnv) => ConfigProvider.orElse(dotEnv, ConfigProvider.fromEnv())));
44650
+ return Effect.gen(function* () {
44651
+ if (!(yield* (yield* FileSystem.FileSystem).exists(".env"))) return ConfigProvider.fromEnv();
44652
+ return ConfigProvider.orElse(yield* ConfigProvider.fromDotEnv({ path: ".env" }), ConfigProvider.fromEnv());
44653
+ });
44654
+ };
44655
+
44656
+ //#endregion
44657
+ //#region src/Util/FileLogger.ts
44658
+ const fileLogger = Effect.fnUntraced(function* (...segments) {
44659
+ const dotAlchemy$1 = yield* DotAlchemy;
44660
+ const fs$2 = yield* FileSystem.FileSystem;
44661
+ const path = yield* Path;
44662
+ const logFile = path.join(dotAlchemy$1, "log", ...segments);
44663
+ yield* fs$2.makeDirectory(path.dirname(logFile), { recursive: true });
44664
+ return yield* Logger.formatLogFmt.pipe(Logger.toFile(logFile, { flag: "a" }));
44665
+ });
44666
+
44644
44667
  //#endregion
44645
44668
  //#region bin/alchemy-effect.ts
44646
44669
  const USER = Config.string("USER").pipe(Config.orElse(() => Config.string("USERNAME")), Config.withDefault("unknown"));
@@ -44653,21 +44676,6 @@ const envFile = Flag.file("env-file").pipe(Flag.optional, Flag.withDescription("
44653
44676
  const dryRun = Flag.boolean("dry-run").pipe(Flag.withDescription("Dry run the deployment, do not actually deploy"), Flag.withDefault(false));
44654
44677
  const yes = Flag.boolean("yes").pipe(Flag.withDescription("Yes to all prompts"), Flag.withDefault(false));
44655
44678
  const force = Flag.boolean("force").pipe(Flag.withDescription("Force updates for resources that would otherwise no-op"), Flag.withDefault(false));
44656
- const fileLogger = Effect.fnUntraced(function* (...segments) {
44657
- const dotAlchemy$1 = yield* DotAlchemy;
44658
- const fs$2 = yield* FileSystem.FileSystem;
44659
- const path = yield* Path;
44660
- const logFile = path.join(dotAlchemy$1, "log", ...segments);
44661
- yield* fs$2.makeDirectory(path.dirname(logFile), { recursive: true });
44662
- return yield* Logger.formatLogFmt.pipe(Logger.toFile(logFile, { flag: "a" }));
44663
- });
44664
- const loadConfigProvider = (envFile$1) => {
44665
- if (Option.isSome(envFile$1)) return ConfigProvider.fromDotEnv({ path: envFile$1.value }).pipe(Effect.map((dotEnv) => ConfigProvider.orElse(dotEnv, ConfigProvider.fromEnv())));
44666
- return Effect.gen(function* () {
44667
- if (!(yield* (yield* FileSystem.FileSystem).exists(".env"))) return ConfigProvider.fromEnv();
44668
- return ConfigProvider.orElse(yield* ConfigProvider.fromDotEnv({ path: ".env" }), ConfigProvider.fromEnv());
44669
- });
44670
- };
44671
44679
  const main = Argument.file("main", { mustExist: true }).pipe(Argument.withDescription("Main file to deploy, defaults to alchemy.run.ts"), Argument.withDefault("alchemy.run.ts"));
44672
44680
  const deployCommand = Command.make("deploy", {
44673
44681
  dryRun,
@@ -44706,7 +44714,7 @@ const execStack = Effect.fn(function* ({ main: main$1, stage: stage$1, envFile:
44706
44714
  yield* Effect.gen(function* () {
44707
44715
  const cli = yield* Cli;
44708
44716
  const stack = yield* stackEffect;
44709
- yield* provideFreshArtifactStore(Effect.gen(function* () {
44717
+ yield* Effect.gen(function* () {
44710
44718
  const updatePlan = yield* make(destroy ? {
44711
44719
  ...stack,
44712
44720
  resources: {},
@@ -44721,7 +44729,7 @@ const execStack = Effect.fn(function* ({ main: main$1, stage: stage$1, envFile:
44721
44729
  const outputs = yield* apply(updatePlan);
44722
44730
  yield* Console.log(outputs);
44723
44731
  }
44724
- })).pipe(Effect.provide(stack.services));
44732
+ }).pipe(Effect.provide(stack.services), provideFreshArtifactStore);
44725
44733
  }).pipe(Effect.provide(Layer.provideMerge(alchemy, Layer.mergeAll(platform$1, Layer.succeed(Stage, stage$1)))), Effect.provideService(ConfigProvider.ConfigProvider, configProvider));
44726
44734
  });
44727
44735
  const resourceFilter = Flag.string("filter").pipe(Flag.withDescription("Comma-separated logical resource IDs (e.g. Api,Sandbox). Only those resources are included."), Flag.optional, Flag.map(Option.getOrUndefined));