snap-on-openapi 1.0.2 → 1.0.3

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 (89) hide show
  1. package/dist/OpenApi.d.ts +23 -23
  2. package/dist/OpenApi.js +15 -15
  3. package/dist/OpenApi.test.d.ts +1 -0
  4. package/dist/OpenApi.test.js +418 -0
  5. package/dist/index.d.ts +38 -38
  6. package/dist/index.js +22 -22
  7. package/dist/services/ClientGenerator/ClientGenerator.d.ts +2 -2
  8. package/dist/services/ClientGenerator/ClientGenerator.test.d.ts +1 -0
  9. package/dist/services/ClientGenerator/ClientGenerator.test.js +37 -0
  10. package/dist/services/ConfigBuilder/ConfigBuilder.d.ts +9 -9
  11. package/dist/services/ConfigBuilder/ConfigBuilder.js +1 -1
  12. package/dist/services/ConfigBuilder/ConfigBuilder.test.d.ts +1 -0
  13. package/dist/services/ConfigBuilder/ConfigBuilder.test.js +207 -0
  14. package/dist/services/ConfigBuilder/types/DefaultConfig.d.ts +9 -9
  15. package/dist/services/ConfigBuilder/types/DefaultConfig.js +6 -6
  16. package/dist/services/ConfigBuilder/types/DefaultConfig.test.d.ts +1 -0
  17. package/dist/services/ConfigBuilder/types/DefaultConfig.test.js +82 -0
  18. package/dist/services/ConfigBuilder/types/DefaultErrorMap.d.ts +7 -7
  19. package/dist/services/ConfigBuilder/types/DefaultErrorMap.js +4 -4
  20. package/dist/services/ConfigBuilder/types/DefaultRouteContextMap.d.ts +3 -3
  21. package/dist/services/ConfigBuilder/types/DefaultRouteMap.d.ts +5 -5
  22. package/dist/services/ConfigBuilder/types/DefaultRouteMap.js +2 -2
  23. package/dist/services/ConfigBuilder/types/DefaultRouteParamsMap.d.ts +2 -2
  24. package/dist/services/ConfigBuilder/types/OpenApiConstructor.d.ts +1 -1
  25. package/dist/services/DescriptionChecker/DescriptionChecker.d.ts +2 -2
  26. package/dist/services/DescriptionChecker/DescriptionChecker.js +1 -1
  27. package/dist/services/DescriptionChecker/DescriptionChecker.test.d.ts +1 -0
  28. package/dist/services/DescriptionChecker/DescriptionChecker.test.js +120 -0
  29. package/dist/services/DevelopmentUtils/DevelopmentUtils.test.d.ts +1 -0
  30. package/dist/services/DevelopmentUtils/DevelopmentUtils.test.js +10 -0
  31. package/dist/services/ExpressWrapper/ExpressWrapper.d.ts +5 -5
  32. package/dist/services/ExpressWrapper/ExpressWrapper.js +1 -1
  33. package/dist/services/ExpressWrapper/ExpressWrapper.test.d.ts +1 -0
  34. package/dist/services/ExpressWrapper/ExpressWrapper.test.js +136 -0
  35. package/dist/services/ExpressWrapper/types/ExpressApp.d.ts +1 -1
  36. package/dist/services/ExpressWrapper/types/ExpressHandler.d.ts +2 -2
  37. package/dist/services/Logger/Logger.d.ts +1 -1
  38. package/dist/services/Logger/Logger.js +1 -1
  39. package/dist/services/Logger/Logger.test.d.ts +1 -0
  40. package/dist/services/Logger/Logger.test.js +113 -0
  41. package/dist/services/RoutingFactory/RoutingFactory.d.ts +4 -4
  42. package/dist/services/SchemaGenerator/SchemaGenerator.d.ts +5 -5
  43. package/dist/services/SchemaGenerator/SchemaGenerator.js +1 -1
  44. package/dist/services/SchemaGenerator/SchemaGenerator.test.d.ts +1 -0
  45. package/dist/services/SchemaGenerator/SchemaGenerator.test.js +142 -0
  46. package/dist/services/TanstackStartWrapper/TanstackStartWrapper.d.ts +4 -4
  47. package/dist/services/TanstackStartWrapper/TanstackStartWrapper.js +1 -1
  48. package/dist/services/TanstackStartWrapper/TanstackStartWrapper.test.d.ts +1 -0
  49. package/dist/services/TanstackStartWrapper/TanstackStartWrapper.test.js +44 -0
  50. package/dist/services/TestUtils/TestUtils.d.ts +5 -5
  51. package/dist/services/TestUtils/TestUtils.js +3 -3
  52. package/dist/services/TestUtils/TestUtils.test.d.ts +1 -0
  53. package/dist/services/TestUtils/TestUtils.test.js +20 -0
  54. package/dist/services/ValidationUtils/ValidationUtils.js +3 -3
  55. package/dist/services/ValidationUtils/ValidationUtils.test.d.ts +1 -0
  56. package/dist/services/ValidationUtils/ValidationUtils.test.js +165 -0
  57. package/dist/services/ValidationUtils/transformers/stringBooleanTransformer.test.d.ts +1 -0
  58. package/dist/services/ValidationUtils/transformers/stringBooleanTransformer.test.js +19 -0
  59. package/dist/services/ValidationUtils/transformers/stringDateTransformer.test.d.ts +1 -0
  60. package/dist/services/ValidationUtils/transformers/stringDateTransformer.test.js +13 -0
  61. package/dist/services/ValidationUtils/transformers/stringNumberTransfromer.test.d.ts +1 -0
  62. package/dist/services/ValidationUtils/transformers/stringNumberTransfromer.test.js +47 -0
  63. package/dist/types/AnyRoute.d.ts +1 -1
  64. package/dist/types/InitialBuilder.d.ts +8 -8
  65. package/dist/types/Route.d.ts +2 -2
  66. package/dist/types/RouteMap.d.ts +2 -2
  67. package/dist/types/Wrappers.d.ts +3 -3
  68. package/dist/types/config/AnyConfig.d.ts +3 -3
  69. package/dist/types/config/AnyRouteConfigMap.d.ts +1 -1
  70. package/dist/types/config/Config.d.ts +9 -9
  71. package/dist/types/config/ContextParams.d.ts +2 -2
  72. package/dist/types/config/ErrorConfigMap.d.ts +1 -1
  73. package/dist/types/config/ErrorResponse.d.ts +1 -1
  74. package/dist/types/config/Info.d.ts +1 -1
  75. package/dist/types/config/RouteConfig.d.ts +1 -1
  76. package/dist/types/config/RouteConfigMap.d.ts +3 -3
  77. package/dist/types/config/RouteContextMap.d.ts +2 -2
  78. package/dist/types/config/Server.d.ts +1 -1
  79. package/dist/types/errors/BuiltInError.d.ts +2 -2
  80. package/dist/types/errors/BuiltInError.js +1 -1
  81. package/dist/types/errors/ValidationError.d.ts +2 -2
  82. package/dist/types/errors/ValidationError.js +2 -2
  83. package/dist/types/errors/responses/NotFoundErrorResponse.d.ts +1 -1
  84. package/dist/types/errors/responses/NotFoundErrorResponse.js +1 -1
  85. package/dist/types/errors/responses/UnknownErrorResponse.d.ts +1 -1
  86. package/dist/types/errors/responses/UnknownErrorResponse.js +1 -1
  87. package/dist/types/errors/responses/ValidationErrorResponse.d.ts +2 -2
  88. package/dist/types/errors/responses/ValidationErrorResponse.js +3 -3
  89. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { UserConfig } from '@hey-api/openapi-ts';
2
- import { OpenApi } from '../../OpenApi.js';
3
- import { AnyConfig } from '../../types/config/AnyConfig.js';
2
+ import { OpenApi } from '../../OpenApi';
3
+ import { AnyConfig } from '../../types/config/AnyConfig';
4
4
  export declare class ClientGenerator<TRouteTypes extends string, TErrorCodes extends string, TConfig extends AnyConfig<TRouteTypes, TErrorCodes>> {
5
5
  protected api: OpenApi<TRouteTypes, TErrorCodes, TConfig>;
6
6
  constructor(api: OpenApi<TRouteTypes, TErrorCodes, TConfig>);
@@ -0,0 +1,37 @@
1
+ import { afterEach, describe, expect, test } from 'vitest';
2
+ import { TestUtils } from '../TestUtils/TestUtils';
3
+ import { existsSync, rmSync } from 'fs';
4
+ import { resolve } from 'path';
5
+ describe('ClientGenerator', async () => {
6
+ const api = TestUtils.createOpenApi();
7
+ const dirs = [
8
+ 'open-api-client',
9
+ 'temp/client',
10
+ ];
11
+ afterEach(() => {
12
+ for (const dir of dirs) {
13
+ if (!existsSync(dir)) {
14
+ continue;
15
+ }
16
+ rmSync(dir, { recursive: true, force: true });
17
+ }
18
+ });
19
+ test('Happy Path', async () => {
20
+ await api.clientGenerator.generate();
21
+ const directoryCreated = await TestUtils.awaitGeneric(1000, 200, async () => {
22
+ const fileExists = existsSync(resolve('open-api-client'));
23
+ return fileExists || null;
24
+ });
25
+ expect(directoryCreated).toBe(true);
26
+ });
27
+ test('Config overrides work', async () => {
28
+ await api.clientGenerator.generate({
29
+ output: 'temp/client',
30
+ });
31
+ const directoryCreated = await TestUtils.awaitGeneric(1000, 200, async () => {
32
+ const fileExists = existsSync(resolve('temp/client'));
33
+ return fileExists || null;
34
+ });
35
+ expect(directoryCreated).toBe(true);
36
+ });
37
+ });
@@ -1,13 +1,13 @@
1
- import { ErrorConfigMap } from '../../types/config/ErrorConfigMap.js';
2
- import { Config } from '../../types/config/Config.js';
3
- import { RouteConfigMap } from '../../types/config/RouteConfigMap.js';
4
- import { OpenApi } from '../../OpenApi.js';
5
- import { AnyConfig } from '../../types/config/AnyConfig.js';
6
- import { OpenApiConstructor } from './types/OpenApiConstructor.js';
7
- import { OmitMappedField } from '../../types/config/OmitMappedField.js';
8
- import { RouteExtraPropsMap } from '../../types/config/RouteExtraPropsMap.js';
1
+ import { ErrorConfigMap } from '../../types/config/ErrorConfigMap';
2
+ import { Config } from '../../types/config/Config';
3
+ import { RouteConfigMap } from '../../types/config/RouteConfigMap';
4
+ import { OpenApi } from '../../OpenApi';
5
+ import { AnyConfig } from '../../types/config/AnyConfig';
6
+ import { OpenApiConstructor } from './types/OpenApiConstructor';
7
+ import { OmitMappedField } from '../../types/config/OmitMappedField';
8
+ import { RouteExtraPropsMap } from '../../types/config/RouteExtraPropsMap';
9
9
  import { ZodRawShape, ZodObject } from 'zod';
10
- import { RouteContextMap } from '../../types/config/RouteContextMap.js';
10
+ import { RouteContextMap } from '../../types/config/RouteContextMap';
11
11
  export declare class ConfigBuilder<TRouteTypes extends string, TErrorCodes extends string, TErrorConfigMap extends ErrorConfigMap<TErrorCodes>, TRouteParamMap extends RouteExtraPropsMap<TRouteTypes, ZodObject<ZodRawShape> | undefined>, TRouteContextMap extends RouteContextMap<TRouteTypes, TRouteParamMap>, TRouteConfigMap extends RouteConfigMap<TRouteTypes, TErrorCodes, TRouteParamMap, TRouteContextMap>, TConfig extends Config<TRouteTypes, TErrorCodes, TErrorConfigMap, TRouteParamMap, TRouteContextMap, TRouteConfigMap> = Config<TRouteTypes, TErrorCodes, TErrorConfigMap, TRouteParamMap, TRouteContextMap, TRouteConfigMap>> {
12
12
  protected x: Config<TRouteTypes, TErrorCodes, ErrorConfigMap<TErrorCodes>, RouteExtraPropsMap<TRouteTypes>, RouteContextMap<TRouteTypes, RouteExtraPropsMap<TRouteTypes>>, RouteConfigMap<TRouteTypes, TErrorCodes, RouteExtraPropsMap<TRouteTypes>, RouteContextMap<TRouteTypes, RouteExtraPropsMap<TRouteTypes>>>>;
13
13
  protected construct: OpenApiConstructor;
@@ -1,4 +1,4 @@
1
- import { DefaultConfig } from './types/DefaultConfig.js';
1
+ import { DefaultConfig } from './types/DefaultConfig';
2
2
  export class ConfigBuilder {
3
3
  x;
4
4
  construct;
@@ -0,0 +1,207 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { ErrorCode } from '../../enums/ErrorCode';
3
+ import z from 'zod';
4
+ import { OpenApi } from '../../OpenApi';
5
+ import { Method } from '../../enums/Methods';
6
+ import { SampleRouteType } from '../../enums/SampleRouteType';
7
+ import { TestUtils } from '../TestUtils/TestUtils';
8
+ describe('ConfigBuilder', () => {
9
+ let MyRouteTypes;
10
+ (function (MyRouteTypes) {
11
+ MyRouteTypes["Public"] = "Public";
12
+ MyRouteTypes["User"] = "User";
13
+ })(MyRouteTypes || (MyRouteTypes = {}));
14
+ test('Can be created without config', async () => {
15
+ const defaultApi = OpenApi.builder.create();
16
+ const route = defaultApi.factory.createRoute({
17
+ type: SampleRouteType.Public,
18
+ method: Method.GET,
19
+ path: '/route',
20
+ description: 'Test route',
21
+ validators: {
22
+ response: z.string().openapi({ description: 'Test response' }),
23
+ },
24
+ handler: () => Promise.resolve('success'),
25
+ });
26
+ defaultApi.addRoute(route);
27
+ const req = TestUtils.createRequest('/api/something');
28
+ const res = await defaultApi.processRootRoute(req);
29
+ expect(res.body, 'Should throw error since no route is present').toEqual({
30
+ error: ErrorCode.NotFound,
31
+ });
32
+ const req2 = TestUtils.createRequest('/api/route');
33
+ const res2 = await defaultApi.processRootRoute(req2);
34
+ expect(res2.body, 'Should be able to respond correctly').toEqual('success');
35
+ });
36
+ test('Can be created with only configuring globals', async () => {
37
+ const defaultApi = OpenApi.builder.defineGlobalConfig({
38
+ basePath: '/non-default-placement',
39
+ }).create();
40
+ const route = defaultApi.factory.createRoute({
41
+ type: SampleRouteType.Public,
42
+ method: Method.GET,
43
+ path: '/route',
44
+ description: 'Test route',
45
+ validators: {
46
+ response: z.string().openapi({ description: 'Test response' }),
47
+ },
48
+ handler: () => Promise.resolve('success'),
49
+ });
50
+ defaultApi.addRoute(route);
51
+ const req = TestUtils.createRequest('/api/route');
52
+ const res = await defaultApi.processRootRoute(req);
53
+ expect(res.body, 'Should have bad response on default base path').toEqual({
54
+ error: ErrorCode.NotFound,
55
+ });
56
+ const req2 = TestUtils.createRequest('/non-default-placement/route');
57
+ const res2 = await defaultApi.processRootRoute(req2);
58
+ expect(res2.body, 'Should be able to respond on custom base path').toEqual('success');
59
+ });
60
+ test('Works Well with inferred config', async () => {
61
+ const api3 = OpenApi.builder.customizeErrors(ErrorCode).defineErrors({
62
+ [ErrorCode.UnknownError]: {
63
+ status: '500',
64
+ description: 'Unkwown Error',
65
+ responseValidator: z.object({
66
+ error: z.object({
67
+ code: z.literal(ErrorCode.UnknownError),
68
+ }),
69
+ }),
70
+ },
71
+ [ErrorCode.ValidationFailed]: {
72
+ status: '400',
73
+ description: 'Validation Failed',
74
+ responseValidator: z.object({
75
+ error: z.object({
76
+ code: z.literal(ErrorCode.ValidationFailed),
77
+ }),
78
+ }),
79
+ },
80
+ [ErrorCode.NotFound]: {
81
+ status: '404',
82
+ description: 'Route Not Found',
83
+ responseValidator: z.object({
84
+ error: z.object({
85
+ code: z.literal(ErrorCode.NotFound),
86
+ }),
87
+ }),
88
+ },
89
+ }).defineDefaultError({
90
+ code: ErrorCode.UnknownError,
91
+ body: { error: { code: ErrorCode.UnknownError } },
92
+ }).customizeRoutes(SampleRouteType).defineRouteExtraProps({
93
+ [SampleRouteType.Public]: z.object({ routeParam: z.string() }),
94
+ }).defineRouteContexts({
95
+ [SampleRouteType.Public]: (ctx) => Promise.resolve({ contextParam: ctx.route.routeParam }),
96
+ }).defineRoutes({
97
+ [SampleRouteType.Public]: {
98
+ authorization: false,
99
+ errors: {
100
+ ValidationFailed: true,
101
+ },
102
+ },
103
+ }).defineGlobalConfig({
104
+ basePath: '/api',
105
+ skipDescriptionsCheck: true,
106
+ handleError: () => {
107
+ throw new Error('Function not implemented.');
108
+ },
109
+ }).create();
110
+ const route = api3.factory.createRoute({
111
+ type: SampleRouteType.Public,
112
+ method: Method.GET,
113
+ path: '/test',
114
+ description: 'Test Route',
115
+ validators: {
116
+ response: z.string(),
117
+ },
118
+ handler: (ctx) => Promise.resolve(ctx.contextParam),
119
+ routeParam: 'myRouteParam',
120
+ });
121
+ api3.addRoutes('/', [route]);
122
+ const req = TestUtils.createRequest('/api/test', Method.GET);
123
+ const res = await api3.processRootRoute(req);
124
+ expect(res.status).toBe(200);
125
+ expect(res.body).toBe('myRouteParam');
126
+ });
127
+ test('Works Well with class-based config', async () => {
128
+ const userRouteExtraPropsvalidator = z.object({
129
+ permission: z.string(),
130
+ });
131
+ class AppErrorConfig {
132
+ [ErrorCode.UnknownError] = {
133
+ status: '500',
134
+ description: 'Unkwown Error',
135
+ responseValidator: z.object({
136
+ error: z.object({
137
+ code: z.literal(ErrorCode.UnknownError),
138
+ }),
139
+ }),
140
+ };
141
+ [ErrorCode.ValidationFailed] = {
142
+ status: '400',
143
+ description: 'Validation Failed',
144
+ responseValidator: z.object({
145
+ error: z.object({
146
+ code: z.literal(ErrorCode.ValidationFailed),
147
+ }),
148
+ }),
149
+ };
150
+ [ErrorCode.NotFound] = {
151
+ status: '404',
152
+ description: 'Route Not Found',
153
+ responseValidator: z.object({
154
+ error: z.object({
155
+ code: z.literal(ErrorCode.NotFound),
156
+ }),
157
+ }),
158
+ };
159
+ }
160
+ class AppRouteConfig {
161
+ Public = {
162
+ authorization: false,
163
+ extraProps: undefined,
164
+ contextFactory: async () => (undefined),
165
+ };
166
+ User = {
167
+ authorization: false,
168
+ contextFactory: async (ctx) => ({ permission: ctx.route.permission }),
169
+ extraProps: userRouteExtraPropsvalidator,
170
+ };
171
+ }
172
+ class AppConfig {
173
+ basePath = '/api';
174
+ routes = new AppRouteConfig();
175
+ errors = new AppErrorConfig();
176
+ defaultError = {
177
+ code: ErrorCode.UnknownError,
178
+ body: {
179
+ error: {
180
+ code: ErrorCode.UnknownError,
181
+ },
182
+ },
183
+ };
184
+ handleError() {
185
+ return this.defaultError;
186
+ }
187
+ ;
188
+ }
189
+ const api = OpenApi.builder.create(MyRouteTypes, ErrorCode, new AppConfig());
190
+ const route = api.factory.createRoute({
191
+ type: MyRouteTypes.User,
192
+ method: Method.GET,
193
+ path: '/',
194
+ description: 'Test route',
195
+ validators: {
196
+ response: z.string().openapi({ description: 'Test response' }),
197
+ },
198
+ handler: (ctx) => Promise.resolve(ctx.permission),
199
+ permission: 'My Test Permission',
200
+ });
201
+ api.addRoutes('/', [route]);
202
+ const req = TestUtils.createRequest('/api', Method.GET);
203
+ const res = await api.processRootRoute(req);
204
+ expect(res.status).toBe(200);
205
+ expect(res.body).toBe('My Test Permission');
206
+ });
207
+ });
@@ -1,12 +1,12 @@
1
- import { ErrorCode } from '../../../enums/ErrorCode.js';
2
- import { SampleRouteType } from '../../../enums/SampleRouteType.js';
3
- import { Config } from '../../../types/config/Config.js';
4
- import { ErrorResponse } from '../../../types/config/ErrorResponse.js';
5
- import { RoutePath } from '../../../types/RoutePath.js';
6
- import { DefaultErrorMap } from './DefaultErrorMap.js';
7
- import { DefaultRouteContextMap } from './DefaultRouteContextMap.js';
8
- import { DefaultRouteMap } from './DefaultRouteMap.js';
9
- import { DefaultRouteParamsMap } from './DefaultRouteParamsMap.js';
1
+ import { ErrorCode } from '../../../enums/ErrorCode';
2
+ import { SampleRouteType } from '../../../enums/SampleRouteType';
3
+ import { Config } from '../../../types/config/Config';
4
+ import { ErrorResponse } from '../../../types/config/ErrorResponse';
5
+ import { RoutePath } from '../../../types/RoutePath';
6
+ import { DefaultErrorMap } from './DefaultErrorMap';
7
+ import { DefaultRouteContextMap } from './DefaultRouteContextMap';
8
+ import { DefaultRouteMap } from './DefaultRouteMap';
9
+ import { DefaultRouteParamsMap } from './DefaultRouteParamsMap';
10
10
  export declare class DefaultConfig implements Config<SampleRouteType, ErrorCode, DefaultErrorMap, DefaultRouteParamsMap, DefaultRouteContextMap, DefaultRouteMap> {
11
11
  basePath: RoutePath;
12
12
  routes: DefaultRouteMap;
@@ -1,9 +1,9 @@
1
- import { ErrorCode } from '../../../enums/ErrorCode.js';
2
- import { ValidationLocation } from '../../../enums/ValidationLocations.js';
3
- import { BuiltInError } from '../../../types/errors/BuiltInError.js';
4
- import { ValidationError } from '../../../types/errors/ValidationError.js';
5
- import { DefaultErrorMap } from './DefaultErrorMap.js';
6
- import { DefaultRouteMap } from './DefaultRouteMap.js';
1
+ import { ErrorCode } from '../../../enums/ErrorCode';
2
+ import { ValidationLocation } from '../../../enums/ValidationLocations';
3
+ import { BuiltInError } from '../../../types/errors/BuiltInError';
4
+ import { ValidationError } from '../../../types/errors/ValidationError';
5
+ import { DefaultErrorMap } from './DefaultErrorMap';
6
+ import { DefaultRouteMap } from './DefaultRouteMap';
7
7
  export class DefaultConfig {
8
8
  basePath = '/api';
9
9
  routes = new DefaultRouteMap();
@@ -0,0 +1,82 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import z from 'zod';
3
+ import { OpenApi } from '../../../OpenApi';
4
+ import { ErrorCode } from '../../../enums/ErrorCode';
5
+ import { Method } from '../../../enums/Methods';
6
+ import { SampleRouteType } from '../../../enums/SampleRouteType';
7
+ import { TestUtils } from '../../TestUtils/TestUtils';
8
+ describe('DefaultConfig', () => {
9
+ describe('Error handler', () => {
10
+ test('Default Config checks', async () => {
11
+ const defaultApi = OpenApi.builder.create();
12
+ expect(defaultApi.getConfig().skipDescriptionsCheck, 'By default we check validator descriptions').toBe(false);
13
+ });
14
+ test('Returns not found error on unkown route', async () => {
15
+ const defaultApi = OpenApi.builder.create();
16
+ const req = TestUtils.createRequest('/api/route');
17
+ const res = await defaultApi.processRootRoute(req);
18
+ expect(res.body, 'Should throw error since no route is present').toEqual({
19
+ error: ErrorCode.NotFound,
20
+ });
21
+ expect(res.status, 'Should status 404 for not found error').toEqual(404);
22
+ });
23
+ test('Returns unknown error on random error', async () => {
24
+ const defaultApi = OpenApi.builder.create();
25
+ const route = defaultApi.factory.createRoute({
26
+ type: SampleRouteType.Public,
27
+ method: Method.GET,
28
+ path: '/route',
29
+ description: 'Test route',
30
+ validators: {
31
+ response: z.string().openapi({ description: 'Test response' }),
32
+ },
33
+ handler: async () => {
34
+ throw new Error('dasdsaa');
35
+ },
36
+ });
37
+ defaultApi.addRoute(route);
38
+ const req = TestUtils.createRequest('/api/route');
39
+ const res = await defaultApi.processRootRoute(req);
40
+ expect(res.body, 'Should return unknown error if error happens').toEqual({
41
+ error: ErrorCode.UnknownError,
42
+ });
43
+ expect(res.status, 'Should status 500 for unknown error').toEqual(500);
44
+ });
45
+ test('Returns validation error on invalid params', async () => {
46
+ const defaultApi = OpenApi.builder.create();
47
+ const route = defaultApi.factory.createRoute({
48
+ type: SampleRouteType.Public,
49
+ method: Method.POST,
50
+ path: '/route',
51
+ description: 'Test route',
52
+ validators: {
53
+ body: z.object({
54
+ name: z.string().openapi({ description: 'Name' }),
55
+ }),
56
+ response: z.string().openapi({ description: 'Test response' }),
57
+ },
58
+ handler: async () => Promise.resolve('success'),
59
+ });
60
+ defaultApi.addRoute(route);
61
+ const happyReq = TestUtils.createRequest('/api/route', Method.POST, { name: 'king' });
62
+ const happyRes = await defaultApi.processRootRoute(happyReq);
63
+ expect(happyRes.body, 'Should return normal response if body is valid').toBe('success');
64
+ expect(happyRes.status, 'Should return status 200 on normal response').toBe(200);
65
+ const req = TestUtils.createRequest('/api/route', Method.POST);
66
+ const res = await defaultApi.processRootRoute(req);
67
+ expect(res.body, 'Should return unknown error if error happens').toEqual({
68
+ error: {
69
+ code: ErrorCode.ValidationFailed,
70
+ fieldErrors: [
71
+ {
72
+ field: 'name',
73
+ message: 'Required',
74
+ },
75
+ ],
76
+ location: 'Body',
77
+ },
78
+ });
79
+ expect(res.status, 'Should return status 400 on validation error').toEqual(400);
80
+ });
81
+ });
82
+ });
@@ -1,5 +1,5 @@
1
- import { ErrorCode } from '../../../enums/ErrorCode.js';
2
- import { ErrorConfigMap } from '../../../types/config/ErrorConfigMap.js';
1
+ import { ErrorCode } from '../../../enums/ErrorCode';
2
+ import { ErrorConfigMap } from '../../../types/config/ErrorConfigMap';
3
3
  export declare class DefaultErrorMap implements ErrorConfigMap<ErrorCode> {
4
4
  [ErrorCode.UnknownError]: {
5
5
  readonly status: "500";
@@ -47,7 +47,7 @@ export declare class DefaultErrorMap implements ErrorConfigMap<ErrorCode> {
47
47
  field: string;
48
48
  }[] | undefined;
49
49
  }>, "many">;
50
- location: import("zod").ZodNativeEnum<typeof import("../../../index.js").OpenApiValidationLocation>;
50
+ location: import("zod").ZodNativeEnum<typeof import("../../..").OpenApiValidationLocation>;
51
51
  }, "strip", import("zod").ZodTypeAny, {
52
52
  code: ErrorCode.ValidationFailed;
53
53
  fieldErrors: {
@@ -58,7 +58,7 @@ export declare class DefaultErrorMap implements ErrorConfigMap<ErrorCode> {
58
58
  field: string;
59
59
  }[] | undefined;
60
60
  }[];
61
- location: import("../../../index.js").OpenApiValidationLocation;
61
+ location: import("../../..").OpenApiValidationLocation;
62
62
  }, {
63
63
  code: ErrorCode.ValidationFailed;
64
64
  fieldErrors: {
@@ -69,7 +69,7 @@ export declare class DefaultErrorMap implements ErrorConfigMap<ErrorCode> {
69
69
  field: string;
70
70
  }[] | undefined;
71
71
  }[];
72
- location: import("../../../index.js").OpenApiValidationLocation;
72
+ location: import("../../..").OpenApiValidationLocation;
73
73
  }>;
74
74
  }, "strip", import("zod").ZodTypeAny, {
75
75
  error: {
@@ -82,7 +82,7 @@ export declare class DefaultErrorMap implements ErrorConfigMap<ErrorCode> {
82
82
  field: string;
83
83
  }[] | undefined;
84
84
  }[];
85
- location: import("../../../index.js").OpenApiValidationLocation;
85
+ location: import("../../..").OpenApiValidationLocation;
86
86
  };
87
87
  }, {
88
88
  error: {
@@ -95,7 +95,7 @@ export declare class DefaultErrorMap implements ErrorConfigMap<ErrorCode> {
95
95
  field: string;
96
96
  }[] | undefined;
97
97
  }[];
98
- location: import("../../../index.js").OpenApiValidationLocation;
98
+ location: import("../../..").OpenApiValidationLocation;
99
99
  };
100
100
  }>;
101
101
  };
@@ -1,7 +1,7 @@
1
- import { ErrorCode } from '../../../enums/ErrorCode.js';
2
- import { unknownErrorResponseValidator } from '../../../types/errors/responses/UnknownErrorResponse.js';
3
- import { validationErrorResponseValidator } from '../../../types/errors/responses/ValidationErrorResponse.js';
4
- import { notFoundErrorResponseValidator } from '../../../types/errors/responses/NotFoundErrorResponse.js';
1
+ import { ErrorCode } from '../../../enums/ErrorCode';
2
+ import { unknownErrorResponseValidator } from '../../../types/errors/responses/UnknownErrorResponse';
3
+ import { validationErrorResponseValidator } from '../../../types/errors/responses/ValidationErrorResponse';
4
+ import { notFoundErrorResponseValidator } from '../../../types/errors/responses/NotFoundErrorResponse';
5
5
  export class DefaultErrorMap {
6
6
  [ErrorCode.UnknownError] = {
7
7
  status: '500',
@@ -1,6 +1,6 @@
1
- import { SampleRouteType } from '../../../enums/SampleRouteType.js';
2
- import { RouteContextMap } from '../../../types/config/RouteContextMap.js';
3
- import { DefaultRouteParamsMap } from './DefaultRouteParamsMap.js';
1
+ import { SampleRouteType } from '../../../enums/SampleRouteType';
2
+ import { RouteContextMap } from '../../../types/config/RouteContextMap';
3
+ import { DefaultRouteParamsMap } from './DefaultRouteParamsMap';
4
4
  export declare class DefaultRouteContextMap implements RouteContextMap<SampleRouteType, DefaultRouteParamsMap> {
5
5
  Public: () => Promise<{}>;
6
6
  }
@@ -1,8 +1,8 @@
1
- import { SampleRouteType } from '../../../enums/SampleRouteType.js';
2
- import { RouteConfigMap } from '../../../types/config/RouteConfigMap.js';
3
- import { ErrorCode } from '../../../enums/ErrorCode.js';
4
- import { DefaultRouteContextMap } from './DefaultRouteContextMap.js';
5
- import { DefaultRouteParamsMap } from './DefaultRouteParamsMap.js';
1
+ import { SampleRouteType } from '../../../enums/SampleRouteType';
2
+ import { RouteConfigMap } from '../../../types/config/RouteConfigMap';
3
+ import { ErrorCode } from '../../../enums/ErrorCode';
4
+ import { DefaultRouteContextMap } from './DefaultRouteContextMap';
5
+ import { DefaultRouteParamsMap } from './DefaultRouteParamsMap';
6
6
  export declare class DefaultRouteMap implements RouteConfigMap<SampleRouteType, ErrorCode, DefaultRouteParamsMap, DefaultRouteContextMap> {
7
7
  Public: {
8
8
  readonly authorization: false;
@@ -1,5 +1,5 @@
1
- import { DefaultRouteContextMap } from './DefaultRouteContextMap.js';
2
- import { DefaultRouteParamsMap } from './DefaultRouteParamsMap.js';
1
+ import { DefaultRouteContextMap } from './DefaultRouteContextMap';
2
+ import { DefaultRouteParamsMap } from './DefaultRouteParamsMap';
3
3
  export class DefaultRouteMap {
4
4
  Public = {
5
5
  authorization: false,
@@ -1,5 +1,5 @@
1
- import { SampleRouteType } from '../../../enums/SampleRouteType.js';
2
- import { RouteExtraPropsMap } from '../../../types/config/RouteExtraPropsMap.js';
1
+ import { SampleRouteType } from '../../../enums/SampleRouteType';
2
+ import { RouteExtraPropsMap } from '../../../types/config/RouteExtraPropsMap';
3
3
  export declare class DefaultRouteParamsMap implements RouteExtraPropsMap<SampleRouteType> {
4
4
  Public: undefined;
5
5
  }
@@ -1,2 +1,2 @@
1
- import { OpenApi } from '../../../OpenApi.js';
1
+ import { OpenApi } from '../../../OpenApi';
2
2
  export type OpenApiConstructor = (conf: any) => OpenApi<any, any, any>;
@@ -1,6 +1,6 @@
1
1
  import { ZodTypeAny, ZodRawShape } from 'zod';
2
- import { AnyRoute } from '../../types/AnyRoute.js';
3
- import { ValidationUtils } from '../ValidationUtils/ValidationUtils.js';
2
+ import { AnyRoute } from '../../types/AnyRoute';
3
+ import { ValidationUtils } from '../ValidationUtils/ValidationUtils';
4
4
  interface DescriptionCheckerConfig {
5
5
  checkValidators: boolean;
6
6
  }
@@ -1,5 +1,5 @@
1
1
  import z from 'zod';
2
- import { ValidationUtils } from '../ValidationUtils/ValidationUtils.js';
2
+ import { ValidationUtils } from '../ValidationUtils/ValidationUtils';
3
3
  export class DescriptionChecker {
4
4
  utils = new ValidationUtils();
5
5
  config;