@contember/engine-server 1.2.0 → 1.3.0-alpha.2

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 (126) hide show
  1. package/dist/src/start.js +16 -15
  2. package/dist/src/start.js.map +1 -1
  3. package/dist/src/tsconfig.tsbuildinfo +1 -1
  4. package/dist/tests/e2e/assume-identity.test.js.map +1 -1
  5. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  6. package/package.json +6 -22
  7. package/src/start.ts +10 -8
  8. package/src/tsconfig.json +4 -45
  9. package/tests/e2e/assume-identity.test.ts +0 -1
  10. package/tests/tsconfig.json +2 -6
  11. package/tsconfig.json +2 -6
  12. package/dist/src/MasterContainer.d.ts +0 -125
  13. package/dist/src/MasterContainer.d.ts.map +0 -1
  14. package/dist/src/MasterContainer.js +0 -102
  15. package/dist/src/MasterContainer.js.map +0 -1
  16. package/dist/src/bootstrap/Initializer.d.ts +0 -7
  17. package/dist/src/bootstrap/Initializer.d.ts.map +0 -1
  18. package/dist/src/bootstrap/Initializer.js +0 -27
  19. package/dist/src/bootstrap/Initializer.js.map +0 -1
  20. package/dist/src/bootstrap/index.d.ts +0 -2
  21. package/dist/src/bootstrap/index.d.ts.map +0 -1
  22. package/dist/src/bootstrap/index.js +0 -18
  23. package/dist/src/bootstrap/index.js.map +0 -1
  24. package/dist/src/config/config.d.ts +0 -17
  25. package/dist/src/config/config.d.ts.map +0 -1
  26. package/dist/src/config/config.js +0 -30
  27. package/dist/src/config/config.js.map +0 -1
  28. package/dist/src/config/configSchema.d.ts +0 -201
  29. package/dist/src/config/configSchema.d.ts.map +0 -1
  30. package/dist/src/config/configSchema.js +0 -119
  31. package/dist/src/config/configSchema.js.map +0 -1
  32. package/dist/src/config/configTemplate.d.ts +0 -2
  33. package/dist/src/config/configTemplate.d.ts.map +0 -1
  34. package/dist/src/config/configTemplate.js +0 -90
  35. package/dist/src/config/configTemplate.js.map +0 -1
  36. package/dist/src/config/projectConfigResolver.d.ts +0 -8
  37. package/dist/src/config/projectConfigResolver.d.ts.map +0 -1
  38. package/dist/src/config/projectConfigResolver.js +0 -91
  39. package/dist/src/config/projectConfigResolver.js.map +0 -1
  40. package/dist/src/config/tenantConfigResolver.d.ts +0 -8
  41. package/dist/src/config/tenantConfigResolver.d.ts.map +0 -1
  42. package/dist/src/config/tenantConfigResolver.js +0 -31
  43. package/dist/src/config/tenantConfigResolver.js.map +0 -1
  44. package/dist/src/index.d.ts +0 -13
  45. package/dist/src/index.d.ts.map +0 -1
  46. package/dist/src/index.js +0 -33
  47. package/dist/src/index.js.map +0 -1
  48. package/dist/src/project/ProjectContainer.d.ts +0 -58
  49. package/dist/src/project/ProjectContainer.d.ts.map +0 -1
  50. package/dist/src/project/ProjectContainer.js +0 -66
  51. package/dist/src/project/ProjectContainer.js.map +0 -1
  52. package/dist/src/project/ProjectContainerResolver.d.ts +0 -24
  53. package/dist/src/project/ProjectContainerResolver.d.ts.map +0 -1
  54. package/dist/src/project/ProjectContainerResolver.js +0 -75
  55. package/dist/src/project/ProjectContainerResolver.js.map +0 -1
  56. package/dist/src/project/ProjectContainerStore.d.ts +0 -18
  57. package/dist/src/project/ProjectContainerStore.d.ts.map +0 -1
  58. package/dist/src/project/ProjectContainerStore.js +0 -30
  59. package/dist/src/project/ProjectContainerStore.js.map +0 -1
  60. package/dist/src/project/ProjectInitializer.d.ts +0 -14
  61. package/dist/src/project/ProjectInitializer.d.ts.map +0 -1
  62. package/dist/src/project/ProjectInitializer.js +0 -28
  63. package/dist/src/project/ProjectInitializer.js.map +0 -1
  64. package/dist/src/project/ProjectSchemaResolver.d.ts +0 -14
  65. package/dist/src/project/ProjectSchemaResolver.d.ts.map +0 -1
  66. package/dist/src/project/ProjectSchemaResolver.js +0 -30
  67. package/dist/src/project/ProjectSchemaResolver.js.map +0 -1
  68. package/dist/src/project/index.d.ts +0 -5
  69. package/dist/src/project/index.d.ts.map +0 -1
  70. package/dist/src/project/index.js +0 -21
  71. package/dist/src/project/index.js.map +0 -1
  72. package/dist/src/projectGroup/ProjectGroupContainer.d.ts +0 -26
  73. package/dist/src/projectGroup/ProjectGroupContainer.d.ts.map +0 -1
  74. package/dist/src/projectGroup/ProjectGroupContainer.js +0 -70
  75. package/dist/src/projectGroup/ProjectGroupContainer.js.map +0 -1
  76. package/dist/src/projectGroup/ProjectGroupResolver.d.ts +0 -7
  77. package/dist/src/projectGroup/ProjectGroupResolver.d.ts.map +0 -1
  78. package/dist/src/projectGroup/ProjectGroupResolver.js +0 -13
  79. package/dist/src/projectGroup/ProjectGroupResolver.js.map +0 -1
  80. package/dist/src/utils/index.d.ts +0 -3
  81. package/dist/src/utils/index.d.ts.map +0 -1
  82. package/dist/src/utils/index.js +0 -19
  83. package/dist/src/utils/index.js.map +0 -1
  84. package/dist/src/utils/sentry.d.ts +0 -10
  85. package/dist/src/utils/sentry.d.ts.map +0 -1
  86. package/dist/src/utils/sentry.js +0 -80
  87. package/dist/src/utils/sentry.js.map +0 -1
  88. package/dist/src/utils/serverStartup.d.ts +0 -33
  89. package/dist/src/utils/serverStartup.d.ts.map +0 -1
  90. package/dist/src/utils/serverStartup.js +0 -79
  91. package/dist/src/utils/serverStartup.js.map +0 -1
  92. package/dist/src/utils/serverTermination.d.ts +0 -13
  93. package/dist/src/utils/serverTermination.d.ts.map +0 -1
  94. package/dist/src/utils/serverTermination.js +0 -24
  95. package/dist/src/utils/serverTermination.js.map +0 -1
  96. package/dist/src/utils/strings.d.ts +0 -2
  97. package/dist/src/utils/strings.d.ts.map +0 -1
  98. package/dist/src/utils/strings.js +0 -6
  99. package/dist/src/utils/strings.js.map +0 -1
  100. package/dist/tests/cases/configResolver.test.d.ts +0 -2
  101. package/dist/tests/cases/configResolver.test.d.ts.map +0 -1
  102. package/dist/tests/cases/configResolver.test.js +0 -67
  103. package/dist/tests/cases/configResolver.test.js.map +0 -1
  104. package/src/MasterContainer.ts +0 -206
  105. package/src/bootstrap/Initializer.ts +0 -27
  106. package/src/bootstrap/index.ts +0 -1
  107. package/src/config/config.ts +0 -56
  108. package/src/config/configSchema.ts +0 -135
  109. package/src/config/configTemplate.ts +0 -86
  110. package/src/config/projectConfigResolver.ts +0 -86
  111. package/src/config/tenantConfigResolver.ts +0 -41
  112. package/src/index.ts +0 -23
  113. package/src/project/ProjectContainer.ts +0 -95
  114. package/src/project/ProjectContainerResolver.ts +0 -87
  115. package/src/project/ProjectContainerStore.ts +0 -33
  116. package/src/project/ProjectInitializer.ts +0 -28
  117. package/src/project/ProjectSchemaResolver.ts +0 -33
  118. package/src/project/index.ts +0 -4
  119. package/src/projectGroup/ProjectGroupContainer.ts +0 -134
  120. package/src/projectGroup/ProjectGroupResolver.ts +0 -12
  121. package/src/utils/index.ts +0 -2
  122. package/src/utils/sentry.ts +0 -56
  123. package/src/utils/serverStartup.ts +0 -78
  124. package/src/utils/serverTermination.ts +0 -19
  125. package/src/utils/strings.ts +0 -1
  126. package/tests/cases/configResolver.test.ts +0 -67
@@ -1,33 +0,0 @@
1
- import { ProjectSchemaResolver as ProjectSchemaResolverInterface } from '@contember/engine-tenant-api'
2
- import { ProjectContainerResolver } from '@contember/engine-http'
3
- import { Schema } from '@contember/schema'
4
-
5
- export class ProjectSchemaResolver implements ProjectSchemaResolverInterface {
6
- constructor(
7
- private readonly projectContainerResolver: ProjectContainerResolver,
8
- ) {}
9
-
10
- async getSchema(slug: string) {
11
- const container = await this.projectContainerResolver.getProjectContainer(slug)
12
- if (!container) {
13
- return undefined
14
- }
15
- const db = container.systemDatabaseContextFactory.create()
16
- return container.contentSchemaResolver.getSchema(db)
17
- }
18
- }
19
-
20
- export class ProjectSchemaResolverProxy implements ProjectSchemaResolverInterface {
21
- private resolver: ProjectSchemaResolver | undefined
22
-
23
- setResolver(resolver: ProjectSchemaResolver): void {
24
- this.resolver = resolver
25
- }
26
-
27
- getSchema(projectSlug: string): Promise<Schema | undefined> {
28
- if (!this.resolver) {
29
- throw new Error('Resolved is not set')
30
- }
31
- return this.resolver.getSchema(projectSlug)
32
- }
33
- }
@@ -1,4 +0,0 @@
1
- export * from './ProjectInitializer'
2
- export * from './ProjectSchemaResolver'
3
- export * from './ProjectContainer'
4
- export * from './ProjectContainerResolver'
@@ -1,134 +0,0 @@
1
- import { Builder } from '@contember/dic'
2
- import { Connection } from '@contember/database'
3
- import { TenantContainerFactory } from '@contember/engine-tenant-api'
4
- import { TenantConfig } from '../config/config'
5
- import {
6
- Authenticator,
7
- CryptoWrapper,
8
- ProjectGroupContainer,
9
- ProjectMembershipFetcher,
10
- ProjectMembershipResolver,
11
- Providers,
12
- SystemGraphQLHandlerFactory,
13
- TenantGraphQLHandlerFactory,
14
- } from '@contember/engine-http'
15
- import {
16
- ProjectContainerFactoryFactory,
17
- ProjectContainerResolver,
18
- ProjectInitializer,
19
- ProjectInitializerProxy,
20
- ProjectSchemaResolver,
21
- ProjectSchemaResolverProxy,
22
- } from '../project'
23
- import { SystemContainerFactory } from '@contember/engine-system-api'
24
- import { ProjectConfigResolver } from '../config/projectConfigResolver'
25
- import { createSecretKey } from 'node:crypto'
26
- import { Logger } from '@contember/logger'
27
-
28
- interface ProjectGroupContainerFactoryArgs
29
- {
30
- config: TenantConfig
31
- slug: string | undefined
32
- }
33
-
34
- export class ProjectGroupContainerFactory {
35
- constructor(
36
- private readonly debug: boolean,
37
- private readonly providers: Providers,
38
- private readonly systemContainerFactory: SystemContainerFactory,
39
- private readonly tenantContainerFactory: TenantContainerFactory,
40
- private readonly projectContainerFactoryFactory: ProjectContainerFactoryFactory,
41
- private readonly projectConfigResolver: ProjectConfigResolver,
42
- private readonly tenantGraphQLHandlerFactory: TenantGraphQLHandlerFactory,
43
- private readonly systemGraphQLHandlerFactory: SystemGraphQLHandlerFactory,
44
- private readonly logger: Logger,
45
- ) {}
46
-
47
- public create({ config, slug }: ProjectGroupContainerFactoryArgs): ProjectGroupContainer {
48
- return new Builder({})
49
- .addService('slug', () =>
50
- slug)
51
- .addService('logger', ({ slug }) =>
52
- this.logger.child({ projectGroup: slug }))
53
- .addService('providers', () =>
54
- this.providers)
55
- .addService('tenantDbCredentials', () =>
56
- config.db)
57
- .addService('tenantConnection', ({ tenantDbCredentials, logger }): Connection.ConnectionType =>
58
- Connection.create(tenantDbCredentials, err => logger.error(err)))
59
- .addService('projectSchemaResolver', () =>
60
- new ProjectSchemaResolverProxy())
61
- .addService('projectInitializer', () =>
62
- new ProjectInitializerProxy())
63
- .addService('tenantContainer', ({ tenantConnection, tenantDbCredentials, projectSchemaResolver, projectInitializer }) => {
64
- const encryptionKey = config.secrets.encryptionKey
65
- ? createSecretKey(Buffer.from(config.secrets.encryptionKey, 'hex'))
66
- : undefined
67
-
68
- const cryptoWrapper = new CryptoWrapper(encryptionKey)
69
- return this.tenantContainerFactory.create({
70
- connection: tenantConnection,
71
- dbCredentials: tenantDbCredentials,
72
- mailOptions: config.mailer,
73
- tenantCredentials: config.credentials,
74
- projectInitializer,
75
- projectSchemaResolver,
76
- cryptoProviders: {
77
- decrypt: cryptoWrapper.decrypt.bind(cryptoWrapper),
78
- encrypt: cryptoWrapper.encrypt.bind(cryptoWrapper),
79
- },
80
- })
81
- })
82
- .addService('tenantDatabase', ({ tenantContainer }) =>
83
- tenantContainer.databaseContext)
84
- .addService('identityFetcher', ({ tenantContainer: { identityFetcher } }) =>
85
- identityFetcher)
86
- .addService('systemContainer', ({ identityFetcher }) =>
87
- this.systemContainerFactory.create({ identityFetcher }))
88
- .addService('schemaVersionBuilder', ({ systemContainer }) =>
89
- systemContainer.schemaVersionBuilder)
90
- .addService('projectContainerFactory', ({ schemaVersionBuilder, logger }) =>
91
- this.projectContainerFactoryFactory.create(schemaVersionBuilder, logger))
92
- .addService('tenantProjectManager', ({ tenantContainer }) =>
93
- tenantContainer.projectManager)
94
- .addService('projectContainerResolver', ({ projectContainerFactory, tenantProjectManager, systemContainer, tenantContainer }) =>
95
- new ProjectContainerResolver(
96
- projectContainerFactory,
97
- this.projectConfigResolver,
98
- tenantProjectManager,
99
- systemContainer.projectInitializer,
100
- tenantContainer.databaseContext,
101
- config,
102
- ))
103
-
104
- .setupService('projectSchemaResolver', (it, { projectContainerResolver }) => {
105
- it.setResolver(new ProjectSchemaResolver(projectContainerResolver))
106
- })
107
- .setupService('projectInitializer', (it, { projectContainerResolver }) => {
108
- it.setInitializer(new ProjectInitializer(projectContainerResolver))
109
- })
110
- .addService('tenantGraphQLHandler', ({ tenantContainer }) =>
111
- this.tenantGraphQLHandlerFactory.create(tenantContainer.resolvers))
112
- .addService('systemGraphQLHandler', ({ systemContainer }) =>
113
- this.systemGraphQLHandlerFactory.create(systemContainer.systemResolversFactory))
114
- .addService('authenticator', ({ tenantDatabase, tenantContainer }) =>
115
- new Authenticator(tenantDatabase, tenantContainer.apiKeyManager))
116
- .addService('projectMembershipResolver', ({ tenantContainer }) =>
117
- new ProjectMembershipResolver(this.debug, new ProjectMembershipFetcher(tenantContainer.projectMemberManager, tenantContainer.databaseContext)))
118
- .build()
119
- .pick(
120
- 'projectContainerResolver',
121
- 'projectSchemaResolver',
122
- 'projectInitializer',
123
- 'systemContainer',
124
- 'systemGraphQLHandler',
125
- 'tenantContainer',
126
- 'tenantDatabase',
127
- 'authenticator',
128
- 'projectMembershipResolver',
129
- 'tenantGraphQLHandler',
130
- 'slug',
131
- 'logger',
132
- )
133
- }
134
- }
@@ -1,12 +0,0 @@
1
- import { ProjectGroupContainer, ProjectGroupResolver as ProjectGroupResolverInterface } from '@contember/engine-http'
2
-
3
- export class ProjectGroupResolver implements ProjectGroupResolverInterface {
4
- constructor(
5
- private readonly projectGroupContainer: ProjectGroupContainer,
6
- ) {
7
- }
8
-
9
- resolveContainer(): Promise<ProjectGroupContainer> {
10
- return Promise.resolve(this.projectGroupContainer)
11
- }
12
- }
@@ -1,2 +0,0 @@
1
- export * from './sentry'
2
- export * from './strings'
@@ -1,56 +0,0 @@
1
- import * as Sentry from '@sentry/node'
2
- import { LoggerRequestSymbol } from '@contember/engine-http'
3
- import { LogEntry, LoggerHandler, LogLevel, LogLevels } from '@contember/logger'
4
-
5
- export class SentryLoggerHandler implements LoggerHandler {
6
- constructor(
7
- private readonly logLevel: LogLevel,
8
- ) {
9
- }
10
-
11
- getMinLevel(): number {
12
- return this.logLevel.value
13
- }
14
-
15
- handle(entry: LogEntry) {
16
- if (!entry.error || entry.level.value < this.logLevel.value) {
17
- return
18
- }
19
- Sentry.captureException(entry.error, scope => {
20
- scope.setTag('project', entry.loggerAttributes.project ?? entry.ownAttributes.project)
21
- scope.setTag('module', entry.loggerAttributes.module ?? entry.ownAttributes.module)
22
- scope.setLevel('error')
23
- scope.setUser({
24
- id: entry.loggerAttributes.user ?? entry.ownAttributes.user,
25
- })
26
- scope.setExtra('requestId', entry.loggerAttributes.requestId)
27
-
28
- scope.addEventProcessor(event => {
29
- return {
30
- ...event,
31
- request: {
32
- url: entry.loggerAttributes.url ?? entry.ownAttributes.url,
33
- data: entry.loggerAttributes[LoggerRequestSymbol]?.body,
34
- },
35
- }
36
- })
37
- return scope
38
- })
39
- }
40
-
41
- close(): void {
42
- }
43
- }
44
-
45
- export const createSentryLoggerHandler = (dsn?: string): null | LoggerHandler => {
46
- if (!dsn) {
47
- return null
48
- }
49
- Sentry.init({
50
- dsn: dsn,
51
- integrations: integrations => {
52
- return integrations.filter(integration => integration.name !== 'Console' && integration.name !== 'Http')
53
- },
54
- })
55
- return new SentryLoggerHandler(LogLevels.warn)
56
- }
@@ -1,78 +0,0 @@
1
- import { join } from 'node:path'
2
- import { ConfigProcessor, Plugin } from '@contember/engine-plugins'
3
- import { ConfigSource, readConfig, ServerConfig } from '../config/config'
4
- import { Type } from '@contember/typesafe'
5
- import { createLogger, JsonStreamLoggerHandler, Logger, LogLevels, PrettyPrintLoggerHandler } from '@contember/logger'
6
-
7
- export const getServerVersion = (): string => {
8
- const packageJsonFile = process.env.CONTEMBER_PACKAGE_JSON || join(__dirname, '../../../package.json')
9
- // eslint-disable-next-line @typescript-eslint/no-var-requires
10
- const version = require(packageJsonFile).version
11
- return version
12
- }
13
-
14
- export const isDebugMode = (): boolean => process.env.NODE_ENV === 'development'
15
-
16
- export const printStartInfo = ({ version, isDebug }: { version: string; isDebug: boolean }, logger: Logger) => {
17
- logger.info(`Starting Contember ${version}`)
18
- logger.info(`NODE_ENV is set to ${process.env.NODE_ENV}`)
19
- if (isDebug) {
20
- logger.warn('Starting Contember in debug mode')
21
- logger.warn('NEVER USE debug mode in production environment')
22
- }
23
- }
24
-
25
- export const resolveServerConfig = async <T extends ServerConfig>({ plugins, serverConfigSchema }: { plugins: Plugin[]; serverConfigSchema: Type<T> }) => {
26
- const configProcessors = plugins
27
- .map(it => (it.getConfigProcessor ? it.getConfigProcessor() : null))
28
- .filter((it): it is ConfigProcessor => it !== null)
29
-
30
- const configSources: ConfigSource[] = []
31
- for (const configType of ['file', 'yaml', 'json'] as const) {
32
- const envValue = process.env['CONTEMBER_CONFIG_' + configType.toUpperCase()]
33
- if (envValue) {
34
- configSources.push({ type: configType, data: envValue })
35
- }
36
- }
37
-
38
- return await readConfig(configSources, configProcessors, serverConfigSchema)
39
- }
40
-
41
- export const createDefaultLogger = (): Logger => {
42
- const isDebug = isDebugMode()
43
- const loggerType = process.env.CONTEMBER_LOGGER_FORMAT ?? (isDebug ? 'pretty' : 'json')
44
- const stream = process.stderr
45
- const handler = loggerType === 'pretty'
46
- ? new PrettyPrintLoggerHandler(stream, {
47
- formatters: {
48
- pid: () => undefined,
49
- loggerId: () => undefined,
50
- uri: ({ attributes, chalk }) => {
51
- const color = attributes.status === undefined
52
- ? chalk.cyan
53
- : attributes.status < 300
54
- ? chalk.green
55
- : chalk.yellowBright
56
- const timeInfo = attributes.totalTimeMs !== undefined ? ` ${attributes.totalTimeMs}ms` : ''
57
- const statusInfo = attributes.status !== undefined ? ` [${attributes.status}]` : ''
58
- return { line: color(`${attributes.method}${statusInfo} ${attributes.uri}${timeInfo} ${chalk.white.dim('#' + attributes.requestId)}`) }
59
- },
60
- method: () => undefined,
61
- requestId: () => undefined,
62
- timeLabel: () => undefined,
63
- status: () => undefined,
64
- totalTimeMs: () => undefined,
65
- events: ({ formattedValue }) => formattedValue === '[]' ? undefined : formattedValue,
66
- },
67
- })
68
- : new JsonStreamLoggerHandler(stream)
69
- const logLevel = (process.env.CONTEMBER_LOGGER_LEVEL as keyof typeof LogLevels) ?? 'info'
70
- return createLogger(handler, {
71
- pid: process.pid,
72
- loggerId: Math.random().toString().substring(2),
73
- }, {
74
- fingerCrossedOptions: {
75
- logAlwaysLevel: LogLevels[logLevel],
76
- },
77
- })
78
- }
@@ -1,19 +0,0 @@
1
- import cluster from 'node:cluster'
2
- import { Logger } from '@contember/logger'
3
-
4
- const signals = {
5
- SIGHUP: 1,
6
- SIGINT: 2,
7
- SIGTERM: 15,
8
- }
9
- export type TerminationJob = (args: { signal: keyof typeof signals; code: number }) => Promise<void>
10
- export const listenOnProcessTermination = (jobs: TerminationJob[], logger: Logger) => {
11
- for (const [signal, code] of Object.entries(signals)) {
12
- process.on(signal, async () => {
13
- logger.info(`Process ${process.pid} received a ${signal} signal, executing ${jobs.length} termination jobs`)
14
- await Promise.allSettled(jobs.map(it => it({ signal: signal as keyof typeof signals, code })))
15
- logger.info(cluster.isMaster ? `All terminated, exiting` : 'All terminated, exiting a worker')
16
- process.exit(128 + code)
17
- })
18
- }
19
- }
@@ -1 +0,0 @@
1
- export const upperCaseFirst = (string: string) => `${string.charAt(0).toUpperCase()}${string.substring(1)}`
@@ -1,67 +0,0 @@
1
- import { assert, it } from 'vitest'
2
- import { createTenantConfigResolver } from '../../src/config/tenantConfigResolver'
3
- import { configTemplate } from '../../src/config/configTemplate'
4
- import { createProjectConfigResolver } from '../../src/config/projectConfigResolver'
5
-
6
- const env = {
7
- DEFAULT_DB_POOL_IDLE_TIMEOUT_MS: '60000',
8
- DEFAULT_DB_POOL_MAX_CONNECTIONS: '1000',
9
- DEFAULT_DB_POOL_MAX_CONNECTING: '10',
10
- DEFAULT_DB_CONNECTION_TIMEOUT_MS: '5000',
11
- }
12
- const tenantConfig = {
13
- db: {
14
- host: 'c0.cluster-abc.eu-west-1.rds.amazonaws.com',
15
- port: 5432,
16
- user: 'u_test_e',
17
- password: 'PASSWD',
18
- database: 'p_test_e',
19
- read: { host: 'c0.cluster-ro-abc.eu-west-1.rds.amazonaws.com' },
20
- },
21
- }
22
- it('resolves tenant config config', () => {
23
- const tenantResolver = createTenantConfigResolver(env, configTemplate.tenant)
24
- const resolvedTenantConfig = tenantResolver('test', tenantConfig)
25
- assert.deepEqual(resolvedTenantConfig, {
26
- db: {
27
- host: 'c0.cluster-abc.eu-west-1.rds.amazonaws.com',
28
- port: 5432,
29
- user: 'u_test_e',
30
- password: 'PASSWD',
31
- database: 'p_test_e',
32
- connectionTimeoutMs: 5000,
33
- pool: { maxConnections: 1000, maxConnecting: 10, idleTimeoutMs: 60000 },
34
- read: { host: 'c0.cluster-ro-abc.eu-west-1.rds.amazonaws.com' },
35
- }, mailer: {}, credentials: {}, secrets: {},
36
- })
37
- })
38
- it('resolves project config config', () => {
39
- const tenantResolver = createTenantConfigResolver(env, configTemplate.tenant)
40
- const resolvedTenantConfig = tenantResolver('test', tenantConfig)
41
-
42
- const projectConfigResolver = createProjectConfigResolver(env, configTemplate, [])
43
- const resolvedProjectConfig = projectConfigResolver('test-p', {
44
- db: {
45
- useTenantDb: true,
46
- systemSchema: 'system_test_e',
47
- }, s3: { prefix: 'test-e/test-e' }, stages: { live: { schema: 'content_test_e_live' } },
48
- }, {}, resolvedTenantConfig)
49
-
50
- assert.deepEqual(resolvedProjectConfig as any, {
51
- name: 'Test p',
52
- slug: 'test-p',
53
- stages: [{ name: 'Live', slug: 'live', schema: 'content_test_e_live' }],
54
- db: {
55
- host: 'c0.cluster-abc.eu-west-1.rds.amazonaws.com',
56
- port: 5432,
57
- user: 'u_test_e',
58
- password: 'PASSWD',
59
- database: 'p_test_e',
60
- connectionTimeoutMs: 5000,
61
- pool: { maxConnections: 1000, maxConnecting: 10, idleTimeoutMs: 60000 },
62
- read: { host: 'c0.cluster-ro-abc.eu-west-1.rds.amazonaws.com' },
63
- useTenantDb: true,
64
- systemSchema: 'system_test_e',
65
- },
66
- })
67
- })