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 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']>>): Promise<{
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: this.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
- this.logger.info(`Route for ${originalReq.method}:${urlPath} not found`);
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: this.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: this.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: this.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
  }
@@ -4,6 +4,9 @@ export class TestLogger extends Logger {
4
4
  shiftMessage() {
5
5
  return this.messages.shift();
6
6
  }
7
+ popMessage() {
8
+ return this.messages.pop();
9
+ }
7
10
  log(message, level, data) {
8
11
  this.messages.push({ message, level, data });
9
12
  }
@@ -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>) => Promise<void>;
38
- onResponse?: (e: OnResponseEvent<TRouteTypes, TRouteParamMap>) => Promise<void>;
39
- onError?: (e: OnErrorEvent<TRouteTypes, TRouteParamMap>) => Promise<ErrorResponse<TErrorCodes, TErrorConfigMap>>;
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,2 @@
1
+ import { AnyConfig } from './AnyConfig.js';
2
+ export type RouteContext<TRouteType extends string, TConfig extends AnyConfig<TRouteType, string>> = Awaited<ReturnType<TConfig['routes'][TRouteType]['contextFactory']>>;
@@ -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>> extends Partial<OnResponseEvent<TRouteType, TContextMap>> {
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>> extends OnRouteEvent<TRouteType, TContextMap> {
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>> extends OnHandlerEvent<TRouteType, TContextMap> {
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, TContextMap extends RouteExtraPropsMap<TRouteType>> extends OnRequestEvent {
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<TContextMap[TRouteType]>;
11
+ route: AnyRoute<TRouteType> & RouteExtraProps<TExtraPropsMap[TRouteType]>;
12
12
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "snap-on-openapi",
3
3
  "author": "Alex Sarychev",
4
- "version": "1.0.20",
4
+ "version": "1.0.22",
5
5
  "description": "Swiftly build type-checked OpenAPI applications with Zod and TypeScript",
6
6
  "type": "module",
7
7
  "license": "ISC",