snap-on-openapi 1.0.1

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 (131) hide show
  1. package/README.md +643 -0
  2. package/dist/OpenApi.d.ts +58 -0
  3. package/dist/OpenApi.js +272 -0
  4. package/dist/README.md +643 -0
  5. package/dist/assets/stoplight.html +27 -0
  6. package/dist/assets/swagger.html +892 -0
  7. package/dist/enums/ErrorCode.d.ts +5 -0
  8. package/dist/enums/ErrorCode.js +6 -0
  9. package/dist/enums/Methods.d.ts +7 -0
  10. package/dist/enums/Methods.js +8 -0
  11. package/dist/enums/SampleRouteType.d.ts +3 -0
  12. package/dist/enums/SampleRouteType.js +4 -0
  13. package/dist/enums/ValidationLocations.d.ts +6 -0
  14. package/dist/enums/ValidationLocations.js +7 -0
  15. package/dist/index.d.ts +39 -0
  16. package/dist/index.js +23 -0
  17. package/dist/services/ClientGenerator/ClientGenerator.d.ts +9 -0
  18. package/dist/services/ClientGenerator/ClientGenerator.js +48 -0
  19. package/dist/services/ConfigBuilder/ConfigBuilder.d.ts +31 -0
  20. package/dist/services/ConfigBuilder/ConfigBuilder.js +65 -0
  21. package/dist/services/ConfigBuilder/types/DefaultConfig.d.ts +22 -0
  22. package/dist/services/ConfigBuilder/types/DefaultConfig.js +47 -0
  23. package/dist/services/ConfigBuilder/types/DefaultErrorMap.d.ts +113 -0
  24. package/dist/services/ConfigBuilder/types/DefaultErrorMap.js +21 -0
  25. package/dist/services/ConfigBuilder/types/DefaultRouteContextMap.d.ts +6 -0
  26. package/dist/services/ConfigBuilder/types/DefaultRouteContextMap.js +3 -0
  27. package/dist/services/ConfigBuilder/types/DefaultRouteMap.d.ts +12 -0
  28. package/dist/services/ConfigBuilder/types/DefaultRouteMap.js +9 -0
  29. package/dist/services/ConfigBuilder/types/DefaultRouteParamsMap.d.ts +5 -0
  30. package/dist/services/ConfigBuilder/types/DefaultRouteParamsMap.js +3 -0
  31. package/dist/services/ConfigBuilder/types/OpenApiConstructor.d.ts +2 -0
  32. package/dist/services/ConfigBuilder/types/OpenApiConstructor.js +1 -0
  33. package/dist/services/DescriptionChecker/DescriptionChecker.d.ts +16 -0
  34. package/dist/services/DescriptionChecker/DescriptionChecker.js +47 -0
  35. package/dist/services/DevelopmentUtils/DevelopmentUtils.d.ts +4 -0
  36. package/dist/services/DevelopmentUtils/DevelopmentUtils.js +15 -0
  37. package/dist/services/ExpressWrapper/ExpressWrapper.d.ts +15 -0
  38. package/dist/services/ExpressWrapper/ExpressWrapper.js +68 -0
  39. package/dist/services/ExpressWrapper/types/ExpressApp.d.ts +8 -0
  40. package/dist/services/ExpressWrapper/types/ExpressApp.js +1 -0
  41. package/dist/services/ExpressWrapper/types/ExpressHandler.d.ts +3 -0
  42. package/dist/services/ExpressWrapper/types/ExpressHandler.js +1 -0
  43. package/dist/services/ExpressWrapper/types/ExpressRequest.d.ts +8 -0
  44. package/dist/services/ExpressWrapper/types/ExpressRequest.js +1 -0
  45. package/dist/services/ExpressWrapper/types/ExpressResponse.d.ts +6 -0
  46. package/dist/services/ExpressWrapper/types/ExpressResponse.js +1 -0
  47. package/dist/services/Logger/Logger.d.ts +15 -0
  48. package/dist/services/Logger/Logger.js +100 -0
  49. package/dist/services/Logger/types/LogLevel.d.ts +6 -0
  50. package/dist/services/Logger/types/LogLevel.js +7 -0
  51. package/dist/services/RoutingFactory/RoutingFactory.d.ts +10 -0
  52. package/dist/services/RoutingFactory/RoutingFactory.js +23 -0
  53. package/dist/services/SchemaGenerator/SchemaGenerator.d.ts +19 -0
  54. package/dist/services/SchemaGenerator/SchemaGenerator.js +131 -0
  55. package/dist/services/TanstackStartWrapper/TanstackStartWrapper.d.ts +35 -0
  56. package/dist/services/TanstackStartWrapper/TanstackStartWrapper.js +67 -0
  57. package/dist/services/TestUtils/TestUtils.d.ts +13 -0
  58. package/dist/services/TestUtils/TestUtils.js +48 -0
  59. package/dist/services/ValidationUtils/ValidationUtils.d.ts +56 -0
  60. package/dist/services/ValidationUtils/ValidationUtils.js +38 -0
  61. package/dist/services/ValidationUtils/transformers/stringBooleanTransformer.d.ts +3 -0
  62. package/dist/services/ValidationUtils/transformers/stringBooleanTransformer.js +5 -0
  63. package/dist/services/ValidationUtils/transformers/stringDateTransformer.d.ts +3 -0
  64. package/dist/services/ValidationUtils/transformers/stringDateTransformer.js +16 -0
  65. package/dist/services/ValidationUtils/transformers/stringNumberTransfromer.d.ts +3 -0
  66. package/dist/services/ValidationUtils/transformers/stringNumberTransfromer.js +24 -0
  67. package/dist/services/ValidationUtils/types/PaginatedResponse.d.ts +8 -0
  68. package/dist/services/ValidationUtils/types/PaginatedResponse.js +1 -0
  69. package/dist/types/AnyRoute.d.ts +3 -0
  70. package/dist/types/AnyRoute.js +1 -0
  71. package/dist/types/InitialBuilder.d.ts +9 -0
  72. package/dist/types/InitialBuilder.js +1 -0
  73. package/dist/types/NonEmptyArray.d.ts +1 -0
  74. package/dist/types/NonEmptyArray.js +1 -0
  75. package/dist/types/Route.d.ts +22 -0
  76. package/dist/types/Route.js +1 -0
  77. package/dist/types/RouteMap.d.ts +3 -0
  78. package/dist/types/RouteMap.js +1 -0
  79. package/dist/types/RoutePath.d.ts +1 -0
  80. package/dist/types/RoutePath.js +1 -0
  81. package/dist/types/Wrappers.d.ts +7 -0
  82. package/dist/types/Wrappers.js +1 -0
  83. package/dist/types/config/AnyConfig.d.ts +4 -0
  84. package/dist/types/config/AnyConfig.js +1 -0
  85. package/dist/types/config/AnyRouteConfigMap.d.ts +4 -0
  86. package/dist/types/config/AnyRouteConfigMap.js +1 -0
  87. package/dist/types/config/Config.d.ts +19 -0
  88. package/dist/types/config/Config.js +1 -0
  89. package/dist/types/config/ContextParams.d.ts +12 -0
  90. package/dist/types/config/ContextParams.js +1 -0
  91. package/dist/types/config/ErrorConfig.d.ts +6 -0
  92. package/dist/types/config/ErrorConfig.js +1 -0
  93. package/dist/types/config/ErrorConfigMap.d.ts +5 -0
  94. package/dist/types/config/ErrorConfigMap.js +1 -0
  95. package/dist/types/config/ErrorResponse.d.ts +8 -0
  96. package/dist/types/config/ErrorResponse.js +1 -0
  97. package/dist/types/config/ISpecificationExtension.d.ts +6 -0
  98. package/dist/types/config/ISpecificationExtension.js +1 -0
  99. package/dist/types/config/Info.d.ts +7 -0
  100. package/dist/types/config/Info.js +1 -0
  101. package/dist/types/config/OmitMappedField.d.ts +3 -0
  102. package/dist/types/config/OmitMappedField.js +1 -0
  103. package/dist/types/config/RouteConfig.d.ts +10 -0
  104. package/dist/types/config/RouteConfig.js +1 -0
  105. package/dist/types/config/RouteConfigMap.d.ts +7 -0
  106. package/dist/types/config/RouteConfigMap.js +1 -0
  107. package/dist/types/config/RouteContextMap.d.ts +6 -0
  108. package/dist/types/config/RouteContextMap.js +1 -0
  109. package/dist/types/config/RouteExtraProps.d.ts +2 -0
  110. package/dist/types/config/RouteExtraProps.js +1 -0
  111. package/dist/types/config/RouteExtraPropsMap.d.ts +4 -0
  112. package/dist/types/config/RouteExtraPropsMap.js +1 -0
  113. package/dist/types/config/Server.d.ts +5 -0
  114. package/dist/types/config/Server.js +1 -0
  115. package/dist/types/errors/ApiError.d.ts +5 -0
  116. package/dist/types/errors/ApiError.js +10 -0
  117. package/dist/types/errors/BuiltInError.d.ts +4 -0
  118. package/dist/types/errors/BuiltInError.js +3 -0
  119. package/dist/types/errors/FieldError.d.ts +33 -0
  120. package/dist/types/errors/FieldError.js +9 -0
  121. package/dist/types/errors/ValidationError.d.ts +10 -0
  122. package/dist/types/errors/ValidationError.js +17 -0
  123. package/dist/types/errors/responses/NotFoundErrorResponse.d.ts +12 -0
  124. package/dist/types/errors/responses/NotFoundErrorResponse.js +6 -0
  125. package/dist/types/errors/responses/UnknownErrorResponse.d.ts +12 -0
  126. package/dist/types/errors/responses/UnknownErrorResponse.js +6 -0
  127. package/dist/types/errors/responses/ValidationErrorResponse.d.ts +89 -0
  128. package/dist/types/errors/responses/ValidationErrorResponse.js +12 -0
  129. package/dist/vitest.config.d.ts +2 -0
  130. package/dist/vitest.config.js +25 -0
  131. package/package.json +53 -0
@@ -0,0 +1,56 @@
1
+ import 'zod-openapi/extend';
2
+ import { ZodObject, ZodRawShape, ZodType } from 'zod';
3
+ export declare class ValidationUtils {
4
+ readonly strings: {
5
+ datetime: import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, Date, string>;
6
+ number: import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, number, string>;
7
+ boolean: import("zod").ZodEffects<import("zod").ZodEnum<["true", "false"]>, boolean, "true" | "false">;
8
+ };
9
+ describeShape<TShape extends ZodRawShape>(val: ZodObject<TShape>, descriptions: Record<keyof TShape, string>): ZodObject<TShape>;
10
+ paginatedQuery<X extends ZodRawShape>(filter: X): ZodObject<import("zod").objectUtil.extendShape<{
11
+ page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
12
+ pageSize: import("zod").ZodOptional<import("zod").ZodNumber>;
13
+ }, X>, "strip", import("zod").ZodTypeAny, import("zod").objectUtil.addQuestionMarks<import("zod").baseObjectOutputType<import("zod").objectUtil.extendShape<{
14
+ page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
15
+ pageSize: import("zod").ZodOptional<import("zod").ZodNumber>;
16
+ }, X>>, any> extends infer T ? { [k in keyof T]: import("zod").objectUtil.addQuestionMarks<import("zod").baseObjectOutputType<import("zod").objectUtil.extendShape<{
17
+ page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
18
+ pageSize: import("zod").ZodOptional<import("zod").ZodNumber>;
19
+ }, X>>, any>[k]; } : never, import("zod").baseObjectInputType<import("zod").objectUtil.extendShape<{
20
+ page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
21
+ pageSize: import("zod").ZodOptional<import("zod").ZodNumber>;
22
+ }, X>> extends infer T_1 ? { [k_1 in keyof T_1]: import("zod").baseObjectInputType<import("zod").objectUtil.extendShape<{
23
+ page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
24
+ pageSize: import("zod").ZodOptional<import("zod").ZodNumber>;
25
+ }, X>>[k_1]; } : never>;
26
+ paginatedResponse<T extends ZodType>(arr: T): ZodObject<{
27
+ items: import("zod").ZodArray<T, "many">;
28
+ info: ZodObject<{
29
+ count: import("zod").ZodNumber;
30
+ page: import("zod").ZodNumber;
31
+ pageSize: import("zod").ZodNumber;
32
+ }, "strip", import("zod").ZodTypeAny, {
33
+ page: number;
34
+ pageSize: number;
35
+ count: number;
36
+ }, {
37
+ page: number;
38
+ pageSize: number;
39
+ count: number;
40
+ }>;
41
+ }, "strip", import("zod").ZodTypeAny, {
42
+ info: {
43
+ page: number;
44
+ pageSize: number;
45
+ count: number;
46
+ };
47
+ items: T["_output"][];
48
+ }, {
49
+ info: {
50
+ page: number;
51
+ pageSize: number;
52
+ count: number;
53
+ };
54
+ items: T["_input"][];
55
+ }>;
56
+ }
@@ -0,0 +1,38 @@
1
+ import 'zod-openapi/extend';
2
+ import { array, number, object } from 'zod';
3
+ import { stringDateTransformer } from './transformers/stringDateTransformer.js';
4
+ import { stringNumberTransformer } from './transformers/stringNumberTransfromer.js';
5
+ import { stringBooleanTransformer } from './transformers/stringBooleanTransformer.js';
6
+ export class ValidationUtils {
7
+ strings = {
8
+ datetime: stringDateTransformer,
9
+ number: stringNumberTransformer,
10
+ boolean: stringBooleanTransformer,
11
+ };
12
+ describeShape(val, descriptions) {
13
+ const newShape = {};
14
+ for (const entry of Object.entries(val.shape)) {
15
+ newShape[entry[0]] = entry[1].openapi({ description: descriptions[entry[0]] });
16
+ }
17
+ return object(newShape);
18
+ }
19
+ paginatedQuery(filter) {
20
+ return object({
21
+ page: number().min(1).optional().default(1).openapi({ description: 'Page number' }),
22
+ pageSize: number().min(1).optional().openapi({
23
+ description: 'Number of items to display in the page.',
24
+ }),
25
+ }).extend(filter).openapi({ description: 'Pagination parameters' });
26
+ }
27
+ paginatedResponse(arr) {
28
+ return object({
29
+ items: array(arr).openapi({ description: 'Page or items' }),
30
+ info: object({
31
+ count: number().openapi({ description: 'Total number of items' }),
32
+ page: number().openapi({ description: 'Current page' }),
33
+ pageSize: number().openapi({ description: 'Number of itemss per page' }),
34
+ })
35
+ .openapi({ description: 'Pagination details' }),
36
+ });
37
+ }
38
+ }
@@ -0,0 +1,3 @@
1
+ import 'zod-openapi/extend';
2
+ import z from 'zod';
3
+ export declare const stringBooleanTransformer: z.ZodEffects<z.ZodEnum<["true", "false"]>, boolean, "true" | "false">;
@@ -0,0 +1,5 @@
1
+ import 'zod-openapi/extend';
2
+ import z from 'zod';
3
+ export const stringBooleanTransformer = z.enum(['true', 'false']).transform((val) => {
4
+ return val === 'true';
5
+ }).openapi({ type: 'boolean' });
@@ -0,0 +1,3 @@
1
+ import 'zod-openapi/extend';
2
+ import z from 'zod';
3
+ export declare const stringDateTransformer: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, Date, string>;
@@ -0,0 +1,16 @@
1
+ import 'zod-openapi/extend';
2
+ import z from 'zod';
3
+ export const stringDateTransformer = z.string().refine((input) => {
4
+ try {
5
+ const output = new Date(Date.parse(input));
6
+ const outputStr = output.toISOString().replace('T', ' ');
7
+ const inputStr = input.replace('T', ' ');
8
+ return inputStr === outputStr;
9
+ }
10
+ catch (e) {
11
+ return false;
12
+ }
13
+ }, 'Not a valid date string')
14
+ .transform((x) => {
15
+ return new Date(Date.parse(x));
16
+ }).openapi({ type: 'string', format: 'date-time' });
@@ -0,0 +1,3 @@
1
+ import 'zod-openapi/extend';
2
+ import z from 'zod';
3
+ export declare const stringNumberTransformer: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, number, string>;
@@ -0,0 +1,24 @@
1
+ import 'zod-openapi/extend';
2
+ import z from 'zod';
3
+ export const stringNumberTransformer = z.string().refine((input) => {
4
+ try {
5
+ if (input === '') {
6
+ return false;
7
+ }
8
+ const number = Number(input);
9
+ if (isNaN(number)) {
10
+ return false;
11
+ }
12
+ if (!isFinite(number)) {
13
+ return false;
14
+ }
15
+ return true;
16
+ }
17
+ catch (e) {
18
+ return false;
19
+ }
20
+ }, 'Not a valid number string')
21
+ .transform((x) => {
22
+ return Number(x);
23
+ }).openapi({ type: 'number' });
24
+ ;
@@ -0,0 +1,8 @@
1
+ export interface PaginatedResponse<T> {
2
+ items: T[];
3
+ info: {
4
+ count: number;
5
+ page: number;
6
+ pageSize: number;
7
+ };
8
+ }
@@ -0,0 +1,3 @@
1
+ import { ZodObject, ZodRawShape, ZodFirstPartySchemaTypes } from 'zod';
2
+ import { Route } from './Route.js';
3
+ export type AnyRoute<TRouteType extends string> = Route<TRouteType, any, ZodFirstPartySchemaTypes, ZodObject<ZodRawShape> | undefined, ZodObject<ZodRawShape> | undefined, ZodObject<ZodRawShape> | undefined>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import { ErrorCode } from '../enums/ErrorCode.js';
2
+ import { SampleRouteType } from '../enums/SampleRouteType.js';
3
+ import { ConfigBuilder } from '../services/ConfigBuilder/ConfigBuilder.js';
4
+ import { DefaultConfig } from '../services/ConfigBuilder/types/DefaultConfig.js';
5
+ import { DefaultErrorMap } from '../services/ConfigBuilder/types/DefaultErrorMap.js';
6
+ import { DefaultRouteContextMap } from '../services/ConfigBuilder/types/DefaultRouteContextMap.js';
7
+ import { DefaultRouteMap } from '../services/ConfigBuilder/types/DefaultRouteMap.js';
8
+ import { DefaultRouteParamsMap } from '../services/ConfigBuilder/types/DefaultRouteParamsMap.js';
9
+ export type InitialBuilder = Pick<ConfigBuilder<SampleRouteType, ErrorCode, DefaultErrorMap, DefaultRouteParamsMap, DefaultRouteContextMap, DefaultRouteMap, DefaultConfig>, 'customizeErrors' | 'create' | 'defineGlobalConfig' | 'customizeRoutes'>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export type NonEmptyArray<T> = [T, ...T[]];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import { z, ZodFirstPartySchemaTypes, ZodObject, ZodRawShape } from 'zod';
2
+ import { Method } from '../enums/Methods.js';
3
+ import { RoutePath } from './RoutePath.js';
4
+ export interface Route<TType extends string, TContext extends object, TResponseValidator extends ZodFirstPartySchemaTypes, TPathValidator extends ZodObject<ZodRawShape> | undefined, TQueryValidator extends ZodObject<ZodRawShape> | undefined, TBodyValidator extends ZodObject<ZodRawShape> | undefined, TMethod extends Method = Method> {
5
+ type: TType;
6
+ method: TMethod;
7
+ path: RoutePath;
8
+ description: string;
9
+ validators: {
10
+ query?: TQueryValidator;
11
+ path?: TPathValidator;
12
+ body?: TMethod extends 'GET' ? never : TBodyValidator;
13
+ response: TResponseValidator;
14
+ };
15
+ handler: (context: {
16
+ params: {
17
+ body: TBodyValidator extends ZodObject<ZodRawShape> ? z.infer<TBodyValidator> : object;
18
+ query: TQueryValidator extends ZodObject<ZodRawShape> ? z.infer<TQueryValidator> : object;
19
+ path: TPathValidator extends ZodObject<ZodRawShape> ? z.infer<TPathValidator> : object;
20
+ };
21
+ } & TContext) => Promise<z.infer<TResponseValidator>>;
22
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import { AnyRoute } from './AnyRoute.js';
2
+ import { RoutePath } from './RoutePath.js';
3
+ export type RouteMap<TRouteType extends string> = Record<RoutePath, AnyRoute<TRouteType>[]>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export type RoutePath = `/${string}` | '/';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { ExpressWrapper } from '../services/ExpressWrapper/ExpressWrapper.js';
2
+ import { TanstackStartWrapper } from '../services/TanstackStartWrapper/TanstackStartWrapper.js';
3
+ import { AnyConfig } from './config/AnyConfig.js';
4
+ export interface Wrappers<TRouteTypes extends string, TErrorCodes extends string, TConfig extends AnyConfig<TRouteTypes, TErrorCodes>> {
5
+ tanstackStart: TanstackStartWrapper<TRouteTypes, TErrorCodes, TConfig>;
6
+ express: ExpressWrapper<TRouteTypes, TErrorCodes, TConfig>;
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import { ErrorConfigMap } from './ErrorConfigMap.js';
2
+ import { Config } from './Config.js';
3
+ import { RouteConfigMap } from './RouteConfigMap.js';
4
+ export type AnyConfig<TRouteTypes extends string, TErrorCodes extends string> = Config<TRouteTypes, TErrorCodes, ErrorConfigMap<TErrorCodes>, any, any, RouteConfigMap<TRouteTypes, TErrorCodes, any, any>>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import { RouteConfig } from './RouteConfig.js';
2
+ export type AnyRouteConfigMap<TRouteTypes extends string, TErrorCodes extends string> = {
3
+ [key in TRouteTypes]: RouteConfig<key, TErrorCodes, any, any>;
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ import { LogLevel } from '../../services/Logger/types/LogLevel.js';
2
+ import { RoutePath } from '../RoutePath.js';
3
+ import { ErrorConfigMap } from './ErrorConfigMap.js';
4
+ import { ErrorResponse } from './ErrorResponse.js';
5
+ import { RouteConfigMap } from './RouteConfigMap.js';
6
+ import { RouteContextMap } from './RouteContextMap.js';
7
+ import { RouteExtraPropsMap } from './RouteExtraPropsMap.js';
8
+ import { Server } from './Server.js';
9
+ 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>> = {
10
+ basePath: RoutePath;
11
+ routes: TRouteConfigMap;
12
+ errors: TErrorConfigMap;
13
+ defaultError: ErrorResponse<TErrorCodes, TErrorConfigMap>;
14
+ skipDescriptionsCheck?: boolean;
15
+ apiName?: string;
16
+ servers?: Server[];
17
+ logLevel?: LogLevel;
18
+ handleError?: (e: unknown) => ErrorResponse<TErrorCodes, TErrorConfigMap>;
19
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { ZodObject, ZodRawShape } from 'zod';
2
+ import { AnyRoute } from '../AnyRoute.js';
3
+ import { RouteExtraProps } from './RouteExtraProps.js';
4
+ export type ContextParams<TRouteType extends string, TExtraProps extends ZodObject<ZodRawShape> | undefined> = {
5
+ route: AnyRoute<TRouteType> & RouteExtraProps<TExtraProps>;
6
+ request: Request;
7
+ params: {
8
+ body: unknown;
9
+ query: unknown;
10
+ path: unknown;
11
+ };
12
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import { ZodObject, ZodRawShape } from 'zod';
2
+ export type ErrorConfig<T extends ZodObject<ZodRawShape>> = {
3
+ status: `${1 | 2 | 3 | 4 | 5}${string}`;
4
+ description: string;
5
+ responseValidator: T;
6
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { ZodObject, ZodRawShape } from 'zod';
2
+ import { ErrorConfig } from './ErrorConfig.js';
3
+ export type ErrorConfigMap<TEnum extends string> = {
4
+ [key in TEnum]: ErrorConfig<ZodObject<ZodRawShape>>;
5
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import { TypeOf } from 'zod';
2
+ import { ErrorConfigMap } from './ErrorConfigMap.js';
3
+ export type ErrorResponse<TErrorCodes extends string, TErrorConfigMap extends ErrorConfigMap<TErrorCodes>> = {
4
+ [K in TErrorCodes]: {
5
+ code: K;
6
+ body: TypeOf<TErrorConfigMap[K]['responseValidator']>;
7
+ };
8
+ }[TErrorCodes];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ type IExtensionName = `x-${string}`;
2
+ type IExtensionType = any;
3
+ export type ISpecificationExtension = {
4
+ [extensionName: IExtensionName]: IExtensionType;
5
+ };
6
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { ISpecificationExtension } from './ISpecificationExtension.js';
2
+ export interface Info extends ISpecificationExtension {
3
+ title: string;
4
+ description?: string;
5
+ termsOfService?: string;
6
+ version: string;
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export type OmitMappedField<TMap extends Record<string, any>, T extends string> = {
2
+ [key in keyof TMap]: Omit<TMap[key], T>;
3
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import { ZodObject, ZodRawShape } from 'zod';
2
+ import { ContextParams } from './ContextParams.js';
3
+ export type RouteConfig<TRouteType extends string, TErrorCodes extends string, TExtraProps extends ZodObject<ZodRawShape> | undefined = ZodObject<ZodRawShape> | undefined, TContext extends object | undefined = object | undefined> = {
4
+ authorization: boolean;
5
+ extraProps: TExtraProps;
6
+ contextFactory: (params: ContextParams<TRouteType, TExtraProps>) => Promise<TContext>;
7
+ errors?: {
8
+ [key in TErrorCodes]?: true;
9
+ };
10
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { ZodObject, ZodRawShape } from 'zod';
2
+ import { RouteConfig } from './RouteConfig.js';
3
+ import { RouteExtraPropsMap } from './RouteExtraPropsMap.js';
4
+ import { RouteContextMap } from './RouteContextMap.js';
5
+ export type RouteConfigMap<TRouteTypes extends string, TErrorCodes extends string, TParamsMap extends RouteExtraPropsMap<TRouteTypes, ZodObject<ZodRawShape> | undefined> | undefined = undefined, TContextMap extends RouteContextMap<TRouteTypes, TParamsMap> | undefined = undefined> = {
6
+ [key in TRouteTypes]: RouteConfig<key, TErrorCodes, TParamsMap extends undefined ? undefined : Exclude<TParamsMap, undefined>[key], TContextMap extends undefined ? undefined : Awaited<ReturnType<Exclude<TContextMap, undefined>[key]>>>;
7
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import { ZodObject, ZodRawShape } from 'zod';
2
+ import { RouteExtraPropsMap } from './RouteExtraPropsMap.js';
3
+ import { ContextParams } from './ContextParams.js';
4
+ export type RouteContextMap<TCode extends string, TParamsMap extends RouteExtraPropsMap<TCode, ZodObject<ZodRawShape> | undefined> | undefined> = {
5
+ [key in TCode]: (params: ContextParams<key, TParamsMap extends undefined ? undefined : Exclude<TParamsMap, undefined>[key]>) => Promise<object>;
6
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import { ZodObject, ZodRawShape, TypeOf } from 'zod';
2
+ export type RouteExtraProps<TValidator extends ZodObject<ZodRawShape> | undefined, TSwapVal = object> = TValidator extends undefined ? TSwapVal : TypeOf<Exclude<TValidator, undefined>>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import { ZodObject, ZodRawShape } from 'zod';
2
+ export type RouteExtraPropsMap<TCode extends string, TVal extends ZodObject<ZodRawShape> | undefined = ZodObject<ZodRawShape> | undefined> = {
3
+ [key in TCode]: TVal;
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { ISpecificationExtension } from './ISpecificationExtension.js';
2
+ export interface Server extends ISpecificationExtension {
3
+ description: string;
4
+ url: string;
5
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ export declare abstract class ApiError<TCode extends string> extends Error {
2
+ private code;
3
+ constructor(code: TCode);
4
+ getCode(): TCode;
5
+ }
@@ -0,0 +1,10 @@
1
+ export class ApiError extends Error {
2
+ code;
3
+ constructor(code) {
4
+ super(code);
5
+ this.code = code;
6
+ }
7
+ getCode() {
8
+ return this.code;
9
+ }
10
+ }
@@ -0,0 +1,4 @@
1
+ import { ErrorCode } from '../../enums/ErrorCode.js';
2
+ import { ApiError } from './ApiError.js';
3
+ export declare class BuiltInError extends ApiError<ErrorCode> {
4
+ }
@@ -0,0 +1,3 @@
1
+ import { ApiError } from './ApiError.js';
2
+ export class BuiltInError extends ApiError {
3
+ }
@@ -0,0 +1,33 @@
1
+ import 'zod-openapi/extend';
2
+ import { z } from 'zod';
3
+ export declare const fieldErrorValidator: z.ZodObject<{
4
+ field: z.ZodString;
5
+ message: z.ZodString;
6
+ } & {
7
+ fieldErrors: z.ZodOptional<z.ZodArray<z.ZodObject<{
8
+ field: z.ZodString;
9
+ message: z.ZodString;
10
+ }, "strip", z.ZodTypeAny, {
11
+ message: string;
12
+ field: string;
13
+ }, {
14
+ message: string;
15
+ field: string;
16
+ }>, "many">>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ message: string;
19
+ field: string;
20
+ fieldErrors?: {
21
+ message: string;
22
+ field: string;
23
+ }[] | undefined;
24
+ }, {
25
+ message: string;
26
+ field: string;
27
+ fieldErrors?: {
28
+ message: string;
29
+ field: string;
30
+ }[] | undefined;
31
+ }>;
32
+ export type FieldErrorValidator = typeof fieldErrorValidator;
33
+ export type FieldError = z.TypeOf<FieldErrorValidator>;
@@ -0,0 +1,9 @@
1
+ import 'zod-openapi/extend';
2
+ import { z } from 'zod';
3
+ const baseFieldErrorValidator = z.object({
4
+ field: z.string().openapi({ description: 'Name of the field' }),
5
+ message: z.string().openapi({ description: 'Error message' }),
6
+ }).openapi({ description: 'Field error' });
7
+ export const fieldErrorValidator = baseFieldErrorValidator.extend({
8
+ fieldErrors: z.array(baseFieldErrorValidator).optional(),
9
+ });
@@ -0,0 +1,10 @@
1
+ import { ZodError } from 'zod';
2
+ import { ValidationLocation } from '../../enums/ValidationLocations.js';
3
+ import { BuiltInError } from './BuiltInError.js';
4
+ export declare class ValidationError extends BuiltInError {
5
+ private error;
6
+ private location;
7
+ constructor(error: ZodError<unknown>, location: ValidationLocation);
8
+ getZodError(): ZodError<unknown>;
9
+ getLocation(): ValidationLocation;
10
+ }
@@ -0,0 +1,17 @@
1
+ import { ErrorCode } from '../../enums/ErrorCode.js';
2
+ import { BuiltInError } from './BuiltInError.js';
3
+ export class ValidationError extends BuiltInError {
4
+ error;
5
+ location;
6
+ constructor(error, location) {
7
+ super(ErrorCode.ValidationFailed);
8
+ this.error = error;
9
+ this.location = location;
10
+ }
11
+ getZodError() {
12
+ return this.error;
13
+ }
14
+ getLocation() {
15
+ return this.location;
16
+ }
17
+ }
@@ -0,0 +1,12 @@
1
+ import 'zod-openapi/extend';
2
+ import { z } from 'zod';
3
+ import { ErrorCode } from '../../../enums/ErrorCode.js';
4
+ export declare const notFoundErrorResponseValidator: z.ZodObject<{
5
+ error: z.ZodLiteral<ErrorCode.NotFound>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ error: ErrorCode.NotFound;
8
+ }, {
9
+ error: ErrorCode.NotFound;
10
+ }>;
11
+ export type NotFoundErrorResponseValidator = typeof notFoundErrorResponseValidator;
12
+ export type NotFoundErrorResponse = z.TypeOf<NotFoundErrorResponseValidator>;
@@ -0,0 +1,6 @@
1
+ import 'zod-openapi/extend';
2
+ import { z } from 'zod';
3
+ import { ErrorCode } from '../../../enums/ErrorCode.js';
4
+ export const notFoundErrorResponseValidator = z.object({
5
+ error: z.literal(ErrorCode.NotFound).openapi({ description: 'Code to handle on the frontend' }),
6
+ }).openapi({ description: 'Error response' });
@@ -0,0 +1,12 @@
1
+ import 'zod-openapi/extend';
2
+ import { z } from 'zod';
3
+ import { ErrorCode } from '../../../enums/ErrorCode.js';
4
+ export declare const unknownErrorResponseValidator: z.ZodObject<{
5
+ error: z.ZodLiteral<ErrorCode.UnknownError>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ error: ErrorCode.UnknownError;
8
+ }, {
9
+ error: ErrorCode.UnknownError;
10
+ }>;
11
+ export type UnknownErrorResponseValidator = typeof unknownErrorResponseValidator;
12
+ export type UnknownErrorResponse = z.TypeOf<UnknownErrorResponseValidator>;
@@ -0,0 +1,6 @@
1
+ import 'zod-openapi/extend';
2
+ import { z } from 'zod';
3
+ import { ErrorCode } from '../../../enums/ErrorCode.js';
4
+ export const unknownErrorResponseValidator = z.object({
5
+ error: z.literal(ErrorCode.UnknownError).openapi({ description: 'Code to handle on the frontend' }),
6
+ }).openapi({ description: 'Error response' });