@forklaunch/core 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/http/index.ts","../../src/http/middleware/request/cors.middleware.ts","../../src/http/middleware/request/createContext.middleware.ts","../../src/http/telemetry/constants.ts","../../src/http/guards/isForklaunchRouter.ts","../../src/http/guards/isConstrainedForklaunchRouter.ts","../../src/http/guards/isExpressLikeSchemaHandler.ts","../../src/http/guards/isForklaunchExpressLikeRouter.ts","../../src/http/guards/isPathParamContractDetails.ts","../../src/http/guards/isHttpContractDetails.ts","../../src/http/guards/isTypedHandler.ts","../../src/http/middleware/request/auth.middleware.ts","../../src/http/middleware/request/enrichDetails.middleware.ts","../../src/http/middleware/request/parse.middleware.ts","../../src/http/guards/isResponseShape.ts","../../src/http/router/expressLikeRouter.ts","../../src/http/application/expressLikeApplication.ts","../../src/http/guards/isForklaunchRequest.ts","../../src/http/guards/isPath.ts","../../src/http/handlers/typedHandler.ts","../../src/http/handlers/delete.ts","../../src/http/handlers/get.ts","../../src/http/handlers/head.ts","../../src/http/handlers/middleware.ts","../../src/http/handlers/options.ts","../../src/http/handlers/patch.ts","../../src/http/handlers/post.ts","../../src/http/handlers/put.ts","../../src/http/handlers/trace.ts","../../src/http/httpStatusCodes.ts","../../src/http/middleware/response/parse.middleware.ts","../../src/http/telemetry/pinoLogger.ts","../../src/http/telemetry/recordMetric.ts","../../src/services/configInjector.ts","../../src/services/getEnvVar.ts","../../src/http/telemetry/openTelemetryCollector.ts","../../src/http/middleware/response/enrichExpressLikeSend.middleware.ts","../../src/http/openApiV3Generator/openApiV3Generator.ts","../../src/http/telemetry/metricsDefinition.ts"],"sourcesContent":["export * from './application/expressLikeApplication';\nexport * from './guards/isForklaunchRequest';\nexport * from './guards/isForklaunchRouter';\nexport * from './handlers/delete';\nexport * from './handlers/get';\nexport * from './handlers/head';\nexport * from './handlers/middleware';\nexport * from './handlers/options';\nexport * from './handlers/patch';\nexport * from './handlers/post';\nexport * from './handlers/put';\nexport * from './handlers/trace';\nexport * from './handlers/typedHandler';\nexport * from './httpStatusCodes';\nexport * from './interfaces/expressLikeRouter.interface';\nexport * from './middleware/response/enrichExpressLikeSend.middleware';\nexport * from './openApiV3Generator/openApiV3Generator';\nexport * from './router/expressLikeRouter';\nexport * from './telemetry/constants';\nexport * from './telemetry/metricsDefinition';\nexport * from './telemetry/openTelemetryCollector';\nexport * from './telemetry/pinoLogger';\nexport * from './telemetry/recordMetric';\nexport * from './types/apiDefinition.types';\nexport * from './types/contractDetails.types';\nexport * from './types/expressLikeRouter.types';\nexport * from './types/openTelemetryCollector.types';\nexport * from './types/router.types';\nexport * from './types/typedHandler.types';\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport corsMiddleware from 'cors';\nimport { ParsedQs } from 'qs';\nimport {\n ForklaunchNextFunction,\n ForklaunchRequest,\n ForklaunchResHeaders,\n ForklaunchResponse\n} from '../../types/apiDefinition.types';\nimport { ParamsDictionary } from '../../types/contractDetails.types';\n\n/**\n * Cors middleware handler\n *\n * @param req - Express-like request object\n * @param res - Express-like response object\n * @param next - Express-like next function\n */\nexport function cors<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n res: ForklaunchResponse<\n ResBodyMap,\n ForklaunchResHeaders & ResHeaders,\n LocalsObj\n >,\n next?: ForklaunchNextFunction\n) {\n if (req.method === 'OPTIONS') {\n res.cors = true;\n }\n corsMiddleware()(req, res, next ?? (() => {}));\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { trace } from '@opentelemetry/api';\nimport { v4 } from 'uuid';\nimport { ATTR_CORRELATION_ID } from '../../telemetry/constants';\nimport {\n ExpressLikeSchemaHandler,\n ForklaunchNextFunction\n} from '../../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../../types/contractDetails.types';\n\n/**\n * Middleware to create and add a request context.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Request - A type that extends ForklaunchRequest.\n * @template Response - A type that extends ForklaunchResponse.\n * @template NextFunction - A type that extends ForklaunchNextFunction.\n * @param {SV} schemaValidator - The schema validator.\n * @returns {Function} - Middleware function to create request context.\n */\nexport function createContext<\n SV extends AnySchemaValidator,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n>(\n schemaValidator: SV\n): ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n unknown,\n unknown,\n ForklaunchNextFunction\n> {\n return function setContext(req, res, next?) {\n req.schemaValidator = schemaValidator;\n\n let correlationId = v4();\n\n if (req.headers['x-correlation-id']) {\n correlationId = req.headers['x-correlation-id'];\n }\n\n res.setHeader('x-correlation-id', correlationId);\n\n req.context = {\n correlationId: correlationId\n };\n\n const span = trace.getActiveSpan();\n if (span != null) {\n req.context.span = span;\n req.context.span?.setAttribute(ATTR_CORRELATION_ID, correlationId);\n }\n\n next?.();\n };\n}\n","import {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVICE_NAME\n} from '@opentelemetry/semantic-conventions';\n\nexport const ATTR_API_NAME = 'api.name';\nexport const ATTR_CORRELATION_ID = 'correlation.id';\n\nexport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVICE_NAME\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ForklaunchRouter } from '../types/router.types';\n\nexport function isForklaunchRouter<SV extends AnySchemaValidator>(\n maybeForklaunchRouter: unknown\n): maybeForklaunchRouter is ForklaunchRouter<SV> {\n return (\n maybeForklaunchRouter != null &&\n typeof maybeForklaunchRouter === 'object' &&\n 'basePath' in maybeForklaunchRouter &&\n 'routes' in maybeForklaunchRouter &&\n Array.isArray(maybeForklaunchRouter.routes)\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ConstrainedForklaunchRouter } from '../types/router.types';\nimport { isForklaunchRouter } from './isForklaunchRouter';\n\nexport function isConstrainedForklaunchRouter<\n SV extends AnySchemaValidator,\n RouterHandler\n>(\n maybeForklaunchExpressLikeRouter: unknown\n): maybeForklaunchExpressLikeRouter is ConstrainedForklaunchRouter<\n SV,\n RouterHandler\n> {\n return (\n isForklaunchRouter<SV>(maybeForklaunchExpressLikeRouter) &&\n 'requestHandler' in maybeForklaunchExpressLikeRouter\n );\n}\n","import { extractArgumentNames } from '@forklaunch/common';\nimport { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\n\nexport function isExpressLikeSchemaHandler<\n SV extends AnySchemaValidator,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n middleware: unknown\n): middleware is ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n const extractedArgumentNames =\n typeof middleware === 'function' &&\n new Set(\n extractArgumentNames(middleware).map((argumentName) =>\n argumentName.toLowerCase()\n )\n );\n return extractedArgumentNames && extractedArgumentNames.size <= 3;\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeRouter } from '../interfaces/expressLikeRouter.interface';\nimport { ForklaunchExpressLikeRouter } from '../router/expressLikeRouter';\nimport { isConstrainedForklaunchRouter } from './isConstrainedForklaunchRouter';\n\nexport function isForklaunchExpressLikeRouter<\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n RouterHandler,\n Internal extends ExpressLikeRouter<RouterHandler, Internal>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n maybeForklaunchExpressLikeRouter: unknown\n): maybeForklaunchExpressLikeRouter is ForklaunchExpressLikeRouter<\n SV,\n Path,\n RouterHandler,\n Internal,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n return (\n isConstrainedForklaunchRouter<SV, RouterHandler>(\n maybeForklaunchExpressLikeRouter\n ) &&\n 'basePath' in maybeForklaunchExpressLikeRouter &&\n 'internal' in maybeForklaunchExpressLikeRouter\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport {\n ExtractedParamsObject,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\n\nexport function isPathParamHttpContractDetails<\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n ParamsSchema extends ExtractedParamsObject<Path> & ParamsObject<SV>,\n ResponseSchemas extends ResponsesObject<SV>,\n QuerySchema extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>\n>(\n maybePathParamHttpContractDetails: unknown\n): maybePathParamHttpContractDetails is PathParamHttpContractDetails<\n SV,\n Path,\n ParamsSchema,\n ResponseSchemas,\n QuerySchema,\n ReqHeaders,\n ResHeaders\n> {\n return (\n maybePathParamHttpContractDetails != null &&\n typeof maybePathParamHttpContractDetails === 'object' &&\n 'name' in maybePathParamHttpContractDetails &&\n 'summary' in maybePathParamHttpContractDetails &&\n 'responses' in maybePathParamHttpContractDetails &&\n maybePathParamHttpContractDetails.name != null &&\n maybePathParamHttpContractDetails.summary != null &&\n maybePathParamHttpContractDetails.responses != null\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport {\n Body,\n ExtractedParamsObject,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { isPathParamHttpContractDetails } from './isPathParamContractDetails';\n\n/**\n * Type guard for HttpContractDetails\n */\nexport function isHttpContractDetails<\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n ParamsSchema extends ExtractedParamsObject<Path> & ParamsObject<SV>,\n ResponseSchemas extends ResponsesObject<SV>,\n BodySchema extends Body<SV>,\n QuerySchema extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>\n>(\n maybeContractDetails: unknown\n): maybeContractDetails is HttpContractDetails<\n SV,\n Path,\n ParamsSchema,\n ResponseSchemas,\n BodySchema,\n QuerySchema,\n ReqHeaders,\n ResHeaders\n> {\n return (\n isPathParamHttpContractDetails(maybeContractDetails) &&\n 'body' in maybeContractDetails &&\n maybeContractDetails.body != null\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\n\nimport {\n Body,\n HeadersObject,\n Method,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { TypedHandler } from '../types/typedHandler.types';\n\nexport function isTypedHandler<\n SV extends AnySchemaValidator,\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n maybeTypedHandler: unknown\n): maybeTypedHandler is TypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n return (\n maybeTypedHandler != null &&\n typeof maybeTypedHandler === 'object' &&\n '_typedHandler' in maybeTypedHandler &&\n maybeTypedHandler._typedHandler === true\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { jwtVerify } from 'jose';\nimport { ParsedQs } from 'qs';\nimport {\n ForklaunchNextFunction,\n ForklaunchResponse,\n MapParamsSchema,\n MapReqBodySchema,\n MapReqHeadersSchema,\n MapReqQuerySchema,\n MapResBodyMapSchema,\n MapResHeadersSchema,\n ResolvedForklaunchRequest\n} from '../../types/apiDefinition.types';\nimport {\n AuthMethods,\n Body,\n HeadersObject,\n ParamsDictionary,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../../types/contractDetails.types';\n\nconst invalidAuthorizationTokenFormat = [\n 401,\n 'Invalid Authorization token format.'\n] as const;\nconst invalidAuthorizationSubject = [\n 403,\n 'Invalid Authorization subject.'\n] as const;\nconst invalidAuthorizationTokenPermissions = [\n 403,\n 'Invalid Authorization permissions.'\n] as const;\nconst invalidAuthorizationTokenRoles = [\n 403,\n 'Invalid Authorization roles.'\n] as const;\nconst invalidAuthorizationToken = [\n 403,\n 'Invalid Authorization token.'\n] as const;\nconst invalidAuthorizationLogin = [\n 403,\n 'Invalid Authorization login.'\n] as const;\n\n/**\n * Checks the authorization token for validity.\n *\n * @param {AuthMethod} [authorizationMethod] - The method of authorization.\n * @param {string} [authorizationToken] - The authorization string.\n * @returns {Promise<[401 | 403, string] | string | undefined>} - The result of the authorization check.\n */\nasync function checkAuthorizationToken<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>\n>(\n authorizationMethod: AuthMethods<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n authorizationToken?: string,\n req?: ResolvedForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders, unknown>\n): Promise<readonly [401 | 403 | 500, string] | undefined> {\n if (authorizationToken == null) {\n return [401, 'No Authorization token provided.'];\n }\n\n const [tokenPrefix, token] = authorizationToken.split(' ');\n\n let resourceId;\n\n switch (authorizationMethod.method) {\n case 'jwt': {\n if (tokenPrefix !== 'Bearer') {\n return invalidAuthorizationTokenFormat;\n }\n\n try {\n const decodedJwt = await jwtVerify(\n token,\n new TextEncoder().encode(\n // TODO: Check this at application startup if there is any route with jwt checking\n process.env.JWT_SECRET\n )\n );\n\n if (!decodedJwt.payload.sub) {\n return invalidAuthorizationSubject;\n }\n\n resourceId = decodedJwt.payload.sub;\n } catch (error) {\n // TODO: Log error\n console.error(error);\n return invalidAuthorizationToken;\n }\n\n break;\n }\n case 'basic': {\n if (authorizationToken !== 'Basic') {\n return invalidAuthorizationTokenFormat;\n }\n\n const [username, password] = Buffer.from(token, 'base64')\n .toString('utf-8')\n .split(':');\n\n if (!username || !password) {\n return invalidAuthorizationTokenFormat;\n }\n\n if (!authorizationMethod.login(username, password)) {\n return invalidAuthorizationLogin;\n }\n\n resourceId = username;\n break;\n }\n case 'other':\n if (tokenPrefix !== authorizationMethod.tokenPrefix) {\n return invalidAuthorizationTokenFormat;\n }\n\n resourceId = authorizationMethod.decodeResource(token);\n\n break;\n }\n\n if (\n authorizationMethod.allowedPermissions ||\n authorizationMethod.forbiddenPermissions\n ) {\n if (!authorizationMethod.mapPermissions) {\n return [500, 'No permission mapping function provided.'];\n }\n\n const resourcePermissions = await authorizationMethod.mapPermissions(\n resourceId,\n req\n );\n\n if (authorizationMethod.allowedPermissions) {\n if (\n resourcePermissions.intersection(authorizationMethod.allowedPermissions)\n .size === 0\n ) {\n return invalidAuthorizationTokenPermissions;\n }\n }\n\n if (authorizationMethod.forbiddenPermissions) {\n if (\n resourcePermissions.intersection(\n authorizationMethod.forbiddenPermissions\n ).size !== 0\n ) {\n return invalidAuthorizationTokenPermissions;\n }\n }\n }\n\n if (authorizationMethod.allowedRoles || authorizationMethod.forbiddenRoles) {\n if (!authorizationMethod.mapRoles) {\n return [500, 'No role mapping function provided.'];\n }\n\n const resourceRoles = await authorizationMethod.mapRoles(resourceId, req);\n\n if (authorizationMethod.allowedRoles) {\n if (\n resourceRoles.intersection(authorizationMethod.allowedRoles).size === 0\n ) {\n return invalidAuthorizationTokenRoles;\n }\n }\n\n if (authorizationMethod.forbiddenRoles) {\n if (\n resourceRoles.intersection(authorizationMethod.forbiddenRoles).size !==\n 0\n ) {\n return invalidAuthorizationTokenRoles;\n }\n }\n }\n\n return [401, 'Invalid Authorization method.'];\n}\n\n/**\n * Middleware to parse request authorization.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Request - A type that extends ForklaunchRequest.\n * @template Response - A type that extends ForklaunchResponse.\n * @template NextFunction - A type that extends ForklaunchNextFunction.\n * @param {Request} req - The request object.\n * @param {Response} res - The response object.\n * @param {NextFunction} [next] - The next middleware function.\n */\nexport async function parseRequestAuth<\n SV extends AnySchemaValidator,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ResolvedForklaunchRequest<\n SV,\n MapParamsSchema<SV, P>,\n MapReqBodySchema<SV, ReqBody>,\n MapReqQuerySchema<SV, ReqQuery>,\n MapReqHeadersSchema<SV, ReqHeaders>,\n unknown\n >,\n res: ForklaunchResponse<\n MapResBodyMapSchema<SV, ResBodyMap>,\n MapResHeadersSchema<SV, ResHeaders>,\n LocalsObj\n >,\n next?: ForklaunchNextFunction\n) {\n const auth = req.contractDetails.auth as AuthMethods<\n SV,\n MapParamsSchema<SV, P>,\n MapReqBodySchema<SV, ReqBody>,\n MapReqQuerySchema<SV, ReqQuery>,\n MapReqHeadersSchema<SV, ReqHeaders>\n >;\n\n if (auth) {\n const [error, message] =\n (await checkAuthorizationToken<\n SV,\n MapParamsSchema<SV, P>,\n MapReqBodySchema<SV, ReqBody>,\n MapReqQuerySchema<SV, ReqQuery>,\n MapReqHeadersSchema<SV, ReqHeaders>\n >(\n auth,\n req.headers[\n (auth.method === 'other' ? auth.headerName : undefined) ??\n 'Authorization'\n ],\n req\n )) ?? [];\n if (error != null) {\n res.status(error).send(message);\n next?.(new Error(message));\n }\n }\n\n next?.();\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ATTR_API_NAME } from '../../telemetry/constants';\nimport {\n ExpressLikeSchemaHandler,\n ForklaunchNextFunction\n} from '../../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponseCompiledSchema,\n ResponsesObject\n} from '../../types/contractDetails.types';\n\n/**\n * Middleware to enrich the request details with contract details.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Request - A type that extends ForklaunchRequest.\n * @template Response - A type that extends ForklaunchResponse.\n * @template NextFunction - A type that extends ForklaunchNextFunction.\n * @param {PathParamHttpContractDetails<SV> | HttpContractDetails<SV>} contractDetails - The contract details.\n * @returns {Function} - Middleware function to enrich request details.\n */\nexport function enrichDetails<\n SV extends AnySchemaValidator,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n>(\n path: string,\n contractDetails: HttpContractDetails<SV> | PathParamHttpContractDetails<SV>,\n requestSchema: unknown,\n responseSchemas: ResponseCompiledSchema\n): ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n unknown,\n unknown,\n ForklaunchNextFunction\n> {\n return (req, res, next?) => {\n req.originalPath = path;\n req.contractDetails = contractDetails;\n req.requestSchema = requestSchema;\n res.responseSchemas = responseSchemas;\n\n req.context.span?.setAttribute(ATTR_API_NAME, req.contractDetails?.name);\n next?.();\n };\n}\n","import {\n AnySchemaValidator,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\nimport { isResponseShape } from '../../guards/isResponseShape';\nimport {\n ForklaunchNextFunction,\n ForklaunchRequest,\n ForklaunchResponse\n} from '../../types/apiDefinition.types';\nimport { ParamsDictionary } from '../../types/contractDetails.types';\n\n/**\n * Pre-handler function to parse and validate input.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Request - A type that extends ForklaunchRequest.\n * @template Response - A type that extends ForklaunchResponse.\n * @template NextFunction - A type that extends ForklaunchNextFunction.\n * @param {Request} req - The request object.\n * @param {Response} res - The response object.\n * @param {NextFunction} [next] - The next middleware function.\n */\nexport function parse<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n _res: ForklaunchResponse<ResBodyMap, ResHeaders, LocalsObj>,\n next?: ForklaunchNextFunction\n) {\n const request = {\n params: req.params,\n query: req.query,\n headers: req.headers,\n body: req.body\n };\n\n const parsedRequest = (req.schemaValidator as SchemaValidator).parse(\n req.requestSchema,\n request\n );\n\n if (\n parsedRequest.ok &&\n isResponseShape<P, ReqHeaders, ReqQuery, ReqBody>(parsedRequest.value)\n ) {\n req.body = parsedRequest.value.body;\n req.params = parsedRequest.value.params;\n req.query = parsedRequest.value.query;\n req.headers = parsedRequest.value.headers;\n }\n if (!parsedRequest.ok) {\n switch (req.contractDetails.options?.requestValidation) {\n default:\n case 'error':\n next?.(\n new Error(prettyPrintParseErrors(parsedRequest.errors, 'Request'))\n );\n break;\n case 'warning':\n console.warn(prettyPrintParseErrors(parsedRequest.errors, 'Request'));\n break;\n case 'none':\n break;\n }\n }\n\n next?.();\n}\n","import { ResponseShape } from '../types/apiDefinition.types';\n\nexport function isResponseShape<Params, Headers, Query, Body>(\n maybeResponseShape: object | undefined\n): maybeResponseShape is ResponseShape<Params, Headers, Query, Body> {\n return (\n maybeResponseShape != null &&\n 'body' in maybeResponseShape &&\n 'query' in maybeResponseShape &&\n 'params' in maybeResponseShape &&\n 'headers' in maybeResponseShape\n );\n}\n","import { AnySchemaValidator, SchemaValidator } from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\n\nimport { RemoveTrailingSlash } from '@forklaunch/common';\nimport { isConstrainedForklaunchRouter } from '../guards/isConstrainedForklaunchRouter';\nimport { isExpressLikeSchemaHandler } from '../guards/isExpressLikeSchemaHandler';\nimport { isForklaunchExpressLikeRouter } from '../guards/isForklaunchExpressLikeRouter';\nimport { isForklaunchRouter } from '../guards/isForklaunchRouter';\nimport { isHttpContractDetails } from '../guards/isHttpContractDetails';\nimport { isPathParamHttpContractDetails } from '../guards/isPathParamContractDetails';\nimport { isTypedHandler } from '../guards/isTypedHandler';\nimport {\n ExpressLikeRouter,\n NestableRouterBasedHandler,\n PathBasedHandler,\n PathOrMiddlewareBasedHandler\n} from '../interfaces/expressLikeRouter.interface';\nimport { parseRequestAuth } from '../middleware/request/auth.middleware';\nimport { enrichDetails } from '../middleware/request/enrichDetails.middleware';\nimport { parse } from '../middleware/request/parse.middleware';\nimport {\n ExpressLikeHandler,\n ExpressLikeSchemaHandler,\n LiveTypeFunction\n} from '../types/apiDefinition.types';\nimport {\n Body,\n ContractDetails,\n HeadersObject,\n HttpContractDetails,\n Method,\n ParamsDictionary,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponseCompiledSchema,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport {\n ContractDetailsOrMiddlewareOrTypedHandler,\n LiveTypeRouteDefinition,\n MiddlewareOrMiddlewareWithTypedHandler,\n TypedMiddlewareDefinition,\n TypedNestableMiddlewareDefinition\n} from '../types/expressLikeRouter.types';\nimport {\n ConstrainedForklaunchRouter,\n ForklaunchRoute,\n ForklaunchRouter\n} from '../types/router.types';\n\n/**\n * A class that represents an Express-like router.\n */\nexport class ForklaunchExpressLikeRouter<\n SV extends AnySchemaValidator,\n BasePath extends `/${string}`,\n RouterHandler,\n Internal extends ExpressLikeRouter<RouterHandler, Internal>,\n BaseRequest,\n BaseResponse,\n NextFunction\n> implements ConstrainedForklaunchRouter<SV, RouterHandler>\n{\n requestHandler!: RouterHandler;\n routers: ForklaunchRouter<SV>[] = [];\n readonly routes: ForklaunchRoute<SV>[] = [];\n readonly basePath: BasePath;\n\n constructor(\n basePath: BasePath,\n readonly schemaValidator: SV,\n readonly internal: Internal\n ) {\n this.basePath = basePath;\n }\n\n /**\n * Resolves middlewares based on the contract details.\n *\n * @param {PathParamHttpContractDetails<SV> | HttpContractDetails<SV>} contractDetails - The contract details.\n * @returns {MiddlewareHandler<SV>[]} - The resolved middlewares.\n */\n #resolveMiddlewares<\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: string,\n contractDetails: HttpContractDetails<SV> | PathParamHttpContractDetails<SV>,\n requestSchema: unknown,\n responseSchemas: ResponseCompiledSchema\n ): ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[] {\n return [\n enrichDetails<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n `${this.basePath}${path}`,\n contractDetails,\n requestSchema,\n responseSchemas\n ),\n parse,\n parseRequestAuth<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >\n ] as ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[];\n }\n\n /**\n * Parses and runs the controller handler with error handling.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @template StatusCode - The type of status code.\n * @param {MiddlewareHandler<SV, P, ResBodyMap | string, ReqBody, ReqQuery, LocalsObj, StatusCode>} requestHandler - The request handler.\n * @returns {ExpressMiddlewareHandler} - The Express request handler.\n */\n #parseAndRunControllerHandler<\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n >(\n requestHandler: ExpressLikeHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n ): ExpressLikeHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n > {\n return async (req, res, next) => {\n if (!requestHandler) {\n throw new Error('Controller handler is not defined');\n }\n\n try {\n await requestHandler(req, res, next);\n } catch (error) {\n if (next && typeof next === 'function') {\n next(error as Error);\n } else {\n throw error;\n }\n }\n };\n }\n\n /**\n * Extracts the controller handler from the provided handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {MiddlewareHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The provided handlers.\n * @returns {MiddlewareHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>} - The extracted controller handler.\n * @throws {Error} - Throws an error if the last argument is not a handler.\n */\n #extractControllerHandler<\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n >(\n handlers: ExpressLikeHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ): ExpressLikeHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n > {\n const controllerHandler = handlers.pop();\n\n if (typeof controllerHandler !== 'function') {\n throw new Error(\n `Last argument must be a handler, received: ${controllerHandler}`\n );\n }\n\n return controllerHandler;\n }\n\n #compile<\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>\n >(\n contractDetails: ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >\n ) {\n const schemaValidator = this.schemaValidator as SchemaValidator;\n\n const requestSchema = schemaValidator.compile(\n schemaValidator.schemify({\n ...(contractDetails.params ? { params: contractDetails.params } : {}),\n ...(contractDetails.requestHeaders\n ? { headers: contractDetails.requestHeaders }\n : {}),\n ...(contractDetails.query ? { query: contractDetails.query } : {}),\n ...(isHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >(contractDetails) && contractDetails.body != null\n ? { body: contractDetails.body }\n : {})\n })\n );\n\n const responseEntries = {\n 400: schemaValidator.string,\n 401: schemaValidator.string,\n 403: schemaValidator.string,\n 404: schemaValidator.string,\n 500: schemaValidator.string,\n ...(isPathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >(contractDetails) ||\n isHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >(contractDetails)\n ? {\n ...contractDetails.responses\n }\n : {})\n };\n\n const responseSchemas: ResponseCompiledSchema = {\n responses: {},\n ...(contractDetails.responseHeaders\n ? {\n headers: schemaValidator.compile(\n schemaValidator.schemify(contractDetails.responseHeaders)\n )\n }\n : {})\n };\n Object.entries(responseEntries).forEach(([code, responseShape]) => {\n responseSchemas.responses[Number(code)] = schemaValidator.compile(\n schemaValidator.schemify(responseShape)\n );\n });\n\n return {\n requestSchema,\n responseSchemas\n };\n }\n\n /**\n * Executes request locally, applying parameters\n *\n * @param handlers {ExpressLikeHandler<SV>}\n * @param controllerHandler\n * @returns\n */\n #localParamRequest<Middleware, Route extends string>(\n handlers: Middleware[],\n controllerHandler: Middleware\n ) {\n return async (\n route: RemoveTrailingSlash<Route>,\n request?: {\n params?: Record<string, string>;\n query?: Record<string, string>;\n headers?: Record<string, string>;\n body?: Record<string, unknown>;\n }\n ) => {\n let statusCode;\n let responseMessage;\n const responseHeaders: Record<string, string> = {};\n\n const req = {\n params: request?.params ?? {},\n query: request?.query ?? {},\n headers: request?.headers ?? {},\n body: request?.body ?? {},\n path: route\n };\n\n const res = {\n status: (code: number) => {\n statusCode = code;\n return res;\n },\n send: (message: string) => {\n responseMessage = message;\n },\n json: (body: Record<string, unknown>) => {\n responseMessage = body;\n },\n jsonp: (body: Record<string, unknown>) => {\n responseMessage = body;\n },\n setHeader: (key: string, value: string) => {\n responseHeaders[key] = value;\n }\n };\n\n let cursor = handlers.shift() as unknown as (\n req_: typeof req,\n resp_: typeof res,\n next: (err?: Error) => Promise<void> | void\n ) => Promise<void> | void;\n\n if (cursor) {\n for (const fn of handlers) {\n await cursor(req, res, (err?: Error) => {\n if (err) {\n throw err;\n }\n\n cursor = fn as unknown as (\n req_: typeof req,\n resp_: typeof res,\n next: (err?: Error) => Promise<void> | void\n ) => Promise<void> | void;\n });\n }\n await cursor(req, res, async (err?: Error) => {\n if (err) {\n throw err;\n }\n });\n }\n\n const cHandler = controllerHandler as unknown as (\n req_: typeof req,\n resp_: typeof res,\n next: (err?: Error) => Promise<void> | void\n ) => void;\n await cHandler(req, res, (err?: Error) => {\n if (err) {\n throw err;\n }\n });\n\n return {\n code: statusCode,\n response: responseMessage,\n headers: responseHeaders\n };\n };\n }\n\n registerRoute<\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n method: ContractMethod,\n path: Path,\n registrationMethod: PathBasedHandler<RouterHandler>,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareAndTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ): LiveTypeFunction<\n SV,\n `${BasePath}${Path}`,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n > {\n // in this case, we know that the first argument is the typedHandler. As a result, we only use defined handlers\n if (\n isTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler)\n ) {\n const { contractDetails, handlers } =\n contractDetailsOrMiddlewareOrTypedHandler;\n return this.registerRoute<\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n method,\n path,\n registrationMethod,\n contractDetails,\n ...handlers\n ) as unknown as LiveTypeFunction<\n SV,\n `${BasePath}${Path}`,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >;\n }\n // in this case, we test for the last element of the handlers. If typed handler, break this down\n else {\n const maybeTypedHandler =\n middlewareOrMiddlewareAndTypedHandler[\n middlewareOrMiddlewareAndTypedHandler.length - 1\n ];\n if (\n isTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(maybeTypedHandler)\n ) {\n const { contractDetails, handlers } = maybeTypedHandler;\n return this.registerRoute<\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n method,\n path,\n registrationMethod,\n contractDetails,\n ...middlewareOrMiddlewareAndTypedHandler.concat(handlers)\n ) as unknown as LiveTypeFunction<\n SV,\n `${BasePath}${Path}`,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >;\n } else {\n if (\n isExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler) ||\n isTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler)\n ) {\n throw new Error('Contract details are not defined');\n }\n const contractDetails = contractDetailsOrMiddlewareOrTypedHandler;\n\n const handlers = (\n middlewareOrMiddlewareAndTypedHandler as unknown[]\n ).filter((handler) =>\n isExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(handler)\n );\n\n if (\n !isHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >(contractDetails) &&\n !isPathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >(contractDetails)\n ) {\n throw new Error(\n 'Contract details are malformed for route definition'\n );\n }\n\n this.routes.push({\n basePath: this.basePath,\n path,\n method,\n contractDetails: contractDetails as PathParamHttpContractDetails<SV>\n });\n\n const { requestSchema, responseSchemas } = this.#compile<\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >(contractDetails);\n\n const controllerHandler = this.#extractControllerHandler(handlers);\n\n registrationMethod.bind(this.internal)(\n path,\n ...(this.#resolveMiddlewares<\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n path,\n contractDetails as PathParamHttpContractDetails<SV>,\n requestSchema,\n responseSchemas\n ).concat(handlers) as RouterHandler[]),\n this.#parseAndRunControllerHandler(controllerHandler) as RouterHandler\n );\n\n return this.#localParamRequest(\n handlers,\n controllerHandler\n ) as LiveTypeFunction<\n SV,\n `${BasePath}${Path}`,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >;\n }\n }\n }\n\n #extractHandlers<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n ArrayReturnType\n >(\n handlers: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n )[],\n processMiddleware?: (handler: unknown) => RouterHandler | Internal\n ) {\n const last = handlers.pop();\n let finalHandlers = last ? [last] : [];\n if (\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(last)\n ) {\n finalHandlers = last.handlers;\n }\n\n handlers.forEach((handler) => {\n if (\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(handler)\n ) {\n throw new Error(\n 'Only the last argument supplied to this function can be a typed handler. Please use only middleware.'\n );\n }\n });\n\n const middleware = processMiddleware\n ? handlers.map(processMiddleware)\n : (handlers as ArrayReturnType[]);\n\n return [...middleware, ...finalHandlers] as ArrayReturnType[];\n }\n\n #extractMiddlewareFromEnrichedTypedHandlerArray<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n handlers: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) {\n return this.#extractHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n RouterHandler\n >(handlers);\n }\n\n #extractNestableMiddlewareFromEnrichedTypedHandlerArray<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n handlers: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n )[]\n ) {\n return this.#extractHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n RouterHandler | Internal\n >(handlers, (handler) =>\n isForklaunchExpressLikeRouter<\n SV,\n Path,\n RouterHandler,\n Internal,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(handler)\n ? handler.internal\n : (handler as RouterHandler)\n );\n }\n\n #processTypedHandlerOrMiddleware<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n handler:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | undefined,\n middleware: RouterHandler[]\n ) {\n if (\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(handler)\n ) {\n middleware.push(...(handler.handlers as RouterHandler[]));\n } else if (isExpressLikeSchemaHandler(handler)) {\n middleware.push(handler as RouterHandler);\n }\n }\n\n #extractMiddlewareAsRouterHandlers<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n contractDetailsOrMiddlewareOrTypedHandler:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | undefined,\n middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) {\n const middleware: RouterHandler[] = [];\n\n this.#processTypedHandlerOrMiddleware<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(contractDetailsOrMiddlewareOrTypedHandler, middleware);\n\n middleware.push(\n ...this.#extractMiddlewareFromEnrichedTypedHandlerArray<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(middlewareOrMiddlewareWithTypedHandler)\n );\n\n return middleware;\n }\n\n #extractNestableMiddlewareAsRouterHandlers<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n contractDetailsOrMiddlewareOrTypedHandler:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n | undefined,\n middlewareOrMiddlewareWithTypedHandler: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n )[]\n ) {\n const middleware: (RouterHandler | Internal)[] = [];\n\n this.#processTypedHandlerOrMiddleware<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n contractDetailsOrMiddlewareOrTypedHandler as ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n middleware as RouterHandler[]\n );\n\n if (\n isForklaunchExpressLikeRouter<\n SV,\n Path,\n RouterHandler,\n Internal,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler)\n ) {\n middleware.push(contractDetailsOrMiddlewareOrTypedHandler.internal);\n }\n\n middleware.push(\n ...this.#extractNestableMiddlewareFromEnrichedTypedHandlerArray<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(middlewareOrMiddlewareWithTypedHandler)\n );\n\n return middleware;\n }\n\n registerMiddlewareHandler<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n registrationMethod: PathOrMiddlewareBasedHandler<RouterHandler>,\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n contractDetailsOrMiddlewareOrTypedHandler?: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ): this {\n const middleware: RouterHandler[] = [];\n\n if (typeof pathOrContractDetailsOrMiddlewareOrTypedHandler === 'string') {\n middleware.push(\n ...this.#extractMiddlewareAsRouterHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n contractDetailsOrMiddlewareOrTypedHandler,\n middlewareOrMiddlewareWithTypedHandler\n )\n );\n const path = pathOrContractDetailsOrMiddlewareOrTypedHandler;\n registrationMethod.bind(this.internal)(path, ...middleware);\n } else {\n middleware.push(\n ...this.#extractMiddlewareAsRouterHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n (isExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler) ||\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler)\n ? [contractDetailsOrMiddlewareOrTypedHandler]\n : []\n ).concat(middlewareOrMiddlewareWithTypedHandler)\n )\n );\n registrationMethod.bind(this.internal)(...middleware);\n }\n return this;\n }\n\n registerNestableMiddlewareHandler<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n registrationMethod: NestableRouterBasedHandler<RouterHandler, Internal>,\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>,\n contractDetailsOrMiddlewareOrTypedHandler?:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>,\n ...middlewareOrMiddlewareWithTypedHandler: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n )[]\n ): this {\n const middleware: (RouterHandler | Internal)[] = [];\n let path: `/${string}` | undefined;\n\n if (typeof pathOrContractDetailsOrMiddlewareOrTypedHandler === 'string') {\n middleware.push(\n ...this.#extractNestableMiddlewareAsRouterHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n contractDetailsOrMiddlewareOrTypedHandler,\n middlewareOrMiddlewareWithTypedHandler\n )\n );\n path = pathOrContractDetailsOrMiddlewareOrTypedHandler;\n } else {\n if (\n isConstrainedForklaunchRouter<SV, RouterHandler>(\n pathOrContractDetailsOrMiddlewareOrTypedHandler\n )\n ) {\n path = pathOrContractDetailsOrMiddlewareOrTypedHandler.basePath;\n }\n middleware.push(\n ...this.#extractNestableMiddlewareAsRouterHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n (isExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler) ||\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler) ||\n isConstrainedForklaunchRouter<SV, RouterHandler>(\n contractDetailsOrMiddlewareOrTypedHandler\n )\n ? [contractDetailsOrMiddlewareOrTypedHandler]\n : []\n ).concat(middlewareOrMiddlewareWithTypedHandler)\n )\n );\n }\n\n if (path) {\n registrationMethod.bind(this.internal)(path, ...middleware);\n } else {\n registrationMethod.bind(this.internal)(...middleware);\n }\n return this;\n }\n\n use: TypedNestableMiddlewareDefinition<\n this,\n RouterHandler,\n Internal,\n SV,\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n Subpath extends `/${string}`,\n Router extends ForklaunchExpressLikeRouter<\n SV,\n Subpath,\n RouterHandler,\n Internal,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | Router,\n contractDetailsOrMiddlewareOrTypedHandler?:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | Router,\n ...middlewareOrMiddlewareWithTypedHandler: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | Router\n )[]\n ) => {\n [\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n ].forEach((arg) => {\n if (isForklaunchRouter<SV>(arg)) {\n this.routers.push(arg);\n }\n });\n\n return this.registerNestableMiddlewareHandler<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n this.internal.use,\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n );\n };\n\n all: TypedMiddlewareDefinition<\n this,\n SV,\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n contractDetailsOrMiddlewareOrTypedHandler?: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return this.registerMiddlewareHandler<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n this.internal.all,\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n );\n };\n\n connect: TypedMiddlewareDefinition<\n this,\n SV,\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n contractDetailsOrMiddlewareOrTypedHandler?: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return this.registerMiddlewareHandler<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n this.internal.connect,\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n );\n };\n\n /**\n * Registers a GET route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n get: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'get',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'get',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'get',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n get: this.registerRoute<\n 'get',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'get',\n path,\n this.internal.get,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a POST route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {HttpContractDetails<SV, P, ResBodyMap, ReqBody, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Expxwress router.\n */\n post: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'post',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'post',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'post',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n post: this.registerRoute<\n 'post',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'post',\n path,\n this.internal.post,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a PUT route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {HttpContractDetails<SV, P, ResBodyMap, ReqBody, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n put: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'put',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'put',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'put',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n put: this.registerRoute<\n 'put',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'put',\n path,\n this.internal.put,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a PATCH route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {HttpContractDetails<SV, P, ResBodyMap, ReqBody, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n patch: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'patch',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'patch',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'patch',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n patch: this.registerRoute<\n 'patch',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'patch',\n path,\n this.internal.patch,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a DELETE route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n delete: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'delete',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'delete',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'delete',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n delete: this.registerRoute<\n 'delete',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'delete',\n path,\n this.internal.delete,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a OPTIONS route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n options: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'options',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'options',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'options',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n options: this.registerRoute<\n 'options',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'options',\n path,\n this.internal.options,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a HEAD route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n head: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'head',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'head',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'head',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n head: this.registerRoute<\n 'head',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'head',\n path,\n this.internal.head,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a TRACE route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n trace: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'trace',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'trace',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'trace',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n trace: this.registerRoute<\n 'trace',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'trace',\n path,\n this.internal.trace,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeRouter } from '../interfaces/expressLikeRouter.interface';\nimport { cors } from '../middleware/request/cors.middleware';\nimport { createContext } from '../middleware/request/createContext.middleware';\nimport { ForklaunchExpressLikeRouter } from '../router/expressLikeRouter';\n\n/**\n * ForklaunchExpressLikeApplication class that sets up routes and middleware for an Express-like application, for use with controller/routes pattern.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Server - The server type.\n */\nexport abstract class ForklaunchExpressLikeApplication<\n SV extends AnySchemaValidator,\n Server extends ExpressLikeRouter<RouterHandler, Server>,\n RouterHandler,\n BaseRequest,\n BaseResponse,\n NextFunction\n> extends ForklaunchExpressLikeRouter<\n SV,\n '/',\n RouterHandler,\n Server,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n /**\n * Creates an instance of the Application class.\n *\n * @param {SV} schemaValidator - The schema validator.\n */\n constructor(\n readonly schemaValidator: SV,\n readonly internal: Server\n ) {\n super('/', schemaValidator, internal);\n\n this.internal.use(createContext(this.schemaValidator) as RouterHandler);\n this.internal.use(cors as RouterHandler);\n }\n\n abstract listen(...args: unknown[]): void;\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\nimport { ForklaunchRequest } from '../types/apiDefinition.types';\nimport { ParamsDictionary } from '../types/contractDetails.types';\n\nexport function isForklaunchRequest<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>\n>(\n request: unknown\n): request is ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders> {\n return (\n request != null &&\n typeof request === 'object' &&\n 'contractDetails' in request\n );\n}\n","export function isPath<Path extends `/${string}`>(path: string): path is Path {\n return path.startsWith('/');\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { isPath } from '../guards/isPath';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n ContractDetails,\n HeadersObject,\n Method,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { ExpressLikeTypedHandler } from '../types/typedHandler.types';\n\n/**\n * Router class that sets up routes and middleware for an Express router, for use with controller/routes pattern.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template contractDetails - The contract details.\n * @template handlers - The handler middlware and handler.\n */\nexport function typedHandler<\n SV extends AnySchemaValidator,\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n _path: Path | undefined,\n _contractMethod: ContractMethod,\n contractDetails: ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n): ExpressLikeTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n>;\nexport function typedHandler<\n SV extends AnySchemaValidator,\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n _contractMethod: ContractMethod,\n contractDetails: ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n): ExpressLikeTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n>;\nexport function typedHandler<\n SV extends AnySchemaValidator,\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n pathOrContractMethod: Path | ContractMethod,\n contractMethodOrContractDetails:\n | ContractMethod\n | ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n contractDetailsOrHandler:\n | ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >\n | ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...handlerArray: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n): ExpressLikeTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n // TODO: Clean this up with guards\n\n let contractDetails: ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >;\n let handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[];\n // If path is not provided\n if (typeof contractMethodOrContractDetails === 'string') {\n if (typeof contractDetailsOrHandler !== 'function') {\n contractDetails = contractDetailsOrHandler;\n } else {\n throw new Error('Invalid definition for contract details');\n }\n handlers = handlerArray;\n }\n // If path is provided\n else {\n contractDetails = contractMethodOrContractDetails;\n if (typeof contractDetailsOrHandler === 'function') {\n handlers = [contractDetailsOrHandler, ...handlerArray];\n } else {\n throw new Error('Invalid definition for handler');\n }\n }\n return {\n _typedHandler: true as const,\n _path: isPath<Path>(pathOrContractMethod)\n ? pathOrContractMethod\n : undefined,\n contractDetails,\n handlers\n };\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const delete_ = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'delete',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'delete', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const get = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'get',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'get', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const head = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'head',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'head', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n MiddlewareContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const middleware = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: MiddlewareContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'middleware', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const options = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'options',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'options', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const patch = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: HttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'patch',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'patch', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const post = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: HttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'post',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'post', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const put = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: HttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'put',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'put', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const trace = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'trace',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'trace', contractDetails, ...handlers);\n};\n","/**\n * Object-map of the HTTP Status Codes. Maps from the status code, to the\n * textual name. The key is the HTTP Status Code number, and the resulting\n * value will be the textual name for that Status Code.\n *\n * The comments for each item are taken from httpstatuses.com and the RFC-7231\n * document.\n *\n * @see https://httpstatuses.com\n * @see https://datatracker.ietf.org/doc/html/rfc7231\n */\nexport const HTTPStatuses: Readonly<{ [key: number]: string }> = {\n /**\n * The initial part of a request has been received and has not yet been\n * rejected by the server. The server intends to send a final response after\n * the request has been fully received and acted upon.\n *\n * When the request contains an Expect header field that includes a\n * 100-continue expectation, the 100 response indicates that the server\n * wishes to receive the request payload body. The client ought to continue\n * sending the request and discard the 100 response.\n *\n * If the request did not contain an Expect header field containing the\n * 100-continue expectation, the client can simply discard this interim\n * response.\n */\n 100: 'Continue',\n\n /**\n * The server understands and is willing to comply with the client's request,\n * via the Upgrade header field, for a change in the application protocol\n * being used on this connection.\n *\n * The server MUST generate an Upgrade header field in the response that\n * indicates which protocol(s) will be switched to immediately after the\n * empty line that terminates the 101 response.\n *\n * It is assumed that the server will only agree to switch protocols when it\n * is advantageous to do so. For example, switching to a newer version of\n * HTTP might be advantageous over older versions, and switching to a\n * real-time, synchronous protocol might be advantageous when delivering\n * resources that use such features.\n */\n 101: 'Switching Protocols',\n\n /**\n * An interim response used to inform the client that the server has accepted\n * the complete request, but has not yet completed it.\n *\n * This status code SHOULD only be sent when the server has a reasonable\n * expectation that the request will take significant time to complete. As\n * guidance, if a method is taking longer than 20 seconds (a reasonable, but\n * arbitrary value) to process the server SHOULD return a 102 (Processing)\n * response. The server MUST send a final response after the request has been\n * completed.\n *\n * Methods can potentially take a long period of time to process, especially\n * methods that support the Depth header. In such cases the client may\n * time-out the connection while waiting for a response. To prevent this the\n * server may return a 102 Processing status code to indicate to the client\n * that the server is still processing the method.\n */\n 102: 'Processing',\n\n /**\n * The request has succeeded.\n *\n * Aside from responses to CONNECT, a 200 response always has a payload,\n * though an origin server MAY generate a payload body of zero length. If no\n * payload is desired, an origin server ought to send 204 No Content instead.\n * For CONNECT, no payload is allowed because the successful result is a\n * tunnel, which begins immediately after the 200 response header section.\n *\n * A 200 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n */\n 200: 'OK',\n\n /**\n * The request has been fulfilled and has resulted in one or more new\n * resources being created.\n *\n * The primary resource created by the request is identified by either a\n * Location header field in the response or, if no Location field is\n * received, by the effective request URI.\n *\n * The 201 response payload typically describes and links to the resource(s)\n * created. See Section 7.2 of RFC7231 for a discussion of the meaning and\n * purpose of validator header fields, such as ETag and Last-Modified, in a\n * 201 response.\n */\n 201: 'Created',\n\n /**\n * The request has been accepted for processing, but the processing has not\n * been completed. The request might or might not eventually be acted upon,\n * as it might be disallowed when processing actually takes place.\n *\n * There is no facility in HTTP for re-sending a status code from an\n * asynchronous operation.\n *\n * The 202 response is intentionally noncommittal. Its purpose is to allow a\n * server to accept a request for some other process (perhaps a\n * batch-oriented process that is only run once per day) without requiring\n * that the user agent's connection to the server persist until the process\n * is completed. The representation sent with this response ought to describe\n * the request's current status and point to (or embed) a status monitor that\n * can provide the user with an estimate of when the request will be\n * fulfilled.\n */\n 202: 'Accepted',\n\n /**\n * The request was successful but the enclosed payload has been modified from\n * that of the origin server's 200 OK response by a transforming proxy.\n *\n * This status code allows the proxy to notify recipients when a\n * transformation has been applied, since that knowledge might impact later\n * decisions regarding the content. For example, future cache validation\n * requests for the content might only be applicable along the same request\n * path (through the same proxies).\n *\n * The 203 response is similar to the Warning code of 214 Transformation\n * Applied, which has the advantage of being applicable to responses with any\n * status code.\n *\n * A 203 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n */\n 203: 'Non-authoritative Information',\n\n /**\n * The server has successfully fulfilled the request and that there is no\n * additional content to send in the response payload body.\n *\n * Metadata in the response header fields refer to the target resource and\n * its selected representation after the requested action was applied.\n *\n * A 204 response is terminated by the first empty line after the header\n * fields because it cannot contain a message body.\n *\n * A 204 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n */\n 204: 'No Content',\n\n /**\n * He server has fulfilled the request and desires that the user agent reset\n * the \"document view\", which caused the request to be sent, to its original\n * state as received from the origin server.\n *\n * This response is intended to support a common data entry use case where\n * the user receives content that supports data entry (a form, notepad,\n * canvas, etc.), enters or manipulates data in that space, causes the\n * entered data to be submitted in a request, and then the data entry\n * mechanism is reset for the next entry so that the user can easily\n * initiate another input action.\n *\n * Since the 205 status code implies that no additional content will be\n * provided, a server MUST NOT generate a payload in a 205 response. In\n * other words, a server MUST do one of the following for a 205 response: a)\n * indicate a zero-length body for the response by including a\n * Content-Length header field with a value of 0; b) indicate a zero-length\n * payload for the response by including a Transfer-Encoding header field\n * with a value of chunked and a message body consisting of a single chunk\n * of zero-length; or, c) close the connection immediately after sending the\n * blank line terminating the header section.\n */\n 205: 'Reset Content',\n\n /**\n * The server is successfully fulfilling a range request for the target\n * resource by transferring one or more parts of the selected representation\n * that correspond to the satisfiable ranges found in the request's Range\n * header field.\n *\n * If a single part is being transferred, the server generating the 206\n * response MUST generate a Content-Range header field, describing what range\n * of the selected representation is enclosed, and a payload consisting of\n * the range.\n *\n * If multiple parts are being transferred, the server generating the 206\n * response MUST generate a \"multipart/byteranges\" payload2, and a\n * Content-Type header field containing the multipart/byteranges media type\n * and its required boundary parameter. To avoid confusion with single-part\n * responses, a server MUST NOT generate a Content-Range header field in the\n * HTTP header section of a multiple part response (this field will be sent\n * in each part instead).\n *\n * Within the header area of each body part in the multipart payload, the\n * server MUST generate a Content-Range header field corresponding to the\n * range being enclosed in that body part. If the selected representation\n * would have had a Content-Type header field in a 200 OK response, the\n * server SHOULD generate that same Content-Type field in the header area of\n * each body part.\n *\n * When multiple ranges are requested, a server MAY coalesce any of the\n * ranges that overlap, or that are separated by a gap that is smaller than\n * the overhead of sending multiple parts, regardless of the order in which\n * the corresponding byte-range-spec appeared in the received Range header\n * field. Since the typical overhead between parts of a multipart/byteranges\n * payload is around 80 bytes, depending on the selected representation's\n * media type and the chosen boundary parameter length, it can be less\n * efficient to transfer many small disjoint parts than it is to transfer the\n * entire selected representation.\n *\n * A server MUST NOT generate a multipart response to a request for a single\n * range, since a client that does not request multiple parts might not\n * support multipart responses. However, a server MAY generate a\n * multipart/byteranges payload with only a single body part if multiple\n * ranges were requested and only one range was found to be satisfiable or\n * only one range remained after coalescing. A client that cannot process a\n * multipart/byteranges response MUST NOT generate a request that asks for\n * multiple ranges.\n *\n * When a multipart response payload is generated, the server SHOULD send the\n * parts in the same order that the corresponding byte-range-spec appeared in\n * the received Range header field, excluding those ranges that were deemed\n * unsatisfiable or that were coalesced into other ranges. A client that\n * receives a multipart response MUST inspect the Content-Range header field\n * present in each body part in order to determine which range is contained\n * in that body part; a client cannot rely on receiving the same ranges that\n * it requested, nor the same order that it requested.\n *\n * When a 206 response is generated, the server MUST generate the following\n * header fields, in addition to those required above, if the field would\n * have been sent in a 200 OK response to the same request: Date,\n * Cache-Control, ETag, Expires, Content-Location, and Vary.\n *\n * If a 206 is generated in response to a request with an If-Range header\n * field, the sender SHOULD NOT generate other representation header fields\n * beyond those required above, because the client is understood to already\n * have a prior response containing those header fields. Otherwise, the\n * sender MUST generate all of the representation header fields that would\n * have been sent in a 200 OK response to the same request.\n *\n * A 206 response is cacheable by default; i.e., unless otherwise indicated\n * by explicit cache controls.\n */\n 206: 'Partial Content',\n\n /**\n * A Multi-Status response conveys information about multiple resources in\n * situations where multiple status codes might be appropriate.\n *\n * The default Multi-Status response body is a text/xml or application/xml\n * HTTP entity with a 'multistatus' root element. Further elements contain\n * 200, 300, 400, and 500 series status codes generated during the method\n * invocation. 100 series status codes SHOULD NOT be recorded in a 'response'\n * XML element.\n *\n * Although '207' is used as the overall response status code, the recipient\n * needs to consult the contents of the multistatus response body for further\n * information about the success or failure of the method execution. The\n * response MAY be used in success, partial success and also in failure\n * situations.\n *\n * The 'multistatus' root element holds zero or more 'response' elements in\n * any order, each with information about an individual resource. Each\n * 'response' element MUST have an 'href' element to identify the resource.\n *\n * A Multi-Status response uses one out of two distinct formats for\n * representing the status:\n *\n * 1. A 'status' element as child of the 'response' element indicates the\n * status of the message execution for the identified resource as a whole.\n * Some method definitions provide information about specific status codes\n * clients should be prepared to see in a response. However, clients MUST be\n * able to handle other status codes, using the generic rules defined in\n * RFC2616 Section 10.\n *\n * 2. For PROPFIND and PROPPATCH, the format has been extended using the\n * 'propstat' element instead of 'status', providing information about\n * individual properties of a resource. This format is specific to PROPFIND\n * and PROPPATCH, and is described in detail in RFC4918 Section 9.1 and\n * RFC4918 Section 9.2.\n */\n 207: 'Multi-Status',\n\n /**\n * Used inside a DAV: propstat response element to avoid enumerating the\n * internal members of multiple bindings to the same collection repeatedly.\n *\n * For each binding to a collection inside the request's scope, only one will\n * be reported with a 200 status, while subsequent DAV:response elements for\n * all other bindings will use the 208 status, and no DAV:response elements\n * for their descendants are included.\n *\n * Note that the 208 status will only occur for \"Depth: infinity\" requests,\n * and that it is of particular importance when the multiple collection\n * bindings cause a bind loop.\n *\n * A client can request the DAV:resource-id property in a PROPFIND request to\n * guarantee that they can accurately reconstruct the binding structure of a\n * collection with multiple bindings to a single resource.\n *\n * For backward compatibility with clients not aware of the 208 status code\n * appearing in multistatus response bodies, it SHOULD NOT be used unless the\n * client has signaled support for this specification using the \"DAV\" request\n * header. Instead, a 508 Loop Detected status should be returned when a\n * binding loop is discovered. This allows the server to return the 508 as\n * the top-level return status, if it discovers it before it started the\n * response, or in the middle of a multistatus, if it discovers it in the\n * middle of streaming out a multistatus response.\n */\n 208: 'Already Reported',\n\n /**\n * The server has fulfilled a GET request for the resource, and the response\n * is a representation of the result of one or more instance-manipulations\n * applied to the current instance.\n *\n * The actual current instance might not be available except by combining\n * this response with other previous or future responses, as appropriate for\n * the specific instance-manipulation(s). If so, the headers of the resulting\n * instance are the result of combining the headers from the 226 response and\n * the other instances, following the rules in section 13.5.3 of the HTTP/1.1\n * specification.\n *\n * The request MUST have included an A-IM header field listing at least one\n * instance-manipulation. The response MUST include an Etag header field\n * giving the entity tag of the current instance.\n *\n * A response received with a status code of 226 MAY be stored by a cache and\n * used in reply to a subsequent request, subject to the HTTP expiration\n * mechanism and any Cache-Control headers, and to the requirements in\n * section 10.6.\n *\n * A response received with a status code of 226 MAY be used by a cache, in\n * conjunction with a cache entry for the base instance, to create a cache\n * entry for the current instance.\n */\n 226: 'IM Used',\n\n /**\n * The target resource has more than one representation, each with its own\n * more specific identifier, and information about the alternatives is being\n * provided so that the user (or user agent) can select a preferred\n * representation by redirecting its request to one or more of those\n * identifiers.\n *\n * In other words, the server desires that the user agent engage in reactive\n * negotiation to select the most appropriate representation(s) for its\n * needs.\n *\n * If the server has a preferred choice, the server SHOULD generate a\n * Location header field containing a preferred choice's URI reference. The\n * user agent MAY use the Location field value for automatic redirection.\n *\n * For request methods other than HEAD, the server SHOULD generate a payload\n * in the 300 response containing a list of representation metadata and URI\n * reference(s) from which the user or user agent can choose the one most\n * preferred. The user agent MAY make a selection from that list\n * automatically if it understands the provided media type. A specific format\n * for automatic selection is not defined by this specification because HTTP\n * tries to remain orthogonal to the definition of its payloads. In practice,\n * the representation is provided in some easily parsed format believed to be\n * acceptable to the user agent, as determined by shared design or content\n * negotiation, or in some commonly accepted hypertext format.\n *\n * A 300 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n *\n * Note: The original proposal for the 300 status code defined the URI header\n * field as providing a list of alternative representations, such that it\n * would be usable for 200, 300, and 406 responses and be transferred in\n * responses to the HEAD method. However, lack of deployment and disagreement\n * over syntax led to both URI and Alternates (a subsequent proposal) being\n * dropped from this specification. It is possible to communicate the list\n * using a set of Link header fields3, each with a relationship of\n * \"alternate\", though deployment is a chicken-and-egg problem.\n */\n 300: 'Multiple Choices',\n\n /**\n * The target resource has been assigned a new permanent URI and any future\n * references to this resource ought to use one of the enclosed URIs.\n *\n * Clients with link-editing capabilities ought to automatically re-link\n * references to the effective request URI to one or more of the new\n * references sent by the server, where possible.\n *\n * The server SHOULD generate a Location header field in the response\n * containing a preferred URI reference for the new permanent URI. The user\n * agent MAY use the Location field value for automatic redirection. The\n * server's response payload usually contains a short hypertext note with a\n * hyperlink to the new URI(s).\n *\n * Note: For historical reasons, a user agent MAY change the request method\n * from POST to GET for the subsequent request. If this behavior is\n * undesired, the 307 Temporary Redirect status code can be used instead.\n *\n * A 301 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n */\n 301: 'Moved Permanently',\n\n /**\n * The target resource resides temporarily under a different URI. Since the\n * redirection might be altered on occasion, the client ought to continue to\n * use the effective request URI for future requests.\n *\n * The server SHOULD generate a Location header field in the response\n * containing a URI reference for the different URI. The user agent MAY use\n * the Location field value for automatic redirection. The server's response\n * payload usually contains a short hypertext note with a hyperlink to the\n * different URI(s).\n *\n * Note: For historical reasons, a user agent MAY change the request method\n * from POST to GET for the subsequent request. If this behavior is\n * undesired, the 307 Temporary Redirect status code can be used instead.\n */\n 302: 'Found',\n\n /**\n * The server is redirecting the user agent to a different resource, as\n * indicated by a URI in the Location header field, which is intended to\n * provide an indirect response to the original request.\n *\n * A user agent can perform a retrieval request targeting that URI (a GET or\n * HEAD request if using HTTP), which might also be redirected, and present\n * the eventual result as an answer to the original request. Note that the\n * new URI in the Location header field is not considered equivalent to the\n * effective request URI.\n *\n * This status code is applicable to any HTTP method. It is primarily used\n * to allow the output of a POST action to redirect the user agent to a\n * selected resource, since doing so provides the information corresponding\n * to the POST response in a form that can be separately identified,\n * bookmarked, and cached, independent of the original request.\n *\n * A 303 response to a GET request indicates that the origin server does not\n * have a representation of the target resource that can be transferred by\n * the server over HTTP. However, the Location field value refers to a\n * resource that is descriptive of the target resource, such that making a\n * retrieval request on that other resource might result in a representation\n * that is useful to recipients without implying that it represents the\n * original target resource. Note that answers to the questions of what can\n * be represented, what representations are adequate, and what might be a\n * useful description are outside the scope of HTTP.\n *\n * Except for responses to a HEAD request, the representation of a 303\n * response ought to contain a short hypertext note with a hyperlink to the\n * same URI reference provided in the Location header field.\n */\n 303: 'See Other',\n\n /**\n * A conditional GET or HEAD request has been received and would have\n * resulted in a 200 OK response if it were not for the fact that the\n * condition evaluated to false.\n *\n * In other words, there is no need for the server to transfer a\n * representation of the target resource because the request indicates that\n * the client, which made the request conditional, already has a valid\n * representation; the server is therefore redirecting the client to make\n * use of that stored representation as if it were the payload of a 200 OK\n * response.\n *\n * The server generating a 304 response MUST generate any of the following\n * header fields that would have been sent in a 200 OK response to the same\n * request: Cache-Control, Content-Location, Date, ETag, Expires, and Vary.\n *\n * Since the goal of a 304 response is to minimize information transfer when\n * the recipient already has one or more cached representations, a sender\n * SHOULD NOT generate representation metadata other than the above listed\n * fields unless said metadata exists for the purpose of guiding cache\n * updates (e.g., Last-Modified might be useful if the response does not have\n * an ETag field).\n *\n * Requirements on a cache that receives a 304 response are defined in\n * Section 4.3.4 of RFC7234. If the conditional request originated with an\n * outbound client, such as a user agent with its own cache sending a\n * conditional GET to a shared proxy, then the proxy SHOULD forward the\n * 304 response to that client.\n *\n * A 304 response cannot contain a message-body; it is always terminated by\n * the first empty line after the header fields.\n */\n 304: 'Not Modified',\n\n /**\n * Defined in a previous version of this specification and is now deprecated,\n * due to security concerns regarding in-band configuration of a proxy.\n */\n 305: 'Use Proxy',\n\n /**\n * The target resource resides temporarily under a different URI and the user\n * agent MUST NOT change the request method if it performs an automatic\n * redirection to that URI.\n *\n * Since the redirection can change over time, the client ought to continue\n * using the original effective request URI for future requests.\n *\n * The server SHOULD generate a Location header field in the response\n * containing a URI reference for the different URI. The user agent MAY use\n * the Location field value for automatic redirection. The server's response\n * payload usually contains a short hypertext note with a hyperlink to the\n * different URI(s).\n *\n * Note: This status code is similar to 302 Found, except that it does not\n * allow changing the request method from POST to GET. This specification\n * defines no equivalent counterpart for 301 Moved Permanently (RFC7238,\n * however, proposes defining the status code 308 Permanent Redirect for\n * this purpose).\n */\n 307: 'Temporary Redirect',\n\n /**\n * The target resource has been assigned a new permanent URI and any future\n * references to this resource ought to use one of the enclosed URIs.\n *\n * Clients with link editing capabilities ought to automatically re-link\n * references to the effective request URI to one or more of the new\n * references sent by the server, where possible.\n *\n * The server SHOULD generate a Location header field in the response\n * containing a preferred URI reference for the new permanent URI. The user\n * agent MAY use the Location field value for automatic redirection. The\n * server's response payload usually contains a short hypertext note with a\n * hyperlink to the new URI(s).\n *\n * A 308 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n *\n * Note: This status code is similar to 301 Moved Permanently, except that it\n * does not allow changing the request method from POST to GET.\n */\n 308: 'Permanent Redirect',\n\n /**\n * The 400 (Bad Request) status code indicates that the server cannot or\n * will not process the request due to something that is perceived to be\n * a client error (e.g., malformed request syntax, invalid request\n * message framing, or deceptive request routing).\n */\n 400: 'Bad Request',\n\n /**\n * The request has not been applied because it lacks valid authentication\n * credentials for the target resource.\n *\n * The server generating a 401 response MUST send a WWW-Authenticate header\n * field containing at least one challenge applicable to the target resource.\n *\n * If the request included authentication credentials, then the 401 response\n * indicates that authorization has been refused for those credentials. The\n * user agent MAY repeat the request with a new or replaced Authorization\n * header field. If the 401 response contains the same challenge as the\n * prior response, and the user agent has already attempted authentication at\n * least once, then the user agent SHOULD present the enclosed representation\n * to the user, since it usually contains relevant diagnostic information.\n */\n 401: 'Unauthorized',\n\n /**\n * The 402 (Payment Required) status code is reserved for future use.\n */\n 402: 'Payment Required',\n\n /**\n * The 403 (Forbidden) status code indicates that the server understood\n * the request but refuses to authorize it. A server that wishes to\n * make public why the request has been forbidden can describe that\n * reason in the response payload (if any).\n *\n * If authentication credentials were provided in the request, the\n * server considers them insufficient to grant access. The client\n * SHOULD NOT automatically repeat the request with the same\n * credentials. The client MAY repeat the request with new or different\n * credentials. However, a request might be forbidden for reasons\n * unrelated to the credentials.\n *\n * An origin server that wishes to \"hide\" the current existence of a\n * forbidden target resource MAY instead respond with a status code of\n * 404 (Not Found).\n */\n 403: 'Forbidden',\n\n /**\n * The 404 (Not Found) status code indicates that the origin server did\n * not find a current representation for the target resource or is not\n * willing to disclose that one exists. A 404 status code does not\n * indicate whether this lack of representation is temporary or\n * permanent; the 410 (Gone) status code is preferred over 404 if the\n * origin server knows, presumably through some configurable means, that\n * the condition is likely to be permanent.\n *\n * A 404 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 404: 'Not Found',\n\n /**\n * The 405 (Method Not Allowed) status code indicates that the method\n * received in the request-line is known by the origin server but not\n * supported by the target resource. The origin server MUST generate an\n * Allow header field in a 405 response containing a list of the target\n * resource's currently supported methods.\n *\n * A 405 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 405: 'Method Not Allowed',\n\n /**\n * The 406 (Not Acceptable) status code indicates that the target\n * resource does not have a current representation that would be\n * acceptable to the user agent, according to the proactive negotiation\n * header fields received in the request (Section 5.3), and the server\n * is unwilling to supply a default representation.\n *\n * The server SHOULD generate a payload containing a list of available\n * representation characteristics and corresponding resource identifiers\n * from which the user or user agent can choose the one most\n * appropriate. A user agent MAY automatically select the most\n * appropriate choice from that list. However, this specification does\n * not define any standard for such automatic selection, as described in\n * Section 6.4.1 of [RFC7231]\n */\n 406: 'Not Acceptable',\n\n /**\n * Similar to 401 Unauthorized, but it indicates that the client needs to\n * authenticate itself in order to use a proxy.\n *\n * The proxy MUST send a Proxy-Authenticate header field containing a\n * challenge applicable to that proxy for the target resource. The client MAY\n * repeat the request with a new or replaced Proxy-Authorization header field.\n */\n 407: 'Proxy Authentication Required',\n\n /**\n * The 408 (Request Timeout) status code indicates that the server did\n * not receive a complete request message within the time that it was\n * prepared to wait. A server SHOULD send the \"close\" connection option\n * (Section 6.1 of [RFC7230]) in the response, since 408 implies that\n * the server has decided to close the connection rather than continue\n * waiting. If the client has an outstanding request in transit, the\n * client MAY repeat that request on a new connection.\n */\n 408: 'Request Timeout',\n\n /**\n * The 409 (Conflict) status code indicates that the request could not\n * be completed due to a conflict with the current state of the target\n * resource. This code is used in situations where the user might be\n * able to resolve the conflict and resubmit the request. The server\n * SHOULD generate a payload that includes enough information for a user\n * to recognize the source of the conflict.\n *\n * Conflicts are most likely to occur in response to a PUT request. For\n * example, if versioning were being used and the representation being\n * PUT included changes to a resource that conflict with those made by\n * an earlier (third-party) request, the origin server might use a 409\n * response to indicate that it can't complete the request. In this\n * case, the response representation would likely contain information\n * useful for merging the differences based on the revision history.\n */\n 409: 'Conflict',\n\n /**\n * The 410 (Gone) status code indicates that access to the target\n * resource is no longer available at the origin server and that this\n * condition is likely to be permanent. If the origin server does not\n * know, or has no facility to determine, whether or not the condition\n * is permanent, the status code 404 (Not Found) ought to be used\n * instead.\n *\n * The 410 response is primarily intended to assist the task of web\n * maintenance by notifying the recipient that the resource is\n * intentionally unavailable and that the server owners desire that\n * remote links to that resource be removed. Such an event is common\n * for limited-time, promotional services and for resources belonging to\n * individuals no longer associated with the origin server's site. It\n * is not necessary to mark all permanently unavailable resources as\n * \"gone\" or to keep the mark for any length of time -- that is left to\n * the discretion of the server owner.\n *\n * A 410 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 410: 'Gone',\n\n /**\n * The 411 (Length Required) status code indicates that the server\n * refuses to accept the request without a defined Content-Length\n * (Section 3.3.2 of [RFC7230]). The client MAY repeat the request if\n * it adds a valid Content-Length header field containing the length of\n * the message body in the request message.\n */\n 411: 'Length Required',\n\n /**\n * One or more conditions given in the request header fields evaluated to\n * false when tested on the server.\n *\n * This response code allows the client to place preconditions on the current\n * resource state (its current representations and metadata) and, thus,\n * prevent the request method from being applied if the target resource is in\n * an unexpected state.\n */\n 412: 'Precondition Failed',\n\n /**\n * The 413 (Payload Too Large) status code indicates that the server is\n * refusing to process a request because the request payload is larger\n * than the server is willing or able to process. The server MAY close\n * the connection to prevent the client from continuing the request.\n *\n * If the condition is temporary, the server SHOULD generate a\n * Retry-After header field to indicate that it is temporary and after\n * what time the client MAY try again.\n */\n 413: 'Payload Too Large',\n\n /**\n * The 414 (URI Too Long) status code indicates that the server is\n * refusing to service the request because the request-target (Section\n * 5.3 of [RFC7230]) is longer than the server is willing to interpret.\n * This rare condition is only likely to occur when a client has\n * improperly converted a POST request to a GET request with long query\n * information, when the client has descended into a \"black hole\" of\n * redirection (e.g., a redirected URI prefix that points to a suffix of\n * itself) or when the server is under attack by a client attempting to\n * exploit potential security holes.\n *\n * A 414 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 414: 'Request-URI Too Long',\n\n /**\n * The 415 (Unsupported Media Type) status code indicates that the\n * origin server is refusing to service the request because the payload\n * is in a format not supported by this method on the target resource.\n * The format problem might be due to the request's indicated\n * Content-Type or Content-Encoding, or as a result of inspecting the\n * data directly.\n */\n 415: 'Unsupported Media Type',\n\n /**\n * None of the ranges in the request's Range header field overlap the\n * current extent of the selected resource or that the set of ranges\n * requested has been rejected due to invalid ranges or an excessive request\n * of small or overlapping ranges.\n *\n * For byte ranges, failing to overlap the current extent means that the\n * first-byte-pos of all of the byte-range-spec values were greater than the\n * current length of the selected representation. When this status code is\n * generated in response to a byte-range request, the sender SHOULD generate\n * a Content-Range header field specifying the current length of the selected\n * representation\n */\n 416: 'Requested Range Not Satisfiable',\n\n /**\n * The 417 (Expectation Failed) status code indicates that the\n * expectation given in the request's Expect header field\n * (Section 5.1.1 of [RFC7231]) could not be met by at least one of the\n * inbound servers.\n */\n 417: 'Expectation Failed',\n\n /**\n * Any attempt to brew coffee with a teapot should result in the error code\n * \"418 I'm a teapot\". The resulting entity body MAY be short and stout.\n */\n 418: \"I'm a Teapot\",\n\n /**\n * The request was directed at a server that is not able to produce a\n * response. This can be sent by a server that is not configured to produce\n * responses for the combination of scheme and authority that are included\n * in the request URI.\n *\n * Clients receiving a 421 Misdirected Request response from a server MAY\n * retry the request -- whether the request method is idempotent or\n * not -- over a different connection. This is possible if a connection is\n * reused or if an alternative service is selected ALT-SVC.\n *\n * This status code MUST NOT be generated by proxies.\n *\n * A 421 response is cacheable by default, i.e., unless otherwise indicated by\n * the method definition or explicit cache controls\n */\n 421: 'Misdirected Request',\n\n /**\n * The server understands the content type of the request entity (hence a\n * 415 Unsupported Media Type status code is inappropriate), and the syntax\n * of the request entity is correct (thus a 400 Bad Request status code is\n * inappropriate) but was unable to process the contained instructions.\n *\n * For example, this error condition may occur if an XML request body contains\n * well-formed (i.e., syntactically correct), but semantically erroneous, XML\n * instructions.\n */\n 422: 'Unprocessable Entity',\n\n /**\n * The source or destination resource of a method is locked.\n *\n * This response SHOULD contain an appropriate precondition or postcondition\n * code, such as 'lock-token-submitted' or 'no-conflicting-lock'.\n */\n 423: 'Locked',\n\n /**\n * The method could not be performed on the resource because the requested\n * action depended on another action and that action failed.\n *\n * For example, if a command in a PROPPATCH method fails, then, at minimum,\n * the rest of the commands will also fail with 424 Failed Dependency.\n */\n 424: 'Failed Dependency',\n\n /**\n * The 426 (Upgrade Required) status code indicates that the server\n * refuses to perform the request using the current protocol but might\n * be willing to do so after the client upgrades to a different\n * protocol. The server MUST send an Upgrade header field in a 426\n * response to indicate the required protocol(s) (Section 6.7 of\n * [RFC7230]).\n */\n 426: 'Upgrade Required',\n\n /**\n * The origin server requires the request to be conditional.\n *\n * Its typical use is to avoid the \"lost update\" problem, where a client GETs\n * a resource's state, modifies it, and PUTs it back to the server, when\n * meanwhile a third party has modified the state on the server, leading\n * to a conflict. By requiring requests to be conditional, the server can\n * assure that clients are working with the correct copies.\n *\n * Responses using this status code SHOULD explain how to resubmit the request\n * successfully.\n *\n * Responses with the 428 status code MUST NOT be stored by a cache.\n */\n 428: 'Precondition Required',\n\n /**\n * The user has sent too many requests in a given amount of time\n * (\"rate limiting\").\n *\n * The response representations SHOULD include details explaining the\n * condition, and MAY include a Retry-After header indicating how long to\n * wait before making a new request.\n *\n * Responses with the 429 status code MUST NOT be stored by a cache.\n */\n 429: 'Too Many Requests',\n\n /**\n * The server is unwilling to process the request because its header fields\n * are too large. The request MAY be resubmitted after reducing the size of\n * the request header fields.\n *\n * It can be used both when the set of request header fields in total is too\n * large, and when a single header field is at fault. In the latter case, the\n * response representation SHOULD specify which header field was too large.\n */\n 431: 'Request Header Fields Too Large',\n\n /**\n * A non-standard status code used to instruct nginx to close the connection\n * without sending a response to the client, most commonly used to deny\n * malicious or malformed requests.\n *\n * This status code is not seen by the client, it only appears in nginx log\n * files.\n */\n 444: 'Connection Closed Without Response',\n\n /**\n * The server is denying access to the resource as a consequence of a legal\n * demand.\n *\n * The server in question might not be an origin server. This type of legal\n * demand typically most directly affects the operations of ISPs and search\n * engines.\n *\n * Responses using this status code SHOULD include an explanation, in the\n * response body, of the details of the legal demand: the party making it,\n * the applicable legislation or regulation, and what classes of person and\n * resource it applies to.\n *\n * The use of the 451 status code implies neither the existence nor\n * non-existence of the resource named in the request. That is to say, it is\n * possible that if the legal demands were removed, a request for the\n * resource still might not succeed.\n *\n * Note that in many cases clients can still access the denied resource by\n * using technical countermeasures such as a VPN or the Tor network.\n *\n * A 451 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls; see RFC7234.\n */\n 451: 'Unavailable For Legal Reasons',\n\n /**\n * A non-standard status code introduced by nginx for the case when a client\n * closes the connection while nginx is processing the request.\n */\n 499: 'Client Closed Request',\n\n /**\n * The 500 (Internal Server Error) status code indicates that the server\n * encountered an unexpected condition that prevented it from fulfilling\n * the request.\n */\n 500: 'Internal Server Error',\n\n /**\n * The 501 (Not Implemented) status code indicates that the server does\n * not support the functionality required to fulfill the request. This\n * is the appropriate response when the server does not recognize the\n * request method and is not capable of supporting it for any resource.\n *\n * A 501 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 501: 'Not Implemented',\n\n /**\n * The 502 (Bad Gateway) status code indicates that the server, while\n * acting as a gateway or proxy, received an invalid response from an\n * inbound server it accessed while attempting to fulfill the request.\n */\n 502: 'Bad Gateway',\n\n /**\n * The 503 (Service Unavailable) status code indicates that the server\n * is currently unable to handle the request due to a temporary overload\n * or scheduled maintenance, which will likely be alleviated after some\n * delay. The server MAY send a Retry-After header field\n * (Section 7.1.3 of [RFC7231]) to suggest an appropriate amount of time for\n * the client to wait before retrying the request.\n */\n 503: 'Service Unavailable',\n\n /**\n * The 504 (Gateway Timeout) status code indicates that the server,\n *while acting as a gateway or proxy, did not receive a timely response\n *from an upstream server it needed to access in order to complete the\n *request.\n */\n 504: 'Gateway Timeout',\n\n /**\n * The 505 (HTTP Version Not Supported) status code indicates that the\n *server does not support, or refuses to support, the major version of\n *HTTP that was used in the request message. The server is indicating\n *that it is unable or unwilling to complete the request using the same\n *major version as the client, as described in Section 2.6 of\n *[RFC7230], other than with this error message. The server SHOULD\n *generate a representation for the 505 response that describes why\n *that version is not supported and what other protocols are supported\n *by that server.\n */\n 505: 'HTTP Version Not Supported',\n\n /**\n * The server has an internal configuration error: the chosen variant\n * resource is configured to engage in transparent content negotiation\n * itself, and is therefore not a proper end point in the negotiation\n * process.\n */\n 506: 'Variant Also Negotiates',\n\n /**\n * The method could not be performed on the resource because the server is\n * unable to store the representation needed to successfully complete the\n * request.\n *\n * This condition is considered to be temporary. If the request that received\n * this status code was the result of a user action, the request MUST NOT be\n * repeated until it is requested by a separate user action.\n */\n 507: 'Insufficient Storage',\n\n /**\n * The server terminated an operation because it encountered an infinite loop\n * while processing a request with \"Depth: infinity\". This status indicates\n * that the entire operation failed.\n */\n 508: 'Loop Detected',\n\n /**\n * The policy for accessing the resource has not been met in the request. The\n * server should send back all the information necessary for the client to\n * issue an extended request.\n *\n * It is outside the scope of this specification to specify how the\n * extensions inform the client.\n *\n * If the 510 response contains information about extensions that were not\n * present in the initial request then the client MAY repeat the request if\n * it has reason to believe it can fulfill the extension policy by modifying\n * the request according to the information provided in the 510 response.\n * Otherwise the client MAY present any entity included in the 510 response\n * to the user, since that entity may include relevant diagnostic information.\n */\n 510: 'Not Extended',\n\n /**\n * The client needs to authenticate to gain network access.\n *\n * The response representation SHOULD contain a link to a resource that\n * allows the user to submit credentials (e.g., with an HTML form).\n *\n * Note that the 511 response SHOULD NOT contain a challenge or the login\n * interface itself, because browsers would show the login interface as being\n * associated with the originally requested URL, which may cause confusion.\n *\n * The 511 status SHOULD NOT be generated by origin servers; it is intended\n * for use by intercepting proxies that are interposed as a means of\n * controlling access to the network.\n *\n * Responses with the 511 status code MUST NOT be stored by a cache.\n */\n 511: 'Network Authentication Required',\n\n /**\n * This status code is not specified in any RFCs, but is used by some HTTP\n * proxies to signal a network connect timeout behind the proxy to a client\n * in front of the proxy.\n */\n 599: 'Network Connect Timeout Error'\n} as const;\n\n/**\n * Numerical HTTP status code.\n */\nexport type StatusCode = keyof typeof HTTPStatuses;\n\n/**\n * Checks if the given numerical status code is in the known HTTP status codes\n * list.\n *\n * @param code HTTP Status code\n * @returns True if the code is a valid HTTP status code\n */\nexport const isValidStatusCode = (code: number): boolean =>\n !!HTTPStatuses[code];\n\n/**\n * Checks if the given status code is in the informational range (1XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"informational\" range.\n */\nexport const isInformational = (code: StatusCode): boolean =>\n code >= 100 && code < 200;\n\n/**\n * Checks if the given status code is in the successful range (2XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"success\" range.\n */\nexport const isSuccessful = (code: StatusCode): boolean =>\n code >= 200 && code < 300;\n\n/**\n * Checks if the given status code is in the redirection range (3XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"redirection\" range.\n */\nexport const isRedirection = (code: StatusCode): boolean =>\n code >= 300 && code < 400;\n\n/**\n * Checks if the given status code is in the client error range (4XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"client error\" range.\n */\nexport const isClientError = (code: StatusCode): boolean =>\n code >= 400 && code < 500;\n\n/**\n * Checks if the given status code is in the server error range (5XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"server error\" range.\n */\nexport const isServerError = (code: StatusCode): boolean => code >= 500;\n\n/**\n * Searches the list of HTTP statuses for a matching textual name to the one\n * provided. If a match is found, then the numerical status code is returned,\n * otherwise `null`.\n *\n * Internally, the parameter and the status names are normalized by lower-casing\n * the strings and trimming space.\n *\n * @param status HTTP Status textual name\n * @returns The numerical status code, or null if not found\n */\nexport const getCodeForStatus = (status: string): null | StatusCode => {\n const clnStr = status.toLocaleLowerCase().trim();\n const entry = Object.entries(HTTPStatuses).find(\n (ent) => ent[1].toLowerCase() === clnStr\n );\n if (entry) return parseInt(entry[0]) as StatusCode;\n return null;\n};\n\nexport default HTTPStatuses;\n","import {\n AnySchemaValidator,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\nimport {\n ForklaunchNextFunction,\n ForklaunchRequest,\n ForklaunchResHeaders,\n ForklaunchResponse\n} from '../../types/apiDefinition.types';\nimport { ParamsDictionary } from '../../types/contractDetails.types';\n\n/**\n * Middleware to parse and validate the response according to the provided schema.\n *\n * This function validates the response against a schema provided by the request's schema validator.\n * If the response does not conform to the schema, the behavior is determined by the `responseValidation`\n * option in `req.contractDetails.options`:\n * - `'error'` (default): Calls `next` with an error.\n * - `'warning'`: Logs a warning to the console.\n * - `'none'`: Silently continues without action.\n *\n * @template SV - The type of the schema validator used in the request.\n * @template P - The type of the parameters dictionary used in the request.\n * @template ResBodyMap - A record type mapping status codes to response body types.\n * @template ReqBody - The type of the request body.\n * @template ReqQuery - The type of the parsed query string.\n * @template ReqHeaders - The type of the request headers.\n * @template ResHeaders - The type of the response headers, extended from `ForklaunchResHeaders`.\n * @template LocalsObj - The type of the locals object in the response.\n *\n * @param {ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>} req - The request object, containing the schema validator and other request data.\n * @param {ForklaunchResponse<ResBodyMap, ForklaunchResHeaders & ResHeaders, LocalsObj>} res - The response object, including headers and body data.\n * @param {ForklaunchNextFunction} [next] - The next middleware function to be called. If not provided, the function will return after processing.\n *\n * @returns {void} This function does not return a value.\n */\nexport function parse<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n res: ForklaunchResponse<\n ResBodyMap,\n ForklaunchResHeaders & ResHeaders,\n LocalsObj\n >,\n next?: ForklaunchNextFunction\n) {\n const { headers, responses } = res.responseSchemas;\n\n const parsedResponse = (req.schemaValidator as SchemaValidator).parse(\n responses?.[res.statusCode],\n res.bodyData\n );\n\n const parsedHeaders = (req.schemaValidator as SchemaValidator).parse(\n headers ?? req.schemaValidator.unknown,\n res.getHeaders()\n );\n const parseErrors: string[] = [];\n if (!parsedHeaders.ok) {\n const headerErrors = prettyPrintParseErrors(parsedHeaders.errors, 'Header');\n if (headerErrors) {\n parseErrors.push(headerErrors);\n }\n }\n\n if (!parsedResponse.ok) {\n const responseErrors = prettyPrintParseErrors(\n parsedResponse.errors,\n 'Response'\n );\n if (responseErrors) {\n parseErrors.push(responseErrors);\n }\n }\n\n if (parseErrors.length > 0) {\n switch (req.contractDetails.options?.responseValidation) {\n default:\n case 'error':\n next?.(new Error(`Invalid response:\\n${parseErrors.join('\\n\\n')}`));\n break;\n case 'warning':\n console.warn(`Invalid response:\\n${parseErrors.join('\\n\\n')}`);\n break;\n case 'none':\n break;\n }\n }\n next?.();\n}\n","import { isNever } from '@forklaunch/common';\nimport { trace } from '@opentelemetry/api';\nimport { AnyValueMap, logs } from '@opentelemetry/api-logs';\nimport pino, { LevelWithSilent, LevelWithSilentOrString, Logger } from 'pino';\n\nfunction mapSeverity(level: LevelWithSilent) {\n switch (level) {\n case 'silent':\n return 0;\n case 'trace':\n return 1;\n case 'debug':\n return 5;\n case 'info':\n return 9;\n case 'warn':\n return 13;\n case 'error':\n return 17;\n case 'fatal':\n return 21;\n default:\n isNever(level);\n return 0;\n }\n}\n\nclass PinoLogger {\n private pinoLogger: Logger;\n private meta: AnyValueMap;\n constructor(level: LevelWithSilentOrString, meta: AnyValueMap = {}) {\n this.pinoLogger = pino({\n level: level || 'info',\n formatters: {\n level(label) {\n return { level: label };\n }\n },\n timestamp: pino.stdTimeFunctions.isoTime,\n transport: {\n target: 'pino-pretty',\n options: { colorize: true }\n }\n });\n this.meta = meta;\n }\n\n log(level: LevelWithSilent, msg: string, meta: AnyValueMap = {}) {\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n const activeSpanContext = activeSpan.spanContext();\n meta.trace_id = activeSpanContext.traceId;\n meta.span_id = activeSpanContext.spanId;\n meta.trace_flags = activeSpanContext.traceFlags;\n if (!meta.api_name) {\n // @ts-expect-error accessing private property\n meta = { ...meta, ...activeSpan?.attributes };\n }\n }\n\n this.pinoLogger[level](msg);\n logs.getLogger(process.env.OTEL_SERVICE_NAME ?? 'unknown').emit({\n severityText: level,\n severityNumber: mapSeverity(level),\n body: msg,\n attributes: { ...this.meta, ...meta }\n });\n }\n\n error(msg: string, meta: AnyValueMap = {}) {\n this.log('error', msg, meta);\n }\n\n info(msg: string, meta: AnyValueMap = {}) {\n this.log('info', msg, meta);\n }\n\n debug(msg: string, meta: AnyValueMap = {}) {\n this.log('debug', msg, meta);\n }\n\n warn(msg: string, meta: AnyValueMap = {}) {\n this.log('warn', msg, meta);\n }\n\n trace(msg: string, meta: AnyValueMap = {}) {\n this.log('trace', msg, meta);\n }\n\n child(meta: AnyValueMap = {}) {\n return new PinoLogger(this.pinoLogger.level, { ...this.meta, ...meta });\n }\n\n getBaseLogger() {\n return this.pinoLogger;\n }\n}\n\nexport function logger(level: LevelWithSilentOrString, meta: AnyValueMap = {}) {\n return new PinoLogger(level, meta);\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVICE_NAME\n} from '@opentelemetry/semantic-conventions';\nimport { ParsedQs } from 'qs';\nimport { ForklaunchRequest, ForklaunchResponse, ParamsDictionary } from '..';\nimport { getEnvVar } from '../../services';\nimport { ATTR_API_NAME, ATTR_CORRELATION_ID } from './constants';\nimport { httpRequestsTotalCounter } from './openTelemetryCollector';\n\nexport function recordMetric<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ResBodyMap extends Record<string, unknown>,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n res: ForklaunchResponse<ResBodyMap, ResHeaders, LocalsObj>\n) {\n httpRequestsTotalCounter.add(1, {\n [ATTR_SERVICE_NAME]: getEnvVar('OTEL_SERVICE_NAME'),\n [ATTR_API_NAME]: req.contractDetails?.name,\n [ATTR_CORRELATION_ID]: req.context.correlationId,\n [ATTR_HTTP_REQUEST_METHOD]: req.method,\n [ATTR_HTTP_ROUTE]: req.originalPath,\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: res.statusCode || 0\n });\n}\n","import { extractArgumentNames, isNever } from '@forklaunch/common';\nimport {\n AnySchemaValidator,\n IdiomaticSchema,\n ParseResult,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\nimport { isConstructed } from './guards/isConstructed';\nimport { isConstructor } from './guards/isConstructor';\nimport {\n ConfigValidator,\n Constructed,\n Lifetime,\n ResolvedConfigValidator,\n SchemaConstructor,\n SchemaFunction,\n Singleton\n} from './types/configInjector.types';\n\nexport class ConfigInjector<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> {\n instances: {\n [K in keyof CV]?: ResolvedConfigValidator<SV, CV>[K];\n } = {};\n\n private loadSingletons(): void {\n for (const token in this.dependenciesDefinition) {\n const definition = this.dependenciesDefinition[token];\n if (definition.lifetime === Lifetime.Singleton) {\n this.instances[token] = definition.value;\n }\n }\n }\n\n private resolveInstance<T extends keyof CV>(\n token: T,\n definition: Constructed<\n Omit<ResolvedConfigValidator<SV, CV>, T>,\n ResolvedConfigValidator<SV, CV>[T]\n >,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): ResolvedConfigValidator<SV, CV>[T] {\n const injectorArgument = extractArgumentNames(definition.factory)[0];\n // short circuit as no args\n if (injectorArgument === '_args') {\n return definition.factory(\n {} as Omit<ResolvedConfigValidator<SV, CV>, T>,\n this.resolve.bind(this),\n context ?? ({} as Record<string, unknown>)\n );\n }\n\n if (!injectorArgument.startsWith('{') || !injectorArgument.endsWith('}')) {\n throw new Error(\n `Invalid injector argument for ${String(\n token\n )}: ${injectorArgument}. Please use object destructuring syntax: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment.`\n );\n }\n const resolvedArguments = Object.fromEntries(\n injectorArgument\n .replace('{', '')\n .replace('}', '')\n .split(',')\n .map((arg) => arg.split(':')[0].trim())\n .map((arg) => {\n const newResolutionPath = [...resolutionPath, token];\n if (resolutionPath.includes(arg)) {\n throw new Error(\n `Circular dependency detected: ${newResolutionPath.join(\n ' -> '\n )} -> ${arg}`\n );\n }\n const resolvedArg = this.resolve(arg, context, newResolutionPath);\n return [arg, resolvedArg];\n })\n ) as unknown as Omit<ResolvedConfigValidator<SV, CV>, T>;\n return definition.factory(\n resolvedArguments,\n this.resolve.bind(this),\n context ?? ({} as Record<string, unknown>)\n );\n }\n\n constructor(\n private schemaValidator: SV,\n private configShapes: CV,\n private dependenciesDefinition: {\n [K in keyof CV]:\n | Singleton<ResolvedConfigValidator<SV, CV>[K]>\n | Constructed<\n Omit<ResolvedConfigValidator<SV, CV>, K>,\n ResolvedConfigValidator<SV, CV>[K]\n >;\n }\n ) {\n this.loadSingletons();\n }\n\n safeValidateConfigSingletons(): ParseResult<ValidConfigInjector<SV, CV>> {\n const validNonSchemaSingletons = Object.entries(this.configShapes).reduce<\n ParseResult<ResolvedConfigValidator<SV, CV>>\n >(\n (acc, [key, value]) => {\n if (\n this.dependenciesDefinition[key].lifetime === Lifetime.Singleton &&\n !(this.schemaValidator as SchemaValidator).isSchema<\n SchemaFunction<SV> | SchemaConstructor<SV> | IdiomaticSchema<SV>\n >(value) &&\n isConstructor(value)\n ) {\n if (!(this.dependenciesDefinition[key].value instanceof value)) {\n const expected = value.name;\n const receivedValue: unknown =\n this.dependenciesDefinition[key].value;\n const received = isConstructed(receivedValue)\n ? receivedValue.constructor.name\n : typeof receivedValue;\n\n if (acc.ok) {\n acc = {\n ok: false,\n errors: []\n };\n }\n acc.errors?.push({\n message: `Expected ${expected}, received ${received}`,\n path: [key]\n });\n } else {\n if (acc.ok) {\n acc = {\n ok: true,\n value: {\n ...acc.value,\n [key]: this.dependenciesDefinition[key].value\n }\n };\n }\n }\n return acc;\n }\n return acc;\n },\n {\n ok: true,\n value: {} as ResolvedConfigValidator<SV, CV>\n }\n );\n\n const singletons = Object.fromEntries(\n Object.entries(this.configShapes).filter(\n ([key, value]) =>\n this.dependenciesDefinition[key].lifetime === Lifetime.Singleton &&\n (this.schemaValidator as SchemaValidator).isSchema(value)\n )\n );\n const schemaSingletonParseResult = (\n this.schemaValidator as SchemaValidator\n ).parse(\n (this.schemaValidator as SchemaValidator).schemify(singletons),\n Object.fromEntries(\n Object.keys(singletons).map((key) => {\n const dependency = this.dependenciesDefinition[key];\n return [\n key,\n dependency.lifetime === Lifetime.Singleton\n ? dependency.value\n : undefined\n ];\n })\n )\n );\n\n const configKeys = Object.keys(this.configShapes);\n\n return validNonSchemaSingletons.ok && schemaSingletonParseResult.ok\n ? {\n ok: true as const,\n value: new ValidConfigInjector<SV, CV>(\n this.schemaValidator,\n this.configShapes,\n this.dependenciesDefinition\n )\n }\n : {\n ok: false as const,\n errors: [\n ...(!validNonSchemaSingletons.ok && validNonSchemaSingletons.errors\n ? validNonSchemaSingletons.errors\n : []),\n ...(!schemaSingletonParseResult.ok &&\n schemaSingletonParseResult.errors\n ? schemaSingletonParseResult.errors\n : [])\n ].sort(\n (a, b) =>\n configKeys.indexOf(a.path[0]) - configKeys.indexOf(b.path[0])\n )\n };\n }\n\n validateConfigSingletons(configName: string): ValidConfigInjector<SV, CV> {\n const safeValidateResult = this.safeValidateConfigSingletons();\n\n if (safeValidateResult.ok) {\n return safeValidateResult.value;\n }\n\n throw new Error(\n prettyPrintParseErrors(safeValidateResult.errors, configName)\n );\n }\n\n resolve<T extends keyof CV>(\n token: T,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): ResolvedConfigValidator<SV, CV>[T] {\n const instance = this.instances[token];\n if (!instance) {\n const definition = this.dependenciesDefinition[token];\n\n if (!definition) {\n throw new Error(`Unable to resolve dependency ${String(token)}`);\n }\n\n switch (definition.lifetime) {\n case Lifetime.Singleton: {\n return definition.value;\n }\n case Lifetime.Scoped: {\n const scopedInstance = this.resolveInstance<T>(\n token,\n definition,\n context,\n resolutionPath\n );\n this.instances[token] = scopedInstance;\n return scopedInstance;\n }\n case Lifetime.Transient: {\n return this.resolveInstance<T>(\n token,\n definition,\n context,\n resolutionPath\n );\n }\n default: {\n isNever(definition);\n throw new Error(\n `Unable to resolve lifetime for dependency ${String(\n token\n )}, ${resolutionPath}`\n );\n }\n }\n } else {\n return instance;\n }\n }\n\n scopedResolver<T extends keyof CV>(\n token: T,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[T] {\n return (scope) =>\n (scope ?? this.createScope()).resolve<T>(token, context, resolutionPath);\n }\n\n createScope(): ConfigInjector<SV, CV> {\n return new ConfigInjector<SV, CV>(\n this.schemaValidator,\n this.configShapes,\n this.dependenciesDefinition\n );\n }\n\n dispose(): void {\n this.instances = {};\n this.loadSingletons();\n }\n}\n\nexport class ValidConfigInjector<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> extends ConfigInjector<SV, CV> {\n validConfigInjector!: void;\n}\n","// This is a simple function that returns the value of an environment variable.\n// It casts a potentially undefined value to a string, since it will be validated in order to be bootstrapped.\n\nexport function getEnvVar(name: string): string {\n const value = process.env[name];\n return value as string;\n}\n","import { HyperExpressInstrumentation } from '@forklaunch/opentelemetry-instrumentation-hyper-express';\nimport {\n Counter,\n Gauge,\n Histogram,\n metrics,\n ObservableCounter,\n ObservableGauge,\n ObservableUpDownCounter,\n UpDownCounter\n} from '@opentelemetry/api';\nimport { AnyValueMap } from '@opentelemetry/api-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express';\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http';\nimport { Resource } from '@opentelemetry/resources';\nimport { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVICE_NAME\n} from '@opentelemetry/semantic-conventions';\nimport dotenv from 'dotenv';\nimport { LevelWithSilent, LevelWithSilentOrString } from 'pino';\nimport { getEnvVar } from '../../services/getEnvVar';\nimport { isForklaunchRequest } from '../guards/isForklaunchRequest';\nimport {\n MetricsDefinition,\n MetricType\n} from '../types/openTelemetryCollector.types';\nimport { ATTR_API_NAME, ATTR_CORRELATION_ID } from './constants';\nimport { logger } from './pinoLogger';\n\nexport class OpenTelemetryCollector<\n AppliedMetricsDefinition extends MetricsDefinition\n> {\n private readonly logger;\n private readonly metrics: Record<\n keyof AppliedMetricsDefinition,\n | Counter\n | Gauge\n | Histogram\n | UpDownCounter\n | ObservableCounter\n | ObservableGauge\n | ObservableUpDownCounter\n >;\n\n // scoped creation and create this in middleware when api execute. Also add correlation id\n constructor(\n private readonly serviceName: string,\n level?: LevelWithSilentOrString,\n metricDefinitions?: AppliedMetricsDefinition\n ) {\n this.logger = logger(level ?? 'info');\n\n this.metrics = {} as Record<\n keyof AppliedMetricsDefinition,\n MetricType<AppliedMetricsDefinition[keyof AppliedMetricsDefinition]>\n >;\n\n for (const [metricId, metricType] of Object.entries(\n metricDefinitions ?? {}\n )) {\n switch (metricType) {\n case 'counter':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createCounter(metricId);\n break;\n case 'gauge':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createGauge(metricId);\n break;\n case 'histogram':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createHistogram(metricId);\n break;\n case 'upDownCounter':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createUpDownCounter(metricId);\n break;\n case 'observableCounter':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createObservableCounter(metricId);\n break;\n case 'observableGauge':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createObservableGauge(metricId);\n break;\n case 'observableUpDownCounter':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createObservableUpDownCounter(metricId);\n break;\n }\n }\n\n this.log('info', 'OpenTelemetry (Traces + Logs + Metrics) started');\n }\n\n log(level: LevelWithSilent, msg: string, meta: AnyValueMap = {}) {\n this.logger.log(level, msg, meta);\n }\n\n info(msg: string, meta: AnyValueMap = {}) {\n this.logger.info(msg, meta);\n }\n\n error(msg: string, meta: AnyValueMap = {}) {\n this.logger.error(msg, meta);\n }\n\n warn(msg: string, meta: AnyValueMap = {}) {\n this.logger.warn(msg, meta);\n }\n\n debug(msg: string, meta: AnyValueMap = {}) {\n this.logger.debug(msg, meta);\n }\n\n trace(msg: string, meta: AnyValueMap = {}) {\n this.logger.trace(msg, meta);\n }\n\n getMetric<T extends keyof AppliedMetricsDefinition>(\n metricId: T\n ): MetricType<AppliedMetricsDefinition[T]> {\n return this.metrics[metricId] as MetricType<AppliedMetricsDefinition[T]>;\n }\n}\n\ndotenv.config({ path: getEnvVar('ENV_FILE_PATH') });\n\nnew NodeSDK({\n resource: new Resource({\n [ATTR_SERVICE_NAME]: getEnvVar('OTEL_SERVICE_NAME')\n }),\n traceExporter: new OTLPTraceExporter({\n url: `${getEnvVar('OTEL_EXPORTER_OTLP_ENDPOINT') ?? 'http://localhost:4318'}/v1/traces`\n }),\n metricReader: new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({\n url: `${getEnvVar('OTEL_EXPORTER_OTLP_ENDPOINT') ?? 'http://localhost:4318'}/v1/metrics`\n }),\n exportIntervalMillis: 5000\n }),\n logRecordProcessors: [\n new BatchLogRecordProcessor(\n new OTLPLogExporter({\n url: `${getEnvVar('OTEL_EXPORTER_OTLP_ENDPOINT') ?? 'http://localhost:4318'}/v1/logs`\n })\n )\n ],\n instrumentations: [\n new HttpInstrumentation({\n applyCustomAttributesOnSpan: (span, request) => {\n span.setAttribute(\n 'service.name',\n getEnvVar('OTEL_SERVICE_NAME') ?? 'unknown'\n );\n if (isForklaunchRequest(request)) {\n span.setAttribute('api.name', request.contractDetails?.name);\n }\n }\n }),\n new ExpressInstrumentation(),\n new HyperExpressInstrumentation()\n ]\n}).start();\n\n// begin static metrics -- these have to be in here in order to instantiate these after the SDK is instantiated\nexport const httpRequestsTotalCounter = metrics\n .getMeter(getEnvVar('OTEL_SERVICE_NAME') || 'unknown')\n .createCounter<{\n [ATTR_SERVICE_NAME]: string;\n [ATTR_API_NAME]: string;\n [ATTR_CORRELATION_ID]: string;\n [ATTR_HTTP_REQUEST_METHOD]: string;\n [ATTR_HTTP_ROUTE]: string;\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: number;\n }>('http_requests_total', {\n description: 'Number of HTTP requests'\n });\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\nimport { parse } from './parse.middleware';\n\nimport { logger } from '../../telemetry/pinoLogger';\nimport {\n ForklaunchRequest,\n ForklaunchResHeaders,\n ForklaunchResponse,\n ForklaunchSendableData,\n ForklaunchStatusResponse\n} from '../../types/apiDefinition.types';\nimport { ParamsDictionary } from '../../types/contractDetails.types';\nimport { recordMetric } from '../../telemetry/recordMetric';\n\n/**\n * Enhances the Express-like `send` method with additional logic for response handling and validation.\n *\n * This function intercepts the `send` method to provide custom behavior, including response validation\n * through the `parseResponse` middleware. If the response status is 404, it sends a \"Not Found\" message.\n * If the response validation fails, it sends a parsing error message. Otherwise, it calls the original `send`\n * method with the provided data.\n *\n * @template SV - The type of the schema validator used in the request.\n * @template P - The type of the parameters dictionary used in the request.\n * @template ResBodyMap - A record type mapping status codes to response body types.\n * @template ReqBody - The type of the request body.\n * @template ReqQuery - The type of the parsed query string.\n * @template ReqHeaders - The type of the request headers.\n * @template ResHeaders - The type of the response headers, extended from `ForklaunchResHeaders`.\n * @template LocalsObj - The type of the locals object in the response.\n *\n * @param {unknown} instance - The context (typically `this`) in which the original `send` method is called.\n * @param {ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>} req - The request object, containing the schema validator and other request data.\n * @param {ForklaunchResponse<ResBodyMap, ForklaunchResHeaders & ResHeaders, LocalsObj>} res - The response object, including headers and body data.\n * @param {Function} originalSend - The original `send` method from the response object, to be called after custom logic.\n * @param {string | ArrayBuffer | ArrayBufferView | NodeJS.ReadableStream | null | undefined} data - The data to be sent as the response body.\n * @param {boolean} shouldEnrich - A flag indicating whether the response should be sent immediately.\n *\n * @returns {unknown} The return value of the original `send` method, typically the response itself.\n */\nexport function enrichExpressLikeSend<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n instance: unknown,\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n res: ForklaunchResponse<\n ResBodyMap,\n ForklaunchResHeaders & ResHeaders,\n LocalsObj\n >,\n originalSend:\n | ForklaunchStatusResponse<ForklaunchSendableData>['send']\n | ForklaunchStatusResponse<ForklaunchSendableData>['json'],\n data: ForklaunchSendableData,\n shouldEnrich: boolean\n) {\n let parseErrorSent;\n if (shouldEnrich) {\n recordMetric<\n SV,\n P,\n ReqBody,\n ReqQuery,\n ResBodyMap,\n ReqHeaders,\n ForklaunchResHeaders & ResHeaders,\n LocalsObj\n >(req, res);\n\n if (res.statusCode === 404) {\n res.status(404);\n logger('error').error('Not Found');\n originalSend.call(instance, 'Not Found');\n }\n\n parse(req, res, (err?: unknown) => {\n if (err) {\n let errorString = (err as Error).message;\n if (res.locals.errorMessage) {\n errorString += `\\n------------------\\n${res.locals.errorMessage}`;\n }\n logger('error').error(errorString);\n res.status(500);\n originalSend.call(instance, errorString);\n parseErrorSent = true;\n }\n });\n }\n\n if (!parseErrorSent) {\n originalSend.call(instance, data);\n }\n}\n","import {\n AnySchemaValidator,\n IdiomaticSchema,\n SchemaValidator\n} from '@forklaunch/validator';\nimport {\n ContentObject,\n OpenAPIObject,\n OperationObject,\n PathObject,\n ResponsesObject,\n TagObject\n} from 'openapi3-ts/oas31';\nimport { HttpContractDetails } from '../types/contractDetails.types';\nimport { ForklaunchRouter } from '../types/router.types';\nimport HTTPStatuses from '../httpStatusCodes';\n\n/**\n * Capitalizes the first letter of a string.\n *\n * @param {string} str - The string to transform.\n * @returns {string} - The transformed string with the first letter capitalized.\n */\nfunction toUpperCase(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Transforms a base path by ensuring it starts with a slash and capitalizing the first letter.\n *\n * @param {string} basePath - The base path to transform.\n * @returns {string} - The transformed base path.\n */\nfunction transformBasePath(basePath: string) {\n if (basePath.startsWith('/')) {\n return toUpperCase(basePath.slice(1));\n }\n return `/${basePath}`;\n}\n\n/**\n * Creates a Swagger document.\n *\n * @param {string | number} port - The port on which the server is running.\n * @param {TagObject[]} tags - The tags for the Swagger document.\n * @param {PathObject} paths - The paths for the Swagger document.\n * @returns {OpenAPIObject} - The Swagger document.\n */\nfunction generateOpenApiDocument(\n port: string | number,\n tags: TagObject[],\n paths: PathObject\n): OpenAPIObject {\n return {\n openapi: '3.1.0',\n info: {\n title: process.env.API_TITLE || '',\n version: process.env.VERSION || '1.0.0'\n },\n components: {\n securitySchemes: {\n bearer: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT'\n }\n }\n },\n tags,\n servers: [\n {\n url: `http://localhost:${port}`\n }\n ],\n paths\n };\n}\n\n/**\n * Resolves the content object for a given schema.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @param {SV} schemaValidator - The schema validator.\n * @param {IdiomaticSchema<SV>} body - The schema body.\n * @returns {ContentObject} - The resolved content object.\n */\nfunction contentResolver<SV extends AnySchemaValidator>(\n schemaValidator: SV,\n body: IdiomaticSchema<SV>\n): ContentObject {\n const bodySpec = (schemaValidator as SchemaValidator).openapi(body);\n return body === schemaValidator.string\n ? {\n 'plain/text': {\n schema: bodySpec\n }\n }\n : {\n 'application/json': {\n schema: bodySpec\n }\n };\n}\n\n/**\n * Generates a Swagger document from given routers.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @param {SV} schemaValidator - The schema validator.\n * @param {string | number} port - The port on which the server is running.\n * @param {ForklaunchRouter<SV>[]} routers - The routers to include in the Swagger document.\n * @returns {OpenAPIObject} - The generated Swagger document.\n */\nexport function generateSwaggerDocument<SV extends AnySchemaValidator>(\n schemaValidator: SV,\n port: string | number,\n routers: ForklaunchRouter<SV>[]\n): OpenAPIObject {\n const tags: TagObject[] = [];\n const paths: PathObject = {};\n\n routers.flat(Infinity).forEach((router) => {\n const controllerName = transformBasePath(router.basePath);\n tags.push({\n name: controllerName,\n description: `${controllerName} Operations`\n });\n router.routes.forEach((route) => {\n const fullPath = `${router.basePath}${\n route.path === '/' ? '' : route.path\n }`.replace(/:(\\w+)/g, '{$1}');\n if (!paths[fullPath]) {\n paths[fullPath] = {};\n }\n const { name, summary, query, requestHeaders } = route.contractDetails;\n\n const responses: ResponsesObject = {};\n\n for (const key in route.contractDetails.responses) {\n responses[key] = {\n description: HTTPStatuses[key],\n content: contentResolver(\n schemaValidator,\n route.contractDetails.responses[key]\n )\n };\n }\n\n const pathItemObject: OperationObject = {\n tags: [controllerName],\n summary: `${name}: ${summary}`,\n parameters: [],\n responses\n };\n if (route.contractDetails.params) {\n for (const key in route.contractDetails.params) {\n pathItemObject.parameters?.push({\n name: key,\n in: 'path',\n schema: (schemaValidator as SchemaValidator).openapi(\n route.contractDetails.params[key]\n )\n });\n }\n }\n\n const body = (\n route.contractDetails as HttpContractDetails<typeof schemaValidator>\n ).body;\n if (body) {\n pathItemObject.requestBody = {\n required: true,\n content: contentResolver(schemaValidator, body)\n };\n }\n\n if (requestHeaders) {\n for (const key in requestHeaders) {\n pathItemObject.parameters?.push({\n name: key,\n in: 'header',\n schema: (schemaValidator as SchemaValidator).openapi(\n requestHeaders[key]\n )\n });\n }\n }\n\n if (query) {\n for (const key in query) {\n pathItemObject.parameters?.push({\n name: key,\n in: 'query',\n schema: (schemaValidator as SchemaValidator).openapi(query[key])\n });\n }\n }\n\n if (route.contractDetails.auth) {\n responses[401] = {\n description: HTTPStatuses[401],\n content: contentResolver(schemaValidator, schemaValidator.string)\n };\n responses[403] = {\n description: HTTPStatuses[403],\n content: contentResolver(schemaValidator, schemaValidator.string)\n };\n if (route.contractDetails.auth.method === 'jwt') {\n pathItemObject.security = [\n {\n bearer: Array.from(\n route.contractDetails.auth.allowedPermissions?.values() || []\n )\n }\n ];\n }\n }\n\n if (route.method !== 'middleware') {\n paths[fullPath][route.method] = pathItemObject;\n }\n });\n });\n\n return generateOpenApiDocument(port, tags, paths);\n}\n","import { MetricsDefinition } from '../types/openTelemetryCollector.types';\n\nexport function metricsDefinitions<T extends MetricsDefinition>(metrics: T) {\n return metrics;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAAA;AAAA,EAAA;AAAA;AAAA;;;ACCA,kBAA2B;AAiBpB,SAAS,KAUd,KACA,KAKA,MACA;AACA,MAAI,IAAI,WAAW,WAAW;AAC5B,QAAI,OAAO;AAAA,EACb;AACA,kBAAAC,SAAe,EAAE,KAAK,KAAK,SAAS,MAAM;AAAA,EAAC,EAAE;AAC/C;;;ACvCA,iBAAsB;AACtB,kBAAmB;;;ACFnB,kCAKO;AAEA,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;;;ADkB5B,SAAS,cAUd,iBAaA;AACA,SAAO,SAAS,WAAW,KAAK,KAAK,MAAO;AAC1C,QAAI,kBAAkB;AAEtB,QAAI,oBAAgB,gBAAG;AAEvB,QAAI,IAAI,QAAQ,kBAAkB,GAAG;AACnC,sBAAgB,IAAI,QAAQ,kBAAkB;AAAA,IAChD;AAEA,QAAI,UAAU,oBAAoB,aAAa;AAE/C,QAAI,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,OAAO,iBAAM,cAAc;AACjC,QAAI,QAAQ,MAAM;AAChB,UAAI,QAAQ,OAAO;AACnB,UAAI,QAAQ,MAAM,aAAa,qBAAqB,aAAa;AAAA,IACnE;AAEA,WAAO;AAAA,EACT;AACF;;;AEtEO,SAAS,mBACd,uBAC+C;AAC/C,SACE,yBAAyB,QACzB,OAAO,0BAA0B,YACjC,cAAc,yBACd,YAAY,yBACZ,MAAM,QAAQ,sBAAsB,MAAM;AAE9C;;;ACTO,SAAS,8BAId,kCAIA;AACA,SACE,mBAAuB,gCAAgC,KACvD,oBAAoB;AAExB;;;ACjBA,oBAAqC;AAW9B,SAAS,2BAadC,aAaA;AACA,QAAM,yBACJ,OAAOA,gBAAe,cACtB,IAAI;AAAA,QACF,oCAAqBA,WAAU,EAAE;AAAA,MAAI,CAAC,iBACpC,aAAa,YAAY;AAAA,IAC3B;AAAA,EACF;AACF,SAAO,0BAA0B,uBAAuB,QAAQ;AAClE;;;ACzCO,SAAS,8BASd,kCASA;AACA,SACE;AAAA,IACE;AAAA,EACF,KACA,cAAc,oCACd,cAAc;AAElB;;;ACrBO,SAAS,+BASd,mCASA;AACA,SACE,qCAAqC,QACrC,OAAO,sCAAsC,YAC7C,UAAU,qCACV,aAAa,qCACb,eAAe,qCACf,kCAAkC,QAAQ,QAC1C,kCAAkC,WAAW,QAC7C,kCAAkC,aAAa;AAEnD;;;ACxBO,SAAS,sBAUd,sBAUA;AACA,SACE,+BAA+B,oBAAoB,KACnD,UAAU,wBACV,qBAAqB,QAAQ;AAEjC;;;AC7BO,SAAS,eAed,mBAeA;AACA,SACE,qBAAqB,QACrB,OAAO,sBAAsB,YAC7B,mBAAmB,qBACnB,kBAAkB,kBAAkB;AAExC;;;AChDA,kBAA0B;AAuB1B,IAAM,kCAAkC;AAAA,EACtC;AAAA,EACA;AACF;AACA,IAAM,8BAA8B;AAAA,EAClC;AAAA,EACA;AACF;AACA,IAAM,uCAAuC;AAAA,EAC3C;AAAA,EACA;AACF;AACA,IAAM,iCAAiC;AAAA,EACrC;AAAA,EACA;AACF;AACA,IAAM,4BAA4B;AAAA,EAChC;AAAA,EACA;AACF;AACA,IAAM,4BAA4B;AAAA,EAChC;AAAA,EACA;AACF;AASA,eAAe,wBAOb,qBACA,oBACA,KACyD;AACzD,MAAI,sBAAsB,MAAM;AAC9B,WAAO,CAAC,KAAK,kCAAkC;AAAA,EACjD;AAEA,QAAM,CAAC,aAAa,KAAK,IAAI,mBAAmB,MAAM,GAAG;AAEzD,MAAI;AAEJ,UAAQ,oBAAoB,QAAQ;AAAA,IAClC,KAAK,OAAO;AACV,UAAI,gBAAgB,UAAU;AAC5B,eAAO;AAAA,MACT;AAEA,UAAI;AACF,cAAM,aAAa,UAAM;AAAA,UACvB;AAAA,UACA,IAAI,YAAY,EAAE;AAAA;AAAA,YAEhB,QAAQ,IAAI;AAAA,UACd;AAAA,QACF;AAEA,YAAI,CAAC,WAAW,QAAQ,KAAK;AAC3B,iBAAO;AAAA,QACT;AAEA,qBAAa,WAAW,QAAQ;AAAA,MAClC,SAAS,OAAO;AAEd,gBAAQ,MAAM,KAAK;AACnB,eAAO;AAAA,MACT;AAEA;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,UAAI,uBAAuB,SAAS;AAClC,eAAO;AAAA,MACT;AAEA,YAAM,CAAC,UAAU,QAAQ,IAAI,OAAO,KAAK,OAAO,QAAQ,EACrD,SAAS,OAAO,EAChB,MAAM,GAAG;AAEZ,UAAI,CAAC,YAAY,CAAC,UAAU;AAC1B,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,oBAAoB,MAAM,UAAU,QAAQ,GAAG;AAClD,eAAO;AAAA,MACT;AAEA,mBAAa;AACb;AAAA,IACF;AAAA,IACA,KAAK;AACH,UAAI,gBAAgB,oBAAoB,aAAa;AACnD,eAAO;AAAA,MACT;AAEA,mBAAa,oBAAoB,eAAe,KAAK;AAErD;AAAA,EACJ;AAEA,MACE,oBAAoB,sBACpB,oBAAoB,sBACpB;AACA,QAAI,CAAC,oBAAoB,gBAAgB;AACvC,aAAO,CAAC,KAAK,0CAA0C;AAAA,IACzD;AAEA,UAAM,sBAAsB,MAAM,oBAAoB;AAAA,MACpD;AAAA,MACA;AAAA,IACF;AAEA,QAAI,oBAAoB,oBAAoB;AAC1C,UACE,oBAAoB,aAAa,oBAAoB,kBAAkB,EACpE,SAAS,GACZ;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,oBAAoB,sBAAsB;AAC5C,UACE,oBAAoB;AAAA,QAClB,oBAAoB;AAAA,MACtB,EAAE,SAAS,GACX;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,oBAAoB,gBAAgB,oBAAoB,gBAAgB;AAC1E,QAAI,CAAC,oBAAoB,UAAU;AACjC,aAAO,CAAC,KAAK,oCAAoC;AAAA,IACnD;AAEA,UAAM,gBAAgB,MAAM,oBAAoB,SAAS,YAAY,GAAG;AAExE,QAAI,oBAAoB,cAAc;AACpC,UACE,cAAc,aAAa,oBAAoB,YAAY,EAAE,SAAS,GACtE;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,oBAAoB,gBAAgB;AACtC,UACE,cAAc,aAAa,oBAAoB,cAAc,EAAE,SAC/D,GACA;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,KAAK,+BAA+B;AAC9C;AAaA,eAAsB,iBAUpB,KAQA,KAKA,MACA;AACA,QAAM,OAAO,IAAI,gBAAgB;AAQjC,MAAI,MAAM;AACR,UAAM,CAAC,OAAO,OAAO,IAClB,MAAM;AAAA,MAOL;AAAA,MACA,IAAI,SACD,KAAK,WAAW,UAAU,KAAK,aAAa,WAC3C,eACJ;AAAA,MACA;AAAA,IACF,KAAM,CAAC;AACT,QAAI,SAAS,MAAM;AACjB,UAAI,OAAO,KAAK,EAAE,KAAK,OAAO;AAC9B,aAAO,IAAI,MAAM,OAAO,CAAC;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;;;AC1OO,SAAS,cAUd,MACA,iBACA,eACA,iBAaA;AACA,SAAO,CAAC,KAAK,KAAK,SAAU;AAC1B,QAAI,eAAe;AACnB,QAAI,kBAAkB;AACtB,QAAI,gBAAgB;AACpB,QAAI,kBAAkB;AAEtB,QAAI,QAAQ,MAAM,aAAa,eAAe,IAAI,iBAAiB,IAAI;AACvE,WAAO;AAAA,EACT;AACF;;;AC/DA,uBAIO;;;ACFA,SAAS,gBACd,oBACmE;AACnE,SACE,sBAAsB,QACtB,UAAU,sBACV,WAAW,sBACX,YAAY,sBACZ,aAAa;AAEjB;;;ADaO,SAAS,MAUd,KACA,MACA,MACA;AACA,QAAM,UAAU;AAAA,IACd,QAAQ,IAAI;AAAA,IACZ,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,MAAM,IAAI;AAAA,EACZ;AAEA,QAAM,gBAAiB,IAAI,gBAAoC;AAAA,IAC7D,IAAI;AAAA,IACJ;AAAA,EACF;AAEA,MACE,cAAc,MACd,gBAAkD,cAAc,KAAK,GACrE;AACA,QAAI,OAAO,cAAc,MAAM;AAC/B,QAAI,SAAS,cAAc,MAAM;AACjC,QAAI,QAAQ,cAAc,MAAM;AAChC,QAAI,UAAU,cAAc,MAAM;AAAA,EACpC;AACA,MAAI,CAAC,cAAc,IAAI;AACrB,YAAQ,IAAI,gBAAgB,SAAS,mBAAmB;AAAA,MACtD;AAAA,MACA,KAAK;AACH;AAAA,UACE,IAAI,UAAM,yCAAuB,cAAc,QAAQ,SAAS,CAAC;AAAA,QACnE;AACA;AAAA,MACF,KAAK;AACH,gBAAQ,SAAK,yCAAuB,cAAc,QAAQ,SAAS,CAAC;AACpE;AAAA,MACF,KAAK;AACH;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;AEvBO,IAAM,8BAAN,MASP;AAAA,EAME,YACE,UACS,iBACA,UACT;AAFS;AACA;AAET,SAAK,WAAW;AAAA,EAClB;AAAA,EAXA;AAAA,EACA,UAAkC,CAAC;AAAA,EAC1B,SAAgC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBT,oBASE,MACA,iBACA,eACA,iBAaE;AACF,WAAO;AAAA,MACL;AAAA,QAUE,GAAG,KAAK,QAAQ,GAAG,IAAI;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IAUF;AAAA,EAaF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,8BASE,gBAyBA;AACA,WAAO,OAAO,KAAK,KAAK,SAAS;AAC/B,UAAI,CAAC,gBAAgB;AACnB,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AAEA,UAAI;AACF,cAAM,eAAe,KAAK,KAAK,IAAI;AAAA,MACrC,SAAS,OAAO;AACd,YAAI,QAAQ,OAAO,SAAS,YAAY;AACtC,eAAK,KAAc;AAAA,QACrB,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,0BASE,UAyBA;AACA,UAAM,oBAAoB,SAAS,IAAI;AAEvC,QAAI,OAAO,sBAAsB,YAAY;AAC3C,YAAM,IAAI;AAAA,QACR,8CAA8C,iBAAiB;AAAA,MACjE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SAUE,iBAWA;AACA,UAAM,kBAAkB,KAAK;AAE7B,UAAM,gBAAgB,gBAAgB;AAAA,MACpC,gBAAgB,SAAS;AAAA,QACvB,GAAI,gBAAgB,SAAS,EAAE,QAAQ,gBAAgB,OAAO,IAAI,CAAC;AAAA,QACnE,GAAI,gBAAgB,iBAChB,EAAE,SAAS,gBAAgB,eAAe,IAC1C,CAAC;AAAA,QACL,GAAI,gBAAgB,QAAQ,EAAE,OAAO,gBAAgB,MAAM,IAAI,CAAC;AAAA,QAChE,GAAI,sBASF,eAAe,KAAK,gBAAgB,QAAQ,OAC1C,EAAE,MAAM,gBAAgB,KAAK,IAC7B,CAAC;AAAA,MACP,CAAC;AAAA,IACH;AAEA,UAAM,kBAAkB;AAAA,MACtB,KAAK,gBAAgB;AAAA,MACrB,KAAK,gBAAgB;AAAA,MACrB,KAAK,gBAAgB;AAAA,MACrB,KAAK,gBAAgB;AAAA,MACrB,KAAK,gBAAgB;AAAA,MACrB,GAAI,+BAQF,eAAe,KACjB,sBASE,eAAe,IACb;AAAA,QACE,GAAG,gBAAgB;AAAA,MACrB,IACA,CAAC;AAAA,IACP;AAEA,UAAM,kBAA0C;AAAA,MAC9C,WAAW,CAAC;AAAA,MACZ,GAAI,gBAAgB,kBAChB;AAAA,QACE,SAAS,gBAAgB;AAAA,UACvB,gBAAgB,SAAS,gBAAgB,eAAe;AAAA,QAC1D;AAAA,MACF,IACA,CAAC;AAAA,IACP;AACA,WAAO,QAAQ,eAAe,EAAE,QAAQ,CAAC,CAAC,MAAM,aAAa,MAAM;AACjE,sBAAgB,UAAU,OAAO,IAAI,CAAC,IAAI,gBAAgB;AAAA,QACxD,gBAAgB,SAAS,aAAa;AAAA,MACxC;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBACE,UACA,mBACA;AACA,WAAO,OACL,OACA,YAMG;AACH,UAAI;AACJ,UAAI;AACJ,YAAM,kBAA0C,CAAC;AAEjD,YAAM,MAAM;AAAA,QACV,QAAQ,SAAS,UAAU,CAAC;AAAA,QAC5B,OAAO,SAAS,SAAS,CAAC;AAAA,QAC1B,SAAS,SAAS,WAAW,CAAC;AAAA,QAC9B,MAAM,SAAS,QAAQ,CAAC;AAAA,QACxB,MAAM;AAAA,MACR;AAEA,YAAM,MAAM;AAAA,QACV,QAAQ,CAAC,SAAiB;AACxB,uBAAa;AACb,iBAAO;AAAA,QACT;AAAA,QACA,MAAM,CAAC,YAAoB;AACzB,4BAAkB;AAAA,QACpB;AAAA,QACA,MAAM,CAAC,SAAkC;AACvC,4BAAkB;AAAA,QACpB;AAAA,QACA,OAAO,CAAC,SAAkC;AACxC,4BAAkB;AAAA,QACpB;AAAA,QACA,WAAW,CAAC,KAAa,UAAkB;AACzC,0BAAgB,GAAG,IAAI;AAAA,QACzB;AAAA,MACF;AAEA,UAAI,SAAS,SAAS,MAAM;AAM5B,UAAI,QAAQ;AACV,mBAAW,MAAM,UAAU;AACzB,gBAAM,OAAO,KAAK,KAAK,CAAC,QAAgB;AACtC,gBAAI,KAAK;AACP,oBAAM;AAAA,YACR;AAEA,qBAAS;AAAA,UAKX,CAAC;AAAA,QACH;AACA,cAAM,OAAO,KAAK,KAAK,OAAO,QAAgB;AAC5C,cAAI,KAAK;AACP,kBAAM;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAEA,YAAM,WAAW;AAKjB,YAAM,SAAS,KAAK,KAAK,CAAC,QAAgB;AACxC,YAAI,KAAK;AACP,gBAAM;AAAA,QACR;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAWE,QACA,MACA,oBACA,8CAeG,uCAwBH;AAEA,QACE,eAcE,yCAAyC,GAC3C;AACA,YAAM,EAAE,iBAAiB,SAAS,IAChC;AACF,aAAO,KAAK;AAAA,QAWV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IAUF,OAEK;AACH,YAAM,oBACJ,sCACE,sCAAsC,SAAS,CACjD;AACF,UACE,eAcE,iBAAiB,GACnB;AACA,cAAM,EAAE,iBAAiB,SAAS,IAAI;AACtC,eAAO,KAAK;AAAA,UAWV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG,sCAAsC,OAAO,QAAQ;AAAA,QAC1D;AAAA,MAUF,OAAO;AACL,YACE,2BAYE,yCAAyC,KAC3C,eAcE,yCAAyC,GAC3C;AACA,gBAAM,IAAI,MAAM,kCAAkC;AAAA,QACpD;AACA,cAAM,kBAAkB;AAExB,cAAM,WACJ,sCACA;AAAA,UAAO,CAAC,YACR,2BAYE,OAAO;AAAA,QACX;AAEA,YACE,CAAC,sBASC,eAAe,KACjB,CAAC,+BAQC,eAAe,GACjB;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,aAAK,OAAO,KAAK;AAAA,UACf,UAAU,KAAK;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,EAAE,eAAe,gBAAgB,IAAI,KAAK,SAS9C,eAAe;AAEjB,cAAM,oBAAoB,KAAK,0BAA0B,QAAQ;AAEjE,2BAAmB,KAAK,KAAK,QAAQ;AAAA,UACnC;AAAA,UACA,GAAI,KAAK;AAAA,YASP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,EAAE,OAAO,QAAQ;AAAA,UACjB,KAAK,8BAA8B,iBAAiB;AAAA,QACtD;AAEA,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MAUF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAWE,UAkBA,mBACA;AACA,UAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,gBAAgB,OAAO,CAAC,IAAI,IAAI,CAAC;AACrC,QACE,eAcE,IAAI,GACN;AACA,sBAAgB,KAAK;AAAA,IACvB;AAEA,aAAS,QAAQ,CAAC,YAAY;AAC5B,UACE,eAcE,OAAO,GACT;AACA,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAMC,cAAa,oBACf,SAAS,IAAI,iBAAiB,IAC7B;AAEL,WAAO,CAAC,GAAGA,aAAY,GAAG,aAAa;AAAA,EACzC;AAAA,EAEA,gDAUE,UAeA;AACA,WAAO,KAAK,iBAUV,QAAQ;AAAA,EACZ;AAAA,EAEA,wDAUE,UAkBA;AACA,WAAO,KAAK;AAAA,MAUV;AAAA,MAAU,CAAC,YACX,8BAQE,OAAO,IACL,QAAQ,WACP;AAAA,IACP;AAAA,EACF;AAAA,EAEA,iCAUE,SAiBAA,aACA;AACA,QACE,eAcE,OAAO,GACT;AACA,MAAAA,YAAW,KAAK,GAAI,QAAQ,QAA4B;AAAA,IAC1D,WAAW,2BAA2B,OAAO,GAAG;AAC9C,MAAAA,YAAW,KAAK,OAAwB;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,mCAUE,2CAiBA,wCAeA;AACA,UAAMA,cAA8B,CAAC;AAErC,SAAK,iCASH,2CAA2CA,WAAU;AAEvD,IAAAA,YAAW;AAAA,MACT,GAAG,KAAK,gDASN,sCAAsC;AAAA,IAC1C;AAEA,WAAOA;AAAA,EACT;AAAA,EAEA,2CAUE,2CAkBA,wCAkBA;AACA,UAAMA,cAA2C,CAAC;AAElD,SAAK;AAAA,MAUH;AAAA,MAeAA;AAAA,IACF;AAEA,QACE,8BAQE,yCAAyC,GAC3C;AACA,MAAAA,YAAW,KAAK,0CAA0C,QAAQ;AAAA,IACpE;AAEA,IAAAA,YAAW;AAAA,MACT,GAAG,KAAK,wDASN,sCAAsC;AAAA,IAC1C;AAEA,WAAOA;AAAA,EACT;AAAA,EAEA,0BAUE,oBACA,iDAiBA,8CAeG,wCAeG;AACN,UAAMA,cAA8B,CAAC;AAErC,QAAI,OAAO,oDAAoD,UAAU;AACvE,MAAAA,YAAW;AAAA,QACT,GAAG,KAAK;AAAA,UAUN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,OAAO;AACb,yBAAmB,KAAK,KAAK,QAAQ,EAAE,MAAM,GAAGA,WAAU;AAAA,IAC5D,OAAO;AACL,MAAAA,YAAW;AAAA,QACT,GAAG,KAAK;AAAA,UAUN;AAAA,WACC,2BAYC,yCAAyC,KAC3C,eAcE,yCAAyC,IACvC,CAAC,yCAAyC,IAC1C,CAAC,GACH,OAAO,sCAAsC;AAAA,QACjD;AAAA,MACF;AACA,yBAAmB,KAAK,KAAK,QAAQ,EAAE,GAAGA,WAAU;AAAA,IACtD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,kCAUE,oBACA,iDAkBA,8CAiBG,wCAkBG;AACN,UAAMA,cAA2C,CAAC;AAClD,QAAI;AAEJ,QAAI,OAAO,oDAAoD,UAAU;AACvE,MAAAA,YAAW;AAAA,QACT,GAAG,KAAK;AAAA,UAUN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,OAAO;AACL,UACE;AAAA,QACE;AAAA,MACF,GACA;AACA,eAAO,gDAAgD;AAAA,MACzD;AACA,MAAAA,YAAW;AAAA,QACT,GAAG,KAAK;AAAA,UAUN;AAAA,WACC,2BAYC,yCAAyC,KAC3C,eAcE,yCAAyC,KAC3C;AAAA,YACE;AAAA,UACF,IACI,CAAC,yCAAyC,IAC1C,CAAC,GACH,OAAO,sCAAsC;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM;AACR,yBAAmB,KAAK,KAAK,QAAQ,EAAE,MAAM,GAAGA,WAAU;AAAA,IAC5D,OAAO;AACL,yBAAmB,KAAK,KAAK,QAAQ,EAAE,GAAGA,WAAU;AAAA,IACtD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAQI,CAoBF,iDAkBA,8CAiBG,2CAkBA;AACH;AAAA,MACE;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,EAAE,QAAQ,CAAC,QAAQ;AACjB,UAAI,mBAAuB,GAAG,GAAG;AAC/B,aAAK,QAAQ,KAAK,GAAG;AAAA,MACvB;AAAA,IACF,CAAC;AAED,WAAO,KAAK;AAAA,MAUV,KAAK,SAAS;AAAA,MACd;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAMI,CAUF,iDAiBA,8CAeG,2CAeA;AACH,WAAO,KAAK;AAAA,MAUV,KAAK,SAAS;AAAA,MACd;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,UAMI,CAUF,iDAiBA,8CAeG,2CAeA;AACH,WAAO,KAAK;AAAA,MAUV,KAAK,SAAS;AAAA,MACd;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAOI,CAUF,MACA,8CAeG,2CAeA;AACH,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,QAWR;AAAA,QACA;AAAA,QACA,KAAK,SAAS;AAAA,QACd;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAOI,CAUF,MACA,8CAeG,2CAeA;AACH,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,QAWT;AAAA,QACA;AAAA,QACA,KAAK,SAAS;AAAA,QACd;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAOI,CAUF,MACA,8CAeG,2CAeA;AACH,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,QAWR;AAAA,QACA;AAAA,QACA,KAAK,SAAS;AAAA,QACd;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,QAOI,CAUF,MACA,8CAeG,2CAeA;AACH,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,QAWV;AAAA,QACA;AAAA,QACA,KAAK,SAAS;AAAA,QACd;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,SAOI,CAUF,MACA,8CAeG,2CAeA;AACH,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,QAWX;AAAA,QACA;AAAA,QACA,KAAK,SAAS;AAAA,QACd;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,UAOI,CAUF,MACA,8CAeG,2CAeA;AACH,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,QAWZ;AAAA,QACA;AAAA,QACA,KAAK,SAAS;AAAA,QACd;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAOI,CAUF,MACA,8CAeG,2CAeA;AACH,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,QAWT;AAAA,QACA;AAAA,QACA,KAAK,SAAS;AAAA,QACd;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,QAOI,CAUF,MACA,8CAeG,2CAeA;AACH,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,QAWV;AAAA,QACA;AAAA,QACA,KAAK,SAAS;AAAA,QACd;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;;;AC9zEO,IAAe,mCAAf,cAOG,4BAQR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YACW,iBACA,UACT;AACA,UAAM,KAAK,iBAAiB,QAAQ;AAH3B;AACA;AAIT,SAAK,SAAS,IAAI,cAAc,KAAK,eAAe,CAAkB;AACtE,SAAK,SAAS,IAAI,IAAqB;AAAA,EACzC;AAGF;;;ACvCO,SAAS,oBAOd,SACoE;AACpE,SACE,WAAW,QACX,OAAO,YAAY,YACnB,qBAAqB;AAEzB;;;ACnBO,SAAS,OAAkC,MAA4B;AAC5E,SAAO,KAAK,WAAW,GAAG;AAC5B;;;ACoIO,SAAS,aAed,kBACA,sBACA,iCAaA,6BAyBG,cA2BH;AAGA,MAAI;AAWJ,MAAI;AAcJ,MAAI,OAAO,oCAAoC,UAAU;AACvD,QAAI,OAAO,6BAA6B,YAAY;AAClD,wBAAkB;AAAA,IACpB,OAAO;AACL,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AACA,eAAW;AAAA,EACb,OAEK;AACH,sBAAkB;AAClB,QAAI,OAAO,6BAA6B,YAAY;AAClD,iBAAW,CAAC,0BAA0B,GAAG,YAAY;AAAA,IACvD,OAAO;AACL,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAAA,EACF;AACA,SAAO;AAAA,IACL,eAAe;AAAA,IACf,OAAO,OAAa,oBAAoB,IACpC,uBACA;AAAA,IACJ;AAAA,IACA;AAAA,EACF;AACF;;;ACjQO,IAAM,UAAU,CAcrB,kBACA,MACA,oBASG,aAaA;AACH,SAAO,aAcL,kBAAkB,MAAM,UAAU,iBAAiB,GAAG,QAAQ;AAClE;;;ACtDO,IAAM,MAAM,CAcjB,kBACA,MACA,oBASG,aAaA;AACH,SAAO,aAcL,kBAAkB,MAAM,OAAO,iBAAiB,GAAG,QAAQ;AAC/D;;;ACtDO,IAAM,OAAO,CAclB,kBACA,MACA,oBASG,aAaA;AACH,SAAO,aAcL,kBAAkB,MAAM,QAAQ,iBAAiB,GAAG,QAAQ;AAChE;;;ACtDO,IAAM,aAAa,CAcxB,kBACA,MACA,oBAUG,aAaA;AACH,SAAO,aAcL,kBAAkB,MAAM,cAAc,iBAAiB,GAAG,QAAQ;AACtE;;;ACvDO,IAAM,UAAU,CAcrB,kBACA,MACA,oBASG,aAaA;AACH,SAAO,aAcL,kBAAkB,MAAM,WAAW,iBAAiB,GAAG,QAAQ;AACnE;;;ACtDO,IAAM,QAAQ,CAcnB,kBACA,MACA,oBAUG,aAaA;AACH,SAAO,aAcL,kBAAkB,MAAM,SAAS,iBAAiB,GAAG,QAAQ;AACjE;;;ACvDO,IAAM,OAAO,CAclB,kBACA,MACA,oBAUG,aAaA;AACH,SAAO,aAcL,kBAAkB,MAAM,QAAQ,iBAAiB,GAAG,QAAQ;AAChE;;;ACvDO,IAAM,MAAM,CAcjB,kBACA,MACA,oBAUG,aAaA;AACH,SAAO,aAcL,kBAAkB,MAAM,OAAO,iBAAiB,GAAG,QAAQ;AAC/D;;;ACvDO,IAAMC,SAAQ,CAcnB,kBACA,MACA,oBASG,aAaA;AACH,SAAO,aAcL,kBAAkB,MAAM,SAAS,iBAAiB,GAAG,QAAQ;AACjE;;;ACvDO,IAAM,eAAoD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe/D,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuEL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsCL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwCL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAML,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBL,KAAK;AAAA;AAAA;AAAA;AAAA,EAKL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAML,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAML,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,KAAK;AACP;AAcO,IAAM,oBAAoB,CAAC,SAChC,CAAC,CAAC,aAAa,IAAI;AAQd,IAAM,kBAAkB,CAAC,SAC9B,QAAQ,OAAO,OAAO;AAQjB,IAAM,eAAe,CAAC,SAC3B,QAAQ,OAAO,OAAO;AAQjB,IAAM,gBAAgB,CAAC,SAC5B,QAAQ,OAAO,OAAO;AAQjB,IAAM,gBAAgB,CAAC,SAC5B,QAAQ,OAAO,OAAO;AAQjB,IAAM,gBAAgB,CAAC,SAA8B,QAAQ;AAa7D,IAAM,mBAAmB,CAAC,WAAsC;AACrE,QAAM,SAAS,OAAO,kBAAkB,EAAE,KAAK;AAC/C,QAAM,QAAQ,OAAO,QAAQ,YAAY,EAAE;AAAA,IACzC,CAAC,QAAQ,IAAI,CAAC,EAAE,YAAY,MAAM;AAAA,EACpC;AACA,MAAI,MAAO,QAAO,SAAS,MAAM,CAAC,CAAC;AACnC,SAAO;AACT;AAEA,IAAO,0BAAQ;;;AC/lCf,IAAAC,oBAIO;AAmCA,SAASC,OAUd,KACA,KAKA,MACA;AACA,QAAM,EAAE,SAAS,UAAU,IAAI,IAAI;AAEnC,QAAM,iBAAkB,IAAI,gBAAoC;AAAA,IAC9D,YAAY,IAAI,UAAU;AAAA,IAC1B,IAAI;AAAA,EACN;AAEA,QAAM,gBAAiB,IAAI,gBAAoC;AAAA,IAC7D,WAAW,IAAI,gBAAgB;AAAA,IAC/B,IAAI,WAAW;AAAA,EACjB;AACA,QAAM,cAAwB,CAAC;AAC/B,MAAI,CAAC,cAAc,IAAI;AACrB,UAAM,mBAAe,0CAAuB,cAAc,QAAQ,QAAQ;AAC1E,QAAI,cAAc;AAChB,kBAAY,KAAK,YAAY;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,CAAC,eAAe,IAAI;AACtB,UAAM,qBAAiB;AAAA,MACrB,eAAe;AAAA,MACf;AAAA,IACF;AACA,QAAI,gBAAgB;AAClB,kBAAY,KAAK,cAAc;AAAA,IACjC;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,GAAG;AAC1B,YAAQ,IAAI,gBAAgB,SAAS,oBAAoB;AAAA,MACvD;AAAA,MACA,KAAK;AACH,eAAO,IAAI,MAAM;AAAA,EAAsB,YAAY,KAAK,MAAM,CAAC,EAAE,CAAC;AAClE;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK;AAAA,EAAsB,YAAY,KAAK,MAAM,CAAC,EAAE;AAC7D;AAAA,MACF,KAAK;AACH;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AACT;;;ACpGA,IAAAC,iBAAwB;AACxB,IAAAC,cAAsB;AACtB,sBAAkC;AAClC,kBAAuE;AAEvE,SAAS,YAAY,OAAwB;AAC3C,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,kCAAQ,KAAK;AACb,aAAO;AAAA,EACX;AACF;AAEA,IAAM,aAAN,MAAM,YAAW;AAAA,EACP;AAAA,EACA;AAAA,EACR,YAAY,OAAgC,OAAoB,CAAC,GAAG;AAClE,SAAK,iBAAa,YAAAC,SAAK;AAAA,MACrB,OAAO,SAAS;AAAA,MAChB,YAAY;AAAA,QACV,MAAM,OAAO;AACX,iBAAO,EAAE,OAAO,MAAM;AAAA,QACxB;AAAA,MACF;AAAA,MACA,WAAW,YAAAA,QAAK,iBAAiB;AAAA,MACjC,WAAW;AAAA,QACT,QAAQ;AAAA,QACR,SAAS,EAAE,UAAU,KAAK;AAAA,MAC5B;AAAA,IACF,CAAC;AACD,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,IAAI,OAAwB,KAAa,OAAoB,CAAC,GAAG;AAC/D,UAAM,aAAa,kBAAM,cAAc;AACvC,QAAI,YAAY;AACd,YAAM,oBAAoB,WAAW,YAAY;AACjD,WAAK,WAAW,kBAAkB;AAClC,WAAK,UAAU,kBAAkB;AACjC,WAAK,cAAc,kBAAkB;AACrC,UAAI,CAAC,KAAK,UAAU;AAElB,eAAO,EAAE,GAAG,MAAM,GAAG,YAAY,WAAW;AAAA,MAC9C;AAAA,IACF;AAEA,SAAK,WAAW,KAAK,EAAE,GAAG;AAC1B,yBAAK,UAAU,QAAQ,IAAI,qBAAqB,SAAS,EAAE,KAAK;AAAA,MAC9D,cAAc;AAAA,MACd,gBAAgB,YAAY,KAAK;AAAA,MACjC,MAAM;AAAA,MACN,YAAY,EAAE,GAAG,KAAK,MAAM,GAAG,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAa,OAAoB,CAAC,GAAG;AACzC,SAAK,IAAI,SAAS,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,KAAK,KAAa,OAAoB,CAAC,GAAG;AACxC,SAAK,IAAI,QAAQ,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,MAAM,KAAa,OAAoB,CAAC,GAAG;AACzC,SAAK,IAAI,SAAS,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,KAAK,KAAa,OAAoB,CAAC,GAAG;AACxC,SAAK,IAAI,QAAQ,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,MAAM,KAAa,OAAoB,CAAC,GAAG;AACzC,SAAK,IAAI,SAAS,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,OAAoB,CAAC,GAAG;AAC5B,WAAO,IAAI,YAAW,KAAK,WAAW,OAAO,EAAE,GAAG,KAAK,MAAM,GAAG,KAAK,CAAC;AAAA,EACxE;AAAA,EAEA,gBAAgB;AACd,WAAO,KAAK;AAAA,EACd;AACF;AAEO,SAAS,OAAO,OAAgC,OAAoB,CAAC,GAAG;AAC7E,SAAO,IAAI,WAAW,OAAO,IAAI;AACnC;;;ACnGA,IAAAC,+BAKO;;;ACNP,IAAAC,iBAA8C;AAC9C,IAAAC,oBAMO;;;ACJA,SAAS,UAAU,MAAsB;AAC9C,QAAM,QAAQ,QAAQ,IAAI,IAAI;AAC9B,SAAO;AACT;;;ACNA,yDAA4C;AAC5C,IAAAC,cASO;AAEP,qCAAgC;AAChC,wCAAmC;AACnC,sCAAkC;AAClC,qCAAuC;AACvC,kCAAoC;AACpC,uBAAyB;AACzB,sBAAwC;AACxC,yBAA8C;AAC9C,sBAAwB;AACxB,IAAAC,+BAKO;AACP,oBAAmB;AAWZ,IAAM,yBAAN,MAEL;AAAA;AAAA,EAcA,YACmB,aACjB,OACA,mBACA;AAHiB;AAIjB,SAAK,SAAS,OAAO,SAAS,MAAM;AAEpC,SAAK,UAAU,CAAC;AAKhB,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO;AAAA,MAC1C,qBAAqB,CAAC;AAAA,IACxB,GAAG;AACD,cAAQ,YAAY;AAAA,QAClB,KAAK;AACH,eAAK,QAAQ,QAA0C,IAAI,oBACxD,SAAS,KAAK,WAAW,EACzB,cAAc,QAAQ;AACzB;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,QAA0C,IAAI,oBACxD,SAAS,KAAK,WAAW,EACzB,YAAY,QAAQ;AACvB;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,QAA0C,IAAI,oBACxD,SAAS,KAAK,WAAW,EACzB,gBAAgB,QAAQ;AAC3B;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,QAA0C,IAAI,oBACxD,SAAS,KAAK,WAAW,EACzB,oBAAoB,QAAQ;AAC/B;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,QAA0C,IAAI,oBACxD,SAAS,KAAK,WAAW,EACzB,wBAAwB,QAAQ;AACnC;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,QAA0C,IAAI,oBACxD,SAAS,KAAK,WAAW,EACzB,sBAAsB,QAAQ;AACjC;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,QAA0C,IAAI,oBACxD,SAAS,KAAK,WAAW,EACzB,8BAA8B,QAAQ;AACzC;AAAA,MACJ;AAAA,IACF;AAEA,SAAK,IAAI,QAAQ,iDAAiD;AAAA,EACpE;AAAA,EApEiB;AAAA,EACA;AAAA,EAqEjB,IAAI,OAAwB,KAAa,OAAoB,CAAC,GAAG;AAC/D,SAAK,OAAO,IAAI,OAAO,KAAK,IAAI;AAAA,EAClC;AAAA,EAEA,KAAK,KAAa,OAAoB,CAAC,GAAG;AACxC,SAAK,OAAO,KAAK,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,MAAM,KAAa,OAAoB,CAAC,GAAG;AACzC,SAAK,OAAO,MAAM,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,KAAK,KAAa,OAAoB,CAAC,GAAG;AACxC,SAAK,OAAO,KAAK,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,MAAM,KAAa,OAAoB,CAAC,GAAG;AACzC,SAAK,OAAO,MAAM,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,KAAa,OAAoB,CAAC,GAAG;AACzC,SAAK,OAAO,MAAM,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,UACE,UACyC;AACzC,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AACF;AAEA,cAAAC,QAAO,OAAO,EAAE,MAAM,UAAU,eAAe,EAAE,CAAC;AAElD,IAAI,wBAAQ;AAAA,EACV,UAAU,IAAI,0BAAS;AAAA,IACrB,CAAC,8CAAiB,GAAG,UAAU,mBAAmB;AAAA,EACpD,CAAC;AAAA,EACD,eAAe,IAAI,kDAAkB;AAAA,IACnC,KAAK,GAAG,UAAU,6BAA6B,KAAK,uBAAuB;AAAA,EAC7E,CAAC;AAAA,EACD,cAAc,IAAI,iDAA8B;AAAA,IAC9C,UAAU,IAAI,qDAAmB;AAAA,MAC/B,KAAK,GAAG,UAAU,6BAA6B,KAAK,uBAAuB;AAAA,IAC7E,CAAC;AAAA,IACD,sBAAsB;AAAA,EACxB,CAAC;AAAA,EACD,qBAAqB;AAAA,IACnB,IAAI;AAAA,MACF,IAAI,+CAAgB;AAAA,QAClB,KAAK,GAAG,UAAU,6BAA6B,KAAK,uBAAuB;AAAA,MAC7E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI,gDAAoB;AAAA,MACtB,6BAA6B,CAAC,MAAM,YAAY;AAC9C,aAAK;AAAA,UACH;AAAA,UACA,UAAU,mBAAmB,KAAK;AAAA,QACpC;AACA,YAAI,oBAAoB,OAAO,GAAG;AAChC,eAAK,aAAa,YAAY,QAAQ,iBAAiB,IAAI;AAAA,QAC7D;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,IAAI,sDAAuB;AAAA,IAC3B,IAAI,+EAA4B;AAAA,EAClC;AACF,CAAC,EAAE,MAAM;AAGF,IAAM,2BAA2B,oBACrC,SAAS,UAAU,mBAAmB,KAAK,SAAS,EACpD,cAOE,uBAAuB;AAAA,EACxB,aAAa;AACf,CAAC;;;AHpLI,SAAS,aAUd,KACA,KACA;AACA,2BAAyB,IAAI,GAAG;AAAA,IAC9B,CAAC,8CAAiB,GAAG,UAAU,mBAAmB;AAAA,IAClD,CAAC,aAAa,GAAG,IAAI,iBAAiB;AAAA,IACtC,CAAC,mBAAmB,GAAG,IAAI,QAAQ;AAAA,IACnC,CAAC,qDAAwB,GAAG,IAAI;AAAA,IAChC,CAAC,4CAAe,GAAG,IAAI;AAAA,IACvB,CAAC,2DAA8B,GAAG,IAAI,cAAc;AAAA,EACtD,CAAC;AACH;;;AIOO,SAAS,sBAUd,UACA,KACA,KAKA,cAGA,MACA,cACA;AACA,MAAI;AACJ,MAAI,cAAc;AAChB,iBASE,KAAK,GAAG;AAEV,QAAI,IAAI,eAAe,KAAK;AAC1B,UAAI,OAAO,GAAG;AACd,aAAO,OAAO,EAAE,MAAM,WAAW;AACjC,mBAAa,KAAK,UAAU,WAAW;AAAA,IACzC;AAEA,IAAAC,OAAM,KAAK,KAAK,CAAC,QAAkB;AACjC,UAAI,KAAK;AACP,YAAI,cAAe,IAAc;AACjC,YAAI,IAAI,OAAO,cAAc;AAC3B,yBAAe;AAAA;AAAA,EAAyB,IAAI,OAAO,YAAY;AAAA,QACjE;AACA,eAAO,OAAO,EAAE,MAAM,WAAW;AACjC,YAAI,OAAO,GAAG;AACd,qBAAa,KAAK,UAAU,WAAW;AACvC,yBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,gBAAgB;AACnB,iBAAa,KAAK,UAAU,IAAI;AAAA,EAClC;AACF;;;AC7EA,SAAS,YAAY,KAAa;AAChC,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD;AAQA,SAAS,kBAAkB,UAAkB;AAC3C,MAAI,SAAS,WAAW,GAAG,GAAG;AAC5B,WAAO,YAAY,SAAS,MAAM,CAAC,CAAC;AAAA,EACtC;AACA,SAAO,IAAI,QAAQ;AACrB;AAUA,SAAS,wBACP,MACA,MACA,OACe;AACf,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,OAAO,QAAQ,IAAI,aAAa;AAAA,MAChC,SAAS,QAAQ,IAAI,WAAW;AAAA,IAClC;AAAA,IACA,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,KAAK,oBAAoB,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAUA,SAAS,gBACP,iBACA,MACe;AACf,QAAM,WAAY,gBAAoC,QAAQ,IAAI;AAClE,SAAO,SAAS,gBAAgB,SAC5B;AAAA,IACE,cAAc;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF,IACA;AAAA,IACE,oBAAoB;AAAA,MAClB,QAAQ;AAAA,IACV;AAAA,EACF;AACN;AAWO,SAAS,wBACd,iBACA,MACA,SACe;AACf,QAAM,OAAoB,CAAC;AAC3B,QAAM,QAAoB,CAAC;AAE3B,UAAQ,KAAK,QAAQ,EAAE,QAAQ,CAAC,WAAW;AACzC,UAAM,iBAAiB,kBAAkB,OAAO,QAAQ;AACxD,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN,aAAa,GAAG,cAAc;AAAA,IAChC,CAAC;AACD,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,YAAM,WAAW,GAAG,OAAO,QAAQ,GACjC,MAAM,SAAS,MAAM,KAAK,MAAM,IAClC,GAAG,QAAQ,WAAW,MAAM;AAC5B,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,cAAM,QAAQ,IAAI,CAAC;AAAA,MACrB;AACA,YAAM,EAAE,MAAM,SAAS,OAAO,eAAe,IAAI,MAAM;AAEvD,YAAM,YAA6B,CAAC;AAEpC,iBAAW,OAAO,MAAM,gBAAgB,WAAW;AACjD,kBAAU,GAAG,IAAI;AAAA,UACf,aAAa,wBAAa,GAAG;AAAA,UAC7B,SAAS;AAAA,YACP;AAAA,YACA,MAAM,gBAAgB,UAAU,GAAG;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,iBAAkC;AAAA,QACtC,MAAM,CAAC,cAAc;AAAA,QACrB,SAAS,GAAG,IAAI,KAAK,OAAO;AAAA,QAC5B,YAAY,CAAC;AAAA,QACb;AAAA,MACF;AACA,UAAI,MAAM,gBAAgB,QAAQ;AAChC,mBAAW,OAAO,MAAM,gBAAgB,QAAQ;AAC9C,yBAAe,YAAY,KAAK;AAAA,YAC9B,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAS,gBAAoC;AAAA,cAC3C,MAAM,gBAAgB,OAAO,GAAG;AAAA,YAClC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,OACJ,MAAM,gBACN;AACF,UAAI,MAAM;AACR,uBAAe,cAAc;AAAA,UAC3B,UAAU;AAAA,UACV,SAAS,gBAAgB,iBAAiB,IAAI;AAAA,QAChD;AAAA,MACF;AAEA,UAAI,gBAAgB;AAClB,mBAAW,OAAO,gBAAgB;AAChC,yBAAe,YAAY,KAAK;AAAA,YAC9B,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAS,gBAAoC;AAAA,cAC3C,eAAe,GAAG;AAAA,YACpB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,OAAO;AACT,mBAAW,OAAO,OAAO;AACvB,yBAAe,YAAY,KAAK;AAAA,YAC9B,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAS,gBAAoC,QAAQ,MAAM,GAAG,CAAC;AAAA,UACjE,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,MAAM,gBAAgB,MAAM;AAC9B,kBAAU,GAAG,IAAI;AAAA,UACf,aAAa,wBAAa,GAAG;AAAA,UAC7B,SAAS,gBAAgB,iBAAiB,gBAAgB,MAAM;AAAA,QAClE;AACA,kBAAU,GAAG,IAAI;AAAA,UACf,aAAa,wBAAa,GAAG;AAAA,UAC7B,SAAS,gBAAgB,iBAAiB,gBAAgB,MAAM;AAAA,QAClE;AACA,YAAI,MAAM,gBAAgB,KAAK,WAAW,OAAO;AAC/C,yBAAe,WAAW;AAAA,YACxB;AAAA,cACE,QAAQ,MAAM;AAAA,gBACZ,MAAM,gBAAgB,KAAK,oBAAoB,OAAO,KAAK,CAAC;AAAA,cAC9D;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,MAAM,WAAW,cAAc;AACjC,cAAM,QAAQ,EAAE,MAAM,MAAM,IAAI;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO,wBAAwB,MAAM,MAAM,KAAK;AAClD;;;AC/NO,SAAS,mBAAgDC,UAAY;AAC1E,SAAOA;AACT;","names":["trace","corsMiddleware","middleware","middleware","trace","import_validator","parse","import_common","import_api","pino","import_semantic_conventions","import_common","import_validator","import_api","import_semantic_conventions","dotenv","parse","metrics"]}
1
+ {"version":3,"sources":["../../src/http/index.ts","../../src/http/middleware/request/cors.middleware.ts","../../src/http/middleware/request/createContext.middleware.ts","../../src/http/telemetry/constants.ts","../../src/http/guards/isForklaunchRouter.ts","../../src/http/guards/isConstrainedForklaunchRouter.ts","../../src/http/guards/isExpressLikeSchemaHandler.ts","../../src/http/guards/isForklaunchExpressLikeRouter.ts","../../src/http/guards/isPathParamContractDetails.ts","../../src/http/guards/isHttpContractDetails.ts","../../src/http/guards/isTypedHandler.ts","../../src/http/middleware/request/auth.middleware.ts","../../src/http/middleware/request/enrichDetails.middleware.ts","../../src/http/middleware/request/parse.middleware.ts","../../src/http/guards/isResponseShape.ts","../../src/http/router/expressLikeRouter.ts","../../src/http/application/expressLikeApplication.ts","../../src/http/guards/isForklaunchRequest.ts","../../src/http/guards/isPath.ts","../../src/http/handlers/typedHandler.ts","../../src/http/handlers/delete.ts","../../src/http/handlers/get.ts","../../src/http/handlers/head.ts","../../src/http/handlers/middleware.ts","../../src/http/handlers/options.ts","../../src/http/handlers/patch.ts","../../src/http/handlers/post.ts","../../src/http/handlers/put.ts","../../src/http/handlers/trace.ts","../../src/http/httpStatusCodes.ts","../../src/http/middleware/response/parse.middleware.ts","../../src/http/telemetry/pinoLogger.ts","../../src/http/telemetry/recordMetric.ts","../../src/services/configInjector.ts","../../src/services/getEnvVar.ts","../../src/http/telemetry/openTelemetryCollector.ts","../../src/http/middleware/response/enrichExpressLikeSend.middleware.ts","../../src/http/openApiV3Generator/openApiV3Generator.ts","../../src/http/telemetry/metricsDefinition.ts"],"sourcesContent":["export * from './application/expressLikeApplication';\nexport * from './guards/isForklaunchRequest';\nexport * from './guards/isForklaunchRouter';\nexport * from './handlers/delete';\nexport * from './handlers/get';\nexport * from './handlers/head';\nexport * from './handlers/middleware';\nexport * from './handlers/options';\nexport * from './handlers/patch';\nexport * from './handlers/post';\nexport * from './handlers/put';\nexport * from './handlers/trace';\nexport * from './handlers/typedHandler';\nexport * from './httpStatusCodes';\nexport * from './interfaces/expressLikeRouter.interface';\nexport * from './middleware/response/enrichExpressLikeSend.middleware';\nexport * from './openApiV3Generator/openApiV3Generator';\nexport * from './router/expressLikeRouter';\nexport * from './telemetry/constants';\nexport * from './telemetry/metricsDefinition';\nexport * from './telemetry/openTelemetryCollector';\nexport * from './telemetry/pinoLogger';\nexport * from './telemetry/recordMetric';\nexport * from './types/apiDefinition.types';\nexport * from './types/contractDetails.types';\nexport * from './types/expressLikeRouter.types';\nexport * from './types/openTelemetryCollector.types';\nexport * from './types/router.types';\nexport * from './types/typedHandler.types';\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport corsMiddleware from 'cors';\nimport { ParsedQs } from 'qs';\nimport {\n ForklaunchNextFunction,\n ForklaunchRequest,\n ForklaunchResHeaders,\n ForklaunchResponse\n} from '../../types/apiDefinition.types';\nimport { ParamsDictionary } from '../../types/contractDetails.types';\n\n/**\n * Cors middleware handler\n *\n * @param req - Express-like request object\n * @param res - Express-like response object\n * @param next - Express-like next function\n */\nexport function cors<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n res: ForklaunchResponse<\n ResBodyMap,\n ForklaunchResHeaders & ResHeaders,\n LocalsObj\n >,\n next?: ForklaunchNextFunction\n) {\n if (req.method === 'OPTIONS') {\n res.cors = true;\n }\n corsMiddleware()(req, res, next ?? (() => {}));\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { trace } from '@opentelemetry/api';\nimport { v4 } from 'uuid';\nimport { ATTR_CORRELATION_ID } from '../../telemetry/constants';\nimport {\n ExpressLikeSchemaHandler,\n ForklaunchNextFunction\n} from '../../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../../types/contractDetails.types';\n\n/**\n * Middleware to create and add a request context.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Request - A type that extends ForklaunchRequest.\n * @template Response - A type that extends ForklaunchResponse.\n * @template NextFunction - A type that extends ForklaunchNextFunction.\n * @param {SV} schemaValidator - The schema validator.\n * @returns {Function} - Middleware function to create request context.\n */\nexport function createContext<\n SV extends AnySchemaValidator,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n>(\n schemaValidator: SV\n): ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n unknown,\n unknown,\n ForklaunchNextFunction\n> {\n return function setContext(req, res, next?) {\n req.schemaValidator = schemaValidator;\n\n let correlationId = v4();\n\n if (req.headers['x-correlation-id']) {\n correlationId = req.headers['x-correlation-id'];\n }\n\n res.setHeader('x-correlation-id', correlationId);\n\n req.context = {\n correlationId: correlationId\n };\n\n const span = trace.getActiveSpan();\n if (span != null) {\n req.context.span = span;\n req.context.span?.setAttribute(ATTR_CORRELATION_ID, correlationId);\n }\n\n next?.();\n };\n}\n","import {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVICE_NAME\n} from '@opentelemetry/semantic-conventions';\n\nexport const ATTR_API_NAME = 'api.name';\nexport const ATTR_CORRELATION_ID = 'correlation.id';\n\nexport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVICE_NAME\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ForklaunchRouter } from '../types/router.types';\n\nexport function isForklaunchRouter<SV extends AnySchemaValidator>(\n maybeForklaunchRouter: unknown\n): maybeForklaunchRouter is ForklaunchRouter<SV> {\n return (\n maybeForklaunchRouter != null &&\n typeof maybeForklaunchRouter === 'object' &&\n 'basePath' in maybeForklaunchRouter &&\n 'routes' in maybeForklaunchRouter &&\n Array.isArray(maybeForklaunchRouter.routes)\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ConstrainedForklaunchRouter } from '../types/router.types';\nimport { isForklaunchRouter } from './isForklaunchRouter';\n\nexport function isConstrainedForklaunchRouter<\n SV extends AnySchemaValidator,\n RouterHandler\n>(\n maybeForklaunchExpressLikeRouter: unknown\n): maybeForklaunchExpressLikeRouter is ConstrainedForklaunchRouter<\n SV,\n RouterHandler\n> {\n return (\n isForklaunchRouter<SV>(maybeForklaunchExpressLikeRouter) &&\n 'requestHandler' in maybeForklaunchExpressLikeRouter\n );\n}\n","import { extractArgumentNames } from '@forklaunch/common';\nimport { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\n\nexport function isExpressLikeSchemaHandler<\n SV extends AnySchemaValidator,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n middleware: unknown\n): middleware is ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n const extractedArgumentNames =\n typeof middleware === 'function' &&\n new Set(\n extractArgumentNames(middleware).map((argumentName) =>\n argumentName.toLowerCase()\n )\n );\n return extractedArgumentNames && extractedArgumentNames.size <= 3;\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeRouter } from '../interfaces/expressLikeRouter.interface';\nimport { ForklaunchExpressLikeRouter } from '../router/expressLikeRouter';\nimport { isConstrainedForklaunchRouter } from './isConstrainedForklaunchRouter';\n\nexport function isForklaunchExpressLikeRouter<\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n RouterHandler,\n Internal extends ExpressLikeRouter<RouterHandler, Internal>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n maybeForklaunchExpressLikeRouter: unknown\n): maybeForklaunchExpressLikeRouter is ForklaunchExpressLikeRouter<\n SV,\n Path,\n RouterHandler,\n Internal,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n return (\n isConstrainedForklaunchRouter<SV, RouterHandler>(\n maybeForklaunchExpressLikeRouter\n ) &&\n 'basePath' in maybeForklaunchExpressLikeRouter &&\n 'internal' in maybeForklaunchExpressLikeRouter\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport {\n ExtractedParamsObject,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\n\nexport function isPathParamHttpContractDetails<\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n ParamsSchema extends ExtractedParamsObject<Path> & ParamsObject<SV>,\n ResponseSchemas extends ResponsesObject<SV>,\n QuerySchema extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n BaseRequest\n>(\n maybePathParamHttpContractDetails: unknown\n): maybePathParamHttpContractDetails is PathParamHttpContractDetails<\n SV,\n Path,\n ParamsSchema,\n ResponseSchemas,\n QuerySchema,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n> {\n return (\n maybePathParamHttpContractDetails != null &&\n typeof maybePathParamHttpContractDetails === 'object' &&\n 'name' in maybePathParamHttpContractDetails &&\n 'summary' in maybePathParamHttpContractDetails &&\n 'responses' in maybePathParamHttpContractDetails &&\n maybePathParamHttpContractDetails.name != null &&\n maybePathParamHttpContractDetails.summary != null &&\n maybePathParamHttpContractDetails.responses != null\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport {\n Body,\n ExtractedParamsObject,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { isPathParamHttpContractDetails } from './isPathParamContractDetails';\n\n/**\n * Type guard for HttpContractDetails\n */\nexport function isHttpContractDetails<\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n ParamsSchema extends ExtractedParamsObject<Path> & ParamsObject<SV>,\n ResponseSchemas extends ResponsesObject<SV>,\n BodySchema extends Body<SV>,\n QuerySchema extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n BaseRequest\n>(\n maybeContractDetails: unknown\n): maybeContractDetails is HttpContractDetails<\n SV,\n Path,\n ParamsSchema,\n ResponseSchemas,\n BodySchema,\n QuerySchema,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n> {\n return (\n isPathParamHttpContractDetails(maybeContractDetails) &&\n 'body' in maybeContractDetails &&\n maybeContractDetails.body != null\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\n\nimport {\n Body,\n HeadersObject,\n Method,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { TypedHandler } from '../types/typedHandler.types';\n\nexport function isTypedHandler<\n SV extends AnySchemaValidator,\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n maybeTypedHandler: unknown\n): maybeTypedHandler is TypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n return (\n maybeTypedHandler != null &&\n typeof maybeTypedHandler === 'object' &&\n '_typedHandler' in maybeTypedHandler &&\n maybeTypedHandler._typedHandler === true\n );\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { jwtVerify } from 'jose';\nimport { ParsedQs } from 'qs';\nimport {\n ForklaunchNextFunction,\n ForklaunchRequest,\n ForklaunchResponse,\n MapParamsSchema,\n MapReqBodySchema,\n MapReqHeadersSchema,\n MapReqQuerySchema,\n MapResBodyMapSchema,\n MapResHeadersSchema,\n ResolvedForklaunchRequest\n} from '../../types/apiDefinition.types';\nimport {\n AuthMethods,\n Body,\n HeadersObject,\n ParamsDictionary,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../../types/contractDetails.types';\n\nconst invalidAuthorizationTokenFormat = [\n 401,\n 'Invalid Authorization token format.'\n] as const;\nconst invalidAuthorizationSubject = [\n 403,\n 'Invalid Authorization subject.'\n] as const;\nconst invalidAuthorizationTokenPermissions = [\n 403,\n 'Invalid Authorization permissions.'\n] as const;\nconst invalidAuthorizationTokenRoles = [\n 403,\n 'Invalid Authorization roles.'\n] as const;\nconst invalidAuthorizationToken = [\n 403,\n 'Invalid Authorization token.'\n] as const;\nconst invalidAuthorizationLogin = [\n 403,\n 'Invalid Authorization login.'\n] as const;\n\n/**\n * Checks the authorization token for validity.\n *\n * @param {AuthMethod} [authorizationMethod] - The method of authorization.\n * @param {string} [authorizationToken] - The authorization string.\n * @returns {Promise<[401 | 403, string] | string | undefined>} - The result of the authorization check.\n */\nasync function checkAuthorizationToken<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n BaseRequest\n>(\n authorizationMethod: AuthMethods<\n SV,\n P,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n BaseRequest\n >,\n authorizationToken?: string,\n req?: ResolvedForklaunchRequest<\n SV,\n P,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n BaseRequest\n >\n): Promise<readonly [401 | 403 | 500, string] | undefined> {\n if (authorizationToken == null) {\n return [401, 'No Authorization token provided.'];\n }\n\n const [tokenPrefix, token] = authorizationToken.split(' ');\n\n let resourceId;\n\n switch (authorizationMethod.method) {\n case 'jwt': {\n if (tokenPrefix !== 'Bearer') {\n return invalidAuthorizationTokenFormat;\n }\n\n try {\n const decodedJwt = await jwtVerify(\n token,\n new TextEncoder().encode(\n // TODO: Check this at application startup if there is any route with jwt checking\n process.env.JWT_SECRET\n )\n );\n\n if (!decodedJwt.payload.sub) {\n return invalidAuthorizationSubject;\n }\n\n resourceId = decodedJwt.payload.sub;\n } catch (error) {\n // TODO: Log error\n console.error(error);\n return invalidAuthorizationToken;\n }\n\n break;\n }\n case 'basic': {\n if (authorizationToken !== 'Basic') {\n return invalidAuthorizationTokenFormat;\n }\n\n const [username, password] = Buffer.from(token, 'base64')\n .toString('utf-8')\n .split(':');\n\n if (!username || !password) {\n return invalidAuthorizationTokenFormat;\n }\n\n if (!authorizationMethod.login(username, password)) {\n return invalidAuthorizationLogin;\n }\n\n resourceId = username;\n break;\n }\n case 'other':\n if (tokenPrefix !== authorizationMethod.tokenPrefix) {\n return invalidAuthorizationTokenFormat;\n }\n\n resourceId = authorizationMethod.decodeResource(token);\n\n break;\n }\n\n if (\n authorizationMethod.allowedPermissions ||\n authorizationMethod.forbiddenPermissions\n ) {\n if (!authorizationMethod.mapPermissions) {\n return [500, 'No permission mapping function provided.'];\n }\n\n const resourcePermissions = await authorizationMethod.mapPermissions(\n resourceId,\n req\n );\n\n if (authorizationMethod.allowedPermissions) {\n if (\n resourcePermissions.intersection(authorizationMethod.allowedPermissions)\n .size === 0\n ) {\n return invalidAuthorizationTokenPermissions;\n }\n }\n\n if (authorizationMethod.forbiddenPermissions) {\n if (\n resourcePermissions.intersection(\n authorizationMethod.forbiddenPermissions\n ).size !== 0\n ) {\n return invalidAuthorizationTokenPermissions;\n }\n }\n }\n\n if (authorizationMethod.allowedRoles || authorizationMethod.forbiddenRoles) {\n if (!authorizationMethod.mapRoles) {\n return [500, 'No role mapping function provided.'];\n }\n\n const resourceRoles = await authorizationMethod.mapRoles(resourceId, req);\n\n if (authorizationMethod.allowedRoles) {\n if (\n resourceRoles.intersection(authorizationMethod.allowedRoles).size === 0\n ) {\n return invalidAuthorizationTokenRoles;\n }\n }\n\n if (authorizationMethod.forbiddenRoles) {\n if (\n resourceRoles.intersection(authorizationMethod.forbiddenRoles).size !==\n 0\n ) {\n return invalidAuthorizationTokenRoles;\n }\n }\n }\n\n return [401, 'Invalid Authorization method.'];\n}\n\n/**\n * Middleware to parse request authorization.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Request - A type that extends ForklaunchRequest.\n * @template Response - A type that extends ForklaunchResponse.\n * @template NextFunction - A type that extends ForklaunchNextFunction.\n * @param {Request} req - The request object.\n * @param {Response} res - The response object.\n * @param {NextFunction} [next] - The next middleware function.\n */\nexport async function parseRequestAuth<\n SV extends AnySchemaValidator,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ForklaunchRequest<\n SV,\n MapParamsSchema<SV, P>,\n MapReqBodySchema<SV, ReqBody>,\n MapReqQuerySchema<SV, ReqQuery>,\n MapReqHeadersSchema<SV, ReqHeaders>\n >,\n res: ForklaunchResponse<\n MapResBodyMapSchema<SV, ResBodyMap>,\n MapResHeadersSchema<SV, ResHeaders>,\n LocalsObj\n >,\n next?: ForklaunchNextFunction\n) {\n const auth = req.contractDetails.auth as AuthMethods<\n SV,\n MapParamsSchema<SV, P>,\n MapReqBodySchema<SV, ReqBody>,\n MapReqQuerySchema<SV, ReqQuery>,\n MapReqHeadersSchema<SV, ReqHeaders>,\n unknown\n >;\n\n if (auth) {\n const [error, message] =\n (await checkAuthorizationToken<\n SV,\n MapParamsSchema<SV, P>,\n MapReqBodySchema<SV, ReqBody>,\n MapReqQuerySchema<SV, ReqQuery>,\n MapReqHeadersSchema<SV, ReqHeaders>,\n unknown\n >(\n auth,\n req.headers[\n (auth.method === 'other' ? auth.headerName : undefined) ??\n 'Authorization'\n ],\n req\n )) ?? [];\n if (error != null) {\n res.status(error).send(message);\n next?.(new Error(message));\n }\n }\n\n next?.();\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ATTR_API_NAME } from '../../telemetry/constants';\nimport {\n ExpressLikeSchemaHandler,\n ForklaunchNextFunction\n} from '../../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponseCompiledSchema,\n ResponsesObject\n} from '../../types/contractDetails.types';\n\n/**\n * Middleware to enrich the request details with contract details.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Request - A type that extends ForklaunchRequest.\n * @template Response - A type that extends ForklaunchResponse.\n * @template NextFunction - A type that extends ForklaunchNextFunction.\n * @param {PathParamHttpContractDetails<SV> | HttpContractDetails<SV>} contractDetails - The contract details.\n * @returns {Function} - Middleware function to enrich request details.\n */\nexport function enrichDetails<\n SV extends AnySchemaValidator,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n>(\n path: string,\n contractDetails: HttpContractDetails<SV> | PathParamHttpContractDetails<SV>,\n requestSchema: unknown,\n responseSchemas: ResponseCompiledSchema\n): ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n unknown,\n unknown,\n ForklaunchNextFunction\n> {\n return (req, res, next?) => {\n req.originalPath = path;\n req.contractDetails = contractDetails;\n req.requestSchema = requestSchema;\n res.responseSchemas = responseSchemas;\n\n req.context.span?.setAttribute(ATTR_API_NAME, req.contractDetails?.name);\n next?.();\n };\n}\n","import {\n AnySchemaValidator,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\nimport { isResponseShape } from '../../guards/isResponseShape';\nimport {\n ForklaunchNextFunction,\n ForklaunchRequest,\n ForklaunchResponse\n} from '../../types/apiDefinition.types';\nimport { ParamsDictionary } from '../../types/contractDetails.types';\n\n/**\n * Pre-handler function to parse and validate input.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Request - A type that extends ForklaunchRequest.\n * @template Response - A type that extends ForklaunchResponse.\n * @template NextFunction - A type that extends ForklaunchNextFunction.\n * @param {Request} req - The request object.\n * @param {Response} res - The response object.\n * @param {NextFunction} [next] - The next middleware function.\n */\nexport function parse<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n _res: ForklaunchResponse<ResBodyMap, ResHeaders, LocalsObj>,\n next?: ForklaunchNextFunction\n) {\n const request = {\n params: req.params,\n query: req.query,\n headers: req.headers,\n body: req.body\n };\n\n const parsedRequest = (req.schemaValidator as SchemaValidator).parse(\n req.requestSchema,\n request\n );\n\n if (\n parsedRequest.ok &&\n isResponseShape<P, ReqHeaders, ReqQuery, ReqBody>(parsedRequest.value)\n ) {\n req.body = parsedRequest.value.body;\n req.params = parsedRequest.value.params;\n req.query = parsedRequest.value.query;\n req.headers = parsedRequest.value.headers;\n }\n if (!parsedRequest.ok) {\n switch (req.contractDetails.options?.requestValidation) {\n default:\n case 'error':\n next?.(\n new Error(prettyPrintParseErrors(parsedRequest.errors, 'Request'))\n );\n break;\n case 'warning':\n console.warn(prettyPrintParseErrors(parsedRequest.errors, 'Request'));\n break;\n case 'none':\n break;\n }\n }\n\n next?.();\n}\n","import { ResponseShape } from '../types/apiDefinition.types';\n\nexport function isResponseShape<Params, Headers, Query, Body>(\n maybeResponseShape: object | undefined\n): maybeResponseShape is ResponseShape<Params, Headers, Query, Body> {\n return (\n maybeResponseShape != null &&\n 'body' in maybeResponseShape &&\n 'query' in maybeResponseShape &&\n 'params' in maybeResponseShape &&\n 'headers' in maybeResponseShape\n );\n}\n","import { AnySchemaValidator, SchemaValidator } from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\n\nimport { RemoveTrailingSlash } from '@forklaunch/common';\nimport { isConstrainedForklaunchRouter } from '../guards/isConstrainedForklaunchRouter';\nimport { isExpressLikeSchemaHandler } from '../guards/isExpressLikeSchemaHandler';\nimport { isForklaunchExpressLikeRouter } from '../guards/isForklaunchExpressLikeRouter';\nimport { isForklaunchRouter } from '../guards/isForklaunchRouter';\nimport { isHttpContractDetails } from '../guards/isHttpContractDetails';\nimport { isPathParamHttpContractDetails } from '../guards/isPathParamContractDetails';\nimport { isTypedHandler } from '../guards/isTypedHandler';\nimport {\n ExpressLikeRouter,\n NestableRouterBasedHandler,\n PathBasedHandler,\n PathOrMiddlewareBasedHandler\n} from '../interfaces/expressLikeRouter.interface';\nimport { parseRequestAuth } from '../middleware/request/auth.middleware';\nimport { enrichDetails } from '../middleware/request/enrichDetails.middleware';\nimport { parse } from '../middleware/request/parse.middleware';\nimport {\n ExpressLikeHandler,\n ExpressLikeSchemaHandler,\n LiveTypeFunction\n} from '../types/apiDefinition.types';\nimport {\n Body,\n ContractDetails,\n HeadersObject,\n HttpContractDetails,\n Method,\n ParamsDictionary,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponseCompiledSchema,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport {\n ContractDetailsOrMiddlewareOrTypedHandler,\n LiveTypeRouteDefinition,\n MiddlewareOrMiddlewareWithTypedHandler,\n TypedMiddlewareDefinition,\n TypedNestableMiddlewareDefinition\n} from '../types/expressLikeRouter.types';\nimport {\n ConstrainedForklaunchRouter,\n ForklaunchRoute,\n ForklaunchRouter\n} from '../types/router.types';\n\n/**\n * A class that represents an Express-like router.\n */\nexport class ForklaunchExpressLikeRouter<\n SV extends AnySchemaValidator,\n BasePath extends `/${string}`,\n RouterHandler,\n Internal extends ExpressLikeRouter<RouterHandler, Internal>,\n BaseRequest,\n BaseResponse,\n NextFunction\n> implements ConstrainedForklaunchRouter<SV, RouterHandler>\n{\n requestHandler!: RouterHandler;\n routers: ForklaunchRouter<SV>[] = [];\n readonly routes: ForklaunchRoute<SV>[] = [];\n readonly basePath: BasePath;\n\n constructor(\n basePath: BasePath,\n readonly schemaValidator: SV,\n readonly internal: Internal\n ) {\n this.basePath = basePath;\n }\n\n /**\n * Resolves middlewares based on the contract details.\n *\n * @param {PathParamHttpContractDetails<SV> | HttpContractDetails<SV>} contractDetails - The contract details.\n * @returns {MiddlewareHandler<SV>[]} - The resolved middlewares.\n */\n #resolveMiddlewares<\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: string,\n contractDetails: HttpContractDetails<SV> | PathParamHttpContractDetails<SV>,\n requestSchema: unknown,\n responseSchemas: ResponseCompiledSchema\n ): ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[] {\n return [\n enrichDetails<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n `${this.basePath}${path}`,\n contractDetails,\n requestSchema,\n responseSchemas\n ),\n parse,\n parseRequestAuth<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >\n ] as ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[];\n }\n\n /**\n * Parses and runs the controller handler with error handling.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @template StatusCode - The type of status code.\n * @param {MiddlewareHandler<SV, P, ResBodyMap | string, ReqBody, ReqQuery, LocalsObj, StatusCode>} requestHandler - The request handler.\n * @returns {ExpressMiddlewareHandler} - The Express request handler.\n */\n #parseAndRunControllerHandler<\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n >(\n requestHandler: ExpressLikeHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n ): ExpressLikeHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n > {\n return async (req, res, next) => {\n if (!requestHandler) {\n throw new Error('Controller handler is not defined');\n }\n\n try {\n await requestHandler(req, res, next);\n } catch (error) {\n if (next && typeof next === 'function') {\n next(error as Error);\n } else {\n throw error;\n }\n }\n };\n }\n\n /**\n * Extracts the controller handler from the provided handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {MiddlewareHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The provided handlers.\n * @returns {MiddlewareHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>} - The extracted controller handler.\n * @throws {Error} - Throws an error if the last argument is not a handler.\n */\n #extractControllerHandler<\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n >(\n handlers: ExpressLikeHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ): ExpressLikeHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n > {\n const controllerHandler = handlers.pop();\n\n if (typeof controllerHandler !== 'function') {\n throw new Error(\n `Last argument must be a handler, received: ${controllerHandler}`\n );\n }\n\n return controllerHandler;\n }\n\n #compile<\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>\n >(\n contractDetails: ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >\n ) {\n const schemaValidator = this.schemaValidator as SchemaValidator;\n\n const requestSchema = schemaValidator.compile(\n schemaValidator.schemify({\n ...(contractDetails.params ? { params: contractDetails.params } : {}),\n ...(contractDetails.requestHeaders\n ? { headers: contractDetails.requestHeaders }\n : {}),\n ...(contractDetails.query ? { query: contractDetails.query } : {}),\n ...(isHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >(contractDetails) && contractDetails.body != null\n ? { body: contractDetails.body }\n : {})\n })\n );\n\n const responseEntries = {\n 400: schemaValidator.string,\n 401: schemaValidator.string,\n 403: schemaValidator.string,\n 404: schemaValidator.string,\n 500: schemaValidator.string,\n ...(isPathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >(contractDetails) ||\n isHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >(contractDetails)\n ? {\n ...contractDetails.responses\n }\n : {})\n };\n\n const responseSchemas: ResponseCompiledSchema = {\n responses: {},\n ...(contractDetails.responseHeaders\n ? {\n headers: schemaValidator.compile(\n schemaValidator.schemify(contractDetails.responseHeaders)\n )\n }\n : {})\n };\n Object.entries(responseEntries).forEach(([code, responseShape]) => {\n responseSchemas.responses[Number(code)] = schemaValidator.compile(\n schemaValidator.schemify(responseShape)\n );\n });\n\n return {\n requestSchema,\n responseSchemas\n };\n }\n\n /**\n * Executes request locally, applying parameters\n *\n * @param handlers {ExpressLikeHandler<SV>}\n * @param controllerHandler\n * @returns\n */\n #localParamRequest<Middleware, Route extends string>(\n handlers: Middleware[],\n controllerHandler: Middleware\n ) {\n return async (\n route: RemoveTrailingSlash<Route>,\n request?: {\n params?: Record<string, string>;\n query?: Record<string, string>;\n headers?: Record<string, string>;\n body?: Record<string, unknown>;\n }\n ) => {\n let statusCode;\n let responseMessage;\n const responseHeaders: Record<string, string> = {};\n\n const req = {\n params: request?.params ?? {},\n query: request?.query ?? {},\n headers: request?.headers ?? {},\n body: request?.body ?? {},\n path: route\n };\n\n const res = {\n status: (code: number) => {\n statusCode = code;\n return res;\n },\n send: (message: string) => {\n responseMessage = message;\n },\n json: (body: Record<string, unknown>) => {\n responseMessage = body;\n },\n jsonp: (body: Record<string, unknown>) => {\n responseMessage = body;\n },\n setHeader: (key: string, value: string) => {\n responseHeaders[key] = value;\n }\n };\n\n let cursor = handlers.shift() as unknown as (\n req_: typeof req,\n resp_: typeof res,\n next: (err?: Error) => Promise<void> | void\n ) => Promise<void> | void;\n\n if (cursor) {\n for (const fn of handlers) {\n await cursor(req, res, (err?: Error) => {\n if (err) {\n throw err;\n }\n\n cursor = fn as unknown as (\n req_: typeof req,\n resp_: typeof res,\n next: (err?: Error) => Promise<void> | void\n ) => Promise<void> | void;\n });\n }\n await cursor(req, res, async (err?: Error) => {\n if (err) {\n throw err;\n }\n });\n }\n\n const cHandler = controllerHandler as unknown as (\n req_: typeof req,\n resp_: typeof res,\n next: (err?: Error) => Promise<void> | void\n ) => void;\n await cHandler(req, res, (err?: Error) => {\n if (err) {\n throw err;\n }\n });\n\n return {\n code: statusCode,\n response: responseMessage,\n headers: responseHeaders\n };\n };\n }\n\n registerRoute<\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n method: ContractMethod,\n path: Path,\n registrationMethod: PathBasedHandler<RouterHandler>,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareAndTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ): LiveTypeFunction<\n SV,\n `${BasePath}${Path}`,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n > {\n // in this case, we know that the first argument is the typedHandler. As a result, we only use defined handlers\n if (\n isTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler)\n ) {\n const { contractDetails, handlers } =\n contractDetailsOrMiddlewareOrTypedHandler;\n return this.registerRoute<\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n method,\n path,\n registrationMethod,\n contractDetails,\n ...handlers\n ) as unknown as LiveTypeFunction<\n SV,\n `${BasePath}${Path}`,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >;\n }\n // in this case, we test for the last element of the handlers. If typed handler, break this down\n else {\n const maybeTypedHandler =\n middlewareOrMiddlewareAndTypedHandler[\n middlewareOrMiddlewareAndTypedHandler.length - 1\n ];\n if (\n isTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(maybeTypedHandler)\n ) {\n const { contractDetails, handlers } = maybeTypedHandler;\n return this.registerRoute<\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n method,\n path,\n registrationMethod,\n contractDetails,\n ...middlewareOrMiddlewareAndTypedHandler.concat(handlers)\n ) as unknown as LiveTypeFunction<\n SV,\n `${BasePath}${Path}`,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >;\n } else {\n if (\n isExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler) ||\n isTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler)\n ) {\n throw new Error('Contract details are not defined');\n }\n const contractDetails = contractDetailsOrMiddlewareOrTypedHandler;\n\n const handlers = (\n middlewareOrMiddlewareAndTypedHandler as unknown[]\n ).filter((handler) =>\n isExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(handler)\n );\n\n if (\n !isHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >(contractDetails) &&\n !isPathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >(contractDetails)\n ) {\n throw new Error(\n 'Contract details are malformed for route definition'\n );\n }\n\n this.routes.push({\n basePath: this.basePath,\n path,\n method,\n contractDetails: contractDetails as PathParamHttpContractDetails<SV>\n });\n\n const { requestSchema, responseSchemas } = this.#compile<\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >(contractDetails);\n\n const controllerHandler = this.#extractControllerHandler(handlers);\n\n registrationMethod.bind(this.internal)(\n path,\n ...(this.#resolveMiddlewares<\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n path,\n contractDetails as PathParamHttpContractDetails<SV>,\n requestSchema,\n responseSchemas\n ).concat(handlers) as RouterHandler[]),\n this.#parseAndRunControllerHandler(controllerHandler) as RouterHandler\n );\n\n return this.#localParamRequest(\n handlers,\n controllerHandler\n ) as LiveTypeFunction<\n SV,\n `${BasePath}${Path}`,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders\n >;\n }\n }\n }\n\n #extractHandlers<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n ArrayReturnType\n >(\n handlers: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n )[],\n processMiddleware?: (handler: unknown) => RouterHandler | Internal\n ) {\n const last = handlers.pop();\n let finalHandlers = last ? [last] : [];\n if (\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(last)\n ) {\n finalHandlers = last.handlers;\n }\n\n handlers.forEach((handler) => {\n if (\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(handler)\n ) {\n throw new Error(\n 'Only the last argument supplied to this function can be a typed handler. Please use only middleware.'\n );\n }\n });\n\n const middleware = processMiddleware\n ? handlers.map(processMiddleware)\n : (handlers as ArrayReturnType[]);\n\n return [...middleware, ...finalHandlers] as ArrayReturnType[];\n }\n\n #extractMiddlewareFromEnrichedTypedHandlerArray<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n handlers: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) {\n return this.#extractHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n RouterHandler\n >(handlers);\n }\n\n #extractNestableMiddlewareFromEnrichedTypedHandlerArray<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n handlers: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n )[]\n ) {\n return this.#extractHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n RouterHandler | Internal\n >(handlers, (handler) =>\n isForklaunchExpressLikeRouter<\n SV,\n Path,\n RouterHandler,\n Internal,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(handler)\n ? handler.internal\n : (handler as RouterHandler)\n );\n }\n\n #processTypedHandlerOrMiddleware<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n handler:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | undefined,\n middleware: RouterHandler[]\n ) {\n if (\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(handler)\n ) {\n middleware.push(...(handler.handlers as RouterHandler[]));\n } else if (isExpressLikeSchemaHandler(handler)) {\n middleware.push(handler as RouterHandler);\n }\n }\n\n #extractMiddlewareAsRouterHandlers<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n contractDetailsOrMiddlewareOrTypedHandler:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | undefined,\n middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) {\n const middleware: RouterHandler[] = [];\n\n this.#processTypedHandlerOrMiddleware<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(contractDetailsOrMiddlewareOrTypedHandler, middleware);\n\n middleware.push(\n ...this.#extractMiddlewareFromEnrichedTypedHandlerArray<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(middlewareOrMiddlewareWithTypedHandler)\n );\n\n return middleware;\n }\n\n #extractNestableMiddlewareAsRouterHandlers<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n contractDetailsOrMiddlewareOrTypedHandler:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n | undefined,\n middlewareOrMiddlewareWithTypedHandler: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n )[]\n ) {\n const middleware: (RouterHandler | Internal)[] = [];\n\n this.#processTypedHandlerOrMiddleware<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n contractDetailsOrMiddlewareOrTypedHandler as ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n middleware as RouterHandler[]\n );\n\n if (\n isForklaunchExpressLikeRouter<\n SV,\n Path,\n RouterHandler,\n Internal,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler)\n ) {\n middleware.push(contractDetailsOrMiddlewareOrTypedHandler.internal);\n }\n\n middleware.push(\n ...this.#extractNestableMiddlewareFromEnrichedTypedHandlerArray<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(middlewareOrMiddlewareWithTypedHandler)\n );\n\n return middleware;\n }\n\n registerMiddlewareHandler<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n registrationMethod: PathOrMiddlewareBasedHandler<RouterHandler>,\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n contractDetailsOrMiddlewareOrTypedHandler?: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ): this {\n const middleware: RouterHandler[] = [];\n\n if (typeof pathOrContractDetailsOrMiddlewareOrTypedHandler === 'string') {\n middleware.push(\n ...this.#extractMiddlewareAsRouterHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n contractDetailsOrMiddlewareOrTypedHandler,\n middlewareOrMiddlewareWithTypedHandler\n )\n );\n const path = pathOrContractDetailsOrMiddlewareOrTypedHandler;\n registrationMethod.bind(this.internal)(path, ...middleware);\n } else {\n middleware.push(\n ...this.#extractMiddlewareAsRouterHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n (isExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler) ||\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler)\n ? [contractDetailsOrMiddlewareOrTypedHandler]\n : []\n ).concat(middlewareOrMiddlewareWithTypedHandler)\n )\n );\n registrationMethod.bind(this.internal)(...middleware);\n }\n return this;\n }\n\n registerNestableMiddlewareHandler<\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n registrationMethod: NestableRouterBasedHandler<RouterHandler, Internal>,\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>,\n contractDetailsOrMiddlewareOrTypedHandler?:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>,\n ...middlewareOrMiddlewareWithTypedHandler: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | ConstrainedForklaunchRouter<SV, RouterHandler>\n )[]\n ): this {\n const middleware: (RouterHandler | Internal)[] = [];\n let path: `/${string}` | undefined;\n\n if (typeof pathOrContractDetailsOrMiddlewareOrTypedHandler === 'string') {\n middleware.push(\n ...this.#extractNestableMiddlewareAsRouterHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n contractDetailsOrMiddlewareOrTypedHandler,\n middlewareOrMiddlewareWithTypedHandler\n )\n );\n path = pathOrContractDetailsOrMiddlewareOrTypedHandler;\n } else {\n if (\n isConstrainedForklaunchRouter<SV, RouterHandler>(\n pathOrContractDetailsOrMiddlewareOrTypedHandler\n )\n ) {\n path = pathOrContractDetailsOrMiddlewareOrTypedHandler.basePath;\n }\n middleware.push(\n ...this.#extractNestableMiddlewareAsRouterHandlers<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n (isExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler) ||\n isTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(contractDetailsOrMiddlewareOrTypedHandler) ||\n isConstrainedForklaunchRouter<SV, RouterHandler>(\n contractDetailsOrMiddlewareOrTypedHandler\n )\n ? [contractDetailsOrMiddlewareOrTypedHandler]\n : []\n ).concat(middlewareOrMiddlewareWithTypedHandler)\n )\n );\n }\n\n if (path) {\n registrationMethod.bind(this.internal)(path, ...middleware);\n } else {\n registrationMethod.bind(this.internal)(...middleware);\n }\n return this;\n }\n\n use: TypedNestableMiddlewareDefinition<\n this,\n RouterHandler,\n Internal,\n SV,\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n Subpath extends `/${string}`,\n Router extends ForklaunchExpressLikeRouter<\n SV,\n Subpath,\n RouterHandler,\n Internal,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | Router,\n contractDetailsOrMiddlewareOrTypedHandler?:\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | Router,\n ...middlewareOrMiddlewareWithTypedHandler: (\n | MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >\n | Router\n )[]\n ) => {\n [\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n ].forEach((arg) => {\n if (isForklaunchRouter<SV>(arg)) {\n this.routers.push(arg);\n }\n });\n\n return this.registerNestableMiddlewareHandler<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n this.internal.use,\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n );\n };\n\n all: TypedMiddlewareDefinition<\n this,\n SV,\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n contractDetailsOrMiddlewareOrTypedHandler?: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return this.registerMiddlewareHandler<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n this.internal.all,\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n );\n };\n\n connect: TypedMiddlewareDefinition<\n this,\n SV,\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n pathOrContractDetailsOrMiddlewareOrTypedHandler:\n | Path\n | ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n contractDetailsOrMiddlewareOrTypedHandler?: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return this.registerMiddlewareHandler<\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n this.internal.connect,\n pathOrContractDetailsOrMiddlewareOrTypedHandler,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n );\n };\n\n /**\n * Registers a GET route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n get: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'get',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'get',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'get',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n get: this.registerRoute<\n 'get',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'get',\n path,\n this.internal.get,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a POST route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {HttpContractDetails<SV, P, ResBodyMap, ReqBody, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Expxwress router.\n */\n post: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'post',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'post',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'post',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n post: this.registerRoute<\n 'post',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'post',\n path,\n this.internal.post,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a PUT route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {HttpContractDetails<SV, P, ResBodyMap, ReqBody, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n put: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'put',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'put',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'put',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n put: this.registerRoute<\n 'put',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'put',\n path,\n this.internal.put,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a PATCH route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {HttpContractDetails<SV, P, ResBodyMap, ReqBody, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n patch: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'patch',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'patch',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'patch',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n patch: this.registerRoute<\n 'patch',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'patch',\n path,\n this.internal.patch,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a DELETE route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n delete: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'delete',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'delete',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'delete',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n delete: this.registerRoute<\n 'delete',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'delete',\n path,\n this.internal.delete,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a OPTIONS route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n options: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'options',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'options',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'options',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n options: this.registerRoute<\n 'options',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'options',\n path,\n this.internal.options,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a HEAD route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n head: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'head',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'head',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'head',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n head: this.registerRoute<\n 'head',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'head',\n path,\n this.internal.head,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n\n /**\n * Registers a TRACE route with the specified contract details and handler handlers.\n *\n * @template P - The type of request parameters.\n * @template ResBodyMap - The type of response body.\n * @template ReqBody - The type of request body.\n * @template ReqQuery - The type of request query.\n * @template LocalsObj - The type of local variables.\n * @param {string} path - The path for the route.\n * @param {PathParamHttpContractDetails<SV, P, ResBodyMap, ReqQuery>} contractDetails - The contract details.\n * @param {...SchemaHandler<SV, P, ResBodyMap, ReqBody, ReqQuery, LocalsObj>[]} handlers - The handler handlers.\n * @returns {ExpressRouter} - The Express router.\n */\n trace: LiveTypeRouteDefinition<\n SV,\n BasePath,\n 'trace',\n BaseRequest,\n BaseResponse,\n NextFunction\n > = <\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>\n >(\n path: Path,\n contractDetailsOrMiddlewareOrTypedHandler: ContractDetailsOrMiddlewareOrTypedHandler<\n SV,\n 'trace',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...middlewareOrMiddlewareWithTypedHandler: MiddlewareOrMiddlewareWithTypedHandler<\n SV,\n 'trace',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n ) => {\n return {\n trace: this.registerRoute<\n 'trace',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj\n >(\n 'trace',\n path,\n this.internal.trace,\n contractDetailsOrMiddlewareOrTypedHandler,\n ...middlewareOrMiddlewareWithTypedHandler\n )\n };\n };\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeRouter } from '../interfaces/expressLikeRouter.interface';\nimport { cors } from '../middleware/request/cors.middleware';\nimport { createContext } from '../middleware/request/createContext.middleware';\nimport { ForklaunchExpressLikeRouter } from '../router/expressLikeRouter';\n\n/**\n * ForklaunchExpressLikeApplication class that sets up routes and middleware for an Express-like application, for use with controller/routes pattern.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template Server - The server type.\n */\nexport abstract class ForklaunchExpressLikeApplication<\n SV extends AnySchemaValidator,\n Server extends ExpressLikeRouter<RouterHandler, Server>,\n RouterHandler,\n BaseRequest,\n BaseResponse,\n NextFunction\n> extends ForklaunchExpressLikeRouter<\n SV,\n '/',\n RouterHandler,\n Server,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n /**\n * Creates an instance of the Application class.\n *\n * @param {SV} schemaValidator - The schema validator.\n */\n constructor(\n readonly schemaValidator: SV,\n readonly internal: Server\n ) {\n super('/', schemaValidator, internal);\n\n this.internal.use(createContext(this.schemaValidator) as RouterHandler);\n this.internal.use(cors as RouterHandler);\n }\n\n abstract listen(...args: unknown[]): void;\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\nimport { ForklaunchRequest } from '../types/apiDefinition.types';\nimport { ParamsDictionary } from '../types/contractDetails.types';\n\nexport function isForklaunchRequest<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>\n>(\n request: unknown\n): request is ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders> {\n return (\n request != null &&\n typeof request === 'object' &&\n 'contractDetails' in request\n );\n}\n","export function isPath<Path extends `/${string}`>(path: string): path is Path {\n return path.startsWith('/');\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { isPath } from '../guards/isPath';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n ContractDetails,\n HeadersObject,\n Method,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { ExpressLikeTypedHandler } from '../types/typedHandler.types';\n\n/**\n * Router class that sets up routes and middleware for an Express router, for use with controller/routes pattern.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @template contractDetails - The contract details.\n * @template handlers - The handler middlware and handler.\n */\nexport function typedHandler<\n SV extends AnySchemaValidator,\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n _path: Path | undefined,\n _contractMethod: ContractMethod,\n contractDetails: ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n): ExpressLikeTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n>;\nexport function typedHandler<\n SV extends AnySchemaValidator,\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n _contractMethod: ContractMethod,\n contractDetails: ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n): ExpressLikeTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n>;\nexport function typedHandler<\n SV extends AnySchemaValidator,\n ContractMethod extends Method,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n pathOrContractMethod: Path | ContractMethod,\n contractMethodOrContractDetails:\n | ContractMethod\n | ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n contractDetailsOrHandler:\n | ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >\n | ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >,\n ...handlerArray: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n): ExpressLikeTypedHandler<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n> {\n // TODO: Clean this up with guards\n\n let contractDetails: ContractDetails<\n SV,\n ContractMethod,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >;\n let handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[];\n // If path is not provided\n if (typeof contractMethodOrContractDetails === 'string') {\n if (typeof contractDetailsOrHandler !== 'function') {\n contractDetails = contractDetailsOrHandler;\n } else {\n throw new Error('Invalid definition for contract details');\n }\n handlers = handlerArray;\n }\n // If path is provided\n else {\n contractDetails = contractMethodOrContractDetails;\n if (typeof contractDetailsOrHandler === 'function') {\n handlers = [contractDetailsOrHandler, ...handlerArray];\n } else {\n throw new Error('Invalid definition for handler');\n }\n }\n return {\n _typedHandler: true as const,\n _path: isPath(pathOrContractMethod) ? pathOrContractMethod : undefined,\n contractDetails,\n handlers\n };\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const delete_ = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'delete',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'delete', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const get = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'get',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'get', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const head = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'head',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'head', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n ContractDetails,\n HeadersObject,\n MiddlewareContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const middleware = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: MiddlewareContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'middleware', contractDetails, ...handlers) as {\n _typedHandler: true;\n _path: Path;\n contractDetails: ContractDetails<\n SV,\n 'middleware',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >;\n handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[];\n };\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const options = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'options',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'options', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const patch = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: HttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'patch',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'patch', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const post = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: HttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'post',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'post', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n HttpContractDetails,\n ParamsObject,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const put = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: HttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'put',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'put', contractDetails, ...handlers);\n};\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ExpressLikeSchemaHandler } from '../types/apiDefinition.types';\nimport {\n Body,\n HeadersObject,\n ParamsObject,\n PathParamHttpContractDetails,\n QueryObject,\n ResponsesObject\n} from '../types/contractDetails.types';\nimport { typedHandler } from './typedHandler';\n\nexport const trace = <\n SV extends AnySchemaValidator,\n Path extends `/${string}`,\n P extends ParamsObject<SV>,\n ResBodyMap extends ResponsesObject<SV>,\n ReqBody extends Body<SV>,\n ReqQuery extends QueryObject<SV>,\n ReqHeaders extends HeadersObject<SV>,\n ResHeaders extends HeadersObject<SV>,\n LocalsObj extends Record<string, unknown>,\n BaseRequest,\n BaseResponse,\n NextFunction\n>(\n _schemaValidator: SV,\n path: Path,\n contractDetails: PathParamHttpContractDetails<\n SV,\n Path,\n P,\n ResBodyMap,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n BaseRequest\n >,\n ...handlers: ExpressLikeSchemaHandler<\n SV,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >[]\n) => {\n return typedHandler<\n SV,\n 'trace',\n Path,\n P,\n ResBodyMap,\n ReqBody,\n ReqQuery,\n ReqHeaders,\n ResHeaders,\n LocalsObj,\n BaseRequest,\n BaseResponse,\n NextFunction\n >(_schemaValidator, path, 'trace', contractDetails, ...handlers);\n};\n","/**\n * Object-map of the HTTP Status Codes. Maps from the status code, to the\n * textual name. The key is the HTTP Status Code number, and the resulting\n * value will be the textual name for that Status Code.\n *\n * The comments for each item are taken from httpstatuses.com and the RFC-7231\n * document.\n *\n * @see https://httpstatuses.com\n * @see https://datatracker.ietf.org/doc/html/rfc7231\n */\nexport const HTTPStatuses: Readonly<{ [key: number]: string }> = {\n /**\n * The initial part of a request has been received and has not yet been\n * rejected by the server. The server intends to send a final response after\n * the request has been fully received and acted upon.\n *\n * When the request contains an Expect header field that includes a\n * 100-continue expectation, the 100 response indicates that the server\n * wishes to receive the request payload body. The client ought to continue\n * sending the request and discard the 100 response.\n *\n * If the request did not contain an Expect header field containing the\n * 100-continue expectation, the client can simply discard this interim\n * response.\n */\n 100: 'Continue',\n\n /**\n * The server understands and is willing to comply with the client's request,\n * via the Upgrade header field, for a change in the application protocol\n * being used on this connection.\n *\n * The server MUST generate an Upgrade header field in the response that\n * indicates which protocol(s) will be switched to immediately after the\n * empty line that terminates the 101 response.\n *\n * It is assumed that the server will only agree to switch protocols when it\n * is advantageous to do so. For example, switching to a newer version of\n * HTTP might be advantageous over older versions, and switching to a\n * real-time, synchronous protocol might be advantageous when delivering\n * resources that use such features.\n */\n 101: 'Switching Protocols',\n\n /**\n * An interim response used to inform the client that the server has accepted\n * the complete request, but has not yet completed it.\n *\n * This status code SHOULD only be sent when the server has a reasonable\n * expectation that the request will take significant time to complete. As\n * guidance, if a method is taking longer than 20 seconds (a reasonable, but\n * arbitrary value) to process the server SHOULD return a 102 (Processing)\n * response. The server MUST send a final response after the request has been\n * completed.\n *\n * Methods can potentially take a long period of time to process, especially\n * methods that support the Depth header. In such cases the client may\n * time-out the connection while waiting for a response. To prevent this the\n * server may return a 102 Processing status code to indicate to the client\n * that the server is still processing the method.\n */\n 102: 'Processing',\n\n /**\n * The request has succeeded.\n *\n * Aside from responses to CONNECT, a 200 response always has a payload,\n * though an origin server MAY generate a payload body of zero length. If no\n * payload is desired, an origin server ought to send 204 No Content instead.\n * For CONNECT, no payload is allowed because the successful result is a\n * tunnel, which begins immediately after the 200 response header section.\n *\n * A 200 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n */\n 200: 'OK',\n\n /**\n * The request has been fulfilled and has resulted in one or more new\n * resources being created.\n *\n * The primary resource created by the request is identified by either a\n * Location header field in the response or, if no Location field is\n * received, by the effective request URI.\n *\n * The 201 response payload typically describes and links to the resource(s)\n * created. See Section 7.2 of RFC7231 for a discussion of the meaning and\n * purpose of validator header fields, such as ETag and Last-Modified, in a\n * 201 response.\n */\n 201: 'Created',\n\n /**\n * The request has been accepted for processing, but the processing has not\n * been completed. The request might or might not eventually be acted upon,\n * as it might be disallowed when processing actually takes place.\n *\n * There is no facility in HTTP for re-sending a status code from an\n * asynchronous operation.\n *\n * The 202 response is intentionally noncommittal. Its purpose is to allow a\n * server to accept a request for some other process (perhaps a\n * batch-oriented process that is only run once per day) without requiring\n * that the user agent's connection to the server persist until the process\n * is completed. The representation sent with this response ought to describe\n * the request's current status and point to (or embed) a status monitor that\n * can provide the user with an estimate of when the request will be\n * fulfilled.\n */\n 202: 'Accepted',\n\n /**\n * The request was successful but the enclosed payload has been modified from\n * that of the origin server's 200 OK response by a transforming proxy.\n *\n * This status code allows the proxy to notify recipients when a\n * transformation has been applied, since that knowledge might impact later\n * decisions regarding the content. For example, future cache validation\n * requests for the content might only be applicable along the same request\n * path (through the same proxies).\n *\n * The 203 response is similar to the Warning code of 214 Transformation\n * Applied, which has the advantage of being applicable to responses with any\n * status code.\n *\n * A 203 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n */\n 203: 'Non-authoritative Information',\n\n /**\n * The server has successfully fulfilled the request and that there is no\n * additional content to send in the response payload body.\n *\n * Metadata in the response header fields refer to the target resource and\n * its selected representation after the requested action was applied.\n *\n * A 204 response is terminated by the first empty line after the header\n * fields because it cannot contain a message body.\n *\n * A 204 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n */\n 204: 'No Content',\n\n /**\n * He server has fulfilled the request and desires that the user agent reset\n * the \"document view\", which caused the request to be sent, to its original\n * state as received from the origin server.\n *\n * This response is intended to support a common data entry use case where\n * the user receives content that supports data entry (a form, notepad,\n * canvas, etc.), enters or manipulates data in that space, causes the\n * entered data to be submitted in a request, and then the data entry\n * mechanism is reset for the next entry so that the user can easily\n * initiate another input action.\n *\n * Since the 205 status code implies that no additional content will be\n * provided, a server MUST NOT generate a payload in a 205 response. In\n * other words, a server MUST do one of the following for a 205 response: a)\n * indicate a zero-length body for the response by including a\n * Content-Length header field with a value of 0; b) indicate a zero-length\n * payload for the response by including a Transfer-Encoding header field\n * with a value of chunked and a message body consisting of a single chunk\n * of zero-length; or, c) close the connection immediately after sending the\n * blank line terminating the header section.\n */\n 205: 'Reset Content',\n\n /**\n * The server is successfully fulfilling a range request for the target\n * resource by transferring one or more parts of the selected representation\n * that correspond to the satisfiable ranges found in the request's Range\n * header field.\n *\n * If a single part is being transferred, the server generating the 206\n * response MUST generate a Content-Range header field, describing what range\n * of the selected representation is enclosed, and a payload consisting of\n * the range.\n *\n * If multiple parts are being transferred, the server generating the 206\n * response MUST generate a \"multipart/byteranges\" payload2, and a\n * Content-Type header field containing the multipart/byteranges media type\n * and its required boundary parameter. To avoid confusion with single-part\n * responses, a server MUST NOT generate a Content-Range header field in the\n * HTTP header section of a multiple part response (this field will be sent\n * in each part instead).\n *\n * Within the header area of each body part in the multipart payload, the\n * server MUST generate a Content-Range header field corresponding to the\n * range being enclosed in that body part. If the selected representation\n * would have had a Content-Type header field in a 200 OK response, the\n * server SHOULD generate that same Content-Type field in the header area of\n * each body part.\n *\n * When multiple ranges are requested, a server MAY coalesce any of the\n * ranges that overlap, or that are separated by a gap that is smaller than\n * the overhead of sending multiple parts, regardless of the order in which\n * the corresponding byte-range-spec appeared in the received Range header\n * field. Since the typical overhead between parts of a multipart/byteranges\n * payload is around 80 bytes, depending on the selected representation's\n * media type and the chosen boundary parameter length, it can be less\n * efficient to transfer many small disjoint parts than it is to transfer the\n * entire selected representation.\n *\n * A server MUST NOT generate a multipart response to a request for a single\n * range, since a client that does not request multiple parts might not\n * support multipart responses. However, a server MAY generate a\n * multipart/byteranges payload with only a single body part if multiple\n * ranges were requested and only one range was found to be satisfiable or\n * only one range remained after coalescing. A client that cannot process a\n * multipart/byteranges response MUST NOT generate a request that asks for\n * multiple ranges.\n *\n * When a multipart response payload is generated, the server SHOULD send the\n * parts in the same order that the corresponding byte-range-spec appeared in\n * the received Range header field, excluding those ranges that were deemed\n * unsatisfiable or that were coalesced into other ranges. A client that\n * receives a multipart response MUST inspect the Content-Range header field\n * present in each body part in order to determine which range is contained\n * in that body part; a client cannot rely on receiving the same ranges that\n * it requested, nor the same order that it requested.\n *\n * When a 206 response is generated, the server MUST generate the following\n * header fields, in addition to those required above, if the field would\n * have been sent in a 200 OK response to the same request: Date,\n * Cache-Control, ETag, Expires, Content-Location, and Vary.\n *\n * If a 206 is generated in response to a request with an If-Range header\n * field, the sender SHOULD NOT generate other representation header fields\n * beyond those required above, because the client is understood to already\n * have a prior response containing those header fields. Otherwise, the\n * sender MUST generate all of the representation header fields that would\n * have been sent in a 200 OK response to the same request.\n *\n * A 206 response is cacheable by default; i.e., unless otherwise indicated\n * by explicit cache controls.\n */\n 206: 'Partial Content',\n\n /**\n * A Multi-Status response conveys information about multiple resources in\n * situations where multiple status codes might be appropriate.\n *\n * The default Multi-Status response body is a text/xml or application/xml\n * HTTP entity with a 'multistatus' root element. Further elements contain\n * 200, 300, 400, and 500 series status codes generated during the method\n * invocation. 100 series status codes SHOULD NOT be recorded in a 'response'\n * XML element.\n *\n * Although '207' is used as the overall response status code, the recipient\n * needs to consult the contents of the multistatus response body for further\n * information about the success or failure of the method execution. The\n * response MAY be used in success, partial success and also in failure\n * situations.\n *\n * The 'multistatus' root element holds zero or more 'response' elements in\n * any order, each with information about an individual resource. Each\n * 'response' element MUST have an 'href' element to identify the resource.\n *\n * A Multi-Status response uses one out of two distinct formats for\n * representing the status:\n *\n * 1. A 'status' element as child of the 'response' element indicates the\n * status of the message execution for the identified resource as a whole.\n * Some method definitions provide information about specific status codes\n * clients should be prepared to see in a response. However, clients MUST be\n * able to handle other status codes, using the generic rules defined in\n * RFC2616 Section 10.\n *\n * 2. For PROPFIND and PROPPATCH, the format has been extended using the\n * 'propstat' element instead of 'status', providing information about\n * individual properties of a resource. This format is specific to PROPFIND\n * and PROPPATCH, and is described in detail in RFC4918 Section 9.1 and\n * RFC4918 Section 9.2.\n */\n 207: 'Multi-Status',\n\n /**\n * Used inside a DAV: propstat response element to avoid enumerating the\n * internal members of multiple bindings to the same collection repeatedly.\n *\n * For each binding to a collection inside the request's scope, only one will\n * be reported with a 200 status, while subsequent DAV:response elements for\n * all other bindings will use the 208 status, and no DAV:response elements\n * for their descendants are included.\n *\n * Note that the 208 status will only occur for \"Depth: infinity\" requests,\n * and that it is of particular importance when the multiple collection\n * bindings cause a bind loop.\n *\n * A client can request the DAV:resource-id property in a PROPFIND request to\n * guarantee that they can accurately reconstruct the binding structure of a\n * collection with multiple bindings to a single resource.\n *\n * For backward compatibility with clients not aware of the 208 status code\n * appearing in multistatus response bodies, it SHOULD NOT be used unless the\n * client has signaled support for this specification using the \"DAV\" request\n * header. Instead, a 508 Loop Detected status should be returned when a\n * binding loop is discovered. This allows the server to return the 508 as\n * the top-level return status, if it discovers it before it started the\n * response, or in the middle of a multistatus, if it discovers it in the\n * middle of streaming out a multistatus response.\n */\n 208: 'Already Reported',\n\n /**\n * The server has fulfilled a GET request for the resource, and the response\n * is a representation of the result of one or more instance-manipulations\n * applied to the current instance.\n *\n * The actual current instance might not be available except by combining\n * this response with other previous or future responses, as appropriate for\n * the specific instance-manipulation(s). If so, the headers of the resulting\n * instance are the result of combining the headers from the 226 response and\n * the other instances, following the rules in section 13.5.3 of the HTTP/1.1\n * specification.\n *\n * The request MUST have included an A-IM header field listing at least one\n * instance-manipulation. The response MUST include an Etag header field\n * giving the entity tag of the current instance.\n *\n * A response received with a status code of 226 MAY be stored by a cache and\n * used in reply to a subsequent request, subject to the HTTP expiration\n * mechanism and any Cache-Control headers, and to the requirements in\n * section 10.6.\n *\n * A response received with a status code of 226 MAY be used by a cache, in\n * conjunction with a cache entry for the base instance, to create a cache\n * entry for the current instance.\n */\n 226: 'IM Used',\n\n /**\n * The target resource has more than one representation, each with its own\n * more specific identifier, and information about the alternatives is being\n * provided so that the user (or user agent) can select a preferred\n * representation by redirecting its request to one or more of those\n * identifiers.\n *\n * In other words, the server desires that the user agent engage in reactive\n * negotiation to select the most appropriate representation(s) for its\n * needs.\n *\n * If the server has a preferred choice, the server SHOULD generate a\n * Location header field containing a preferred choice's URI reference. The\n * user agent MAY use the Location field value for automatic redirection.\n *\n * For request methods other than HEAD, the server SHOULD generate a payload\n * in the 300 response containing a list of representation metadata and URI\n * reference(s) from which the user or user agent can choose the one most\n * preferred. The user agent MAY make a selection from that list\n * automatically if it understands the provided media type. A specific format\n * for automatic selection is not defined by this specification because HTTP\n * tries to remain orthogonal to the definition of its payloads. In practice,\n * the representation is provided in some easily parsed format believed to be\n * acceptable to the user agent, as determined by shared design or content\n * negotiation, or in some commonly accepted hypertext format.\n *\n * A 300 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n *\n * Note: The original proposal for the 300 status code defined the URI header\n * field as providing a list of alternative representations, such that it\n * would be usable for 200, 300, and 406 responses and be transferred in\n * responses to the HEAD method. However, lack of deployment and disagreement\n * over syntax led to both URI and Alternates (a subsequent proposal) being\n * dropped from this specification. It is possible to communicate the list\n * using a set of Link header fields3, each with a relationship of\n * \"alternate\", though deployment is a chicken-and-egg problem.\n */\n 300: 'Multiple Choices',\n\n /**\n * The target resource has been assigned a new permanent URI and any future\n * references to this resource ought to use one of the enclosed URIs.\n *\n * Clients with link-editing capabilities ought to automatically re-link\n * references to the effective request URI to one or more of the new\n * references sent by the server, where possible.\n *\n * The server SHOULD generate a Location header field in the response\n * containing a preferred URI reference for the new permanent URI. The user\n * agent MAY use the Location field value for automatic redirection. The\n * server's response payload usually contains a short hypertext note with a\n * hyperlink to the new URI(s).\n *\n * Note: For historical reasons, a user agent MAY change the request method\n * from POST to GET for the subsequent request. If this behavior is\n * undesired, the 307 Temporary Redirect status code can be used instead.\n *\n * A 301 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n */\n 301: 'Moved Permanently',\n\n /**\n * The target resource resides temporarily under a different URI. Since the\n * redirection might be altered on occasion, the client ought to continue to\n * use the effective request URI for future requests.\n *\n * The server SHOULD generate a Location header field in the response\n * containing a URI reference for the different URI. The user agent MAY use\n * the Location field value for automatic redirection. The server's response\n * payload usually contains a short hypertext note with a hyperlink to the\n * different URI(s).\n *\n * Note: For historical reasons, a user agent MAY change the request method\n * from POST to GET for the subsequent request. If this behavior is\n * undesired, the 307 Temporary Redirect status code can be used instead.\n */\n 302: 'Found',\n\n /**\n * The server is redirecting the user agent to a different resource, as\n * indicated by a URI in the Location header field, which is intended to\n * provide an indirect response to the original request.\n *\n * A user agent can perform a retrieval request targeting that URI (a GET or\n * HEAD request if using HTTP), which might also be redirected, and present\n * the eventual result as an answer to the original request. Note that the\n * new URI in the Location header field is not considered equivalent to the\n * effective request URI.\n *\n * This status code is applicable to any HTTP method. It is primarily used\n * to allow the output of a POST action to redirect the user agent to a\n * selected resource, since doing so provides the information corresponding\n * to the POST response in a form that can be separately identified,\n * bookmarked, and cached, independent of the original request.\n *\n * A 303 response to a GET request indicates that the origin server does not\n * have a representation of the target resource that can be transferred by\n * the server over HTTP. However, the Location field value refers to a\n * resource that is descriptive of the target resource, such that making a\n * retrieval request on that other resource might result in a representation\n * that is useful to recipients without implying that it represents the\n * original target resource. Note that answers to the questions of what can\n * be represented, what representations are adequate, and what might be a\n * useful description are outside the scope of HTTP.\n *\n * Except for responses to a HEAD request, the representation of a 303\n * response ought to contain a short hypertext note with a hyperlink to the\n * same URI reference provided in the Location header field.\n */\n 303: 'See Other',\n\n /**\n * A conditional GET or HEAD request has been received and would have\n * resulted in a 200 OK response if it were not for the fact that the\n * condition evaluated to false.\n *\n * In other words, there is no need for the server to transfer a\n * representation of the target resource because the request indicates that\n * the client, which made the request conditional, already has a valid\n * representation; the server is therefore redirecting the client to make\n * use of that stored representation as if it were the payload of a 200 OK\n * response.\n *\n * The server generating a 304 response MUST generate any of the following\n * header fields that would have been sent in a 200 OK response to the same\n * request: Cache-Control, Content-Location, Date, ETag, Expires, and Vary.\n *\n * Since the goal of a 304 response is to minimize information transfer when\n * the recipient already has one or more cached representations, a sender\n * SHOULD NOT generate representation metadata other than the above listed\n * fields unless said metadata exists for the purpose of guiding cache\n * updates (e.g., Last-Modified might be useful if the response does not have\n * an ETag field).\n *\n * Requirements on a cache that receives a 304 response are defined in\n * Section 4.3.4 of RFC7234. If the conditional request originated with an\n * outbound client, such as a user agent with its own cache sending a\n * conditional GET to a shared proxy, then the proxy SHOULD forward the\n * 304 response to that client.\n *\n * A 304 response cannot contain a message-body; it is always terminated by\n * the first empty line after the header fields.\n */\n 304: 'Not Modified',\n\n /**\n * Defined in a previous version of this specification and is now deprecated,\n * due to security concerns regarding in-band configuration of a proxy.\n */\n 305: 'Use Proxy',\n\n /**\n * The target resource resides temporarily under a different URI and the user\n * agent MUST NOT change the request method if it performs an automatic\n * redirection to that URI.\n *\n * Since the redirection can change over time, the client ought to continue\n * using the original effective request URI for future requests.\n *\n * The server SHOULD generate a Location header field in the response\n * containing a URI reference for the different URI. The user agent MAY use\n * the Location field value for automatic redirection. The server's response\n * payload usually contains a short hypertext note with a hyperlink to the\n * different URI(s).\n *\n * Note: This status code is similar to 302 Found, except that it does not\n * allow changing the request method from POST to GET. This specification\n * defines no equivalent counterpart for 301 Moved Permanently (RFC7238,\n * however, proposes defining the status code 308 Permanent Redirect for\n * this purpose).\n */\n 307: 'Temporary Redirect',\n\n /**\n * The target resource has been assigned a new permanent URI and any future\n * references to this resource ought to use one of the enclosed URIs.\n *\n * Clients with link editing capabilities ought to automatically re-link\n * references to the effective request URI to one or more of the new\n * references sent by the server, where possible.\n *\n * The server SHOULD generate a Location header field in the response\n * containing a preferred URI reference for the new permanent URI. The user\n * agent MAY use the Location field value for automatic redirection. The\n * server's response payload usually contains a short hypertext note with a\n * hyperlink to the new URI(s).\n *\n * A 308 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls.\n *\n * Note: This status code is similar to 301 Moved Permanently, except that it\n * does not allow changing the request method from POST to GET.\n */\n 308: 'Permanent Redirect',\n\n /**\n * The 400 (Bad Request) status code indicates that the server cannot or\n * will not process the request due to something that is perceived to be\n * a client error (e.g., malformed request syntax, invalid request\n * message framing, or deceptive request routing).\n */\n 400: 'Bad Request',\n\n /**\n * The request has not been applied because it lacks valid authentication\n * credentials for the target resource.\n *\n * The server generating a 401 response MUST send a WWW-Authenticate header\n * field containing at least one challenge applicable to the target resource.\n *\n * If the request included authentication credentials, then the 401 response\n * indicates that authorization has been refused for those credentials. The\n * user agent MAY repeat the request with a new or replaced Authorization\n * header field. If the 401 response contains the same challenge as the\n * prior response, and the user agent has already attempted authentication at\n * least once, then the user agent SHOULD present the enclosed representation\n * to the user, since it usually contains relevant diagnostic information.\n */\n 401: 'Unauthorized',\n\n /**\n * The 402 (Payment Required) status code is reserved for future use.\n */\n 402: 'Payment Required',\n\n /**\n * The 403 (Forbidden) status code indicates that the server understood\n * the request but refuses to authorize it. A server that wishes to\n * make public why the request has been forbidden can describe that\n * reason in the response payload (if any).\n *\n * If authentication credentials were provided in the request, the\n * server considers them insufficient to grant access. The client\n * SHOULD NOT automatically repeat the request with the same\n * credentials. The client MAY repeat the request with new or different\n * credentials. However, a request might be forbidden for reasons\n * unrelated to the credentials.\n *\n * An origin server that wishes to \"hide\" the current existence of a\n * forbidden target resource MAY instead respond with a status code of\n * 404 (Not Found).\n */\n 403: 'Forbidden',\n\n /**\n * The 404 (Not Found) status code indicates that the origin server did\n * not find a current representation for the target resource or is not\n * willing to disclose that one exists. A 404 status code does not\n * indicate whether this lack of representation is temporary or\n * permanent; the 410 (Gone) status code is preferred over 404 if the\n * origin server knows, presumably through some configurable means, that\n * the condition is likely to be permanent.\n *\n * A 404 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 404: 'Not Found',\n\n /**\n * The 405 (Method Not Allowed) status code indicates that the method\n * received in the request-line is known by the origin server but not\n * supported by the target resource. The origin server MUST generate an\n * Allow header field in a 405 response containing a list of the target\n * resource's currently supported methods.\n *\n * A 405 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 405: 'Method Not Allowed',\n\n /**\n * The 406 (Not Acceptable) status code indicates that the target\n * resource does not have a current representation that would be\n * acceptable to the user agent, according to the proactive negotiation\n * header fields received in the request (Section 5.3), and the server\n * is unwilling to supply a default representation.\n *\n * The server SHOULD generate a payload containing a list of available\n * representation characteristics and corresponding resource identifiers\n * from which the user or user agent can choose the one most\n * appropriate. A user agent MAY automatically select the most\n * appropriate choice from that list. However, this specification does\n * not define any standard for such automatic selection, as described in\n * Section 6.4.1 of [RFC7231]\n */\n 406: 'Not Acceptable',\n\n /**\n * Similar to 401 Unauthorized, but it indicates that the client needs to\n * authenticate itself in order to use a proxy.\n *\n * The proxy MUST send a Proxy-Authenticate header field containing a\n * challenge applicable to that proxy for the target resource. The client MAY\n * repeat the request with a new or replaced Proxy-Authorization header field.\n */\n 407: 'Proxy Authentication Required',\n\n /**\n * The 408 (Request Timeout) status code indicates that the server did\n * not receive a complete request message within the time that it was\n * prepared to wait. A server SHOULD send the \"close\" connection option\n * (Section 6.1 of [RFC7230]) in the response, since 408 implies that\n * the server has decided to close the connection rather than continue\n * waiting. If the client has an outstanding request in transit, the\n * client MAY repeat that request on a new connection.\n */\n 408: 'Request Timeout',\n\n /**\n * The 409 (Conflict) status code indicates that the request could not\n * be completed due to a conflict with the current state of the target\n * resource. This code is used in situations where the user might be\n * able to resolve the conflict and resubmit the request. The server\n * SHOULD generate a payload that includes enough information for a user\n * to recognize the source of the conflict.\n *\n * Conflicts are most likely to occur in response to a PUT request. For\n * example, if versioning were being used and the representation being\n * PUT included changes to a resource that conflict with those made by\n * an earlier (third-party) request, the origin server might use a 409\n * response to indicate that it can't complete the request. In this\n * case, the response representation would likely contain information\n * useful for merging the differences based on the revision history.\n */\n 409: 'Conflict',\n\n /**\n * The 410 (Gone) status code indicates that access to the target\n * resource is no longer available at the origin server and that this\n * condition is likely to be permanent. If the origin server does not\n * know, or has no facility to determine, whether or not the condition\n * is permanent, the status code 404 (Not Found) ought to be used\n * instead.\n *\n * The 410 response is primarily intended to assist the task of web\n * maintenance by notifying the recipient that the resource is\n * intentionally unavailable and that the server owners desire that\n * remote links to that resource be removed. Such an event is common\n * for limited-time, promotional services and for resources belonging to\n * individuals no longer associated with the origin server's site. It\n * is not necessary to mark all permanently unavailable resources as\n * \"gone\" or to keep the mark for any length of time -- that is left to\n * the discretion of the server owner.\n *\n * A 410 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 410: 'Gone',\n\n /**\n * The 411 (Length Required) status code indicates that the server\n * refuses to accept the request without a defined Content-Length\n * (Section 3.3.2 of [RFC7230]). The client MAY repeat the request if\n * it adds a valid Content-Length header field containing the length of\n * the message body in the request message.\n */\n 411: 'Length Required',\n\n /**\n * One or more conditions given in the request header fields evaluated to\n * false when tested on the server.\n *\n * This response code allows the client to place preconditions on the current\n * resource state (its current representations and metadata) and, thus,\n * prevent the request method from being applied if the target resource is in\n * an unexpected state.\n */\n 412: 'Precondition Failed',\n\n /**\n * The 413 (Payload Too Large) status code indicates that the server is\n * refusing to process a request because the request payload is larger\n * than the server is willing or able to process. The server MAY close\n * the connection to prevent the client from continuing the request.\n *\n * If the condition is temporary, the server SHOULD generate a\n * Retry-After header field to indicate that it is temporary and after\n * what time the client MAY try again.\n */\n 413: 'Payload Too Large',\n\n /**\n * The 414 (URI Too Long) status code indicates that the server is\n * refusing to service the request because the request-target (Section\n * 5.3 of [RFC7230]) is longer than the server is willing to interpret.\n * This rare condition is only likely to occur when a client has\n * improperly converted a POST request to a GET request with long query\n * information, when the client has descended into a \"black hole\" of\n * redirection (e.g., a redirected URI prefix that points to a suffix of\n * itself) or when the server is under attack by a client attempting to\n * exploit potential security holes.\n *\n * A 414 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 414: 'Request-URI Too Long',\n\n /**\n * The 415 (Unsupported Media Type) status code indicates that the\n * origin server is refusing to service the request because the payload\n * is in a format not supported by this method on the target resource.\n * The format problem might be due to the request's indicated\n * Content-Type or Content-Encoding, or as a result of inspecting the\n * data directly.\n */\n 415: 'Unsupported Media Type',\n\n /**\n * None of the ranges in the request's Range header field overlap the\n * current extent of the selected resource or that the set of ranges\n * requested has been rejected due to invalid ranges or an excessive request\n * of small or overlapping ranges.\n *\n * For byte ranges, failing to overlap the current extent means that the\n * first-byte-pos of all of the byte-range-spec values were greater than the\n * current length of the selected representation. When this status code is\n * generated in response to a byte-range request, the sender SHOULD generate\n * a Content-Range header field specifying the current length of the selected\n * representation\n */\n 416: 'Requested Range Not Satisfiable',\n\n /**\n * The 417 (Expectation Failed) status code indicates that the\n * expectation given in the request's Expect header field\n * (Section 5.1.1 of [RFC7231]) could not be met by at least one of the\n * inbound servers.\n */\n 417: 'Expectation Failed',\n\n /**\n * Any attempt to brew coffee with a teapot should result in the error code\n * \"418 I'm a teapot\". The resulting entity body MAY be short and stout.\n */\n 418: \"I'm a Teapot\",\n\n /**\n * The request was directed at a server that is not able to produce a\n * response. This can be sent by a server that is not configured to produce\n * responses for the combination of scheme and authority that are included\n * in the request URI.\n *\n * Clients receiving a 421 Misdirected Request response from a server MAY\n * retry the request -- whether the request method is idempotent or\n * not -- over a different connection. This is possible if a connection is\n * reused or if an alternative service is selected ALT-SVC.\n *\n * This status code MUST NOT be generated by proxies.\n *\n * A 421 response is cacheable by default, i.e., unless otherwise indicated by\n * the method definition or explicit cache controls\n */\n 421: 'Misdirected Request',\n\n /**\n * The server understands the content type of the request entity (hence a\n * 415 Unsupported Media Type status code is inappropriate), and the syntax\n * of the request entity is correct (thus a 400 Bad Request status code is\n * inappropriate) but was unable to process the contained instructions.\n *\n * For example, this error condition may occur if an XML request body contains\n * well-formed (i.e., syntactically correct), but semantically erroneous, XML\n * instructions.\n */\n 422: 'Unprocessable Entity',\n\n /**\n * The source or destination resource of a method is locked.\n *\n * This response SHOULD contain an appropriate precondition or postcondition\n * code, such as 'lock-token-submitted' or 'no-conflicting-lock'.\n */\n 423: 'Locked',\n\n /**\n * The method could not be performed on the resource because the requested\n * action depended on another action and that action failed.\n *\n * For example, if a command in a PROPPATCH method fails, then, at minimum,\n * the rest of the commands will also fail with 424 Failed Dependency.\n */\n 424: 'Failed Dependency',\n\n /**\n * The 426 (Upgrade Required) status code indicates that the server\n * refuses to perform the request using the current protocol but might\n * be willing to do so after the client upgrades to a different\n * protocol. The server MUST send an Upgrade header field in a 426\n * response to indicate the required protocol(s) (Section 6.7 of\n * [RFC7230]).\n */\n 426: 'Upgrade Required',\n\n /**\n * The origin server requires the request to be conditional.\n *\n * Its typical use is to avoid the \"lost update\" problem, where a client GETs\n * a resource's state, modifies it, and PUTs it back to the server, when\n * meanwhile a third party has modified the state on the server, leading\n * to a conflict. By requiring requests to be conditional, the server can\n * assure that clients are working with the correct copies.\n *\n * Responses using this status code SHOULD explain how to resubmit the request\n * successfully.\n *\n * Responses with the 428 status code MUST NOT be stored by a cache.\n */\n 428: 'Precondition Required',\n\n /**\n * The user has sent too many requests in a given amount of time\n * (\"rate limiting\").\n *\n * The response representations SHOULD include details explaining the\n * condition, and MAY include a Retry-After header indicating how long to\n * wait before making a new request.\n *\n * Responses with the 429 status code MUST NOT be stored by a cache.\n */\n 429: 'Too Many Requests',\n\n /**\n * The server is unwilling to process the request because its header fields\n * are too large. The request MAY be resubmitted after reducing the size of\n * the request header fields.\n *\n * It can be used both when the set of request header fields in total is too\n * large, and when a single header field is at fault. In the latter case, the\n * response representation SHOULD specify which header field was too large.\n */\n 431: 'Request Header Fields Too Large',\n\n /**\n * A non-standard status code used to instruct nginx to close the connection\n * without sending a response to the client, most commonly used to deny\n * malicious or malformed requests.\n *\n * This status code is not seen by the client, it only appears in nginx log\n * files.\n */\n 444: 'Connection Closed Without Response',\n\n /**\n * The server is denying access to the resource as a consequence of a legal\n * demand.\n *\n * The server in question might not be an origin server. This type of legal\n * demand typically most directly affects the operations of ISPs and search\n * engines.\n *\n * Responses using this status code SHOULD include an explanation, in the\n * response body, of the details of the legal demand: the party making it,\n * the applicable legislation or regulation, and what classes of person and\n * resource it applies to.\n *\n * The use of the 451 status code implies neither the existence nor\n * non-existence of the resource named in the request. That is to say, it is\n * possible that if the legal demands were removed, a request for the\n * resource still might not succeed.\n *\n * Note that in many cases clients can still access the denied resource by\n * using technical countermeasures such as a VPN or the Tor network.\n *\n * A 451 response is cacheable by default; i.e., unless otherwise indicated\n * by the method definition or explicit cache controls; see RFC7234.\n */\n 451: 'Unavailable For Legal Reasons',\n\n /**\n * A non-standard status code introduced by nginx for the case when a client\n * closes the connection while nginx is processing the request.\n */\n 499: 'Client Closed Request',\n\n /**\n * The 500 (Internal Server Error) status code indicates that the server\n * encountered an unexpected condition that prevented it from fulfilling\n * the request.\n */\n 500: 'Internal Server Error',\n\n /**\n * The 501 (Not Implemented) status code indicates that the server does\n * not support the functionality required to fulfill the request. This\n * is the appropriate response when the server does not recognize the\n * request method and is not capable of supporting it for any resource.\n *\n * A 501 response is cacheable by default; i.e., unless otherwise\n * indicated by the method definition or explicit cache controls (see\n * Section 4.2.2 of [RFC7234]).\n */\n 501: 'Not Implemented',\n\n /**\n * The 502 (Bad Gateway) status code indicates that the server, while\n * acting as a gateway or proxy, received an invalid response from an\n * inbound server it accessed while attempting to fulfill the request.\n */\n 502: 'Bad Gateway',\n\n /**\n * The 503 (Service Unavailable) status code indicates that the server\n * is currently unable to handle the request due to a temporary overload\n * or scheduled maintenance, which will likely be alleviated after some\n * delay. The server MAY send a Retry-After header field\n * (Section 7.1.3 of [RFC7231]) to suggest an appropriate amount of time for\n * the client to wait before retrying the request.\n */\n 503: 'Service Unavailable',\n\n /**\n * The 504 (Gateway Timeout) status code indicates that the server,\n *while acting as a gateway or proxy, did not receive a timely response\n *from an upstream server it needed to access in order to complete the\n *request.\n */\n 504: 'Gateway Timeout',\n\n /**\n * The 505 (HTTP Version Not Supported) status code indicates that the\n *server does not support, or refuses to support, the major version of\n *HTTP that was used in the request message. The server is indicating\n *that it is unable or unwilling to complete the request using the same\n *major version as the client, as described in Section 2.6 of\n *[RFC7230], other than with this error message. The server SHOULD\n *generate a representation for the 505 response that describes why\n *that version is not supported and what other protocols are supported\n *by that server.\n */\n 505: 'HTTP Version Not Supported',\n\n /**\n * The server has an internal configuration error: the chosen variant\n * resource is configured to engage in transparent content negotiation\n * itself, and is therefore not a proper end point in the negotiation\n * process.\n */\n 506: 'Variant Also Negotiates',\n\n /**\n * The method could not be performed on the resource because the server is\n * unable to store the representation needed to successfully complete the\n * request.\n *\n * This condition is considered to be temporary. If the request that received\n * this status code was the result of a user action, the request MUST NOT be\n * repeated until it is requested by a separate user action.\n */\n 507: 'Insufficient Storage',\n\n /**\n * The server terminated an operation because it encountered an infinite loop\n * while processing a request with \"Depth: infinity\". This status indicates\n * that the entire operation failed.\n */\n 508: 'Loop Detected',\n\n /**\n * The policy for accessing the resource has not been met in the request. The\n * server should send back all the information necessary for the client to\n * issue an extended request.\n *\n * It is outside the scope of this specification to specify how the\n * extensions inform the client.\n *\n * If the 510 response contains information about extensions that were not\n * present in the initial request then the client MAY repeat the request if\n * it has reason to believe it can fulfill the extension policy by modifying\n * the request according to the information provided in the 510 response.\n * Otherwise the client MAY present any entity included in the 510 response\n * to the user, since that entity may include relevant diagnostic information.\n */\n 510: 'Not Extended',\n\n /**\n * The client needs to authenticate to gain network access.\n *\n * The response representation SHOULD contain a link to a resource that\n * allows the user to submit credentials (e.g., with an HTML form).\n *\n * Note that the 511 response SHOULD NOT contain a challenge or the login\n * interface itself, because browsers would show the login interface as being\n * associated with the originally requested URL, which may cause confusion.\n *\n * The 511 status SHOULD NOT be generated by origin servers; it is intended\n * for use by intercepting proxies that are interposed as a means of\n * controlling access to the network.\n *\n * Responses with the 511 status code MUST NOT be stored by a cache.\n */\n 511: 'Network Authentication Required',\n\n /**\n * This status code is not specified in any RFCs, but is used by some HTTP\n * proxies to signal a network connect timeout behind the proxy to a client\n * in front of the proxy.\n */\n 599: 'Network Connect Timeout Error'\n} as const;\n\n/**\n * Numerical HTTP status code.\n */\nexport type StatusCode = keyof typeof HTTPStatuses;\n\n/**\n * Checks if the given numerical status code is in the known HTTP status codes\n * list.\n *\n * @param code HTTP Status code\n * @returns True if the code is a valid HTTP status code\n */\nexport const isValidStatusCode = (code: number): boolean =>\n !!HTTPStatuses[code];\n\n/**\n * Checks if the given status code is in the informational range (1XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"informational\" range.\n */\nexport const isInformational = (code: StatusCode): boolean =>\n code >= 100 && code < 200;\n\n/**\n * Checks if the given status code is in the successful range (2XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"success\" range.\n */\nexport const isSuccessful = (code: StatusCode): boolean =>\n code >= 200 && code < 300;\n\n/**\n * Checks if the given status code is in the redirection range (3XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"redirection\" range.\n */\nexport const isRedirection = (code: StatusCode): boolean =>\n code >= 300 && code < 400;\n\n/**\n * Checks if the given status code is in the client error range (4XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"client error\" range.\n */\nexport const isClientError = (code: StatusCode): boolean =>\n code >= 400 && code < 500;\n\n/**\n * Checks if the given status code is in the server error range (5XX).\n *\n * @param code HTTP Status code\n * @returns True if the code is in the \"server error\" range.\n */\nexport const isServerError = (code: StatusCode): boolean => code >= 500;\n\n/**\n * Searches the list of HTTP statuses for a matching textual name to the one\n * provided. If a match is found, then the numerical status code is returned,\n * otherwise `null`.\n *\n * Internally, the parameter and the status names are normalized by lower-casing\n * the strings and trimming space.\n *\n * @param status HTTP Status textual name\n * @returns The numerical status code, or null if not found\n */\nexport const getCodeForStatus = (status: string): null | StatusCode => {\n const clnStr = status.toLocaleLowerCase().trim();\n const entry = Object.entries(HTTPStatuses).find(\n (ent) => ent[1].toLowerCase() === clnStr\n );\n if (entry) return parseInt(entry[0]) as StatusCode;\n return null;\n};\n\nexport default HTTPStatuses;\n","import {\n AnySchemaValidator,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\nimport {\n ForklaunchNextFunction,\n ForklaunchRequest,\n ForklaunchResHeaders,\n ForklaunchResponse\n} from '../../types/apiDefinition.types';\nimport { ParamsDictionary } from '../../types/contractDetails.types';\n\n/**\n * Middleware to parse and validate the response according to the provided schema.\n *\n * This function validates the response against a schema provided by the request's schema validator.\n * If the response does not conform to the schema, the behavior is determined by the `responseValidation`\n * option in `req.contractDetails.options`:\n * - `'error'` (default): Calls `next` with an error.\n * - `'warning'`: Logs a warning to the console.\n * - `'none'`: Silently continues without action.\n *\n * @template SV - The type of the schema validator used in the request.\n * @template P - The type of the parameters dictionary used in the request.\n * @template ResBodyMap - A record type mapping status codes to response body types.\n * @template ReqBody - The type of the request body.\n * @template ReqQuery - The type of the parsed query string.\n * @template ReqHeaders - The type of the request headers.\n * @template ResHeaders - The type of the response headers, extended from `ForklaunchResHeaders`.\n * @template LocalsObj - The type of the locals object in the response.\n *\n * @param {ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>} req - The request object, containing the schema validator and other request data.\n * @param {ForklaunchResponse<ResBodyMap, ForklaunchResHeaders & ResHeaders, LocalsObj>} res - The response object, including headers and body data.\n * @param {ForklaunchNextFunction} [next] - The next middleware function to be called. If not provided, the function will return after processing.\n *\n * @returns {void} This function does not return a value.\n */\nexport function parse<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n res: ForklaunchResponse<\n ResBodyMap,\n ForklaunchResHeaders & ResHeaders,\n LocalsObj\n >,\n next?: ForklaunchNextFunction\n) {\n const { headers, responses } = res.responseSchemas;\n\n const parsedResponse = (req.schemaValidator as SchemaValidator).parse(\n responses?.[res.statusCode],\n res.bodyData\n );\n\n const parsedHeaders = (req.schemaValidator as SchemaValidator).parse(\n headers ?? req.schemaValidator.unknown,\n res.getHeaders()\n );\n const parseErrors: string[] = [];\n if (!parsedHeaders.ok) {\n const headerErrors = prettyPrintParseErrors(parsedHeaders.errors, 'Header');\n if (headerErrors) {\n parseErrors.push(headerErrors);\n }\n }\n\n if (!parsedResponse.ok) {\n const responseErrors = prettyPrintParseErrors(\n parsedResponse.errors,\n 'Response'\n );\n if (responseErrors) {\n parseErrors.push(responseErrors);\n }\n }\n\n if (parseErrors.length > 0) {\n switch (req.contractDetails.options?.responseValidation) {\n default:\n case 'error':\n next?.(new Error(`Invalid response:\\n${parseErrors.join('\\n\\n')}`));\n break;\n case 'warning':\n console.warn(`Invalid response:\\n${parseErrors.join('\\n\\n')}`);\n break;\n case 'none':\n break;\n }\n }\n next?.();\n}\n","import { isNever } from '@forklaunch/common';\nimport { trace } from '@opentelemetry/api';\nimport { AnyValueMap, logs } from '@opentelemetry/api-logs';\nimport pino, { LevelWithSilent, LevelWithSilentOrString, Logger } from 'pino';\n\nfunction mapSeverity(level: LevelWithSilent) {\n switch (level) {\n case 'silent':\n return 0;\n case 'trace':\n return 1;\n case 'debug':\n return 5;\n case 'info':\n return 9;\n case 'warn':\n return 13;\n case 'error':\n return 17;\n case 'fatal':\n return 21;\n default:\n isNever(level);\n return 0;\n }\n}\n\nclass PinoLogger {\n private pinoLogger: Logger;\n private meta: AnyValueMap;\n constructor(level: LevelWithSilentOrString, meta: AnyValueMap = {}) {\n this.pinoLogger = pino({\n level: level || 'info',\n formatters: {\n level(label) {\n return { level: label };\n }\n },\n timestamp: pino.stdTimeFunctions.isoTime,\n transport: {\n target: 'pino-pretty',\n options: { colorize: true }\n }\n });\n this.meta = meta;\n }\n\n log(level: LevelWithSilent, msg: string, meta: AnyValueMap = {}) {\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n const activeSpanContext = activeSpan.spanContext();\n meta.trace_id = activeSpanContext.traceId;\n meta.span_id = activeSpanContext.spanId;\n meta.trace_flags = activeSpanContext.traceFlags;\n if (!meta.api_name) {\n // @ts-expect-error accessing private property\n meta = { ...meta, ...activeSpan?.attributes };\n }\n }\n\n this.pinoLogger[level](msg);\n logs.getLogger(process.env.OTEL_SERVICE_NAME ?? 'unknown').emit({\n severityText: level,\n severityNumber: mapSeverity(level),\n body: msg,\n attributes: { ...this.meta, ...meta }\n });\n }\n\n error(msg: string, meta: AnyValueMap = {}) {\n this.log('error', msg, meta);\n }\n\n info(msg: string, meta: AnyValueMap = {}) {\n this.log('info', msg, meta);\n }\n\n debug(msg: string, meta: AnyValueMap = {}) {\n this.log('debug', msg, meta);\n }\n\n warn(msg: string, meta: AnyValueMap = {}) {\n this.log('warn', msg, meta);\n }\n\n trace(msg: string, meta: AnyValueMap = {}) {\n this.log('trace', msg, meta);\n }\n\n child(meta: AnyValueMap = {}) {\n return new PinoLogger(this.pinoLogger.level, { ...this.meta, ...meta });\n }\n\n getBaseLogger() {\n return this.pinoLogger;\n }\n}\n\nexport function logger(level: LevelWithSilentOrString, meta: AnyValueMap = {}) {\n return new PinoLogger(level, meta);\n}\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVICE_NAME\n} from '@opentelemetry/semantic-conventions';\nimport { ParsedQs } from 'qs';\nimport { ForklaunchRequest, ForklaunchResponse, ParamsDictionary } from '..';\nimport { getEnvVar } from '../../services';\nimport { ATTR_API_NAME, ATTR_CORRELATION_ID } from './constants';\nimport { httpRequestsTotalCounter } from './openTelemetryCollector';\n\nexport function recordMetric<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ResBodyMap extends Record<string, unknown>,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n res: ForklaunchResponse<ResBodyMap, ResHeaders, LocalsObj>\n) {\n httpRequestsTotalCounter.add(1, {\n [ATTR_SERVICE_NAME]: getEnvVar('OTEL_SERVICE_NAME'),\n [ATTR_API_NAME]: req.contractDetails?.name,\n [ATTR_CORRELATION_ID]: req.context.correlationId,\n [ATTR_HTTP_REQUEST_METHOD]: req.method,\n [ATTR_HTTP_ROUTE]: req.originalPath,\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: res.statusCode || 0\n });\n}\n","import { extractArgumentNames, isNever } from '@forklaunch/common';\nimport {\n AnySchemaValidator,\n IdiomaticSchema,\n ParseResult,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\nimport { isConstructed } from './guards/isConstructed';\nimport { isConstructor } from './guards/isConstructor';\nimport {\n ConfigValidator,\n Constructed,\n Lifetime,\n ResolvedConfigValidator,\n SchemaConstructor,\n SchemaFunction,\n Singleton\n} from './types/configInjector.types';\n\nexport class ConfigInjector<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> {\n instances: {\n [K in keyof CV]?: ResolvedConfigValidator<SV, CV>[K];\n } = {};\n\n private loadSingletons(): void {\n for (const token in this.dependenciesDefinition) {\n const definition = this.dependenciesDefinition[token];\n if (definition.lifetime === Lifetime.Singleton) {\n this.instances[token] = definition.value;\n }\n }\n }\n\n private resolveInstance<T extends keyof CV>(\n token: T,\n definition: Constructed<\n Omit<ResolvedConfigValidator<SV, CV>, T>,\n ResolvedConfigValidator<SV, CV>[T]\n >,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): ResolvedConfigValidator<SV, CV>[T] {\n const injectorArgument = extractArgumentNames(definition.factory)[0];\n // short circuit as no args\n if (injectorArgument === '_args') {\n return definition.factory(\n {} as Omit<ResolvedConfigValidator<SV, CV>, T>,\n this.resolve.bind(this),\n context ?? ({} as Record<string, unknown>)\n );\n }\n\n if (!injectorArgument.startsWith('{') || !injectorArgument.endsWith('}')) {\n throw new Error(\n `Invalid injector argument for ${String(\n token\n )}: ${injectorArgument}. Please use object destructuring syntax: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment.`\n );\n }\n const resolvedArguments = Object.fromEntries(\n injectorArgument\n .replace('{', '')\n .replace('}', '')\n .split(',')\n .map((arg) => arg.split(':')[0].trim())\n .map((arg) => {\n const newResolutionPath = [...resolutionPath, token];\n if (resolutionPath.includes(arg)) {\n throw new Error(\n `Circular dependency detected: ${newResolutionPath.join(\n ' -> '\n )} -> ${arg}`\n );\n }\n const resolvedArg = this.resolve(arg, context, newResolutionPath);\n return [arg, resolvedArg];\n })\n ) as unknown as Omit<ResolvedConfigValidator<SV, CV>, T>;\n return definition.factory(\n resolvedArguments,\n this.resolve.bind(this),\n context ?? ({} as Record<string, unknown>)\n );\n }\n\n constructor(\n private schemaValidator: SV,\n private configShapes: CV,\n private dependenciesDefinition: {\n [K in keyof CV]:\n | Singleton<ResolvedConfigValidator<SV, CV>[K]>\n | Constructed<\n Omit<ResolvedConfigValidator<SV, CV>, K>,\n ResolvedConfigValidator<SV, CV>[K]\n >;\n }\n ) {\n this.loadSingletons();\n }\n\n safeValidateConfigSingletons(): ParseResult<ValidConfigInjector<SV, CV>> {\n const validNonSchemaSingletons = Object.entries(this.configShapes).reduce<\n ParseResult<ResolvedConfigValidator<SV, CV>>\n >(\n (acc, [key, value]) => {\n if (\n this.dependenciesDefinition[key].lifetime === Lifetime.Singleton &&\n !(this.schemaValidator as SchemaValidator).isSchema<\n SchemaFunction<SV> | SchemaConstructor<SV> | IdiomaticSchema<SV>\n >(value) &&\n isConstructor(value)\n ) {\n if (!(this.dependenciesDefinition[key].value instanceof value)) {\n const expected = value.name;\n const receivedValue: unknown =\n this.dependenciesDefinition[key].value;\n const received = isConstructed(receivedValue)\n ? receivedValue.constructor.name\n : typeof receivedValue;\n\n if (acc.ok) {\n acc = {\n ok: false,\n errors: []\n };\n }\n acc.errors?.push({\n message: `Expected ${expected}, received ${received}`,\n path: [key]\n });\n } else {\n if (acc.ok) {\n acc = {\n ok: true,\n value: {\n ...acc.value,\n [key]: this.dependenciesDefinition[key].value\n }\n };\n }\n }\n return acc;\n }\n return acc;\n },\n {\n ok: true,\n value: {} as ResolvedConfigValidator<SV, CV>\n }\n );\n\n const singletons = Object.fromEntries(\n Object.entries(this.configShapes).filter(\n ([key, value]) =>\n this.dependenciesDefinition[key].lifetime === Lifetime.Singleton &&\n (this.schemaValidator as SchemaValidator).isSchema(value)\n )\n );\n const schemaSingletonParseResult = (\n this.schemaValidator as SchemaValidator\n ).parse(\n (this.schemaValidator as SchemaValidator).schemify(singletons),\n Object.fromEntries(\n Object.keys(singletons).map((key) => {\n const dependency = this.dependenciesDefinition[key];\n return [\n key,\n dependency.lifetime === Lifetime.Singleton\n ? dependency.value\n : undefined\n ];\n })\n )\n );\n\n const configKeys = Object.keys(this.configShapes);\n\n return validNonSchemaSingletons.ok && schemaSingletonParseResult.ok\n ? {\n ok: true as const,\n value: new ValidConfigInjector<SV, CV>(\n this.schemaValidator,\n this.configShapes,\n this.dependenciesDefinition\n )\n }\n : {\n ok: false as const,\n errors: [\n ...(!validNonSchemaSingletons.ok && validNonSchemaSingletons.errors\n ? validNonSchemaSingletons.errors\n : []),\n ...(!schemaSingletonParseResult.ok &&\n schemaSingletonParseResult.errors\n ? schemaSingletonParseResult.errors\n : [])\n ].sort(\n (a, b) =>\n configKeys.indexOf(a.path[0]) - configKeys.indexOf(b.path[0])\n )\n };\n }\n\n validateConfigSingletons(configName: string): ValidConfigInjector<SV, CV> {\n const safeValidateResult = this.safeValidateConfigSingletons();\n\n if (safeValidateResult.ok) {\n return safeValidateResult.value;\n }\n\n throw new Error(\n prettyPrintParseErrors(safeValidateResult.errors, configName)\n );\n }\n\n resolve<T extends keyof CV>(\n token: T,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): ResolvedConfigValidator<SV, CV>[T] {\n const instance = this.instances[token];\n if (!instance) {\n const definition = this.dependenciesDefinition[token];\n\n if (!definition) {\n throw new Error(`Unable to resolve dependency ${String(token)}`);\n }\n\n switch (definition.lifetime) {\n case Lifetime.Singleton: {\n return definition.value;\n }\n case Lifetime.Scoped: {\n const scopedInstance = this.resolveInstance<T>(\n token,\n definition,\n context,\n resolutionPath\n );\n this.instances[token] = scopedInstance;\n return scopedInstance;\n }\n case Lifetime.Transient: {\n return this.resolveInstance<T>(\n token,\n definition,\n context,\n resolutionPath\n );\n }\n default: {\n isNever(definition);\n throw new Error(\n `Unable to resolve lifetime for dependency ${String(\n token\n )}, ${resolutionPath}`\n );\n }\n }\n } else {\n return instance;\n }\n }\n\n scopedResolver<T extends keyof CV>(\n token: T,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[T] {\n return (scope) =>\n (scope ?? this.createScope()).resolve<T>(token, context, resolutionPath);\n }\n\n createScope(): ConfigInjector<SV, CV> {\n return new ConfigInjector<SV, CV>(\n this.schemaValidator,\n this.configShapes,\n this.dependenciesDefinition\n );\n }\n\n dispose(): void {\n this.instances = {};\n this.loadSingletons();\n }\n}\n\nexport class ValidConfigInjector<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> extends ConfigInjector<SV, CV> {\n validConfigInjector!: void;\n}\n","// This is a simple function that returns the value of an environment variable.\n// It casts a potentially undefined value to a string, since it will be validated in order to be bootstrapped.\n\nexport function getEnvVar(name: string): string {\n const value = process.env[name];\n return value as string;\n}\n","import { HyperExpressInstrumentation } from '@forklaunch/opentelemetry-instrumentation-hyper-express';\nimport {\n Counter,\n Gauge,\n Histogram,\n metrics,\n ObservableCounter,\n ObservableGauge,\n ObservableUpDownCounter,\n UpDownCounter\n} from '@opentelemetry/api';\nimport { AnyValueMap } from '@opentelemetry/api-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express';\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http';\nimport { Resource } from '@opentelemetry/resources';\nimport { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVICE_NAME\n} from '@opentelemetry/semantic-conventions';\nimport dotenv from 'dotenv';\nimport { LevelWithSilent, LevelWithSilentOrString } from 'pino';\nimport { getEnvVar } from '../../services/getEnvVar';\nimport { isForklaunchRequest } from '../guards/isForklaunchRequest';\nimport {\n MetricsDefinition,\n MetricType\n} from '../types/openTelemetryCollector.types';\nimport { ATTR_API_NAME, ATTR_CORRELATION_ID } from './constants';\nimport { logger } from './pinoLogger';\n\nexport class OpenTelemetryCollector<\n AppliedMetricsDefinition extends MetricsDefinition\n> {\n private readonly logger;\n private readonly metrics: Record<\n keyof AppliedMetricsDefinition,\n | Counter\n | Gauge\n | Histogram\n | UpDownCounter\n | ObservableCounter\n | ObservableGauge\n | ObservableUpDownCounter\n >;\n\n // scoped creation and create this in middleware when api execute. Also add correlation id\n constructor(\n private readonly serviceName: string,\n level?: LevelWithSilentOrString,\n metricDefinitions?: AppliedMetricsDefinition\n ) {\n this.logger = logger(level ?? 'info');\n\n this.metrics = {} as Record<\n keyof AppliedMetricsDefinition,\n MetricType<AppliedMetricsDefinition[keyof AppliedMetricsDefinition]>\n >;\n\n for (const [metricId, metricType] of Object.entries(\n metricDefinitions ?? {}\n )) {\n switch (metricType) {\n case 'counter':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createCounter(metricId);\n break;\n case 'gauge':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createGauge(metricId);\n break;\n case 'histogram':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createHistogram(metricId);\n break;\n case 'upDownCounter':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createUpDownCounter(metricId);\n break;\n case 'observableCounter':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createObservableCounter(metricId);\n break;\n case 'observableGauge':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createObservableGauge(metricId);\n break;\n case 'observableUpDownCounter':\n this.metrics[metricId as keyof AppliedMetricsDefinition] = metrics\n .getMeter(this.serviceName)\n .createObservableUpDownCounter(metricId);\n break;\n }\n }\n\n this.log('info', 'OpenTelemetry (Traces + Logs + Metrics) started');\n }\n\n log(level: LevelWithSilent, msg: string, meta: AnyValueMap = {}) {\n this.logger.log(level, msg, meta);\n }\n\n info(msg: string, meta: AnyValueMap = {}) {\n this.logger.info(msg, meta);\n }\n\n error(msg: string, meta: AnyValueMap = {}) {\n this.logger.error(msg, meta);\n }\n\n warn(msg: string, meta: AnyValueMap = {}) {\n this.logger.warn(msg, meta);\n }\n\n debug(msg: string, meta: AnyValueMap = {}) {\n this.logger.debug(msg, meta);\n }\n\n trace(msg: string, meta: AnyValueMap = {}) {\n this.logger.trace(msg, meta);\n }\n\n getMetric<T extends keyof AppliedMetricsDefinition>(\n metricId: T\n ): MetricType<AppliedMetricsDefinition[T]> {\n return this.metrics[metricId] as MetricType<AppliedMetricsDefinition[T]>;\n }\n}\n\ndotenv.config({ path: getEnvVar('ENV_FILE_PATH') });\n\nnew NodeSDK({\n resource: new Resource({\n [ATTR_SERVICE_NAME]: getEnvVar('OTEL_SERVICE_NAME')\n }),\n traceExporter: new OTLPTraceExporter({\n url: `${getEnvVar('OTEL_EXPORTER_OTLP_ENDPOINT') ?? 'http://localhost:4318'}/v1/traces`\n }),\n metricReader: new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({\n url: `${getEnvVar('OTEL_EXPORTER_OTLP_ENDPOINT') ?? 'http://localhost:4318'}/v1/metrics`\n }),\n exportIntervalMillis: 5000\n }),\n logRecordProcessors: [\n new BatchLogRecordProcessor(\n new OTLPLogExporter({\n url: `${getEnvVar('OTEL_EXPORTER_OTLP_ENDPOINT') ?? 'http://localhost:4318'}/v1/logs`\n })\n )\n ],\n instrumentations: [\n new HttpInstrumentation({\n applyCustomAttributesOnSpan: (span, request) => {\n span.setAttribute(\n 'service.name',\n getEnvVar('OTEL_SERVICE_NAME') ?? 'unknown'\n );\n if (isForklaunchRequest(request)) {\n span.setAttribute('api.name', request.contractDetails?.name);\n }\n }\n }),\n new ExpressInstrumentation(),\n new HyperExpressInstrumentation()\n ]\n}).start();\n\n// begin static metrics -- these have to be in here in order to instantiate these after the SDK is instantiated\nexport const httpRequestsTotalCounter = metrics\n .getMeter(getEnvVar('OTEL_SERVICE_NAME') || 'unknown')\n .createCounter<{\n [ATTR_SERVICE_NAME]: string;\n [ATTR_API_NAME]: string;\n [ATTR_CORRELATION_ID]: string;\n [ATTR_HTTP_REQUEST_METHOD]: string;\n [ATTR_HTTP_ROUTE]: string;\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: number;\n }>('http_requests_total', {\n description: 'Number of HTTP requests'\n });\n","import { AnySchemaValidator } from '@forklaunch/validator';\nimport { ParsedQs } from 'qs';\nimport { parse } from './parse.middleware';\n\nimport { logger } from '../../telemetry/pinoLogger';\nimport {\n ForklaunchRequest,\n ForklaunchResHeaders,\n ForklaunchResponse,\n ForklaunchSendableData,\n ForklaunchStatusResponse\n} from '../../types/apiDefinition.types';\nimport { ParamsDictionary } from '../../types/contractDetails.types';\nimport { recordMetric } from '../../telemetry/recordMetric';\n\n/**\n * Enhances the Express-like `send` method with additional logic for response handling and validation.\n *\n * This function intercepts the `send` method to provide custom behavior, including response validation\n * through the `parseResponse` middleware. If the response status is 404, it sends a \"Not Found\" message.\n * If the response validation fails, it sends a parsing error message. Otherwise, it calls the original `send`\n * method with the provided data.\n *\n * @template SV - The type of the schema validator used in the request.\n * @template P - The type of the parameters dictionary used in the request.\n * @template ResBodyMap - A record type mapping status codes to response body types.\n * @template ReqBody - The type of the request body.\n * @template ReqQuery - The type of the parsed query string.\n * @template ReqHeaders - The type of the request headers.\n * @template ResHeaders - The type of the response headers, extended from `ForklaunchResHeaders`.\n * @template LocalsObj - The type of the locals object in the response.\n *\n * @param {unknown} instance - The context (typically `this`) in which the original `send` method is called.\n * @param {ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>} req - The request object, containing the schema validator and other request data.\n * @param {ForklaunchResponse<ResBodyMap, ForklaunchResHeaders & ResHeaders, LocalsObj>} res - The response object, including headers and body data.\n * @param {Function} originalSend - The original `send` method from the response object, to be called after custom logic.\n * @param {string | ArrayBuffer | ArrayBufferView | NodeJS.ReadableStream | null | undefined} data - The data to be sent as the response body.\n * @param {boolean} shouldEnrich - A flag indicating whether the response should be sent immediately.\n *\n * @returns {unknown} The return value of the original `send` method, typically the response itself.\n */\nexport function enrichExpressLikeSend<\n SV extends AnySchemaValidator,\n P extends ParamsDictionary,\n ResBodyMap extends Record<number, unknown>,\n ReqBody extends Record<string, unknown>,\n ReqQuery extends ParsedQs,\n ReqHeaders extends Record<string, string>,\n ResHeaders extends Record<string, string>,\n LocalsObj extends Record<string, unknown>\n>(\n instance: unknown,\n req: ForklaunchRequest<SV, P, ReqBody, ReqQuery, ReqHeaders>,\n res: ForklaunchResponse<\n ResBodyMap,\n ForklaunchResHeaders & ResHeaders,\n LocalsObj\n >,\n originalSend:\n | ForklaunchStatusResponse<ForklaunchSendableData>['send']\n | ForklaunchStatusResponse<ForklaunchSendableData>['json'],\n data: ForklaunchSendableData,\n shouldEnrich: boolean\n) {\n let parseErrorSent;\n if (shouldEnrich) {\n recordMetric<\n SV,\n P,\n ReqBody,\n ReqQuery,\n ResBodyMap,\n ReqHeaders,\n ForklaunchResHeaders & ResHeaders,\n LocalsObj\n >(req, res);\n\n if (res.statusCode === 404) {\n res.status(404);\n logger('error').error('Not Found');\n originalSend.call(instance, 'Not Found');\n }\n\n parse(req, res, (err?: unknown) => {\n if (err) {\n let errorString = (err as Error).message;\n if (res.locals.errorMessage) {\n errorString += `\\n------------------\\n${res.locals.errorMessage}`;\n }\n logger('error').error(errorString);\n res.status(500);\n originalSend.call(instance, errorString);\n parseErrorSent = true;\n }\n });\n }\n\n if (!parseErrorSent) {\n originalSend.call(instance, data);\n }\n}\n","import {\n AnySchemaValidator,\n IdiomaticSchema,\n SchemaValidator\n} from '@forklaunch/validator';\nimport {\n ContentObject,\n OpenAPIObject,\n OperationObject,\n PathObject,\n ResponsesObject,\n TagObject\n} from 'openapi3-ts/oas31';\nimport { HttpContractDetails } from '../types/contractDetails.types';\nimport { ForklaunchRouter } from '../types/router.types';\nimport HTTPStatuses from '../httpStatusCodes';\n\n/**\n * Capitalizes the first letter of a string.\n *\n * @param {string} str - The string to transform.\n * @returns {string} - The transformed string with the first letter capitalized.\n */\nfunction toUpperCase(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Transforms a base path by ensuring it starts with a slash and capitalizing the first letter.\n *\n * @param {string} basePath - The base path to transform.\n * @returns {string} - The transformed base path.\n */\nfunction transformBasePath(basePath: string) {\n if (basePath.startsWith('/')) {\n return toUpperCase(basePath.slice(1));\n }\n return `/${basePath}`;\n}\n\n/**\n * Creates a Swagger document.\n *\n * @param {string | number} port - The port on which the server is running.\n * @param {TagObject[]} tags - The tags for the Swagger document.\n * @param {PathObject} paths - The paths for the Swagger document.\n * @returns {OpenAPIObject} - The Swagger document.\n */\nfunction generateOpenApiDocument(\n port: string | number,\n tags: TagObject[],\n paths: PathObject\n): OpenAPIObject {\n return {\n openapi: '3.1.0',\n info: {\n title: process.env.API_TITLE || '',\n version: process.env.VERSION || '1.0.0'\n },\n components: {\n securitySchemes: {\n bearer: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT'\n }\n }\n },\n tags,\n servers: [\n {\n url: `http://localhost:${port}`\n }\n ],\n paths\n };\n}\n\n/**\n * Resolves the content object for a given schema.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @param {SV} schemaValidator - The schema validator.\n * @param {IdiomaticSchema<SV>} body - The schema body.\n * @returns {ContentObject} - The resolved content object.\n */\nfunction contentResolver<SV extends AnySchemaValidator>(\n schemaValidator: SV,\n body: IdiomaticSchema<SV>\n): ContentObject {\n const bodySpec = (schemaValidator as SchemaValidator).openapi(body);\n return body === schemaValidator.string\n ? {\n 'plain/text': {\n schema: bodySpec\n }\n }\n : {\n 'application/json': {\n schema: bodySpec\n }\n };\n}\n\n/**\n * Generates a Swagger document from given routers.\n *\n * @template SV - A type that extends AnySchemaValidator.\n * @param {SV} schemaValidator - The schema validator.\n * @param {string | number} port - The port on which the server is running.\n * @param {ForklaunchRouter<SV>[]} routers - The routers to include in the Swagger document.\n * @returns {OpenAPIObject} - The generated Swagger document.\n */\nexport function generateSwaggerDocument<SV extends AnySchemaValidator>(\n schemaValidator: SV,\n port: string | number,\n routers: ForklaunchRouter<SV>[]\n): OpenAPIObject {\n const tags: TagObject[] = [];\n const paths: PathObject = {};\n\n routers.flat(Infinity).forEach((router) => {\n const controllerName = transformBasePath(router.basePath);\n tags.push({\n name: controllerName,\n description: `${controllerName} Operations`\n });\n router.routes.forEach((route) => {\n const fullPath = `${router.basePath}${\n route.path === '/' ? '' : route.path\n }`.replace(/:(\\w+)/g, '{$1}');\n if (!paths[fullPath]) {\n paths[fullPath] = {};\n }\n const { name, summary, query, requestHeaders } = route.contractDetails;\n\n const responses: ResponsesObject = {};\n\n for (const key in route.contractDetails.responses) {\n responses[key] = {\n description: HTTPStatuses[key],\n content: contentResolver(\n schemaValidator,\n route.contractDetails.responses[key]\n )\n };\n }\n\n const pathItemObject: OperationObject = {\n tags: [controllerName],\n summary: `${name}: ${summary}`,\n parameters: [],\n responses\n };\n if (route.contractDetails.params) {\n for (const key in route.contractDetails.params) {\n pathItemObject.parameters?.push({\n name: key,\n in: 'path',\n schema: (schemaValidator as SchemaValidator).openapi(\n route.contractDetails.params[key]\n )\n });\n }\n }\n\n const body = (\n route.contractDetails as HttpContractDetails<typeof schemaValidator>\n ).body;\n if (body) {\n pathItemObject.requestBody = {\n required: true,\n content: contentResolver(schemaValidator, body)\n };\n }\n\n if (requestHeaders) {\n for (const key in requestHeaders) {\n pathItemObject.parameters?.push({\n name: key,\n in: 'header',\n schema: (schemaValidator as SchemaValidator).openapi(\n requestHeaders[key]\n )\n });\n }\n }\n\n if (query) {\n for (const key in query) {\n pathItemObject.parameters?.push({\n name: key,\n in: 'query',\n schema: (schemaValidator as SchemaValidator).openapi(query[key])\n });\n }\n }\n\n if (route.contractDetails.auth) {\n responses[401] = {\n description: HTTPStatuses[401],\n content: contentResolver(schemaValidator, schemaValidator.string)\n };\n responses[403] = {\n description: HTTPStatuses[403],\n content: contentResolver(schemaValidator, schemaValidator.string)\n };\n if (route.contractDetails.auth.method === 'jwt') {\n pathItemObject.security = [\n {\n bearer: Array.from(\n route.contractDetails.auth.allowedPermissions?.values() || []\n )\n }\n ];\n }\n }\n\n if (route.method !== 'middleware') {\n paths[fullPath][route.method] = pathItemObject;\n }\n });\n });\n\n return generateOpenApiDocument(port, tags, paths);\n}\n","import { MetricsDefinition } from '../types/openTelemetryCollector.types';\n\nexport function metricsDefinitions<T extends MetricsDefinition>(metrics: T) {\n return metrics;\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuEL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsCL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["trace","corsMiddleware","middleware","middleware","trace","import_validator","parse","import_common","import_api","pino","import_semantic_conventions","import_common","import_validator","import_api","import_semantic_conventions","dotenv","parse","metrics"]}