k8ts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +7 -0
- package/README.md +3 -0
- package/dist/.imports.tsbuildinfo +1 -0
- package/dist/_imports/_mix.d.ts +4 -0
- package/dist/_imports/_mix.d.ts.map +1 -0
- package/dist/_imports/_mix.js +20 -0
- package/dist/_imports/_mix.js.map +1 -0
- package/dist/_imports/acme.cert-manager.io.d.ts +4832 -0
- package/dist/_imports/acme.cert-manager.io.d.ts.map +1 -0
- package/dist/_imports/acme.cert-manager.io.js +2476 -0
- package/dist/_imports/acme.cert-manager.io.js.map +1 -0
- package/dist/_imports/gateway.networking.k8s.io.d.ts +8786 -0
- package/dist/_imports/gateway.networking.k8s.io.d.ts.map +1 -0
- package/dist/_imports/gateway.networking.k8s.io.js +3668 -0
- package/dist/_imports/gateway.networking.k8s.io.js.map +1 -0
- package/dist/_imports/index.d.ts +3 -0
- package/dist/_imports/index.d.ts.map +1 -0
- package/dist/_imports/index.js +39 -0
- package/dist/_imports/index.js.map +1 -0
- package/dist/_imports/k8s.d.ts +18782 -0
- package/dist/_imports/k8s.d.ts.map +1 -0
- package/dist/_imports/k8s.js +12173 -0
- package/dist/_imports/k8s.js.map +1 -0
- package/dist/api-versions.d.ts +5 -0
- package/dist/api-versions.d.ts.map +1 -0
- package/dist/api-versions.js +8 -0
- package/dist/api-versions.js.map +1 -0
- package/dist/error.d.ts +5 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +12 -0
- package/dist/error.js.map +1 -0
- package/dist/external/index.d.ts +13 -0
- package/dist/external/index.d.ts.map +1 -0
- package/dist/external/index.js +81 -0
- package/dist/external/index.js.map +1 -0
- package/dist/file/exports.d.ts +20 -0
- package/dist/file/exports.d.ts.map +1 -0
- package/dist/file/exports.js +62 -0
- package/dist/file/exports.js.map +1 -0
- package/dist/file/factory.d.ts +34 -0
- package/dist/file/factory.d.ts.map +1 -0
- package/dist/file/factory.js +171 -0
- package/dist/file/factory.js.map +1 -0
- package/dist/file/file.d.ts +17 -0
- package/dist/file/file.d.ts.map +1 -0
- package/dist/file/file.js +21 -0
- package/dist/file/file.js.map +1 -0
- package/dist/file/index.d.ts +2 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js +18 -0
- package/dist/file/index.js.map +1 -0
- package/dist/file/origin.d.ts +18 -0
- package/dist/file/origin.d.ts.map +1 -0
- package/dist/file/origin.js +27 -0
- package/dist/file/origin.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/k8ts-sys-kind.d.ts +3 -0
- package/dist/k8ts-sys-kind.d.ts.map +1 -0
- package/dist/k8ts-sys-kind.js +8 -0
- package/dist/k8ts-sys-kind.js.map +1 -0
- package/dist/kind-map.d.ts +11 -0
- package/dist/kind-map.d.ts.map +1 -0
- package/dist/kind-map.js +29 -0
- package/dist/kind-map.js.map +1 -0
- package/dist/meta/k8ts-section.d.ts +3 -0
- package/dist/meta/k8ts-section.d.ts.map +1 -0
- package/dist/meta/k8ts-section.js +10 -0
- package/dist/meta/k8ts-section.js.map +1 -0
- package/dist/node/abs-resource.d.ts +15 -0
- package/dist/node/abs-resource.d.ts.map +1 -0
- package/dist/node/abs-resource.js +76 -0
- package/dist/node/abs-resource.js.map +1 -0
- package/dist/node/dependencies.d.ts +1 -0
- package/dist/node/dependencies.d.ts.map +1 -0
- package/dist/node/dependencies.js +2 -0
- package/dist/node/dependencies.js.map +1 -0
- package/dist/node/index.d.ts +2 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +6 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/manifest-resource.d.ts +11 -0
- package/dist/node/manifest-resource.d.ts.map +1 -0
- package/dist/node/manifest-resource.js +19 -0
- package/dist/node/manifest-resource.js.map +1 -0
- package/dist/node/sub-resource.d.ts +8 -0
- package/dist/node/sub-resource.d.ts.map +1 -0
- package/dist/node/sub-resource.js +72 -0
- package/dist/node/sub-resource.js.map +1 -0
- package/dist/node/top-resource.d.ts +7 -0
- package/dist/node/top-resource.d.ts.map +1 -0
- package/dist/node/top-resource.js +8 -0
- package/dist/node/top-resource.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +5 -0
- package/dist/paths.js.map +1 -0
- package/dist/resources/configmap/configmap.d.ts +12 -0
- package/dist/resources/configmap/configmap.d.ts.map +1 -0
- package/dist/resources/configmap/configmap.js +79 -0
- package/dist/resources/configmap/configmap.js.map +1 -0
- package/dist/resources/configmap/index.d.ts +2 -0
- package/dist/resources/configmap/index.d.ts.map +1 -0
- package/dist/resources/configmap/index.js +18 -0
- package/dist/resources/configmap/index.js.map +1 -0
- package/dist/resources/deployment/deployment.d.ts +18 -0
- package/dist/resources/deployment/deployment.d.ts.map +1 -0
- package/dist/resources/deployment/deployment.js +99 -0
- package/dist/resources/deployment/deployment.js.map +1 -0
- package/dist/resources/deployment/index.d.ts +2 -0
- package/dist/resources/deployment/index.d.ts.map +1 -0
- package/dist/resources/deployment/index.js +18 -0
- package/dist/resources/deployment/index.js.map +1 -0
- package/dist/resources/http-route/http-route.d.ts +17 -0
- package/dist/resources/http-route/http-route.d.ts.map +1 -0
- package/dist/resources/http-route/http-route.js +93 -0
- package/dist/resources/http-route/http-route.js.map +1 -0
- package/dist/resources/http-route/index.d.ts +2 -0
- package/dist/resources/http-route/index.d.ts.map +1 -0
- package/dist/resources/http-route/index.js +18 -0
- package/dist/resources/http-route/index.js.map +1 -0
- package/dist/resources/index.d.ts +9 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +25 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/namespace/index.d.ts +2 -0
- package/dist/resources/namespace/index.d.ts.map +1 -0
- package/dist/resources/namespace/index.js +18 -0
- package/dist/resources/namespace/index.js.map +1 -0
- package/dist/resources/namespace/namespace.d.ts +13 -0
- package/dist/resources/namespace/namespace.d.ts.map +1 -0
- package/dist/resources/namespace/namespace.js +79 -0
- package/dist/resources/namespace/namespace.js.map +1 -0
- package/dist/resources/persistent/access-mode.d.ts +8 -0
- package/dist/resources/persistent/access-mode.d.ts.map +1 -0
- package/dist/resources/persistent/access-mode.js +29 -0
- package/dist/resources/persistent/access-mode.js.map +1 -0
- package/dist/resources/persistent/block-mode.d.ts +2 -0
- package/dist/resources/persistent/block-mode.d.ts.map +1 -0
- package/dist/resources/persistent/block-mode.js +3 -0
- package/dist/resources/persistent/block-mode.js.map +1 -0
- package/dist/resources/persistent/claim/index.d.ts +2 -0
- package/dist/resources/persistent/claim/index.d.ts.map +1 -0
- package/dist/resources/persistent/claim/index.js +18 -0
- package/dist/resources/persistent/claim/index.js.map +1 -0
- package/dist/resources/persistent/claim/pvc.d.ts +23 -0
- package/dist/resources/persistent/claim/pvc.d.ts.map +1 -0
- package/dist/resources/persistent/claim/pvc.js +99 -0
- package/dist/resources/persistent/claim/pvc.js.map +1 -0
- package/dist/resources/persistent/index.d.ts +11 -0
- package/dist/resources/persistent/index.d.ts.map +1 -0
- package/dist/resources/persistent/index.js +13 -0
- package/dist/resources/persistent/index.js.map +1 -0
- package/dist/resources/persistent/volume/backend.d.ts +13 -0
- package/dist/resources/persistent/volume/backend.d.ts.map +1 -0
- package/dist/resources/persistent/volume/backend.js +3 -0
- package/dist/resources/persistent/volume/backend.js.map +1 -0
- package/dist/resources/persistent/volume/index.d.ts +2 -0
- package/dist/resources/persistent/volume/index.d.ts.map +1 -0
- package/dist/resources/persistent/volume/index.js +18 -0
- package/dist/resources/persistent/volume/index.js.map +1 -0
- package/dist/resources/persistent/volume/parse-backend.d.ts +14 -0
- package/dist/resources/persistent/volume/parse-backend.d.ts.map +1 -0
- package/dist/resources/persistent/volume/parse-backend.js +26 -0
- package/dist/resources/persistent/volume/parse-backend.js.map +1 -0
- package/dist/resources/persistent/volume/pv.d.ts +26 -0
- package/dist/resources/persistent/volume/pv.d.ts.map +1 -0
- package/dist/resources/persistent/volume/pv.js +95 -0
- package/dist/resources/persistent/volume/pv.js.map +1 -0
- package/dist/resources/pod/container/container.d.ts +44 -0
- package/dist/resources/pod/container/container.d.ts.map +1 -0
- package/dist/resources/pod/container/container.js +156 -0
- package/dist/resources/pod/container/container.js.map +1 -0
- package/dist/resources/pod/container/index.d.ts +2 -0
- package/dist/resources/pod/container/index.d.ts.map +1 -0
- package/dist/resources/pod/container/index.js +18 -0
- package/dist/resources/pod/container/index.js.map +1 -0
- package/dist/resources/pod/container/mounts.d.ts +27 -0
- package/dist/resources/pod/container/mounts.d.ts.map +1 -0
- package/dist/resources/pod/container/mounts.js +40 -0
- package/dist/resources/pod/container/mounts.js.map +1 -0
- package/dist/resources/pod/index.d.ts +4 -0
- package/dist/resources/pod/index.d.ts.map +1 -0
- package/dist/resources/pod/index.js +20 -0
- package/dist/resources/pod/index.js.map +1 -0
- package/dist/resources/pod/pod-template.d.ts +29 -0
- package/dist/resources/pod/pod-template.d.ts.map +1 -0
- package/dist/resources/pod/pod-template.js +123 -0
- package/dist/resources/pod/pod-template.js.map +1 -0
- package/dist/resources/pod/volume/devices.d.ts +23 -0
- package/dist/resources/pod/volume/devices.d.ts.map +1 -0
- package/dist/resources/pod/volume/devices.js +94 -0
- package/dist/resources/pod/volume/devices.js.map +1 -0
- package/dist/resources/pod/volume/index.d.ts +4 -0
- package/dist/resources/pod/volume/index.d.ts.map +1 -0
- package/dist/resources/pod/volume/index.js +10 -0
- package/dist/resources/pod/volume/index.js.map +1 -0
- package/dist/resources/pod/volume/volumes.d.ts +30 -0
- package/dist/resources/pod/volume/volumes.d.ts.map +1 -0
- package/dist/resources/pod/volume/volumes.js +124 -0
- package/dist/resources/pod/volume/volumes.js.map +1 -0
- package/dist/resources/secret/index.d.ts +4 -0
- package/dist/resources/secret/index.d.ts.map +1 -0
- package/dist/resources/secret/index.js +39 -0
- package/dist/resources/secret/index.js.map +1 -0
- package/dist/resources/secret/secret.d.ts +9 -0
- package/dist/resources/secret/secret.d.ts.map +1 -0
- package/dist/resources/secret/secret.js +77 -0
- package/dist/resources/secret/secret.js.map +1 -0
- package/dist/resources/service/frontend.d.ts +11 -0
- package/dist/resources/service/frontend.d.ts.map +1 -0
- package/dist/resources/service/frontend.js +3 -0
- package/dist/resources/service/frontend.js.map +1 -0
- package/dist/resources/service/index.d.ts +2 -0
- package/dist/resources/service/index.d.ts.map +1 -0
- package/dist/resources/service/index.js +18 -0
- package/dist/resources/service/index.js.map +1 -0
- package/dist/resources/service/service-port.d.ts +19 -0
- package/dist/resources/service/service-port.d.ts.map +1 -0
- package/dist/resources/service/service-port.js +21 -0
- package/dist/resources/service/service-port.js.map +1 -0
- package/dist/resources/service/service.d.ts +21 -0
- package/dist/resources/service/service.d.ts.map +1 -0
- package/dist/resources/service/service.js +99 -0
- package/dist/resources/service/service.js.map +1 -0
- package/dist/resources/utils/adapters.d.ts +8 -0
- package/dist/resources/utils/adapters.d.ts.map +1 -0
- package/dist/resources/utils/adapters.js +38 -0
- package/dist/resources/utils/adapters.js.map +1 -0
- package/dist/runner/exporter/assembler.d.ts +50 -0
- package/dist/runner/exporter/assembler.d.ts.map +1 -0
- package/dist/runner/exporter/assembler.js +122 -0
- package/dist/runner/exporter/assembler.js.map +1 -0
- package/dist/runner/exporter/index.d.ts +3 -0
- package/dist/runner/exporter/index.d.ts.map +1 -0
- package/dist/runner/exporter/index.js +19 -0
- package/dist/runner/exporter/index.js.map +1 -0
- package/dist/runner/exporter/loader.d.ts +19 -0
- package/dist/runner/exporter/loader.d.ts.map +1 -0
- package/dist/runner/exporter/loader.js +47 -0
- package/dist/runner/exporter/loader.js.map +1 -0
- package/dist/runner/exporter/manifester.d.ts +21 -0
- package/dist/runner/exporter/manifester.d.ts.map +1 -0
- package/dist/runner/exporter/manifester.js +72 -0
- package/dist/runner/exporter/manifester.js.map +1 -0
- package/dist/runner/exporter/meta.d.ts +2 -0
- package/dist/runner/exporter/meta.d.ts.map +1 -0
- package/dist/runner/exporter/meta.js +5 -0
- package/dist/runner/exporter/meta.js.map +1 -0
- package/dist/runner/exporter/progress-shower.d.ts +11 -0
- package/dist/runner/exporter/progress-shower.d.ts.map +1 -0
- package/dist/runner/exporter/progress-shower.js +68 -0
- package/dist/runner/exporter/progress-shower.js.map +1 -0
- package/dist/runner/exporter/saver.d.ts +27 -0
- package/dist/runner/exporter/saver.d.ts.map +1 -0
- package/dist/runner/exporter/saver.js +49 -0
- package/dist/runner/exporter/saver.js.map +1 -0
- package/dist/runner/exporter/serializer.d.ts +18 -0
- package/dist/runner/exporter/serializer.d.ts.map +1 -0
- package/dist/runner/exporter/serializer.js +47 -0
- package/dist/runner/exporter/serializer.js.map +1 -0
- package/dist/runner/exporter/stage.d.ts +9 -0
- package/dist/runner/exporter/stage.d.ts.map +1 -0
- package/dist/runner/exporter/stage.js +94 -0
- package/dist/runner/exporter/stage.js.map +1 -0
- package/dist/runner/exporter/trace-embedder.d.ts +1 -0
- package/dist/runner/exporter/trace-embedder.d.ts.map +1 -0
- package/dist/runner/exporter/trace-embedder.js +2 -0
- package/dist/runner/exporter/trace-embedder.js.map +1 -0
- package/dist/runner/index.d.ts +2 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +18 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/proverbs.d.ts +1 -0
- package/dist/runner/proverbs.d.ts.map +1 -0
- package/dist/runner/proverbs.js +2 -0
- package/dist/runner/proverbs.js.map +1 -0
- package/dist/runner/runner.d.ts +13 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +51 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/runner/silly/proverbs.d.ts +7 -0
- package/dist/runner/silly/proverbs.d.ts.map +1 -0
- package/dist/runner/silly/proverbs.js +20 -0
- package/dist/runner/silly/proverbs.js.map +1 -0
- package/dist/runner/summarizer.d.ts +23 -0
- package/dist/runner/summarizer.d.ts.map +1 -0
- package/dist/runner/summarizer.js +115 -0
- package/dist/runner/summarizer.js.map +1 -0
- package/dist/src.tsbuildinfo +1 -0
- package/dist/test.tsbuildinfo +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/world/index.d.ts +2 -0
- package/dist/world/index.d.ts.map +1 -0
- package/dist/world/index.js +18 -0
- package/dist/world/index.js.map +1 -0
- package/dist/world/world.d.ts +28 -0
- package/dist/world/world.d.ts.map +1 -0
- package/dist/world/world.js +41 -0
- package/dist/world/world.js.map +1 -0
- package/package.json +106 -0
- package/proverbs.txt +23 -0
- package/src/_imports/_mix.ts +3 -0
- package/src/_imports/acme.cert-manager.io.ts +8202 -0
- package/src/_imports/gateway.networking.k8s.io.ts +12226 -0
- package/src/_imports/index.ts +2 -0
- package/src/_imports/k8s.ts +31028 -0
- package/src/_imports/tsconfig.json +22 -0
- package/src/api-versions.ts +5 -0
- package/src/error.ts +7 -0
- package/src/external/index.ts +34 -0
- package/src/file/exports.ts +63 -0
- package/src/file/factory.ts +150 -0
- package/src/file/file.ts +34 -0
- package/src/file/index.ts +1 -0
- package/src/file/origin.ts +38 -0
- package/src/index.ts +8 -0
- package/src/k8ts-sys-kind.ts +4 -0
- package/src/kind-map.ts +39 -0
- package/src/meta/k8ts-section.ts +6 -0
- package/src/node/abs-resource.ts +32 -0
- package/src/node/dependencies.ts +0 -0
- package/src/node/index.ts +1 -0
- package/src/node/manifest-resource.ts +19 -0
- package/src/node/sub-resource.ts +20 -0
- package/src/node/top-resource.ts +7 -0
- package/src/paths.ts +1 -0
- package/src/resources/configmap/configmap.ts +26 -0
- package/src/resources/configmap/index.ts +1 -0
- package/src/resources/deployment/deployment.ts +54 -0
- package/src/resources/deployment/index.ts +1 -0
- package/src/resources/http-route/http-route.ts +45 -0
- package/src/resources/http-route/index.ts +1 -0
- package/src/resources/index.ts +8 -0
- package/src/resources/namespace/index.ts +1 -0
- package/src/resources/namespace/namespace.ts +26 -0
- package/src/resources/persistent/access-mode.ts +29 -0
- package/src/resources/persistent/block-mode.ts +1 -0
- package/src/resources/persistent/claim/index.ts +1 -0
- package/src/resources/persistent/claim/pvc.ts +52 -0
- package/src/resources/persistent/index.ts +10 -0
- package/src/resources/persistent/volume/backend.ts +14 -0
- package/src/resources/persistent/volume/index.ts +1 -0
- package/src/resources/persistent/volume/parse-backend.ts +23 -0
- package/src/resources/persistent/volume/pv.ts +56 -0
- package/src/resources/pod/container/container.ts +137 -0
- package/src/resources/pod/container/index.ts +1 -0
- package/src/resources/pod/container/mounts.ts +45 -0
- package/src/resources/pod/index.ts +3 -0
- package/src/resources/pod/pod-template.ts +73 -0
- package/src/resources/pod/volume/devices.ts +50 -0
- package/src/resources/pod/volume/index.ts +3 -0
- package/src/resources/pod/volume/volumes.ts +90 -0
- package/src/resources/secret/index.ts +3 -0
- package/src/resources/secret/secret.ts +25 -0
- package/src/resources/service/frontend.ts +11 -0
- package/src/resources/service/index.ts +1 -0
- package/src/resources/service/service-port.ts +24 -0
- package/src/resources/service/service.ts +53 -0
- package/src/resources/utils/adapters.ts +36 -0
- package/src/runner/exporter/FILE xyz.md +47 -0
- package/src/runner/exporter/assembler.ts +170 -0
- package/src/runner/exporter/index.ts +2 -0
- package/src/runner/exporter/loader.ts +54 -0
- package/src/runner/exporter/manifester.ts +77 -0
- package/src/runner/exporter/meta.ts +1 -0
- package/src/runner/exporter/progress-shower.ts +77 -0
- package/src/runner/exporter/saver.ts +62 -0
- package/src/runner/exporter/serializer.ts +49 -0
- package/src/runner/exporter/stage.ts +36 -0
- package/src/runner/exporter/trace-embedder.ts +0 -0
- package/src/runner/index.ts +1 -0
- package/src/runner/proverbs.ts +0 -0
- package/src/runner/runner.ts +53 -0
- package/src/runner/silly/proverbs.ts +14 -0
- package/src/runner/summarizer.ts +133 -0
- package/src/tsconfig.json +16 -0
- package/src/version.ts +1 -0
- package/src/world/index.ts +1 -0
- package/src/world/world.ts +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./service"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Service } from "./service"
|
|
2
|
+
|
|
3
|
+
export type Port<Port extends string> = Port.Port<Port>
|
|
4
|
+
export namespace Port {
|
|
5
|
+
export interface Props<Port extends string> {
|
|
6
|
+
service: Service<Port>
|
|
7
|
+
port: Port
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class Port<Port extends string> {
|
|
11
|
+
constructor(
|
|
12
|
+
readonly service: Service<Port>,
|
|
13
|
+
readonly port: Port
|
|
14
|
+
) {}
|
|
15
|
+
|
|
16
|
+
ref() {
|
|
17
|
+
return {
|
|
18
|
+
kind: "Service",
|
|
19
|
+
namespace: this.service.meta.tryGet("namespace"),
|
|
20
|
+
name: this.service.meta.get("name")
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { manifest, relations, type InputPortMapping } from "@k8ts/instruments"
|
|
2
|
+
import { CDK } from "../../_imports"
|
|
3
|
+
import { v1 } from "../../api-versions"
|
|
4
|
+
import { k8ts } from "../../kind-map"
|
|
5
|
+
import { ManifestResource } from "../../node"
|
|
6
|
+
import type { Deployment } from "../deployment/deployment"
|
|
7
|
+
import { toServicePorts } from "../utils/adapters"
|
|
8
|
+
|
|
9
|
+
import { Frontend as Frontend_ } from "./frontend"
|
|
10
|
+
import { Port as Port_ } from "./service-port"
|
|
11
|
+
export type Service<Ports extends string> = Service.Service<Ports>
|
|
12
|
+
export namespace Service {
|
|
13
|
+
export import Port = Port_
|
|
14
|
+
export import Frontend = Frontend_
|
|
15
|
+
export interface Props<Ports extends string> {
|
|
16
|
+
ports: InputPortMapping<Ports>
|
|
17
|
+
backend: Deployment.Deployment<Ports>
|
|
18
|
+
frontend: Frontend
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const ident = v1.kind("Service")
|
|
22
|
+
@k8ts(ident)
|
|
23
|
+
@relations({
|
|
24
|
+
needs: self => ({
|
|
25
|
+
backend: self.props.backend
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
@manifest({
|
|
29
|
+
body(self): CDK.KubeServiceProps {
|
|
30
|
+
const svcPorts = self.ports
|
|
31
|
+
return {
|
|
32
|
+
spec: {
|
|
33
|
+
ports: toServicePorts(svcPorts).toArray(),
|
|
34
|
+
selector: self.props.backend.meta.pick("%app").labels,
|
|
35
|
+
...self.props.frontend
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
export class Service<Ports extends string = string> extends ManifestResource<Props<Ports>> {
|
|
41
|
+
kind = ident
|
|
42
|
+
|
|
43
|
+
get ports() {
|
|
44
|
+
const srcPorts = this.props.backend.ports.pull()
|
|
45
|
+
const svcPorts = srcPorts.map(this.props.ports)
|
|
46
|
+
return svcPorts
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
getPortRef(port: Ports) {
|
|
50
|
+
return new Port.Port(this, port)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { EnvBuilder, PortMap, PortMapEntry, PortSet, PortSetEntry } from "@k8ts/instruments"
|
|
2
|
+
import { CDK } from "../../_imports"
|
|
3
|
+
|
|
4
|
+
export function toContainerPort(entry: PortSetEntry): CDK.ContainerPort {
|
|
5
|
+
return {
|
|
6
|
+
containerPort: entry.port,
|
|
7
|
+
name: entry.name,
|
|
8
|
+
protocol: entry.protocol
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function toContainerPorts(ports: PortSet<any>) {
|
|
13
|
+
return ports.values.map(toContainerPort)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function toServicePort(entry: PortMapEntry): CDK.ServicePort {
|
|
17
|
+
return {
|
|
18
|
+
port: entry.source,
|
|
19
|
+
targetPort: CDK.IntOrString.fromNumber(entry.target),
|
|
20
|
+
protocol: entry.protocol,
|
|
21
|
+
name: entry.name
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function toServicePorts(ports: PortMap<any>) {
|
|
26
|
+
return ports.values.map(toServicePort).toList()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function toEnvVars(env: EnvBuilder) {
|
|
30
|
+
return env.values.map((x, key) => {
|
|
31
|
+
return {
|
|
32
|
+
name: key,
|
|
33
|
+
value: x
|
|
34
|
+
} as CDK.EnvVar
|
|
35
|
+
})
|
|
36
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
FILE xyz.yaml
|
|
2
|
+
|
|
3
|
+
Service _ ZZ
|
|
4
|
+
HttpRoute _ OtherThing
|
|
5
|
+
Gateway --> Gateway
|
|
6
|
+
Deployment _ ABC
|
|
7
|
+
PodTemplate _ (no name)
|
|
8
|
+
Volume _ Xyz
|
|
9
|
+
PVC --> AAA
|
|
10
|
+
Container _ z
|
|
11
|
+
Volume --> ABC : /mnt/data
|
|
12
|
+
Container \* y
|
|
13
|
+
Volume --> ABC : /mnt/data
|
|
14
|
+
|
|
15
|
+
Service/X: - @Deployment/AAA
|
|
16
|
+
HttpRoute/X: - @Service/X
|
|
17
|
+
Deployment/X:
|
|
18
|
+
PodTemplate:
|
|
19
|
+
Container/XYZ: - Own/Thing: 222 - /mnt/data --> Volume/ABC -
|
|
20
|
+
|
|
21
|
+
Container/
|
|
22
|
+
- /mnt/b: @Volume/ABC
|
|
23
|
+
Volume:
|
|
24
|
+
- A:
|
|
25
|
+
- @Claim/AAA
|
|
26
|
+
- B:
|
|
27
|
+
- @Claim/XYZ
|
|
28
|
+
|
|
29
|
+
Claim/AAA:
|
|
30
|
+
|
|
31
|
+
- @Deployment/ABC
|
|
32
|
+
|
|
33
|
+
---> BackThing/Hello (backend) \* ABC/AYZ
|
|
34
|
+
---> OtherThing/Goodbye (service)
|
|
35
|
+
|
|
36
|
+
- Deployment/ ABC [app=x]
|
|
37
|
+
- - PodTemplate [app=x]
|
|
38
|
+
- * Container/ XYZ
|
|
39
|
+
--> Volume/ Xyz : /mnt/data
|
|
40
|
+
|
|
41
|
+
* Volume A
|
|
42
|
+
--> AAA [PersistentVolumeClaim]
|
|
43
|
+
|
|
44
|
+
- @ N
|
|
45
|
+
- @ Name 3/
|
|
46
|
+
- * xtz
|
|
47
|
+
- * abc
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { BaseManifest, Origin, ResourceNode } from "@k8ts/instruments"
|
|
2
|
+
import { Meta } from "@k8ts/metadata"
|
|
3
|
+
import { aseq } from "doddle"
|
|
4
|
+
import Emittery from "emittery"
|
|
5
|
+
import { cloneDeep } from "lodash"
|
|
6
|
+
import type { File } from "../../file"
|
|
7
|
+
import { ResourceLoader, type ResourceLoaderEventsTable } from "./loader"
|
|
8
|
+
import { Manifester, type ManifesterEventsTable } from "./manifester"
|
|
9
|
+
import { ManifestSaver, type ManifestSaverEventsTable } from "./saver"
|
|
10
|
+
import { YamlSerializer, type YamlSerializerEventsTable } from "./serializer"
|
|
11
|
+
|
|
12
|
+
export class Assembler extends Emittery<AssemblerEventsTable> {
|
|
13
|
+
constructor(private readonly _options: AssemblerOptions) {
|
|
14
|
+
super()
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async assemble(inFiles: Iterable<File.Input>) {
|
|
18
|
+
const _emit = async <Name extends keyof AssemblerEventsTable>(
|
|
19
|
+
event: Name,
|
|
20
|
+
payload: AssemblerEventsTable[Name]
|
|
21
|
+
) => {
|
|
22
|
+
return await this.emit(event, payload)
|
|
23
|
+
}
|
|
24
|
+
const loader = new ResourceLoader({})
|
|
25
|
+
loader.onAny(_emit)
|
|
26
|
+
const generator = new Manifester({
|
|
27
|
+
cwd: this._options.cwd
|
|
28
|
+
})
|
|
29
|
+
generator.onAny(_emit)
|
|
30
|
+
const serializer = new YamlSerializer({})
|
|
31
|
+
serializer.onAny(_emit)
|
|
32
|
+
const saver = new ManifestSaver({
|
|
33
|
+
outdir: this._options.outdir
|
|
34
|
+
})
|
|
35
|
+
saver.onAny(_emit)
|
|
36
|
+
const reports = aseq(inFiles)
|
|
37
|
+
.before(async () => {
|
|
38
|
+
await _emit("stage", { stage: "gathering" })
|
|
39
|
+
})
|
|
40
|
+
.each(async file => {
|
|
41
|
+
await _emit("received-file", { file: file.__node__ })
|
|
42
|
+
})
|
|
43
|
+
.after(async () => {
|
|
44
|
+
await _emit("stage", { stage: "loading" })
|
|
45
|
+
})
|
|
46
|
+
.collect()
|
|
47
|
+
.map(async file => {
|
|
48
|
+
const loaded = await loader.load(file)
|
|
49
|
+
loaded.forEach(r => r.meta!.add(this._options.meta))
|
|
50
|
+
return {
|
|
51
|
+
file: file.__entity__,
|
|
52
|
+
resources: loaded.filter(x => !x.isExternal)
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
.after(async () => {
|
|
56
|
+
await _emit("stage", { stage: "manifesting" })
|
|
57
|
+
})
|
|
58
|
+
.collect()
|
|
59
|
+
.map(async ({ file, resources }) => {
|
|
60
|
+
const manifests = await aseq(resources)
|
|
61
|
+
.map(async resource => {
|
|
62
|
+
return {
|
|
63
|
+
k8ts: resource,
|
|
64
|
+
manifest: await generator.generate(resource)
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
.toArray()
|
|
68
|
+
.pull()
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
file,
|
|
72
|
+
manifests
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
.after(async () => {
|
|
76
|
+
await _emit("stage", { stage: "serializing" })
|
|
77
|
+
})
|
|
78
|
+
.collect()
|
|
79
|
+
.map(async ({ file, manifests }) => {
|
|
80
|
+
const artifacts = await aseq(manifests)
|
|
81
|
+
.map(async obj => {
|
|
82
|
+
return {
|
|
83
|
+
...obj,
|
|
84
|
+
yaml: await serializer.serialize(obj.manifest)
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
.toArray()
|
|
88
|
+
.pull()
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
file,
|
|
92
|
+
artifacts
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
.after(async () => {
|
|
96
|
+
await _emit("stage", { stage: "saving" })
|
|
97
|
+
})
|
|
98
|
+
.after(async () => {
|
|
99
|
+
await saver.prepareOnce()
|
|
100
|
+
})
|
|
101
|
+
.collect()
|
|
102
|
+
.map(async ({ file, artifacts }) => {
|
|
103
|
+
const { filename, bytes, path } = await saver.save(
|
|
104
|
+
file.node,
|
|
105
|
+
artifacts.map(x => x.yaml)
|
|
106
|
+
)
|
|
107
|
+
return {
|
|
108
|
+
file: file.node,
|
|
109
|
+
path,
|
|
110
|
+
filename,
|
|
111
|
+
bytes,
|
|
112
|
+
artifacts
|
|
113
|
+
}
|
|
114
|
+
})
|
|
115
|
+
.after(async () => {
|
|
116
|
+
await _emit("stage", { stage: "done" })
|
|
117
|
+
})
|
|
118
|
+
.collect()
|
|
119
|
+
.toArray()
|
|
120
|
+
const files = (await reports.pull()) satisfies AssembledFile[]
|
|
121
|
+
return {
|
|
122
|
+
files,
|
|
123
|
+
options: cloneDeep(this._options)
|
|
124
|
+
} as AssembledResult
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export interface Artifact {
|
|
128
|
+
k8ts: ResourceNode
|
|
129
|
+
manifest: BaseManifest
|
|
130
|
+
yaml: string
|
|
131
|
+
}
|
|
132
|
+
export interface AssembledFile {
|
|
133
|
+
file: Origin
|
|
134
|
+
path: string
|
|
135
|
+
filename: string
|
|
136
|
+
bytes: number
|
|
137
|
+
artifacts: Artifact[]
|
|
138
|
+
}
|
|
139
|
+
export interface AssembledResult {
|
|
140
|
+
files: AssembledFile[]
|
|
141
|
+
options: AssemblerOptions
|
|
142
|
+
}
|
|
143
|
+
export interface AssemblerOptions {
|
|
144
|
+
cwd?: string
|
|
145
|
+
printOptions?: boolean
|
|
146
|
+
outdir: string
|
|
147
|
+
meta?: Omit<Meta.Input, "name" | "namespace"> | Meta
|
|
148
|
+
}
|
|
149
|
+
export type AssemblyStage =
|
|
150
|
+
| "loading"
|
|
151
|
+
| "manifesting"
|
|
152
|
+
| "serializing"
|
|
153
|
+
| "saving"
|
|
154
|
+
| "start"
|
|
155
|
+
| "reporting"
|
|
156
|
+
| "done"
|
|
157
|
+
| "gathering"
|
|
158
|
+
export interface AssemblerEventsTable
|
|
159
|
+
extends ManifestSaverEventsTable,
|
|
160
|
+
YamlSerializerEventsTable,
|
|
161
|
+
ManifesterEventsTable,
|
|
162
|
+
ResourceLoaderEventsTable {
|
|
163
|
+
["received-file"]: { file: Origin }
|
|
164
|
+
["stage"]: { stage: AssemblyStage }
|
|
165
|
+
}
|
|
166
|
+
export type AnyAssemblerEvent = {
|
|
167
|
+
[K in keyof AssemblerEventsTable]: AssemblerEventsTable[K] & {
|
|
168
|
+
type: K
|
|
169
|
+
}
|
|
170
|
+
}[keyof AssemblerEventsTable]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ForwardRef, ResourceNode } from "@k8ts/instruments"
|
|
2
|
+
import { seq } from "doddle"
|
|
3
|
+
import Emittery from "emittery"
|
|
4
|
+
import { List } from "immutable"
|
|
5
|
+
import { MakeError } from "../../error"
|
|
6
|
+
import type { File } from "../../file"
|
|
7
|
+
import { k8ts_namespace } from "./meta"
|
|
8
|
+
export class ResourceLoader extends Emittery<ResourceLoaderEventsTable> {
|
|
9
|
+
constructor(private readonly _options: ResourceLoaderOptions) {
|
|
10
|
+
super()
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
private _attachSourceAnnotations(loadEvent: ResourceLoadedEvent) {
|
|
14
|
+
const { resource } = loadEvent
|
|
15
|
+
|
|
16
|
+
resource.meta!.add(k8ts_namespace, {
|
|
17
|
+
"^declared-in": `(${resource.origin.root.name}) ${resource.origin.name}`
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async load(input: File.Input) {
|
|
22
|
+
let resources = List<ResourceNode>()
|
|
23
|
+
seq(input).drain().pull()
|
|
24
|
+
for (let res of input.__node__.resources) {
|
|
25
|
+
const origin = res.origin
|
|
26
|
+
if (!origin.isChildOf(origin)) {
|
|
27
|
+
throw new MakeError(`Resource ${res} is not a child of the input file ${input}`)
|
|
28
|
+
}
|
|
29
|
+
if (ForwardRef.is(res)) {
|
|
30
|
+
throw new MakeError(`Resource ${res} is a forward reference`)
|
|
31
|
+
}
|
|
32
|
+
const event = {
|
|
33
|
+
isExported: res.meta!.has(`#${k8ts_namespace}is-exported`),
|
|
34
|
+
resource: res
|
|
35
|
+
} as const
|
|
36
|
+
|
|
37
|
+
this._attachSourceAnnotations(event)
|
|
38
|
+
await this.emit("load", event)
|
|
39
|
+
resources = resources.push(res)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return resources.toArray()
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export interface ResourceLoadedEvent {
|
|
46
|
+
isExported: boolean
|
|
47
|
+
resource: ResourceNode
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ResourceLoaderEventsTable {
|
|
51
|
+
load: ResourceLoadedEvent
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface ResourceLoaderOptions {}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { BaseManifest, ResourceNode, TraceEmbedder } from "@k8ts/instruments"
|
|
2
|
+
import Emittery from "emittery"
|
|
3
|
+
import { cloneDeep, cloneDeepWith, isEmpty, unset } from "lodash"
|
|
4
|
+
import { ManifestResource } from "../../node"
|
|
5
|
+
import { version } from "../../version"
|
|
6
|
+
import { k8ts_namespace } from "./meta"
|
|
7
|
+
export interface ManifesterOptions {
|
|
8
|
+
cwd?: string
|
|
9
|
+
}
|
|
10
|
+
export class Manifester extends Emittery<ManifesterEventsTable> {
|
|
11
|
+
constructor(private readonly _options: ManifesterOptions) {
|
|
12
|
+
super()
|
|
13
|
+
}
|
|
14
|
+
private _cleanSpecificEmptyObjects(manifest: BaseManifest) {
|
|
15
|
+
const clone = cloneDeepWith(manifest, (value, key) => {
|
|
16
|
+
if (key !== "metadata") {
|
|
17
|
+
return
|
|
18
|
+
}
|
|
19
|
+
for (const k in value) {
|
|
20
|
+
if (["labels", "annotations"].includes(k)) {
|
|
21
|
+
if (isEmpty(value[k])) {
|
|
22
|
+
unset(value, k)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
return clone
|
|
28
|
+
}
|
|
29
|
+
private _cleanNullishValues(manifest: BaseManifest) {
|
|
30
|
+
const _cleanKeys = (obj: any) => {
|
|
31
|
+
if (typeof obj !== "object") {
|
|
32
|
+
return obj
|
|
33
|
+
}
|
|
34
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
35
|
+
if (v == null) {
|
|
36
|
+
delete obj[k]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return undefined
|
|
40
|
+
}
|
|
41
|
+
const clone = cloneDeep(manifest)
|
|
42
|
+
|
|
43
|
+
return cloneDeepWith(clone, _cleanKeys)
|
|
44
|
+
}
|
|
45
|
+
private _generate(resource: ManifestResource): BaseManifest {
|
|
46
|
+
const manifest = resource["manifest"]()
|
|
47
|
+
const noNullish = this._cleanNullishValues(manifest)
|
|
48
|
+
const noEmpty = this._cleanSpecificEmptyObjects(noNullish)
|
|
49
|
+
return noEmpty
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private _attachProductionAnnotations(resource: ResourceNode) {
|
|
53
|
+
const origin = resource.origin
|
|
54
|
+
const entry = TraceEmbedder.get(resource)
|
|
55
|
+
const loc = resource.trace.format({
|
|
56
|
+
cwd: this._options.cwd
|
|
57
|
+
})
|
|
58
|
+
resource.meta!.add(k8ts_namespace, {
|
|
59
|
+
"^constructed-at": loc,
|
|
60
|
+
"^produced-by": `k8ts@${version}`
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async generate(res: ResourceNode) {
|
|
65
|
+
this._attachProductionAnnotations(res)
|
|
66
|
+
await this.emit("manifest", { resource: res })
|
|
67
|
+
const manifest = this._generate(res.entity as ManifestResource)
|
|
68
|
+
return manifest
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export interface ManifesterManifestEvent {
|
|
72
|
+
resource: ResourceNode
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface ManifesterEventsTable {
|
|
76
|
+
manifest: ManifesterManifestEvent
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const k8ts_namespace = "k8ts.org/" as const
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { attr, dest, ManifestSourceEmbedder, pretty, quantity, verb } from "@k8ts/instruments"
|
|
2
|
+
import ora from "ora"
|
|
3
|
+
import { setTimeout } from "timers/promises"
|
|
4
|
+
import type { Assembler, AssemblerEventsTable, AssemblyStage } from "./assembler"
|
|
5
|
+
import { stage } from "./stage"
|
|
6
|
+
export interface ProgressOptions {
|
|
7
|
+
waitTransition?: number
|
|
8
|
+
debug?: boolean
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function typedOnAny(
|
|
12
|
+
target: Assembler,
|
|
13
|
+
handler: (
|
|
14
|
+
typedEvent: {
|
|
15
|
+
[K in keyof AssemblerEventsTable]: AssemblerEventsTable[K] & { type: K }
|
|
16
|
+
}[keyof AssemblerEventsTable]
|
|
17
|
+
) => void | Promise<void>
|
|
18
|
+
) {
|
|
19
|
+
return target.onAny((name, ev) => {
|
|
20
|
+
return handler({ ...ev, type: name } as any)
|
|
21
|
+
})
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class ProgressShower {
|
|
25
|
+
constructor(private readonly _options: ProgressOptions) {}
|
|
26
|
+
async visualize(events: Assembler) {
|
|
27
|
+
const spinner = ora({
|
|
28
|
+
spinner: "dots",
|
|
29
|
+
text: "K8ts is getting ready..."
|
|
30
|
+
})
|
|
31
|
+
spinner.text = "abc"
|
|
32
|
+
let filesWritten = 0
|
|
33
|
+
let lastStage: AssemblyStage = "start"
|
|
34
|
+
const unsub = typedOnAny(events, async event => {
|
|
35
|
+
switch (event.type) {
|
|
36
|
+
case "load":
|
|
37
|
+
spinner.text = pretty`${verb("Load")} ${attr(
|
|
38
|
+
event.isExported ? "exported" : ""
|
|
39
|
+
)} ${event.resource} `
|
|
40
|
+
break
|
|
41
|
+
case "stage":
|
|
42
|
+
if (event.stage !== "done") {
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
spinner.text = pretty`${stage(event.stage)}`
|
|
46
|
+
break
|
|
47
|
+
case "received-file":
|
|
48
|
+
spinner.text = pretty`${verb("Receive")} ${event.file}`
|
|
49
|
+
break
|
|
50
|
+
case "serialize":
|
|
51
|
+
const rsc = ManifestSourceEmbedder.get(event.manifest)
|
|
52
|
+
spinner.text = pretty`${verb("Serialize")} ${rsc}`
|
|
53
|
+
break
|
|
54
|
+
case "save":
|
|
55
|
+
spinner.text = pretty`${verb("Save")} ${dest(event.filename)} (${quantity(event.bytes, "byte")})`
|
|
56
|
+
break
|
|
57
|
+
|
|
58
|
+
case "manifest":
|
|
59
|
+
spinner.text = pretty`${verb("Manifest")} ${event.resource}`
|
|
60
|
+
break
|
|
61
|
+
case "purge":
|
|
62
|
+
spinner.text = pretty`${verb("Purge")} ${dest(event.outdir)}`
|
|
63
|
+
break
|
|
64
|
+
}
|
|
65
|
+
if (this._options.waitTransition) {
|
|
66
|
+
await setTimeout(this._options.waitTransition)
|
|
67
|
+
}
|
|
68
|
+
spinner.render()
|
|
69
|
+
|
|
70
|
+
if (this._options.debug) {
|
|
71
|
+
console.log()
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
spinner.render()
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Origin } from "@k8ts/instruments"
|
|
2
|
+
import Emittery from "emittery"
|
|
3
|
+
import { mkdir, rm, writeFile } from "fs/promises"
|
|
4
|
+
import { join, resolve } from "path"
|
|
5
|
+
|
|
6
|
+
export class ManifestSaver extends Emittery<ManifestSaverEventsTable> {
|
|
7
|
+
private _encoder = new TextEncoder()
|
|
8
|
+
constructor(private readonly _options: ManifestSaverOptions) {
|
|
9
|
+
super()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
_splat(manifests: string[]) {
|
|
13
|
+
return manifests.join("\n---\n")
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async prepareOnce() {
|
|
17
|
+
await this.emit("purge", {
|
|
18
|
+
outdir: this._options.outdir
|
|
19
|
+
})
|
|
20
|
+
await rm(this._options.outdir, {
|
|
21
|
+
force: true,
|
|
22
|
+
maxRetries: 2,
|
|
23
|
+
retryDelay: 500,
|
|
24
|
+
recursive: true
|
|
25
|
+
})
|
|
26
|
+
await mkdir(this._options.outdir, { recursive: true })
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async save(origin: Origin, manifests: string[]) {
|
|
30
|
+
const content = this._splat(manifests)
|
|
31
|
+
const filename = `${origin.name}`
|
|
32
|
+
const encoded = this._encoder.encode(content)
|
|
33
|
+
const outPath = resolve(this._options.outdir, filename)
|
|
34
|
+
const e: SavingManifestEvent = {
|
|
35
|
+
filename,
|
|
36
|
+
path: outPath,
|
|
37
|
+
content: content,
|
|
38
|
+
bytes: encoded.byteLength
|
|
39
|
+
}
|
|
40
|
+
await this.emit("save", e)
|
|
41
|
+
await mkdir(this._options.outdir, { recursive: true })
|
|
42
|
+
await writeFile(join(this._options.outdir, filename), encoded)
|
|
43
|
+
return e
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export interface SavingManifestEvent {
|
|
47
|
+
path: string
|
|
48
|
+
filename: string
|
|
49
|
+
content: string
|
|
50
|
+
bytes: number
|
|
51
|
+
}
|
|
52
|
+
export interface PurgingDirEvent {
|
|
53
|
+
outdir: string
|
|
54
|
+
}
|
|
55
|
+
export interface ManifestSaverEventsTable {
|
|
56
|
+
save: SavingManifestEvent
|
|
57
|
+
purge: PurgingDirEvent
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface ManifestSaverOptions {
|
|
61
|
+
outdir: string
|
|
62
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BaseManifest, ManifestSourceEmbedder } from "@k8ts/instruments"
|
|
2
|
+
import Emittery from "emittery"
|
|
3
|
+
import { dump, type DumpOptions } from "js-yaml"
|
|
4
|
+
import { CDK } from "../../_imports"
|
|
5
|
+
import { MakeError } from "../../error"
|
|
6
|
+
|
|
7
|
+
export interface YamlSerializerOptions {
|
|
8
|
+
jsYamlOptions: DumpOptions
|
|
9
|
+
}
|
|
10
|
+
export interface SerializingEvent {
|
|
11
|
+
manifest: BaseManifest
|
|
12
|
+
}
|
|
13
|
+
export interface YamlSerializerEventsTable {
|
|
14
|
+
serialize: SerializingEvent
|
|
15
|
+
}
|
|
16
|
+
export class YamlSerializer extends Emittery<YamlSerializerEventsTable> {
|
|
17
|
+
constructor(private readonly _options: Partial<YamlSerializerOptions>) {
|
|
18
|
+
super()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async serialize(input: BaseManifest) {
|
|
22
|
+
await this.emit("serialize", { manifest: input })
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const result = dump(input, {
|
|
26
|
+
lineWidth: 800,
|
|
27
|
+
noArrayIndent: true,
|
|
28
|
+
indent: 2,
|
|
29
|
+
replacer(key, value) {
|
|
30
|
+
if (value instanceof CDK.IntOrString) {
|
|
31
|
+
return value.value
|
|
32
|
+
}
|
|
33
|
+
if (value instanceof CDK.Quantity) {
|
|
34
|
+
return value.value
|
|
35
|
+
}
|
|
36
|
+
return value
|
|
37
|
+
},
|
|
38
|
+
...this._options.jsYamlOptions,
|
|
39
|
+
noRefs: true
|
|
40
|
+
})
|
|
41
|
+
return result
|
|
42
|
+
} catch (err) {
|
|
43
|
+
const resource = ManifestSourceEmbedder.get(input)
|
|
44
|
+
throw new MakeError(`Failed to serialize manifest ${resource?.shortFqn ?? "???"}`, {
|
|
45
|
+
cause: err
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|