@alchemy.run/kubernetes 0.0.0 → 2.0.0-beta.85

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 (94) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +41 -4
  3. package/lib/BuiltinAdapters.d.ts +43 -0
  4. package/lib/BuiltinAdapters.d.ts.map +1 -0
  5. package/lib/BuiltinAdapters.js +129 -0
  6. package/lib/BuiltinAdapters.js.map +1 -0
  7. package/lib/Client.d.ts +97 -0
  8. package/lib/Client.d.ts.map +1 -0
  9. package/lib/Client.js +312 -0
  10. package/lib/Client.js.map +1 -0
  11. package/lib/ClusterAdapter.d.ts +324 -0
  12. package/lib/ClusterAdapter.d.ts.map +1 -0
  13. package/lib/ClusterAdapter.js +65 -0
  14. package/lib/ClusterAdapter.js.map +1 -0
  15. package/lib/Connection.d.ts +210 -0
  16. package/lib/Connection.d.ts.map +1 -0
  17. package/lib/Connection.js +58 -0
  18. package/lib/Connection.js.map +1 -0
  19. package/lib/Deployment.d.ts +401 -0
  20. package/lib/Deployment.d.ts.map +1 -0
  21. package/lib/Deployment.js +550 -0
  22. package/lib/Deployment.js.map +1 -0
  23. package/lib/HelmChart.d.ts +147 -0
  24. package/lib/HelmChart.d.ts.map +1 -0
  25. package/lib/HelmChart.js +248 -0
  26. package/lib/HelmChart.js.map +1 -0
  27. package/lib/Job.d.ts +333 -0
  28. package/lib/Job.d.ts.map +1 -0
  29. package/lib/Job.js +443 -0
  30. package/lib/Job.js.map +1 -0
  31. package/lib/LocalCluster.d.ts +243 -0
  32. package/lib/LocalCluster.d.ts.map +1 -0
  33. package/lib/LocalCluster.js +359 -0
  34. package/lib/LocalCluster.js.map +1 -0
  35. package/lib/Manifest.d.ts +157 -0
  36. package/lib/Manifest.d.ts.map +1 -0
  37. package/lib/Manifest.js +205 -0
  38. package/lib/Manifest.js.map +1 -0
  39. package/lib/Objects.d.ts +60 -0
  40. package/lib/Objects.d.ts.map +1 -0
  41. package/lib/Objects.js +132 -0
  42. package/lib/Objects.js.map +1 -0
  43. package/lib/Providers.d.ts +24 -0
  44. package/lib/Providers.d.ts.map +1 -0
  45. package/lib/Providers.js +36 -0
  46. package/lib/Providers.js.map +1 -0
  47. package/lib/index.d.ts +10 -0
  48. package/lib/index.d.ts.map +1 -0
  49. package/lib/index.js +10 -0
  50. package/lib/index.js.map +1 -0
  51. package/lib/internal/declared.d.ts +19 -0
  52. package/lib/internal/declared.d.ts.map +1 -0
  53. package/lib/internal/declared.js +435 -0
  54. package/lib/internal/declared.js.map +1 -0
  55. package/lib/internal/helm.d.ts +65 -0
  56. package/lib/internal/helm.d.ts.map +1 -0
  57. package/lib/internal/helm.js +173 -0
  58. package/lib/internal/helm.js.map +1 -0
  59. package/lib/internal/kind.d.ts +17 -0
  60. package/lib/internal/kind.d.ts.map +1 -0
  61. package/lib/internal/kind.js +31 -0
  62. package/lib/internal/kind.js.map +1 -0
  63. package/lib/internal/kubeconfig.d.ts +79 -0
  64. package/lib/internal/kubeconfig.d.ts.map +1 -0
  65. package/lib/internal/kubeconfig.js +222 -0
  66. package/lib/internal/kubeconfig.js.map +1 -0
  67. package/lib/internal/registry.d.ts +44 -0
  68. package/lib/internal/registry.d.ts.map +1 -0
  69. package/lib/internal/registry.js +72 -0
  70. package/lib/internal/registry.js.map +1 -0
  71. package/lib/internal/workload.d.ts +127 -0
  72. package/lib/internal/workload.d.ts.map +1 -0
  73. package/lib/internal/workload.js +411 -0
  74. package/lib/internal/workload.js.map +1 -0
  75. package/package.json +55 -3
  76. package/src/BuiltinAdapters.ts +202 -0
  77. package/src/Client.ts +496 -0
  78. package/src/ClusterAdapter.ts +373 -0
  79. package/src/Connection.ts +234 -0
  80. package/src/Deployment.ts +872 -0
  81. package/src/HelmChart.ts +388 -0
  82. package/src/Job.ts +709 -0
  83. package/src/LocalCluster.ts +631 -0
  84. package/src/Manifest.ts +301 -0
  85. package/src/Objects.ts +213 -0
  86. package/src/Providers.ts +52 -0
  87. package/src/globals.d.ts +2 -0
  88. package/src/index.ts +9 -0
  89. package/src/internal/declared.ts +471 -0
  90. package/src/internal/helm.ts +245 -0
  91. package/src/internal/kind.ts +43 -0
  92. package/src/internal/kubeconfig.ts +364 -0
  93. package/src/internal/registry.ts +108 -0
  94. package/src/internal/workload.ts +504 -0
@@ -0,0 +1,157 @@
1
+ import * as Provider from "alchemy/Provider";
2
+ import { Resource } from "alchemy/Resource";
3
+ import { type ClusterLike, type Connection } from "./Connection.ts";
4
+ import type { KubernetesObjectRef } from "./Objects.ts";
5
+ import type { Providers } from "./Providers.ts";
6
+ declare const ManifestInvalidProps_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
7
+ readonly _tag: "ManifestInvalidProps";
8
+ } & Readonly<A>;
9
+ export declare class ManifestInvalidProps extends ManifestInvalidProps_base<{
10
+ readonly message: string;
11
+ readonly cause?: unknown;
12
+ }> {
13
+ }
14
+ /**
15
+ * A literal Kubernetes object: `apiVersion` + `kind` + `metadata`, with the
16
+ * rest of the object's fields (`spec`, `data`, …) carried as-is. Any kind is
17
+ * accepted — built-in objects and CRDs alike; the API server validates the
18
+ * shape on apply.
19
+ */
20
+ export interface KubernetesManifest {
21
+ apiVersion: string;
22
+ kind: string;
23
+ metadata?: {
24
+ name?: string;
25
+ namespace?: string;
26
+ labels?: Record<string, string>;
27
+ annotations?: Record<string, string>;
28
+ [key: string]: unknown;
29
+ };
30
+ [key: string]: unknown;
31
+ }
32
+ export interface ManifestProps {
33
+ /**
34
+ * Target cluster the manifest is applied onto. Pass a managed cluster
35
+ * resource (e.g. `AWS.EKS.Cluster`), a `Kubernetes.KubeConfig(...)`, or
36
+ * a raw `Kubernetes.Connection`.
37
+ */
38
+ cluster: ClusterLike;
39
+ /**
40
+ * The Kubernetes object to apply (server-side apply, field manager
41
+ * `alchemy`) — a literal object with `apiVersion`, `kind`, `metadata`, and
42
+ * the kind's own fields. Arbitrary CRDs are supported via API discovery.
43
+ */
44
+ manifest: KubernetesManifest;
45
+ }
46
+ export interface Manifest extends Resource<"Kubernetes.Manifest", ManifestProps, {
47
+ /** The connection of the cluster the object is applied to. */
48
+ connection: Connection;
49
+ /** The Kubernetes API version of the applied object. */
50
+ apiVersion: string;
51
+ /** The Kubernetes kind of the applied object. */
52
+ kind: string;
53
+ /** The name of the applied object. */
54
+ name: string;
55
+ /** The namespace of the applied object (`undefined` for cluster-scoped kinds). */
56
+ namespace: string | undefined;
57
+ /** Reference to the applied Kubernetes object. */
58
+ ref: KubernetesObjectRef;
59
+ /** The server-assigned UID of the applied object, when returned. */
60
+ uid: string | undefined;
61
+ /**
62
+ * Fingerprint of the declared fields last applied. `read` compares a GET
63
+ * projected through {@link driftMask} to this.
64
+ */
65
+ baselineHash?: string;
66
+ /**
67
+ * Declared-field mask from the last apply. Older state omits it and is
68
+ * compared with the same selection against the stored manifest.
69
+ */
70
+ driftMask?: unknown;
71
+ /**
72
+ * Set by `read` when the live object diverges. Reconcile does not persist
73
+ * it; the extra field is what `alchemy drift` compares.
74
+ */
75
+ observedHash?: string;
76
+ }, {}, Providers> {
77
+ }
78
+ /**
79
+ * Applies a raw Kubernetes manifest onto any cluster via server-side
80
+ * apply.
81
+ *
82
+ * Any literal object is accepted — built-in kinds and custom resources
83
+ * alike; unknown kinds are resolved through the Kubernetes API discovery
84
+ * endpoint, so CRDs work without any registration. The target `cluster`
85
+ * can be a managed cluster resource (e.g. `AWS.EKS.Cluster`) or any
86
+ * cluster your kubeconfig can reach (`Kubernetes.KubeConfig(...)`).
87
+ * ### Applying Manifests
88
+ * **Example:** StatefulSet
89
+ * ```typescript
90
+ * const sts = yield* Kubernetes.Manifest("Cache", {
91
+ * cluster,
92
+ * manifest: {
93
+ * apiVersion: "apps/v1",
94
+ * kind: "StatefulSet",
95
+ * metadata: { name: "cache", namespace: "apps" },
96
+ * spec: {
97
+ * serviceName: "cache",
98
+ * replicas: 3,
99
+ * selector: { matchLabels: { app: "cache" } },
100
+ * template: {
101
+ * metadata: { labels: { app: "cache" } },
102
+ * spec: { containers: [{ name: "redis", image: "redis:7" }] },
103
+ * },
104
+ * },
105
+ * },
106
+ * });
107
+ * ```
108
+ *
109
+ * **Example:** Custom resource (CRD)
110
+ * ```typescript
111
+ * const widget = yield* Kubernetes.Manifest("Widget", {
112
+ * cluster,
113
+ * manifest: {
114
+ * apiVersion: "acme.io/v1",
115
+ * kind: "Widget",
116
+ * metadata: { name: "w", namespace: "default" },
117
+ * spec: { size: 3 },
118
+ * },
119
+ * });
120
+ * ```
121
+ *
122
+ * ### Namespaces
123
+ * **Example:** Create a Namespace
124
+ * ```typescript
125
+ * const ns = yield* Kubernetes.Manifest("AppsNamespace", {
126
+ * cluster,
127
+ * manifest: {
128
+ * apiVersion: "v1",
129
+ * kind: "Namespace",
130
+ * metadata: { name: "apps" },
131
+ * },
132
+ * });
133
+ * ```
134
+ *
135
+ * ### Any Cluster
136
+ * **Example:** Apply onto a kubeconfig context
137
+ * ```typescript
138
+ * const local = Kubernetes.KubeConfig({ context: "kind-dev" });
139
+ *
140
+ * const config = yield* Kubernetes.Manifest("AppConfig", {
141
+ * cluster: local,
142
+ * manifest: {
143
+ * apiVersion: "v1",
144
+ * kind: "ConfigMap",
145
+ * metadata: { name: "app-config", namespace: "default" },
146
+ * data: { LOG_LEVEL: "info" },
147
+ * },
148
+ * });
149
+ * ```
150
+ *
151
+ * @resource
152
+ * @product Manifest
153
+ */
154
+ export declare const Manifest: import("alchemy/Resource").ResourceClass<Manifest>;
155
+ export declare const ManifestProvider: () => import("effect/Layer").Layer<Provider.Provider<Manifest>, never, never>;
156
+ export {};
157
+ //# sourceMappingURL=Manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Manifest.d.ts","sourceRoot":"","sources":["../src/Manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAW5C,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlF,OAAO,KAAK,EAA8B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;;;;AAEhD,qBAAa,oBAAqB,SAAQ,0BAAyC;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;AAEL;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,OAAO,EAAE,WAAW,CAAC;IACrB;;;;OAIG;IACH,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ,CACxC,qBAAqB,EACrB,aAAa,EACb;IACE,8DAA8D;IAC9D,UAAU,EAAE,UAAU,CAAC;IACvB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,kDAAkD;IAClD,GAAG,EAAE,mBAAmB,CAAC;IACzB,oEAAoE;IACpE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,EACD,EAAE,EACF,SAAS,CACV;CAAG;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AACH,eAAO,MAAM,QAAQ,oDAEnB,CAAC;AAgBH,eAAO,MAAM,gBAAgB,+EA8G1B,CAAC"}
@@ -0,0 +1,205 @@
1
+ import { isResolved } from "alchemy/Diff";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import { isPlainObject } from "alchemy/Util/data";
5
+ import * as Data from "effect/Data";
6
+ import * as Effect from "effect/Effect";
7
+ import { applyObject, connectCluster, deleteObject, ifClusterExists, readObject, } from "./Client.js";
8
+ import { toConnection } from "./Connection.js";
9
+ import { driftMask, hashDriftSelection } from "./internal/declared.js";
10
+ import { connectionIdentity, connectionOfOutput, tryConnectionOf } from "./internal/workload.js";
11
+ export class ManifestInvalidProps extends Data.TaggedError("ManifestInvalidProps") {
12
+ }
13
+ /**
14
+ * Applies a raw Kubernetes manifest onto any cluster via server-side
15
+ * apply.
16
+ *
17
+ * Any literal object is accepted — built-in kinds and custom resources
18
+ * alike; unknown kinds are resolved through the Kubernetes API discovery
19
+ * endpoint, so CRDs work without any registration. The target `cluster`
20
+ * can be a managed cluster resource (e.g. `AWS.EKS.Cluster`) or any
21
+ * cluster your kubeconfig can reach (`Kubernetes.KubeConfig(...)`).
22
+ * ### Applying Manifests
23
+ * **Example:** StatefulSet
24
+ * ```typescript
25
+ * const sts = yield* Kubernetes.Manifest("Cache", {
26
+ * cluster,
27
+ * manifest: {
28
+ * apiVersion: "apps/v1",
29
+ * kind: "StatefulSet",
30
+ * metadata: { name: "cache", namespace: "apps" },
31
+ * spec: {
32
+ * serviceName: "cache",
33
+ * replicas: 3,
34
+ * selector: { matchLabels: { app: "cache" } },
35
+ * template: {
36
+ * metadata: { labels: { app: "cache" } },
37
+ * spec: { containers: [{ name: "redis", image: "redis:7" }] },
38
+ * },
39
+ * },
40
+ * },
41
+ * });
42
+ * ```
43
+ *
44
+ * **Example:** Custom resource (CRD)
45
+ * ```typescript
46
+ * const widget = yield* Kubernetes.Manifest("Widget", {
47
+ * cluster,
48
+ * manifest: {
49
+ * apiVersion: "acme.io/v1",
50
+ * kind: "Widget",
51
+ * metadata: { name: "w", namespace: "default" },
52
+ * spec: { size: 3 },
53
+ * },
54
+ * });
55
+ * ```
56
+ *
57
+ * ### Namespaces
58
+ * **Example:** Create a Namespace
59
+ * ```typescript
60
+ * const ns = yield* Kubernetes.Manifest("AppsNamespace", {
61
+ * cluster,
62
+ * manifest: {
63
+ * apiVersion: "v1",
64
+ * kind: "Namespace",
65
+ * metadata: { name: "apps" },
66
+ * },
67
+ * });
68
+ * ```
69
+ *
70
+ * ### Any Cluster
71
+ * **Example:** Apply onto a kubeconfig context
72
+ * ```typescript
73
+ * const local = Kubernetes.KubeConfig({ context: "kind-dev" });
74
+ *
75
+ * const config = yield* Kubernetes.Manifest("AppConfig", {
76
+ * cluster: local,
77
+ * manifest: {
78
+ * apiVersion: "v1",
79
+ * kind: "ConfigMap",
80
+ * metadata: { name: "app-config", namespace: "default" },
81
+ * data: { LOG_LEVEL: "info" },
82
+ * },
83
+ * });
84
+ * ```
85
+ *
86
+ * @resource
87
+ * @product Manifest
88
+ */
89
+ export const Manifest = Resource("Kubernetes.Manifest", {
90
+ aliases: ["AWS.EKS.Manifest"],
91
+ });
92
+ const toObjectDefinition = (manifest) => {
93
+ const name = manifest.metadata?.name;
94
+ if (!name) {
95
+ return Effect.fail(new ManifestInvalidProps({
96
+ message: `Kubernetes.Manifest requires manifest.metadata.name (got ${manifest.apiVersion}/${manifest.kind})`,
97
+ }));
98
+ }
99
+ return Effect.succeed(manifest);
100
+ };
101
+ export const ManifestProvider = () => Provider.effect(Manifest, Effect.gen(function* () {
102
+ return {
103
+ stables: ["connection", "apiVersion", "kind", "name", "namespace"],
104
+ // In-cluster objects have no cloud-side enumeration that attributes
105
+ // them to alchemy; refresh happens per-instance through `read`.
106
+ list: () => Effect.succeed([]),
107
+ diff: Effect.fn(function* ({ olds = {}, news }) {
108
+ if (!isResolved(news))
109
+ return;
110
+ const oldManifest = olds.manifest;
111
+ const newManifest = news.manifest;
112
+ const oldCluster = connectionIdentity(tryConnectionOf(olds.cluster));
113
+ const newCluster = connectionIdentity(tryConnectionOf(news.cluster));
114
+ // Object identity (cluster, group/version/kind, name, namespace) is
115
+ // immutable — changing any of it is a replacement.
116
+ if (oldManifest &&
117
+ ((oldCluster !== undefined && newCluster !== undefined && oldCluster !== newCluster) ||
118
+ oldManifest.apiVersion !== newManifest.apiVersion ||
119
+ oldManifest.kind !== newManifest.kind ||
120
+ oldManifest.metadata?.name !== newManifest.metadata?.name ||
121
+ oldManifest.metadata?.namespace !== newManifest.metadata?.namespace)) {
122
+ return { action: "replace" };
123
+ }
124
+ }),
125
+ read: Effect.fn(function* ({ output, olds }) {
126
+ if (!output)
127
+ return undefined;
128
+ const connection = connectionOfOutput(output);
129
+ if (!connection)
130
+ return undefined;
131
+ // ClusterNotFound fails the drift row. undefined means this object is gone.
132
+ const transport = yield* connectCluster(connection);
133
+ const observed = yield* readObject({
134
+ transport,
135
+ object: output.ref,
136
+ }).pipe(Effect.catchTag("KubernetesNotFound", () => Effect.undefined));
137
+ if (!observed)
138
+ return undefined;
139
+ const uid = observed.metadata?.uid;
140
+ const attrs = { ...output, uid };
141
+ const manifest = olds?.manifest;
142
+ // A stored mask is the apply-time selection. Older rows have the
143
+ // manifest and no mask; they use that same selection, not the
144
+ // previous whole-object hash.
145
+ const desired = output.driftMask === undefined && manifest !== undefined
146
+ ? yield* toObjectDefinition(manifest)
147
+ : undefined;
148
+ const mask = output.driftMask ?? (desired === undefined ? undefined : driftMask(desired));
149
+ if (mask === undefined)
150
+ return attrs;
151
+ const liveHash = yield* hashDriftSelection(mask, observed);
152
+ const baseline = output.driftMask !== undefined && output.baselineHash !== undefined
153
+ ? output.baselineHash
154
+ : desired === undefined
155
+ ? undefined
156
+ : yield* hashDriftSelection(mask, desired);
157
+ if (baseline !== undefined && liveHash !== baseline) {
158
+ return { ...attrs, observedHash: liveHash };
159
+ }
160
+ return attrs;
161
+ }),
162
+ reconcile: Effect.fn(function* ({ news, output, session }) {
163
+ const connection = toConnection(news.cluster);
164
+ const transport = yield* connectCluster(connection);
165
+ const object = yield* toObjectDefinition(news.manifest);
166
+ const ref = {
167
+ apiVersion: object.apiVersion,
168
+ kind: object.kind,
169
+ name: object.metadata.name,
170
+ namespace: object.metadata.namespace,
171
+ };
172
+ // Server-side apply is a true upsert: create-if-missing and
173
+ // converge-if-present in one call, `force: true` so alchemy owns
174
+ // the fields it manages regardless of prior managers.
175
+ const applied = yield* applyObject({ transport, object });
176
+ const witnessed = isPlainObject(applied) ? applied : undefined;
177
+ const baselineHash = yield* hashDriftSelection(object, witnessed ?? object);
178
+ yield* session.note(`Applied ${ref.apiVersion}/${ref.kind} ${ref.namespace ? `${ref.namespace}/` : ""}${ref.name}`);
179
+ const uid = applied?.metadata?.uid ?? output?.uid;
180
+ return {
181
+ connection,
182
+ apiVersion: ref.apiVersion,
183
+ kind: ref.kind,
184
+ name: ref.name,
185
+ namespace: ref.namespace,
186
+ ref,
187
+ uid,
188
+ baselineHash,
189
+ driftMask: driftMask(object, witnessed),
190
+ };
191
+ }),
192
+ delete: Effect.fn(function* ({ output }) {
193
+ const connection = connectionOfOutput(output);
194
+ if (!connection)
195
+ return;
196
+ const transport = yield* ifClusterExists(connectCluster(connection));
197
+ if (!transport)
198
+ return;
199
+ // 404 (including a removed CRD's discovery 404) is already success.
200
+ // 403/5xx must surface: the object is still there.
201
+ yield* deleteObject({ transport, object: output.ref });
202
+ }),
203
+ };
204
+ }));
205
+ //# sourceMappingURL=Manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Manifest.js","sourceRoot":"","sources":["../src/Manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Internal Kubernetes object model + ordering/path helpers powering
3
+ * `Kubernetes.Manifest` and the workload platforms (`Deployment`, `Job`).
4
+ * Not part of the public surface — the public manifest shape is the literal
5
+ * `KubernetesManifest` on `Kubernetes.Manifest`.
6
+ */
7
+ export interface KubernetesObjectMetadata {
8
+ name: string;
9
+ namespace?: string;
10
+ labels?: Record<string, string>;
11
+ annotations?: Record<string, string>;
12
+ }
13
+ export type KubernetesObjectDefinition = {
14
+ apiVersion: string;
15
+ kind: string;
16
+ metadata: KubernetesObjectMetadata;
17
+ } & Record<string, unknown>;
18
+ export interface KubernetesObjectRef {
19
+ apiVersion: string;
20
+ kind: string;
21
+ name: string;
22
+ namespace?: string;
23
+ /**
24
+ * Fingerprint of the declared fields last applied. Reads compare a GET
25
+ * projected through {@link driftMask} to this.
26
+ */
27
+ baselineHash?: string;
28
+ /**
29
+ * Declared-field mask from the last apply. Absent on state written before
30
+ * selections existed; those rows still detect a deleted object.
31
+ */
32
+ driftMask?: unknown;
33
+ }
34
+ export interface KubernetesObjectBinding {
35
+ type: "kubernetes-object";
36
+ object: KubernetesObjectDefinition;
37
+ }
38
+ export type KubernetesObjectScope = "Cluster" | "Namespaced";
39
+ export interface KubernetesObjectKindSpec {
40
+ plural: string;
41
+ scope: KubernetesObjectScope;
42
+ applyRank: number;
43
+ }
44
+ /** Apply rank for kinds not in the static table (applied last, deleted first). */
45
+ export declare const DEFAULT_APPLY_RANK = 100;
46
+ /** Look up the static kind table; `undefined` for kinds needing discovery. */
47
+ export declare const lookupKubernetesKindSpec: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind">) => KubernetesObjectKindSpec | undefined;
48
+ export declare const getKubernetesKindSpec: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind">) => KubernetesObjectKindSpec;
49
+ export declare const toKubernetesObjectRef: (object: KubernetesObjectDefinition) => KubernetesObjectRef;
50
+ export declare const kubernetesObjectKey: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind" | "name" | "namespace">) => string;
51
+ export declare const sortObjectsForApply: (objects: ReadonlyArray<KubernetesObjectDefinition>) => KubernetesObjectDefinition[];
52
+ export declare const sortRefsForDelete: (objects: ReadonlyArray<KubernetesObjectRef>) => KubernetesObjectRef[];
53
+ export declare const chunkByApplyRank: (objects: ReadonlyArray<KubernetesObjectDefinition>) => KubernetesObjectDefinition[][];
54
+ /**
55
+ * Build the REST path for an object given its (statically-known or
56
+ * discovered) kind spec.
57
+ */
58
+ export declare const buildKubernetesObjectPathWithSpec: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind" | "name" | "namespace">, spec: KubernetesObjectKindSpec) => string;
59
+ export declare const buildKubernetesObjectPath: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind" | "name" | "namespace">) => string;
60
+ //# sourceMappingURL=Objects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Objects.d.ts","sourceRoot":"","sources":["../src/Objects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,wBAAwB,CAAC;CACpC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,0BAA0B,CAAC;CACpC;AAED,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,YAAY,CAAC;AAE7D,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,qBAAqB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAsEtC,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,UAC5B,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,CAAC,KACtD,wBAAwB,GAAG,SAAiD,CAAC;AAEhF,eAAO,MAAM,qBAAqB,UAAW,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,CAAC,6BAM5F,CAAC;AAKF,eAAO,MAAM,qBAAqB,WAAY,0BAA0B,KAAG,mBAKzE,CAAC;AAEH,eAAO,MAAM,mBAAmB,UACvB,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,WACQ,CAAC;AAKzF,eAAO,MAAM,mBAAmB,YAAa,aAAa,CAAC,0BAA0B,CAAC,iCAKnF,CAAC;AAEJ,eAAO,MAAM,iBAAiB,YAAa,aAAa,CAAC,mBAAmB,CAAC,0BACM,CAAC;AAEpF,eAAO,MAAM,gBAAgB,YAAa,aAAa,CAAC,0BAA0B,CAAC,mCAoBlF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iCAAiC,UACrC,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,QACxE,wBAAwB,WAmB/B,CAAC;AAEF,eAAO,MAAM,yBAAyB,UAC7B,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,WACL,CAAC"}
package/lib/Objects.js ADDED
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Internal Kubernetes object model + ordering/path helpers powering
3
+ * `Kubernetes.Manifest` and the workload platforms (`Deployment`, `Job`).
4
+ * Not part of the public surface — the public manifest shape is the literal
5
+ * `KubernetesManifest` on `Kubernetes.Manifest`.
6
+ */
7
+ /** Apply rank for kinds not in the static table (applied last, deleted first). */
8
+ export const DEFAULT_APPLY_RANK = 100;
9
+ const supportedKinds = {
10
+ "v1/Namespace": {
11
+ plural: "namespaces",
12
+ scope: "Cluster",
13
+ applyRank: 10,
14
+ },
15
+ // CRDs apply right after namespaces so a chart's custom resources
16
+ // (default rank 100) always find their definition registered.
17
+ "apiextensions.k8s.io/v1/CustomResourceDefinition": {
18
+ plural: "customresourcedefinitions",
19
+ scope: "Cluster",
20
+ applyRank: 15,
21
+ },
22
+ "v1/ServiceAccount": {
23
+ plural: "serviceaccounts",
24
+ scope: "Namespaced",
25
+ applyRank: 20,
26
+ },
27
+ "v1/ConfigMap": {
28
+ plural: "configmaps",
29
+ scope: "Namespaced",
30
+ applyRank: 30,
31
+ },
32
+ "v1/Secret": {
33
+ plural: "secrets",
34
+ scope: "Namespaced",
35
+ applyRank: 30,
36
+ },
37
+ "v1/Service": {
38
+ plural: "services",
39
+ scope: "Namespaced",
40
+ applyRank: 40,
41
+ },
42
+ "apps/v1/Deployment": {
43
+ plural: "deployments",
44
+ scope: "Namespaced",
45
+ applyRank: 50,
46
+ },
47
+ "apps/v1/StatefulSet": {
48
+ plural: "statefulsets",
49
+ scope: "Namespaced",
50
+ applyRank: 50,
51
+ },
52
+ "apps/v1/DaemonSet": {
53
+ plural: "daemonsets",
54
+ scope: "Namespaced",
55
+ applyRank: 50,
56
+ },
57
+ "batch/v1/Job": {
58
+ plural: "jobs",
59
+ scope: "Namespaced",
60
+ applyRank: 60,
61
+ },
62
+ "batch/v1/CronJob": {
63
+ plural: "cronjobs",
64
+ scope: "Namespaced",
65
+ applyRank: 60,
66
+ },
67
+ "v1/Pod": {
68
+ plural: "pods",
69
+ scope: "Namespaced",
70
+ applyRank: 60,
71
+ },
72
+ };
73
+ const objectTypeKey = (input) => `${input.apiVersion}/${input.kind}`;
74
+ /** Look up the static kind table; `undefined` for kinds needing discovery. */
75
+ export const lookupKubernetesKindSpec = (input) => supportedKinds[objectTypeKey(input)];
76
+ export const getKubernetesKindSpec = (input) => {
77
+ const spec = lookupKubernetesKindSpec(input);
78
+ if (!spec) {
79
+ throw new Error(`Unsupported Kubernetes object ${input.apiVersion}/${input.kind}`);
80
+ }
81
+ return spec;
82
+ };
83
+ const applyRankOf = (input) => lookupKubernetesKindSpec(input)?.applyRank ?? DEFAULT_APPLY_RANK;
84
+ export const toKubernetesObjectRef = (object) => ({
85
+ apiVersion: object.apiVersion,
86
+ kind: object.kind,
87
+ name: object.metadata.name,
88
+ namespace: object.metadata.namespace,
89
+ });
90
+ export const kubernetesObjectKey = (input) => [input.apiVersion, input.kind, input.namespace ?? "_cluster", input.name].join("/");
91
+ const compareRefs = (a, b) => kubernetesObjectKey(a).localeCompare(kubernetesObjectKey(b));
92
+ export const sortObjectsForApply = (objects) => [...objects].sort((a, b) => applyRankOf(a) - applyRankOf(b) ||
93
+ compareRefs(toKubernetesObjectRef(a), toKubernetesObjectRef(b)));
94
+ export const sortRefsForDelete = (objects) => [...objects].sort((a, b) => applyRankOf(b) - applyRankOf(a) || compareRefs(a, b));
95
+ export const chunkByApplyRank = (objects) => {
96
+ const chunks = [];
97
+ for (const object of sortObjectsForApply(objects)) {
98
+ const rank = applyRankOf(object);
99
+ const current = chunks[chunks.length - 1];
100
+ if (!current) {
101
+ chunks.push([object]);
102
+ continue;
103
+ }
104
+ const currentRank = applyRankOf(current[0]);
105
+ if (currentRank === rank) {
106
+ current.push(object);
107
+ }
108
+ else {
109
+ chunks.push([object]);
110
+ }
111
+ }
112
+ return chunks;
113
+ };
114
+ /**
115
+ * Build the REST path for an object given its (statically-known or
116
+ * discovered) kind spec.
117
+ */
118
+ export const buildKubernetesObjectPathWithSpec = (input, spec) => {
119
+ const [group, version] = input.apiVersion.includes("/")
120
+ ? input.apiVersion.split("/", 2)
121
+ : [undefined, input.apiVersion];
122
+ const base = group ? `/apis/${group}/${version}` : `/api/${version}`;
123
+ if (spec.scope === "Namespaced") {
124
+ if (!input.namespace) {
125
+ throw new Error(`Kubernetes object ${input.apiVersion}/${input.kind}/${input.name} requires a namespace`);
126
+ }
127
+ return `${base}/namespaces/${input.namespace}/${spec.plural}/${input.name}`;
128
+ }
129
+ return `${base}/${spec.plural}/${input.name}`;
130
+ };
131
+ export const buildKubernetesObjectPath = (input) => buildKubernetesObjectPathWithSpec(input, getKubernetesKindSpec(input));
132
+ //# sourceMappingURL=Objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Objects.js","sourceRoot":"","sources":["../src/Objects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import * as Provider from "alchemy/Provider";
2
+ import * as Layer from "effect/Layer";
3
+ declare const Providers_base: Provider.ProviderCollection<Providers, "Kubernetes">;
4
+ export declare class Providers extends Providers_base {
5
+ }
6
+ /**
7
+ * The Kubernetes provider layer: the cluster-agnostic workload providers
8
+ * (`Deployment`, `Job`, `Manifest`, `HelmChart`), `LocalCluster`, and the
9
+ * built-in cluster adapters (`kubeconfig`, `token`, `client-cert`, `exec`).
10
+ *
11
+ * Managed-cloud clusters need their platform's adapter alongside — e.g.
12
+ * targeting an `AWS.EKS.Cluster` requires `AWS.providers()` in the same
13
+ * stack:
14
+ *
15
+ * ```ts
16
+ * const stack = Alchemy.Stack("app", {
17
+ * providers: Layer.mergeAll(AWS.providers(), Kubernetes.providers()),
18
+ * state: AWS.state(),
19
+ * });
20
+ * ```
21
+ */
22
+ export declare const providers: () => Layer.Layer<import("./ClusterAdapter.ts").ClusterAdapterService | Providers, never, import("alchemy/AlchemyContext").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage>;
23
+ export {};
24
+ //# sourceMappingURL=Providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Providers.d.ts","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;;AAQtC,qBAAa,SAAU,SAAQ,cAAsD;CAAG;AAExF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,SAAS,qVAuBnB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { DockerLive } from "@alchemy.run/docker/Docker";
2
+ import * as Provider from "alchemy/Provider";
3
+ import * as Layer from "effect/Layer";
4
+ import { builtinAdapters } from "./BuiltinAdapters.js";
5
+ import { Deployment, DeploymentProvider } from "./Deployment.js";
6
+ import { HelmChart, HelmChartProvider } from "./HelmChart.js";
7
+ import { Job, JobProvider } from "./Job.js";
8
+ import { LocalCluster, LocalClusterProvider } from "./LocalCluster.js";
9
+ import { Manifest, ManifestProvider } from "./Manifest.js";
10
+ export class Providers extends Provider.ProviderCollection()("Kubernetes") {
11
+ }
12
+ /**
13
+ * The Kubernetes provider layer: the cluster-agnostic workload providers
14
+ * (`Deployment`, `Job`, `Manifest`, `HelmChart`), `LocalCluster`, and the
15
+ * built-in cluster adapters (`kubeconfig`, `token`, `client-cert`, `exec`).
16
+ *
17
+ * Managed-cloud clusters need their platform's adapter alongside — e.g.
18
+ * targeting an `AWS.EKS.Cluster` requires `AWS.providers()` in the same
19
+ * stack:
20
+ *
21
+ * ```ts
22
+ * const stack = Alchemy.Stack("app", {
23
+ * providers: Layer.mergeAll(AWS.providers(), Kubernetes.providers()),
24
+ * state: AWS.state(),
25
+ * });
26
+ * ```
27
+ */
28
+ export const providers = () => Layer.effect(Providers, Provider.collection([Deployment, HelmChart, Job, LocalCluster, Manifest])).pipe(Layer.provide(Layer.mergeAll(DeploymentProvider(), HelmChartProvider(), JobProvider(), LocalClusterProvider(), ManifestProvider()).pipe(
29
+ // Workloads build `main` / `context` images with the Docker CLI for
30
+ // connections that declare a `registry`.
31
+ Layer.provide(DockerLive))),
32
+ // The built-in adapters are provideMerged (not just provided) so the
33
+ // workloads' dynamic `findClusterAdapter` lookups see them in the
34
+ // ambient stack context.
35
+ Layer.provideMerge(builtinAdapters()), Layer.orDie);
36
+ //# sourceMappingURL=Providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Providers.js","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,OAAO,SAAU,SAAQ,QAAQ,CAAC,kBAAkB,EAAa,CAAC,YAAY,CAAC;CAAG;AAExF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAC5B,KAAK,CAAC,MAAM,CACV,SAAS,EACT,QAAQ,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAC1E,CAAC,IAAI,CACJ,KAAK,CAAC,OAAO,CACX,KAAK,CAAC,QAAQ,CACZ,kBAAkB,EAAE,EACpB,iBAAiB,EAAE,EACnB,WAAW,EAAE,EACb,oBAAoB,EAAE,EACtB,gBAAgB,EAAE,CACnB,CAAC,IAAI;AACJ,oEAAoE;AACpE,yCAAyC;AACzC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAC1B,CACF;AACD,qEAAqE;AACrE,kEAAkE;AAClE,yBAAyB;AACzB,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,EACrC,KAAK,CAAC,KAAK,CACZ,CAAC"}