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

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 +23 -0
  4. package/lib/BuiltinAdapters.d.ts.map +1 -0
  5. package/lib/BuiltinAdapters.js +124 -0
  6. package/lib/BuiltinAdapters.js.map +1 -0
  7. package/lib/Client.d.ts +80 -0
  8. package/lib/Client.d.ts.map +1 -0
  9. package/lib/Client.js +296 -0
  10. package/lib/Client.js.map +1 -0
  11. package/lib/ClusterAdapter.d.ts +322 -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 +382 -0
  20. package/lib/Deployment.d.ts.map +1 -0
  21. package/lib/Deployment.js +533 -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 +314 -0
  28. package/lib/Job.d.ts.map +1 -0
  29. package/lib/Job.js +426 -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 +148 -0
  36. package/lib/Manifest.d.ts.map +1 -0
  37. package/lib/Manifest.js +200 -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 +194 -0
  77. package/src/Client.ts +465 -0
  78. package/src/ClusterAdapter.ts +370 -0
  79. package/src/Connection.ts +234 -0
  80. package/src/Deployment.ts +851 -0
  81. package/src/HelmChart.ts +388 -0
  82. package/src/Job.ts +689 -0
  83. package/src/LocalCluster.ts +631 -0
  84. package/src/Manifest.ts +295 -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 +503 -0
@@ -0,0 +1,148 @@
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
+ /**
7
+ * A literal Kubernetes object: `apiVersion` + `kind` + `metadata`, with the
8
+ * rest of the object's fields (`spec`, `data`, …) carried as-is. Any kind is
9
+ * accepted — built-in objects and CRDs alike; the API server validates the
10
+ * shape on apply.
11
+ */
12
+ export interface KubernetesManifest {
13
+ apiVersion: string;
14
+ kind: string;
15
+ metadata?: {
16
+ name?: string;
17
+ namespace?: string;
18
+ labels?: Record<string, string>;
19
+ annotations?: Record<string, string>;
20
+ [key: string]: unknown;
21
+ };
22
+ [key: string]: unknown;
23
+ }
24
+ export interface ManifestProps {
25
+ /**
26
+ * Target cluster the manifest is applied onto. Pass a managed cluster
27
+ * resource (e.g. `AWS.EKS.Cluster`), a `Kubernetes.KubeConfig(...)`, or
28
+ * a raw `Kubernetes.Connection`.
29
+ */
30
+ cluster: ClusterLike;
31
+ /**
32
+ * The Kubernetes object to apply (server-side apply, field manager
33
+ * `alchemy`) — a literal object with `apiVersion`, `kind`, `metadata`, and
34
+ * the kind's own fields. Arbitrary CRDs are supported via API discovery.
35
+ */
36
+ manifest: KubernetesManifest;
37
+ }
38
+ export interface Manifest extends Resource<"Kubernetes.Manifest", ManifestProps, {
39
+ /** The connection of the cluster the object is applied to. */
40
+ connection: Connection;
41
+ /** The Kubernetes API version of the applied object. */
42
+ apiVersion: string;
43
+ /** The Kubernetes kind of the applied object. */
44
+ kind: string;
45
+ /** The name of the applied object. */
46
+ name: string;
47
+ /** The namespace of the applied object (`undefined` for cluster-scoped kinds). */
48
+ namespace: string | undefined;
49
+ /** Reference to the applied Kubernetes object. */
50
+ ref: KubernetesObjectRef;
51
+ /** The server-assigned UID of the applied object, when returned. */
52
+ uid: string | undefined;
53
+ /**
54
+ * Fingerprint of the declared fields last applied. `read` compares a GET
55
+ * projected through {@link driftMask} to this.
56
+ */
57
+ baselineHash?: string;
58
+ /**
59
+ * Declared-field mask from the last apply. Older state omits it and is
60
+ * compared with the same selection against the stored manifest.
61
+ */
62
+ driftMask?: unknown;
63
+ /**
64
+ * Set by `read` when the live object diverges. Reconcile does not persist
65
+ * it; the extra field is what `alchemy drift` compares.
66
+ */
67
+ observedHash?: string;
68
+ }, {}, Providers> {
69
+ }
70
+ /**
71
+ * Applies a raw Kubernetes manifest onto any cluster via server-side
72
+ * apply.
73
+ *
74
+ * Any literal object is accepted — built-in kinds and custom resources
75
+ * alike; unknown kinds are resolved through the Kubernetes API discovery
76
+ * endpoint, so CRDs work without any registration. The target `cluster`
77
+ * can be a managed cluster resource (e.g. `AWS.EKS.Cluster`) or any
78
+ * cluster your kubeconfig can reach (`Kubernetes.KubeConfig(...)`).
79
+ * ### Applying Manifests
80
+ * **Example:** StatefulSet
81
+ * ```typescript
82
+ * const sts = yield* Kubernetes.Manifest("Cache", {
83
+ * cluster,
84
+ * manifest: {
85
+ * apiVersion: "apps/v1",
86
+ * kind: "StatefulSet",
87
+ * metadata: { name: "cache", namespace: "apps" },
88
+ * spec: {
89
+ * serviceName: "cache",
90
+ * replicas: 3,
91
+ * selector: { matchLabels: { app: "cache" } },
92
+ * template: {
93
+ * metadata: { labels: { app: "cache" } },
94
+ * spec: { containers: [{ name: "redis", image: "redis:7" }] },
95
+ * },
96
+ * },
97
+ * },
98
+ * });
99
+ * ```
100
+ *
101
+ * **Example:** Custom resource (CRD)
102
+ * ```typescript
103
+ * const widget = yield* Kubernetes.Manifest("Widget", {
104
+ * cluster,
105
+ * manifest: {
106
+ * apiVersion: "acme.io/v1",
107
+ * kind: "Widget",
108
+ * metadata: { name: "w", namespace: "default" },
109
+ * spec: { size: 3 },
110
+ * },
111
+ * });
112
+ * ```
113
+ *
114
+ * ### Namespaces
115
+ * **Example:** Create a Namespace
116
+ * ```typescript
117
+ * const ns = yield* Kubernetes.Manifest("AppsNamespace", {
118
+ * cluster,
119
+ * manifest: {
120
+ * apiVersion: "v1",
121
+ * kind: "Namespace",
122
+ * metadata: { name: "apps" },
123
+ * },
124
+ * });
125
+ * ```
126
+ *
127
+ * ### Any Cluster
128
+ * **Example:** Apply onto a kubeconfig context
129
+ * ```typescript
130
+ * const local = Kubernetes.KubeConfig({ context: "kind-dev" });
131
+ *
132
+ * const config = yield* Kubernetes.Manifest("AppConfig", {
133
+ * cluster: local,
134
+ * manifest: {
135
+ * apiVersion: "v1",
136
+ * kind: "ConfigMap",
137
+ * metadata: { name: "app-config", namespace: "default" },
138
+ * data: { LOG_LEVEL: "info" },
139
+ * },
140
+ * });
141
+ * ```
142
+ *
143
+ * @resource
144
+ * @product Manifest
145
+ */
146
+ export declare const Manifest: import("alchemy/Resource").ResourceClass<Manifest>;
147
+ export declare const ManifestProvider: () => import("effect/Layer").Layer<Provider.Provider<Manifest>, never, never>;
148
+ //# 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;AAU5C,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;;;;;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,200 @@
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 Effect from "effect/Effect";
6
+ import { applyObject, connectCluster, deleteObject, ifClusterExists, readObject, } from "./Client.js";
7
+ import { toConnection } from "./Connection.js";
8
+ import { driftMask, hashDriftSelection } from "./internal/declared.js";
9
+ import { connectionIdentity, connectionOfOutput, tryConnectionOf } from "./internal/workload.js";
10
+ /**
11
+ * Applies a raw Kubernetes manifest onto any cluster via server-side
12
+ * apply.
13
+ *
14
+ * Any literal object is accepted — built-in kinds and custom resources
15
+ * alike; unknown kinds are resolved through the Kubernetes API discovery
16
+ * endpoint, so CRDs work without any registration. The target `cluster`
17
+ * can be a managed cluster resource (e.g. `AWS.EKS.Cluster`) or any
18
+ * cluster your kubeconfig can reach (`Kubernetes.KubeConfig(...)`).
19
+ * ### Applying Manifests
20
+ * **Example:** StatefulSet
21
+ * ```typescript
22
+ * const sts = yield* Kubernetes.Manifest("Cache", {
23
+ * cluster,
24
+ * manifest: {
25
+ * apiVersion: "apps/v1",
26
+ * kind: "StatefulSet",
27
+ * metadata: { name: "cache", namespace: "apps" },
28
+ * spec: {
29
+ * serviceName: "cache",
30
+ * replicas: 3,
31
+ * selector: { matchLabels: { app: "cache" } },
32
+ * template: {
33
+ * metadata: { labels: { app: "cache" } },
34
+ * spec: { containers: [{ name: "redis", image: "redis:7" }] },
35
+ * },
36
+ * },
37
+ * },
38
+ * });
39
+ * ```
40
+ *
41
+ * **Example:** Custom resource (CRD)
42
+ * ```typescript
43
+ * const widget = yield* Kubernetes.Manifest("Widget", {
44
+ * cluster,
45
+ * manifest: {
46
+ * apiVersion: "acme.io/v1",
47
+ * kind: "Widget",
48
+ * metadata: { name: "w", namespace: "default" },
49
+ * spec: { size: 3 },
50
+ * },
51
+ * });
52
+ * ```
53
+ *
54
+ * ### Namespaces
55
+ * **Example:** Create a Namespace
56
+ * ```typescript
57
+ * const ns = yield* Kubernetes.Manifest("AppsNamespace", {
58
+ * cluster,
59
+ * manifest: {
60
+ * apiVersion: "v1",
61
+ * kind: "Namespace",
62
+ * metadata: { name: "apps" },
63
+ * },
64
+ * });
65
+ * ```
66
+ *
67
+ * ### Any Cluster
68
+ * **Example:** Apply onto a kubeconfig context
69
+ * ```typescript
70
+ * const local = Kubernetes.KubeConfig({ context: "kind-dev" });
71
+ *
72
+ * const config = yield* Kubernetes.Manifest("AppConfig", {
73
+ * cluster: local,
74
+ * manifest: {
75
+ * apiVersion: "v1",
76
+ * kind: "ConfigMap",
77
+ * metadata: { name: "app-config", namespace: "default" },
78
+ * data: { LOG_LEVEL: "info" },
79
+ * },
80
+ * });
81
+ * ```
82
+ *
83
+ * @resource
84
+ * @product Manifest
85
+ */
86
+ export const Manifest = Resource("Kubernetes.Manifest", {
87
+ aliases: ["AWS.EKS.Manifest"],
88
+ });
89
+ const toObjectDefinition = (manifest) => {
90
+ const name = manifest.metadata?.name;
91
+ if (!name) {
92
+ return Effect.fail(new Error(`Kubernetes.Manifest requires manifest.metadata.name (got ${manifest.apiVersion}/${manifest.kind})`));
93
+ }
94
+ return Effect.succeed(manifest);
95
+ };
96
+ export const ManifestProvider = () => Provider.effect(Manifest, Effect.gen(function* () {
97
+ return {
98
+ stables: ["connection", "apiVersion", "kind", "name", "namespace"],
99
+ // In-cluster objects have no cloud-side enumeration that attributes
100
+ // them to alchemy; refresh happens per-instance through `read`.
101
+ list: () => Effect.succeed([]),
102
+ diff: Effect.fn(function* ({ olds = {}, news }) {
103
+ if (!isResolved(news))
104
+ return;
105
+ const oldManifest = olds.manifest;
106
+ const newManifest = news.manifest;
107
+ const oldCluster = connectionIdentity(tryConnectionOf(olds.cluster));
108
+ const newCluster = connectionIdentity(tryConnectionOf(news.cluster));
109
+ // Object identity (cluster, group/version/kind, name, namespace) is
110
+ // immutable — changing any of it is a replacement.
111
+ if (oldManifest &&
112
+ ((oldCluster !== undefined && newCluster !== undefined && oldCluster !== newCluster) ||
113
+ oldManifest.apiVersion !== newManifest.apiVersion ||
114
+ oldManifest.kind !== newManifest.kind ||
115
+ oldManifest.metadata?.name !== newManifest.metadata?.name ||
116
+ oldManifest.metadata?.namespace !== newManifest.metadata?.namespace)) {
117
+ return { action: "replace" };
118
+ }
119
+ }),
120
+ read: Effect.fn(function* ({ output, olds }) {
121
+ if (!output)
122
+ return undefined;
123
+ const connection = connectionOfOutput(output);
124
+ if (!connection)
125
+ return undefined;
126
+ // ClusterNotFound fails the drift row. undefined means this object is gone.
127
+ const transport = yield* connectCluster(connection);
128
+ const observed = yield* readObject({
129
+ transport,
130
+ object: output.ref,
131
+ }).pipe(Effect.catchTag("KubernetesNotFound", () => Effect.succeed(undefined)));
132
+ if (!observed)
133
+ return undefined;
134
+ const uid = observed.metadata?.uid;
135
+ const attrs = { ...output, uid };
136
+ const manifest = olds?.manifest;
137
+ // A stored mask is the apply-time selection. Older rows have the
138
+ // manifest and no mask; they use that same selection, not the
139
+ // previous whole-object hash.
140
+ const desired = output.driftMask === undefined && manifest !== undefined
141
+ ? yield* toObjectDefinition(manifest)
142
+ : undefined;
143
+ const mask = output.driftMask ?? (desired === undefined ? undefined : driftMask(desired));
144
+ if (mask === undefined)
145
+ return attrs;
146
+ const liveHash = yield* hashDriftSelection(mask, observed);
147
+ const baseline = output.driftMask !== undefined && output.baselineHash !== undefined
148
+ ? output.baselineHash
149
+ : desired === undefined
150
+ ? undefined
151
+ : yield* hashDriftSelection(mask, desired);
152
+ if (baseline !== undefined && liveHash !== baseline) {
153
+ return { ...attrs, observedHash: liveHash };
154
+ }
155
+ return attrs;
156
+ }),
157
+ reconcile: Effect.fn(function* ({ news, output, session }) {
158
+ const connection = toConnection(news.cluster);
159
+ const transport = yield* connectCluster(connection);
160
+ const object = yield* toObjectDefinition(news.manifest);
161
+ const ref = {
162
+ apiVersion: object.apiVersion,
163
+ kind: object.kind,
164
+ name: object.metadata.name,
165
+ namespace: object.metadata.namespace,
166
+ };
167
+ // Server-side apply is a true upsert: create-if-missing and
168
+ // converge-if-present in one call, `force: true` so alchemy owns
169
+ // the fields it manages regardless of prior managers.
170
+ const applied = yield* applyObject({ transport, object });
171
+ const witnessed = isPlainObject(applied) ? applied : undefined;
172
+ const baselineHash = yield* hashDriftSelection(object, witnessed ?? object);
173
+ yield* session.note(`Applied ${ref.apiVersion}/${ref.kind} ${ref.namespace ? `${ref.namespace}/` : ""}${ref.name}`);
174
+ const uid = applied?.metadata?.uid ?? output?.uid;
175
+ return {
176
+ connection,
177
+ apiVersion: ref.apiVersion,
178
+ kind: ref.kind,
179
+ name: ref.name,
180
+ namespace: ref.namespace,
181
+ ref,
182
+ uid,
183
+ baselineHash,
184
+ driftMask: driftMask(object, witnessed),
185
+ };
186
+ }),
187
+ delete: Effect.fn(function* ({ output }) {
188
+ const connection = connectionOfOutput(output);
189
+ if (!connection)
190
+ return;
191
+ const transport = yield* ifClusterExists(connectCluster(connection));
192
+ if (!transport)
193
+ return;
194
+ // 404 (including a removed CRD's discovery 404) is already success.
195
+ // 403/5xx must surface: the object is still there.
196
+ yield* deleteObject({ transport, object: output.ref });
197
+ }),
198
+ };
199
+ }));
200
+ //# 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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export * from "./BuiltinAdapters.ts";
2
+ export * from "./ClusterAdapter.ts";
3
+ export * from "./Connection.ts";
4
+ export * from "./Deployment.ts";
5
+ export * from "./HelmChart.ts";
6
+ export * from "./Job.ts";
7
+ export * from "./LocalCluster.ts";
8
+ export * from "./Manifest.ts";
9
+ export * from "./Providers.ts";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}