@microagi/alchemy-gcp 0.8.1 → 0.10.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 (77) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/lib/ArtifactRegistry/Operations.d.ts +2 -2
  3. package/lib/ArtifactRegistry/Operations.d.ts.map +1 -1
  4. package/lib/ArtifactRegistry/Repository.d.ts +1 -1
  5. package/lib/ArtifactRegistry/Validation.d.ts.map +1 -1
  6. package/lib/Auth/AuthProvider.d.ts.map +1 -1
  7. package/lib/Auth/AuthProvider.js.map +1 -1
  8. package/lib/Auth/Credentials.d.ts +1 -1
  9. package/lib/Auth/Credentials.d.ts.map +1 -1
  10. package/lib/CloudResourceManager/Project.d.ts +1 -1
  11. package/lib/CloudResourceManager/ProjectIamMember.d.ts.map +1 -1
  12. package/lib/Compute/Address.d.ts +1 -1
  13. package/lib/Compute/Firewall.d.ts +1 -1
  14. package/lib/Compute/ForwardingRule.d.ts +1 -1
  15. package/lib/Compute/GlobalAddress.d.ts +1 -1
  16. package/lib/Compute/Network.d.ts +1 -1
  17. package/lib/Compute/Network.d.ts.map +1 -1
  18. package/lib/Compute/Operations.d.ts +4 -4
  19. package/lib/Compute/Operations.d.ts.map +1 -1
  20. package/lib/Compute/Subnetwork.d.ts +1 -1
  21. package/lib/Compute/SubnetworkIamMember.d.ts.map +1 -1
  22. package/lib/Container/Cluster.d.ts +1 -1
  23. package/lib/Container/NodePool.d.ts +1 -1
  24. package/lib/Container/NodePool.d.ts.map +1 -1
  25. package/lib/Container/Operations.d.ts +2 -2
  26. package/lib/Container/Operations.d.ts.map +1 -1
  27. package/lib/Iam/ServiceAccount.d.ts +1 -1
  28. package/lib/Iam/ServiceAccountIamMember.d.ts.map +1 -1
  29. package/lib/Iam/ServiceAccountKey.js +1 -1
  30. package/lib/Iam/ServiceAccountKey.js.map +1 -1
  31. package/lib/Kubernetes/Helm.d.ts +132 -0
  32. package/lib/Kubernetes/Helm.d.ts.map +1 -0
  33. package/lib/Kubernetes/Helm.js +314 -0
  34. package/lib/Kubernetes/Helm.js.map +1 -0
  35. package/lib/Kubernetes/KubernetesManifest.d.ts +1 -1
  36. package/lib/Kubernetes/Secret.d.ts +1 -1
  37. package/lib/Kubernetes/client.d.ts.map +1 -1
  38. package/lib/Kubernetes/connection.d.ts.map +1 -1
  39. package/lib/Kubernetes/index.d.ts +1 -0
  40. package/lib/Kubernetes/index.d.ts.map +1 -1
  41. package/lib/Kubernetes/index.js +1 -0
  42. package/lib/Kubernetes/index.js.map +1 -1
  43. package/lib/ManagedLustre/Instance.d.ts +1 -1
  44. package/lib/Providers.d.ts +1 -1
  45. package/lib/Providers.d.ts.map +1 -1
  46. package/lib/Providers.js +5 -1
  47. package/lib/Providers.js.map +1 -1
  48. package/lib/Run/IamMember.d.ts.map +1 -1
  49. package/lib/Run/IamSync.d.ts.map +1 -1
  50. package/lib/Run/Job.d.ts +1 -1
  51. package/lib/Run/Operations.d.ts +2 -2
  52. package/lib/Run/Operations.d.ts.map +1 -1
  53. package/lib/Run/Service.d.ts +1 -1
  54. package/lib/Run/Validation.d.ts.map +1 -1
  55. package/lib/Sqladmin/Instance.d.ts +1 -1
  56. package/lib/Sqladmin/Operations.d.ts +2 -2
  57. package/lib/Sqladmin/Operations.d.ts.map +1 -1
  58. package/lib/Sqladmin/Types.d.ts.map +1 -1
  59. package/lib/Sqladmin/Validation.d.ts.map +1 -1
  60. package/lib/Storage/Bucket.d.ts +1 -1
  61. package/lib/Storage/BucketIamMember.d.ts.map +1 -1
  62. package/lib/Storage/StorageBucketIamMember.d.ts +66 -0
  63. package/lib/Storage/StorageBucketIamMember.d.ts.map +1 -0
  64. package/lib/Storage/StorageBucketIamMember.js +130 -0
  65. package/lib/Storage/StorageBucketIamMember.js.map +1 -0
  66. package/lib/Storage/index.d.ts +2 -0
  67. package/lib/Storage/index.d.ts.map +1 -1
  68. package/lib/Storage/index.js +1 -0
  69. package/lib/Storage/index.js.map +1 -1
  70. package/lib/Tags.d.ts.map +1 -1
  71. package/package.json +3 -3
  72. package/src/Iam/ServiceAccountKey.ts +1 -1
  73. package/src/Kubernetes/Helm.ts +536 -0
  74. package/src/Kubernetes/index.ts +1 -0
  75. package/src/Providers.ts +12 -0
  76. package/src/Storage/StorageBucketIamMember.ts +244 -0
  77. package/src/Storage/index.ts +8 -0
@@ -0,0 +1,66 @@
1
+ import { Resource } from "alchemy";
2
+ import * as Provider from "alchemy/Provider";
3
+ import type * as GCP from "../Providers.ts";
4
+ /**
5
+ * A single `(role, member)` IAM binding entry on an **existing** GCS
6
+ * bucket that this stack does not manage. Contrast with
7
+ * {@link storageBucketIamMember}, the target-side binding helper: that
8
+ * one requires a stack-owned {@link StorageBucket} and is additive-only
9
+ * (bindings written into the bucket's binding bag are merged on
10
+ * reconcile but never pruned). This standalone resource takes the raw
11
+ * bucket name, adds the member on reconcile, and — the part the helper
12
+ * cannot do — **removes it again on delete**, so grants revoke when the
13
+ * declaring resource leaves the stack.
14
+ *
15
+ * Identity is the `(bucket, role, member)` triple; all three are
16
+ * immutable — changing any replaces (the old triple is revoked, the new
17
+ * one granted).
18
+ *
19
+ * The read-modify-write on the shared bucket policy is member-scoped:
20
+ * exactly one member is added/removed, every foreign role and member is
21
+ * preserved verbatim, and the whole cycle retries with backoff so
22
+ * concurrent writers on the same bucket compose safely (GCS rejects a
23
+ * stale-etag set with `Conflict`/`PreconditionFailed`).
24
+ *
25
+ * There is nothing GCP-side to carry alchemy ownership labels on an IAM
26
+ * binding, so `read` has no `Unowned` adoption gate — presence of the
27
+ * exact member under the exact role IS the resource.
28
+ *
29
+ * @section Granting on an unmanaged bucket
30
+ * @example Read access for a collaborator group's namespace identity
31
+ * ```typescript
32
+ * yield* GCP.StorageBucketIamMember("SrlPackagingRead", {
33
+ * bucket: "srl_200hr_packaging",
34
+ * role: "roles/storage.objectViewer",
35
+ * member:
36
+ * "principal://iam.googleapis.com/projects/864268824536/locations/global/workloadIdentityPools/micro-research-cluster-a.svc.id.goog/subject/ns/collab-srl/sa/default",
37
+ * });
38
+ * ```
39
+ */
40
+ export type StorageBucketIamMemberProps = {
41
+ /**
42
+ * Name of the (pre-existing) GCS bucket to grant on. The bucket is
43
+ * NOT created, adopted, or deleted by this resource. Immutable —
44
+ * replace.
45
+ */
46
+ bucket: string;
47
+ /** IAM role, e.g. `roles/storage.objectViewer`. Immutable — replace. */
48
+ role: string;
49
+ /**
50
+ * IAM member string (`serviceAccount:…`, `principal://…`,
51
+ * `group:…`, …). Immutable — replace.
52
+ */
53
+ member: string;
54
+ };
55
+ export type StorageBucketIamMemberAttributes = {
56
+ /** Bucket name, threaded through from props. */
57
+ bucket: string;
58
+ /** IAM role, threaded through from props. */
59
+ role: string;
60
+ /** IAM member, threaded through from props. */
61
+ member: string;
62
+ };
63
+ export type StorageBucketIamMember = Resource<"GCP.StorageBucketIamMember", StorageBucketIamMemberProps, StorageBucketIamMemberAttributes, never, GCP.Providers>;
64
+ export declare const StorageBucketIamMember: import("alchemy").ResourceClass<StorageBucketIamMember>;
65
+ export declare const StorageBucketIamMemberProvider: () => import("effect/Layer").Layer<Provider.Provider<StorageBucketIamMember>, never, import("@distilled.cloud/gcp").Credentials | import("effect/unstable/http/HttpClient").HttpClient>;
66
+ //# sourceMappingURL=StorageBucketIamMember.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageBucketIamMember.d.ts","sourceRoot":"","sources":["../../src/Storage/StorageBucketIamMember.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAC3C,4BAA4B,EAC5B,2BAA2B,EAC3B,gCAAgC,EAChC,KAAK,EACL,GAAG,CAAC,SAAS,CACd,CAAC;AAEF,eAAO,MAAM,sBAAsB,yDAElC,CAAC;AAEF,eAAO,MAAM,8BAA8B,yLAgKxC,CAAC"}
@@ -0,0 +1,130 @@
1
+ import { ConfigError } from "@distilled.cloud/gcp";
2
+ import * as storage from "@distilled.cloud/gcp/storage-v1";
3
+ import { Resource } from "alchemy";
4
+ import { isResolved } from "alchemy/Diff";
5
+ import * as Provider from "alchemy/Provider";
6
+ import * as Duration from "effect/Duration";
7
+ import * as Effect from "effect/Effect";
8
+ import * as Schedule from "effect/Schedule";
9
+ export const StorageBucketIamMember = Resource("GCP.StorageBucketIamMember");
10
+ export const StorageBucketIamMemberProvider = () => Provider.effect(StorageBucketIamMember, Effect.gen(function* () {
11
+ const getIamPolicyBuckets = yield* storage.getIamPolicyBuckets;
12
+ const setIamPolicyBuckets = yield* storage.setIamPolicyBuckets;
13
+ // Same backoff as StorageBucket's syncIam: the get→set cycle races
14
+ // other writers on the bucket policy (including sibling instances
15
+ // of this resource); a stale etag fails the set, the retry re-reads.
16
+ // ConfigError (bucket doesn't exist) is a terminal misconfiguration
17
+ // — fail fast instead of burning the ~8-minute backoff on it.
18
+ const etagRetry = (eff) => eff.pipe(Effect.retry({
19
+ while: (e) => e?._tag !== "ConfigError",
20
+ schedule: Schedule.exponential(Duration.seconds(2)).pipe(Schedule.both(Schedule.recurs(8))),
21
+ }));
22
+ // Membership check scoped to the unconditional binding for `role`
23
+ // — conditional bindings are someone else's and never touched.
24
+ const hasMember = (policy, role, member) => (policy.bindings ?? []).some((b) => b.role === role && !b.condition && (b.members ?? []).includes(member));
25
+ return {
26
+ // Identity IS the triple; all three are static strings.
27
+ stables: ["bucket", "role", "member"],
28
+ diff: Effect.fn(function* ({ news, olds = {}, output }) {
29
+ if (!isResolved(news))
30
+ return undefined;
31
+ // Prior identity from persisted attributes first, then olds —
32
+ // mirrors Bucket.ts (`output?.name || olds.name`). `||`, not
33
+ // `??`: an empty string in a partially-persisted attribute is
34
+ // NOT a prior identity — treating it as one would force a
35
+ // spurious replace whose delete targets the wrong (empty)
36
+ // identity. If only `output` survives (e.g. props were lost),
37
+ // a changed triple must still replace, or the old member is
38
+ // never revoked.
39
+ const priorBucket = output?.bucket || olds.bucket;
40
+ const priorRole = output?.role || olds.role;
41
+ const priorMember = output?.member || olds.member;
42
+ if ((priorBucket && priorBucket !== news.bucket) ||
43
+ (priorRole && priorRole !== news.role) ||
44
+ (priorMember && priorMember !== news.member)) {
45
+ return { action: "replace" };
46
+ }
47
+ return undefined;
48
+ }),
49
+ reconcile: Effect.fn(function* ({ news }) {
50
+ yield* etagRetry(Effect.gen(function* () {
51
+ const current = yield* getIamPolicyBuckets({
52
+ bucket: news.bucket,
53
+ optionsRequestedPolicyVersion: 3,
54
+ }).pipe(Effect.catchTag("NotFound", () => Effect.fail(new ConfigError({
55
+ message: `Bucket ${news.bucket} does not exist — StorageBucketIamMember grants on pre-existing buckets only.`,
56
+ }))));
57
+ if (hasMember(current, news.role, news.member))
58
+ return;
59
+ const bindings = (current.bindings ?? []).map((b) => ({
60
+ ...b,
61
+ members: [...(b.members ?? [])],
62
+ }));
63
+ const existing = bindings.find((b) => b.role === news.role && !b.condition);
64
+ if (existing) {
65
+ existing.members = [...(existing.members ?? []), news.member];
66
+ }
67
+ else {
68
+ bindings.push({ role: news.role, members: [news.member] });
69
+ }
70
+ yield* setIamPolicyBuckets({
71
+ bucket: news.bucket,
72
+ body: { ...current, bindings, version: 3 },
73
+ });
74
+ }));
75
+ return { bucket: news.bucket, role: news.role, member: news.member };
76
+ }),
77
+ delete: Effect.fn(function* ({ output }) {
78
+ // Partially-persisted attributes (empty fields) name no real
79
+ // grant — nothing to revoke, and getIamPolicy("") would 4xx.
80
+ if (!output.bucket || !output.role || !output.member)
81
+ return;
82
+ yield* etagRetry(Effect.gen(function* () {
83
+ const current = yield* getIamPolicyBuckets({
84
+ bucket: output.bucket,
85
+ optionsRequestedPolicyVersion: 3,
86
+ }).pipe(
87
+ // Bucket gone (or unreadable because gone) — the grant
88
+ // went with it; idempotent success.
89
+ Effect.catchTag("NotFound", () => Effect.succeed(undefined)));
90
+ if (!current || !hasMember(current, output.role, output.member)) {
91
+ return;
92
+ }
93
+ // Remove exactly our member from the unconditional binding;
94
+ // drop the binding entirely if that empties it (GCS rejects
95
+ // bindings with zero members).
96
+ const bindings = (current.bindings ?? [])
97
+ .map((b) => b.role === output.role && !b.condition
98
+ ? {
99
+ ...b,
100
+ members: (b.members ?? []).filter((m) => m !== output.member),
101
+ }
102
+ : { ...b, members: [...(b.members ?? [])] })
103
+ .filter((b) => (b.members?.length ?? 0) > 0);
104
+ yield* setIamPolicyBuckets({
105
+ bucket: output.bucket,
106
+ body: { ...current, bindings, version: 3 },
107
+ }).pipe(Effect.catchTag("NotFound", () => Effect.void));
108
+ }));
109
+ }),
110
+ read: Effect.fn(function* ({ output, olds }) {
111
+ const bucket = output?.bucket ?? olds?.bucket;
112
+ const role = output?.role ?? olds?.role;
113
+ const member = output?.member ?? olds?.member;
114
+ if (!bucket || !role || !member)
115
+ return undefined;
116
+ const current = yield* getIamPolicyBuckets({
117
+ bucket,
118
+ optionsRequestedPolicyVersion: 3,
119
+ }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
120
+ if (!current)
121
+ return undefined;
122
+ // Absent member → undefined: the engine treats that as drift
123
+ // and the next plan re-grants.
124
+ if (!hasMember(current, role, member))
125
+ return undefined;
126
+ return { bucket, role, member };
127
+ }),
128
+ };
129
+ }));
130
+ //# sourceMappingURL=StorageBucketIamMember.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageBucketIamMember.js","sourceRoot":"","sources":["../../src/Storage/StorageBucketIamMember.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  export { StorageBucket, StorageBucketProvider, } from "./Bucket.ts";
2
2
  export type { StorageBucketProps, StorageBucketIamBinding, StorageBucketBindingContract, } from "./Bucket.ts";
3
3
  export * from "./BucketIamMember.ts";
4
+ export { StorageBucketIamMember, StorageBucketIamMemberProvider, } from "./StorageBucketIamMember.ts";
5
+ export type { StorageBucketIamMemberProps, StorageBucketIamMemberAttributes, } from "./StorageBucketIamMember.ts";
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,2BAA2B,EAC3B,gCAAgC,GACjC,MAAM,6BAA6B,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { StorageBucket, StorageBucketProvider, } from "./Bucket.js";
2
2
  export * from "./BucketIamMember.js";
3
+ export { StorageBucketIamMember, StorageBucketIamMemberProvider, } from "./StorageBucketIamMember.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAMrB,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAMrB,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC"}
package/lib/Tags.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Tags.d.ts","sourceRoot":"","sources":["../src/Tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC;;;;;;;;;;;;;;GAcG;AAEH,QAAA,MAAM,aAAa,gBAAgB,CAAC;AACpC,QAAA,MAAM,eAAe,kBAAkB,CAAC;AACxC,QAAA,MAAM,YAAY,eAAe,CAAC;AAQlC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;wBAQ5B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,0GAW3B,CAAC;AAEH,OAAO,EACL,aAAa,IAAI,iBAAiB,EAClC,eAAe,IAAI,mBAAmB,EACtC,YAAY,IAAI,gBAAgB,GACjC,CAAC;AAsBF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,mGAQhC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,+FAStC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,gBAAiB,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SAI7E,CAAC"}
1
+ {"version":3,"file":"Tags.d.ts","sourceRoot":"","sources":["../src/Tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC;;;;;;;;;;;;;;GAcG;AAEH,QAAA,MAAM,aAAa,gBAAgB,CAAC;AACpC,QAAA,MAAM,eAAe,kBAAkB,CAAC;AACxC,QAAA,MAAM,YAAY,eAAe,CAAC;AAQlC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;wBAQ5B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,0GAW3B,CAAC;AAEH,OAAO,EACL,aAAa,IAAI,iBAAiB,EAClC,eAAe,IAAI,mBAAmB,EACtC,YAAY,IAAI,gBAAgB,GACjC,CAAC;AAsBF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,mGAQhC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,+FAStC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,aAAa,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SAI7E,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@microagi/alchemy-gcp",
3
- "version": "0.8.1",
4
- "description": "GCP provider for Alchemy v2 (Effect-based IaC). Resources for Project, ServiceAccount, Cluster, NodePool, Compute, ManagedLustre, ServiceUsage, ServiceNetworking, Cloud Run (Service + Job + IAM), Cloud SQL (Instance + Database + User with IAM database authn), Artifact Registry (Docker repositories, standard + remote pull-through caches), Kubernetes (typed Secret + generic SSA Manifest), with ADC-backed credentials and target-side IAM bindings.",
3
+ "version": "0.10.0",
4
+ "description": "GCP provider for Alchemy v2 (Effect-based IaC). Resources for Project, ServiceAccount, Cluster, NodePool, Compute, ManagedLustre, ServiceUsage, ServiceNetworking, Cloud Run (Service + Job + IAM), Cloud SQL (Instance + Database + User with IAM database authn), Artifact Registry (Docker repositories, standard + remote pull-through caches), Kubernetes (typed Secret + generic SSA Manifest + Helm release), with ADC-backed credentials and target-side IAM bindings.",
5
5
  "keywords": [
6
6
  "alchemy",
7
7
  "alchemy-effect",
@@ -43,7 +43,7 @@
43
43
  }
44
44
  },
45
45
  "scripts": {
46
- "build": "tsgo -p tsconfig.build.json",
46
+ "build": "tsc -p tsconfig.build.json",
47
47
  "clean": "rm -rf lib",
48
48
  "test": "CI=1 bun test",
49
49
  "test:watch": "CI=1 bun test --watch",
@@ -131,7 +131,7 @@ export const ServiceAccountKeyProvider = () =>
131
131
  ) {
132
132
  const page = yield* listProjectsServiceAccountsKeys({
133
133
  name: serviceAccount,
134
- keyTypes: "USER_MANAGED",
134
+ keyTypes: ["USER_MANAGED"],
135
135
  });
136
136
  const keys = page.keys ?? [];
137
137
  if (keys.length === 0) return undefined;