@microagi/alchemy-gcp 0.11.5 → 0.11.7

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 (180) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/lib/ArtifactRegistry/Operations.d.ts +2 -1
  3. package/lib/ArtifactRegistry/Operations.d.ts.map +1 -1
  4. package/lib/ArtifactRegistry/Operations.js +9 -2
  5. package/lib/ArtifactRegistry/Operations.js.map +1 -1
  6. package/lib/ArtifactRegistry/Repository.d.ts.map +1 -1
  7. package/lib/ArtifactRegistry/Repository.js +6 -1
  8. package/lib/ArtifactRegistry/Repository.js.map +1 -1
  9. package/lib/ArtifactRegistry/RepositoryIamMember.d.ts.map +1 -1
  10. package/lib/ArtifactRegistry/RepositoryIamMember.js +6 -1
  11. package/lib/ArtifactRegistry/RepositoryIamMember.js.map +1 -1
  12. package/lib/CloudResourceManager/Project.d.ts.map +1 -1
  13. package/lib/CloudResourceManager/Project.js +10 -2
  14. package/lib/CloudResourceManager/Project.js.map +1 -1
  15. package/lib/Compute/Address.d.ts +1 -1
  16. package/lib/Compute/Address.d.ts.map +1 -1
  17. package/lib/Compute/Address.js +5 -2
  18. package/lib/Compute/Address.js.map +1 -1
  19. package/lib/Compute/Firewall.d.ts +1 -1
  20. package/lib/Compute/Firewall.d.ts.map +1 -1
  21. package/lib/Compute/Firewall.js +5 -2
  22. package/lib/Compute/Firewall.js.map +1 -1
  23. package/lib/Compute/ForwardingRule.d.ts +1 -1
  24. package/lib/Compute/ForwardingRule.d.ts.map +1 -1
  25. package/lib/Compute/ForwardingRule.js +5 -2
  26. package/lib/Compute/ForwardingRule.js.map +1 -1
  27. package/lib/Compute/GlobalAddress.d.ts +1 -1
  28. package/lib/Compute/GlobalAddress.d.ts.map +1 -1
  29. package/lib/Compute/GlobalAddress.js +5 -2
  30. package/lib/Compute/GlobalAddress.js.map +1 -1
  31. package/lib/Compute/Network.d.ts +1 -1
  32. package/lib/Compute/Network.d.ts.map +1 -1
  33. package/lib/Compute/Network.js +5 -2
  34. package/lib/Compute/Network.js.map +1 -1
  35. package/lib/Compute/Operations.d.ts +7 -2
  36. package/lib/Compute/Operations.d.ts.map +1 -1
  37. package/lib/Compute/Operations.js +10 -5
  38. package/lib/Compute/Operations.js.map +1 -1
  39. package/lib/Compute/ProjectDefaultNetworkTier.d.ts +1 -1
  40. package/lib/Compute/ProjectDefaultNetworkTier.d.ts.map +1 -1
  41. package/lib/Compute/ProjectDefaultNetworkTier.js +2 -0
  42. package/lib/Compute/ProjectDefaultNetworkTier.js.map +1 -1
  43. package/lib/Compute/SharedVpcHost.d.ts +1 -1
  44. package/lib/Compute/SharedVpcHost.d.ts.map +1 -1
  45. package/lib/Compute/SharedVpcHost.js +7 -2
  46. package/lib/Compute/SharedVpcHost.js.map +1 -1
  47. package/lib/Compute/SharedVpcServiceProject.d.ts +1 -1
  48. package/lib/Compute/SharedVpcServiceProject.d.ts.map +1 -1
  49. package/lib/Compute/SharedVpcServiceProject.js +5 -2
  50. package/lib/Compute/SharedVpcServiceProject.js.map +1 -1
  51. package/lib/Compute/Subnetwork.d.ts +1 -1
  52. package/lib/Compute/Subnetwork.d.ts.map +1 -1
  53. package/lib/Compute/Subnetwork.js +9 -3
  54. package/lib/Compute/Subnetwork.js.map +1 -1
  55. package/lib/Container/Cluster.d.ts.map +1 -1
  56. package/lib/Container/Cluster.js +6 -2
  57. package/lib/Container/Cluster.js.map +1 -1
  58. package/lib/Container/NodePool.d.ts.map +1 -1
  59. package/lib/Container/NodePool.js +2 -0
  60. package/lib/Container/NodePool.js.map +1 -1
  61. package/lib/Container/Operations.d.ts +2 -2
  62. package/lib/Container/Operations.d.ts.map +1 -1
  63. package/lib/Container/Operations.js +9 -3
  64. package/lib/Container/Operations.js.map +1 -1
  65. package/lib/Iam/Operations.d.ts +42 -0
  66. package/lib/Iam/Operations.d.ts.map +1 -0
  67. package/lib/Iam/Operations.js +48 -0
  68. package/lib/Iam/Operations.js.map +1 -0
  69. package/lib/Iam/ServiceAccount.d.ts.map +1 -1
  70. package/lib/Iam/ServiceAccount.js +6 -1
  71. package/lib/Iam/ServiceAccount.js.map +1 -1
  72. package/lib/Iam/ServiceAccountKey.d.ts.map +1 -1
  73. package/lib/Iam/ServiceAccountKey.js +2 -0
  74. package/lib/Iam/ServiceAccountKey.js.map +1 -1
  75. package/lib/Iam/WorkloadIdentityPool.d.ts +100 -0
  76. package/lib/Iam/WorkloadIdentityPool.d.ts.map +1 -0
  77. package/lib/Iam/WorkloadIdentityPool.js +175 -0
  78. package/lib/Iam/WorkloadIdentityPool.js.map +1 -0
  79. package/lib/Iam/WorkloadIdentityPoolProvider.d.ts +124 -0
  80. package/lib/Iam/WorkloadIdentityPoolProvider.d.ts.map +1 -0
  81. package/lib/Iam/WorkloadIdentityPoolProvider.js +222 -0
  82. package/lib/Iam/WorkloadIdentityPoolProvider.js.map +1 -0
  83. package/lib/Iam/index.d.ts +4 -0
  84. package/lib/Iam/index.d.ts.map +1 -1
  85. package/lib/Iam/index.js +2 -0
  86. package/lib/Iam/index.js.map +1 -1
  87. package/lib/Kubernetes/Helm.d.ts.map +1 -1
  88. package/lib/Kubernetes/Helm.js +2 -0
  89. package/lib/Kubernetes/Helm.js.map +1 -1
  90. package/lib/Kubernetes/KubernetesManifest.d.ts.map +1 -1
  91. package/lib/Kubernetes/KubernetesManifest.js +2 -0
  92. package/lib/Kubernetes/KubernetesManifest.js.map +1 -1
  93. package/lib/Kubernetes/Secret.d.ts.map +1 -1
  94. package/lib/Kubernetes/Secret.js +2 -0
  95. package/lib/Kubernetes/Secret.js.map +1 -1
  96. package/lib/ManagedLustre/Instance.d.ts.map +1 -1
  97. package/lib/ManagedLustre/Instance.js +11 -4
  98. package/lib/ManagedLustre/Instance.js.map +1 -1
  99. package/lib/Providers.d.ts +1 -1
  100. package/lib/Providers.d.ts.map +1 -1
  101. package/lib/Providers.js +5 -1
  102. package/lib/Providers.js.map +1 -1
  103. package/lib/Run/IamSync.d.ts.map +1 -1
  104. package/lib/Run/IamSync.js +4 -1
  105. package/lib/Run/IamSync.js.map +1 -1
  106. package/lib/Run/Job.d.ts.map +1 -1
  107. package/lib/Run/Job.js +6 -1
  108. package/lib/Run/Job.js.map +1 -1
  109. package/lib/Run/Operations.d.ts +2 -2
  110. package/lib/Run/Operations.d.ts.map +1 -1
  111. package/lib/Run/Operations.js +9 -3
  112. package/lib/Run/Operations.js.map +1 -1
  113. package/lib/Run/Service.d.ts.map +1 -1
  114. package/lib/Run/Service.js +6 -1
  115. package/lib/Run/Service.js.map +1 -1
  116. package/lib/ServiceNetworking/PsaConnection.d.ts.map +1 -1
  117. package/lib/ServiceNetworking/PsaConnection.js +11 -4
  118. package/lib/ServiceNetworking/PsaConnection.js.map +1 -1
  119. package/lib/ServiceUsage/ApiEnable.d.ts.map +1 -1
  120. package/lib/ServiceUsage/ApiEnable.js +9 -1
  121. package/lib/ServiceUsage/ApiEnable.js.map +1 -1
  122. package/lib/Sqladmin/Database.d.ts.map +1 -1
  123. package/lib/Sqladmin/Database.js +2 -0
  124. package/lib/Sqladmin/Database.js.map +1 -1
  125. package/lib/Sqladmin/Instance.d.ts.map +1 -1
  126. package/lib/Sqladmin/Instance.js +6 -1
  127. package/lib/Sqladmin/Instance.js.map +1 -1
  128. package/lib/Sqladmin/Operations.d.ts.map +1 -1
  129. package/lib/Sqladmin/Operations.js +7 -1
  130. package/lib/Sqladmin/Operations.js.map +1 -1
  131. package/lib/Sqladmin/User.d.ts.map +1 -1
  132. package/lib/Sqladmin/User.js +2 -0
  133. package/lib/Sqladmin/User.js.map +1 -1
  134. package/lib/Storage/Bucket.d.ts.map +1 -1
  135. package/lib/Storage/Bucket.js +6 -1
  136. package/lib/Storage/Bucket.js.map +1 -1
  137. package/lib/Storage/StorageBucketIamMember.d.ts.map +1 -1
  138. package/lib/Storage/StorageBucketIamMember.js +6 -1
  139. package/lib/Storage/StorageBucketIamMember.js.map +1 -1
  140. package/package.json +7 -7
  141. package/src/ArtifactRegistry/Operations.ts +10 -5
  142. package/src/ArtifactRegistry/Repository.ts +7 -3
  143. package/src/ArtifactRegistry/RepositoryIamMember.ts +6 -3
  144. package/src/CloudResourceManager/Project.ts +11 -6
  145. package/src/Compute/Address.ts +5 -1
  146. package/src/Compute/Firewall.ts +5 -1
  147. package/src/Compute/ForwardingRule.ts +5 -1
  148. package/src/Compute/GlobalAddress.ts +5 -1
  149. package/src/Compute/Network.ts +5 -1
  150. package/src/Compute/Operations.ts +8 -4
  151. package/src/Compute/ProjectDefaultNetworkTier.ts +2 -0
  152. package/src/Compute/SharedVpcHost.ts +7 -1
  153. package/src/Compute/SharedVpcServiceProject.ts +5 -1
  154. package/src/Compute/Subnetwork.ts +9 -4
  155. package/src/Container/Cluster.ts +7 -3
  156. package/src/Container/NodePool.ts +2 -0
  157. package/src/Container/Operations.ts +10 -6
  158. package/src/Iam/Operations.ts +81 -0
  159. package/src/Iam/ServiceAccount.ts +6 -3
  160. package/src/Iam/ServiceAccountKey.ts +2 -0
  161. package/src/Iam/WorkloadIdentityPool.ts +309 -0
  162. package/src/Iam/WorkloadIdentityPoolProvider.ts +425 -0
  163. package/src/Iam/index.ts +10 -0
  164. package/src/Kubernetes/Helm.ts +2 -0
  165. package/src/Kubernetes/KubernetesManifest.ts +2 -0
  166. package/src/Kubernetes/Secret.ts +2 -0
  167. package/src/ManagedLustre/Instance.ts +10 -4
  168. package/src/Providers.ts +12 -0
  169. package/src/Run/IamSync.ts +4 -3
  170. package/src/Run/Job.ts +7 -3
  171. package/src/Run/Operations.ts +10 -6
  172. package/src/Run/Service.ts +7 -3
  173. package/src/ServiceNetworking/PsaConnection.ts +10 -4
  174. package/src/ServiceUsage/ApiEnable.ts +10 -4
  175. package/src/Sqladmin/Database.ts +2 -0
  176. package/src/Sqladmin/Instance.ts +7 -3
  177. package/src/Sqladmin/Operations.ts +8 -4
  178. package/src/Sqladmin/User.ts +2 -0
  179. package/src/Storage/Bucket.ts +6 -3
  180. package/src/Storage/StorageBucketIamMember.ts +6 -3
@@ -0,0 +1,175 @@
1
+ import { ConfigError } from "@distilled.cloud/gcp";
2
+ import * as iam from "@distilled.cloud/gcp/unstable/iam-v1";
3
+ import { Resource } from "alchemy";
4
+ import { Unowned } from "alchemy/AdoptPolicy";
5
+ import { isResolved } from "alchemy/Diff";
6
+ import * as Provider from "alchemy/Provider";
7
+ import * as Effect from "effect/Effect";
8
+ import { descriptionHasAlchemyMarker, gcpAlchemyDescription, stripAlchemyMarker, } from "../Tags.js";
9
+ import { makeAwaitOperation } from "./Operations.js";
10
+ export const WorkloadIdentityPool = Resource("GCP.WorkloadIdentityPool");
11
+ /**
12
+ * Treat absent and empty-string as the same value.
13
+ *
14
+ * The patch below uses a FIXED `updateMask` while the body omits unset
15
+ * optional fields — deliberately, since under a field mask an omitted field
16
+ * means "clear it". The hazard is the comparison: if GCP echoes a cleared
17
+ * field back as `""` rather than omitting it, a raw `!==` against `undefined`
18
+ * would report drift on every deploy and churn a patch LRO forever.
19
+ */
20
+ const sameText = (a, b) => (a ?? "") === (b ?? "");
21
+ /** `projects/{project}/locations/global` — the only supported location. */
22
+ export const poolParent = (project) => `projects/${project}/locations/global`;
23
+ export const poolResourceName = (project, poolId) => `${poolParent(project)}/workloadIdentityPools/${poolId}`;
24
+ /**
25
+ * Alchemy provider factory for {@link WorkloadIdentityPool}.
26
+ *
27
+ * Deliberately NOT named `WorkloadIdentityPoolProvider`, which the repo's
28
+ * `X` + `XProvider` convention would suggest: GCP already uses that exact
29
+ * term for a different, user-facing resource — the OIDC provider inside a
30
+ * pool ({@link import("./WorkloadIdentityPoolProvider.ts").WorkloadIdentityPoolProvider}).
31
+ * The resource keeps GCP's name; this internal factory takes the awkward one.
32
+ */
33
+ export const WorkloadIdentityPoolResourceProvider = () => Provider.effect(WorkloadIdentityPool, Effect.gen(function* () {
34
+ const getPool = yield* iam.getProjectsLocationsWorkloadIdentityPools;
35
+ const createPool = yield* iam.createProjectsLocationsWorkloadIdentityPools;
36
+ const patchPool = yield* iam.patchProjectsLocationsWorkloadIdentityPools;
37
+ const deletePool = yield* iam.deleteProjectsLocationsWorkloadIdentityPools;
38
+ const undeletePool = yield* iam.undeleteProjectsLocationsWorkloadIdentityPools;
39
+ const getOperations = yield* iam.getProjectsLocationsWorkloadIdentityPoolsOperations;
40
+ const awaitOperation = makeAwaitOperation(getOperations, "Workload Identity pool");
41
+ // Absent and invisible collapse to the same thing, matching the
42
+ // ServiceAccount observer: a 403 on a resource we are about to create
43
+ // is indistinguishable from a 404 without extra permissions we may not
44
+ // have.
45
+ const observePool = (project, poolId) => getPool({ name: poolResourceName(project, poolId) }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
46
+ const toAttrs = (project, poolId, pool) => ({
47
+ name: pool.name ?? poolResourceName(project, poolId),
48
+ project,
49
+ poolId,
50
+ displayName: pool.displayName,
51
+ description: stripAlchemyMarker(pool.description),
52
+ state: pool.state,
53
+ disabled: pool.disabled,
54
+ });
55
+ return {
56
+ stables: ["name", "project", "poolId"],
57
+ diff: Effect.fn(function* ({ olds = {}, news, output }) {
58
+ if (!isResolved(news))
59
+ return undefined;
60
+ const oldProps = olds;
61
+ // Prefer live attributes over persisted props, and fall back to the
62
+ // DESIRED value when neither is known — mirroring Project.ts.
63
+ //
64
+ // Defaulting to `undefined` instead would make an adoption (output
65
+ // present, olds absent) compare `undefined !== news.project` and
66
+ // return `replace`, deleting and recreating a live pool that was
67
+ // already correct. Both fields are part of the resource name, so a
68
+ // genuine change here really is a replacement; the point is only to
69
+ // avoid inventing one.
70
+ const currentProject = output?.project || oldProps.project || news.project;
71
+ const currentPoolId = output?.poolId || oldProps.poolId || news.poolId;
72
+ if (currentProject !== news.project || currentPoolId !== news.poolId) {
73
+ return { action: "replace" };
74
+ }
75
+ }),
76
+ read: Effect.fn(function* ({ id, olds, output }) {
77
+ const project = output?.project || olds?.project;
78
+ const poolId = output?.poolId || olds?.poolId;
79
+ if (!project || !poolId)
80
+ return undefined;
81
+ const pool = yield* observePool(project, poolId);
82
+ if (!pool)
83
+ return undefined;
84
+ const attrs = toAttrs(project, poolId, pool);
85
+ return (yield* descriptionHasAlchemyMarker(id, pool.description))
86
+ ? attrs
87
+ : Unowned(attrs);
88
+ }),
89
+ reconcile: Effect.fn(function* ({ id, news, session }) {
90
+ const { project, poolId } = news;
91
+ const description = yield* gcpAlchemyDescription(id, news.description);
92
+ // Body is TOTAL over the patch's updateMask below: every masked
93
+ // field is always present, with an explicit empty/default value
94
+ // when the prop is unset. Behaviourally identical to omitting them
95
+ // (a masked-but-absent field is cleared), but it states the intent
96
+ // in code rather than relying on that field-mask subtlety, so
97
+ // "clear displayName" cannot be misread as "leave it alone".
98
+ const body = {
99
+ displayName: news.displayName ?? "",
100
+ description,
101
+ disabled: news.disabled ?? false,
102
+ };
103
+ let pool = yield* observePool(project, poolId);
104
+ // A soft-deleted pool holds its ID for ~30 days. Undelete rather
105
+ // than fail: otherwise destroy-then-redeploy is stuck until the
106
+ // purge, with no way out but renaming the pool.
107
+ if (pool?.state === "DELETED") {
108
+ yield* session.note(`Undeleting soft-deleted Workload Identity pool ${poolId}…`);
109
+ const op = yield* undeletePool({
110
+ name: poolResourceName(project, poolId),
111
+ body: {},
112
+ });
113
+ if (op.name)
114
+ yield* awaitOperation(op.name, session);
115
+ pool = yield* observePool(project, poolId);
116
+ }
117
+ if (!pool) {
118
+ const op = yield* createPool({
119
+ parent: poolParent(project),
120
+ workloadIdentityPoolId: poolId,
121
+ body,
122
+ });
123
+ if (op.name)
124
+ yield* awaitOperation(op.name, session);
125
+ pool = yield* observePool(project, poolId);
126
+ if (!pool) {
127
+ return yield* new ConfigError({
128
+ message: `Workload Identity pool ${poolId} in project ${project} was not readable after create.`,
129
+ });
130
+ }
131
+ }
132
+ else {
133
+ // Only the mutable fields, and only when they actually differ —
134
+ // an unconditional patch would churn an LRO on every deploy.
135
+ const needsPatch = !sameText(pool.displayName, news.displayName) ||
136
+ !sameText(pool.description, description) ||
137
+ (pool.disabled ?? false) !== (news.disabled ?? false);
138
+ if (needsPatch) {
139
+ const op = yield* patchPool({
140
+ name: poolResourceName(project, poolId),
141
+ updateMask: "displayName,description,disabled",
142
+ body,
143
+ });
144
+ if (op.name)
145
+ yield* awaitOperation(op.name, session);
146
+ pool = (yield* observePool(project, poolId)) ?? pool;
147
+ }
148
+ }
149
+ yield* session.note(poolResourceName(project, poolId));
150
+ return toAttrs(project, poolId, pool);
151
+ }),
152
+ delete: Effect.fn(function* ({ olds, output, session }) {
153
+ // Fall back to props when attributes are incomplete. A create whose
154
+ // LRO succeeded but whose follow-up read failed leaves state with
155
+ // props and no usable attributes; a no-op destroy would then LEAK
156
+ // the pool — and because deletion is soft, the leaked pool holds
157
+ // its ID for ~30 days, blocking a re-deploy under the same name.
158
+ // `||` not `??`: an empty string is never a valid identity here,
159
+ // and a persisted `""` must fall through to the next source rather
160
+ // than be taken as real. With `??` a corrupt/partial state entry
161
+ // would short-circuit the fallback and turn destroy into a silent
162
+ // no-op (or make diff replace a live resource).
163
+ const project = output?.project || olds?.project;
164
+ const poolId = output?.poolId || olds?.poolId;
165
+ if (!project || !poolId)
166
+ return;
167
+ const op = yield* deletePool({
168
+ name: poolResourceName(project, poolId),
169
+ }).pipe(Effect.catchTag("NotFound", () => Effect.succeed({ name: undefined })));
170
+ if (op.name)
171
+ yield* awaitOperation(op.name, session);
172
+ }),
173
+ };
174
+ }));
175
+ //# sourceMappingURL=WorkloadIdentityPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkloadIdentityPool.js","sourceRoot":"","sources":["../../src/Iam/WorkloadIdentityPool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { Resource } from "alchemy";
2
+ import * as Provider from "alchemy/Provider";
3
+ import type * as GCP from "../Providers.ts";
4
+ /**
5
+ * An OIDC **provider** inside a
6
+ * {@link import("./WorkloadIdentityPool.ts").WorkloadIdentityPool} — the
7
+ * thing that actually declares "I trust tokens issued by this URL".
8
+ *
9
+ * The canonical use is keyless federation from another cloud: point
10
+ * `oidc.issuerUri` at an EKS/AKS/GKE cluster's OIDC issuer, and pods holding
11
+ * a projected ServiceAccount token can impersonate a GSA with no key material
12
+ * anywhere in the system.
13
+ *
14
+ * ### `attributeMapping` is required and `google.subject` is mandatory
15
+ *
16
+ * The mapping turns claims on the incoming token into Google attributes. At
17
+ * minimum `google.subject` must be mapped; it is what `principal://` members
18
+ * match on. For a Kubernetes issuer the subject claim is
19
+ * `system:serviceaccount:{namespace}:{name}`, so:
20
+ *
21
+ * ```typescript
22
+ * attributeMapping: { "google.subject": "assertion.sub" }
23
+ * ```
24
+ *
25
+ * ### Set `allowedAudiences`, or the default is surprising
26
+ *
27
+ * When `oidc.allowedAudiences` is empty, GCP accepts only the *default*
28
+ * audience — the full provider resource name prefixed with
29
+ * `https://iam.googleapis.com/`. A Kubernetes projected token minted for
30
+ * audience `sts.googleapis.com` (or anything else) is then rejected with a
31
+ * generic audience error. Set this explicitly to whatever audience the
32
+ * token is actually minted for.
33
+ *
34
+ * ### Constrain trust with `attributeCondition`
35
+ *
36
+ * An issuer-only trust accepts **every** identity that issuer can mint — on
37
+ * a Kubernetes cluster, that is every ServiceAccount in every namespace. Pair
38
+ * the provider with an `attributeCondition` (and a narrow `principal://`
39
+ * member on the GSA binding) so a token from an unrelated namespace cannot
40
+ * impersonate anything.
41
+ *
42
+ * @section Creating a WorkloadIdentityPoolProvider
43
+ * @example Trust one Kubernetes ServiceAccount on an EKS cluster
44
+ * ```typescript
45
+ * const provider = yield* GCP.WorkloadIdentityPoolProvider("EksOidc", {
46
+ * project: "123456789",
47
+ * poolId: pool.poolId,
48
+ * providerId: "eks-oidc",
49
+ * oidc: {
50
+ * issuerUri: "https://oidc.eks.us-east-1.amazonaws.com/id/ABC123",
51
+ * allowedAudiences: ["sts.googleapis.com"],
52
+ * },
53
+ * attributeMapping: { "google.subject": "assertion.sub" },
54
+ * attributeCondition:
55
+ * "assertion.sub == 'system:serviceaccount:admin:eks-auth-reconciler'",
56
+ * });
57
+ * ```
58
+ */
59
+ export type WorkloadIdentityPoolProviderProps = {
60
+ /** Project that owns the pool. Prefer the project **number**. */
61
+ project: string;
62
+ /** ID of the enclosing pool. */
63
+ poolId: string;
64
+ /**
65
+ * Provider ID, 4–32 characters of `[a-z0-9-]`. Immutable — changing it
66
+ * replaces the provider. The `gcp-` prefix is reserved by Google.
67
+ */
68
+ providerId: string;
69
+ /** The OIDC issuer this provider trusts. */
70
+ oidc: {
71
+ /** Issuer URL. Must be HTTPS and serve an OIDC discovery document. */
72
+ issuerUri: string;
73
+ /**
74
+ * Acceptable `aud` values. Leave unset only if the token is minted for
75
+ * the provider's default audience — see the note above.
76
+ */
77
+ allowedAudiences?: string[];
78
+ /**
79
+ * Inline JWKS, for issuers whose keys are not publicly reachable. When
80
+ * unset, GCP fetches `jwks_uri` from the issuer's discovery document,
81
+ * which requires the issuer to be reachable from Google's network.
82
+ */
83
+ jwksJson?: string;
84
+ };
85
+ /**
86
+ * Claim-to-attribute mapping. Must include `google.subject`.
87
+ */
88
+ attributeMapping: Record<string, string>;
89
+ /** CEL expression further restricting which credentials are accepted. */
90
+ attributeCondition?: string;
91
+ /** Display name, max 32 characters. */
92
+ displayName?: string;
93
+ /** Description, max 256 characters. */
94
+ description?: string;
95
+ /** Disable the provider without deleting it. */
96
+ disabled?: boolean;
97
+ };
98
+ export type WorkloadIdentityPoolProviderAttributes = {
99
+ /** Full resource name, `…/workloadIdentityPools/{pool}/providers/{id}`. */
100
+ name: string;
101
+ project: string;
102
+ poolId: string;
103
+ providerId: string;
104
+ issuerUri: string | undefined;
105
+ allowedAudiences: readonly string[] | undefined;
106
+ attributeMapping: Record<string, string> | undefined;
107
+ attributeCondition: string | undefined;
108
+ displayName: string | undefined;
109
+ description: string | undefined;
110
+ state: string | undefined;
111
+ disabled: boolean | undefined;
112
+ /**
113
+ * The audience string to put in a credential configuration, i.e.
114
+ * `//iam.googleapis.com/{name}`. Provided because assembling it by hand is
115
+ * easy to get subtly wrong (the leading `//`, and no scheme).
116
+ */
117
+ audience: string;
118
+ };
119
+ export interface WorkloadIdentityPoolProvider extends Resource<"GCP.WorkloadIdentityPoolProvider", WorkloadIdentityPoolProviderProps, WorkloadIdentityPoolProviderAttributes, never, GCP.Providers> {
120
+ }
121
+ export declare const WorkloadIdentityPoolProvider: import("alchemy").ResourceClass<WorkloadIdentityPoolProvider>;
122
+ export declare const providerResourceName: (project: string, poolId: string, providerId: string) => string;
123
+ export declare const WorkloadIdentityPoolProviderProvider: () => import("effect/Layer").Layer<Provider.Provider<WorkloadIdentityPoolProvider>, never, import("@distilled.cloud/gcp").Credentials | import("effect/unstable/http/HttpClient").HttpClient | import("alchemy").Stack | import("alchemy").Stage>;
124
+ //# sourceMappingURL=WorkloadIdentityPoolProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkloadIdentityPoolProvider.d.ts","sourceRoot":"","sources":["../../src/Iam/WorkloadIdentityPoolProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAO7C,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAI5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,MAAM,MAAM,iCAAiC,GAAG;IAC9C,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,IAAI,EAAE;QACJ,sEAAsE;QACtE,SAAS,EAAE,MAAM,CAAC;QAClB;;;WAGG;QACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B;;;;WAIG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,sCAAsC,GAAG;IACnD,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAG9B,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAChD,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACrD,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,4BACf,SAAQ,QAAQ,CACd,kCAAkC,EAClC,iCAAiC,EACjC,sCAAsC,EACtC,KAAK,EACL,GAAG,CAAC,SAAS,CACd;CAAG;AAEN,eAAO,MAAM,4BAA4B,+DACmC,CAAC;AAE7E,eAAO,MAAM,oBAAoB,YACtB,MAAM,UACP,MAAM,cACF,MAAM,WAC+C,CAAC;AAgDpE,eAAO,MAAM,oCAAoC,mPAiO9C,CAAC"}
@@ -0,0 +1,222 @@
1
+ import { ConfigError } from "@distilled.cloud/gcp";
2
+ import * as iam from "@distilled.cloud/gcp/unstable/iam-v1";
3
+ import { Resource } from "alchemy";
4
+ import { Unowned } from "alchemy/AdoptPolicy";
5
+ import { isResolved } from "alchemy/Diff";
6
+ import * as Provider from "alchemy/Provider";
7
+ import * as Effect from "effect/Effect";
8
+ import { descriptionHasAlchemyMarker, gcpAlchemyDescription, stripAlchemyMarker, } from "../Tags.js";
9
+ import { makeAwaitOperation } from "./Operations.js";
10
+ import { poolResourceName } from "./WorkloadIdentityPool.js";
11
+ export const WorkloadIdentityPoolProvider = Resource("GCP.WorkloadIdentityPoolProvider");
12
+ export const providerResourceName = (project, poolId, providerId) => `${poolResourceName(project, poolId)}/providers/${providerId}`;
13
+ /**
14
+ * Compare two claim mappings by CONTENT, not serialisation.
15
+ *
16
+ * `JSON.stringify` preserves key insertion order, and the order GCP returns
17
+ * these keys in need not match the order they were sent in. A raw stringify
18
+ * comparison therefore reports drift for two identical mappings and fires a
19
+ * patch LRO on every single deploy.
20
+ */
21
+ const sameMapping = (a, b) => {
22
+ const entries = (r) => Object.entries(r ?? {}).sort(([x], [y]) => (x < y ? -1 : x > y ? 1 : 0));
23
+ return JSON.stringify(entries(a)) === JSON.stringify(entries(b));
24
+ };
25
+ /**
26
+ * Compare audience allow-lists as SETS.
27
+ *
28
+ * `allowedAudiences` is an allow-list: membership is what matters, order is
29
+ * not meaningful, and GCP is free to return it in any order. Comparing it
30
+ * positionally would make a reordering look like drift forever.
31
+ */
32
+ const sameAudiences = (a, b) => {
33
+ const sorted = (v) => [...(v ?? [])].sort();
34
+ return JSON.stringify(sorted(a)) === JSON.stringify(sorted(b));
35
+ };
36
+ /**
37
+ * Treat absent and empty-string as the same value.
38
+ *
39
+ * The patch below uses a FIXED `updateMask` while the request body omits
40
+ * unset optional fields — which is deliberate: under a field mask, an omitted
41
+ * field means "clear it", so dropping `displayName` from the props really
42
+ * should clear it on GCP. The hazard is only in the comparison afterwards. If
43
+ * GCP echoes a cleared field back as `""` rather than omitting it, a raw
44
+ * `!==` against `undefined` would report drift on every single deploy and
45
+ * churn a long-running patch operation forever.
46
+ */
47
+ const sameText = (a, b) => (a ?? "") === (b ?? "");
48
+ export const WorkloadIdentityPoolProviderProvider = () => Provider.effect(WorkloadIdentityPoolProvider, Effect.gen(function* () {
49
+ const getProvider = yield* iam.getProjectsLocationsWorkloadIdentityPoolsProviders;
50
+ const createProvider = yield* iam.createProjectsLocationsWorkloadIdentityPoolsProviders;
51
+ const patchProvider = yield* iam.patchProjectsLocationsWorkloadIdentityPoolsProviders;
52
+ const deleteProvider = yield* iam.deleteProjectsLocationsWorkloadIdentityPoolsProviders;
53
+ const undeleteProvider = yield* iam.undeleteProjectsLocationsWorkloadIdentityPoolsProviders;
54
+ const getOperations = yield* iam.getProjectsLocationsWorkloadIdentityPoolsProvidersOperations;
55
+ const awaitOperation = makeAwaitOperation(getOperations, "Workload Identity provider");
56
+ const observeProvider = (project, poolId, providerId) => getProvider({
57
+ name: providerResourceName(project, poolId, providerId),
58
+ }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
59
+ const toAttrs = (project, poolId, providerId, provider) => {
60
+ const name = provider.name ?? providerResourceName(project, poolId, providerId);
61
+ return {
62
+ name,
63
+ project,
64
+ poolId,
65
+ providerId,
66
+ issuerUri: provider.oidc?.issuerUri,
67
+ allowedAudiences: provider.oidc?.allowedAudiences,
68
+ attributeMapping: provider.attributeMapping,
69
+ attributeCondition: provider.attributeCondition,
70
+ displayName: provider.displayName,
71
+ description: stripAlchemyMarker(provider.description),
72
+ state: provider.state,
73
+ disabled: provider.disabled,
74
+ audience: `//iam.googleapis.com/${name}`,
75
+ };
76
+ };
77
+ return {
78
+ stables: ["name", "project", "poolId", "providerId", "audience"],
79
+ diff: Effect.fn(function* ({ olds = {}, news, output }) {
80
+ if (!isResolved(news))
81
+ return undefined;
82
+ const oldProps = olds;
83
+ // Prefer live attributes over persisted props, and fall back to the
84
+ // DESIRED value when neither is known — see the equivalent comment
85
+ // in WorkloadIdentityPool.ts. Defaulting to `undefined` would make
86
+ // an adoption replace a live, correct provider.
87
+ //
88
+ // All three fields are part of the resource name; the API cannot
89
+ // move a provider between pools or rename it.
90
+ const currentProject = output?.project || oldProps.project || news.project;
91
+ const currentPoolId = output?.poolId || oldProps.poolId || news.poolId;
92
+ const currentProviderId = output?.providerId || oldProps.providerId || news.providerId;
93
+ if (currentProject !== news.project ||
94
+ currentPoolId !== news.poolId ||
95
+ currentProviderId !== news.providerId) {
96
+ return { action: "replace" };
97
+ }
98
+ }),
99
+ read: Effect.fn(function* ({ id, olds, output }) {
100
+ const project = output?.project || olds?.project;
101
+ const poolId = output?.poolId || olds?.poolId;
102
+ const providerId = output?.providerId || olds?.providerId;
103
+ if (!project || !poolId || !providerId)
104
+ return undefined;
105
+ const provider = yield* observeProvider(project, poolId, providerId);
106
+ if (!provider)
107
+ return undefined;
108
+ const attrs = toAttrs(project, poolId, providerId, provider);
109
+ return (yield* descriptionHasAlchemyMarker(id, provider.description))
110
+ ? attrs
111
+ : Unowned(attrs);
112
+ }),
113
+ reconcile: Effect.fn(function* ({ id, news, session }) {
114
+ const { project, poolId, providerId } = news;
115
+ if (!news.attributeMapping["google.subject"]) {
116
+ // Caught here rather than at the API, which rejects it with a
117
+ // message that does not name the missing key.
118
+ return yield* new ConfigError({
119
+ message: `Workload Identity provider ${providerId} must map 'google.subject' in attributeMapping.`,
120
+ });
121
+ }
122
+ const description = yield* gcpAlchemyDescription(id, news.description);
123
+ // Scalars are TOTAL over the updateMask below — always present,
124
+ // explicit empty/default when unset — so clearing is stated in code
125
+ // rather than implied by field-mask semantics.
126
+ //
127
+ // `attributeCondition` and `oidc.jwksJson` are the exception and
128
+ // stay conditional: both are validated formats (a CEL expression
129
+ // and a JWKS document), and sending "" risks a parse rejection
130
+ // where omission is unambiguous. They are still cleared correctly
131
+ // when unset — `oidc` is masked as a whole message, so the body's
132
+ // `oidc` replaces it outright.
133
+ const body = {
134
+ displayName: news.displayName ?? "",
135
+ description,
136
+ disabled: news.disabled ?? false,
137
+ attributeMapping: news.attributeMapping,
138
+ ...(news.attributeCondition
139
+ ? { attributeCondition: news.attributeCondition }
140
+ : {}),
141
+ oidc: {
142
+ issuerUri: news.oidc.issuerUri,
143
+ allowedAudiences: news.oidc.allowedAudiences ?? [],
144
+ ...(news.oidc.jwksJson ? { jwksJson: news.oidc.jwksJson } : {}),
145
+ },
146
+ };
147
+ let provider = yield* observeProvider(project, poolId, providerId);
148
+ // Same soft-delete reasoning as the pool: the ID is held until the
149
+ // purge, so undelete rather than strand the deploy.
150
+ if (provider?.state === "DELETED") {
151
+ yield* session.note(`Undeleting soft-deleted Workload Identity provider ${providerId}…`);
152
+ const op = yield* undeleteProvider({
153
+ name: providerResourceName(project, poolId, providerId),
154
+ body: {},
155
+ });
156
+ if (op.name)
157
+ yield* awaitOperation(op.name, session);
158
+ provider = yield* observeProvider(project, poolId, providerId);
159
+ }
160
+ if (!provider) {
161
+ const op = yield* createProvider({
162
+ parent: poolResourceName(project, poolId),
163
+ workloadIdentityPoolProviderId: providerId,
164
+ body,
165
+ });
166
+ if (op.name)
167
+ yield* awaitOperation(op.name, session);
168
+ provider = yield* observeProvider(project, poolId, providerId);
169
+ if (!provider) {
170
+ return yield* new ConfigError({
171
+ message: `Workload Identity provider ${providerId} in pool ${poolId} was not readable after create.`,
172
+ });
173
+ }
174
+ }
175
+ else {
176
+ const needsPatch = !sameText(provider.displayName, news.displayName) ||
177
+ !sameText(provider.description, description) ||
178
+ (provider.disabled ?? false) !== (news.disabled ?? false) ||
179
+ !sameText(provider.attributeCondition, news.attributeCondition) ||
180
+ !sameMapping(provider.attributeMapping, news.attributeMapping) ||
181
+ !sameText(provider.oidc?.issuerUri, news.oidc.issuerUri) ||
182
+ !sameAudiences(provider.oidc?.allowedAudiences, news.oidc.allowedAudiences) ||
183
+ !sameText(provider.oidc?.jwksJson, news.oidc.jwksJson);
184
+ if (needsPatch) {
185
+ const op = yield* patchProvider({
186
+ name: providerResourceName(project, poolId, providerId),
187
+ updateMask: "displayName,description,disabled,attributeMapping,attributeCondition,oidc",
188
+ body,
189
+ });
190
+ if (op.name)
191
+ yield* awaitOperation(op.name, session);
192
+ provider =
193
+ (yield* observeProvider(project, poolId, providerId)) ??
194
+ provider;
195
+ }
196
+ }
197
+ yield* session.note(providerResourceName(project, poolId, providerId));
198
+ return toAttrs(project, poolId, providerId, provider);
199
+ }),
200
+ delete: Effect.fn(function* ({ olds, output, session }) {
201
+ // Props fallback for the same reason as the pool: incomplete
202
+ // attributes must not turn destroy into a silent no-op that leaks a
203
+ // soft-deleted-name-holding resource.
204
+ // `||` not `??`: an empty string is never a valid identity here,
205
+ // and a persisted `""` must fall through to the next source rather
206
+ // than be taken as real. With `??` a corrupt/partial state entry
207
+ // would short-circuit the fallback and turn destroy into a silent
208
+ // no-op (or make diff replace a live resource).
209
+ const project = output?.project || olds?.project;
210
+ const poolId = output?.poolId || olds?.poolId;
211
+ const providerId = output?.providerId || olds?.providerId;
212
+ if (!project || !poolId || !providerId)
213
+ return;
214
+ const op = yield* deleteProvider({
215
+ name: providerResourceName(project, poolId, providerId),
216
+ }).pipe(Effect.catchTag("NotFound", () => Effect.succeed({ name: undefined })));
217
+ if (op.name)
218
+ yield* awaitOperation(op.name, session);
219
+ }),
220
+ };
221
+ }));
222
+ //# sourceMappingURL=WorkloadIdentityPoolProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkloadIdentityPoolProvider.js","sourceRoot":"","sources":["../../src/Iam/WorkloadIdentityPoolProvider.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,8 @@ export type { ServiceAccountProps } from "./ServiceAccount.ts";
3
3
  export * from "./ServiceAccountIamMember.ts";
4
4
  export { ServiceAccountKey, ServiceAccountKeyProvider, } from "./ServiceAccountKey.ts";
5
5
  export type { ServiceAccountKeyProps } from "./ServiceAccountKey.ts";
6
+ export { WorkloadIdentityPool, WorkloadIdentityPoolResourceProvider, } from "./WorkloadIdentityPool.ts";
7
+ export type { WorkloadIdentityPoolProps } from "./WorkloadIdentityPool.ts";
8
+ export { WorkloadIdentityPoolProvider, WorkloadIdentityPoolProviderProvider, } from "./WorkloadIdentityPoolProvider.ts";
9
+ export type { WorkloadIdentityPoolProviderProps } from "./WorkloadIdentityPoolProvider.ts";
6
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Iam/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Iam/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EACL,oBAAoB,EACpB,oCAAoC,GACrC,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EACL,4BAA4B,EAC5B,oCAAoC,GACrC,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC"}
package/lib/Iam/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export { ServiceAccount, ServiceAccountProvider } from "./ServiceAccount.js";
2
2
  export * from "./ServiceAccountIamMember.js";
3
3
  export { ServiceAccountKey, ServiceAccountKeyProvider, } from "./ServiceAccountKey.js";
4
+ export { WorkloadIdentityPool, WorkloadIdentityPoolResourceProvider, } from "./WorkloadIdentityPool.js";
5
+ export { WorkloadIdentityPoolProvider, WorkloadIdentityPoolProviderProvider, } from "./WorkloadIdentityPoolProvider.js";
4
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Iam/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Iam/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,oBAAoB,EACpB,oCAAoC,GACrC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,4BAA4B,EAC5B,oCAAoC,GACrC,MAAM,mCAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Helm.d.ts","sourceRoot":"","sources":["../../src/Kubernetes/Helm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAIpC,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAG5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,yEAAyE;IACzE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,QAAQ,CAChC,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,EACL,GAAG,CAAC,SAAS,CACd,CAAC;AACF,eAAO,MAAM,WAAW,8CAEvB,CAAC;;;;AAEF,0CAA0C;AAC1C,qBAAa,SAAU,SAAQ,eAA8B;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;CAAG;AAsDL,eAAO,MAAM,mBAAmB,4PAiV7B,CAAC"}
1
+ {"version":3,"file":"Helm.d.ts","sourceRoot":"","sources":["../../src/Kubernetes/Helm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAIpC,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAG5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,yEAAyE;IACzE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,QAAQ,CAChC,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,EACL,GAAG,CAAC,SAAS,CACd,CAAC;AACF,eAAO,MAAM,WAAW,8CAEvB,CAAC;;;;AAEF,0CAA0C;AAC1C,qBAAa,SAAU,SAAQ,eAA8B;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;CAAG;AAsDL,eAAO,MAAM,mBAAmB,4PAmV7B,CAAC"}
@@ -137,6 +137,8 @@ export const HelmReleaseProvider = () => Provider.effect(HelmRelease, Effect.gen
137
137
  // Identity (name/namespace/chart) and endpoint are unchanged by an
138
138
  // in-place upgrade. revision increments on every upgrade — it is NOT
139
139
  // stable (an update must persist the new revision).
140
+ nuke: { skip: true },
141
+ list: () => Effect.succeed([]),
140
142
  stables: ["name", "namespace", "chart", "endpoint"],
141
143
  diff: Effect.fn(function* ({ news, olds = {} }) {
142
144
  if (!isResolved(news))