Skip to content

Commit 8fd3991

Browse files
committed
feat(config): allow additional shortstop handlers to be inserted before configuration is loaded
1 parent 775ab7c commit 8fd3991

File tree

4 files changed

+20
-13
lines changed

4 files changed

+20
-13
lines changed

__tests__/config.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import path from 'path';
44
import { describe, expect, test } from 'vitest';
55

66
import { ConfigurationSchema, insertConfigurationBefore, loadConfiguration } from '../src/config';
7+
import { shortstops } from '../src/config/shortstops';
78

89
interface CustomConfig extends ConfigurationSchema {
910
google: string;
@@ -18,10 +19,10 @@ interface CustomConfig extends ConfigurationSchema {
1819
describe('configuration loader', () => {
1920
test('overrides and shortstops', async () => {
2021
const rootDirectory = path.resolve(__dirname, './fake-serv');
22+
const shortstopHandlers = shortstops({ name: 'fake-serv' }, path.join(rootDirectory, 'src'));
2123
const config = await loadConfiguration<CustomConfig>({
22-
name: 'fake-serv',
23-
sourceDirectory: path.join(rootDirectory, 'src'),
2424
configurationDirectories: [path.resolve(rootDirectory, './config')],
25+
shortstopHandlers,
2526
});
2627

2728
expect(config.logging?.level).toEqual('debug');

src/config/index.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import fs from 'fs';
22
import path from 'path';
33

4-
import { BaseConfitSchema, Confit, Factory, confit } from '@sesamecare-oss/confit';
4+
import {
5+
BaseConfitSchema,
6+
Confit,
7+
Factory,
8+
ShortstopHandler,
9+
confit,
10+
} from '@sesamecare-oss/confit';
511

612
import { findPort } from '../development/port-finder';
713

8-
import { shortstops } from './shortstops';
914
import type { ConfigurationSchema } from './schema';
1015

1116
// Order matters here.
@@ -51,27 +56,23 @@ async function addDefaultConfiguration<Config extends ConfigurationSchema = Conf
5156
}
5257

5358
export interface ServiceConfigurationSpec {
54-
// Used for "sourcerequire" and other source-relative paths and for the package name
55-
sourceDirectory: string;
5659
// The LAST configuration is the most "specific" - if a configuration value
5760
// exists in all directories, the last one wins
5861
configurationDirectories: string[];
59-
name: string;
62+
shortstopHandlers: Record<string, ShortstopHandler<string, unknown>>;
6063
}
6164

6265
export async function loadConfiguration<Config extends ConfigurationSchema>({
63-
name,
6466
configurationDirectories: dirs,
65-
sourceDirectory,
67+
shortstopHandlers,
6668
}: ServiceConfigurationSpec): Promise<Config> {
67-
const defaultProtocols = shortstops({ name }, sourceDirectory);
6869
const specificConfig = dirs[dirs.length - 1];
6970

7071
// This confit version just gets us environment info
7172
const envConfit = await confit({ basedir: specificConfig }).create();
7273
const configFactory = confit<Config>({
7374
basedir: specificConfig,
74-
protocols: defaultProtocols,
75+
protocols: shortstopHandlers,
7576
});
7677

7778
/**

src/express-app/app.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import type {
2828
ServiceStartOptions,
2929
} from '../types';
3030
import { ConfigurationSchema } from '../config/schema';
31+
import { shortstops } from '../config/shortstops';
3132
import { getNodeEnv, isDev } from '../env';
3233
import { getGlobalPrometheusExporter } from '../telemetry/index';
3334

@@ -76,15 +77,16 @@ export async function startApp<
7677
const serviceImpl = service();
7778
assert(serviceImpl?.start, 'Service function did not return a conforming object');
7879

80+
const sourceDirectory = path.join(rootDirectory, codepath);
7981
const baseOptions: ServiceOptions = {
8082
configurationDirectories: [path.resolve(rootDirectory, './config')],
83+
shortstopHandlers: shortstops({ name }, sourceDirectory),
8184
};
8285
const options = serviceImpl.configure?.(startOptions, baseOptions) || baseOptions;
8386

8487
const config = await loadConfiguration({
85-
name,
8688
configurationDirectories: options.configurationDirectories,
87-
sourceDirectory: path.join(rootDirectory, codepath),
89+
shortstopHandlers: options.shortstopHandlers,
8890
});
8991

9092
const logging = config.logging;

src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { Request, Response } from 'express';
66
import type { Application } from 'express-serve-static-core';
77
import type { middleware } from 'express-openapi-validator';
88
import type { Meter } from '@opentelemetry/api';
9+
import { ShortstopHandler } from '@sesamecare-oss/confit';
910

1011
import { ConfigurationSchema } from './config/schema';
1112

@@ -143,6 +144,8 @@ export interface ServiceOptions {
143144

144145
// Add or control OpenAPI options such as security handlers
145146
openApiOptions?: Parameters<typeof middleware>[0];
147+
148+
shortstopHandlers: Record<string, ShortstopHandler<string, unknown>>;
146149
}
147150

148151
export interface ServiceLike<

0 commit comments

Comments
 (0)