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
@@ -0,0 +1,96 @@
1
+ import { type PermissionGroupName } from "./PermissionGroups.ts";
2
+ /**
3
+ * Resource keys recognized by Cloudflare API token policies.
4
+ *
5
+ * The literal `"com.cloudflare.api.account"` is rewritten by the account-scoped
6
+ * provider to `"com.cloudflare.api.account.${accountId}"` so callers don't have
7
+ * to splice the account ID themselves.
8
+ *
9
+ * @see https://developers.cloudflare.com/fundamentals/api/reference/permissions/
10
+ */
11
+ export type ApiTokenResourceKey = "com.cloudflare.api.account" | `com.cloudflare.api.account.${string}` | `com.cloudflare.api.account.zone.${string}` | `com.cloudflare.edge.r2.bucket.${string}` | (string & {});
12
+ /**
13
+ * A permission group reference: either a typed Cloudflare permission-group
14
+ * name (resolved against the static catalog) or an explicit `{ id }` for
15
+ * names that aren't in the catalog or have multiple scopes.
16
+ */
17
+ export type ApiTokenPermissionGroupRef = PermissionGroupName | {
18
+ id: string;
19
+ meta?: {
20
+ key?: string;
21
+ value?: string;
22
+ };
23
+ };
24
+ export interface ApiTokenPolicy {
25
+ effect: "allow" | "deny";
26
+ permissionGroups: ApiTokenPermissionGroupRef[];
27
+ resources: {
28
+ [K in ApiTokenResourceKey]?: string;
29
+ };
30
+ }
31
+ export interface ApiTokenCondition {
32
+ requestIp?: {
33
+ in?: string[];
34
+ notIn?: string[];
35
+ };
36
+ }
37
+ export type ApiTokenProps = {
38
+ /**
39
+ * Token name. Defaults to a generated physical name based on the
40
+ * resource's logical id, app name, and stage.
41
+ */
42
+ name?: string;
43
+ /**
44
+ * The Cloudflare account ID that owns this token. Defaults to the
45
+ * account ID resolved from the ambient {@link CloudflareEnvironment}.
46
+ */
47
+ accountId?: string;
48
+ /**
49
+ * Access policies attached to the token. At least one policy is required
50
+ * by Cloudflare.
51
+ */
52
+ policies: ApiTokenPolicy[];
53
+ /** ISO 8601 expiration timestamp. */
54
+ expiresOn?: string;
55
+ /** ISO 8601 "not before" timestamp. */
56
+ notBefore?: string;
57
+ /** Optional usage conditions (e.g. IP allowlist). */
58
+ condition?: ApiTokenCondition;
59
+ };
60
+ export type ResolvedPolicy = {
61
+ effect: "allow" | "deny";
62
+ permissionGroups: {
63
+ id: string;
64
+ meta?: {
65
+ key?: string;
66
+ value?: string;
67
+ };
68
+ }[];
69
+ resources: Record<string, unknown>;
70
+ };
71
+ export declare const resolvePermissionGroup: (ref: ApiTokenPermissionGroupRef) => {
72
+ id: string;
73
+ meta?: undefined;
74
+ } | {
75
+ id: string;
76
+ meta: {
77
+ key?: string;
78
+ value?: string;
79
+ };
80
+ };
81
+ /**
82
+ * Rewrite the bare `"com.cloudflare.api.account"` key to the
83
+ * account-scoped form. Pass `accountId: undefined` to leave keys unchanged
84
+ * (e.g. for user-owned tokens whose policies don't carry an account scope).
85
+ */
86
+ export declare const resolveResources: (resources: ApiTokenPolicy["resources"], accountId: string | undefined) => Record<string, string>;
87
+ export declare const resolvePolicies: (policies: ApiTokenPolicy[], accountId: string | undefined) => ResolvedPolicy[];
88
+ export declare const policyFingerprint: (policies: ResolvedPolicy[]) => string;
89
+ export declare const conditionFingerprint: (condition: ApiTokenCondition | undefined) => string;
90
+ export declare const buildConditionPayload: (condition: ApiTokenCondition | undefined) => {
91
+ requestIp: {
92
+ in: string[] | undefined;
93
+ notIn: string[] | undefined;
94
+ } | undefined;
95
+ } | undefined;
96
+ //# sourceMappingURL=Common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Common.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/Common.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAC3B,4BAA4B,GAC5B,8BAA8B,MAAM,EAAE,GACtC,mCAAmC,MAAM,EAAE,GAC3C,iCAAiC,MAAM,EAAE,GACzC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAClC,mBAAmB,GACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,gBAAgB,EAAE,0BAA0B,EAAE,CAAC;IAC/C,SAAS,EAAE;SAAG,CAAC,IAAI,mBAAmB,CAAC,CAAC,EAAE,MAAM;KAAE,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE;QACV,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,gBAAgB,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,EAAE,CAAC;IAC5E,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,KAAK,0BAA0B;;;;;;cA7CrC,MAAM;gBAAU,MAAM;;CA0DtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,cAAc,CAAC,WAAW,CAAC,EACtC,WAAW,MAAM,GAAG,SAAS,KAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAWvB,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,UAAU,cAAc,EAAE,EAC1B,WAAW,MAAM,GAAG,SAAS,KAC5B,cAAc,EAKZ,CAAC;AAEN,eAAO,MAAM,iBAAiB,GAAI,UAAU,cAAc,EAAE,KAAG,MAW5D,CAAC;AAEJ,eAAO,MAAM,oBAAoB,GAC/B,WAAW,iBAAiB,GAAG,SAAS,KACvC,MAIC,CAAC;AAEL,eAAO,MAAM,qBAAqB,GAChC,WAAW,iBAAiB,GAAG,SAAS;;;;;aAW3B,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { PERMISSION_GROUPS_BY_NAME, } from "./PermissionGroups.js";
2
+ export const resolvePermissionGroup = (ref) => {
3
+ if (typeof ref === "string") {
4
+ const group = PERMISSION_GROUPS_BY_NAME[ref];
5
+ if (!group) {
6
+ // Should be unreachable due to the typed union, but guard anyway in
7
+ // case Cloudflare retires a name we still have in the catalog.
8
+ throw new Error(`Unknown Cloudflare permission group: "${ref}". Pass an explicit { id } instead.`);
9
+ }
10
+ return { id: group.id };
11
+ }
12
+ return ref.meta ? { id: ref.id, meta: ref.meta } : { id: ref.id };
13
+ };
14
+ /**
15
+ * Rewrite the bare `"com.cloudflare.api.account"` key to the
16
+ * account-scoped form. Pass `accountId: undefined` to leave keys unchanged
17
+ * (e.g. for user-owned tokens whose policies don't carry an account scope).
18
+ */
19
+ export const resolveResources = (resources, accountId) => {
20
+ const out = {};
21
+ for (const [key, value] of Object.entries(resources)) {
22
+ if (value === undefined)
23
+ continue;
24
+ if (key === "com.cloudflare.api.account" && accountId) {
25
+ out[`com.cloudflare.api.account.${accountId}`] = value;
26
+ }
27
+ else {
28
+ out[key] = value;
29
+ }
30
+ }
31
+ return out;
32
+ };
33
+ export const resolvePolicies = (policies, accountId) => policies.map((policy) => ({
34
+ effect: policy.effect,
35
+ permissionGroups: policy.permissionGroups.map(resolvePermissionGroup),
36
+ resources: resolveResources(policy.resources, accountId),
37
+ }));
38
+ export const policyFingerprint = (policies) => JSON.stringify(policies.map((p) => ({
39
+ effect: p.effect,
40
+ permissionGroups: [...p.permissionGroups]
41
+ .map((g) => ({ id: g.id, meta: g.meta ?? null }))
42
+ .sort((a, b) => a.id.localeCompare(b.id)),
43
+ resources: Object.keys(p.resources)
44
+ .sort()
45
+ .map((k) => [k, p.resources[k]]),
46
+ })));
47
+ export const conditionFingerprint = (condition) => JSON.stringify({
48
+ in: [...(condition?.requestIp?.in ?? [])].sort(),
49
+ notIn: [...(condition?.requestIp?.notIn ?? [])].sort(),
50
+ });
51
+ export const buildConditionPayload = (condition) => condition
52
+ ? {
53
+ requestIp: condition.requestIp
54
+ ? {
55
+ in: condition.requestIp.in,
56
+ notIn: condition.requestIp.notIn,
57
+ }
58
+ : undefined,
59
+ }
60
+ : undefined;
61
+ //# sourceMappingURL=Common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Common.js","sourceRoot":"","sources":["../../../src/Cloudflare/ApiToken/Common.ts"],"names":[],"mappings":"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"}