snap-on-openapi 1.0.20 → 1.0.22
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/OpenApi.d.ts +2 -1
- package/dist/OpenApi.js +11 -6
- package/dist/services/ConfigBuilder/types/DefaultConfig.d.ts +2 -2
- package/dist/services/TestUtils/utils/TestLogger.d.ts +5 -0
- package/dist/services/TestUtils/utils/TestLogger.js +3 -0
- package/dist/types/config/Config.d.ts +4 -3
- package/dist/types/config/RouteContext.d.ts +2 -0
- package/dist/types/config/RouteContext.js +1 -0
- package/dist/types/events/OnErrorEvent.d.ts +1 -1
- package/dist/types/events/OnHandlerEvent.d.ts +2 -1
- package/dist/types/events/OnResponseEvent.d.ts +1 -1
- package/dist/types/events/OnRouteEvent.d.ts +2 -2
- package/package.json +1 -1
package/dist/OpenApi.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ import z from 'zod';
|
|
|
24
24
|
import { OnResponseEvent } from './types/events/OnResponseEvent.js';
|
|
25
25
|
import { RouteResponse } from './types/RouteResponse.js';
|
|
26
26
|
import { ILogger } from './services/Logger/types/ILogger.js';
|
|
27
|
+
import { RouteContext } from './types/config/RouteContext.js';
|
|
27
28
|
export declare class OpenApi<TRouteTypes extends string, TErrorCodes extends string, TConfig extends AnyConfig<TRouteTypes, TErrorCodes>> {
|
|
28
29
|
static readonly builder: InitialBuilder;
|
|
29
30
|
readonly validators: ValidationUtils;
|
|
@@ -49,7 +50,7 @@ export declare class OpenApi<TRouteTypes extends string, TErrorCodes extends str
|
|
|
49
50
|
addServer(url: string, description: string): void;
|
|
50
51
|
protected getRouteForPath(path: string, method: string): AnyRoute<TRouteTypes> | null;
|
|
51
52
|
processRootRoute(originalReq: Request): Promise<RouteResponse>;
|
|
52
|
-
protected handleError(e: unknown, req: Request, eventPieces?: Partial<OnResponseEvent<TRouteTypes, TConfig['routes'][TRouteTypes]['extraProps']
|
|
53
|
+
protected handleError(e: unknown, req: Request, eventPieces?: Partial<OnResponseEvent<TRouteTypes, TConfig['routes'][TRouteTypes]['extraProps'], RouteContext<TRouteTypes, TConfig>>>): Promise<{
|
|
53
54
|
status: number;
|
|
54
55
|
body: z.TypeOf<import("./index.js").OpenApiErrorConfigMap<TErrorCodes>[TErrorCodes]["responseValidator"]>;
|
|
55
56
|
headers: {};
|
package/dist/OpenApi.js
CHANGED
|
@@ -133,8 +133,9 @@ export class OpenApi {
|
|
|
133
133
|
let onResponse;
|
|
134
134
|
let onHandler;
|
|
135
135
|
try {
|
|
136
|
+
const logger = await this.config.requestLogger?.(originalReq) ?? this.logger;
|
|
136
137
|
if (this.config.onRequest) {
|
|
137
|
-
onRequest = { request: originalReq, logger
|
|
138
|
+
onRequest = { request: originalReq, logger };
|
|
138
139
|
await this.config.onRequest(onRequest);
|
|
139
140
|
}
|
|
140
141
|
const url = new URL(originalReq.url);
|
|
@@ -142,7 +143,7 @@ export class OpenApi {
|
|
|
142
143
|
const urlPath = url.pathname.replace(basePath, '');
|
|
143
144
|
const route = this.getRouteForPath(urlPath, originalReq.method);
|
|
144
145
|
if (!route) {
|
|
145
|
-
|
|
146
|
+
logger.info(`Route for ${originalReq.method}:${urlPath} not found`);
|
|
146
147
|
throw new BuiltInError(ErrorCode.NotFound);
|
|
147
148
|
}
|
|
148
149
|
const pathParams = {};
|
|
@@ -186,7 +187,7 @@ export class OpenApi {
|
|
|
186
187
|
};
|
|
187
188
|
onRoute = {
|
|
188
189
|
request: originalReq,
|
|
189
|
-
logger
|
|
190
|
+
logger,
|
|
190
191
|
path: urlPath,
|
|
191
192
|
method: originalReq.method,
|
|
192
193
|
params: pathParams,
|
|
@@ -219,7 +220,7 @@ export class OpenApi {
|
|
|
219
220
|
const context = await this.config.routes[route.type].contextFactory({
|
|
220
221
|
route: route,
|
|
221
222
|
request: originalReq,
|
|
222
|
-
logger
|
|
223
|
+
logger,
|
|
223
224
|
params: {
|
|
224
225
|
query: query.data,
|
|
225
226
|
path: path.data,
|
|
@@ -228,6 +229,7 @@ export class OpenApi {
|
|
|
228
229
|
});
|
|
229
230
|
onHandler = {
|
|
230
231
|
...onRoute,
|
|
232
|
+
context,
|
|
231
233
|
validated: {
|
|
232
234
|
query: query.data,
|
|
233
235
|
path: path.data,
|
|
@@ -246,10 +248,13 @@ export class OpenApi {
|
|
|
246
248
|
});
|
|
247
249
|
return response;
|
|
248
250
|
};
|
|
251
|
+
if (this.config.onHandler) {
|
|
252
|
+
await this.config.onHandler(onHandler);
|
|
253
|
+
}
|
|
249
254
|
const response = await wrapper(handler, {
|
|
250
255
|
route: route,
|
|
251
256
|
request: originalReq,
|
|
252
|
-
logger
|
|
257
|
+
logger,
|
|
253
258
|
params: {
|
|
254
259
|
query: query.data,
|
|
255
260
|
path: path.data,
|
|
@@ -293,8 +298,8 @@ export class OpenApi {
|
|
|
293
298
|
try {
|
|
294
299
|
const event = {
|
|
295
300
|
...eventPieces,
|
|
301
|
+
logger: eventPieces?.logger ?? this.logger,
|
|
296
302
|
request: req,
|
|
297
|
-
logger: this.logger,
|
|
298
303
|
error: e,
|
|
299
304
|
};
|
|
300
305
|
const response = this.config.onError ? await this.config.onError(event) : this.config.defaultError;
|
|
@@ -23,7 +23,7 @@ export declare class DefaultConfig implements Config<SampleRouteType, ErrorCode,
|
|
|
23
23
|
onRequest?: () => Promise<void>;
|
|
24
24
|
onRoute?: (e: OnRouteEvent<SampleRouteType, DefaultRouteParamsMap>) => Promise<void>;
|
|
25
25
|
onHandler?: () => Promise<void>;
|
|
26
|
-
onResponse?: (e: OnResponseEvent<SampleRouteType, DefaultRouteParamsMap>) => Promise<void>;
|
|
27
|
-
onError?: (e: OnErrorEvent<SampleRouteType, DefaultRouteParamsMap>) => Promise<ErrorResponse<ErrorCode, DefaultErrorMap>>;
|
|
26
|
+
onResponse?: (e: OnResponseEvent<SampleRouteType, DefaultRouteParamsMap, object>) => Promise<void>;
|
|
27
|
+
onError?: (e: OnErrorEvent<SampleRouteType, DefaultRouteParamsMap, object>) => Promise<ErrorResponse<ErrorCode, DefaultErrorMap>>;
|
|
28
28
|
skipDescriptionsCheck?: boolean;
|
|
29
29
|
}
|
|
@@ -6,5 +6,10 @@ export declare class TestLogger extends Logger {
|
|
|
6
6
|
level: string;
|
|
7
7
|
data?: object;
|
|
8
8
|
} | undefined;
|
|
9
|
+
popMessage(): {
|
|
10
|
+
message: string;
|
|
11
|
+
level: string;
|
|
12
|
+
data?: object;
|
|
13
|
+
} | undefined;
|
|
9
14
|
protected log(message: string, level: string, data?: object): void;
|
|
10
15
|
}
|
|
@@ -16,6 +16,7 @@ import { ILogger } from '../../services/Logger/types/ILogger.js';
|
|
|
16
16
|
export type Config<TRouteTypes extends string, TErrorCodes extends string, TErrorConfigMap extends ErrorConfigMap<TErrorCodes>, TRouteParamMap extends RouteExtraPropsMap<TRouteTypes>, TRouteContextMap extends RouteContextMap<TRouteTypes, TRouteParamMap>, TRouteConfigMap extends RouteConfigMap<TRouteTypes, TErrorCodes, TRouteParamMap, TRouteContextMap>> = {
|
|
17
17
|
disableResponseValidation?: boolean;
|
|
18
18
|
logger?: ILogger;
|
|
19
|
+
requestLogger?: (req: Request) => Promise<ILogger>;
|
|
19
20
|
basePath: RoutePath;
|
|
20
21
|
routes: TRouteConfigMap;
|
|
21
22
|
generator?: {
|
|
@@ -34,7 +35,7 @@ export type Config<TRouteTypes extends string, TErrorCodes extends string, TErro
|
|
|
34
35
|
logLevel?: LogLevel;
|
|
35
36
|
onRequest?: (e: OnRequestEvent) => Promise<void>;
|
|
36
37
|
onRoute?: (e: OnRouteEvent<TRouteTypes, TRouteParamMap>) => Promise<void>;
|
|
37
|
-
onHandler?: (e: OnHandlerEvent<TRouteTypes, TRouteParamMap
|
|
38
|
-
onResponse?: (e: OnResponseEvent<TRouteTypes, TRouteParamMap
|
|
39
|
-
onError?: (e: OnErrorEvent<TRouteTypes, TRouteParamMap
|
|
38
|
+
onHandler?: (e: OnHandlerEvent<TRouteTypes, TRouteParamMap, Awaited<ReturnType<TRouteContextMap[TRouteTypes]>>>) => Promise<void>;
|
|
39
|
+
onResponse?: (e: OnResponseEvent<TRouteTypes, TRouteParamMap, Awaited<ReturnType<TRouteContextMap[TRouteTypes]>>>) => Promise<void>;
|
|
40
|
+
onError?: (e: OnErrorEvent<TRouteTypes, TRouteParamMap, Awaited<ReturnType<TRouteContextMap[TRouteTypes]>>>) => Promise<ErrorResponse<TErrorCodes, TErrorConfigMap>>;
|
|
40
41
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ILogger } from '../../services/Logger/types/ILogger.js';
|
|
2
2
|
import { RouteExtraPropsMap } from '../config/RouteExtraPropsMap.js';
|
|
3
3
|
import { OnResponseEvent } from './OnResponseEvent.js';
|
|
4
|
-
export interface OnErrorEvent<TRouteType extends string, TContextMap extends RouteExtraPropsMap<TRouteType
|
|
4
|
+
export interface OnErrorEvent<TRouteType extends string, TContextMap extends RouteExtraPropsMap<TRouteType>, TContext extends object> extends Partial<OnResponseEvent<TRouteType, TContextMap, TContext>> {
|
|
5
5
|
request: Request;
|
|
6
6
|
logger: ILogger;
|
|
7
7
|
error: unknown;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { RouteExtraPropsMap } from '../config/RouteExtraPropsMap.js';
|
|
2
2
|
import { OnRouteEvent } from './OnRouteEvent.js';
|
|
3
|
-
export interface OnHandlerEvent<TRouteType extends string, TContextMap extends RouteExtraPropsMap<TRouteType
|
|
3
|
+
export interface OnHandlerEvent<TRouteType extends string, TContextMap extends RouteExtraPropsMap<TRouteType>, TContext extends object> extends OnRouteEvent<TRouteType, TContextMap> {
|
|
4
4
|
validated: {
|
|
5
5
|
query: Record<string, unknown>;
|
|
6
6
|
path: Record<string, unknown>;
|
|
7
7
|
body: unknown;
|
|
8
8
|
};
|
|
9
|
+
context: TContext;
|
|
9
10
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RouteExtraPropsMap } from '../config/RouteExtraPropsMap.js';
|
|
2
2
|
import { RouteResponse } from '../RouteResponse.js';
|
|
3
3
|
import { OnHandlerEvent } from './OnHandlerEvent.js';
|
|
4
|
-
export interface OnResponseEvent<TRouteType extends string, TContextMap extends RouteExtraPropsMap<TRouteType
|
|
4
|
+
export interface OnResponseEvent<TRouteType extends string, TContextMap extends RouteExtraPropsMap<TRouteType>, TContext extends object> extends OnHandlerEvent<TRouteType, TContextMap, TContext> {
|
|
5
5
|
response: RouteResponse;
|
|
6
6
|
}
|
|
@@ -2,11 +2,11 @@ import { AnyRoute } from '../AnyRoute.js';
|
|
|
2
2
|
import { RouteExtraProps } from '../config/RouteExtraProps.js';
|
|
3
3
|
import { RouteExtraPropsMap } from '../config/RouteExtraPropsMap.js';
|
|
4
4
|
import { OnRequestEvent } from './OnRequestEvent.js';
|
|
5
|
-
export interface OnRouteEvent<TRouteType extends string,
|
|
5
|
+
export interface OnRouteEvent<TRouteType extends string, TExtraPropsMap extends RouteExtraPropsMap<TRouteType>> extends OnRequestEvent {
|
|
6
6
|
path: string;
|
|
7
7
|
method: string;
|
|
8
8
|
params: Record<string, string>;
|
|
9
9
|
query: Record<string, string | string[]>;
|
|
10
10
|
body: unknown;
|
|
11
|
-
route: AnyRoute<TRouteType> & RouteExtraProps<
|
|
11
|
+
route: AnyRoute<TRouteType> & RouteExtraProps<TExtraPropsMap[TRouteType]>;
|
|
12
12
|
}
|
package/package.json
CHANGED