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,5 @@
1
+ export declare enum ErrorCode {
2
+ UnknownError = "UnknownError",
3
+ ValidationFailed = "ValidationFailed",
4
+ NotFound = "NotFound"
5
+ }
@@ -0,0 +1,6 @@
1
+ export var ErrorCode;
2
+ (function (ErrorCode) {
3
+ ErrorCode["UnknownError"] = "UnknownError";
4
+ ErrorCode["ValidationFailed"] = "ValidationFailed";
5
+ ErrorCode["NotFound"] = "NotFound";
6
+ })(ErrorCode || (ErrorCode = {}));
@@ -0,0 +1,7 @@
1
+ export declare enum Method {
2
+ GET = "GET",
3
+ POST = "POST",
4
+ PATCH = "PATCH",
5
+ PUT = "PUT",
6
+ DELETE = "DELETE"
7
+ }
@@ -0,0 +1,8 @@
1
+ export var Method;
2
+ (function (Method) {
3
+ Method["GET"] = "GET";
4
+ Method["POST"] = "POST";
5
+ Method["PATCH"] = "PATCH";
6
+ Method["PUT"] = "PUT";
7
+ Method["DELETE"] = "DELETE";
8
+ })(Method || (Method = {}));
@@ -0,0 +1,3 @@
1
+ export declare enum SampleRouteType {
2
+ Public = "Public"
3
+ }
@@ -0,0 +1,4 @@
1
+ export var SampleRouteType;
2
+ (function (SampleRouteType) {
3
+ SampleRouteType["Public"] = "Public";
4
+ })(SampleRouteType || (SampleRouteType = {}));
@@ -0,0 +1,6 @@
1
+ export declare enum ValidationLocation {
2
+ Query = "Query",
3
+ Path = "Path",
4
+ Body = "Body",
5
+ Response = "Response"
6
+ }
@@ -0,0 +1,7 @@
1
+ export var ValidationLocation;
2
+ (function (ValidationLocation) {
3
+ ValidationLocation["Query"] = "Query";
4
+ ValidationLocation["Path"] = "Path";
5
+ ValidationLocation["Body"] = "Body";
6
+ ValidationLocation["Response"] = "Response";
7
+ })(ValidationLocation || (ValidationLocation = {}));
@@ -0,0 +1,39 @@
1
+ import 'zod-openapi/extend';
2
+ export { Method as OpenApiMethod } from './enums/Methods.js';
3
+ export { ErrorCode as OpenApiErrorCode } from './enums/ErrorCode.js';
4
+ export { SampleRouteType as OpenApiSampleRouteType } from './enums/SampleRouteType.js';
5
+ export { ValidationLocation as OpenApiValidationLocation } from './enums/ValidationLocations.js';
6
+ export { ApiError as OpenApiError } from './types/errors/ApiError.js';
7
+ export { ValidationError as OpenApiValidationError } from './types/errors/ValidationError.js';
8
+ export { BuiltInError as OpenApiBuiltInError } from './types/errors/BuiltInError.js';
9
+ export type { FieldError as OpenApiFieldError } from './types/errors/FieldError.js';
10
+ export type { ErrorConfig as OpenApiErrorConfig } from './types/config/ErrorConfig.js';
11
+ export type { ErrorConfigMap as OpenApiErrorConfigMap } from './types/config/ErrorConfigMap.js';
12
+ export type { RouteConfig as OpenApiRouteConfig } from './types/config/RouteConfig.js';
13
+ export type { RouteConfigMap as OpenApiRouteConfigMap } from './types/config/RouteConfigMap.js';
14
+ export type { ContextParams as OpenApiContextParams } from './types/config/ContextParams.js';
15
+ export type { ErrorResponse as OpenApiErrorResponse } from './types/config/ErrorResponse.js';
16
+ export type { RouteExtraPropsMap as OpenApiRouteExtraPropsMap } from './types/config/RouteExtraPropsMap.js';
17
+ export type { RouteContextMap as OpenApiRouteContextMap } from './types/config/RouteContextMap.js';
18
+ export type { Config as OpenApiConfig } from './types/config/Config.js';
19
+ export { DefaultConfig as OpenApiDefaultConfig } from './services/ConfigBuilder/types/DefaultConfig.js';
20
+ export { DefaultErrorMap as OpenApiDefaultErrorMap } from './services/ConfigBuilder/types/DefaultErrorMap.js';
21
+ export { DefaultRouteContextMap as OpenApiDefaultRouteContextMap } from './services/ConfigBuilder/types/DefaultRouteContextMap.js';
22
+ export { DefaultRouteMap as OpenApiDefaultRouteMap } from './services/ConfigBuilder/types/DefaultRouteMap.js';
23
+ export { DefaultRouteParamsMap as OpenApiDefaultRouteParamsMap } from './services/ConfigBuilder/types/DefaultRouteParamsMap.js';
24
+ export { OpenApi } from './OpenApi.js';
25
+ export type { AnyConfig as OpenApiAnyConfig } from './types/config/AnyConfig.js';
26
+ export type { AnyRouteConfigMap as OpenApiAnyRouteConfigMap } from './types/config/AnyRouteConfigMap.js';
27
+ export type { RouteMap as OpenApiRouteMap } from './types/RouteMap.js';
28
+ export type { Route as OpenApiRoute } from './types/Route.js';
29
+ export type { AnyRoute as OpenApiAnyRoute } from './types/AnyRoute.js';
30
+ export type { DevelopmentUtils as OpenApiDevelopmentUtils } from './services/DevelopmentUtils/DevelopmentUtils.js';
31
+ export { ClientGenerator as OpenApiClientGenerator } from './services/ClientGenerator/ClientGenerator.js';
32
+ export { RoutingFactory as OpenApiRoutingFactory } from './services/RoutingFactory/RoutingFactory.js';
33
+ export { SchemaGenerator as OpenApiSchemaGenerator } from './services/SchemaGenerator/SchemaGenerator.js';
34
+ export { ValidationUtils as OpenApiValidationUtils } from './services/ValidationUtils/ValidationUtils.js';
35
+ export { TanstackStartWrapper as OpenApiTanstackStartWrapper } from './services/TanstackStartWrapper/TanstackStartWrapper.js';
36
+ export { ExpressWrapper as OpenApiExpressWrapper } from './services/ExpressWrapper/ExpressWrapper.js';
37
+ export { Logger as OpenApiLogger } from './services/Logger/Logger.js';
38
+ export { LogLevel as OpenApiLogLevel } from './services/Logger/types/LogLevel.js';
39
+ export { ConfigBuilder as OpenApiConfigBuilder } from './services/ConfigBuilder/ConfigBuilder.js';
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ import 'zod-openapi/extend';
2
+ export { Method as OpenApiMethod } from './enums/Methods.js';
3
+ export { ErrorCode as OpenApiErrorCode } from './enums/ErrorCode.js';
4
+ export { SampleRouteType as OpenApiSampleRouteType } from './enums/SampleRouteType.js';
5
+ export { ValidationLocation as OpenApiValidationLocation } from './enums/ValidationLocations.js';
6
+ export { ApiError as OpenApiError } from './types/errors/ApiError.js';
7
+ export { ValidationError as OpenApiValidationError } from './types/errors/ValidationError.js';
8
+ export { BuiltInError as OpenApiBuiltInError } from './types/errors/BuiltInError.js';
9
+ export { DefaultConfig as OpenApiDefaultConfig } from './services/ConfigBuilder/types/DefaultConfig.js';
10
+ export { DefaultErrorMap as OpenApiDefaultErrorMap } from './services/ConfigBuilder/types/DefaultErrorMap.js';
11
+ export { DefaultRouteContextMap as OpenApiDefaultRouteContextMap } from './services/ConfigBuilder/types/DefaultRouteContextMap.js';
12
+ export { DefaultRouteMap as OpenApiDefaultRouteMap } from './services/ConfigBuilder/types/DefaultRouteMap.js';
13
+ export { DefaultRouteParamsMap as OpenApiDefaultRouteParamsMap } from './services/ConfigBuilder/types/DefaultRouteParamsMap.js';
14
+ export { OpenApi } from './OpenApi.js';
15
+ export { ClientGenerator as OpenApiClientGenerator } from './services/ClientGenerator/ClientGenerator.js';
16
+ export { RoutingFactory as OpenApiRoutingFactory } from './services/RoutingFactory/RoutingFactory.js';
17
+ export { SchemaGenerator as OpenApiSchemaGenerator } from './services/SchemaGenerator/SchemaGenerator.js';
18
+ export { ValidationUtils as OpenApiValidationUtils } from './services/ValidationUtils/ValidationUtils.js';
19
+ export { TanstackStartWrapper as OpenApiTanstackStartWrapper } from './services/TanstackStartWrapper/TanstackStartWrapper.js';
20
+ export { ExpressWrapper as OpenApiExpressWrapper } from './services/ExpressWrapper/ExpressWrapper.js';
21
+ export { Logger as OpenApiLogger } from './services/Logger/Logger.js';
22
+ export { LogLevel as OpenApiLogLevel } from './services/Logger/types/LogLevel.js';
23
+ export { ConfigBuilder as OpenApiConfigBuilder } from './services/ConfigBuilder/ConfigBuilder.js';
@@ -0,0 +1,9 @@
1
+ import { UserConfig } from '@hey-api/openapi-ts';
2
+ import { OpenApi } from '../../OpenApi.js';
3
+ import { AnyConfig } from '../../types/config/AnyConfig.js';
4
+ export declare class ClientGenerator<TRouteTypes extends string, TErrorCodes extends string, TConfig extends AnyConfig<TRouteTypes, TErrorCodes>> {
5
+ protected api: OpenApi<TRouteTypes, TErrorCodes, TConfig>;
6
+ constructor(api: OpenApi<TRouteTypes, TErrorCodes, TConfig>);
7
+ generate(config?: Partial<Omit<UserConfig, 'input'>>): Promise<void>;
8
+ protected getDefaultConfig(): Omit<UserConfig, 'input'>;
9
+ }
@@ -0,0 +1,48 @@
1
+ import { createClient } from '@hey-api/openapi-ts';
2
+ import { parse } from 'yaml';
3
+ export class ClientGenerator {
4
+ api;
5
+ constructor(api) {
6
+ this.api = api;
7
+ }
8
+ async generate(config = {}) {
9
+ const obj = parse(this.api.schemaGenerator.getYaml());
10
+ const conf = {
11
+ ...this.getDefaultConfig(),
12
+ ...config,
13
+ input: {
14
+ path: obj,
15
+ },
16
+ };
17
+ createClient(conf);
18
+ }
19
+ getDefaultConfig() {
20
+ const config = {
21
+ output: {
22
+ path: './open-api-client',
23
+ },
24
+ plugins: [
25
+ {
26
+ name: '@hey-api/client-axios',
27
+ throwOnError: false,
28
+ },
29
+ {
30
+ name: '@tanstack/react-query',
31
+ },
32
+ {
33
+ name: '@hey-api/transformers',
34
+ dates: true,
35
+ },
36
+ {
37
+ name: '@hey-api/sdk',
38
+ transformer: true,
39
+ },
40
+ {
41
+ name: '@hey-api/typescript',
42
+ enums: 'javascript',
43
+ },
44
+ ],
45
+ };
46
+ return config;
47
+ }
48
+ }
@@ -0,0 +1,31 @@
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';
9
+ import { ZodRawShape, ZodObject } from 'zod';
10
+ import { RouteContextMap } from '../../types/config/RouteContextMap.js';
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
+ protected x: Config<TRouteTypes, TErrorCodes, ErrorConfigMap<TErrorCodes>, RouteExtraPropsMap<TRouteTypes>, RouteContextMap<TRouteTypes, RouteExtraPropsMap<TRouteTypes>>, RouteConfigMap<TRouteTypes, TErrorCodes, RouteExtraPropsMap<TRouteTypes>, RouteContextMap<TRouteTypes, RouteExtraPropsMap<TRouteTypes>>>>;
13
+ protected construct: OpenApiConstructor;
14
+ protected errorMap?: TErrorConfigMap;
15
+ protected defaultError?: TConfig['defaultError'];
16
+ protected routeMap?: TRouteConfigMap;
17
+ protected routeParamMap?: TRouteParamMap;
18
+ protected routeContextMap?: TRouteContextMap;
19
+ protected conf?: Omit<TConfig, 'errors' | 'routes' | 'defaultError'>;
20
+ constructor(construct: OpenApiConstructor, errorMap?: TErrorConfigMap, defaultError?: TConfig['defaultError'], routeParamMap?: TRouteParamMap, routeContextMap?: TRouteContextMap, routeMap?: TRouteConfigMap, conf?: Omit<TConfig, 'errors' | 'routes' | 'defaultError'>);
21
+ customizeRoutes<T extends string>(routeTypes: Record<string, T>): Pick<ConfigBuilder<T, TErrorCodes, TErrorConfigMap, RouteExtraPropsMap<T>, RouteContextMap<T, RouteExtraPropsMap<T>>, RouteConfigMap<T, TErrorCodes, RouteExtraPropsMap<T>, RouteContextMap<T, RouteExtraPropsMap<T>>>>, 'defineRouteExtraProps' | 'defineRouteContexts' | 'defineRoutes'>;
22
+ customizeErrors<T extends string>(errorCodes: Record<string, T>): Pick<ConfigBuilder<TRouteTypes, T, ErrorConfigMap<T>, RouteExtraPropsMap<TRouteTypes>, RouteContextMap<TRouteTypes, RouteExtraPropsMap<TRouteTypes>>, RouteConfigMap<TRouteTypes, T, RouteExtraPropsMap<TRouteTypes>, RouteContextMap<TRouteTypes, RouteExtraPropsMap<TRouteTypes>>>>, 'defineErrors'>;
23
+ defineErrors<T extends ErrorConfigMap<TErrorCodes>>(map: T): Pick<ConfigBuilder<TRouteTypes, TErrorCodes, T, TRouteParamMap, TRouteContextMap, TRouteConfigMap>, 'defineDefaultError'>;
24
+ defineDefaultError(defaultError: TConfig['defaultError']): Pick<ConfigBuilder<TRouteTypes, TErrorCodes, TErrorConfigMap, TRouteParamMap, TRouteContextMap, TRouteConfigMap>, 'customizeRoutes' | 'defineGlobalConfig'>;
25
+ defineRouteExtraProps<T extends RouteExtraPropsMap<TRouteTypes, ZodObject<ZodRawShape> | undefined>>(map: T): Pick<ConfigBuilder<TRouteTypes, TErrorCodes, TErrorConfigMap, T, RouteContextMap<TRouteTypes, T>, RouteConfigMap<TRouteTypes, TErrorCodes, T, RouteContextMap<TRouteTypes, T>>>, 'defineRoutes' | 'defineRouteContexts' | 'customizeErrors'>;
26
+ defineRouteContexts<T extends RouteContextMap<TRouteTypes, TRouteParamMap>>(map: T): Pick<ConfigBuilder<TRouteTypes, TErrorCodes, TErrorConfigMap, TRouteParamMap, T, RouteConfigMap<TRouteTypes, TErrorCodes, TRouteParamMap, T>>, 'defineRoutes' | 'customizeErrors'>;
27
+ defineRoutes<T extends RouteConfigMap<TRouteTypes, TErrorCodes, TRouteParamMap, TRouteContextMap>>(map: OmitMappedField<T, 'extraProps' | 'context' | 'contextFactory'>): Pick<ConfigBuilder<TRouteTypes, TErrorCodes, TErrorConfigMap, TRouteParamMap, TRouteContextMap, T>, 'customizeErrors' | 'defineGlobalConfig' | 'create'>;
28
+ defineGlobalConfig<T extends Config<TRouteTypes, TErrorCodes, TErrorConfigMap, TRouteParamMap, TRouteContextMap, TRouteConfigMap>>(conf: Omit<T, 'errors' | 'routes' | 'defaultError'>): Pick<ConfigBuilder<TRouteTypes, TErrorCodes, TErrorConfigMap, TRouteParamMap, TRouteContextMap, TRouteConfigMap, T>, 'create'>;
29
+ create<TRouteTypes extends string, TErrorCodes extends string, TConfig extends AnyConfig<TRouteTypes, TErrorCodes>>(routes: Record<string, TRouteTypes>, errors: Record<string, TErrorCodes>, spec: TConfig): OpenApi<TRouteTypes, TErrorCodes, TConfig>;
30
+ create(): OpenApi<TRouteTypes, TErrorCodes, TConfig>;
31
+ }
@@ -0,0 +1,65 @@
1
+ import { DefaultConfig } from './types/DefaultConfig.js';
2
+ export class ConfigBuilder {
3
+ x;
4
+ construct;
5
+ errorMap;
6
+ defaultError;
7
+ routeMap;
8
+ routeParamMap;
9
+ routeContextMap;
10
+ conf;
11
+ constructor(construct, errorMap, defaultError, routeParamMap, routeContextMap, routeMap, conf) {
12
+ this.construct = construct;
13
+ this.errorMap = errorMap;
14
+ this.defaultError = defaultError;
15
+ this.routeParamMap = routeParamMap;
16
+ this.routeContextMap = routeContextMap;
17
+ this.routeMap = routeMap;
18
+ this.conf = conf;
19
+ }
20
+ customizeRoutes(routeTypes) {
21
+ return new ConfigBuilder(this.construct, this.errorMap, this.defaultError);
22
+ }
23
+ customizeErrors(errorCodes) {
24
+ return new ConfigBuilder(this.construct);
25
+ }
26
+ defineErrors(map) {
27
+ return new ConfigBuilder(this.construct, map);
28
+ }
29
+ defineDefaultError(defaultError) {
30
+ return new ConfigBuilder(this.construct, this.errorMap, defaultError);
31
+ }
32
+ defineRouteExtraProps(map) {
33
+ return new ConfigBuilder(this.construct, this.errorMap, this.defaultError, map, undefined, undefined, undefined);
34
+ }
35
+ defineRouteContexts(map) {
36
+ return new ConfigBuilder(this.construct, this.errorMap, this.defaultError, this.routeParamMap, map, undefined, undefined);
37
+ }
38
+ defineRoutes(map) {
39
+ return new ConfigBuilder(this.construct, this.errorMap, this.defaultError, this.routeParamMap, this.routeContextMap, map);
40
+ }
41
+ defineGlobalConfig(conf) {
42
+ return new ConfigBuilder(this.construct, this.errorMap, this.defaultError, this.routeParamMap, this.routeContextMap, this.routeMap, conf);
43
+ }
44
+ create(a, b, conf) {
45
+ if (conf) {
46
+ return this.construct(conf);
47
+ }
48
+ const routeMap = this.routeMap ?? undefined;
49
+ const contextMap = this.routeContextMap ?? undefined;
50
+ if (this.routeContextMap && this.routeMap) {
51
+ for (const key of Object.keys(routeMap)) {
52
+ routeMap[key].contextFactory = contextMap[key];
53
+ }
54
+ }
55
+ const def = new DefaultConfig();
56
+ const builtConf = {
57
+ ...def,
58
+ ...this.conf,
59
+ ...(routeMap ? { routes: routeMap } : {}),
60
+ ...(this.errorMap ? { errors: this.errorMap } : {}),
61
+ ...(this.defaultError ? { defaultError: this.defaultError } : {}),
62
+ };
63
+ return this.construct(builtConf);
64
+ }
65
+ }
@@ -0,0 +1,22 @@
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';
10
+ export declare class DefaultConfig implements Config<SampleRouteType, ErrorCode, DefaultErrorMap, DefaultRouteParamsMap, DefaultRouteContextMap, DefaultRouteMap> {
11
+ basePath: RoutePath;
12
+ routes: DefaultRouteMap;
13
+ errors: DefaultErrorMap;
14
+ defaultError: {
15
+ readonly code: ErrorCode.UnknownError;
16
+ readonly body: {
17
+ readonly error: ErrorCode.UnknownError;
18
+ };
19
+ };
20
+ handleError?: (e: unknown) => ErrorResponse<ErrorCode, DefaultErrorMap>;
21
+ skipDescriptionsCheck?: boolean;
22
+ }
@@ -0,0 +1,47 @@
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';
7
+ export class DefaultConfig {
8
+ basePath = '/api';
9
+ routes = new DefaultRouteMap();
10
+ errors = new DefaultErrorMap();
11
+ defaultError = {
12
+ code: ErrorCode.UnknownError,
13
+ body: {
14
+ error: ErrorCode.UnknownError,
15
+ },
16
+ };
17
+ handleError = (e) => {
18
+ if (e instanceof ValidationError) {
19
+ const zodError = e.getZodError();
20
+ const map = [];
21
+ for (const issue of zodError.issues) {
22
+ map.push({
23
+ field: issue.path.map((x) => x.toString()).join('.'),
24
+ message: issue.message,
25
+ });
26
+ }
27
+ if (e.getLocation() !== ValidationLocation.Response) {
28
+ const response = {
29
+ error: {
30
+ code: ErrorCode.ValidationFailed,
31
+ location: e.getLocation(),
32
+ fieldErrors: map,
33
+ },
34
+ };
35
+ return { code: ErrorCode.ValidationFailed, body: response };
36
+ }
37
+ }
38
+ if (e instanceof BuiltInError && e.getCode() === ErrorCode.NotFound) {
39
+ return { code: ErrorCode.NotFound, body: { error: ErrorCode.NotFound } };
40
+ }
41
+ const unknownError = {
42
+ error: ErrorCode.UnknownError,
43
+ };
44
+ return { code: ErrorCode.UnknownError, body: unknownError };
45
+ };
46
+ skipDescriptionsCheck = false;
47
+ }
@@ -0,0 +1,113 @@
1
+ import { ErrorCode } from '../../../enums/ErrorCode.js';
2
+ import { ErrorConfigMap } from '../../../types/config/ErrorConfigMap.js';
3
+ export declare class DefaultErrorMap implements ErrorConfigMap<ErrorCode> {
4
+ [ErrorCode.UnknownError]: {
5
+ readonly status: "500";
6
+ readonly description: "Unknown Error";
7
+ readonly responseValidator: import("zod").ZodObject<{
8
+ error: import("zod").ZodLiteral<ErrorCode.UnknownError>;
9
+ }, "strip", import("zod").ZodTypeAny, {
10
+ error: ErrorCode.UnknownError;
11
+ }, {
12
+ error: ErrorCode.UnknownError;
13
+ }>;
14
+ };
15
+ [ErrorCode.ValidationFailed]: {
16
+ readonly status: "400";
17
+ readonly description: "Validation Failed";
18
+ readonly responseValidator: import("zod").ZodObject<{
19
+ error: import("zod").ZodObject<{
20
+ code: import("zod").ZodLiteral<ErrorCode.ValidationFailed>;
21
+ fieldErrors: import("zod").ZodArray<import("zod").ZodObject<{
22
+ field: import("zod").ZodString;
23
+ message: import("zod").ZodString;
24
+ } & {
25
+ fieldErrors: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
26
+ field: import("zod").ZodString;
27
+ message: import("zod").ZodString;
28
+ }, "strip", import("zod").ZodTypeAny, {
29
+ message: string;
30
+ field: string;
31
+ }, {
32
+ message: string;
33
+ field: string;
34
+ }>, "many">>;
35
+ }, "strip", import("zod").ZodTypeAny, {
36
+ message: string;
37
+ field: string;
38
+ fieldErrors?: {
39
+ message: string;
40
+ field: string;
41
+ }[] | undefined;
42
+ }, {
43
+ message: string;
44
+ field: string;
45
+ fieldErrors?: {
46
+ message: string;
47
+ field: string;
48
+ }[] | undefined;
49
+ }>, "many">;
50
+ location: import("zod").ZodNativeEnum<typeof import("../../../index.js").OpenApiValidationLocation>;
51
+ }, "strip", import("zod").ZodTypeAny, {
52
+ code: ErrorCode.ValidationFailed;
53
+ fieldErrors: {
54
+ message: string;
55
+ field: string;
56
+ fieldErrors?: {
57
+ message: string;
58
+ field: string;
59
+ }[] | undefined;
60
+ }[];
61
+ location: import("../../../index.js").OpenApiValidationLocation;
62
+ }, {
63
+ code: ErrorCode.ValidationFailed;
64
+ fieldErrors: {
65
+ message: string;
66
+ field: string;
67
+ fieldErrors?: {
68
+ message: string;
69
+ field: string;
70
+ }[] | undefined;
71
+ }[];
72
+ location: import("../../../index.js").OpenApiValidationLocation;
73
+ }>;
74
+ }, "strip", import("zod").ZodTypeAny, {
75
+ error: {
76
+ code: ErrorCode.ValidationFailed;
77
+ fieldErrors: {
78
+ message: string;
79
+ field: string;
80
+ fieldErrors?: {
81
+ message: string;
82
+ field: string;
83
+ }[] | undefined;
84
+ }[];
85
+ location: import("../../../index.js").OpenApiValidationLocation;
86
+ };
87
+ }, {
88
+ error: {
89
+ code: ErrorCode.ValidationFailed;
90
+ fieldErrors: {
91
+ message: string;
92
+ field: string;
93
+ fieldErrors?: {
94
+ message: string;
95
+ field: string;
96
+ }[] | undefined;
97
+ }[];
98
+ location: import("../../../index.js").OpenApiValidationLocation;
99
+ };
100
+ }>;
101
+ };
102
+ [ErrorCode.NotFound]: {
103
+ readonly status: "404";
104
+ readonly description: "Route Not Found";
105
+ readonly responseValidator: import("zod").ZodObject<{
106
+ error: import("zod").ZodLiteral<ErrorCode.NotFound>;
107
+ }, "strip", import("zod").ZodTypeAny, {
108
+ error: ErrorCode.NotFound;
109
+ }, {
110
+ error: ErrorCode.NotFound;
111
+ }>;
112
+ };
113
+ }
@@ -0,0 +1,21 @@
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';
5
+ export class DefaultErrorMap {
6
+ [ErrorCode.UnknownError] = {
7
+ status: '500',
8
+ description: 'Unknown Error',
9
+ responseValidator: unknownErrorResponseValidator,
10
+ };
11
+ [ErrorCode.ValidationFailed] = {
12
+ status: '400',
13
+ description: 'Validation Failed',
14
+ responseValidator: validationErrorResponseValidator,
15
+ };
16
+ [ErrorCode.NotFound] = {
17
+ status: '404',
18
+ description: 'Route Not Found',
19
+ responseValidator: notFoundErrorResponseValidator,
20
+ };
21
+ }
@@ -0,0 +1,6 @@
1
+ import { SampleRouteType } from '../../../enums/SampleRouteType.js';
2
+ import { RouteContextMap } from '../../../types/config/RouteContextMap.js';
3
+ import { DefaultRouteParamsMap } from './DefaultRouteParamsMap.js';
4
+ export declare class DefaultRouteContextMap implements RouteContextMap<SampleRouteType, DefaultRouteParamsMap> {
5
+ Public: () => Promise<{}>;
6
+ }
@@ -0,0 +1,3 @@
1
+ export class DefaultRouteContextMap {
2
+ Public = async () => ({});
3
+ }
@@ -0,0 +1,12 @@
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';
6
+ export declare class DefaultRouteMap implements RouteConfigMap<SampleRouteType, ErrorCode, DefaultRouteParamsMap, DefaultRouteContextMap> {
7
+ Public: {
8
+ readonly authorization: false;
9
+ readonly extraProps: undefined;
10
+ readonly contextFactory: () => Promise<{}>;
11
+ };
12
+ }
@@ -0,0 +1,9 @@
1
+ import { DefaultRouteContextMap } from './DefaultRouteContextMap.js';
2
+ import { DefaultRouteParamsMap } from './DefaultRouteParamsMap.js';
3
+ export class DefaultRouteMap {
4
+ Public = {
5
+ authorization: false,
6
+ extraProps: new DefaultRouteParamsMap().Public,
7
+ contextFactory: new DefaultRouteContextMap().Public,
8
+ };
9
+ }
@@ -0,0 +1,5 @@
1
+ import { SampleRouteType } from '../../../enums/SampleRouteType.js';
2
+ import { RouteExtraPropsMap } from '../../../types/config/RouteExtraPropsMap.js';
3
+ export declare class DefaultRouteParamsMap implements RouteExtraPropsMap<SampleRouteType> {
4
+ Public: undefined;
5
+ }
@@ -0,0 +1,3 @@
1
+ export class DefaultRouteParamsMap {
2
+ Public = undefined;
3
+ }
@@ -0,0 +1,2 @@
1
+ import { OpenApi } from '../../../OpenApi.js';
2
+ export type OpenApiConstructor = (conf: any) => OpenApi<any, any, any>;
@@ -0,0 +1,16 @@
1
+ import { ZodTypeAny, ZodRawShape } from 'zod';
2
+ import { AnyRoute } from '../../types/AnyRoute.js';
3
+ import { ValidationUtils } from '../ValidationUtils/ValidationUtils.js';
4
+ interface DescriptionCheckerConfig {
5
+ checkValidators: boolean;
6
+ }
7
+ export declare class DescriptionChecker {
8
+ protected utils: ValidationUtils;
9
+ protected config: DescriptionCheckerConfig;
10
+ constructor(config: DescriptionCheckerConfig);
11
+ checkRoutes(routes: AnyRoute<string>[]): void;
12
+ protected checkRouteDescriptions(route: AnyRoute<string>): void;
13
+ protected checkValidatorDescriptions(route: AnyRoute<string>, validatorName: string, field: string | undefined, validator: ZodTypeAny, checkValidatorDescription?: boolean): void;
14
+ protected checkShapeDescription(route: AnyRoute<string>, validatorName: string, shape: ZodRawShape): void;
15
+ }
16
+ export {};
@@ -0,0 +1,47 @@
1
+ import z from 'zod';
2
+ import { ValidationUtils } from '../ValidationUtils/ValidationUtils.js';
3
+ export class DescriptionChecker {
4
+ utils = new ValidationUtils();
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ checkRoutes(routes) {
10
+ for (const route of routes) {
11
+ this.checkRouteDescriptions(route);
12
+ }
13
+ }
14
+ checkRouteDescriptions(route) {
15
+ const minimalLength = 10;
16
+ if (!route.description || route.description.length < minimalLength) {
17
+ throw new Error(`Description for ${route.path} is missing or too small`);
18
+ }
19
+ this.checkValidatorDescriptions(route, 'responseValidator', 'responseValidator', route.validators.response);
20
+ this.checkValidatorDescriptions(route, 'pathValidator', 'pathValidator', route.validators.path ?? z.object({}), false);
21
+ this.checkValidatorDescriptions(route, 'queryValidator', 'queryValidator', route.validators.query ?? z.object({}), false);
22
+ this.checkValidatorDescriptions(route, 'bodyValidator', 'bodyValidator', route.validators.body ?? z.object({}), false);
23
+ }
24
+ checkValidatorDescriptions(route, validatorName, field, validator, checkValidatorDescription = true) {
25
+ const openapi = validator._def.openapi ?? validator._def.zodOpenApi?.openapi;
26
+ if (this.config.checkValidators && checkValidatorDescription && !openapi?.description) {
27
+ throw new Error(`Route '${route.method}:${route.path}': ${validatorName} missing openapi description on field '${field}'`);
28
+ }
29
+ if (validator._def.typeName === 'ZodArray') {
30
+ const arr = validator;
31
+ const nonPrimitiveArray = arr.element.shape !== undefined;
32
+ if (nonPrimitiveArray) {
33
+ this.checkShapeDescription(route, validatorName, arr.element.shape);
34
+ }
35
+ }
36
+ if (validator._def.typeName === 'ZodObject') {
37
+ const obj = validator;
38
+ this.checkShapeDescription(route, validatorName, obj.shape);
39
+ }
40
+ }
41
+ checkShapeDescription(route, validatorName, shape) {
42
+ for (const field of Object.keys(shape)) {
43
+ const value = shape[field];
44
+ this.checkValidatorDescriptions(route, validatorName, field, value);
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,4 @@
1
+ export declare class DevelopmentUtils {
2
+ getSwaggerHTML(schemaUrl: string): string;
3
+ getStoplightHtml(schemaUrl: string): string;
4
+ }
@@ -0,0 +1,15 @@
1
+ import { readFileSync } from 'fs';
2
+ import { dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ export class DevelopmentUtils {
5
+ getSwaggerHTML(schemaUrl) {
6
+ const file = readFileSync(`${dirname(fileURLToPath(import.meta.url))}/../../assets/swagger.html`);
7
+ const result = file.toString();
8
+ return result.replaceAll('{{SCHEMA_URL}}', schemaUrl);
9
+ }
10
+ getStoplightHtml(schemaUrl) {
11
+ const file = readFileSync(`${dirname(fileURLToPath(import.meta.url))}/../../assets/stoplight.html`);
12
+ const result = file.toString();
13
+ return result.replaceAll('{{SCHEMA_URL}}', schemaUrl);
14
+ }
15
+ }