alchemy 2.0.0-beta.14 → 2.0.0-beta.16

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 (175) hide show
  1. package/bin/alchemy.js +2243 -1359
  2. package/bin/alchemy.js.map +1 -1
  3. package/bin/alchemy.ts +4 -0
  4. package/bin/commands/deploy.ts +0 -1
  5. package/bin/commands/login.ts +6 -3
  6. package/bin/commands/profile.ts +86 -0
  7. package/bin/commands/state.ts +8 -5
  8. package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
  9. package/lib/AWS/Lambda/BucketEventSource.d.ts.map +1 -1
  10. package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
  11. package/lib/AWS/Lambda/EventBridgeEventSource.d.ts.map +1 -1
  12. package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
  13. package/lib/AWS/Lambda/QueueEventSource.d.ts.map +1 -1
  14. package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
  15. package/lib/AWS/Lambda/StreamEventSource.d.ts.map +1 -1
  16. package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
  17. package/lib/AWS/Lambda/TableEventSource.d.ts.map +1 -1
  18. package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
  19. package/lib/AWS/Lambda/TopicEventSource.d.ts.map +1 -1
  20. package/lib/Agent/lsp/client.d.ts +2 -2
  21. package/lib/Cli/InkCLI.d.ts +0 -1
  22. package/lib/Cli/InkCLI.d.ts.map +1 -1
  23. package/lib/Cli/InkCLI.js +0 -5
  24. package/lib/Cli/InkCLI.js.map +1 -1
  25. package/lib/Cli/index.d.ts +0 -1
  26. package/lib/Cli/index.d.ts.map +1 -1
  27. package/lib/Cli/index.js +4 -1
  28. package/lib/Cli/index.js.map +1 -1
  29. package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts +57 -0
  30. package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -0
  31. package/lib/Cloudflare/ApiToken/AccountApiToken.js +141 -0
  32. package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -0
  33. package/lib/Cloudflare/ApiToken/Common.d.ts +96 -0
  34. package/lib/Cloudflare/ApiToken/Common.d.ts.map +1 -0
  35. package/lib/Cloudflare/ApiToken/Common.js +61 -0
  36. package/lib/Cloudflare/ApiToken/Common.js.map +1 -0
  37. package/lib/Cloudflare/ApiToken/PermissionGroups.d.ts +1549 -0
  38. package/lib/Cloudflare/ApiToken/PermissionGroups.d.ts.map +1 -0
  39. package/lib/Cloudflare/ApiToken/PermissionGroups.js +1856 -0
  40. package/lib/Cloudflare/ApiToken/PermissionGroups.js.map +1 -0
  41. package/lib/Cloudflare/ApiToken/UserApiToken.d.ts +48 -0
  42. package/lib/Cloudflare/ApiToken/UserApiToken.d.ts.map +1 -0
  43. package/lib/Cloudflare/ApiToken/UserApiToken.js +113 -0
  44. package/lib/Cloudflare/ApiToken/UserApiToken.js.map +1 -0
  45. package/lib/Cloudflare/ApiToken/index.d.ts +5 -0
  46. package/lib/Cloudflare/ApiToken/index.d.ts.map +1 -0
  47. package/lib/Cloudflare/ApiToken/index.js +5 -0
  48. package/lib/Cloudflare/ApiToken/index.js.map +1 -0
  49. package/lib/Cloudflare/Artifacts/Artifacts.d.ts +101 -0
  50. package/lib/Cloudflare/Artifacts/Artifacts.d.ts.map +1 -0
  51. package/lib/Cloudflare/Artifacts/Artifacts.js +92 -0
  52. package/lib/Cloudflare/Artifacts/Artifacts.js.map +1 -0
  53. package/lib/Cloudflare/Artifacts/ArtifactsBinding.d.ts +83 -0
  54. package/lib/Cloudflare/Artifacts/ArtifactsBinding.d.ts.map +1 -0
  55. package/lib/Cloudflare/Artifacts/ArtifactsBinding.js +65 -0
  56. package/lib/Cloudflare/Artifacts/ArtifactsBinding.js.map +1 -0
  57. package/lib/Cloudflare/Artifacts/index.d.ts +3 -0
  58. package/lib/Cloudflare/Artifacts/index.d.ts.map +1 -0
  59. package/lib/Cloudflare/Artifacts/index.js +3 -0
  60. package/lib/Cloudflare/Artifacts/index.js.map +1 -0
  61. package/lib/Cloudflare/Auth/AuthProvider.js +2 -2
  62. package/lib/Cloudflare/Auth/AuthProvider.js.map +1 -1
  63. package/lib/Cloudflare/Container/ContainerBinding.d.ts +1 -1
  64. package/lib/Cloudflare/Providers.d.ts.map +1 -1
  65. package/lib/Cloudflare/Providers.js +6 -1
  66. package/lib/Cloudflare/Providers.js.map +1 -1
  67. package/lib/Cloudflare/StateStore/Api.d.ts +7 -8
  68. package/lib/Cloudflare/StateStore/Api.d.ts.map +1 -1
  69. package/lib/Cloudflare/StateStore/Api.js +6 -4
  70. package/lib/Cloudflare/StateStore/Api.js.map +1 -1
  71. package/lib/Cloudflare/StateStore/State.d.ts +1 -1
  72. package/lib/Cloudflare/StateStore/State.d.ts.map +1 -1
  73. package/lib/Cloudflare/StateStore/Store.d.ts +2 -2
  74. package/lib/Cloudflare/StateStore/Store.d.ts.map +1 -1
  75. package/lib/Cloudflare/StateStore/Store.js +6 -4
  76. package/lib/Cloudflare/StateStore/Store.js.map +1 -1
  77. package/lib/Cloudflare/StateStore/Token.d.ts +6 -4
  78. package/lib/Cloudflare/StateStore/Token.d.ts.map +1 -1
  79. package/lib/Cloudflare/StateStore/Token.js +8 -4
  80. package/lib/Cloudflare/StateStore/Token.js.map +1 -1
  81. package/lib/Cloudflare/Workers/InferEnv.d.ts +1 -1
  82. package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
  83. package/lib/Cloudflare/Workers/InferEnv.js +0 -1
  84. package/lib/Cloudflare/Workers/InferEnv.js.map +1 -1
  85. package/lib/Cloudflare/Workers/Worker.d.ts +2 -1
  86. package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
  87. package/lib/Cloudflare/Workers/Worker.js +25 -18
  88. package/lib/Cloudflare/Workers/Worker.js.map +1 -1
  89. package/lib/Cloudflare/index.d.ts +2 -0
  90. package/lib/Cloudflare/index.d.ts.map +1 -1
  91. package/lib/Cloudflare/index.js +2 -0
  92. package/lib/Cloudflare/index.js.map +1 -1
  93. package/lib/Deploy.d.ts +1 -1
  94. package/lib/Deploy.d.ts.map +1 -1
  95. package/lib/Destroy.d.ts +1 -1
  96. package/lib/Destroy.d.ts.map +1 -1
  97. package/lib/GitHub/AuthProvider.d.ts +37 -0
  98. package/lib/GitHub/AuthProvider.d.ts.map +1 -0
  99. package/lib/GitHub/AuthProvider.js +154 -0
  100. package/lib/GitHub/AuthProvider.js.map +1 -0
  101. package/lib/GitHub/Credentials.d.ts +29 -0
  102. package/lib/GitHub/Credentials.d.ts.map +1 -0
  103. package/lib/GitHub/Credentials.js +54 -0
  104. package/lib/GitHub/Credentials.js.map +1 -0
  105. package/lib/GitHub/Providers.d.ts +14 -0
  106. package/lib/GitHub/Providers.d.ts.map +1 -0
  107. package/lib/GitHub/Providers.js +15 -0
  108. package/lib/GitHub/Providers.js.map +1 -0
  109. package/lib/GitHub/Secret.d.ts +8 -10
  110. package/lib/GitHub/Secret.d.ts.map +1 -1
  111. package/lib/GitHub/Secret.js +16 -14
  112. package/lib/GitHub/Secret.js.map +1 -1
  113. package/lib/GitHub/Variable.d.ts +8 -10
  114. package/lib/GitHub/Variable.d.ts.map +1 -1
  115. package/lib/GitHub/Variable.js +12 -13
  116. package/lib/GitHub/Variable.js.map +1 -1
  117. package/lib/GitHub/index.d.ts +3 -0
  118. package/lib/GitHub/index.d.ts.map +1 -1
  119. package/lib/GitHub/index.js +3 -0
  120. package/lib/GitHub/index.js.map +1 -1
  121. package/lib/Output.d.ts.map +1 -1
  122. package/lib/Output.js +4 -0
  123. package/lib/Output.js.map +1 -1
  124. package/lib/Plan.d.ts.map +1 -1
  125. package/lib/Plan.js +4 -0
  126. package/lib/Plan.js.map +1 -1
  127. package/lib/Stack.d.ts +5 -4
  128. package/lib/Stack.d.ts.map +1 -1
  129. package/lib/Stack.js +27 -8
  130. package/lib/Stack.js.map +1 -1
  131. package/lib/State/HttpStateStore.js +1 -1
  132. package/lib/State/HttpStateStore.js.map +1 -1
  133. package/lib/Test/Bun.d.ts +2 -2
  134. package/lib/Test/Bun.d.ts.map +1 -1
  135. package/lib/Test/Bun.js +2 -4
  136. package/lib/Test/Bun.js.map +1 -1
  137. package/lib/Test/Vitest.d.ts +1 -1
  138. package/lib/Test/Vitest.d.ts.map +1 -1
  139. package/lib/Test/Vitest.js +11 -7
  140. package/lib/Test/Vitest.js.map +1 -1
  141. package/lib/cli/index.d.ts +2 -6
  142. package/lib/cli/index.d.ts.map +1 -1
  143. package/lib/cli/index.js +2 -43050
  144. package/lib/cli/index.js.map +1 -1
  145. package/package.json +5 -5
  146. package/src/Cli/InkCLI.tsx +0 -10
  147. package/src/Cli/index.ts +4 -1
  148. package/src/Cloudflare/ApiToken/AccountApiToken.ts +207 -0
  149. package/src/Cloudflare/ApiToken/Common.ts +153 -0
  150. package/src/Cloudflare/ApiToken/PermissionGroups.ts +1910 -0
  151. package/src/Cloudflare/ApiToken/UserApiToken.ts +166 -0
  152. package/src/Cloudflare/ApiToken/index.ts +4 -0
  153. package/src/Cloudflare/Artifacts/Artifacts.ts +139 -0
  154. package/src/Cloudflare/Artifacts/ArtifactsBinding.ts +188 -0
  155. package/src/Cloudflare/Artifacts/index.ts +2 -0
  156. package/src/Cloudflare/Auth/AuthProvider.ts +2 -2
  157. package/src/Cloudflare/Providers.ts +8 -0
  158. package/src/Cloudflare/StateStore/Api.ts +6 -4
  159. package/src/Cloudflare/StateStore/Store.ts +6 -4
  160. package/src/Cloudflare/StateStore/Token.ts +10 -4
  161. package/src/Cloudflare/Workers/InferEnv.ts +5 -4
  162. package/src/Cloudflare/Workers/Worker.ts +12 -1
  163. package/src/Cloudflare/index.ts +2 -0
  164. package/src/GitHub/AuthProvider.ts +309 -0
  165. package/src/GitHub/Credentials.ts +99 -0
  166. package/src/GitHub/Providers.ts +26 -0
  167. package/src/GitHub/Secret.ts +22 -24
  168. package/src/GitHub/Variable.ts +16 -23
  169. package/src/GitHub/index.ts +3 -0
  170. package/src/Output.ts +3 -0
  171. package/src/Plan.ts +3 -0
  172. package/src/Stack.ts +33 -7
  173. package/src/State/HttpStateStore.ts +1 -0
  174. package/src/Test/Bun.ts +2 -2
  175. package/src/Test/Vitest.ts +11 -7
package/src/Plan.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as Data from "effect/Data";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Option from "effect/Option";
4
+ import * as Redacted from "effect/Redacted";
4
5
  import { asEffect } from ".//Util/types.ts";
5
6
  import {
6
7
  Artifacts,
@@ -271,6 +272,8 @@ export const make = <A>(
271
272
  return input;
272
273
  } else if (Output.isExpr(input)) {
273
274
  return yield* resolveOutput(input);
275
+ } else if (Redacted.isRedacted(input)) {
276
+ return input;
274
277
  } else if (Array.isArray(input)) {
275
278
  return yield* Effect.all(input.map(resolveInput), {
276
279
  concurrency: "unbounded",
package/src/Stack.ts CHANGED
@@ -13,7 +13,7 @@ import type { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSp
13
13
  import { AlchemyContext, AlchemyContextLive } from "./AlchemyContext.ts";
14
14
  import { provideFreshArtifactStore } from "./Artifacts.ts";
15
15
  import { AuthProviders } from "./Auth/AuthProvider.ts";
16
- import { inkCLIAutoApprove } from "./Cli/InkCLI.tsx";
16
+ import { Cli } from "./Cli/Cli.ts";
17
17
  import type { Input, InputProps } from "./Input.ts";
18
18
  import * as Output from "./Output.ts";
19
19
  import { ref } from "./Ref.ts";
@@ -34,7 +34,8 @@ export type StackServices =
34
34
  | AlchemyContext
35
35
  | HttpClient
36
36
  | ChildProcessSpawner
37
- | AuthProviders;
37
+ | AuthProviders
38
+ | Cli;
38
39
 
39
40
  export type StackEffect<A, Err = never, Req = never> = Effect.Effect<
40
41
  A,
@@ -44,6 +45,7 @@ export type StackEffect<A, Err = never, Req = never> = Effect.Effect<
44
45
  | Scope
45
46
  | AuthProviders
46
47
  | AlchemyContext
48
+ | Cli
47
49
  | State
48
50
  | Req
49
51
  >;
@@ -172,8 +174,33 @@ export const make =
172
174
  effect: Effect.Effect<A, Err, Req>,
173
175
  ) =>
174
176
  Effect.scope.pipe(
175
- Effect.flatMap((scope) =>
176
- options.providers.pipe(
177
+ Effect.flatMap((scope) => {
178
+ if (options.state == null) {
179
+ return Effect.die(
180
+ new Error(
181
+ `Stack "${options.name}" is missing a state store. ` +
182
+ `Add a \`state\` layer to the stack options, e.g.:\n` +
183
+ ` Alchemy.Stack("${options.name}", {\n` +
184
+ ` providers: Cloudflare.providers(),\n` +
185
+ ` state: Cloudflare.state(), // <-- required\n` +
186
+ ` }, ...)\n` +
187
+ `See https://alchemy.run/concepts/state-store for available state stores.`,
188
+ ),
189
+ );
190
+ }
191
+ if (options.providers == null) {
192
+ return Effect.die(
193
+ new Error(
194
+ `Stack "${options.name}" is missing a providers layer. ` +
195
+ `Add a \`providers\` layer to the stack options, e.g.:\n` +
196
+ ` Alchemy.Stack("${options.name}", {\n` +
197
+ ` providers: Cloudflare.providers(), // <-- required\n` +
198
+ ` state: Cloudflare.state(),\n` +
199
+ ` }, ...)`,
200
+ ),
201
+ );
202
+ }
203
+ return options.providers.pipe(
177
204
  Layer.provideMerge(options.state),
178
205
  Layer.provideMerge(
179
206
  Layer.effect(
@@ -192,8 +219,8 @@ export const make =
192
219
  ),
193
220
  ),
194
221
  Layer.buildWithScope(scope),
195
- ),
196
- ),
222
+ );
223
+ }),
197
224
  Effect.flatMap((context) =>
198
225
  Effect.all([
199
226
  effect,
@@ -257,7 +284,6 @@ export const evalStack = <A, B, Err, Req>(
257
284
  ),
258
285
  ),
259
286
  Effect.provide(Layer.succeed(Stage, options.stage)),
260
- Effect.provide(inkCLIAutoApprove()),
261
287
  Effect.provide(Layer.provideMerge(alchemy, platform)),
262
288
  Effect.scoped,
263
289
  );
@@ -143,6 +143,7 @@ const retryTransient = <A, Err, Req>(eff: Effect.Effect<A, Err, Req>) =>
143
143
  /** Collapse any client failure into a {@link StateStoreError}. */
144
144
  const mapStateStoreError = <A, E, R>(eff: Effect.Effect<A, E, R>) =>
145
145
  eff.pipe(
146
+ Effect.tapError(Effect.log),
146
147
  retryTransient,
147
148
  Effect.catch((e: E) =>
148
149
  Effect.fail(
package/src/Test/Bun.ts CHANGED
@@ -9,6 +9,7 @@ import type { HookOptions } from "node:test";
9
9
  import { AlchemyContext, AlchemyContextLive } from "../AlchemyContext.ts";
10
10
  import { provideFreshArtifactStore } from "../Artifacts.ts";
11
11
  import { AuthProviders } from "../Auth/AuthProvider.ts";
12
+ import { inkCLI } from "../Cli/InkCLI.tsx";
12
13
  import { deploy as _deploy } from "../Deploy.ts";
13
14
  import { destroy as _destroy } from "../Destroy.ts";
14
15
  import {
@@ -28,8 +29,7 @@ const platform = Layer.mergeAll(PlatformServices, FetchHttpClient.layer);
28
29
 
29
30
  // override alchemy state store, CLI/reporting, state, and dotAlchemy
30
31
  const alchemy = Layer.mergeAll(
31
- // CLI.inkCLI(),
32
- // optional
32
+ inkCLI(),
33
33
  Logger.layer([Logger.consolePretty()]),
34
34
  AlchemyContextLive,
35
35
  );
@@ -359,13 +359,17 @@ export namespace test {
359
359
  ): Effect.Effect<Input.Resolve<A>, Err, Req | Stack.Stack> =>
360
360
  Stack.Stack.use((stack) =>
361
361
  effect.pipe(
362
- // Effect.tap(Effect.logInfo),
363
- // @ts-expect-error
364
- Stack.make(stack.name, Layer.effectContext(Effect.context<never>()), {
365
- ...stack,
366
- resources: {},
367
- bindings: {},
368
- output: {},
362
+ // @ts-expect-error - test harness reuses ambient runtime context
363
+ Stack.make({
364
+ name: stack.name,
365
+ providers: Layer.effectContext(Effect.context<never>()),
366
+ state: State.localState(),
367
+ stack: {
368
+ ...stack,
369
+ resources: {},
370
+ bindings: {},
371
+ output: {},
372
+ },
369
373
  }),
370
374
  Effect.flatMap(Plan.make),
371
375
  Effect.tap((plan) => Effect.logInfo(formatPlan(plan))),