@forklaunch/core 0.2.37 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{src/database/mikro/models/entities/base.entity.d.ts → base.entity-DNfmMOgd.d.mts} +3 -2
- package/lib/base.entity-DNfmMOgd.d.ts +27 -0
- package/lib/{src/cache/redisTtlCache.d.ts → cache/index.d.mts} +67 -4
- package/lib/cache/index.d.ts +130 -0
- package/lib/cache/index.js +133 -0
- package/lib/cache/index.mjs +105 -0
- package/lib/controllers/index.d.mts +5 -0
- package/lib/controllers/index.d.ts +5 -0
- package/lib/controllers/index.js +18 -0
- package/lib/controllers/index.mjs +0 -0
- package/lib/database/index.d.mts +37 -0
- package/lib/{src/database/mikro/models/entities/mongo.base.entity.d.ts → database/index.d.ts} +5 -2
- package/lib/database/index.js +78 -0
- package/lib/database/index.mjs +53 -0
- package/lib/dtoMapper/index.d.mts +215 -0
- package/lib/dtoMapper/index.d.ts +215 -0
- package/lib/dtoMapper/index.js +230 -0
- package/lib/dtoMapper/index.mjs +202 -0
- package/lib/http/index.d.mts +910 -0
- package/lib/http/index.d.ts +910 -0
- package/lib/http/index.js +2181 -0
- package/lib/http/index.mjs +2122 -0
- package/lib/services/index.d.mts +64 -0
- package/lib/services/index.d.ts +64 -0
- package/lib/services/index.js +159 -0
- package/lib/services/index.mjs +131 -0
- package/package.json +39 -26
- package/lib/src/cache/index.d.ts +0 -5
- package/lib/src/cache/index.d.ts.map +0 -1
- package/lib/src/cache/index.js +0 -4
- package/lib/src/cache/interfaces/ttlCache.interface.d.ts +0 -48
- package/lib/src/cache/interfaces/ttlCache.interface.d.ts.map +0 -1
- package/lib/src/cache/interfaces/ttlCache.interface.js +0 -1
- package/lib/src/cache/redisTtlCache.d.ts.map +0 -1
- package/lib/src/cache/redisTtlCache.js +0 -98
- package/lib/src/cache/types/ttlCacheRecord.types.d.ts +0 -14
- package/lib/src/cache/types/ttlCacheRecord.types.d.ts.map +0 -1
- package/lib/src/cache/types/ttlCacheRecord.types.js +0 -1
- package/lib/src/cache/utils/cacheKey.d.ts +0 -2
- package/lib/src/cache/utils/cacheKey.d.ts.map +0 -1
- package/lib/src/cache/utils/cacheKey.js +0 -3
- package/lib/src/controllers/index.d.ts +0 -2
- package/lib/src/controllers/index.d.ts.map +0 -1
- package/lib/src/controllers/index.js +0 -1
- package/lib/src/controllers/interfaces/controller.interface.d.ts +0 -4
- package/lib/src/controllers/interfaces/controller.interface.d.ts.map +0 -1
- package/lib/src/controllers/interfaces/controller.interface.js +0 -1
- package/lib/src/database/index.d.ts +0 -3
- package/lib/src/database/index.d.ts.map +0 -1
- package/lib/src/database/index.js +0 -2
- package/lib/src/database/mikro/models/entities/base.entity.d.ts.map +0 -1
- package/lib/src/database/mikro/models/entities/base.entity.js +0 -42
- package/lib/src/database/mikro/models/entities/mongo.base.entity.d.ts.map +0 -1
- package/lib/src/database/mikro/models/entities/mongo.base.entity.js +0 -51
- package/lib/src/dtoMapper/index.d.ts +0 -3
- package/lib/src/dtoMapper/index.d.ts.map +0 -1
- package/lib/src/dtoMapper/index.js +0 -2
- package/lib/src/dtoMapper/interfaces/dtoMapper.interface.d.ts +0 -18
- package/lib/src/dtoMapper/interfaces/dtoMapper.interface.d.ts.map +0 -1
- package/lib/src/dtoMapper/interfaces/dtoMapper.interface.js +0 -1
- package/lib/src/dtoMapper/models/baseDtoMapper.model.d.ts +0 -72
- package/lib/src/dtoMapper/models/baseDtoMapper.model.d.ts.map +0 -1
- package/lib/src/dtoMapper/models/baseDtoMapper.model.js +0 -76
- package/lib/src/dtoMapper/models/requestDtoMapper.model.d.ts +0 -68
- package/lib/src/dtoMapper/models/requestDtoMapper.model.d.ts.map +0 -1
- package/lib/src/dtoMapper/models/requestDtoMapper.model.js +0 -71
- package/lib/src/dtoMapper/models/responseDtoMapper.model.d.ts +0 -67
- package/lib/src/dtoMapper/models/responseDtoMapper.model.d.ts.map +0 -1
- package/lib/src/dtoMapper/models/responseDtoMapper.model.js +0 -68
- package/lib/src/dtoMapper/types/dtoMapper.types.d.ts +0 -9
- package/lib/src/dtoMapper/types/dtoMapper.types.d.ts.map +0 -1
- package/lib/src/dtoMapper/types/dtoMapper.types.js +0 -1
- package/lib/src/http/application/expressLikeApplication.d.ts +0 -21
- package/lib/src/http/application/expressLikeApplication.d.ts.map +0 -1
- package/lib/src/http/application/expressLikeApplication.js +0 -21
- package/lib/src/http/guards/isConstrainedForklaunchRouter.d.ts +0 -4
- package/lib/src/http/guards/isConstrainedForklaunchRouter.d.ts.map +0 -1
- package/lib/src/http/guards/isConstrainedForklaunchRouter.js +0 -5
- package/lib/src/http/guards/isExpressLikeSchemaHandler.d.ts +0 -5
- package/lib/src/http/guards/isExpressLikeSchemaHandler.d.ts.map +0 -1
- package/lib/src/http/guards/isExpressLikeSchemaHandler.js +0 -6
- package/lib/src/http/guards/isForklaunchExpressLikeRouter.d.ts +0 -5
- package/lib/src/http/guards/isForklaunchExpressLikeRouter.d.ts.map +0 -1
- package/lib/src/http/guards/isForklaunchExpressLikeRouter.js +0 -6
- package/lib/src/http/guards/isForklaunchRouter.d.ts +0 -4
- package/lib/src/http/guards/isForklaunchRouter.d.ts.map +0 -1
- package/lib/src/http/guards/isForklaunchRouter.js +0 -7
- package/lib/src/http/guards/isHttpContractDetails.d.ts +0 -7
- package/lib/src/http/guards/isHttpContractDetails.d.ts.map +0 -1
- package/lib/src/http/guards/isHttpContractDetails.js +0 -9
- package/lib/src/http/guards/isPathParamContractDetails.d.ts +0 -4
- package/lib/src/http/guards/isPathParamContractDetails.d.ts.map +0 -1
- package/lib/src/http/guards/isPathParamContractDetails.js +0 -10
- package/lib/src/http/guards/isResponseShape.d.ts +0 -3
- package/lib/src/http/guards/isResponseShape.d.ts.map +0 -1
- package/lib/src/http/guards/isResponseShape.js +0 -7
- package/lib/src/http/guards/isTypedHandler.d.ts +0 -5
- package/lib/src/http/guards/isTypedHandler.d.ts.map +0 -1
- package/lib/src/http/guards/isTypedHandler.js +0 -6
- package/lib/src/http/handlers/delete.d.ts +0 -9
- package/lib/src/http/handlers/delete.d.ts.map +0 -1
- package/lib/src/http/handlers/delete.js +0 -4
- package/lib/src/http/handlers/get.d.ts +0 -9
- package/lib/src/http/handlers/get.d.ts.map +0 -1
- package/lib/src/http/handlers/get.js +0 -4
- package/lib/src/http/handlers/head.d.ts +0 -9
- package/lib/src/http/handlers/head.d.ts.map +0 -1
- package/lib/src/http/handlers/head.js +0 -4
- package/lib/src/http/handlers/middleware.d.ts +0 -9
- package/lib/src/http/handlers/middleware.d.ts.map +0 -1
- package/lib/src/http/handlers/middleware.js +0 -4
- package/lib/src/http/handlers/options.d.ts +0 -9
- package/lib/src/http/handlers/options.d.ts.map +0 -1
- package/lib/src/http/handlers/options.js +0 -4
- package/lib/src/http/handlers/patch.d.ts +0 -9
- package/lib/src/http/handlers/patch.d.ts.map +0 -1
- package/lib/src/http/handlers/patch.js +0 -4
- package/lib/src/http/handlers/post.d.ts +0 -9
- package/lib/src/http/handlers/post.d.ts.map +0 -1
- package/lib/src/http/handlers/post.js +0 -4
- package/lib/src/http/handlers/put.d.ts +0 -9
- package/lib/src/http/handlers/put.d.ts.map +0 -1
- package/lib/src/http/handlers/put.js +0 -4
- package/lib/src/http/handlers/trace.d.ts +0 -9
- package/lib/src/http/handlers/trace.d.ts.map +0 -1
- package/lib/src/http/handlers/trace.js +0 -4
- package/lib/src/http/handlers/typedAuthHandler.d.ts +0 -5
- package/lib/src/http/handlers/typedAuthHandler.d.ts.map +0 -1
- package/lib/src/http/handlers/typedAuthHandler.js +0 -3
- package/lib/src/http/handlers/typedHandler.d.ts +0 -21
- package/lib/src/http/handlers/typedHandler.d.ts.map +0 -1
- package/lib/src/http/handlers/typedHandler.js +0 -30
- package/lib/src/http/index.d.ts +0 -23
- package/lib/src/http/index.d.ts.map +0 -1
- package/lib/src/http/index.js +0 -22
- package/lib/src/http/interfaces/expressLikeRouter.interface.d.ts +0 -24
- package/lib/src/http/interfaces/expressLikeRouter.interface.d.ts.map +0 -1
- package/lib/src/http/interfaces/expressLikeRouter.interface.js +0 -1
- package/lib/src/http/middleware/request/auth.middleware.d.ts +0 -16
- package/lib/src/http/middleware/request/auth.middleware.d.ts.map +0 -1
- package/lib/src/http/middleware/request/auth.middleware.js +0 -143
- package/lib/src/http/middleware/request/cors.middleware.d.ts +0 -13
- package/lib/src/http/middleware/request/cors.middleware.d.ts.map +0 -1
- package/lib/src/http/middleware/request/cors.middleware.js +0 -15
- package/lib/src/http/middleware/request/createContext.middleware.d.ts +0 -15
- package/lib/src/http/middleware/request/createContext.middleware.d.ts.map +0 -1
- package/lib/src/http/middleware/request/createContext.middleware.js +0 -26
- package/lib/src/http/middleware/request/enrichDetails.middleware.d.ts +0 -15
- package/lib/src/http/middleware/request/enrichDetails.middleware.d.ts.map +0 -1
- package/lib/src/http/middleware/request/enrichDetails.middleware.js +0 -19
- package/lib/src/http/middleware/request/parse.middleware.d.ts +0 -17
- package/lib/src/http/middleware/request/parse.middleware.d.ts.map +0 -1
- package/lib/src/http/middleware/request/parse.middleware.js +0 -43
- package/lib/src/http/middleware/response/parse.middleware.d.ts +0 -31
- package/lib/src/http/middleware/response/parse.middleware.d.ts.map +0 -1
- package/lib/src/http/middleware/response/parse.middleware.js +0 -52
- package/lib/src/http/openApiV3Generator/openApiV3Generator.d.ts +0 -14
- package/lib/src/http/openApiV3Generator/openApiV3Generator.d.ts.map +0 -1
- package/lib/src/http/openApiV3Generator/openApiV3Generator.js +0 -169
- package/lib/src/http/router/expressLikeRouter.d.ts +0 -138
- package/lib/src/http/router/expressLikeRouter.d.ts.map +0 -1
- package/lib/src/http/router/expressLikeRouter.js +0 -483
- package/lib/src/http/types/apiDefinition.types.d.ts +0 -260
- package/lib/src/http/types/apiDefinition.types.d.ts.map +0 -1
- package/lib/src/http/types/apiDefinition.types.js +0 -1
- package/lib/src/http/types/contractDetails.types.d.ts +0 -211
- package/lib/src/http/types/contractDetails.types.d.ts.map +0 -1
- package/lib/src/http/types/contractDetails.types.js +0 -1
- package/lib/src/http/types/expressLikeRouter.types.d.ts +0 -51
- package/lib/src/http/types/expressLikeRouter.types.d.ts.map +0 -1
- package/lib/src/http/types/expressLikeRouter.types.js +0 -1
- package/lib/src/http/types/router.types.d.ts +0 -32
- package/lib/src/http/types/router.types.d.ts.map +0 -1
- package/lib/src/http/types/router.types.js +0 -1
- package/lib/src/http/types/typedHandler.types.d.ts +0 -10
- package/lib/src/http/types/typedHandler.types.d.ts.map +0 -1
- package/lib/src/http/types/typedHandler.types.js +0 -1
- package/lib/src/http/utils/enrichExpressLikeSend.d.ts +0 -32
- package/lib/src/http/utils/enrichExpressLikeSend.d.ts.map +0 -1
- package/lib/src/http/utils/enrichExpressLikeSend.js +0 -50
- package/lib/src/http/utils/httpStatusCodes.d.ts +0 -75
- package/lib/src/http/utils/httpStatusCodes.d.ts.map +0 -1
- package/lib/src/http/utils/httpStatusCodes.js +0 -1039
- package/lib/src/services/configInjector.d.ts +0 -21
- package/lib/src/services/configInjector.d.ts.map +0 -1
- package/lib/src/services/configInjector.js +0 -90
- package/lib/src/services/index.d.ts +0 -5
- package/lib/src/services/index.d.ts.map +0 -1
- package/lib/src/services/index.js +0 -4
- package/lib/src/services/interfaces/baseService.d.ts +0 -15
- package/lib/src/services/interfaces/baseService.d.ts.map +0 -1
- package/lib/src/services/interfaces/baseService.js +0 -1
- package/lib/src/services/types/configInjector.types.d.ts +0 -25
- package/lib/src/services/types/configInjector.types.d.ts.map +0 -1
- package/lib/src/services/types/configInjector.types.js +0 -6
- package/lib/src/services/types/entityManager.types.d.ts +0 -4
- package/lib/src/services/types/entityManager.types.d.ts.map +0 -1
- package/lib/src/services/types/entityManager.types.js +0 -1
- package/lib/tests/configInjector.test.d.ts +0 -2
- package/lib/tests/configInjector.test.d.ts.map +0 -1
- package/lib/tests/configInjector.test.js +0 -105
- package/lib/tests/dtoMapper.test.d.ts +0 -2
- package/lib/tests/dtoMapper.test.d.ts.map +0 -1
- package/lib/tests/dtoMapper.test.js +0 -170
- package/lib/tests/expressLikeRouterInstantiation.test.d.ts +0 -2
- package/lib/tests/expressLikeRouterInstantiation.test.d.ts.map +0 -1
- package/lib/tests/expressLikeRouterInstantiation.test.js +0 -118
- package/lib/tests/http.middleware.test.d.ts +0 -2
- package/lib/tests/http.middleware.test.d.ts.map +0 -1
- package/lib/tests/http.middleware.test.js +0 -102
- package/lib/tests/openApiV3Generator.test.d.ts +0 -2
- package/lib/tests/openApiV3Generator.test.d.ts.map +0 -1
- package/lib/tests/openApiV3Generator.test.js +0 -66
- package/lib/tests/redisTtlCache.test.d.ts +0 -2
- package/lib/tests/redisTtlCache.test.d.ts.map +0 -1
- package/lib/tests/redisTtlCache.test.js +0 -49
- package/lib/tests/typedHandler.test.d.ts +0 -2
- package/lib/tests/typedHandler.test.d.ts.map +0 -1
- package/lib/tests/typedHandler.test.js +0 -3
- package/lib/vitest.config.d.ts +0 -3
- package/lib/vitest.config.d.ts.map +0 -1
- package/lib/vitest.config.js +0 -7
@@ -1,483 +0,0 @@
|
|
1
|
-
import { isConstrainedForklaunchRouter } from '../guards/isConstrainedForklaunchRouter';
|
2
|
-
import { isExpressLikeSchemaHandler } from '../guards/isExpressLikeSchemaHandler';
|
3
|
-
import { isForklaunchExpressLikeRouter } from '../guards/isForklaunchExpressLikeRouter';
|
4
|
-
import { isForklaunchRouter } from '../guards/isForklaunchRouter';
|
5
|
-
import { isHttpContractDetails } from '../guards/isHttpContractDetails';
|
6
|
-
import { isPathParamHttpContractDetails } from '../guards/isPathParamContractDetails';
|
7
|
-
import { isTypedHandler } from '../guards/isTypedHandler';
|
8
|
-
import { parseRequestAuth } from '../middleware/request/auth.middleware';
|
9
|
-
import { cors } from '../middleware/request/cors.middleware';
|
10
|
-
import { createContext } from '../middleware/request/createContext.middleware';
|
11
|
-
import { enrichDetails } from '../middleware/request/enrichDetails.middleware';
|
12
|
-
import { parse } from '../middleware/request/parse.middleware';
|
13
|
-
/**
|
14
|
-
* A class that represents an Express-like router.
|
15
|
-
*/
|
16
|
-
export class ForklaunchExpressLikeRouter {
|
17
|
-
schemaValidator;
|
18
|
-
internal;
|
19
|
-
requestHandler;
|
20
|
-
routers = [];
|
21
|
-
routes = [];
|
22
|
-
basePath;
|
23
|
-
constructor(basePath, schemaValidator, internal) {
|
24
|
-
this.schemaValidator = schemaValidator;
|
25
|
-
this.internal = internal;
|
26
|
-
this.basePath = basePath;
|
27
|
-
this.internal.use(createContext(this.schemaValidator));
|
28
|
-
this.internal.use(cors);
|
29
|
-
}
|
30
|
-
/**
|
31
|
-
* Resolves middlewares based on the contract details.
|
32
|
-
*
|
33
|
-
* @param {PathParamHttpContractDetails<SV> | HttpContractDetails<SV>} contractDetails - The contract details.
|
34
|
-
* @returns {MiddlewareHandler<SV>[]} - The resolved middlewares.
|
35
|
-
*/
|
36
|
-
#resolveMiddlewares(contractDetails, requestSchema, responseSchemas) {
|
37
|
-
return [
|
38
|
-
enrichDetails(contractDetails, requestSchema, responseSchemas),
|
39
|
-
parse,
|
40
|
-
(parseRequestAuth)
|
41
|
-
];
|
42
|
-
}
|
43
|
-
/**
|
44
|
-
* Parses and runs the controller handler with error handling.
|
45
|
-
*
|
46
|
-
* @template P - The type of request parameters.
|
47
|
-
* @template ResBodyMap - The type of response body.
|
48
|
-
* @template ReqBody - The type of request body.
|
49
|
-
* @template ReqQuery - The type of request query.
|
50
|
-
* @template LocalsObj - The type of local variables.
|
51
|
-
* @template StatusCode - The type of status code.
|
52
|
-
* @param {MiddlewareHandler<SV, P, ResBodyMap | string, ReqBody, ReqQuery, LocalsObj, StatusCode>} requestHandler - The request handler.
|
53
|
-
* @returns {ExpressMiddlewareHandler} - The Express request handler.
|
54
|
-
*/
|
55
|
-
#parseAndRunControllerHandler(requestHandler) {
|
56
|
-
return async (req, res, next) => {
|
57
|
-
if (!requestHandler) {
|
58
|
-
throw new Error('Controller handler is not defined');
|
59
|
-
}
|
60
|
-
try {
|
61
|
-
await requestHandler(req, res, next);
|
62
|
-
}
|
63
|
-
catch (error) {
|
64
|
-
next?.(error);
|
65
|
-
console.error(error);
|
66
|
-
if (!res.headersSent) {
|
67
|
-
res.status(500).send('Internal Server Error');
|
68
|
-
}
|
69
|
-
}
|
70
|
-
};
|
71
|
-
}
|
72
|
-
/**
|
73
|
-
* Extracts the controller handler from the provided handlers.
|
74
|
-
*
|
75
|
-
* @template P - The type of request parameters.
|
76
|
-
* @template ResBodyMap - The type of response body.
|
77
|
-
* @template ReqBody - The type of request body.
|
78
|
-
* @template ReqQuery - The type of request query.
|
79
|
-
* @template LocalsObj - The type of local variables.
|
80
|
-
* @param {MiddlewareHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The provided handlers.
|
81
|
-
* @returns {MiddlewareHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>} - The extracted controller handler.
|
82
|
-
* @throws {Error} - Throws an error if the last argument is not a handler.
|
83
|
-
*/
|
84
|
-
#extractControllerHandler(handlers) {
|
85
|
-
const controllerHandler = handlers.pop();
|
86
|
-
if (typeof controllerHandler !== 'function') {
|
87
|
-
throw new Error(`Last argument must be a handler, received: ${controllerHandler}`);
|
88
|
-
}
|
89
|
-
return controllerHandler;
|
90
|
-
}
|
91
|
-
#compile(contractDetails) {
|
92
|
-
const schemaValidator = this.schemaValidator;
|
93
|
-
const requestSchema = schemaValidator.compile(schemaValidator.schemify({
|
94
|
-
...(contractDetails.params ? { params: contractDetails.params } : {}),
|
95
|
-
...(contractDetails.requestHeaders
|
96
|
-
? { headers: contractDetails.requestHeaders }
|
97
|
-
: {}),
|
98
|
-
...(contractDetails.query ? { query: contractDetails.query } : {}),
|
99
|
-
...(isHttpContractDetails(contractDetails) && contractDetails.body
|
100
|
-
? { body: contractDetails.body }
|
101
|
-
: {})
|
102
|
-
}));
|
103
|
-
const responseEntries = {
|
104
|
-
400: schemaValidator.string,
|
105
|
-
401: schemaValidator.string,
|
106
|
-
403: schemaValidator.string,
|
107
|
-
404: schemaValidator.string,
|
108
|
-
500: schemaValidator.string,
|
109
|
-
...(isPathParamHttpContractDetails(contractDetails) ||
|
110
|
-
isHttpContractDetails(contractDetails)
|
111
|
-
? { ...contractDetails.responses }
|
112
|
-
: {})
|
113
|
-
};
|
114
|
-
const responseSchemas = {
|
115
|
-
responses: {},
|
116
|
-
...(contractDetails.responseHeaders
|
117
|
-
? {
|
118
|
-
headers: schemaValidator.compile(schemaValidator.schemify(contractDetails.responseHeaders))
|
119
|
-
}
|
120
|
-
: {})
|
121
|
-
};
|
122
|
-
Object.entries(responseEntries).forEach(([code, responseShape]) => {
|
123
|
-
responseSchemas.responses[Number(code)] = schemaValidator.compile(schemaValidator.schemify(responseShape));
|
124
|
-
});
|
125
|
-
return {
|
126
|
-
requestSchema,
|
127
|
-
responseSchemas
|
128
|
-
};
|
129
|
-
}
|
130
|
-
/**
|
131
|
-
* Executes request locally, applying parameters
|
132
|
-
*
|
133
|
-
* @param handlers {ExpressLikeHandler<SV>}
|
134
|
-
* @param controllerHandler
|
135
|
-
* @returns
|
136
|
-
*/
|
137
|
-
#localParamRequest(handlers, controllerHandler) {
|
138
|
-
return async (route, request) => {
|
139
|
-
let statusCode;
|
140
|
-
let responseMessage;
|
141
|
-
const responseHeaders = {};
|
142
|
-
const req = {
|
143
|
-
params: request?.params ?? {},
|
144
|
-
query: request?.query ?? {},
|
145
|
-
headers: request?.headers ?? {},
|
146
|
-
body: request?.body ?? {},
|
147
|
-
path: route
|
148
|
-
};
|
149
|
-
const res = {
|
150
|
-
status: (code) => {
|
151
|
-
statusCode = code;
|
152
|
-
return res;
|
153
|
-
},
|
154
|
-
send: (message) => {
|
155
|
-
responseMessage = message;
|
156
|
-
},
|
157
|
-
json: (body) => {
|
158
|
-
responseMessage = body;
|
159
|
-
},
|
160
|
-
jsonp: (body) => {
|
161
|
-
responseMessage = body;
|
162
|
-
},
|
163
|
-
setHeader: (key, value) => {
|
164
|
-
responseHeaders[key] = value;
|
165
|
-
}
|
166
|
-
};
|
167
|
-
let cursor = handlers.shift();
|
168
|
-
if (cursor) {
|
169
|
-
for (const fn of handlers) {
|
170
|
-
await cursor(req, res, (err) => {
|
171
|
-
if (err) {
|
172
|
-
throw err;
|
173
|
-
}
|
174
|
-
cursor = fn;
|
175
|
-
});
|
176
|
-
}
|
177
|
-
await cursor(req, res, async (err) => {
|
178
|
-
if (err) {
|
179
|
-
throw err;
|
180
|
-
}
|
181
|
-
});
|
182
|
-
}
|
183
|
-
const cHandler = controllerHandler;
|
184
|
-
await cHandler(req, res, (err) => {
|
185
|
-
if (err) {
|
186
|
-
throw err;
|
187
|
-
}
|
188
|
-
});
|
189
|
-
return {
|
190
|
-
code: statusCode,
|
191
|
-
response: responseMessage,
|
192
|
-
headers: responseHeaders
|
193
|
-
};
|
194
|
-
};
|
195
|
-
}
|
196
|
-
registerRoute(method, path, registrationMethod, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareAndTypedHandler) {
|
197
|
-
// in this case, we know that the first argument is the typedHandler. As a result, we only use defined handlers
|
198
|
-
if (isTypedHandler(contractDetailsOrMiddlewareOrTypedHandler)) {
|
199
|
-
const { contractDetails, handlers } = contractDetailsOrMiddlewareOrTypedHandler;
|
200
|
-
return this.registerRoute(method, path, registrationMethod, contractDetails, ...handlers);
|
201
|
-
}
|
202
|
-
// in this case, we test for the last element of the handlers. If typed handler, break this down
|
203
|
-
else {
|
204
|
-
const maybeTypedHandler = middlewareOrMiddlewareAndTypedHandler[middlewareOrMiddlewareAndTypedHandler.length - 1];
|
205
|
-
if (isTypedHandler(maybeTypedHandler)) {
|
206
|
-
const { contractDetails, handlers } = maybeTypedHandler;
|
207
|
-
return this.registerRoute(method, path, registrationMethod, contractDetails, ...middlewareOrMiddlewareAndTypedHandler.concat(handlers));
|
208
|
-
}
|
209
|
-
else {
|
210
|
-
if (isExpressLikeSchemaHandler(contractDetailsOrMiddlewareOrTypedHandler) ||
|
211
|
-
isTypedHandler(contractDetailsOrMiddlewareOrTypedHandler)) {
|
212
|
-
throw new Error('Contract details are not defined');
|
213
|
-
}
|
214
|
-
const contractDetails = contractDetailsOrMiddlewareOrTypedHandler;
|
215
|
-
const handlers = middlewareOrMiddlewareAndTypedHandler.filter((handler) => isExpressLikeSchemaHandler(handler));
|
216
|
-
if (!isHttpContractDetails(contractDetails) &&
|
217
|
-
!isPathParamHttpContractDetails(contractDetails)) {
|
218
|
-
throw new Error('Contract details are malformed for route definition');
|
219
|
-
}
|
220
|
-
this.routes.push({
|
221
|
-
basePath: this.basePath,
|
222
|
-
path,
|
223
|
-
method,
|
224
|
-
contractDetails
|
225
|
-
});
|
226
|
-
const { requestSchema, responseSchemas } = this.#compile(contractDetails);
|
227
|
-
const controllerHandler = this.#extractControllerHandler(handlers);
|
228
|
-
registrationMethod.bind(this.internal)(path, ...this.#resolveMiddlewares(contractDetails, requestSchema, responseSchemas).concat(handlers), this.#parseAndRunControllerHandler(controllerHandler));
|
229
|
-
return this.#localParamRequest(handlers, controllerHandler);
|
230
|
-
}
|
231
|
-
}
|
232
|
-
}
|
233
|
-
#extractHandlers(handlers, processMiddleware) {
|
234
|
-
const last = handlers.pop();
|
235
|
-
let finalHandlers = last ? [last] : [];
|
236
|
-
if (isTypedHandler(last)) {
|
237
|
-
finalHandlers = last.handlers;
|
238
|
-
}
|
239
|
-
handlers.forEach((handler) => {
|
240
|
-
if (isTypedHandler(handler)) {
|
241
|
-
throw new Error('Only the last argument supplied to this function can be a typed handler. Please use only middleware.');
|
242
|
-
}
|
243
|
-
});
|
244
|
-
const middleware = processMiddleware
|
245
|
-
? handlers.map(processMiddleware)
|
246
|
-
: handlers;
|
247
|
-
return [...middleware, ...finalHandlers];
|
248
|
-
}
|
249
|
-
#extractMiddlewareFromEnrichedTypedHandlerArray(handlers) {
|
250
|
-
return this.#extractHandlers(handlers);
|
251
|
-
}
|
252
|
-
#extractNestableMiddlewareFromEnrichedTypedHandlerArray(handlers) {
|
253
|
-
return this.#extractHandlers(handlers, (handler) => isForklaunchExpressLikeRouter(handler)
|
254
|
-
? handler.internal
|
255
|
-
: handler);
|
256
|
-
}
|
257
|
-
#processTypedHandlerOrMiddleware(handler, middleware) {
|
258
|
-
if (isTypedHandler(handler)) {
|
259
|
-
middleware.push(...handler.handlers);
|
260
|
-
}
|
261
|
-
else if (isExpressLikeSchemaHandler(handler)) {
|
262
|
-
middleware.push(handler);
|
263
|
-
}
|
264
|
-
}
|
265
|
-
#extractMiddlewareAsRouterHandlers(contractDetailsOrMiddlewareOrTypedHandler, middlewareOrMiddlewareWithTypedHandler) {
|
266
|
-
const middleware = [];
|
267
|
-
this.#processTypedHandlerOrMiddleware(contractDetailsOrMiddlewareOrTypedHandler, middleware);
|
268
|
-
middleware.push(...this.#extractMiddlewareFromEnrichedTypedHandlerArray(middlewareOrMiddlewareWithTypedHandler));
|
269
|
-
return middleware;
|
270
|
-
}
|
271
|
-
#extractNestableMiddlewareAsRouterHandlers(contractDetailsOrMiddlewareOrTypedHandler, middlewareOrMiddlewareWithTypedHandler) {
|
272
|
-
const middleware = [];
|
273
|
-
this.#processTypedHandlerOrMiddleware(contractDetailsOrMiddlewareOrTypedHandler, middleware);
|
274
|
-
if (isForklaunchExpressLikeRouter(contractDetailsOrMiddlewareOrTypedHandler)) {
|
275
|
-
middleware.push(contractDetailsOrMiddlewareOrTypedHandler.internal);
|
276
|
-
}
|
277
|
-
middleware.push(...this.#extractNestableMiddlewareFromEnrichedTypedHandlerArray(middlewareOrMiddlewareWithTypedHandler));
|
278
|
-
return middleware;
|
279
|
-
}
|
280
|
-
registerMiddlewareHandler(registrationMethod, pathOrContractDetailsOrMiddlewareOrTypedHandler, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) {
|
281
|
-
const middleware = [];
|
282
|
-
if (typeof pathOrContractDetailsOrMiddlewareOrTypedHandler === 'string') {
|
283
|
-
middleware.push(...this.#extractMiddlewareAsRouterHandlers(contractDetailsOrMiddlewareOrTypedHandler, middlewareOrMiddlewareWithTypedHandler));
|
284
|
-
const path = pathOrContractDetailsOrMiddlewareOrTypedHandler;
|
285
|
-
registrationMethod.bind(this.internal)(path, ...middleware);
|
286
|
-
}
|
287
|
-
else {
|
288
|
-
middleware.push(...this.#extractMiddlewareAsRouterHandlers(pathOrContractDetailsOrMiddlewareOrTypedHandler, (isExpressLikeSchemaHandler(contractDetailsOrMiddlewareOrTypedHandler) ||
|
289
|
-
isTypedHandler(contractDetailsOrMiddlewareOrTypedHandler)
|
290
|
-
? [contractDetailsOrMiddlewareOrTypedHandler]
|
291
|
-
: []).concat(middlewareOrMiddlewareWithTypedHandler)));
|
292
|
-
registrationMethod.bind(this.internal)(...middleware);
|
293
|
-
}
|
294
|
-
return this;
|
295
|
-
}
|
296
|
-
registerNestableMiddlewareHandler(registrationMethod, pathOrContractDetailsOrMiddlewareOrTypedHandler, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) {
|
297
|
-
const middleware = [];
|
298
|
-
let path;
|
299
|
-
if (typeof pathOrContractDetailsOrMiddlewareOrTypedHandler === 'string') {
|
300
|
-
middleware.push(...this.#extractNestableMiddlewareAsRouterHandlers(contractDetailsOrMiddlewareOrTypedHandler, middlewareOrMiddlewareWithTypedHandler));
|
301
|
-
path = pathOrContractDetailsOrMiddlewareOrTypedHandler;
|
302
|
-
}
|
303
|
-
else {
|
304
|
-
if (isConstrainedForklaunchRouter(pathOrContractDetailsOrMiddlewareOrTypedHandler)) {
|
305
|
-
path = pathOrContractDetailsOrMiddlewareOrTypedHandler.basePath;
|
306
|
-
}
|
307
|
-
middleware.push(...this.#extractNestableMiddlewareAsRouterHandlers(pathOrContractDetailsOrMiddlewareOrTypedHandler, (isExpressLikeSchemaHandler(contractDetailsOrMiddlewareOrTypedHandler) ||
|
308
|
-
isTypedHandler(contractDetailsOrMiddlewareOrTypedHandler) ||
|
309
|
-
isConstrainedForklaunchRouter(contractDetailsOrMiddlewareOrTypedHandler)
|
310
|
-
? [contractDetailsOrMiddlewareOrTypedHandler]
|
311
|
-
: []).concat(middlewareOrMiddlewareWithTypedHandler)));
|
312
|
-
}
|
313
|
-
if (path) {
|
314
|
-
registrationMethod.bind(this.internal)(path, ...middleware);
|
315
|
-
}
|
316
|
-
else {
|
317
|
-
registrationMethod.bind(this.internal)(...middleware);
|
318
|
-
}
|
319
|
-
return this;
|
320
|
-
}
|
321
|
-
use = (pathOrContractDetailsOrMiddlewareOrTypedHandler, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
322
|
-
[
|
323
|
-
pathOrContractDetailsOrMiddlewareOrTypedHandler,
|
324
|
-
contractDetailsOrMiddlewareOrTypedHandler,
|
325
|
-
...middlewareOrMiddlewareWithTypedHandler
|
326
|
-
].forEach((arg) => {
|
327
|
-
if (isForklaunchRouter(arg)) {
|
328
|
-
this.routers.push(arg);
|
329
|
-
}
|
330
|
-
});
|
331
|
-
return this.registerNestableMiddlewareHandler(this.internal.use, pathOrContractDetailsOrMiddlewareOrTypedHandler, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler);
|
332
|
-
};
|
333
|
-
all = (pathOrContractDetailsOrMiddlewareOrTypedHandler, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
334
|
-
return this.registerMiddlewareHandler(this.internal.all, pathOrContractDetailsOrMiddlewareOrTypedHandler, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler);
|
335
|
-
};
|
336
|
-
connect = (pathOrContractDetailsOrMiddlewareOrTypedHandler, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
337
|
-
return this.registerMiddlewareHandler(this.internal.connect, pathOrContractDetailsOrMiddlewareOrTypedHandler, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler);
|
338
|
-
};
|
339
|
-
/**
|
340
|
-
* Registers a GET route with the specified contract details and handler handlers.
|
341
|
-
*
|
342
|
-
* @template P - The type of request parameters.
|
343
|
-
* @template ResBodyMap - The type of response body.
|
344
|
-
* @template ReqBody - The type of request body.
|
345
|
-
* @template ReqQuery - The type of request query.
|
346
|
-
* @template LocalsObj - The type of local variables.
|
347
|
-
* @param {string} path - The path for the route.
|
348
|
-
* @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.
|
349
|
-
* @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.
|
350
|
-
* @returns {ExpressRouter} - The Express router.
|
351
|
-
*/
|
352
|
-
get = (path, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
353
|
-
return {
|
354
|
-
get: this.registerRoute('get', path, this.internal.get, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler)
|
355
|
-
};
|
356
|
-
};
|
357
|
-
/**
|
358
|
-
* Registers a POST route with the specified contract details and handler handlers.
|
359
|
-
*
|
360
|
-
* @template P - The type of request parameters.
|
361
|
-
* @template ResBodyMap - The type of response body.
|
362
|
-
* @template ReqBody - The type of request body.
|
363
|
-
* @template ReqQuery - The type of request query.
|
364
|
-
* @template LocalsObj - The type of local variables.
|
365
|
-
* @param {string} path - The path for the route.
|
366
|
-
* @param {HttpContractDetails<SV, P, ResBodyMap, ReqBody, ReqQuery>} contractDetails - The contract details.
|
367
|
-
* @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.
|
368
|
-
* @returns {ExpressRouter} - The Expxwress router.
|
369
|
-
*/
|
370
|
-
post = (path, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
371
|
-
return {
|
372
|
-
post: this.registerRoute('post', path, this.internal.post, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler)
|
373
|
-
};
|
374
|
-
};
|
375
|
-
/**
|
376
|
-
* Registers a PUT route with the specified contract details and handler handlers.
|
377
|
-
*
|
378
|
-
* @template P - The type of request parameters.
|
379
|
-
* @template ResBodyMap - The type of response body.
|
380
|
-
* @template ReqBody - The type of request body.
|
381
|
-
* @template ReqQuery - The type of request query.
|
382
|
-
* @template LocalsObj - The type of local variables.
|
383
|
-
* @param {string} path - The path for the route.
|
384
|
-
* @param {HttpContractDetails<SV, P, ResBodyMap, ReqBody, ReqQuery>} contractDetails - The contract details.
|
385
|
-
* @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.
|
386
|
-
* @returns {ExpressRouter} - The Express router.
|
387
|
-
*/
|
388
|
-
put = (path, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
389
|
-
return {
|
390
|
-
put: this.registerRoute('put', path, this.internal.put, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler)
|
391
|
-
};
|
392
|
-
};
|
393
|
-
/**
|
394
|
-
* Registers a PATCH route with the specified contract details and handler handlers.
|
395
|
-
*
|
396
|
-
* @template P - The type of request parameters.
|
397
|
-
* @template ResBodyMap - The type of response body.
|
398
|
-
* @template ReqBody - The type of request body.
|
399
|
-
* @template ReqQuery - The type of request query.
|
400
|
-
* @template LocalsObj - The type of local variables.
|
401
|
-
* @param {string} path - The path for the route.
|
402
|
-
* @param {HttpContractDetails<SV, P, ResBodyMap, ReqBody, ReqQuery>} contractDetails - The contract details.
|
403
|
-
* @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.
|
404
|
-
* @returns {ExpressRouter} - The Express router.
|
405
|
-
*/
|
406
|
-
patch = (path, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
407
|
-
return {
|
408
|
-
patch: this.registerRoute('patch', path, this.internal.patch, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler)
|
409
|
-
};
|
410
|
-
};
|
411
|
-
/**
|
412
|
-
* Registers a DELETE route with the specified contract details and handler handlers.
|
413
|
-
*
|
414
|
-
* @template P - The type of request parameters.
|
415
|
-
* @template ResBodyMap - The type of response body.
|
416
|
-
* @template ReqBody - The type of request body.
|
417
|
-
* @template ReqQuery - The type of request query.
|
418
|
-
* @template LocalsObj - The type of local variables.
|
419
|
-
* @param {string} path - The path for the route.
|
420
|
-
* @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.
|
421
|
-
* @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.
|
422
|
-
* @returns {ExpressRouter} - The Express router.
|
423
|
-
*/
|
424
|
-
delete = (path, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
425
|
-
return {
|
426
|
-
delete: this.registerRoute('delete', path, this.internal.delete, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler)
|
427
|
-
};
|
428
|
-
};
|
429
|
-
/**
|
430
|
-
* Registers a OPTIONS route with the specified contract details and handler handlers.
|
431
|
-
*
|
432
|
-
* @template P - The type of request parameters.
|
433
|
-
* @template ResBodyMap - The type of response body.
|
434
|
-
* @template ReqBody - The type of request body.
|
435
|
-
* @template ReqQuery - The type of request query.
|
436
|
-
* @template LocalsObj - The type of local variables.
|
437
|
-
* @param {string} path - The path for the route.
|
438
|
-
* @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.
|
439
|
-
* @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.
|
440
|
-
* @returns {ExpressRouter} - The Express router.
|
441
|
-
*/
|
442
|
-
options = (path, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
443
|
-
return {
|
444
|
-
options: this.registerRoute('options', path, this.internal.options, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler)
|
445
|
-
};
|
446
|
-
};
|
447
|
-
/**
|
448
|
-
* Registers a HEAD route with the specified contract details and handler handlers.
|
449
|
-
*
|
450
|
-
* @template P - The type of request parameters.
|
451
|
-
* @template ResBodyMap - The type of response body.
|
452
|
-
* @template ReqBody - The type of request body.
|
453
|
-
* @template ReqQuery - The type of request query.
|
454
|
-
* @template LocalsObj - The type of local variables.
|
455
|
-
* @param {string} path - The path for the route.
|
456
|
-
* @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.
|
457
|
-
* @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.
|
458
|
-
* @returns {ExpressRouter} - The Express router.
|
459
|
-
*/
|
460
|
-
head = (path, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
461
|
-
return {
|
462
|
-
head: this.registerRoute('head', path, this.internal.head, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler)
|
463
|
-
};
|
464
|
-
};
|
465
|
-
/**
|
466
|
-
* Registers a TRACE route with the specified contract details and handler handlers.
|
467
|
-
*
|
468
|
-
* @template P - The type of request parameters.
|
469
|
-
* @template ResBodyMap - The type of response body.
|
470
|
-
* @template ReqBody - The type of request body.
|
471
|
-
* @template ReqQuery - The type of request query.
|
472
|
-
* @template LocalsObj - The type of local variables.
|
473
|
-
* @param {string} path - The path for the route.
|
474
|
-
* @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.
|
475
|
-
* @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.
|
476
|
-
* @returns {ExpressRouter} - The Express router.
|
477
|
-
*/
|
478
|
-
trace = (path, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler) => {
|
479
|
-
return {
|
480
|
-
trace: this.registerRoute('trace', path, this.internal.trace, contractDetailsOrMiddlewareOrTypedHandler, ...middlewareOrMiddlewareWithTypedHandler)
|
481
|
-
};
|
482
|
-
};
|
483
|
-
}
|