@wildo-ai/platform-config-lib 1.0.1
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/dist/esm/bootstrap/application-backend-env.contracts.d.ts +2 -0
- package/dist/esm/bootstrap/application-backend-env.contracts.d.ts.map +1 -0
- package/dist/esm/bootstrap/application-backend-env.contracts.js +2 -0
- package/dist/esm/bootstrap/application-backend-env.contracts.js.map +1 -0
- package/dist/esm/bootstrap/bootstrap-planner.d.ts +20 -0
- package/dist/esm/bootstrap/bootstrap-planner.d.ts.map +1 -0
- package/dist/esm/bootstrap/bootstrap-planner.js +26 -0
- package/dist/esm/bootstrap/bootstrap-planner.js.map +1 -0
- package/dist/esm/bootstrap/bootstrap.contracts.d.ts +120 -0
- package/dist/esm/bootstrap/bootstrap.contracts.d.ts.map +1 -0
- package/dist/esm/bootstrap/bootstrap.contracts.js +117 -0
- package/dist/esm/bootstrap/bootstrap.contracts.js.map +1 -0
- package/dist/esm/bootstrap/bootstrap.schemas.d.ts +485 -0
- package/dist/esm/bootstrap/bootstrap.schemas.d.ts.map +1 -0
- package/dist/esm/bootstrap/bootstrap.schemas.js +130 -0
- package/dist/esm/bootstrap/bootstrap.schemas.js.map +1 -0
- package/dist/esm/bootstrap/platform-runtime-env.contracts.d.ts +78 -0
- package/dist/esm/bootstrap/platform-runtime-env.contracts.d.ts.map +1 -0
- package/dist/esm/bootstrap/platform-runtime-env.contracts.js +98 -0
- package/dist/esm/bootstrap/platform-runtime-env.contracts.js.map +1 -0
- package/dist/esm/bootstrap/runtime-topology.contracts.d.ts +17 -0
- package/dist/esm/bootstrap/runtime-topology.contracts.d.ts.map +1 -0
- package/dist/esm/bootstrap/runtime-topology.contracts.js +60 -0
- package/dist/esm/bootstrap/runtime-topology.contracts.js.map +1 -0
- package/dist/esm/credentials/credential-generator.service.d.ts +11 -0
- package/dist/esm/credentials/credential-generator.service.d.ts.map +1 -0
- package/dist/esm/credentials/credential-generator.service.js +31 -0
- package/dist/esm/credentials/credential-generator.service.js.map +1 -0
- package/dist/esm/credentials/credentials-provisioner.service.d.ts +190 -0
- package/dist/esm/credentials/credentials-provisioner.service.d.ts.map +1 -0
- package/dist/esm/credentials/credentials-provisioner.service.js +278 -0
- package/dist/esm/credentials/credentials-provisioner.service.js.map +1 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/infra-managers/infra-manager.models.d.ts +146 -0
- package/dist/esm/infra-managers/infra-manager.models.d.ts.map +1 -0
- package/dist/esm/infra-managers/infra-manager.models.js +2 -0
- package/dist/esm/infra-managers/infra-manager.models.js.map +1 -0
- package/dist/esm/infra-managers/mongo-atlas-manager.service.d.ts +64 -0
- package/dist/esm/infra-managers/mongo-atlas-manager.service.d.ts.map +1 -0
- package/dist/esm/infra-managers/mongo-atlas-manager.service.js +307 -0
- package/dist/esm/infra-managers/mongo-atlas-manager.service.js.map +1 -0
- package/dist/esm/infra-managers/postgresql-manager.service.d.ts +115 -0
- package/dist/esm/infra-managers/postgresql-manager.service.d.ts.map +1 -0
- package/dist/esm/infra-managers/postgresql-manager.service.js +403 -0
- package/dist/esm/infra-managers/postgresql-manager.service.js.map +1 -0
- package/dist/esm/infra-managers/rabbitmq-manager.service.d.ts +64 -0
- package/dist/esm/infra-managers/rabbitmq-manager.service.d.ts.map +1 -0
- package/dist/esm/infra-managers/rabbitmq-manager.service.js +288 -0
- package/dist/esm/infra-managers/rabbitmq-manager.service.js.map +1 -0
- package/dist/esm/infra-managers/redis-manager.service.d.ts +78 -0
- package/dist/esm/infra-managers/redis-manager.service.d.ts.map +1 -0
- package/dist/esm/infra-managers/redis-manager.service.js +326 -0
- package/dist/esm/infra-managers/redis-manager.service.js.map +1 -0
- package/dist/esm/project-config/define-framework-config.d.ts +36 -0
- package/dist/esm/project-config/define-framework-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-framework-config.js +30 -0
- package/dist/esm/project-config/define-framework-config.js.map +1 -0
- package/dist/esm/project-config/define-infra-config.d.ts +128 -0
- package/dist/esm/project-config/define-infra-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-infra-config.js +87 -0
- package/dist/esm/project-config/define-infra-config.js.map +1 -0
- package/dist/esm/project-config/define-minion-config.d.ts +41 -0
- package/dist/esm/project-config/define-minion-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-minion-config.js +24 -0
- package/dist/esm/project-config/define-minion-config.js.map +1 -0
- package/dist/esm/project-config/define-platform-config.d.ts +65 -0
- package/dist/esm/project-config/define-platform-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-platform-config.js +22 -0
- package/dist/esm/project-config/define-platform-config.js.map +1 -0
- package/dist/esm/project-config/define-platform-env-config.d.ts +41 -0
- package/dist/esm/project-config/define-platform-env-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-platform-env-config.js +45 -0
- package/dist/esm/project-config/define-platform-env-config.js.map +1 -0
- package/dist/esm/project-config/define-project-config.d.ts +38 -0
- package/dist/esm/project-config/define-project-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-project-config.js +57 -0
- package/dist/esm/project-config/define-project-config.js.map +1 -0
- package/dist/esm/project-config/define-saas-config.d.ts +252 -0
- package/dist/esm/project-config/define-saas-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-saas-config.js +137 -0
- package/dist/esm/project-config/define-saas-config.js.map +1 -0
- package/dist/esm/project-config/define-sharing-policy.d.ts +35 -0
- package/dist/esm/project-config/define-sharing-policy.d.ts.map +1 -0
- package/dist/esm/project-config/define-sharing-policy.js +30 -0
- package/dist/esm/project-config/define-sharing-policy.js.map +1 -0
- package/dist/esm/project-config/define-worker-config.d.ts +42 -0
- package/dist/esm/project-config/define-worker-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-worker-config.js +24 -0
- package/dist/esm/project-config/define-worker-config.js.map +1 -0
- package/dist/esm/project-config/index.d.ts +22 -0
- package/dist/esm/project-config/index.d.ts.map +1 -0
- package/dist/esm/project-config/index.js +22 -0
- package/dist/esm/project-config/index.js.map +1 -0
- package/dist/esm/project-config/loader.d.ts +42 -0
- package/dist/esm/project-config/loader.d.ts.map +1 -0
- package/dist/esm/project-config/loader.js +164 -0
- package/dist/esm/project-config/loader.js.map +1 -0
- package/dist/esm/project-config/shared/application-modules.schemas.d.ts +10 -0
- package/dist/esm/project-config/shared/application-modules.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/application-modules.schemas.js +6 -0
- package/dist/esm/project-config/shared/application-modules.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/application-modules.utils.d.ts +6 -0
- package/dist/esm/project-config/shared/application-modules.utils.d.ts.map +1 -0
- package/dist/esm/project-config/shared/application-modules.utils.js +26 -0
- package/dist/esm/project-config/shared/application-modules.utils.js.map +1 -0
- package/dist/esm/project-config/shared/backing-services.schemas.d.ts +68 -0
- package/dist/esm/project-config/shared/backing-services.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/backing-services.schemas.js +49 -0
- package/dist/esm/project-config/shared/backing-services.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/data-services.schemas.d.ts +33 -0
- package/dist/esm/project-config/shared/data-services.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/data-services.schemas.js +47 -0
- package/dist/esm/project-config/shared/data-services.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/env-example-defaults.d.ts +27 -0
- package/dist/esm/project-config/shared/env-example-defaults.d.ts.map +1 -0
- package/dist/esm/project-config/shared/env-example-defaults.js +30 -0
- package/dist/esm/project-config/shared/env-example-defaults.js.map +1 -0
- package/dist/esm/project-config/shared/environment.schemas.d.ts +106 -0
- package/dist/esm/project-config/shared/environment.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/environment.schemas.js +111 -0
- package/dist/esm/project-config/shared/environment.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/infrastructure-defaults.schemas.d.ts +42 -0
- package/dist/esm/project-config/shared/infrastructure-defaults.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/infrastructure-defaults.schemas.js +42 -0
- package/dist/esm/project-config/shared/infrastructure-defaults.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/k8s-utils.d.ts +36 -0
- package/dist/esm/project-config/shared/k8s-utils.d.ts.map +1 -0
- package/dist/esm/project-config/shared/k8s-utils.js +50 -0
- package/dist/esm/project-config/shared/k8s-utils.js.map +1 -0
- package/dist/esm/project-config/shared/platform-services.schemas.d.ts +30 -0
- package/dist/esm/project-config/shared/platform-services.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/platform-services.schemas.js +27 -0
- package/dist/esm/project-config/shared/platform-services.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/service-definitions.schemas.d.ts +42 -0
- package/dist/esm/project-config/shared/service-definitions.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/service-definitions.schemas.js +29 -0
- package/dist/esm/project-config/shared/service-definitions.schemas.js.map +1 -0
- package/dist/esm/project-config/sharing-policy-validation.d.ts +40 -0
- package/dist/esm/project-config/sharing-policy-validation.d.ts.map +1 -0
- package/dist/esm/project-config/sharing-policy-validation.js +143 -0
- package/dist/esm/project-config/sharing-policy-validation.js.map +1 -0
- package/dist/esm/release/framework-release.constants.d.ts +3 -0
- package/dist/esm/release/framework-release.constants.d.ts.map +1 -0
- package/dist/esm/release/framework-release.constants.js +3 -0
- package/dist/esm/release/framework-release.constants.js.map +1 -0
- package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.d.ts +23 -0
- package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.d.ts.map +1 -0
- package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.js +13 -0
- package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.js.map +1 -0
- package/dist/esm/schemas/framework-info.schemas.d.ts +8 -0
- package/dist/esm/schemas/framework-info.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/framework-info.schemas.js +8 -0
- package/dist/esm/schemas/framework-info.schemas.js.map +1 -0
- package/dist/esm/schemas/framework-secrets.schemas.d.ts +22 -0
- package/dist/esm/schemas/framework-secrets.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/framework-secrets.schemas.js +14 -0
- package/dist/esm/schemas/framework-secrets.schemas.js.map +1 -0
- package/dist/esm/schemas/platform-application-config.schemas.d.ts +20 -0
- package/dist/esm/schemas/platform-application-config.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/platform-application-config.schemas.js +19 -0
- package/dist/esm/schemas/platform-application-config.schemas.js.map +1 -0
- package/dist/esm/schemas/platform-application-secrets.schemas.d.ts +54 -0
- package/dist/esm/schemas/platform-application-secrets.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/platform-application-secrets.schemas.js +67 -0
- package/dist/esm/schemas/platform-application-secrets.schemas.js.map +1 -0
- package/dist/esm/schemas/platform-config.schemas.d.ts +66 -0
- package/dist/esm/schemas/platform-config.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/platform-config.schemas.js +28 -0
- package/dist/esm/schemas/platform-config.schemas.js.map +1 -0
- package/dist/esm/workspace-scope/index.d.ts +3 -0
- package/dist/esm/workspace-scope/index.d.ts.map +1 -0
- package/dist/esm/workspace-scope/index.js +3 -0
- package/dist/esm/workspace-scope/index.js.map +1 -0
- package/dist/esm/workspace-scope/workspace-scope-detector.d.ts +15 -0
- package/dist/esm/workspace-scope/workspace-scope-detector.d.ts.map +1 -0
- package/dist/esm/workspace-scope/workspace-scope-detector.js +87 -0
- package/dist/esm/workspace-scope/workspace-scope-detector.js.map +1 -0
- package/dist/esm/workspace-scope/workspace-scope.schemas.d.ts +118 -0
- package/dist/esm/workspace-scope/workspace-scope.schemas.d.ts.map +1 -0
- package/dist/esm/workspace-scope/workspace-scope.schemas.js +157 -0
- package/dist/esm/workspace-scope/workspace-scope.schemas.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +52 -0
- package/src/bootstrap/application-backend-env.contracts.ts +17 -0
- package/src/bootstrap/bootstrap-planner.ts +46 -0
- package/src/bootstrap/bootstrap.contracts.ts +251 -0
- package/src/bootstrap/bootstrap.schemas.ts +164 -0
- package/src/bootstrap/platform-runtime-env.contracts.ts +99 -0
- package/src/bootstrap/runtime-topology.contracts.ts +102 -0
- package/src/credentials/credential-generator.service.ts +39 -0
- package/src/index.ts +16 -0
- package/src/project-config/__tests__/application-modules.utils.test.ts +53 -0
- package/src/project-config/__tests__/define-framework-config.test.ts +43 -0
- package/src/project-config/__tests__/define-saas-config.test.ts +210 -0
- package/src/project-config/__tests__/loader.test.ts +100 -0
- package/src/project-config/define-framework-config.ts +44 -0
- package/src/project-config/define-infra-config.ts +168 -0
- package/src/project-config/define-minion-config.ts +27 -0
- package/src/project-config/define-platform-config.ts +28 -0
- package/src/project-config/define-platform-env-config.ts +59 -0
- package/src/project-config/define-project-config.ts +63 -0
- package/src/project-config/define-saas-config.ts +171 -0
- package/src/project-config/define-sharing-policy.ts +36 -0
- package/src/project-config/define-worker-config.ts +27 -0
- package/src/project-config/index.ts +23 -0
- package/src/project-config/loader.ts +220 -0
- package/src/project-config/shared/application-modules.schemas.ts +12 -0
- package/src/project-config/shared/application-modules.utils.ts +65 -0
- package/src/project-config/shared/backing-services.schemas.ts +59 -0
- package/src/project-config/shared/data-services.schemas.ts +58 -0
- package/src/project-config/shared/env-example-defaults.ts +50 -0
- package/src/project-config/shared/environment.schemas.ts +136 -0
- package/src/project-config/shared/infrastructure-defaults.schemas.ts +47 -0
- package/src/project-config/shared/k8s-utils.ts +56 -0
- package/src/project-config/shared/platform-services.schemas.ts +33 -0
- package/src/project-config/shared/service-definitions.schemas.ts +38 -0
- package/src/project-config/sharing-policy-validation.ts +159 -0
- package/src/release/framework-release.constants.ts +2 -0
- package/src/schemas/__tests__/platform-config.schemas.test.ts +90 -0
- package/src/schemas/framework-info.schemas.ts +13 -0
- package/src/schemas/framework-secrets.schemas.ts +19 -0
- package/src/schemas/platform-application-config.schemas.ts +25 -0
- package/src/schemas/platform-application-secrets.schemas.ts +78 -0
- package/src/schemas/platform-config.schemas.ts +45 -0
- package/src/workspace-scope/index.ts +2 -0
- package/src/workspace-scope/workspace-scope-detector.ts +98 -0
- package/src/workspace-scope/workspace-scope.schemas.ts +224 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ApplicationModules } from './application-modules.schemas';
|
|
2
|
+
|
|
3
|
+
function resolveModuleIds(
|
|
4
|
+
modules: ApplicationModules | undefined,
|
|
5
|
+
predicate: (serviceKeys: string[]) => boolean,
|
|
6
|
+
): string[] {
|
|
7
|
+
return Object.entries(modules ?? {})
|
|
8
|
+
.filter(([, binding]) => predicate(binding.services))
|
|
9
|
+
.map(([moduleId]) => moduleId);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function pickApplicationModules<T>(
|
|
13
|
+
moduleIds: string[],
|
|
14
|
+
declaredModulesById: Record<string, T>,
|
|
15
|
+
consumerLabel: string,
|
|
16
|
+
): T[] {
|
|
17
|
+
const missingModuleIds = moduleIds.filter((moduleId) => !(moduleId in declaredModulesById));
|
|
18
|
+
|
|
19
|
+
if (missingModuleIds.length > 0) {
|
|
20
|
+
throw new Error(
|
|
21
|
+
`Application modules [${missingModuleIds.join(', ')}] are declared for ${consumerLabel} ` +
|
|
22
|
+
'in wildo.saas.config.ts but no matching implementation was registered.',
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return moduleIds.map((moduleId) => declaredModulesById[moduleId]!);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getDeclaredApplicationModuleIds(
|
|
30
|
+
modules: ApplicationModules | undefined,
|
|
31
|
+
): string[] {
|
|
32
|
+
return resolveModuleIds(modules, () => true);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function getServiceBoundApplicationModuleIds(
|
|
36
|
+
modules: ApplicationModules | undefined,
|
|
37
|
+
serviceKey: string,
|
|
38
|
+
): string[] {
|
|
39
|
+
return resolveModuleIds(modules, (serviceKeys) => serviceKeys.includes(serviceKey));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function resolveDeclaredApplicationModules<T>(
|
|
43
|
+
modules: ApplicationModules | undefined,
|
|
44
|
+
declaredModulesById: Record<string, T>,
|
|
45
|
+
consumerLabel: string,
|
|
46
|
+
): T[] {
|
|
47
|
+
return pickApplicationModules(
|
|
48
|
+
getDeclaredApplicationModuleIds(modules),
|
|
49
|
+
declaredModulesById,
|
|
50
|
+
consumerLabel,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function resolveServiceBoundApplicationModules<T>(
|
|
55
|
+
modules: ApplicationModules | undefined,
|
|
56
|
+
serviceKey: string,
|
|
57
|
+
declaredModulesById: Record<string, T>,
|
|
58
|
+
consumerLabel = `service "${serviceKey}"`,
|
|
59
|
+
): T[] {
|
|
60
|
+
return pickApplicationModules(
|
|
61
|
+
getServiceBoundApplicationModuleIds(modules, serviceKey),
|
|
62
|
+
declaredModulesById,
|
|
63
|
+
consumerLabel,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export enum BackingServiceKind {
|
|
4
|
+
MONGODB = 'mongodb',
|
|
5
|
+
REDIS = 'redis',
|
|
6
|
+
RABBITMQ = 'rabbitmq',
|
|
7
|
+
S3 = 's3',
|
|
8
|
+
POSTGRESQL = 'postgresql',
|
|
9
|
+
GOTENBERG = 'gotenberg',
|
|
10
|
+
CLAMAV = 'clamav',
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Source of a backing service instance.
|
|
15
|
+
* - `self`: self-hosted container (Docker/K8s), managed by the platform
|
|
16
|
+
* - `atlas`: MongoDB Atlas (managed cloud)
|
|
17
|
+
* - `managed`: other managed cloud provider
|
|
18
|
+
*/
|
|
19
|
+
export enum BackingServiceSource {
|
|
20
|
+
SELF = 'self',
|
|
21
|
+
ATLAS = 'atlas',
|
|
22
|
+
MANAGED = 'managed',
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const BackingServiceToggleSchema = z.object({
|
|
26
|
+
enabled: z.boolean(),
|
|
27
|
+
});
|
|
28
|
+
export type BackingServiceToggle = z.infer<typeof BackingServiceToggleSchema>;
|
|
29
|
+
|
|
30
|
+
export const BackingServiceEnvConfigSchema = z.object({
|
|
31
|
+
source: z.enum(BackingServiceSource),
|
|
32
|
+
provider: z.string().min(1).optional(),
|
|
33
|
+
});
|
|
34
|
+
export type BackingServiceEnvConfig = z.infer<typeof BackingServiceEnvConfigSchema>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Platform-level backing services declaration (which services are available).
|
|
38
|
+
* Used in `wildo.platform.config.ts`.
|
|
39
|
+
*/
|
|
40
|
+
export const BackingServicesDeclarationSchema = z.object({
|
|
41
|
+
[BackingServiceKind.MONGODB]: BackingServiceToggleSchema.optional(),
|
|
42
|
+
[BackingServiceKind.REDIS]: BackingServiceToggleSchema.optional(),
|
|
43
|
+
[BackingServiceKind.RABBITMQ]: BackingServiceToggleSchema.optional(),
|
|
44
|
+
[BackingServiceKind.S3]: BackingServiceToggleSchema.optional(),
|
|
45
|
+
[BackingServiceKind.POSTGRESQL]: BackingServiceToggleSchema.optional(),
|
|
46
|
+
[BackingServiceKind.GOTENBERG]: BackingServiceToggleSchema.optional(),
|
|
47
|
+
[BackingServiceKind.CLAMAV]: BackingServiceToggleSchema.optional(),
|
|
48
|
+
});
|
|
49
|
+
export type BackingServicesDeclaration = z.infer<typeof BackingServicesDeclarationSchema>;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Per-environment backing services config (source for each service).
|
|
53
|
+
* Used in `wildo.platform.config.{env}.ts`.
|
|
54
|
+
*/
|
|
55
|
+
export const BackingServicesEnvConfigSchema = z.record(
|
|
56
|
+
z.enum(BackingServiceKind),
|
|
57
|
+
BackingServiceEnvConfigSchema,
|
|
58
|
+
);
|
|
59
|
+
export type BackingServicesEnvConfig = z.infer<typeof BackingServicesEnvConfigSchema>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
const AppDatabaseBackedServiceSchema = z.object({
|
|
4
|
+
databasePrefix: z.string().min(1),
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* App-level data service configuration.
|
|
9
|
+
* Declares how the app uses each backing service (prefixes, vhosts, etc.).
|
|
10
|
+
* Used in `wildo.saas.config.ts`.
|
|
11
|
+
*/
|
|
12
|
+
export const AppDataServicesSchema = z.object({
|
|
13
|
+
mongodb: AppDatabaseBackedServiceSchema.optional(),
|
|
14
|
+
redis: z.object({
|
|
15
|
+
keyPrefix: z.string().min(1),
|
|
16
|
+
}).optional(),
|
|
17
|
+
rabbitmq: z.object({
|
|
18
|
+
vhost: z.string().min(1),
|
|
19
|
+
}).optional(),
|
|
20
|
+
s3: z.object({
|
|
21
|
+
bucketPrefix: z.string().min(1),
|
|
22
|
+
}).optional(),
|
|
23
|
+
postgresql: AppDatabaseBackedServiceSchema.optional(),
|
|
24
|
+
});
|
|
25
|
+
export type AppDataServices = z.infer<typeof AppDataServicesSchema>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Resolve the canonical application database name across supported database engines.
|
|
29
|
+
*
|
|
30
|
+
* Framework semantics treat the application database name as a cross-engine concept,
|
|
31
|
+
* not a MongoDB-only field. When multiple database engines are configured, they must
|
|
32
|
+
* agree on the same prefix or the runtime target would become ambiguous.
|
|
33
|
+
*/
|
|
34
|
+
export function deriveAppDatabaseName(
|
|
35
|
+
dataServices: AppDataServices | undefined,
|
|
36
|
+
): string | undefined {
|
|
37
|
+
if (!dataServices) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const configuredPrefixes = [
|
|
42
|
+
dataServices.mongodb?.databasePrefix,
|
|
43
|
+
dataServices.postgresql?.databasePrefix,
|
|
44
|
+
].filter((value): value is string => value !== undefined);
|
|
45
|
+
|
|
46
|
+
const uniquePrefixes = [...new Set(configuredPrefixes)];
|
|
47
|
+
if (uniquePrefixes.length === 0) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (uniquePrefixes.length > 1) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
`Application database prefixes must match across configured database engines. Received: ${uniquePrefixes.join(', ')}`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return uniquePrefixes[0];
|
|
58
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default context values for the app-backend-env.example.hbs template.
|
|
3
|
+
* Provides fake/placeholder data derived from infrastructure defaults.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { INFRA_DEFAULT_PORTS, PLATFORM_DEFAULT_PORTS } from './infrastructure-defaults.schemas';
|
|
7
|
+
|
|
8
|
+
export interface AppBackendEnvExampleContext {
|
|
9
|
+
APPLICATION_ID: string;
|
|
10
|
+
PLATFORM_APPLICATION_PRIMARY_SECRET: string;
|
|
11
|
+
PLATFORM_APPS_MANAGER_URL: string;
|
|
12
|
+
APPLICATION_ENV: string;
|
|
13
|
+
SERVICE_NAME: string;
|
|
14
|
+
PLATFORM_FILE_GENERATOR_URL: string;
|
|
15
|
+
PLATFORM_CRONTABS_BATCHES_MANAGER_URL: string;
|
|
16
|
+
MONGODB_HOST: string;
|
|
17
|
+
MONGODB_DATABASE: string;
|
|
18
|
+
MONGODB_PROTOCOL: string;
|
|
19
|
+
REDIS_HOST: string;
|
|
20
|
+
REDIS_PORT: number;
|
|
21
|
+
RABBITMQ_HOST: string;
|
|
22
|
+
RABBITMQ_PORT: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Build the default template context for the app backend .env example.
|
|
27
|
+
* All values are placeholder/local defaults — real values come from
|
|
28
|
+
* secrets.json + config.json via `wildo config sync`.
|
|
29
|
+
*/
|
|
30
|
+
export function buildAppBackendEnvExampleDefaults(
|
|
31
|
+
overrides?: Partial<AppBackendEnvExampleContext>,
|
|
32
|
+
): AppBackendEnvExampleContext {
|
|
33
|
+
return {
|
|
34
|
+
APPLICATION_ID: 'your-app-id-from-platform',
|
|
35
|
+
PLATFORM_APPLICATION_PRIMARY_SECRET: 'your-super-secure-platform-secret-at-least-32-characters-long',
|
|
36
|
+
PLATFORM_APPS_MANAGER_URL: `http://localhost:${PLATFORM_DEFAULT_PORTS.APPS_MANAGER}`,
|
|
37
|
+
APPLICATION_ENV: 'development',
|
|
38
|
+
SERVICE_NAME: 'your-service-name',
|
|
39
|
+
PLATFORM_FILE_GENERATOR_URL: `http://localhost:${PLATFORM_DEFAULT_PORTS.FILE_GENERATOR}`,
|
|
40
|
+
PLATFORM_CRONTABS_BATCHES_MANAGER_URL: `http://localhost:${PLATFORM_DEFAULT_PORTS.CRONTABS_BATCHES_MANAGER}`,
|
|
41
|
+
MONGODB_HOST: `localhost:${INFRA_DEFAULT_PORTS.MONGODB}`,
|
|
42
|
+
MONGODB_DATABASE: 'wildo_app',
|
|
43
|
+
MONGODB_PROTOCOL: 'mongodb',
|
|
44
|
+
REDIS_HOST: 'localhost',
|
|
45
|
+
REDIS_PORT: INFRA_DEFAULT_PORTS.VALKEY,
|
|
46
|
+
RABBITMQ_HOST: 'localhost',
|
|
47
|
+
RABBITMQ_PORT: INFRA_DEFAULT_PORTS.RABBITMQ,
|
|
48
|
+
...overrides,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Convenience environment ids kept for common local/staging/production setups.
|
|
5
|
+
*
|
|
6
|
+
* The project model is no longer limited to a fixed environment set: remote
|
|
7
|
+
* environment ids can be any slug-like value. Use `WildoEnvironmentIdSchema`
|
|
8
|
+
* for authoritative validation.
|
|
9
|
+
*/
|
|
10
|
+
export enum WildoEnvironment {
|
|
11
|
+
LOCAL = 'local',
|
|
12
|
+
STAGING = 'staging',
|
|
13
|
+
PRODUCTION = 'production',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const WildoEnvironmentIdSchema = z
|
|
17
|
+
.string()
|
|
18
|
+
.min(1)
|
|
19
|
+
.regex(
|
|
20
|
+
/^[a-z0-9]+(?:-[a-z0-9]+)*$/,
|
|
21
|
+
'environment ids must be lowercase alphanumeric with optional hyphen-separated segments',
|
|
22
|
+
);
|
|
23
|
+
export type WildoEnvironmentId = z.infer<typeof WildoEnvironmentIdSchema>;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Deployment runtime targets for CI/CD workflows and infra config.
|
|
27
|
+
*
|
|
28
|
+
* Single source of truth for deployment runtime targets, used by both
|
|
29
|
+
* platform-config-lib (developer-facing config) and wildo-cli (operational).
|
|
30
|
+
*/
|
|
31
|
+
export enum WildoDeploymentRuntime {
|
|
32
|
+
DOCKER_COMPOSE = 'docker-compose',
|
|
33
|
+
KUBERNETES = 'kubernetes',
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export enum WildoLocationType {
|
|
37
|
+
LOCAL = 'local',
|
|
38
|
+
REMOTE = 'remote',
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function isLocalEnvironmentId(environmentId: string): boolean {
|
|
42
|
+
return environmentId === WildoEnvironment.LOCAL;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const WildoKubernetesConfigSchema = z.object({
|
|
46
|
+
namespace: z.string().min(1),
|
|
47
|
+
baseDomain: z.string().min(1),
|
|
48
|
+
ingressClass: z.string().min(1).optional(),
|
|
49
|
+
});
|
|
50
|
+
export type WildoKubernetesConfig = z.infer<typeof WildoKubernetesConfigSchema>;
|
|
51
|
+
|
|
52
|
+
export const WildoRemoteProviderSchema = z.object({
|
|
53
|
+
provider: z.string().min(1),
|
|
54
|
+
registryEndpoint: z.string().min(1),
|
|
55
|
+
region: z.string().min(1).optional(),
|
|
56
|
+
});
|
|
57
|
+
export type WildoRemoteProvider = z.infer<typeof WildoRemoteProviderSchema>;
|
|
58
|
+
|
|
59
|
+
export const WildoLoggingConfigSchema = z.object({
|
|
60
|
+
level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
|
|
61
|
+
formattedConsoleErrors: z.boolean().optional(),
|
|
62
|
+
});
|
|
63
|
+
export type WildoLoggingConfig = z.infer<typeof WildoLoggingConfigSchema>;
|
|
64
|
+
|
|
65
|
+
export enum DatabaseEngine {
|
|
66
|
+
MONGODB = 'mongodb',
|
|
67
|
+
POSTGRESQL = 'postgresql',
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export enum WildoImageTagStrategy {
|
|
71
|
+
COMMIT_SHA = 'commit-sha',
|
|
72
|
+
BRANCH_NAME = 'branch-name',
|
|
73
|
+
SEMVER = 'semver',
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Docker Compose deployment — no scaling, no K8s-specific fields.
|
|
78
|
+
*/
|
|
79
|
+
export const DockerComposeDeploymentSchema = z.object({
|
|
80
|
+
branch: z.string().min(1),
|
|
81
|
+
runtime: z.literal(WildoDeploymentRuntime.DOCKER_COMPOSE),
|
|
82
|
+
imageTagStrategy: z.enum(WildoImageTagStrategy).default(WildoImageTagStrategy.COMMIT_SHA),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Kubernetes deployment — includes registry, namespace, and scaling support.
|
|
87
|
+
*/
|
|
88
|
+
export const KubernetesDeploymentSchema = z.object({
|
|
89
|
+
branch: z.string().min(1),
|
|
90
|
+
runtime: z.literal(WildoDeploymentRuntime.KUBERNETES),
|
|
91
|
+
registry: z.string().min(1).optional(),
|
|
92
|
+
namespace: z.string().min(1).optional(),
|
|
93
|
+
imageTagStrategy: z.enum(WildoImageTagStrategy).default(WildoImageTagStrategy.COMMIT_SHA),
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Deployment configuration for CI/CD pipeline integration.
|
|
98
|
+
* Discriminated on `runtime`: K8s-specific fields (`registry`, `namespace`)
|
|
99
|
+
* are only available when `runtime` is `KUBERNETES`.
|
|
100
|
+
*/
|
|
101
|
+
export const WildoDeploymentConfigSchema = z.discriminatedUnion('runtime', [
|
|
102
|
+
DockerComposeDeploymentSchema,
|
|
103
|
+
KubernetesDeploymentSchema,
|
|
104
|
+
]);
|
|
105
|
+
export type WildoDeploymentConfig = z.infer<typeof WildoDeploymentConfigSchema>;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Canonical namespace derivation for platform-managed application resources.
|
|
109
|
+
*
|
|
110
|
+
* Environment ids are part of the namespace because local and arbitrary remote
|
|
111
|
+
* deployments must be isolated through generated names instead of hand-authored
|
|
112
|
+
* checked-in values.
|
|
113
|
+
*/
|
|
114
|
+
export function buildApplicationNamespace(
|
|
115
|
+
appSlug: string,
|
|
116
|
+
environmentId: string,
|
|
117
|
+
): string {
|
|
118
|
+
const normalizedAppSlug = appSlug.trim();
|
|
119
|
+
const normalizedEnvironmentId = environmentId.trim();
|
|
120
|
+
|
|
121
|
+
if (!normalizedAppSlug) {
|
|
122
|
+
throw new Error('appSlug is required to derive an application namespace');
|
|
123
|
+
}
|
|
124
|
+
if (!normalizedEnvironmentId) {
|
|
125
|
+
throw new Error('environmentId is required to derive an application namespace');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return `${normalizedAppSlug}-${normalizedEnvironmentId}`;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function buildApplicationDatabaseUsername(
|
|
132
|
+
appSlug: string,
|
|
133
|
+
environmentId: string,
|
|
134
|
+
): string {
|
|
135
|
+
return `${buildApplicationNamespace(appSlug, environmentId)}_user`;
|
|
136
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure default ports and constants.
|
|
3
|
+
* Single source of truth — CLI catalogs, apps-manager env schemas,
|
|
4
|
+
* and generated manifests all derive from these values.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const INFRA_DEFAULT_PORTS = {
|
|
8
|
+
MONGODB: 27017,
|
|
9
|
+
VALKEY: 6379,
|
|
10
|
+
RABBITMQ: 5672,
|
|
11
|
+
RABBITMQ_MANAGEMENT: 15672,
|
|
12
|
+
MINIO: 9000,
|
|
13
|
+
POSTGRESQL: 5432,
|
|
14
|
+
GOTENBERG: 3100,
|
|
15
|
+
GOTENBERG_INTERNAL: 3000,
|
|
16
|
+
} as const;
|
|
17
|
+
|
|
18
|
+
export const PLATFORM_DEFAULT_PORTS = {
|
|
19
|
+
APPS_MANAGER: 5151,
|
|
20
|
+
CRONTABS_BATCHES_MANAGER: 5152,
|
|
21
|
+
FILE_GENERATOR: 5153,
|
|
22
|
+
} as const;
|
|
23
|
+
|
|
24
|
+
export const K8S_LOCAL_DEFAULTS = {
|
|
25
|
+
NAMESPACE: 'wildo-local',
|
|
26
|
+
BASE_DOMAIN: 'local.wildo.ai',
|
|
27
|
+
} as const;
|
|
28
|
+
|
|
29
|
+
export const KIND_CLUSTER_DEFAULTS = {
|
|
30
|
+
CLUSTER_NAME: 'dev',
|
|
31
|
+
KUBECTL_CONTEXT: 'kind-dev',
|
|
32
|
+
REGISTRY_NAME: 'kind-registry',
|
|
33
|
+
REGISTRY_PORT: 5001,
|
|
34
|
+
} as const;
|
|
35
|
+
|
|
36
|
+
export const STORAGE_DEFAULTS = {
|
|
37
|
+
BUCKET: 'wildo-files',
|
|
38
|
+
PROVIDER: 'minio',
|
|
39
|
+
} as const;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Platform MongoDB database name.
|
|
43
|
+
* This is the database used by apps-manager and platform services for
|
|
44
|
+
* all platform-scoped collections (wildoApplication, platformApplications, etc.).
|
|
45
|
+
* Aligned with PostgreSQL naming (`wildo_platform`).
|
|
46
|
+
*/
|
|
47
|
+
export const PLATFORM_MONGO_DATABASE = 'wildo_platform' as const;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes URL builders and naming conventions.
|
|
3
|
+
* Single source of truth for constructing K8s-style addresses and resource names.
|
|
4
|
+
*
|
|
5
|
+
* Used by CLI (ServiceAddressResolver, K8s manifest gen) and apps-manager
|
|
6
|
+
* (application lifecycle) to ensure consistent URL/naming patterns.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Builds a K8s cluster-internal URL: `http://<service>.<namespace>.svc.cluster.local:<port>`
|
|
11
|
+
*/
|
|
12
|
+
export function buildK8sInternalUrl(service: string, port: number, namespace: string): string {
|
|
13
|
+
return `http://${service}.${namespace}.svc.cluster.local:${port}`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Builds a K8s cluster-internal hostname (without scheme/port).
|
|
18
|
+
*/
|
|
19
|
+
export function buildK8sInternalHost(service: string, namespace: string): string {
|
|
20
|
+
return `${service}.${namespace}.svc.cluster.local`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Builds an ingress-based public URL: `https://<service>.<baseDomain>`
|
|
25
|
+
*/
|
|
26
|
+
export function buildK8sPublicUrl(service: string, baseDomain: string): string {
|
|
27
|
+
return `https://${service}.${baseDomain}`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* K8s Secret name for a platform service: `<service>-secret`
|
|
32
|
+
*/
|
|
33
|
+
export function k8sServiceSecretName(service: string): string {
|
|
34
|
+
return `${service}-secret`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* K8s ConfigMap name for a platform service: `<service>-config`
|
|
39
|
+
*/
|
|
40
|
+
export function k8sServiceConfigMapName(service: string): string {
|
|
41
|
+
return `${service}-config`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* K8s Secret name for an app backend: `app-<serviceName>-secret`
|
|
46
|
+
*/
|
|
47
|
+
export function k8sAppBackendSecretName(serviceName: string): string {
|
|
48
|
+
return `app-${serviceName}-secret`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* K8s ConfigMap name for an app backend: `app-<serviceName>-config`
|
|
53
|
+
*/
|
|
54
|
+
export function k8sAppBackendConfigMapName(serviceName: string): string {
|
|
55
|
+
return `app-${serviceName}-config`;
|
|
56
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Platform microservices. All use the same Docker image (wildo-platform)
|
|
5
|
+
* differentiated at runtime via PLATFORM_SERVICE env var.
|
|
6
|
+
*
|
|
7
|
+
* For app developers: deployed as Docker containers.
|
|
8
|
+
* For framework developers: run natively from source (hot-reload).
|
|
9
|
+
*/
|
|
10
|
+
export enum PlatformWildoServices {
|
|
11
|
+
PLATFORM_INIT = 'platform-init',
|
|
12
|
+
APPS_MANAGER = 'platform-apps-manager',
|
|
13
|
+
CRONTABS_BATCHES_MANAGER = 'platform-crontabs-batches-manager',
|
|
14
|
+
FILE_GENERATOR = 'platform-file-generator',
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export enum AppsManagerMode {
|
|
18
|
+
NORMAL = 'normal',
|
|
19
|
+
INIT = 'init',
|
|
20
|
+
MAINT = 'maint',
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const PlatformServiceConfigSchema = z.object({
|
|
24
|
+
serviceName: z.string().min(1),
|
|
25
|
+
enabled: z.boolean().default(true),
|
|
26
|
+
});
|
|
27
|
+
export type PlatformServiceConfig = z.infer<typeof PlatformServiceConfigSchema>;
|
|
28
|
+
|
|
29
|
+
export const PlatformServicesDeclarationSchema = z.record(
|
|
30
|
+
z.string(),
|
|
31
|
+
PlatformServiceConfigSchema,
|
|
32
|
+
);
|
|
33
|
+
export type PlatformServicesDeclaration = z.infer<typeof PlatformServicesDeclarationSchema>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export enum AppFrontendType {
|
|
4
|
+
SAAS_APP = 'saas-app',
|
|
5
|
+
STATIC_WEBSITE = 'static-website',
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const AppServiceDefinitionSchema = z.object({
|
|
9
|
+
path: z.string().min(1),
|
|
10
|
+
serviceName: z.string().min(1),
|
|
11
|
+
defaultPort: z.number().int().positive().optional(),
|
|
12
|
+
frontendType: z.enum(AppFrontendType).optional(),
|
|
13
|
+
}).strict()
|
|
14
|
+
export type AppServiceDefinition = z.infer<typeof AppServiceDefinitionSchema>;
|
|
15
|
+
|
|
16
|
+
export const WorkerRuntimeSchema = z.object({
|
|
17
|
+
type: z.string().min(1),
|
|
18
|
+
language: z.string().min(1),
|
|
19
|
+
});
|
|
20
|
+
export type WorkerRuntime = z.infer<typeof WorkerRuntimeSchema>;
|
|
21
|
+
|
|
22
|
+
export const ResourceLimitsSchema = z.object({
|
|
23
|
+
cpu: z.string().min(1).optional(),
|
|
24
|
+
memory: z.string().min(1).optional(),
|
|
25
|
+
});
|
|
26
|
+
export type ResourceLimits = z.infer<typeof ResourceLimitsSchema>;
|
|
27
|
+
|
|
28
|
+
export const DataAccessSchema = z.object({
|
|
29
|
+
database: z.enum(['read-only', 'read-write', 'none']).optional(),
|
|
30
|
+
cache: z.boolean().optional(),
|
|
31
|
+
queue: z.enum(['consumer', 'producer', 'both', 'none']).optional(),
|
|
32
|
+
});
|
|
33
|
+
export type DataAccess = z.infer<typeof DataAccessSchema>;
|
|
34
|
+
|
|
35
|
+
export const AppRefSchema = z.object({
|
|
36
|
+
path: z.string().min(1),
|
|
37
|
+
});
|
|
38
|
+
export type AppRef = z.infer<typeof AppRefSchema>;
|