@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.
- package/LICENSE +21 -0
- package/README.md +29 -0
- package/dist/bridgeManifest.d.ts +67 -0
- package/dist/bridgeManifest.d.ts.map +1 -0
- package/dist/bridgeManifest.js +35 -0
- package/dist/bridgeManifest.js.map +1 -0
- package/dist/capabilities.d.ts +23 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +15 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/catalog/bootstrap.d.ts +25 -0
- package/dist/catalog/bootstrap.d.ts.map +1 -0
- package/dist/catalog/bootstrap.js +56 -0
- package/dist/catalog/bootstrap.js.map +1 -0
- package/dist/catalog/index.d.ts +4 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +4 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/projectPin.d.ts +22 -0
- package/dist/catalog/projectPin.d.ts.map +1 -0
- package/dist/catalog/projectPin.js +39 -0
- package/dist/catalog/projectPin.js.map +1 -0
- package/dist/catalog/reader.d.ts +44 -0
- package/dist/catalog/reader.d.ts.map +1 -0
- package/dist/catalog/reader.js +7 -0
- package/dist/catalog/reader.js.map +1 -0
- package/dist/catalog/tarball.d.ts +48 -0
- package/dist/catalog/tarball.d.ts.map +1 -0
- package/dist/catalog/tarball.js +114 -0
- package/dist/catalog/tarball.js.map +1 -0
- package/dist/cluster.d.ts +4 -0
- package/dist/cluster.d.ts.map +1 -0
- package/dist/cluster.js +46 -0
- package/dist/cluster.js.map +1 -0
- package/dist/dedicatedPeer.d.ts +43 -0
- package/dist/dedicatedPeer.d.ts.map +1 -0
- package/dist/dedicatedPeer.js +38 -0
- package/dist/dedicatedPeer.js.map +1 -0
- package/dist/dependencies.d.ts +6 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +124 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/ingress.d.ts +4 -0
- package/dist/ingress.d.ts.map +1 -0
- package/dist/ingress.js +17 -0
- package/dist/ingress.js.map +1 -0
- package/dist/keycloak.d.ts +61 -0
- package/dist/keycloak.d.ts.map +1 -0
- package/dist/keycloak.js +161 -0
- package/dist/keycloak.js.map +1 -0
- package/dist/numericId.d.ts +2 -0
- package/dist/numericId.d.ts.map +1 -0
- package/dist/numericId.js +22 -0
- package/dist/numericId.js.map +1 -0
- package/dist/providers/lifecycle.d.ts +81 -0
- package/dist/providers/lifecycle.d.ts.map +1 -0
- package/dist/providers/lifecycle.js +22 -0
- package/dist/providers/lifecycle.js.map +1 -0
- package/dist/providers.d.ts +4 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +45 -0
- package/dist/providers.js.map +1 -0
- package/dist/render.d.ts +22 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +354 -0
- package/dist/render.js.map +1 -0
- package/dist/repository.d.ts +4 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +31 -0
- package/dist/repository.js.map +1 -0
- package/dist/schema/clusterYaml.d.ts +39 -0
- package/dist/schema/clusterYaml.d.ts.map +1 -0
- package/dist/schema/clusterYaml.js +24 -0
- package/dist/schema/clusterYaml.js.map +1 -0
- package/dist/schema/configYaml.d.ts +90 -0
- package/dist/schema/configYaml.d.ts.map +1 -0
- package/dist/schema/configYaml.js +32 -0
- package/dist/schema/configYaml.js.map +1 -0
- package/dist/schema/providerYaml.d.ts +312 -0
- package/dist/schema/providerYaml.d.ts.map +1 -0
- package/dist/schema/providerYaml.js +54 -0
- package/dist/schema/providerYaml.js.map +1 -0
- package/dist/schema/serviceYaml.d.ts +2407 -0
- package/dist/schema/serviceYaml.d.ts.map +1 -0
- package/dist/schema/serviceYaml.js +200 -0
- package/dist/schema/serviceYaml.js.map +1 -0
- package/dist/secrets.d.ts +4 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +31 -0
- package/dist/secrets.js.map +1 -0
- package/dist/secretsSummary.d.ts +2 -0
- package/dist/secretsSummary.d.ts.map +1 -0
- package/dist/secretsSummary.js +50 -0
- package/dist/secretsSummary.js.map +1 -0
- package/dist/services.d.ts +7 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +66 -0
- package/dist/services.js.map +1 -0
- package/dist/sharedDb.d.ts +3 -0
- package/dist/sharedDb.d.ts.map +1 -0
- package/dist/sharedDb.js +104 -0
- package/dist/sharedDb.js.map +1 -0
- package/dist/target.d.ts +35 -0
- package/dist/target.d.ts.map +1 -0
- package/dist/target.js +7 -0
- package/dist/target.js.map +1 -0
- package/dist/templates/dedicated-postgres.docker.yaml.tmpl +12 -0
- package/dist/templates/dedicated-postgres.k8s.yaml.tmpl +57 -0
- package/dist/templates/dedicated-redis.docker.yaml.tmpl +9 -0
- package/dist/templates/dedicated-redis.k8s.yaml.tmpl +46 -0
- package/dist/templating.d.ts +2 -0
- package/dist/templating.d.ts.map +1 -0
- package/dist/templating.js +15 -0
- package/dist/templating.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tarball.js","sourceRoot":"","sources":["../../src/catalog/tarball.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ClusterYaml } from "./schema/clusterYaml.js";
|
|
2
|
+
export declare function loadClusterConfig(rootDir: string): Promise<ClusterYaml | null>;
|
|
3
|
+
export declare function renderClusterModule(cluster: ClusterYaml, templates: Map<string, string>): Record<string, string>;
|
|
4
|
+
//# sourceMappingURL=cluster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../src/cluster.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQ9E,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CASpF;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBxB"}
|
package/dist/cluster.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import yaml from "js-yaml";
|
|
4
|
+
import { ClusterYamlSchema } from "./schema/clusterYaml.js";
|
|
5
|
+
import { renderTemplate } from "./templating.js";
|
|
6
|
+
const PROVIDER_TEMPLATE_DIR = (provider) => `providers/${provider}/templates`;
|
|
7
|
+
const TF_FILES = ["main.tf", "variables.tf", "outputs.tf"];
|
|
8
|
+
export async function loadClusterConfig(rootDir) {
|
|
9
|
+
const p = path.join(rootDir, "services/cluster.yaml");
|
|
10
|
+
try {
|
|
11
|
+
const raw = await fs.readFile(p, "utf8");
|
|
12
|
+
return ClusterYamlSchema.parse(yaml.load(raw));
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
if (err.code === "ENOENT")
|
|
16
|
+
return null;
|
|
17
|
+
throw err;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function renderClusterModule(cluster, templates) {
|
|
21
|
+
const dir = PROVIDER_TEMPLATE_DIR(cluster.provider);
|
|
22
|
+
// Flatten credentials into the template context so provider templates can
|
|
23
|
+
// reference them directly (e.g. {{form.projectId}}). geography is exposed
|
|
24
|
+
// under its canonical name; templates can use it for region / location /
|
|
25
|
+
// whatever the provider's Terraform module calls it.
|
|
26
|
+
const ctx = {
|
|
27
|
+
form: {
|
|
28
|
+
geography: cluster.geography,
|
|
29
|
+
controlPlaneType: cluster.controlPlaneType,
|
|
30
|
+
nodePoolType: cluster.nodePoolType,
|
|
31
|
+
nodeCount: cluster.nodeCount,
|
|
32
|
+
...cluster.credentials
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const out = {};
|
|
36
|
+
for (const tf of TF_FILES) {
|
|
37
|
+
const key = `${dir}/${tf}.tmpl`;
|
|
38
|
+
const tmpl = templates.get(key);
|
|
39
|
+
if (tmpl === undefined) {
|
|
40
|
+
throw new Error(`Missing cluster template for ${cluster.provider}: ${key}`);
|
|
41
|
+
}
|
|
42
|
+
out[`opentofu/${tf}`] = renderTemplate(tmpl, ctx);
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=cluster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.js","sourceRoot":"","sources":["../src/cluster.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;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAU,EAAE,CACzD,aAAa,QAAQ,YAAY,CAAC;AAEpC,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAU,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAoB,EACpB,SAA8B;IAE9B,MAAM,GAAG,GAAG,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpD,0EAA0E;IAC1E,0EAA0E;IAC1E,yEAAyE;IACzE,qDAAqD;IACrD,MAAM,GAAG,GAAG;QACV,IAAI,EAAE;YACJ,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,OAAO,CAAC,WAAW;SACvB;KACF,CAAC;IACF,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,OAAO,CAAC;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ServiceYaml } from "./schema/serviceYaml.js";
|
|
2
|
+
export type PeerMode = "shared" | "dedicated";
|
|
3
|
+
export interface DbContext {
|
|
4
|
+
host: string;
|
|
5
|
+
port: number;
|
|
6
|
+
name: string;
|
|
7
|
+
user: string;
|
|
8
|
+
mode: PeerMode;
|
|
9
|
+
}
|
|
10
|
+
export interface RedisContext {
|
|
11
|
+
host: string;
|
|
12
|
+
port: number;
|
|
13
|
+
mode: PeerMode;
|
|
14
|
+
}
|
|
15
|
+
export declare function resolveDbContext(service: ServiceYaml, sharedProviderName: string | undefined): DbContext | undefined;
|
|
16
|
+
export declare function resolveRedisContext(service: ServiceYaml, sharedProviderName: string | undefined): RedisContext | undefined;
|
|
17
|
+
interface DedicatedPostgresBase {
|
|
18
|
+
name: string;
|
|
19
|
+
dbName: string;
|
|
20
|
+
dbUser: string;
|
|
21
|
+
storage: string;
|
|
22
|
+
}
|
|
23
|
+
export interface DedicatedPostgresDockerParams extends DedicatedPostgresBase {
|
|
24
|
+
passwordRef: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function emitDedicatedPostgresDocker(params: DedicatedPostgresDockerParams, template: string): string;
|
|
27
|
+
export interface DedicatedPostgresK8sParams extends DedicatedPostgresBase {
|
|
28
|
+
consumerName: string;
|
|
29
|
+
port: number;
|
|
30
|
+
}
|
|
31
|
+
export declare function emitDedicatedPostgresK8s(params: DedicatedPostgresK8sParams, template: string): string;
|
|
32
|
+
interface DedicatedRedisBase {
|
|
33
|
+
name: string;
|
|
34
|
+
storage: string;
|
|
35
|
+
}
|
|
36
|
+
export type DedicatedRedisDockerParams = DedicatedRedisBase;
|
|
37
|
+
export interface DedicatedRedisK8sParams extends DedicatedRedisBase {
|
|
38
|
+
port: number;
|
|
39
|
+
}
|
|
40
|
+
export declare function emitDedicatedRedisDocker(params: DedicatedRedisDockerParams, template: string): string;
|
|
41
|
+
export declare function emitDedicatedRedisK8s(params: DedicatedRedisK8sParams, template: string): string;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=dedicatedPeer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedicatedPeer.d.ts","sourceRoot":"","sources":["../src/dedicatedPeer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,kBAAkB,EAAE,MAAM,GAAG,SAAS,GACrC,SAAS,GAAG,SAAS,CAYvB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,kBAAkB,EAAE,MAAM,GAAG,SAAS,GACrC,YAAY,GAAG,SAAS,CAY1B;AAED,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,6BAA8B,SAAQ,qBAAqB;IAC1E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,6BAA6B,EACrC,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,0BAA0B,EAClC,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAE5D,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,0BAA0B,EAClC,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,uBAAuB,EAC/B,QAAQ,EAAE,MAAM,GACf,MAAM,CAER"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { renderTemplate } from "./templating.js";
|
|
2
|
+
export function resolveDbContext(service, sharedProviderName) {
|
|
3
|
+
const db = service.database;
|
|
4
|
+
if (!db)
|
|
5
|
+
return undefined;
|
|
6
|
+
if (db.preferShared) {
|
|
7
|
+
if (!sharedProviderName) {
|
|
8
|
+
throw new Error(`dedicatedPeer: service "${service.name}" uses database.preferShared: true but no shared postgres provider is in the enabled set`);
|
|
9
|
+
}
|
|
10
|
+
return { host: sharedProviderName, port: 5432, name: db.name, user: db.user, mode: "shared" };
|
|
11
|
+
}
|
|
12
|
+
return { host: `${service.name}-postgres`, port: 5432, name: db.name, user: db.user, mode: "dedicated" };
|
|
13
|
+
}
|
|
14
|
+
export function resolveRedisContext(service, sharedProviderName) {
|
|
15
|
+
const r = service.redis;
|
|
16
|
+
if (!r)
|
|
17
|
+
return undefined;
|
|
18
|
+
if (r.preferShared) {
|
|
19
|
+
if (!sharedProviderName) {
|
|
20
|
+
throw new Error(`dedicatedPeer: service "${service.name}" uses redis.preferShared: true but no shared redis provider is in the enabled set`);
|
|
21
|
+
}
|
|
22
|
+
return { host: sharedProviderName, port: 6379, mode: "shared" };
|
|
23
|
+
}
|
|
24
|
+
return { host: `${service.name}-redis`, port: 6379, mode: "dedicated" };
|
|
25
|
+
}
|
|
26
|
+
export function emitDedicatedPostgresDocker(params, template) {
|
|
27
|
+
return renderTemplate(template, params);
|
|
28
|
+
}
|
|
29
|
+
export function emitDedicatedPostgresK8s(params, template) {
|
|
30
|
+
return renderTemplate(template, params);
|
|
31
|
+
}
|
|
32
|
+
export function emitDedicatedRedisDocker(params, template) {
|
|
33
|
+
return renderTemplate(template, params);
|
|
34
|
+
}
|
|
35
|
+
export function emitDedicatedRedisK8s(params, template) {
|
|
36
|
+
return renderTemplate(template, params);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=dedicatedPeer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedicatedPeer.js","sourceRoot":"","sources":["../src/dedicatedPeer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAkBjD,MAAM,UAAU,gBAAgB,CAC9B,OAAoB,EACpB,kBAAsC;IAEtC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC5B,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,2BAA2B,OAAO,CAAC,IAAI,0FAA0F,CAClI,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChG,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAoB,EACpB,kBAAsC;IAEtC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,2BAA2B,OAAO,CAAC,IAAI,oFAAoF,CAC5H,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC1E,CAAC;AAaD,MAAM,UAAU,2BAA2B,CACzC,MAAqC,EACrC,QAAgB;IAEhB,OAAO,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAOD,MAAM,UAAU,wBAAwB,CACtC,MAAkC,EAClC,QAAgB;IAEhB,OAAO,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAaD,MAAM,UAAU,wBAAwB,CACtC,MAAkC,EAClC,QAAgB;IAEhB,OAAO,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAA+B,EAC/B,QAAgB;IAEhB,OAAO,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Repository } from "./repository.js";
|
|
2
|
+
import type { Services } from "./services.js";
|
|
3
|
+
import type { ConfigYaml } from "./schema/configYaml.js";
|
|
4
|
+
export type EnabledServices = Map<string, ConfigYaml>;
|
|
5
|
+
export declare function resolveEnabledServices(configured: Services, repo: Repository): EnabledServices;
|
|
6
|
+
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../src/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEtD,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,UAAU,GACf,eAAe,CAiGjB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export function resolveEnabledServices(configured, repo) {
|
|
2
|
+
const enabled = new Map();
|
|
3
|
+
// Seed with required services, kernel services, and explicitly configured
|
|
4
|
+
// services. A `kernel: true` service is always part of every deployment
|
|
5
|
+
// (e.g. keycloak provides SSO + user-seeding) and is never offered as a
|
|
6
|
+
// wizard choice.
|
|
7
|
+
for (const [name, def] of repo) {
|
|
8
|
+
if ((def.required || def.kernel === true) && !enabled.has(name)) {
|
|
9
|
+
enabled.set(name, configured.get(name) ?? buildDefaultConfig(name, def));
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
for (const [name, cfg] of configured) {
|
|
13
|
+
if (!repo.has(name)) {
|
|
14
|
+
throw new Error(`Configured service "${name}" is not in the repository`);
|
|
15
|
+
}
|
|
16
|
+
enabled.set(name, cfg);
|
|
17
|
+
}
|
|
18
|
+
// Iteratively pull in dependencies until fixed point.
|
|
19
|
+
let changed = true;
|
|
20
|
+
while (changed) {
|
|
21
|
+
changed = false;
|
|
22
|
+
for (const [name, cfg] of Array.from(enabled)) {
|
|
23
|
+
const def = repo.get(name);
|
|
24
|
+
for (const dep of def.dependencies) {
|
|
25
|
+
const depDef = repo.get(dep.service);
|
|
26
|
+
if (!depDef) {
|
|
27
|
+
throw new Error(`Service "${name}" depends on unknown service "${dep.service}"`);
|
|
28
|
+
}
|
|
29
|
+
const shouldEnable = dep.required || (dep.when !== undefined && evalWhen(dep.when, cfg));
|
|
30
|
+
if (shouldEnable && !enabled.has(dep.service)) {
|
|
31
|
+
enabled.set(dep.service, configured.get(dep.service) ?? buildDefaultConfig(dep.service, depDef));
|
|
32
|
+
changed = true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Auto-include the shared-DB provider when any enabled service has
|
|
38
|
+
// database.preferShared: true. The provider is matched by capability
|
|
39
|
+
// (provides.sharedDatabase), never by service name — so a third-party
|
|
40
|
+
// recipe could ship its own postgres bundle without engine changes.
|
|
41
|
+
// If no provider exists in the repo, silently skip; the downstream
|
|
42
|
+
// renderer will notice and error.
|
|
43
|
+
const needsSharedDb = Array.from(enabled.keys()).some((name) => {
|
|
44
|
+
return repo.get(name)?.database?.preferShared === true;
|
|
45
|
+
});
|
|
46
|
+
if (needsSharedDb) {
|
|
47
|
+
const dbProviderName = findProviderInRepo(repo, "sharedDatabase");
|
|
48
|
+
if (dbProviderName && !enabled.has(dbProviderName)) {
|
|
49
|
+
const dbDef = repo.get(dbProviderName);
|
|
50
|
+
enabled.set(dbProviderName, configured.get(dbProviderName) ?? buildDefaultConfig(dbProviderName, dbDef));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Same for redis: find provides.sharedRedis, never assume the service
|
|
54
|
+
// is literally named "redis".
|
|
55
|
+
const needsSharedRedis = Array.from(enabled.keys()).some((name) => {
|
|
56
|
+
return repo.get(name)?.redis?.preferShared === true;
|
|
57
|
+
});
|
|
58
|
+
if (needsSharedRedis) {
|
|
59
|
+
const redisProviderName = findProviderInRepo(repo, "sharedRedis");
|
|
60
|
+
if (redisProviderName && !enabled.has(redisProviderName)) {
|
|
61
|
+
const redisDef = repo.get(redisProviderName);
|
|
62
|
+
enabled.set(redisProviderName, configured.get(redisProviderName) ?? buildDefaultConfig(redisProviderName, redisDef));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Bridge is no longer auto-included. It's a normal user-pickable service
|
|
66
|
+
// (category: portal). When bridge is selected, its consumer logic in
|
|
67
|
+
// buildBridgeManifest / sharedDb naturally picks up provides.bridge from
|
|
68
|
+
// every enabled service. When it isn't selected, those declarations are
|
|
69
|
+
// inert — recipes still "stand on themselves" without the launcher.
|
|
70
|
+
// Bridge cannot span dedicated DBs — its reader role attaches via `\c <db>`
|
|
71
|
+
// switches in init.sql against a single postgres instance. If bridge is in
|
|
72
|
+
// the enabled set AND any consumer exposes provides.bridge.dbRead or
|
|
73
|
+
// provides.bridge.search while using a dedicated DB, fail loudly.
|
|
74
|
+
const bridgeIsEnabled = Array.from(enabled.keys()).some((name) => {
|
|
75
|
+
return repo.get(name)?.provides.bridgeReader !== undefined;
|
|
76
|
+
});
|
|
77
|
+
if (bridgeIsEnabled) {
|
|
78
|
+
for (const [name] of enabled) {
|
|
79
|
+
const def = repo.get(name);
|
|
80
|
+
const exposesToBridge = def.provides.bridge?.dbRead !== undefined ||
|
|
81
|
+
def.provides.bridge?.search !== undefined;
|
|
82
|
+
if (exposesToBridge && def.database?.preferShared === false) {
|
|
83
|
+
throw new Error(`Service "${name}" exposes provides.bridge.dbRead or provides.bridge.search but uses database.preferShared: false. Bridge's reader role cannot span dedicated postgres instances — either remove bridge from the deployment or switch "${name}" back to preferShared: true.`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return enabled;
|
|
88
|
+
}
|
|
89
|
+
function findProviderInRepo(repo, capability) {
|
|
90
|
+
for (const [name, def] of repo) {
|
|
91
|
+
if (def.provides[capability] !== undefined)
|
|
92
|
+
return name;
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
function buildDefaultConfig(name, def) {
|
|
97
|
+
const form = {};
|
|
98
|
+
for (const field of def.form) {
|
|
99
|
+
if (field.default !== undefined) {
|
|
100
|
+
form[field.key] = field.default;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return { service: name, form };
|
|
104
|
+
}
|
|
105
|
+
function evalWhen(expr, cfg) {
|
|
106
|
+
// Minimal expression: "form.<key> == <literal>"
|
|
107
|
+
const match = expr.match(/^\s*form\.([a-zA-Z0-9_]+)\s*==\s*(true|false|"[^"]*"|\d+)\s*$/);
|
|
108
|
+
if (!match) {
|
|
109
|
+
throw new Error(`Unsupported \`when\` expression: ${expr}`);
|
|
110
|
+
}
|
|
111
|
+
const [, key, literal] = match;
|
|
112
|
+
const actual = cfg.form[key];
|
|
113
|
+
let expected;
|
|
114
|
+
if (literal === "true")
|
|
115
|
+
expected = true;
|
|
116
|
+
else if (literal === "false")
|
|
117
|
+
expected = false;
|
|
118
|
+
else if (literal.startsWith('"'))
|
|
119
|
+
expected = literal.slice(1, -1);
|
|
120
|
+
else
|
|
121
|
+
expected = Number(literal);
|
|
122
|
+
return actual === expected;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../src/dependencies.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { render, type RenderOptions, type RenderResult } from "./render.js";
|
|
2
|
+
export { loadRepository, type Repository } from "./repository.js";
|
|
3
|
+
export { loadServices, writeServiceConfig, loadEnv, writeEnv, type Services } from "./services.js";
|
|
4
|
+
export { resolveEnabledServices } from "./dependencies.js";
|
|
5
|
+
export { ServiceYamlSchema, type ServiceYaml } from "./schema/serviceYaml.js";
|
|
6
|
+
export { ConfigYamlSchema, GlobalConfigSchema, type ConfigYaml, type GlobalConfig } from "./schema/configYaml.js";
|
|
7
|
+
export { ClusterYamlSchema, type ClusterYaml } from "./schema/clusterYaml.js";
|
|
8
|
+
export { ProviderYamlSchema, type ProviderYaml } from "./schema/providerYaml.js";
|
|
9
|
+
export { loadClusterConfig } from "./cluster.js";
|
|
10
|
+
export { loadProviders } from "./providers.js";
|
|
11
|
+
export { loadLifecycle, type ClusterLifecycle, type ClusterLifecycleStatic, type ClusterLifecycleDynamic, type LifecycleContext, type LoadedProvider, type ValidateResult } from "./providers/lifecycle.js";
|
|
12
|
+
export type { CatalogReader, CatalogIndex, RecipeMeta, ProviderMeta, RecipeBundle, ProviderBundle } from "./catalog/reader.js";
|
|
13
|
+
export type { KubernetesExtras, RenderDockerFn, RenderKubernetesFn, RenderTargets, FileTree } from "./target.js";
|
|
14
|
+
export { ProjectPinSchema, type ProjectPin, PIN_RELATIVE_PATH, readProjectPin, writeProjectPin, DEFAULT_CATALOG_OWNER, DEFAULT_CATALOG_REPO, type CatalogTarballOptions, type CatalogCachePaths, catalogCachePaths, projectCatalogDir, catalogCacheExists, fetchCatalogTarball, resolveLatestCatalogRef, type BootstrapOptions, type ResolvedCatalog, bootstrapCatalog } from "./catalog/index.js";
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAClH,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACT,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,KAAK,UAAU,EACf,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Public API barrel for @gezelligate/core. Mirrors today's run/src/renderer/index.ts
|
|
2
|
+
// surface so existing callers (and the legacy renderer/ re-export stubs in run/)
|
|
3
|
+
// keep working unchanged. Sub-path imports are also supported via package.json
|
|
4
|
+
// exports (e.g. `@gezelligate/core/keycloak`).
|
|
5
|
+
export { render } from "./render.js";
|
|
6
|
+
export { loadRepository } from "./repository.js";
|
|
7
|
+
export { loadServices, writeServiceConfig, loadEnv, writeEnv } from "./services.js";
|
|
8
|
+
export { resolveEnabledServices } from "./dependencies.js";
|
|
9
|
+
export { ServiceYamlSchema } from "./schema/serviceYaml.js";
|
|
10
|
+
export { ConfigYamlSchema, GlobalConfigSchema } from "./schema/configYaml.js";
|
|
11
|
+
export { ClusterYamlSchema } from "./schema/clusterYaml.js";
|
|
12
|
+
export { ProviderYamlSchema } from "./schema/providerYaml.js";
|
|
13
|
+
export { loadClusterConfig } from "./cluster.js";
|
|
14
|
+
export { loadProviders } from "./providers.js";
|
|
15
|
+
export { loadLifecycle } from "./providers/lifecycle.js";
|
|
16
|
+
export { ProjectPinSchema, PIN_RELATIVE_PATH, readProjectPin, writeProjectPin, DEFAULT_CATALOG_OWNER, DEFAULT_CATALOG_REPO, catalogCachePaths, projectCatalogDir, catalogCacheExists, fetchCatalogTarball, resolveLatestCatalogRef, bootstrapCatalog } from "./catalog/index.js";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,iFAAiF;AACjF,+EAA+E;AAC/E,+CAA+C;AAE/C,OAAO,EAAE,MAAM,EAAyC,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAmB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAiB,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAoB,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAsC,MAAM,wBAAwB,CAAC;AAClH,OAAO,EAAE,iBAAiB,EAAoB,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAqB,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,aAAa,EAOd,MAAM,0BAA0B,CAAC;AAgBlC,OAAO,EACL,gBAAgB,EAEhB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EAGpB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EAGvB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../src/ingress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAerF"}
|
package/dist/ingress.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { renderTemplate } from "./templating.js";
|
|
2
|
+
export function buildCaddyfile(services, global) {
|
|
3
|
+
if (global.mode === "local")
|
|
4
|
+
return "";
|
|
5
|
+
const blocks = [];
|
|
6
|
+
blocks.push(`{\n email ${global.adminEmail}\n}\n`);
|
|
7
|
+
for (const s of services) {
|
|
8
|
+
const ingress = s.def.provides.ingress;
|
|
9
|
+
if (!ingress)
|
|
10
|
+
continue;
|
|
11
|
+
const ctx = { form: s.config.form, global };
|
|
12
|
+
const host = renderTemplate(ingress.host, ctx);
|
|
13
|
+
blocks.push(`${host} {\n reverse_proxy ${s.def.name}:${ingress.port}\n}\n`);
|
|
14
|
+
}
|
|
15
|
+
return blocks.join("\n");
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ingress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingress.js","sourceRoot":"","sources":["../src/ingress.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,UAAU,cAAc,CAAC,QAAwB,EAAE,MAAoB;IAC3E,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,UAAU,OAAO,CAAC,CAAC;IAEpD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ServiceYaml } from "./schema/serviceYaml.js";
|
|
2
|
+
import type { ConfigYaml, GlobalConfig, UserSeed } from "./schema/configYaml.js";
|
|
3
|
+
import type { DbContext, RedisContext } from "./dedicatedPeer.js";
|
|
4
|
+
export interface ProtocolMapper {
|
|
5
|
+
name: string;
|
|
6
|
+
protocol: "openid-connect";
|
|
7
|
+
protocolMapper: string;
|
|
8
|
+
config: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
export interface RealmImportClient {
|
|
11
|
+
clientId: string;
|
|
12
|
+
secret: string;
|
|
13
|
+
redirectUris: string[];
|
|
14
|
+
defaultClientScopes: string[];
|
|
15
|
+
publicClient: boolean;
|
|
16
|
+
standardFlowEnabled: boolean;
|
|
17
|
+
protocolMappers?: ProtocolMapper[];
|
|
18
|
+
attributes?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export interface RealmImportUser {
|
|
21
|
+
username: string;
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
email: string;
|
|
24
|
+
emailVerified?: boolean;
|
|
25
|
+
firstName?: string;
|
|
26
|
+
lastName?: string;
|
|
27
|
+
credentials: Array<{
|
|
28
|
+
type: "password";
|
|
29
|
+
value: string;
|
|
30
|
+
temporary: boolean;
|
|
31
|
+
}>;
|
|
32
|
+
realmRoles: string[];
|
|
33
|
+
requiredActions?: string[];
|
|
34
|
+
attributes?: Record<string, string[]>;
|
|
35
|
+
}
|
|
36
|
+
export interface RealmImportClientScope {
|
|
37
|
+
name: string;
|
|
38
|
+
description?: string;
|
|
39
|
+
protocol: "openid-connect";
|
|
40
|
+
attributes?: Record<string, string>;
|
|
41
|
+
}
|
|
42
|
+
export interface RealmImport {
|
|
43
|
+
realm: string;
|
|
44
|
+
enabled: boolean;
|
|
45
|
+
clients: RealmImportClient[];
|
|
46
|
+
clientScopes?: RealmImportClientScope[];
|
|
47
|
+
users: RealmImportUser[];
|
|
48
|
+
}
|
|
49
|
+
export interface ServiceState {
|
|
50
|
+
def: ServiceYaml;
|
|
51
|
+
config: ConfigYaml;
|
|
52
|
+
env: Record<string, string>;
|
|
53
|
+
db?: DbContext;
|
|
54
|
+
redis?: RedisContext;
|
|
55
|
+
}
|
|
56
|
+
export interface SeededUser extends UserSeed {
|
|
57
|
+
tempPassword: string;
|
|
58
|
+
}
|
|
59
|
+
export declare function userTempPasswordKey(username: string): string;
|
|
60
|
+
export declare function buildRealmImport(services: ServiceState[], global: GlobalConfig, combinedEnv: Record<string, string>, adminPassword: string, seedUsers?: SeededUser[]): RealmImport;
|
|
61
|
+
//# sourceMappingURL=keycloak.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.d.ts","sourceRoot":"","sources":["../src/keycloak.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACxC,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAoED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EAAE,EACxB,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,aAAa,EAAE,MAAM,EACrB,SAAS,GAAE,UAAU,EAAO,GAC3B,WAAW,CA4Fb"}
|
package/dist/keycloak.js
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { renderTemplate } from "./templating.js";
|
|
2
|
+
import { usernameToNumericId } from "./numericId.js";
|
|
3
|
+
export function userTempPasswordKey(username) {
|
|
4
|
+
return `USER_${username.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_TEMP_PASSWORD`;
|
|
5
|
+
}
|
|
6
|
+
// Mattermost Team Edition's `gitlab` OAuth provider parses the userinfo
|
|
7
|
+
// response with this shape:
|
|
8
|
+
// { id: int64 (non-zero), username: string, email: string, name: string }
|
|
9
|
+
// Keycloak's standard /userinfo emits OIDC claims (sub, preferred_username,
|
|
10
|
+
// email, name) — no numeric `id`. These four mappers reshape the response so
|
|
11
|
+
// Mattermost can authenticate. The `id` claim sources from the per-user
|
|
12
|
+
// `mattermost_id` attribute set in `buildRealmImport`.
|
|
13
|
+
function gitlabUserinfoMappers() {
|
|
14
|
+
const claimDefaults = {
|
|
15
|
+
"userinfo.token.claim": "true",
|
|
16
|
+
"id.token.claim": "true",
|
|
17
|
+
"access.token.claim": "true"
|
|
18
|
+
};
|
|
19
|
+
return [
|
|
20
|
+
{
|
|
21
|
+
name: "id",
|
|
22
|
+
protocol: "openid-connect",
|
|
23
|
+
protocolMapper: "oidc-usermodel-attribute-mapper",
|
|
24
|
+
config: {
|
|
25
|
+
...claimDefaults,
|
|
26
|
+
"user.attribute": "mattermost_id",
|
|
27
|
+
"claim.name": "id",
|
|
28
|
+
"jsonType.label": "long"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "username",
|
|
33
|
+
protocol: "openid-connect",
|
|
34
|
+
protocolMapper: "oidc-usermodel-property-mapper",
|
|
35
|
+
config: {
|
|
36
|
+
...claimDefaults,
|
|
37
|
+
"user.attribute": "username",
|
|
38
|
+
"claim.name": "username",
|
|
39
|
+
"jsonType.label": "String"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "email",
|
|
44
|
+
protocol: "openid-connect",
|
|
45
|
+
protocolMapper: "oidc-usermodel-property-mapper",
|
|
46
|
+
config: {
|
|
47
|
+
...claimDefaults,
|
|
48
|
+
"user.attribute": "email",
|
|
49
|
+
"claim.name": "email",
|
|
50
|
+
"jsonType.label": "String"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "full name",
|
|
55
|
+
protocol: "openid-connect",
|
|
56
|
+
protocolMapper: "oidc-full-name-mapper",
|
|
57
|
+
config: { ...claimDefaults }
|
|
58
|
+
}
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
function userWithMattermostId(user) {
|
|
62
|
+
return {
|
|
63
|
+
...user,
|
|
64
|
+
attributes: {
|
|
65
|
+
...user.attributes,
|
|
66
|
+
mattermost_id: [usernameToNumericId(user.username)]
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function buildRealmImport(services, global, combinedEnv, adminPassword, seedUsers = []) {
|
|
71
|
+
const clients = [];
|
|
72
|
+
for (const s of services) {
|
|
73
|
+
const oidc = s.def.provides.oidcClient;
|
|
74
|
+
if (!oidc)
|
|
75
|
+
continue;
|
|
76
|
+
const secretKey = `${s.def.name.replace(/-/g, "_").toUpperCase()}_OIDC_CLIENT_SECRET`;
|
|
77
|
+
const secret = combinedEnv[secretKey];
|
|
78
|
+
if (!secret) {
|
|
79
|
+
throw new Error(`Missing OIDC client secret in env: ${secretKey}`);
|
|
80
|
+
}
|
|
81
|
+
const ctx = { form: s.config.form, global };
|
|
82
|
+
const client = {
|
|
83
|
+
clientId: oidc.clientId,
|
|
84
|
+
secret,
|
|
85
|
+
redirectUris: oidc.redirectUris.map((u) => renderTemplate(u, ctx)),
|
|
86
|
+
// Always include `openid` in the issued token's scopes — it's the
|
|
87
|
+
// marker that an access token came from an OIDC flow, and Keycloak's
|
|
88
|
+
// /userinfo endpoint returns 403 ("Missing openid scope") without
|
|
89
|
+
// it. Services may still request a narrower OAuth scope set from
|
|
90
|
+
// the IdP (e.g. Mattermost's `gitlab` provider must NOT pass
|
|
91
|
+
// openid in the auth request); defaultClientScopes is independent
|
|
92
|
+
// of the request and attached server-side at token-issuance time.
|
|
93
|
+
defaultClientScopes: oidc.scopes.includes("openid")
|
|
94
|
+
? oidc.scopes
|
|
95
|
+
: ["openid", ...oidc.scopes],
|
|
96
|
+
publicClient: false,
|
|
97
|
+
standardFlowEnabled: true
|
|
98
|
+
};
|
|
99
|
+
if (oidc.userinfoFormat === "gitlab") {
|
|
100
|
+
client.protocolMappers = gitlabUserinfoMappers();
|
|
101
|
+
}
|
|
102
|
+
// Any service that declares `provides.oidcClient.tokenExchange: true`
|
|
103
|
+
// (e.g. the bridge launcher) gets Keycloak's standard token-exchange
|
|
104
|
+
// grant enabled on its client. This stays declarative — the engine
|
|
105
|
+
// never names specific services.
|
|
106
|
+
if (oidc.tokenExchange === true) {
|
|
107
|
+
client.attributes = {
|
|
108
|
+
...client.attributes,
|
|
109
|
+
"token.exchange.standard.enabled": "true"
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
clients.push(client);
|
|
113
|
+
}
|
|
114
|
+
const baseAdmin = {
|
|
115
|
+
username: "admin",
|
|
116
|
+
enabled: true,
|
|
117
|
+
email: global.adminEmail,
|
|
118
|
+
credentials: [{ type: "password", value: adminPassword, temporary: false }],
|
|
119
|
+
realmRoles: ["admin"]
|
|
120
|
+
};
|
|
121
|
+
const users = [userWithMattermostId(baseAdmin)];
|
|
122
|
+
// Preseeded users from the wizard. Each carries a temporary password
|
|
123
|
+
// generated at render time; Keycloak forces `UPDATE_PASSWORD` on first
|
|
124
|
+
// login so the temp value never survives past the initial sign-in.
|
|
125
|
+
for (const u of seedUsers) {
|
|
126
|
+
users.push(userWithMattermostId({
|
|
127
|
+
username: u.username,
|
|
128
|
+
enabled: true,
|
|
129
|
+
email: u.email,
|
|
130
|
+
emailVerified: true,
|
|
131
|
+
firstName: u.firstName,
|
|
132
|
+
lastName: u.lastName,
|
|
133
|
+
credentials: [{ type: "password", value: u.tempPassword, temporary: true }],
|
|
134
|
+
realmRoles: [],
|
|
135
|
+
requiredActions: ["UPDATE_PASSWORD"]
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
realm: "gezelligate",
|
|
140
|
+
enabled: true,
|
|
141
|
+
clients,
|
|
142
|
+
// Provide a realm-level `openid` ClientScope so services that put
|
|
143
|
+
// "openid" in their oidc.scopes can reference a real ClientScope
|
|
144
|
+
// object. Without this, Keycloak's /userinfo endpoint rejects
|
|
145
|
+
// tokens with "Missing openid scope" — the check inspects granted
|
|
146
|
+
// client scopes, not the JWT scope claim.
|
|
147
|
+
clientScopes: [
|
|
148
|
+
{
|
|
149
|
+
name: "openid",
|
|
150
|
+
description: "OIDC marker scope so /userinfo accepts the access token",
|
|
151
|
+
protocol: "openid-connect",
|
|
152
|
+
attributes: {
|
|
153
|
+
"include.in.token.scope": "true",
|
|
154
|
+
"display.on.consent.screen": "false"
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
],
|
|
158
|
+
users
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=keycloak.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.js","sourceRoot":"","sources":["../src/keycloak.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numericId.d.ts","sourceRoot":"","sources":["../src/numericId.ts"],"names":[],"mappings":"AAWA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS5D"}
|