@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 @@
1
+ {"version":3,"file":"tarball.js","sourceRoot":"","sources":["../../src/catalog/tarball.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,2EAA2E;AAC3E,0EAA0E;AAC1E,uEAAuE;AACvE,0DAA0D;AAC1D,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,qCAAqC;AAErC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAoB9C,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;QACzC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QAC7C,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,GAAW;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB,EAAE,GAAW;IACtE,MAAM,EAAE,UAAU,EAAE,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAA2B;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,qBAAqB,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,oBAAoB,CAAC;IAC/C,MAAM,GAAG,GAAG,+BAA+B,KAAK,IAAI,IAAI,WAAW,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAElG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,MAAM,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YAC5E,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;SACtC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAChF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QACH,yEAAyE;QACzE,wEAAwE;QACxE,oEAAoE;QACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAyD,CAAC,CAAC;QACnG,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/B,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAA0C,EAAE;IACxF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,qBAAqB,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,oBAAoB,CAAC;IAC/C,MAAM,GAAG,GAAG,gCAAgC,KAAK,IAAI,IAAI,kBAAkB,CAAC;IAC5E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE,YAAY,EAAE,aAAa,EAAE;KAChF,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,uEAAuE;QACvE,aAAa;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,8CAA8C,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC"}
@@ -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"}
@@ -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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"}
@@ -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,4 @@
1
+ import type { ServiceState } from "./keycloak.js";
2
+ import type { GlobalConfig } from "./schema/configYaml.js";
3
+ export declare function buildCaddyfile(services: ServiceState[], global: GlobalConfig): string;
4
+ //# sourceMappingURL=ingress.d.ts.map
@@ -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"}
@@ -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"}
@@ -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":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AA4DrD,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO,QAAQ,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,gBAAgB,CAAC;AACnF,CAAC;AAED,wEAAwE;AACxE,4BAA4B;AAC5B,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,wEAAwE;AACxE,uDAAuD;AACvD,SAAS,qBAAqB;IAC5B,MAAM,aAAa,GAAG;QACpB,sBAAsB,EAAE,MAAM;QAC9B,gBAAgB,EAAE,MAAM;QACxB,oBAAoB,EAAE,MAAM;KAC7B,CAAC;IACF,OAAO;QACL;YACE,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,gBAAgB;YAC1B,cAAc,EAAE,iCAAiC;YACjD,MAAM,EAAE;gBACN,GAAG,aAAa;gBAChB,gBAAgB,EAAE,eAAe;gBACjC,YAAY,EAAE,IAAI;gBAClB,gBAAgB,EAAE,MAAM;aACzB;SACF;QACD;YACE,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,gBAAgB;YAC1B,cAAc,EAAE,gCAAgC;YAChD,MAAM,EAAE;gBACN,GAAG,aAAa;gBAChB,gBAAgB,EAAE,UAAU;gBAC5B,YAAY,EAAE,UAAU;gBACxB,gBAAgB,EAAE,QAAQ;aAC3B;SACF;QACD;YACE,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,gBAAgB;YAC1B,cAAc,EAAE,gCAAgC;YAChD,MAAM,EAAE;gBACN,GAAG,aAAa;gBAChB,gBAAgB,EAAE,OAAO;gBACzB,YAAY,EAAE,OAAO;gBACrB,gBAAgB,EAAE,QAAQ;aAC3B;SACF;QACD;YACE,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,gBAAgB;YAC1B,cAAc,EAAE,uBAAuB;YACvC,MAAM,EAAE,EAAE,GAAG,aAAa,EAAE;SAC7B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAqB;IACjD,OAAO;QACL,GAAG,IAAI;QACP,UAAU,EAAE;YACV,GAAG,IAAI,CAAC,UAAU;YAClB,aAAa,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACpD;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAwB,EACxB,MAAoB,EACpB,WAAmC,EACnC,aAAqB,EACrB,YAA0B,EAAE;IAE5B,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,qBAAqB,CAAC;QACtF,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAsB;YAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM;YACN,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAClE,kEAAkE;YAClE,qEAAqE;YACrE,kEAAkE;YAClE,iEAAiE;YACjE,6DAA6D;YAC7D,kEAAkE;YAClE,kEAAkE;YAClE,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACjD,CAAC,CAAC,IAAI,CAAC,MAAM;gBACb,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;YAC9B,YAAY,EAAE,KAAK;YACnB,mBAAmB,EAAE,IAAI;SAC1B,CAAC;QACF,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,CAAC,eAAe,GAAG,qBAAqB,EAAE,CAAC;QACnD,CAAC;QACD,sEAAsE;QACtE,qEAAqE;QACrE,mEAAmE;QACnE,iCAAiC;QACjC,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,UAAU,GAAG;gBAClB,GAAG,MAAM,CAAC,UAAU;gBACpB,iCAAiC,EAAE,MAAM;aAC1C,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAoB;QACjC,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,MAAM,CAAC,UAAU;QACxB,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC3E,UAAU,EAAE,CAAC,OAAO,CAAC;KACtB,CAAC;IACF,MAAM,KAAK,GAAsB,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnE,qEAAqE;IACrE,uEAAuE;IACvE,mEAAmE;IACnE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC;YAC9B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,aAAa,EAAE,IAAI;YACnB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC3E,UAAU,EAAE,EAAE;YACd,eAAe,EAAE,CAAC,iBAAiB,CAAC;SACrC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO;QACL,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,IAAI;QACb,OAAO;QACP,kEAAkE;QAClE,iEAAiE;QACjE,8DAA8D;QAC9D,kEAAkE;QAClE,0CAA0C;QAC1C,YAAY,EAAE;YACZ;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yDAAyD;gBACtE,QAAQ,EAAE,gBAAgB;gBAC1B,UAAU,EAAE;oBACV,wBAAwB,EAAE,MAAM;oBAChC,2BAA2B,EAAE,OAAO;iBACrC;aACF;SACF;QACD,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function usernameToNumericId(username: string): string;
2
+ //# sourceMappingURL=numericId.d.ts.map
@@ -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"}