@gezelligate/core 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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/bridgeManifest.d.ts +67 -0
  4. package/dist/bridgeManifest.d.ts.map +1 -0
  5. package/dist/bridgeManifest.js +35 -0
  6. package/dist/bridgeManifest.js.map +1 -0
  7. package/dist/capabilities.d.ts +23 -0
  8. package/dist/capabilities.d.ts.map +1 -0
  9. package/dist/capabilities.js +15 -0
  10. package/dist/capabilities.js.map +1 -0
  11. package/dist/catalog/bootstrap.d.ts +25 -0
  12. package/dist/catalog/bootstrap.d.ts.map +1 -0
  13. package/dist/catalog/bootstrap.js +56 -0
  14. package/dist/catalog/bootstrap.js.map +1 -0
  15. package/dist/catalog/index.d.ts +4 -0
  16. package/dist/catalog/index.d.ts.map +1 -0
  17. package/dist/catalog/index.js +4 -0
  18. package/dist/catalog/index.js.map +1 -0
  19. package/dist/catalog/projectPin.d.ts +22 -0
  20. package/dist/catalog/projectPin.d.ts.map +1 -0
  21. package/dist/catalog/projectPin.js +39 -0
  22. package/dist/catalog/projectPin.js.map +1 -0
  23. package/dist/catalog/reader.d.ts +44 -0
  24. package/dist/catalog/reader.d.ts.map +1 -0
  25. package/dist/catalog/reader.js +7 -0
  26. package/dist/catalog/reader.js.map +1 -0
  27. package/dist/catalog/tarball.d.ts +48 -0
  28. package/dist/catalog/tarball.d.ts.map +1 -0
  29. package/dist/catalog/tarball.js +114 -0
  30. package/dist/catalog/tarball.js.map +1 -0
  31. package/dist/cluster.d.ts +4 -0
  32. package/dist/cluster.d.ts.map +1 -0
  33. package/dist/cluster.js +46 -0
  34. package/dist/cluster.js.map +1 -0
  35. package/dist/dedicatedPeer.d.ts +43 -0
  36. package/dist/dedicatedPeer.d.ts.map +1 -0
  37. package/dist/dedicatedPeer.js +38 -0
  38. package/dist/dedicatedPeer.js.map +1 -0
  39. package/dist/dependencies.d.ts +6 -0
  40. package/dist/dependencies.d.ts.map +1 -0
  41. package/dist/dependencies.js +124 -0
  42. package/dist/dependencies.js.map +1 -0
  43. package/dist/index.d.ts +15 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +17 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/ingress.d.ts +4 -0
  48. package/dist/ingress.d.ts.map +1 -0
  49. package/dist/ingress.js +17 -0
  50. package/dist/ingress.js.map +1 -0
  51. package/dist/keycloak.d.ts +61 -0
  52. package/dist/keycloak.d.ts.map +1 -0
  53. package/dist/keycloak.js +161 -0
  54. package/dist/keycloak.js.map +1 -0
  55. package/dist/numericId.d.ts +2 -0
  56. package/dist/numericId.d.ts.map +1 -0
  57. package/dist/numericId.js +22 -0
  58. package/dist/numericId.js.map +1 -0
  59. package/dist/providers/lifecycle.d.ts +81 -0
  60. package/dist/providers/lifecycle.d.ts.map +1 -0
  61. package/dist/providers/lifecycle.js +22 -0
  62. package/dist/providers/lifecycle.js.map +1 -0
  63. package/dist/providers.d.ts +4 -0
  64. package/dist/providers.d.ts.map +1 -0
  65. package/dist/providers.js +45 -0
  66. package/dist/providers.js.map +1 -0
  67. package/dist/render.d.ts +22 -0
  68. package/dist/render.d.ts.map +1 -0
  69. package/dist/render.js +354 -0
  70. package/dist/render.js.map +1 -0
  71. package/dist/repository.d.ts +4 -0
  72. package/dist/repository.d.ts.map +1 -0
  73. package/dist/repository.js +31 -0
  74. package/dist/repository.js.map +1 -0
  75. package/dist/schema/clusterYaml.d.ts +39 -0
  76. package/dist/schema/clusterYaml.d.ts.map +1 -0
  77. package/dist/schema/clusterYaml.js +24 -0
  78. package/dist/schema/clusterYaml.js.map +1 -0
  79. package/dist/schema/configYaml.d.ts +90 -0
  80. package/dist/schema/configYaml.d.ts.map +1 -0
  81. package/dist/schema/configYaml.js +32 -0
  82. package/dist/schema/configYaml.js.map +1 -0
  83. package/dist/schema/providerYaml.d.ts +312 -0
  84. package/dist/schema/providerYaml.d.ts.map +1 -0
  85. package/dist/schema/providerYaml.js +54 -0
  86. package/dist/schema/providerYaml.js.map +1 -0
  87. package/dist/schema/serviceYaml.d.ts +2407 -0
  88. package/dist/schema/serviceYaml.d.ts.map +1 -0
  89. package/dist/schema/serviceYaml.js +200 -0
  90. package/dist/schema/serviceYaml.js.map +1 -0
  91. package/dist/secrets.d.ts +4 -0
  92. package/dist/secrets.d.ts.map +1 -0
  93. package/dist/secrets.js +31 -0
  94. package/dist/secrets.js.map +1 -0
  95. package/dist/secretsSummary.d.ts +2 -0
  96. package/dist/secretsSummary.d.ts.map +1 -0
  97. package/dist/secretsSummary.js +50 -0
  98. package/dist/secretsSummary.js.map +1 -0
  99. package/dist/services.d.ts +7 -0
  100. package/dist/services.d.ts.map +1 -0
  101. package/dist/services.js +66 -0
  102. package/dist/services.js.map +1 -0
  103. package/dist/sharedDb.d.ts +3 -0
  104. package/dist/sharedDb.d.ts.map +1 -0
  105. package/dist/sharedDb.js +104 -0
  106. package/dist/sharedDb.js.map +1 -0
  107. package/dist/target.d.ts +35 -0
  108. package/dist/target.d.ts.map +1 -0
  109. package/dist/target.js +7 -0
  110. package/dist/target.js.map +1 -0
  111. package/dist/templates/dedicated-postgres.docker.yaml.tmpl +12 -0
  112. package/dist/templates/dedicated-postgres.k8s.yaml.tmpl +57 -0
  113. package/dist/templates/dedicated-redis.docker.yaml.tmpl +9 -0
  114. package/dist/templates/dedicated-redis.k8s.yaml.tmpl +46 -0
  115. package/dist/templating.d.ts +2 -0
  116. package/dist/templating.d.ts.map +1 -0
  117. package/dist/templating.js +15 -0
  118. package/dist/templating.js.map +1 -0
  119. package/package.json +65 -0
@@ -0,0 +1,31 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import yaml from "js-yaml";
4
+ import { ServiceYamlSchema } from "./schema/serviceYaml.js";
5
+ export async function loadRepository(rootDir) {
6
+ const entries = await fs.readdir(rootDir, { withFileTypes: true });
7
+ const dirs = entries.filter((e) => e.isDirectory());
8
+ const repo = new Map();
9
+ for (const dir of dirs) {
10
+ const yamlPath = path.join(rootDir, dir.name, "service.yaml");
11
+ let raw;
12
+ try {
13
+ raw = await fs.readFile(yamlPath, "utf8");
14
+ }
15
+ catch {
16
+ // Directory has no service.yaml — not a service entry (e.g. cluster/). Skip it.
17
+ continue;
18
+ }
19
+ const parsed = yaml.load(raw);
20
+ const result = ServiceYamlSchema.safeParse(parsed);
21
+ if (!result.success) {
22
+ throw new Error(`Invalid service.yaml for ${dir.name}: ${result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")}`);
23
+ }
24
+ if (result.data.name !== dir.name) {
25
+ throw new Error(`Service name "${result.data.name}" does not match directory "${dir.name}"`);
26
+ }
27
+ repo.set(result.data.name, result.data);
28
+ }
29
+ return repo;
30
+ }
31
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAoB,MAAM,yBAAyB,CAAC;AAI9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAe,IAAI,GAAG,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,gFAAgF;YAChF,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,4BAA4B,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1H,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,IAAI,+BAA+B,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Generic cluster configuration. The engine never reads provider-specific
4
+ * fields directly — each provider's lifecycle module is responsible for
5
+ * mapping credentials/geography to whatever tofu / API call it needs.
6
+ *
7
+ * `controlPlaneType` is optional because providers with a managed control
8
+ * plane (e.g. Scaleway Kapsule) do not let the user pick a node type for
9
+ * it — the provider manifest declares `controlPlane: { mode: "managed",
10
+ * typeId: ... }` and the engine falls back to the manifest's typeId.
11
+ *
12
+ * `credentials` is intentionally loose at this layer. The server's PUT
13
+ * /api/cluster route validates each credential field against the provider
14
+ * manifest's `credentials` form-field schema before persisting.
15
+ */
16
+ export declare const ClusterYamlSchema: z.ZodObject<{
17
+ provider: z.ZodString;
18
+ geography: z.ZodString;
19
+ controlPlaneType: z.ZodOptional<z.ZodString>;
20
+ nodePoolType: z.ZodString;
21
+ nodeCount: z.ZodNumber;
22
+ credentials: z.ZodRecord<z.ZodString, z.ZodString>;
23
+ }, "strip", z.ZodTypeAny, {
24
+ provider: string;
25
+ geography: string;
26
+ nodePoolType: string;
27
+ nodeCount: number;
28
+ credentials: Record<string, string>;
29
+ controlPlaneType?: string | undefined;
30
+ }, {
31
+ provider: string;
32
+ geography: string;
33
+ nodePoolType: string;
34
+ nodeCount: number;
35
+ credentials: Record<string, string>;
36
+ controlPlaneType?: string | undefined;
37
+ }>;
38
+ export type ClusterYaml = z.infer<typeof ClusterYamlSchema>;
39
+ //# sourceMappingURL=clusterYaml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clusterYaml.d.ts","sourceRoot":"","sources":["../../src/schema/clusterYaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;EAO5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Generic cluster configuration. The engine never reads provider-specific
4
+ * fields directly — each provider's lifecycle module is responsible for
5
+ * mapping credentials/geography to whatever tofu / API call it needs.
6
+ *
7
+ * `controlPlaneType` is optional because providers with a managed control
8
+ * plane (e.g. Scaleway Kapsule) do not let the user pick a node type for
9
+ * it — the provider manifest declares `controlPlane: { mode: "managed",
10
+ * typeId: ... }` and the engine falls back to the manifest's typeId.
11
+ *
12
+ * `credentials` is intentionally loose at this layer. The server's PUT
13
+ * /api/cluster route validates each credential field against the provider
14
+ * manifest's `credentials` form-field schema before persisting.
15
+ */
16
+ export const ClusterYamlSchema = z.object({
17
+ provider: z.string().min(1),
18
+ geography: z.string().min(1),
19
+ controlPlaneType: z.string().min(1).optional(),
20
+ nodePoolType: z.string().min(1),
21
+ nodeCount: z.number().int().min(0).max(50),
22
+ credentials: z.record(z.string())
23
+ });
24
+ //# sourceMappingURL=clusterYaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clusterYaml.js","sourceRoot":"","sources":["../../src/schema/clusterYaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAClC,CAAC,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { z } from "zod";
2
+ export declare const GlobalConfigSchema: z.ZodEffects<z.ZodObject<{
3
+ target: z.ZodEnum<["docker", "kubernetes", "both"]>;
4
+ mode: z.ZodEnum<["local", "public"]>;
5
+ baseDomain: z.ZodOptional<z.ZodString>;
6
+ adminEmail: z.ZodString;
7
+ timezone: z.ZodString;
8
+ }, "strip", z.ZodTypeAny, {
9
+ target: "docker" | "kubernetes" | "both";
10
+ mode: "local" | "public";
11
+ adminEmail: string;
12
+ timezone: string;
13
+ baseDomain?: string | undefined;
14
+ }, {
15
+ target: "docker" | "kubernetes" | "both";
16
+ mode: "local" | "public";
17
+ adminEmail: string;
18
+ timezone: string;
19
+ baseDomain?: string | undefined;
20
+ }>, {
21
+ target: "docker" | "kubernetes" | "both";
22
+ mode: "local" | "public";
23
+ adminEmail: string;
24
+ timezone: string;
25
+ baseDomain?: string | undefined;
26
+ }, {
27
+ target: "docker" | "kubernetes" | "both";
28
+ mode: "local" | "public";
29
+ adminEmail: string;
30
+ timezone: string;
31
+ baseDomain?: string | undefined;
32
+ }>;
33
+ export type GlobalConfig = z.infer<typeof GlobalConfigSchema>;
34
+ export declare const UserSeedSchema: z.ZodObject<{
35
+ username: z.ZodString;
36
+ email: z.ZodString;
37
+ firstName: z.ZodString;
38
+ lastName: z.ZodString;
39
+ }, "strip", z.ZodTypeAny, {
40
+ email: string;
41
+ username: string;
42
+ firstName: string;
43
+ lastName: string;
44
+ }, {
45
+ email: string;
46
+ username: string;
47
+ firstName: string;
48
+ lastName: string;
49
+ }>;
50
+ export type UserSeed = z.infer<typeof UserSeedSchema>;
51
+ export declare const ConfigYamlSchema: z.ZodObject<{
52
+ service: z.ZodString;
53
+ form: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
54
+ users: z.ZodOptional<z.ZodArray<z.ZodObject<{
55
+ username: z.ZodString;
56
+ email: z.ZodString;
57
+ firstName: z.ZodString;
58
+ lastName: z.ZodString;
59
+ }, "strip", z.ZodTypeAny, {
60
+ email: string;
61
+ username: string;
62
+ firstName: string;
63
+ lastName: string;
64
+ }, {
65
+ email: string;
66
+ username: string;
67
+ firstName: string;
68
+ lastName: string;
69
+ }>, "many">>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ service: string;
72
+ form: Record<string, string | number | boolean>;
73
+ users?: {
74
+ email: string;
75
+ username: string;
76
+ firstName: string;
77
+ lastName: string;
78
+ }[] | undefined;
79
+ }, {
80
+ service: string;
81
+ form: Record<string, string | number | boolean>;
82
+ users?: {
83
+ email: string;
84
+ username: string;
85
+ firstName: string;
86
+ lastName: string;
87
+ }[] | undefined;
88
+ }>;
89
+ export type ConfigYaml = z.infer<typeof ConfigYamlSchema>;
90
+ //# sourceMappingURL=configYaml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configYaml.d.ts","sourceRoot":"","sources":["../../src/schema/configYaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS9B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAW9D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;EAQzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ export const GlobalConfigSchema = z.object({
3
+ target: z.enum(["docker", "kubernetes", "both"]),
4
+ mode: z.enum(["local", "public"]),
5
+ baseDomain: z.string().min(1).optional(),
6
+ adminEmail: z.string().email(),
7
+ timezone: z.string().min(1)
8
+ }).refine((g) => g.mode === "local" || g.baseDomain !== undefined, { message: "baseDomain is required in public mode", path: ["baseDomain"] });
9
+ // Initial-user seed entry. Used exclusively by keycloak — persists one
10
+ // pre-provisioned user in the realm-import so the wizard doesn't have to
11
+ // walk a non-devops user through Keycloak's Users UI as a post-deploy
12
+ // manual step. The password is generated at render time (stored as
13
+ // `USER_<USERNAME>_TEMP_PASSWORD` in services/keycloak/.env), embedded in
14
+ // the realm-import as temporary=true + requiredActions=[UPDATE_PASSWORD],
15
+ // and surfaced once in secrets-summary.md. Keycloak forces the user to
16
+ // change it on first login; after that, Keycloak holds the hash and we
17
+ // never see it again.
18
+ export const UserSeedSchema = z.object({
19
+ username: z.string()
20
+ .min(1)
21
+ .max(64)
22
+ .regex(/^[a-z][a-z0-9._-]*$/, "must start with a letter and contain only [a-z0-9._-]"),
23
+ email: z.string().email(),
24
+ firstName: z.string().min(1).max(64),
25
+ lastName: z.string().min(1).max(64)
26
+ });
27
+ export const ConfigYamlSchema = z.object({
28
+ service: z.string().min(1),
29
+ form: z.record(z.union([z.string(), z.number(), z.boolean()])),
30
+ users: z.array(UserSeedSchema).optional()
31
+ });
32
+ //# sourceMappingURL=configYaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configYaml.js","sourceRoot":"","sources":["../../src/schema/configYaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC5B,CAAC,CAAC,MAAM,CACP,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,EACvD,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,CAC3E,CAAC;AAIF,uEAAuE;AACvE,yEAAyE;AACzE,sEAAsE;AACtE,mEAAmE;AACnE,0EAA0E;AAC1E,0EAA0E;AAC1E,uEAAuE;AACvE,uEAAuE;AACvE,sBAAsB;AACtB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;SACjB,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,KAAK,CAAC,qBAAqB,EAAE,uDAAuD,CAAC;IACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CACpC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC"}
@@ -0,0 +1,312 @@
1
+ import { z } from "zod";
2
+ declare const GeographySchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ label: z.ZodString;
5
+ }, "strip", z.ZodTypeAny, {
6
+ label: string;
7
+ id: string;
8
+ }, {
9
+ label: string;
10
+ id: string;
11
+ }>;
12
+ declare const NodeTypeSchema: z.ZodObject<{
13
+ id: z.ZodString;
14
+ label: z.ZodOptional<z.ZodString>;
15
+ vcpu: z.ZodOptional<z.ZodNumber>;
16
+ memory: z.ZodOptional<z.ZodNumber>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ id: string;
19
+ label?: string | undefined;
20
+ vcpu?: number | undefined;
21
+ memory?: number | undefined;
22
+ }, {
23
+ id: string;
24
+ label?: string | undefined;
25
+ vcpu?: number | undefined;
26
+ memory?: number | undefined;
27
+ }>;
28
+ declare const CapabilitiesSchema: z.ZodDefault<z.ZodObject<{
29
+ hasLoadBalancerIp: z.ZodOptional<z.ZodBoolean>;
30
+ supportsResourceList: z.ZodOptional<z.ZodBoolean>;
31
+ }, "strip", z.ZodTypeAny, {
32
+ hasLoadBalancerIp?: boolean | undefined;
33
+ supportsResourceList?: boolean | undefined;
34
+ }, {
35
+ hasLoadBalancerIp?: boolean | undefined;
36
+ supportsResourceList?: boolean | undefined;
37
+ }>>;
38
+ declare const ControlPlaneSchema: z.ZodUnion<[z.ZodObject<{
39
+ mode: z.ZodLiteral<"managed">;
40
+ typeId: z.ZodString;
41
+ }, "strip", z.ZodTypeAny, {
42
+ mode: "managed";
43
+ typeId: string;
44
+ }, {
45
+ mode: "managed";
46
+ typeId: string;
47
+ }>, z.ZodObject<{
48
+ mode: z.ZodLiteral<"self">;
49
+ }, "strip", z.ZodTypeAny, {
50
+ mode: "self";
51
+ }, {
52
+ mode: "self";
53
+ }>]>;
54
+ declare const PresetSchema: z.ZodObject<{
55
+ key: z.ZodString;
56
+ label: z.ZodString;
57
+ hint: z.ZodOptional<z.ZodString>;
58
+ controlPlaneType: z.ZodOptional<z.ZodString>;
59
+ nodePoolType: z.ZodString;
60
+ nodeCount: z.ZodNumber;
61
+ }, "strip", z.ZodTypeAny, {
62
+ key: string;
63
+ label: string;
64
+ nodePoolType: string;
65
+ nodeCount: number;
66
+ controlPlaneType?: string | undefined;
67
+ hint?: string | undefined;
68
+ }, {
69
+ key: string;
70
+ label: string;
71
+ nodePoolType: string;
72
+ nodeCount: number;
73
+ controlPlaneType?: string | undefined;
74
+ hint?: string | undefined;
75
+ }>;
76
+ export declare const ProviderYamlSchema: z.ZodObject<{
77
+ name: z.ZodString;
78
+ displayName: z.ZodString;
79
+ description: z.ZodString;
80
+ kind: z.ZodLiteral<"cluster">;
81
+ geographies: z.ZodArray<z.ZodObject<{
82
+ id: z.ZodString;
83
+ label: z.ZodString;
84
+ }, "strip", z.ZodTypeAny, {
85
+ label: string;
86
+ id: string;
87
+ }, {
88
+ label: string;
89
+ id: string;
90
+ }>, "many">;
91
+ controlPlane: z.ZodUnion<[z.ZodObject<{
92
+ mode: z.ZodLiteral<"managed">;
93
+ typeId: z.ZodString;
94
+ }, "strip", z.ZodTypeAny, {
95
+ mode: "managed";
96
+ typeId: string;
97
+ }, {
98
+ mode: "managed";
99
+ typeId: string;
100
+ }>, z.ZodObject<{
101
+ mode: z.ZodLiteral<"self">;
102
+ }, "strip", z.ZodTypeAny, {
103
+ mode: "self";
104
+ }, {
105
+ mode: "self";
106
+ }>]>;
107
+ nodeTypes: z.ZodArray<z.ZodObject<{
108
+ id: z.ZodString;
109
+ label: z.ZodOptional<z.ZodString>;
110
+ vcpu: z.ZodOptional<z.ZodNumber>;
111
+ memory: z.ZodOptional<z.ZodNumber>;
112
+ }, "strip", z.ZodTypeAny, {
113
+ id: string;
114
+ label?: string | undefined;
115
+ vcpu?: number | undefined;
116
+ memory?: number | undefined;
117
+ }, {
118
+ id: string;
119
+ label?: string | undefined;
120
+ vcpu?: number | undefined;
121
+ memory?: number | undefined;
122
+ }>, "many">;
123
+ credentials: z.ZodArray<z.ZodObject<{
124
+ key: z.ZodString;
125
+ label: z.ZodString;
126
+ type: z.ZodEnum<["string", "email", "boolean", "number", "select"]>;
127
+ default: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
128
+ required: z.ZodOptional<z.ZodBoolean>;
129
+ help: z.ZodOptional<z.ZodString>;
130
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
131
+ value: z.ZodString;
132
+ label: z.ZodString;
133
+ }, "strip", z.ZodTypeAny, {
134
+ label: string;
135
+ value: string;
136
+ }, {
137
+ label: string;
138
+ value: string;
139
+ }>, "many">>;
140
+ }, "strip", z.ZodTypeAny, {
141
+ key: string;
142
+ label: string;
143
+ type: "string" | "number" | "boolean" | "email" | "select";
144
+ options?: {
145
+ label: string;
146
+ value: string;
147
+ }[] | undefined;
148
+ default?: string | number | boolean | undefined;
149
+ required?: boolean | undefined;
150
+ help?: string | undefined;
151
+ }, {
152
+ key: string;
153
+ label: string;
154
+ type: "string" | "number" | "boolean" | "email" | "select";
155
+ options?: {
156
+ label: string;
157
+ value: string;
158
+ }[] | undefined;
159
+ default?: string | number | boolean | undefined;
160
+ required?: boolean | undefined;
161
+ help?: string | undefined;
162
+ }>, "many">;
163
+ presets: z.ZodDefault<z.ZodArray<z.ZodObject<{
164
+ key: z.ZodString;
165
+ label: z.ZodString;
166
+ hint: z.ZodOptional<z.ZodString>;
167
+ controlPlaneType: z.ZodOptional<z.ZodString>;
168
+ nodePoolType: z.ZodString;
169
+ nodeCount: z.ZodNumber;
170
+ }, "strip", z.ZodTypeAny, {
171
+ key: string;
172
+ label: string;
173
+ nodePoolType: string;
174
+ nodeCount: number;
175
+ controlPlaneType?: string | undefined;
176
+ hint?: string | undefined;
177
+ }, {
178
+ key: string;
179
+ label: string;
180
+ nodePoolType: string;
181
+ nodeCount: number;
182
+ controlPlaneType?: string | undefined;
183
+ hint?: string | undefined;
184
+ }>, "many">>;
185
+ templates: z.ZodArray<z.ZodString, "many">;
186
+ lifecycleModule: z.ZodDefault<z.ZodString>;
187
+ capabilities: z.ZodDefault<z.ZodObject<{
188
+ hasLoadBalancerIp: z.ZodOptional<z.ZodBoolean>;
189
+ supportsResourceList: z.ZodOptional<z.ZodBoolean>;
190
+ }, "strip", z.ZodTypeAny, {
191
+ hasLoadBalancerIp?: boolean | undefined;
192
+ supportsResourceList?: boolean | undefined;
193
+ }, {
194
+ hasLoadBalancerIp?: boolean | undefined;
195
+ supportsResourceList?: boolean | undefined;
196
+ }>>;
197
+ docs: z.ZodOptional<z.ZodObject<{
198
+ credentials: z.ZodOptional<z.ZodString>;
199
+ }, "strip", z.ZodTypeAny, {
200
+ credentials?: string | undefined;
201
+ }, {
202
+ credentials?: string | undefined;
203
+ }>>;
204
+ }, "strip", z.ZodTypeAny, {
205
+ name: string;
206
+ displayName: string;
207
+ description: string;
208
+ credentials: {
209
+ key: string;
210
+ label: string;
211
+ type: "string" | "number" | "boolean" | "email" | "select";
212
+ options?: {
213
+ label: string;
214
+ value: string;
215
+ }[] | undefined;
216
+ default?: string | number | boolean | undefined;
217
+ required?: boolean | undefined;
218
+ help?: string | undefined;
219
+ }[];
220
+ kind: "cluster";
221
+ geographies: {
222
+ label: string;
223
+ id: string;
224
+ }[];
225
+ controlPlane: {
226
+ mode: "managed";
227
+ typeId: string;
228
+ } | {
229
+ mode: "self";
230
+ };
231
+ nodeTypes: {
232
+ id: string;
233
+ label?: string | undefined;
234
+ vcpu?: number | undefined;
235
+ memory?: number | undefined;
236
+ }[];
237
+ presets: {
238
+ key: string;
239
+ label: string;
240
+ nodePoolType: string;
241
+ nodeCount: number;
242
+ controlPlaneType?: string | undefined;
243
+ hint?: string | undefined;
244
+ }[];
245
+ templates: string[];
246
+ lifecycleModule: string;
247
+ capabilities: {
248
+ hasLoadBalancerIp?: boolean | undefined;
249
+ supportsResourceList?: boolean | undefined;
250
+ };
251
+ docs?: {
252
+ credentials?: string | undefined;
253
+ } | undefined;
254
+ }, {
255
+ name: string;
256
+ displayName: string;
257
+ description: string;
258
+ credentials: {
259
+ key: string;
260
+ label: string;
261
+ type: "string" | "number" | "boolean" | "email" | "select";
262
+ options?: {
263
+ label: string;
264
+ value: string;
265
+ }[] | undefined;
266
+ default?: string | number | boolean | undefined;
267
+ required?: boolean | undefined;
268
+ help?: string | undefined;
269
+ }[];
270
+ kind: "cluster";
271
+ geographies: {
272
+ label: string;
273
+ id: string;
274
+ }[];
275
+ controlPlane: {
276
+ mode: "managed";
277
+ typeId: string;
278
+ } | {
279
+ mode: "self";
280
+ };
281
+ nodeTypes: {
282
+ id: string;
283
+ label?: string | undefined;
284
+ vcpu?: number | undefined;
285
+ memory?: number | undefined;
286
+ }[];
287
+ templates: string[];
288
+ presets?: {
289
+ key: string;
290
+ label: string;
291
+ nodePoolType: string;
292
+ nodeCount: number;
293
+ controlPlaneType?: string | undefined;
294
+ hint?: string | undefined;
295
+ }[] | undefined;
296
+ lifecycleModule?: string | undefined;
297
+ capabilities?: {
298
+ hasLoadBalancerIp?: boolean | undefined;
299
+ supportsResourceList?: boolean | undefined;
300
+ } | undefined;
301
+ docs?: {
302
+ credentials?: string | undefined;
303
+ } | undefined;
304
+ }>;
305
+ export type ProviderYaml = z.infer<typeof ProviderYamlSchema>;
306
+ export type Geography = z.infer<typeof GeographySchema>;
307
+ export type NodeType = z.infer<typeof NodeTypeSchema>;
308
+ export type ProviderCapabilities = z.infer<typeof CapabilitiesSchema>;
309
+ export type ControlPlane = z.infer<typeof ControlPlaneSchema>;
310
+ export type Preset = z.infer<typeof PresetSchema>;
311
+ export {};
312
+ //# sourceMappingURL=providerYaml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerYaml.d.ts","sourceRoot":"","sources":["../../src/schema/providerYaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,QAAA,MAAM,eAAe;;;;;;;;;EAGnB,CAAC;AAEH,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;EAKlB,CAAC;AAEH,QAAA,MAAM,kBAAkB;;;;;;;;;GAGV,CAAC;AAOf,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;IAGtB,CAAC;AAIH,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;EAOhB,CAAC;AAMH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { z } from "zod";
2
+ import { FormFieldSchema } from "./serviceYaml.js";
3
+ const GeographySchema = z.object({
4
+ id: z.string().min(1),
5
+ label: z.string().min(1)
6
+ });
7
+ const NodeTypeSchema = z.object({
8
+ id: z.string().min(1),
9
+ label: z.string().min(1).optional(),
10
+ vcpu: z.number().int().positive().optional(),
11
+ memory: z.number().int().positive().optional()
12
+ });
13
+ const CapabilitiesSchema = z.object({
14
+ hasLoadBalancerIp: z.boolean().optional(),
15
+ supportsResourceList: z.boolean().optional()
16
+ }).default({});
17
+ // "managed": provider supplies a fixed control plane (e.g. Scaleway Kapsule);
18
+ // the user does not pick a node type for it. `typeId` carries the fixed
19
+ // identifier the templates expect (e.g. "kapsule").
20
+ // "self": the user picks a control plane node type from `nodeTypes` (e.g.
21
+ // Hetzner k3s, where the control plane runs on a regular VPS).
22
+ const ControlPlaneSchema = z.union([
23
+ z.object({ mode: z.literal("managed"), typeId: z.string().min(1) }),
24
+ z.object({ mode: z.literal("self") })
25
+ ]);
26
+ // UI-only team-size shortcuts. `controlPlaneType` is required when the
27
+ // provider's controlPlane.mode is "self"; omitted for "managed".
28
+ const PresetSchema = z.object({
29
+ key: z.string().min(1),
30
+ label: z.string().min(1),
31
+ hint: z.string().optional(),
32
+ controlPlaneType: z.string().min(1).optional(),
33
+ nodePoolType: z.string().min(1),
34
+ nodeCount: z.number().int().min(0)
35
+ });
36
+ const DocsSchema = z.object({
37
+ credentials: z.string().url().optional()
38
+ });
39
+ export const ProviderYamlSchema = z.object({
40
+ name: z.string().regex(/^[a-z][a-z0-9-]*$/, "must be kebab-case"),
41
+ displayName: z.string().min(1),
42
+ description: z.string(),
43
+ kind: z.literal("cluster"),
44
+ geographies: z.array(GeographySchema).min(1),
45
+ controlPlane: ControlPlaneSchema,
46
+ nodeTypes: z.array(NodeTypeSchema).min(1),
47
+ credentials: z.array(FormFieldSchema),
48
+ presets: z.array(PresetSchema).default([]),
49
+ templates: z.array(z.string().min(1)).min(1),
50
+ lifecycleModule: z.string().min(1).default("lifecycle.ts"),
51
+ capabilities: CapabilitiesSchema,
52
+ docs: DocsSchema.optional()
53
+ });
54
+ //# sourceMappingURL=providerYaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerYaml.js","sourceRoot":"","sources":["../../src/schema/providerYaml.ts"],"names":[],"mappings":"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"}