Skip to content

Commit db608e6

Browse files
author
Bruno Castro
committed
Add initialization helper and update default context
1 parent 3ab3b5d commit db608e6

File tree

7 files changed

+61
-32
lines changed

7 files changed

+61
-32
lines changed

src/_boot/index.ts

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
1-
import { server } from '@/_boot/server';
2-
import { appModules } from '@/_boot/appModules';
1+
import { server, ServerConfig, ServerRegistry } from '@/_boot/server';
2+
import { appModules, AppModulesConfig, AppModulesRegistry } from '@/_boot/appModules';
33
import { asValue } from 'awilix';
4-
import { database } from '@/_boot/database';
5-
import { repl } from '@/_boot/repl';
4+
import { database, DatabaseConfig, DatabaseRegistry } from '@/_boot/database';
5+
import { repl, REPLConfig } from '@/_boot/repl';
66
import { withContext } from '@/context';
77
import { Configuration } from '@/config';
88
import { Logger } from 'pino';
9-
import { pubSub } from '@/_boot/pubSub';
10-
import { MessageBundle } from '@/messages';
11-
import { swagger } from '@/_boot/swagger';
9+
import { pubSub, PubSubRegistry } from '@/_boot/pubSub';
10+
import { swagger, SwaggerConfig } from '@/_boot/swagger';
11+
import { EnvironmentConfig } from '@/_lib/Environment';
12+
import { ContextApp } from '@/_lib/Context';
13+
import { Container, Initialize } from '@/container';
1214

13-
const main = withContext(async ({ app, container, config, bootstrap, logger, messageBundle }) => {
15+
type MainConfig = ServerConfig & DatabaseConfig & EnvironmentConfig & REPLConfig & SwaggerConfig & AppModulesConfig;
16+
17+
const main = withContext(async ({ app, container, config, bootstrap, logger, initialize }) => {
1418
container.register({
1519
app: asValue(app),
16-
messageBundle: asValue(messageBundle),
20+
initialize: asValue(initialize),
21+
container: asValue(container),
1722
logger: asValue(logger),
1823
startedAt: asValue(new Date()),
1924
config: asValue(config),
@@ -23,12 +28,16 @@ const main = withContext(async ({ app, container, config, bootstrap, logger, mes
2328
});
2429

2530
type MainRegistry = {
26-
app: any;
27-
messageBundle: MessageBundle;
31+
app: ContextApp;
32+
container: Container;
33+
initialize: Initialize;
2834
startedAt: Date;
2935
logger: Logger;
3036
config: Configuration;
31-
};
37+
} & DatabaseRegistry &
38+
ServerRegistry &
39+
PubSubRegistry &
40+
AppModulesRegistry;
3241

3342
export { main };
34-
export type { MainRegistry };
43+
export type { MainConfig, MainRegistry };

src/_lib/Context.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ type Module<T extends Record<string | symbol, any>, F extends BootFn<T> = BootFn
99
fn: F;
1010
};
1111

12+
type ContextApp = Omit<Application, 'start' | 'onBooting'>;
13+
1214
type Context<T extends Record<string | symbol, any>> = {
13-
app: Omit<Application, 'start' | 'onBooting'>;
15+
app: ContextApp;
1416
bootstrap: <M extends Module<T>[]>(...modules: M) => Promise<void>;
1517
} & T;
1618

@@ -109,3 +111,4 @@ const makeContext = <T extends Record<string | symbol, any>>(
109111
};
110112

111113
export { makeContext };
114+
export type { ContextApp };

src/_lib/Initialize.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
type InitFn<R, T, OPTS = void> = (deps: R, opts?: OPTS) => T;
2+
type BuilderFn<R, OPTS = void> = <T>(fn: InitFn<R, T, OPTS>) => T;
3+
type ThenArg<T extends (...args: any[]) => Promise<any>> = ReturnType<T> extends PromiseLike<infer U>
4+
? U
5+
: ReturnType<T>;
6+
7+
type Initialize<R, OPTS = void> = <T extends Array<InitFn<R, unknown, OPTS>>>(
8+
...fns: T
9+
) => Promise<{ [i in keyof T]: T[i] extends (...args) => any ? ThenArg<T[i]> : T[i] }>;
10+
11+
const makeInitialize =
12+
<R extends Record<string, any>, OPTS = void>(builderFn: BuilderFn<R, OPTS>): Initialize<R, OPTS> =>
13+
<T extends Array<InitFn<R, unknown, OPTS>>>(
14+
...fns: T
15+
): Promise<{ [i in keyof T]: T[i] extends (...args) => any ? ThenArg<T[i]> : T[i] }> =>
16+
fns.reduce(
17+
(chain, fn) =>
18+
chain.then((results) => Promise.resolve(builderFn(fn)).then((result) => Promise.resolve([...results, result]))),
19+
Promise.resolve<any[]>([])
20+
) as any;
21+
22+
export { makeInitialize };
23+
export type { Initialize };

src/config.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
import { REPLConfig } from '@/_boot/repl';
1+
import { MainConfig } from '@/_boot';
22
import { environment, EnvironmentConfig, envNumber, envString } from '@/_lib/Environment';
3-
import { ServerConfig } from '@/_boot/server';
4-
import { DatabaseConfig } from '@/_boot/database';
5-
import { SwaggerConfig } from '@/_boot/swagger';
6-
import { AppModulesConfig } from '@/_boot/appModules';
73

8-
type Configuration = ServerConfig & DatabaseConfig & EnvironmentConfig & REPLConfig & SwaggerConfig & AppModulesConfig;
4+
type Configuration = MainConfig & EnvironmentConfig;
95

106
const config: Configuration = {
117
appName: 'node-api-boilerplate',

src/container.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
import { createContainer } from 'awilix';
1+
import { BuildResolverOptions, createContainer } from 'awilix';
22
import { MainRegistry } from '@/_boot';
3-
import { DatabaseRegistry } from '@/_boot/database';
4-
import { ServerRegistry } from '@/_boot/server';
5-
import { PubSubRegistry } from '@/_boot/pubSub';
6-
import { AppModulesRegistry } from '@/_boot/appModules';
3+
import { makeInitialize } from '@/_lib/Initialize';
74

8-
type Registry = MainRegistry & DatabaseRegistry & ServerRegistry & PubSubRegistry & AppModulesRegistry;
5+
type Registry = MainRegistry;
96

107
const container = createContainer<Registry>();
8+
const initialize = makeInitialize<Registry, BuildResolverOptions<any>>(container.build);
119

1210
type Container = typeof container;
11+
type Initialize = typeof initialize;
1312

14-
export { container };
15-
export type { Container, Registry };
13+
export { container, initialize };
14+
export type { Container, Registry, Initialize };

src/context.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { makeContext } from '@/_lib/Context';
2-
import { container } from '@/container';
2+
import { container, initialize } from '@/container';
33
import { config } from '@/config';
44
import { logger } from '@/_lib/logger';
5-
import { messageBundle } from '@/messages';
65

7-
const { withContext, makeModule } = makeContext({ config, container, logger, messageBundle }, { logger });
6+
const { withContext, makeModule } = makeContext({ config, container, logger, initialize }, { logger });
87

98
export { withContext, makeModule };

tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"moduleResolution": "node",
1515
"baseUrl": "./src",
1616
"paths": {
17-
"@/*": ["*"],
17+
"@/*": ["*"]
1818
},
1919
"typeRoots": ["node_modules/@types"],
2020
"esModuleInterop": true,

0 commit comments

Comments
 (0)