@contember/engine-server 1.1.0-alpha.2 → 1.1.0-alpha.3
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/alpine.dockerfile +3 -1
- package/debian.dockerfile +3 -1
- package/dist/src/MasterContainer.d.ts +104 -8
- package/dist/src/MasterContainer.d.ts.map +1 -1
- package/dist/src/MasterContainer.js +65 -84
- package/dist/src/MasterContainer.js.map +1 -1
- package/dist/src/bootstrap/Initializer.d.ts +3 -12
- package/dist/src/bootstrap/Initializer.d.ts.map +1 -1
- package/dist/src/bootstrap/Initializer.js +8 -24
- package/dist/src/bootstrap/Initializer.js.map +1 -1
- package/dist/src/config/config.d.ts +7 -49
- package/dist/src/config/config.d.ts.map +1 -1
- package/dist/src/config/config.js +11 -188
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/configSchema.d.ts +84 -0
- package/dist/src/config/configSchema.d.ts.map +1 -0
- package/dist/src/config/configSchema.js +80 -0
- package/dist/src/config/configSchema.js.map +1 -0
- package/dist/src/config/configTemplate.d.ts +2 -0
- package/dist/src/config/configTemplate.d.ts.map +1 -0
- package/dist/src/config/configTemplate.js +62 -0
- package/dist/src/config/configTemplate.js.map +1 -0
- package/dist/src/config/projectConfigResolver.d.ts +8 -0
- package/dist/src/config/projectConfigResolver.d.ts.map +1 -0
- package/dist/src/config/projectConfigResolver.js +63 -0
- package/dist/src/config/projectConfigResolver.js.map +1 -0
- package/dist/src/config/tenantConfigResolver.d.ts +8 -0
- package/dist/src/config/tenantConfigResolver.d.ts.map +1 -0
- package/dist/src/config/tenantConfigResolver.js +31 -0
- package/dist/src/config/tenantConfigResolver.js.map +1 -0
- package/dist/src/http/CollectHttpMetricsMiddelware.d.ts +2 -2
- package/dist/src/http/CollectHttpMetricsMiddelware.d.ts.map +1 -1
- package/dist/src/http/CollectHttpMetricsMiddelware.js +6 -5
- package/dist/src/http/CollectHttpMetricsMiddelware.js.map +1 -1
- package/dist/src/project/ProjectContainer.d.ts +14 -16
- package/dist/src/project/ProjectContainer.d.ts.map +1 -1
- package/dist/src/project/ProjectContainer.js +17 -12
- package/dist/src/project/ProjectContainer.js.map +1 -1
- package/dist/src/project/ProjectContainerResolver.d.ts +12 -10
- package/dist/src/project/ProjectContainerResolver.d.ts.map +1 -1
- package/dist/src/project/ProjectContainerResolver.js +26 -33
- package/dist/src/project/ProjectContainerResolver.js.map +1 -1
- package/dist/src/project/{ProjectGroupState.d.ts → ProjectContainerStore.d.ts} +2 -2
- package/dist/src/project/ProjectContainerStore.d.ts.map +1 -0
- package/dist/src/project/{ProjectGroupState.js → ProjectContainerStore.js} +4 -4
- package/dist/src/project/ProjectContainerStore.js.map +1 -0
- package/dist/src/project/ProjectInitializer.d.ts +3 -3
- package/dist/src/project/ProjectInitializer.d.ts.map +1 -1
- package/dist/src/project/ProjectInitializer.js +4 -4
- package/dist/src/project/ProjectInitializer.js.map +1 -1
- package/dist/src/project/ProjectSchemaResolver.d.ts +3 -3
- package/dist/src/project/ProjectSchemaResolver.d.ts.map +1 -1
- package/dist/src/project/ProjectSchemaResolver.js +5 -5
- package/dist/src/project/ProjectSchemaResolver.js.map +1 -1
- package/dist/src/projectGroup/ProjectGroupContainer.d.ts +23 -0
- package/dist/src/projectGroup/ProjectGroupContainer.d.ts.map +1 -0
- package/dist/src/projectGroup/ProjectGroupContainer.js +64 -0
- package/dist/src/projectGroup/ProjectGroupContainer.js.map +1 -0
- package/dist/src/projectGroup/ProjectGroupContainerResolver.d.ts +12 -0
- package/dist/src/projectGroup/ProjectGroupContainerResolver.d.ts.map +1 -0
- package/dist/src/projectGroup/ProjectGroupContainerResolver.js +36 -0
- package/dist/src/projectGroup/ProjectGroupContainerResolver.js.map +1 -0
- package/dist/src/start.js +9 -8
- package/dist/src/start.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/utils/dbMetrics.d.ts +6 -2
- package/dist/src/utils/dbMetrics.d.ts.map +1 -1
- package/dist/src/utils/dbMetrics.js +13 -16
- package/dist/src/utils/dbMetrics.js.map +1 -1
- package/dist/tests/cases/http.js +30 -19
- package/dist/tests/cases/http.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +22 -21
- package/src/MasterContainer.ts +145 -204
- package/src/bootstrap/Initializer.ts +9 -34
- package/src/config/config.ts +23 -234
- package/src/config/configSchema.ts +114 -0
- package/src/config/configTemplate.ts +58 -0
- package/src/config/projectConfigResolver.ts +83 -0
- package/src/config/tenantConfigResolver.ts +41 -0
- package/src/http/CollectHttpMetricsMiddelware.ts +6 -5
- package/src/project/ProjectContainer.ts +25 -18
- package/src/project/ProjectContainerResolver.ts +29 -37
- package/src/project/{ProjectGroupState.ts → ProjectContainerStore.ts} +1 -1
- package/src/project/ProjectInitializer.ts +5 -9
- package/src/project/ProjectSchemaResolver.ts +6 -10
- package/src/projectGroup/ProjectGroupContainer.ts +120 -0
- package/src/projectGroup/ProjectGroupContainerResolver.ts +47 -0
- package/src/start.ts +9 -8
- package/src/utils/dbMetrics.ts +19 -20
- package/tests/cases/http.ts +35 -22
- package/dist/src/project/ProjectGroupState.d.ts.map +0 -1
- package/dist/src/project/ProjectGroupState.js.map +0 -1
|
@@ -2,138 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readConfig = void 0;
|
|
4
4
|
const config_loader_1 = require("@contember/config-loader");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
port: engine_common_1.Typesafe.number,
|
|
10
|
-
user: engine_common_1.Typesafe.string,
|
|
11
|
-
password: engine_common_1.Typesafe.string,
|
|
12
|
-
database: engine_common_1.Typesafe.string,
|
|
13
|
-
}), engine_common_1.Typesafe.partial({
|
|
14
|
-
ssl: engine_common_1.Typesafe.boolean,
|
|
15
|
-
}));
|
|
16
|
-
const tenantConfigSchema = engine_common_1.Typesafe.intersection(engine_common_1.Typesafe.object({
|
|
17
|
-
db: dbCredentialsSchema,
|
|
18
|
-
mailer: engine_common_1.Typesafe.transform(engine_common_1.Typesafe.partial({
|
|
19
|
-
from: engine_common_1.Typesafe.string,
|
|
20
|
-
host: engine_common_1.Typesafe.string,
|
|
21
|
-
port: engine_common_1.Typesafe.number,
|
|
22
|
-
user: engine_common_1.Typesafe.string,
|
|
23
|
-
password: engine_common_1.Typesafe.string,
|
|
24
|
-
}), (value, input) => {
|
|
25
|
-
return {
|
|
26
|
-
...input,
|
|
27
|
-
...value,
|
|
28
|
-
...(value.user ? { auth: { user: value.user, pass: value.password } } : {}),
|
|
29
|
-
};
|
|
30
|
-
}),
|
|
31
|
-
credentials: engine_common_1.Typesafe.partial({
|
|
32
|
-
rootToken: engine_common_1.Typesafe.string,
|
|
33
|
-
rootTokenHash: engine_common_1.Typesafe.string,
|
|
34
|
-
rootPassword: engine_common_1.Typesafe.string,
|
|
35
|
-
rootEmail: engine_common_1.Typesafe.string,
|
|
36
|
-
loginToken: engine_common_1.Typesafe.string,
|
|
37
|
-
}),
|
|
38
|
-
}), engine_common_1.Typesafe.object({
|
|
39
|
-
secrets: engine_common_1.Typesafe.partial({
|
|
40
|
-
encryptionKey: engine_common_1.Typesafe.string,
|
|
41
|
-
}),
|
|
42
|
-
}));
|
|
43
|
-
const serverConfigSchema = engine_common_1.Typesafe.intersection(engine_common_1.Typesafe.object({
|
|
44
|
-
port: engine_common_1.Typesafe.number,
|
|
45
|
-
monitoringPort: engine_common_1.Typesafe.number,
|
|
46
|
-
http: engine_common_1.Typesafe.partial({
|
|
47
|
-
requestBodySize: engine_common_1.Typesafe.string,
|
|
48
|
-
}),
|
|
49
|
-
logging: engine_common_1.Typesafe.union(val => engine_common_1.Typesafe.valueAt(val, ['sentry', 'dsn']) === undefined ? {} : engine_common_1.Typesafe.fail([]), engine_common_1.Typesafe.partial({
|
|
50
|
-
sentry: engine_common_1.Typesafe.object({
|
|
51
|
-
dsn: engine_common_1.Typesafe.string,
|
|
52
|
-
}),
|
|
53
|
-
})),
|
|
54
|
-
}), engine_common_1.Typesafe.partial({
|
|
55
|
-
workerCount: engine_common_1.Typesafe.union(engine_common_1.Typesafe.number, engine_common_1.Typesafe.string),
|
|
56
|
-
projectGroup: (val, path) => engine_common_1.Typesafe.valueAt(val, ['domainMapping']) === undefined ? undefined : engine_common_1.Typesafe.object({
|
|
57
|
-
domainMapping: engine_common_1.Typesafe.string,
|
|
58
|
-
})(val, path),
|
|
59
|
-
}));
|
|
60
|
-
const configSchema = engine_common_1.Typesafe.object({
|
|
61
|
-
tenant: tenantConfigSchema,
|
|
62
|
-
server: serverConfigSchema,
|
|
63
|
-
});
|
|
64
|
-
const stageConfig = engine_common_1.Typesafe.map(engine_common_1.Typesafe.object({
|
|
65
|
-
name: engine_common_1.Typesafe.union(engine_common_1.Typesafe.string, (_, path = []) => (0, utils_1.upperCaseFirst)(String(path[path.length - 2]))),
|
|
66
|
-
slug: (_, path = []) => String(path[path.length - 2]),
|
|
67
|
-
}));
|
|
68
|
-
const projectConfigSchema = engine_common_1.Typesafe.object({
|
|
69
|
-
name: engine_common_1.Typesafe.union(engine_common_1.Typesafe.string, (_, path = []) => (0, utils_1.upperCaseFirst)(String(path[path.length - 2])).replace(/-/g, ' ')),
|
|
70
|
-
slug: (_, path = []) => String(path[path.length - 2]),
|
|
71
|
-
stages: (input, path = []) => Object.values(stageConfig(input, path)),
|
|
72
|
-
db: dbCredentialsSchema,
|
|
73
|
-
});
|
|
74
|
-
const defaultTemplate = {
|
|
75
|
-
tenant: {
|
|
76
|
-
db: {
|
|
77
|
-
host: `%tenant.env.DB_HOST%`,
|
|
78
|
-
port: `%tenant.env.DB_PORT::number%`,
|
|
79
|
-
user: `%tenant.env.DB_USER%`,
|
|
80
|
-
password: `%tenant.env.DB_PASSWORD%`,
|
|
81
|
-
database: `%tenant.env.DB_NAME%`,
|
|
82
|
-
ssl: `%?tenant.env.DB_SSL::bool%`,
|
|
83
|
-
},
|
|
84
|
-
mailer: {
|
|
85
|
-
from: '%?tenant.env.MAILER_FROM%',
|
|
86
|
-
host: '%?tenant.env.MAILER_HOST::string%',
|
|
87
|
-
port: '%?tenant.env.MAILER_PORT::number%',
|
|
88
|
-
secure: '%?tenant.env.MAILER_SECURE::bool%',
|
|
89
|
-
user: '%?tenant.env.MAILER_USER%',
|
|
90
|
-
password: '%?tenant.env.MAILER_PASSWORD%',
|
|
91
|
-
},
|
|
92
|
-
credentials: {
|
|
93
|
-
rootEmail: '%?env.CONTEMBER_ROOT_EMAIL%',
|
|
94
|
-
rootToken: '%?env.CONTEMBER_ROOT_TOKEN%',
|
|
95
|
-
rootTokenHash: '%?env.CONTEMBER_ROOT_TOKEN_HASH%',
|
|
96
|
-
rootPassword: '%?env.CONTEMBER_ROOT_PASSWORD%',
|
|
97
|
-
loginToken: '%?env.CONTEMBER_LOGIN_TOKEN%',
|
|
98
|
-
},
|
|
99
|
-
secrets: {
|
|
100
|
-
encryptionKey: '%?env.CONTEMBER_ENCRYPTION_KEY%',
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
projectDefaults: {
|
|
104
|
-
db: {
|
|
105
|
-
host: `%project.env.DB_HOST%`,
|
|
106
|
-
port: `%project.env.DB_PORT::number%`,
|
|
107
|
-
user: `%project.env.DB_USER%`,
|
|
108
|
-
password: `%project.secret.db.password||project.env.DB_PASSWORD%`,
|
|
109
|
-
ssl: `%?project.env.DB_SSL::bool%`,
|
|
110
|
-
database: `%project.env.DB_NAME||project.slug%`,
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
server: {
|
|
114
|
-
port: '%env.CONTEMBER_PORT::number%',
|
|
115
|
-
monitoringPort: '%env.CONTEMBER_MONITORING_PORT::number%',
|
|
116
|
-
workerCount: '%?env.CONTEMBER_WORKER_COUNT::string%',
|
|
117
|
-
http: {
|
|
118
|
-
requestBodySize: '%?env.CONTEMBER_HTTP_REQUEST_BODY_SIZE::string%',
|
|
119
|
-
},
|
|
120
|
-
projectGroup: {
|
|
121
|
-
domainMapping: '%?env.CONTEMBER_PROJECT_GROUP_DOMAIN_MAPPING%',
|
|
122
|
-
},
|
|
123
|
-
logging: {
|
|
124
|
-
sentry: {
|
|
125
|
-
dsn: '%?env.SENTRY_DSN%',
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
},
|
|
129
|
-
};
|
|
130
|
-
const projectNameToEnvName = (projectName) => {
|
|
131
|
-
const envName = projectName.toUpperCase().replace(/-/g, '_');
|
|
132
|
-
if (envName === 'TENANT') {
|
|
133
|
-
throw new Error('Forbidden project name');
|
|
134
|
-
}
|
|
135
|
-
return envName;
|
|
136
|
-
};
|
|
5
|
+
const configSchema_1 = require("./configSchema");
|
|
6
|
+
const configTemplate_1 = require("./configTemplate");
|
|
7
|
+
const projectConfigResolver_1 = require("./projectConfigResolver");
|
|
8
|
+
const tenantConfigResolver_1 = require("./tenantConfigResolver");
|
|
137
9
|
async function readConfig(configSources, configProcessors = []) {
|
|
138
10
|
const loader = new config_loader_1.ConfigLoader();
|
|
139
11
|
const configs = await Promise.all(configSources.map(it => (it.type === 'file' ? loader.load(it.data) : loader.loadString(it.data, it.type))));
|
|
@@ -143,64 +15,15 @@ async function readConfig(configSources, configProcessors = []) {
|
|
|
143
15
|
}),
|
|
144
16
|
...Object.fromEntries(Object.entries(process.env).filter((it) => it[1] !== undefined)),
|
|
145
17
|
};
|
|
146
|
-
const template = configProcessors.reduce((tpl, processor) => { var _a; return ((_a = processor.prepareConfigTemplate) === null || _a === void 0 ? void 0 : _a.call(processor, tpl, { env })) || tpl; },
|
|
147
|
-
|
|
18
|
+
const template = configProcessors.reduce((tpl, processor) => { var _a; return ((_a = processor.prepareConfigTemplate) === null || _a === void 0 ? void 0 : _a.call(processor, tpl, { env })) || tpl; }, configTemplate_1.configTemplate);
|
|
19
|
+
const rawConfig = config_loader_1.Merger.merge(template, ...configs);
|
|
148
20
|
const parametersResolver = (0, config_loader_1.createObjectParametersResolver)({ env });
|
|
149
|
-
config = (0, config_loader_1.resolveParameters)(
|
|
150
|
-
|
|
151
|
-
if (path[0] !== 'tenant') {
|
|
152
|
-
throw new Error(`Invalid use of ${parts.join('.')} variable in path ${path.join('.')}.`);
|
|
153
|
-
}
|
|
154
|
-
if (parts[1] === 'env') {
|
|
155
|
-
const envName = parts[2];
|
|
156
|
-
const envValue = env['TENANT_' + envName] || env['DEFAULT_' + envName];
|
|
157
|
-
if (envValue === undefined) {
|
|
158
|
-
throw new config_loader_1.UndefinedParameterError(`ENV variable "${'TENANT_' + envName}" not found.`);
|
|
159
|
-
}
|
|
160
|
-
return envValue;
|
|
161
|
-
}
|
|
162
|
-
throw new config_loader_1.UndefinedParameterError(`Parameter "${parts.join('.')}" not found.`);
|
|
163
|
-
}
|
|
164
|
-
return parametersResolver(parts, path, dataResolver);
|
|
165
|
-
});
|
|
166
|
-
const baseConfig = configSchema(config);
|
|
21
|
+
const config = (0, config_loader_1.resolveParameters)(rawConfig.server, parametersResolver);
|
|
22
|
+
const serverConfig = (0, configSchema_1.serverConfigSchema)(config);
|
|
167
23
|
return {
|
|
168
|
-
|
|
169
|
-
projectConfigResolver: (
|
|
170
|
-
|
|
171
|
-
const mergedConfig = config_loader_1.Merger.merge(projectDefaults, (_a = config === null || config === void 0 ? void 0 : config.projects) === null || _a === void 0 ? void 0 : _a[slug], additionalConfig);
|
|
172
|
-
if (!mergedConfig.stages) {
|
|
173
|
-
mergedConfig.stages = { live: {} };
|
|
174
|
-
}
|
|
175
|
-
const resolvedConfig = (0, config_loader_1.resolveParameters)(mergedConfig, (parts, path, dataResolver) => {
|
|
176
|
-
if (parts[0] === 'project') {
|
|
177
|
-
if (parts[1] === 'env') {
|
|
178
|
-
const envName = parts[2];
|
|
179
|
-
const projectEnvName = projectNameToEnvName(slug);
|
|
180
|
-
const envValue = env[projectEnvName + '_' + envName] || env['DEFAULT_' + envName];
|
|
181
|
-
if (envValue === undefined) {
|
|
182
|
-
throw new config_loader_1.UndefinedParameterError(`ENV variable "${projectEnvName + '_' + envName}" not found.`);
|
|
183
|
-
}
|
|
184
|
-
return envValue;
|
|
185
|
-
}
|
|
186
|
-
else if (parts[1] === 'slug') {
|
|
187
|
-
return slug;
|
|
188
|
-
}
|
|
189
|
-
else if (parts[1] === 'secret') {
|
|
190
|
-
const key = parts.slice(2).join('.');
|
|
191
|
-
const value = secrets[key];
|
|
192
|
-
if (value === undefined) {
|
|
193
|
-
throw new config_loader_1.UndefinedParameterError(`Project secret ${parts[2]} not found`);
|
|
194
|
-
}
|
|
195
|
-
return value;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
throw new config_loader_1.UndefinedParameterError(`Parameter "${parts.join('.')}" not found.`);
|
|
199
|
-
});
|
|
200
|
-
const projectConfigSchemaWithPlugins = configProcessors.reduce((schema, current) => (current.getProjectConfigSchema ? engine_common_1.Typesafe.intersection(schema, current.getProjectConfigSchema(slug)) : schema), projectConfigSchema);
|
|
201
|
-
const projectConfig = projectConfigSchemaWithPlugins(resolvedConfig, ['project', slug]);
|
|
202
|
-
return projectConfig;
|
|
203
|
-
},
|
|
24
|
+
serverConfig,
|
|
25
|
+
projectConfigResolver: (0, projectConfigResolver_1.createProjectConfigResolver)(env, rawConfig, configProcessors),
|
|
26
|
+
tenantConfigResolver: (0, tenantConfigResolver_1.createTenantConfigResolver)(env, rawConfig.tenant),
|
|
204
27
|
};
|
|
205
28
|
}
|
|
206
29
|
exports.readConfig = readConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":";;;AAAA,4DAAkH;AAElH,iDAAuE;AACvE,qDAAiD;AACjD,mEAA4F;AAC5F,iEAAyF;AASlF,KAAK,UAAU,UAAU,CAC/B,aAA6B,EAC7B,mBAAsC,EAAE;IAMxC,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAA;IACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1G,CAAA;IACD,MAAM,GAAG,GAAQ;QAChB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,WAAC,OAAA,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,CAAA,MAAA,IAAI,CAAC,aAAa,+CAAlB,IAAI,CAAkB,KAAI,EAAE,CAAC,EAAE,CAAC,CAAA,EAAA,EAAE;YAC1F,eAAe,EAAE,MAAM;SACvB,CAAC;QACF,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAA0B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;KAC9G,CAAA;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,SAAS,CAAC,qBAAqB,+CAA/B,SAAS,EAAyB,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,KAAI,GAAG,CAAA,EAAA,EAC1E,+BAAc,CACd,CAAA;IAED,MAAM,SAAS,GAAG,sBAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,CAAA;IAEpD,MAAM,kBAAkB,GAAG,IAAA,8CAA8B,EAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IAClE,MAAM,MAAM,GAAG,IAAA,iCAAiB,EAAC,SAAS,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAEtE,MAAM,YAAY,GAAG,IAAA,iCAAkB,EAAC,MAAM,CAAC,CAAA;IAC/C,OAAO;QACN,YAAY;QACZ,qBAAqB,EAAE,IAAA,mDAA2B,EAAC,GAAG,EAAE,SAAS,EAAE,gBAAgB,CAAC;QACpF,oBAAoB,EAAE,IAAA,iDAA0B,EAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC;KACvE,CAAA;AACF,CAAC;AAnCD,gCAmCC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Typesafe } from '@contember/engine-common';
|
|
2
|
+
import { MailerOptions } from '@contember/engine-tenant-api';
|
|
3
|
+
export declare const dbCredentialsSchema: Typesafe.Type<{
|
|
4
|
+
readonly host: string;
|
|
5
|
+
readonly port: number;
|
|
6
|
+
readonly user: string;
|
|
7
|
+
readonly password: string;
|
|
8
|
+
readonly database: string;
|
|
9
|
+
} & {
|
|
10
|
+
readonly ssl?: boolean | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const tenantConfigSchema: Typesafe.Type<{
|
|
13
|
+
readonly db: {
|
|
14
|
+
readonly host: string;
|
|
15
|
+
readonly port: number;
|
|
16
|
+
readonly user: string;
|
|
17
|
+
readonly password: string;
|
|
18
|
+
readonly database: string;
|
|
19
|
+
} & {
|
|
20
|
+
readonly ssl?: boolean | undefined;
|
|
21
|
+
};
|
|
22
|
+
readonly mailer: MailerOptions;
|
|
23
|
+
readonly credentials: {
|
|
24
|
+
readonly rootToken?: string | undefined;
|
|
25
|
+
readonly rootTokenHash?: string | undefined;
|
|
26
|
+
readonly rootPassword?: string | undefined;
|
|
27
|
+
readonly rootEmail?: string | undefined;
|
|
28
|
+
readonly loginToken?: string | undefined;
|
|
29
|
+
};
|
|
30
|
+
} & {
|
|
31
|
+
readonly secrets: {
|
|
32
|
+
readonly encryptionKey?: string | undefined;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
export declare const serverConfigSchema: Typesafe.Type<{
|
|
36
|
+
readonly port: number;
|
|
37
|
+
readonly monitoringPort: number;
|
|
38
|
+
readonly http: {
|
|
39
|
+
readonly requestBodySize?: string | undefined;
|
|
40
|
+
};
|
|
41
|
+
readonly logging: {} | {
|
|
42
|
+
readonly sentry?: {
|
|
43
|
+
readonly dsn: string;
|
|
44
|
+
} | undefined;
|
|
45
|
+
};
|
|
46
|
+
} & {
|
|
47
|
+
readonly workerCount?: string | number | undefined;
|
|
48
|
+
readonly projectGroup?: ({
|
|
49
|
+
readonly domainMapping: string;
|
|
50
|
+
} & {
|
|
51
|
+
readonly configHeader?: string | undefined;
|
|
52
|
+
readonly configEncryptionKey?: string | undefined;
|
|
53
|
+
}) | undefined;
|
|
54
|
+
}>;
|
|
55
|
+
export declare const stageConfig: (input: unknown, path?: PropertyKey[] | undefined) => Record<string, {
|
|
56
|
+
readonly name: string;
|
|
57
|
+
readonly slug: string;
|
|
58
|
+
} & {
|
|
59
|
+
readonly schema?: string | undefined;
|
|
60
|
+
}>;
|
|
61
|
+
export declare const projectConfigSchema: Typesafe.Type<{
|
|
62
|
+
readonly name: string;
|
|
63
|
+
readonly slug: string;
|
|
64
|
+
readonly stages: ({
|
|
65
|
+
readonly name: string;
|
|
66
|
+
readonly slug: string;
|
|
67
|
+
} & {
|
|
68
|
+
readonly schema?: string | undefined;
|
|
69
|
+
})[];
|
|
70
|
+
readonly db: (({
|
|
71
|
+
readonly host: string;
|
|
72
|
+
readonly port: number;
|
|
73
|
+
readonly user: string;
|
|
74
|
+
readonly password: string;
|
|
75
|
+
readonly database: string;
|
|
76
|
+
} & {
|
|
77
|
+
readonly ssl?: boolean | undefined;
|
|
78
|
+
}) | {
|
|
79
|
+
readonly useTenantDb: boolean;
|
|
80
|
+
}) & {
|
|
81
|
+
readonly systemSchema?: string | undefined;
|
|
82
|
+
};
|
|
83
|
+
}>;
|
|
84
|
+
//# sourceMappingURL=configSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configSchema.d.ts","sourceRoot":"","sources":["../../../src/config/configSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAI5D,eAAO,MAAM,mBAAmB;;;;;;;;EAW/B,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;EA6B9B,CAAA;AACD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;EA8B9B,CAAA;AAED,eAAO,MAAM,WAAW;;;;;EAavB,CAAA;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;EAkB9B,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.projectConfigSchema = exports.stageConfig = exports.serverConfigSchema = exports.tenantConfigSchema = exports.dbCredentialsSchema = void 0;
|
|
4
|
+
const engine_common_1 = require("@contember/engine-common");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
exports.dbCredentialsSchema = engine_common_1.Typesafe.intersection(engine_common_1.Typesafe.object({
|
|
7
|
+
host: engine_common_1.Typesafe.string,
|
|
8
|
+
port: engine_common_1.Typesafe.number,
|
|
9
|
+
user: engine_common_1.Typesafe.string,
|
|
10
|
+
password: engine_common_1.Typesafe.string,
|
|
11
|
+
database: engine_common_1.Typesafe.string,
|
|
12
|
+
}), engine_common_1.Typesafe.partial({
|
|
13
|
+
ssl: engine_common_1.Typesafe.boolean,
|
|
14
|
+
}));
|
|
15
|
+
exports.tenantConfigSchema = engine_common_1.Typesafe.intersection(engine_common_1.Typesafe.object({
|
|
16
|
+
db: exports.dbCredentialsSchema,
|
|
17
|
+
mailer: engine_common_1.Typesafe.transform(engine_common_1.Typesafe.partial({
|
|
18
|
+
from: engine_common_1.Typesafe.string,
|
|
19
|
+
host: engine_common_1.Typesafe.string,
|
|
20
|
+
port: engine_common_1.Typesafe.number,
|
|
21
|
+
user: engine_common_1.Typesafe.string,
|
|
22
|
+
password: engine_common_1.Typesafe.string,
|
|
23
|
+
}), (value, input) => {
|
|
24
|
+
return {
|
|
25
|
+
...input,
|
|
26
|
+
...value,
|
|
27
|
+
...(value.user ? { auth: { user: value.user, pass: value.password } } : {}),
|
|
28
|
+
};
|
|
29
|
+
}),
|
|
30
|
+
credentials: engine_common_1.Typesafe.partial({
|
|
31
|
+
rootToken: engine_common_1.Typesafe.string,
|
|
32
|
+
rootTokenHash: engine_common_1.Typesafe.string,
|
|
33
|
+
rootPassword: engine_common_1.Typesafe.string,
|
|
34
|
+
rootEmail: engine_common_1.Typesafe.string,
|
|
35
|
+
loginToken: engine_common_1.Typesafe.string,
|
|
36
|
+
}),
|
|
37
|
+
}), engine_common_1.Typesafe.object({
|
|
38
|
+
secrets: engine_common_1.Typesafe.partial({
|
|
39
|
+
encryptionKey: engine_common_1.Typesafe.string,
|
|
40
|
+
}),
|
|
41
|
+
}));
|
|
42
|
+
exports.serverConfigSchema = engine_common_1.Typesafe.intersection(engine_common_1.Typesafe.object({
|
|
43
|
+
port: engine_common_1.Typesafe.number,
|
|
44
|
+
monitoringPort: engine_common_1.Typesafe.number,
|
|
45
|
+
http: engine_common_1.Typesafe.partial({
|
|
46
|
+
requestBodySize: engine_common_1.Typesafe.string,
|
|
47
|
+
}),
|
|
48
|
+
logging: engine_common_1.Typesafe.union(val => engine_common_1.Typesafe.valueAt(val, ['sentry', 'dsn']) === undefined ? {} : engine_common_1.Typesafe.fail([]), engine_common_1.Typesafe.partial({
|
|
49
|
+
sentry: engine_common_1.Typesafe.object({
|
|
50
|
+
dsn: engine_common_1.Typesafe.string,
|
|
51
|
+
}),
|
|
52
|
+
})),
|
|
53
|
+
}), engine_common_1.Typesafe.partial({
|
|
54
|
+
workerCount: engine_common_1.Typesafe.union(engine_common_1.Typesafe.number, engine_common_1.Typesafe.string),
|
|
55
|
+
projectGroup: (val, path) => engine_common_1.Typesafe.valueAt(val, ['domainMapping']) === undefined
|
|
56
|
+
? undefined
|
|
57
|
+
: engine_common_1.Typesafe.intersection(engine_common_1.Typesafe.object({
|
|
58
|
+
domainMapping: engine_common_1.Typesafe.string,
|
|
59
|
+
}), engine_common_1.Typesafe.partial({
|
|
60
|
+
configHeader: engine_common_1.Typesafe.string,
|
|
61
|
+
configEncryptionKey: engine_common_1.Typesafe.string,
|
|
62
|
+
}))(val, path),
|
|
63
|
+
}));
|
|
64
|
+
exports.stageConfig = engine_common_1.Typesafe.map(engine_common_1.Typesafe.intersection(engine_common_1.Typesafe.object({
|
|
65
|
+
name: engine_common_1.Typesafe.union(engine_common_1.Typesafe.string, (_, path = []) => (0, utils_1.upperCaseFirst)(String(path[path.length - 2]))),
|
|
66
|
+
slug: (_, path = []) => String(path[path.length - 2]),
|
|
67
|
+
}), engine_common_1.Typesafe.partial({
|
|
68
|
+
schema: engine_common_1.Typesafe.string,
|
|
69
|
+
})));
|
|
70
|
+
exports.projectConfigSchema = engine_common_1.Typesafe.object({
|
|
71
|
+
name: engine_common_1.Typesafe.union(engine_common_1.Typesafe.string, (_, path = []) => (0, utils_1.upperCaseFirst)(String(path[path.length - 2])).replace(/-/g, ' ')),
|
|
72
|
+
slug: (_, path = []) => String(path[path.length - 2]),
|
|
73
|
+
stages: (input, path = []) => Object.values((0, exports.stageConfig)(input, path)),
|
|
74
|
+
db: engine_common_1.Typesafe.intersection(engine_common_1.Typesafe.union(engine_common_1.Typesafe.object({
|
|
75
|
+
useTenantDb: engine_common_1.Typesafe.literal(true),
|
|
76
|
+
}), exports.dbCredentialsSchema), engine_common_1.Typesafe.partial({
|
|
77
|
+
systemSchema: engine_common_1.Typesafe.string,
|
|
78
|
+
})),
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=configSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../../../src/config/configSchema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configTemplate.d.ts","sourceRoot":"","sources":["../../../src/config/configTemplate.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,EAAE,GAyD5B,CAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configTemplate = void 0;
|
|
4
|
+
exports.configTemplate = {
|
|
5
|
+
tenant: {
|
|
6
|
+
db: {
|
|
7
|
+
host: `%tenant.env.DB_HOST%`,
|
|
8
|
+
port: `%tenant.env.DB_PORT::number%`,
|
|
9
|
+
user: `%tenant.env.DB_USER%`,
|
|
10
|
+
password: `%tenant.env.DB_PASSWORD%`,
|
|
11
|
+
database: `%tenant.env.DB_NAME%`,
|
|
12
|
+
ssl: `%?tenant.env.DB_SSL::bool%`,
|
|
13
|
+
},
|
|
14
|
+
mailer: {
|
|
15
|
+
from: '%?tenant.env.MAILER_FROM%',
|
|
16
|
+
host: '%?tenant.env.MAILER_HOST::string%',
|
|
17
|
+
port: '%?tenant.env.MAILER_PORT::number%',
|
|
18
|
+
secure: '%?tenant.env.MAILER_SECURE::bool%',
|
|
19
|
+
user: '%?tenant.env.MAILER_USER%',
|
|
20
|
+
password: '%?tenant.env.MAILER_PASSWORD%',
|
|
21
|
+
},
|
|
22
|
+
credentials: {
|
|
23
|
+
rootEmail: '%?env.CONTEMBER_ROOT_EMAIL%',
|
|
24
|
+
rootToken: '%?env.CONTEMBER_ROOT_TOKEN%',
|
|
25
|
+
rootTokenHash: '%?env.CONTEMBER_ROOT_TOKEN_HASH%',
|
|
26
|
+
rootPassword: '%?env.CONTEMBER_ROOT_PASSWORD%',
|
|
27
|
+
loginToken: '%?env.CONTEMBER_LOGIN_TOKEN%',
|
|
28
|
+
},
|
|
29
|
+
secrets: {
|
|
30
|
+
encryptionKey: '%?env.CONTEMBER_ENCRYPTION_KEY%',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
projectDefaults: {
|
|
34
|
+
db: {
|
|
35
|
+
host: `%?project.env.DB_HOST%`,
|
|
36
|
+
port: `%?project.env.DB_PORT::number%`,
|
|
37
|
+
user: `%?project.env.DB_USER%`,
|
|
38
|
+
password: `%?project.secret.db.password||project.env.DB_PASSWORD%`,
|
|
39
|
+
database: `%?project.env.DB_NAME||project.slug%`,
|
|
40
|
+
ssl: `%?project.env.DB_SSL::bool%`,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
server: {
|
|
44
|
+
port: '%env.CONTEMBER_PORT::number%',
|
|
45
|
+
monitoringPort: '%env.CONTEMBER_MONITORING_PORT::number%',
|
|
46
|
+
workerCount: '%?env.CONTEMBER_WORKER_COUNT::string%',
|
|
47
|
+
http: {
|
|
48
|
+
requestBodySize: '%?env.CONTEMBER_HTTP_REQUEST_BODY_SIZE::string%',
|
|
49
|
+
},
|
|
50
|
+
projectGroup: {
|
|
51
|
+
domainMapping: '%?env.CONTEMBER_PROJECT_GROUP_DOMAIN_MAPPING%',
|
|
52
|
+
configHeader: '%?env.CONTEMBER_PROJECT_GROUP_CONFIG_HEADER%',
|
|
53
|
+
configEncryptionKey: '%?env.CONTEMBER_PROJECT_GROUP_CONFIG_ENCRYPTION_KEY%',
|
|
54
|
+
},
|
|
55
|
+
logging: {
|
|
56
|
+
sentry: {
|
|
57
|
+
dsn: '%?env.SENTRY_DSN%',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=configTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configTemplate.js","sourceRoot":"","sources":["../../../src/config/configTemplate.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAQ;IAClC,MAAM,EAAE;QACP,EAAE,EAAE;YACH,IAAI,EAAE,sBAAsB;YAC5B,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE,sBAAsB;YAC5B,QAAQ,EAAE,0BAA0B;YACpC,QAAQ,EAAE,sBAAsB;YAChC,GAAG,EAAE,4BAA4B;SACjC;QACD,MAAM,EAAE;YACP,IAAI,EAAE,2BAA2B;YACjC,IAAI,EAAE,mCAAmC;YACzC,IAAI,EAAE,mCAAmC;YACzC,MAAM,EAAE,mCAAmC;YAC3C,IAAI,EAAE,2BAA2B;YACjC,QAAQ,EAAE,+BAA+B;SACzC;QACD,WAAW,EAAE;YACZ,SAAS,EAAE,6BAA6B;YACxC,SAAS,EAAE,6BAA6B;YACxC,aAAa,EAAE,kCAAkC;YACjD,YAAY,EAAE,gCAAgC;YAC9C,UAAU,EAAE,8BAA8B;SAC1C;QACD,OAAO,EAAE;YACR,aAAa,EAAE,iCAAiC;SAChD;KACD;IACD,eAAe,EAAE;QAChB,EAAE,EAAE;YACH,IAAI,EAAE,wBAAwB;YAC9B,IAAI,EAAE,gCAAgC;YACtC,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE,wDAAwD;YAClE,QAAQ,EAAE,sCAAsC;YAChD,GAAG,EAAE,6BAA6B;SAClC;KACD;IACD,MAAM,EAAE;QACP,IAAI,EAAE,8BAA8B;QACpC,cAAc,EAAE,yCAAyC;QACzD,WAAW,EAAE,uCAAuC;QACpD,IAAI,EAAE;YACL,eAAe,EAAE,iDAAiD;SAClE;QACD,YAAY,EAAE;YACb,aAAa,EAAE,+CAA+C;YAC9D,YAAY,EAAE,8CAA8C;YAC5D,mBAAmB,EAAE,sDAAsD;SAC3E;QACD,OAAO,EAAE;YACR,MAAM,EAAE;gBACP,GAAG,EAAE,mBAAmB;aACxB;SACD;KACD;CACD,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ProjectConfig, ProjectSecrets } from '@contember/engine-http';
|
|
2
|
+
import { ConfigProcessor } from '@contember/engine-plugins';
|
|
3
|
+
import { TenantConfig } from './config';
|
|
4
|
+
export declare type ProjectConfigResolver = (slug: string, additionalConfig: any, secrets: ProjectSecrets, tenantConfig: TenantConfig) => ProjectConfig;
|
|
5
|
+
declare type Env = Record<string, string>;
|
|
6
|
+
export declare const createProjectConfigResolver: (env: Env, config: any, configProcessors: ConfigProcessor[]) => ProjectConfigResolver;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=projectConfigResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectConfigResolver.d.ts","sourceRoot":"","sources":["../../../src/config/projectConfigResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAI3D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC,oBAAY,qBAAqB,GAAG,CACnC,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,GAAG,EACrB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,YAAY,KACtB,aAAa,CAAA;AAElB,aAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjC,eAAO,MAAM,2BAA2B,QAAS,GAAG,UAAU,GAAG,oBAAoB,eAAe,EAAE,KAAG,qBAgCvG,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createProjectConfigResolver = void 0;
|
|
4
|
+
const config_loader_1 = require("@contember/config-loader");
|
|
5
|
+
const engine_common_1 = require("@contember/engine-common");
|
|
6
|
+
const configSchema_1 = require("./configSchema");
|
|
7
|
+
const createProjectConfigResolver = (env, config, configProcessors) => (slug, additionalConfig, secrets, tenantConfig) => {
|
|
8
|
+
var _a;
|
|
9
|
+
const mergedConfig = config_loader_1.Merger.merge(config.projectDefaults, (_a = config === null || config === void 0 ? void 0 : config.projects) === null || _a === void 0 ? void 0 : _a[slug], additionalConfig);
|
|
10
|
+
if (!mergedConfig.stages) {
|
|
11
|
+
mergedConfig.stages = { live: {} };
|
|
12
|
+
}
|
|
13
|
+
const resolvedConfig = (0, config_loader_1.resolveParameters)(mergedConfig, createProjectParametersResolver(slug, env, secrets));
|
|
14
|
+
const projectConfigSchemaWithPlugins = configProcessors.reduce((schema, current) => (current.getProjectConfigSchema ? engine_common_1.Typesafe.intersection(schema, current.getProjectConfigSchema(slug)) : schema), configSchema_1.projectConfigSchema);
|
|
15
|
+
const projectConfig = projectConfigSchemaWithPlugins(resolvedConfig, ['project', slug]);
|
|
16
|
+
if (!('host' in projectConfig.db)) {
|
|
17
|
+
return {
|
|
18
|
+
...projectConfig,
|
|
19
|
+
db: {
|
|
20
|
+
...tenantConfig.db,
|
|
21
|
+
...projectConfig.db,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
...projectConfig,
|
|
27
|
+
db: projectConfig.db,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
exports.createProjectConfigResolver = createProjectConfigResolver;
|
|
31
|
+
const createProjectParametersResolver = (slug, env, secrets) => parts => {
|
|
32
|
+
if (parts[0] === 'project') {
|
|
33
|
+
if (parts[1] === 'env') {
|
|
34
|
+
const envName = parts[2];
|
|
35
|
+
const projectEnvName = projectNameToEnvName(slug);
|
|
36
|
+
const envValue = env[projectEnvName + '_' + envName] || env['DEFAULT_' + envName];
|
|
37
|
+
if (envValue === undefined) {
|
|
38
|
+
throw new config_loader_1.UndefinedParameterError(`ENV variable "${projectEnvName + '_' + envName}" not found.`);
|
|
39
|
+
}
|
|
40
|
+
return envValue;
|
|
41
|
+
}
|
|
42
|
+
else if (parts[1] === 'slug') {
|
|
43
|
+
return slug;
|
|
44
|
+
}
|
|
45
|
+
else if (parts[1] === 'secret') {
|
|
46
|
+
const key = parts.slice(2).join('.');
|
|
47
|
+
const value = secrets[key];
|
|
48
|
+
if (value === undefined) {
|
|
49
|
+
throw new config_loader_1.UndefinedParameterError(`Project secret ${parts[2]} not found`);
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
throw new config_loader_1.UndefinedParameterError(`Parameter "${parts.join('.')}" not found.`);
|
|
55
|
+
};
|
|
56
|
+
const projectNameToEnvName = (projectName) => {
|
|
57
|
+
const envName = projectName.toUpperCase().replace(/-/g, '_');
|
|
58
|
+
if (envName === 'TENANT') {
|
|
59
|
+
throw new Error('Forbidden project name');
|
|
60
|
+
}
|
|
61
|
+
return envName;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=projectConfigResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectConfigResolver.js","sourceRoot":"","sources":["../../../src/config/projectConfigResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TenantConfig } from './config';
|
|
2
|
+
import { ParametersResolver } from '@contember/config-loader';
|
|
3
|
+
export declare type TenantConfigResolver = (slug: string | undefined, additionalConfig: any) => TenantConfig;
|
|
4
|
+
declare type Env = Record<string, string>;
|
|
5
|
+
export declare const createTenantConfigResolver: (env: Env, tenantConfig: any) => TenantConfigResolver;
|
|
6
|
+
export declare const createTenantParametersResolver: (env: Env) => ParametersResolver;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=tenantConfigResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenantConfigResolver.d.ts","sourceRoot":"","sources":["../../../src/config/tenantConfigResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAGN,kBAAkB,EAGlB,MAAM,0BAA0B,CAAA;AAGjC,oBAAY,oBAAoB,GAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,gBAAgB,EAAE,GAAG,KAAK,YAAY,CAAA;AAErG,aAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjC,eAAO,MAAM,0BAA0B,QAAS,GAAG,gBAAgB,GAAG,KAAG,oBAYvE,CAAA;AAGF,eAAO,MAAM,8BAA8B,QAAS,GAAG,KAAG,kBAWxD,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTenantParametersResolver = exports.createTenantConfigResolver = void 0;
|
|
4
|
+
const config_loader_1 = require("@contember/config-loader");
|
|
5
|
+
const configSchema_1 = require("./configSchema");
|
|
6
|
+
const createTenantConfigResolver = (env, tenantConfig) => (slug, additionalConfig) => {
|
|
7
|
+
const mergedConfig = config_loader_1.Merger.merge(tenantConfig, additionalConfig);
|
|
8
|
+
const parametersResolver = (0, config_loader_1.createObjectParametersResolver)({ env });
|
|
9
|
+
const tenantParametersResolver = (0, exports.createTenantParametersResolver)(env);
|
|
10
|
+
const resolvedConfig = (0, config_loader_1.resolveParameters)(mergedConfig, (parts, path, dataResolver) => {
|
|
11
|
+
if (parts[0] === 'tenant') {
|
|
12
|
+
return tenantParametersResolver(parts, path, dataResolver);
|
|
13
|
+
}
|
|
14
|
+
return parametersResolver(parts, path, dataResolver);
|
|
15
|
+
});
|
|
16
|
+
return (0, configSchema_1.tenantConfigSchema)(resolvedConfig);
|
|
17
|
+
};
|
|
18
|
+
exports.createTenantConfigResolver = createTenantConfigResolver;
|
|
19
|
+
const createTenantParametersResolver = (env) => parts => {
|
|
20
|
+
if (parts[1] === 'env') {
|
|
21
|
+
const envName = parts[2];
|
|
22
|
+
const envValue = env['TENANT_' + envName] || env['DEFAULT_' + envName];
|
|
23
|
+
if (envValue === undefined) {
|
|
24
|
+
throw new config_loader_1.UndefinedParameterError(`ENV variable "${'TENANT_' + envName}" not found.`);
|
|
25
|
+
}
|
|
26
|
+
return envValue;
|
|
27
|
+
}
|
|
28
|
+
throw new config_loader_1.UndefinedParameterError(`Parameter "${parts.join('.')}" not found.`);
|
|
29
|
+
};
|
|
30
|
+
exports.createTenantParametersResolver = createTenantParametersResolver;
|
|
31
|
+
//# sourceMappingURL=tenantConfigResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenantConfigResolver.js","sourceRoot":"","sources":["../../../src/config/tenantConfigResolver.ts"],"names":[],"mappings":";;;AACA,4DAMiC;AACjC,iDAAmD;AAM5C,MAAM,0BAA0B,GAAG,CAAC,GAAQ,EAAE,YAAiB,EAAwB,EAAE,CAC/F,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE;IAC1B,MAAM,YAAY,GAAG,sBAAM,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAA;IACjE,MAAM,kBAAkB,GAAG,IAAA,8CAA8B,EAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IAClE,MAAM,wBAAwB,GAAG,IAAA,sCAA8B,EAAC,GAAG,CAAC,CAAA;IACpE,MAAM,cAAc,GAAG,IAAA,iCAAiB,EAAC,YAAY,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE;QACpF,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;YAC1B,OAAO,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;SAC1D;QACD,OAAO,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IACF,OAAO,IAAA,iCAAkB,EAAC,cAAc,CAAC,CAAA;AAC1C,CAAC,CAAA;AAZW,QAAA,0BAA0B,8BAYrC;AAGK,MAAM,8BAA8B,GAAG,CAAC,GAAQ,EAAsB,EAAE,CAC9E,KAAK,CAAC,EAAE;IACP,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACxB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,CAAA;QACtE,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC3B,MAAM,IAAI,uCAAuB,CAAC,iBAAiB,SAAS,GAAG,OAAO,cAAc,CAAC,CAAA;SACrF;QACD,OAAO,QAAQ,CAAA;KACf;IACD,MAAM,IAAI,uCAAuB,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;AAC/E,CAAC,CAAA;AAXW,QAAA,8BAA8B,kCAWzC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { KoaMiddleware, ModuleInfoMiddlewareState,
|
|
1
|
+
import { KoaMiddleware, ModuleInfoMiddlewareState, ProjectInfoMiddlewareState } from '@contember/engine-http';
|
|
2
2
|
import prom from 'prom-client';
|
|
3
3
|
import { GraphQLKoaState } from '@contember/engine-http';
|
|
4
|
-
export declare const createColllectHttpMetricsMiddleware: (registry: prom.Registry) => KoaMiddleware<Partial<
|
|
4
|
+
export declare const createColllectHttpMetricsMiddleware: (registry: prom.Registry) => KoaMiddleware<Partial<ProjectInfoMiddlewareState & ModuleInfoMiddlewareState & GraphQLKoaState>>;
|
|
5
5
|
//# sourceMappingURL=CollectHttpMetricsMiddelware.d.ts.map
|