@visulima/api-platform
Version:
Visulima API platform is a set of tools to build and consume web APIs
1 lines • 30.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/error-handler/utils.ts","../src/error-handler/jsonapi-error-handler.ts","../src/error-handler/problem-error-handler.ts","../src/connect/handler.ts","../src/connect/middleware/http-header-normalizer.ts","../src/serializers/has-json-structure.ts","../src/serializers/transformer/xml.ts","../src/serializers/serialize.ts","../src/connect/middleware/serializers-middleware.ts","../src/connect/create-node-router.ts","../src/connect/middleware/cors-middleware.ts","../src/connect/middleware/rate-limiter-middleware.ts"],"names":["setErrorHeaders","response","error","headers","header","sendJson","jsonBody","addStatusCodeToResponse","StatusCodes","defaultTitle","jsonapiErrorHandler","_request","tsJapi","serializer","HttpError","message","statusCode","title","getReasonPhrase","jsonapi_error_handler_default","defaultType","problemErrorHandler","stack","expose","type","problem_error_handler_default","onError","errorHandlers","showTrace","request","apiFormat","errorHandler","handler","regex","onNoMatch","routes","uniqueMethods","route","createHttpError","exceptions","normalizeHeaderKey","key","canonical","lowerCaseKey","text","defaults","httpHeaderNormalizerMiddleware","options_","options","_","next","rawHeaders","normalizedKey","http_header_normalizer_default","hasJsonStructure","data","result","has_json_structure_default","xmlTransformer","toXML","xml_default","contentTypeKey","serialize","serializers","types","accepts","serializedData","breakTypes","yaml_default","toHeaderCase","serialize_default","log","debug","serializersMiddleware","defaultContentType","oldSend","oldEnd","arguments_","serializers_middleware_default","createNodeRouter","NodeRouter","create_node_router_default","corsMiddleware","expressWrapper","cors","cors_middleware_default","getIP","rateLimiterMiddleware","rateLimiter","ip","limiter","mergedHeaders","rate_limiter_middleware_default"],"mappings":"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","file":"index-server.mjs","sourcesContent":["import type { ServerResponse } from \"node:http\";\n\nimport type { HttpError } from \"http-errors\";\nimport { StatusCodes } from \"http-status-codes\";\n\nexport const setErrorHeaders = (response: ServerResponse, error: unknown): void => {\n const headers: Record<string, ReadonlyArray<string> | number | string> = (error as HttpError).headers ?? {};\n\n Object.keys(headers).forEach((header: string) => {\n response.setHeader(header, headers[header] as ReadonlyArray<string> | number | string);\n });\n};\n\n/**\n * Send `JSON` object\n * @param response response object\n * @param jsonBody of data\n */\nexport const sendJson = (response: ServerResponse, jsonBody: unknown): void => {\n // Set header to application/json\n response.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n\n response.end(JSON.stringify(jsonBody));\n};\n\nexport const addStatusCodeToResponse = (response: ServerResponse, error: unknown): void => {\n // respect err.statusCode\n\n if ((error as HttpError).statusCode !== undefined) {\n response.statusCode = (error as HttpError).statusCode;\n }\n\n // respect err.status\n\n if ((error as HttpError).status !== undefined) {\n response.statusCode = (error as HttpError).status;\n }\n\n // default status code to 500\n if (response.statusCode < 400) {\n response.statusCode = StatusCodes.INTERNAL_SERVER_ERROR;\n }\n};\n","import { HttpError } from \"http-errors\";\nimport { getReasonPhrase } from \"http-status-codes\";\nimport tsJapi from \"ts-japi\";\n\nimport type { ErrorHandler } from \"./types\";\nimport { addStatusCodeToResponse, sendJson, setErrorHeaders } from \"./utils\";\n\nconst defaultTitle = \"An error occurred\";\n\nconst jsonapiErrorHandler: ErrorHandler = (error: Error | HttpError | tsJapi.JapiError, _request, response) => {\n addStatusCodeToResponse(response, error);\n\n setErrorHeaders(response, error);\n\n if (error instanceof tsJapi.JapiError || tsJapi.JapiError.isLikeJapiError(error)) {\n const serializer = new tsJapi.ErrorSerializer();\n\n sendJson(response, serializer.serialize(error));\n } else if (error instanceof HttpError) {\n const { message, statusCode, title } = error;\n\n sendJson(response, {\n errors: [\n {\n code: statusCode,\n title: title || getReasonPhrase(statusCode) || defaultTitle,\n // eslint-disable-next-line perfectionist/sort-objects\n detail: message,\n },\n ],\n });\n } else {\n const { message } = error;\n\n sendJson(response, {\n errors: [\n {\n code: \"500\",\n title: getReasonPhrase(response.statusCode) || defaultTitle,\n // eslint-disable-next-line perfectionist/sort-objects\n detail: message,\n },\n ],\n });\n }\n};\n\nexport default jsonapiErrorHandler;\n","import { HttpError } from \"http-errors\";\nimport { getReasonPhrase } from \"http-status-codes\";\n\nimport type { ErrorHandler } from \"./types\";\nimport { addStatusCodeToResponse, sendJson, setErrorHeaders } from \"./utils\";\n\nconst defaultType = \"https://tools.ietf.org/html/rfc2616#section-10\";\nconst defaultTitle = \"An error occurred\";\n/**\n * Normalizes errors according to the API Problem spec (RFC 7807).\n *\n * @see https://tools.ietf.org/html/rfc7807\n */\nconst problemErrorHandler: ErrorHandler = (error: Error | HttpError, _request, response) => {\n const { message, stack } = error;\n\n if (error instanceof HttpError) {\n const { expose, statusCode, title, type } = error;\n\n response.statusCode = statusCode;\n\n setErrorHeaders(response, error);\n\n sendJson(response, {\n type: type || defaultType,\n // eslint-disable-next-line perfectionist/sort-objects\n title: title || getReasonPhrase(statusCode) || defaultTitle,\n // eslint-disable-next-line perfectionist/sort-objects\n details: message,\n ...(expose ? { trace: stack } : {}),\n });\n } else {\n addStatusCodeToResponse(response, error);\n\n sendJson(response, {\n type: defaultType,\n // eslint-disable-next-line perfectionist/sort-objects\n title: getReasonPhrase(response.statusCode) || defaultTitle,\n // eslint-disable-next-line perfectionist/sort-objects\n details: message,\n ...((error as Error & { expose: boolean }).expose ? { trace: stack } : {}),\n });\n }\n};\n\nexport default problemErrorHandler;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { FunctionLike, Nextable, Route, ValueOrPromise } from \"@visulima/connect\";\nimport createHttpError from \"http-errors\";\n\nimport JsonapiErrorHandler from \"../error-handler/jsonapi-error-handler\";\nimport ProblemErrorHandler from \"../error-handler/problem-error-handler\";\nimport type { ErrorHandler, ErrorHandlers } from \"../error-handler/types\";\n\nexport const onError =\n <Request extends IncomingMessage, Response extends ServerResponse>(errorHandlers: ErrorHandlers, showTrace: boolean) =>\n async (error: unknown, request: Request, response: Response): Promise<void> => {\n const apiFormat: string = request.headers.accept as string;\n\n let errorHandler: ErrorHandler = ProblemErrorHandler;\n\n if (apiFormat === \"application/vnd.api+json\") {\n errorHandler = JsonapiErrorHandler;\n }\n\n // eslint-disable-next-line no-restricted-syntax,no-loops/no-loops\n for (const { handler, regex } of errorHandlers) {\n if (regex.test(apiFormat)) {\n errorHandler = handler;\n break;\n }\n }\n\n // eslint-disable-next-line no-param-reassign\n (error as Error & { expose: boolean }).expose = showTrace;\n\n errorHandler(error, request, response);\n };\n\nexport const onNoMatch: <Request extends IncomingMessage, Response extends ServerResponse>(\n request: Request,\n response: Response,\n routes: Route<Nextable<FunctionLike>>[],\n) => ValueOrPromise<void> = async (request, response, routes) => {\n const uniqueMethods = [...new Set(routes.map((route) => route.method))].join(\", \");\n\n response.setHeader(\"Allow\", uniqueMethods);\n response.statusCode = 405;\n\n throw createHttpError(405, `No route with [${request.method}] method found.`);\n};\n","import type { IncomingHttpHeaders, IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { NextHandler, ValueOrPromise } from \"@visulima/connect\";\n\nconst exceptions = {\n alpn: \"ALPN\",\n \"c-pep\": \"C-PEP\",\n \"c-pep-info\": \"C-PEP-Info\",\n \"caldav-timezones\": \"CalDAV-Timezones\",\n \"content-id\": \"Content-ID\",\n \"content-md5\": \"Content-MD5\",\n dasl: \"DASL\",\n dav: \"DAV\",\n dnt: \"DNT\",\n etag: \"ETag\",\n getprofile: \"GetProfile\",\n \"http2-settings\": \"HTTP2-Settings\",\n \"last-event-id\": \"Last-Event-ID\",\n \"mime-version\": \"MIME-Version\",\n \"optional-www-authenticate\": \"Optional-WWW-Authenticate\",\n \"sec-webSocket-key\": \"Sec-WebSocket-Key\",\n \"sec-webSocket-protocol\": \"Sec-WebSocket-Protocol\",\n \"sec-webSocket-version\": \"Sec-WebSocket-Version\",\n \"sec-websocket-accept\": \"Sec-WebSocket-Accept\",\n \"sec-websocket-extensions\": \"Sec-WebSocket-Extensions\",\n slug: \"SLUG\",\n tcn: \"TCN\",\n te: \"TE\",\n ttl: \"TTL\",\n \"www-authenticate\": \"WWW-Authenticate\",\n \"x-att-deviceid\": \"X-ATT-DeviceId\",\n \"x-dnsprefetch-control\": \"X-DNSPrefetch-Control\",\n \"x-uidh\": \"X-UIDH\",\n};\n\nconst normalizeHeaderKey = (key: string, canonical: boolean) => {\n const lowerCaseKey = key.toLowerCase();\n\n if (!canonical) {\n return lowerCaseKey;\n }\n\n if (exceptions[lowerCaseKey as keyof typeof exceptions]) {\n return exceptions[lowerCaseKey as keyof typeof exceptions];\n }\n\n return (\n lowerCaseKey\n .split(\"-\")\n // eslint-disable-next-line no-unsafe-optional-chaining\n .map((text: string) => text[0]?.toUpperCase() + text.slice(1))\n .join(\"-\")\n );\n};\n\nconst defaults = {\n canonical: false,\n normalizeHeaderKey,\n};\n\n/**\n * HTTP headers are case-insensitive.\n * That's why NodeJS makes them lower case by default.\n * While sensible, sometimes, for example for compatibility reasons, you might need them in their more common form.\n */\nconst httpHeaderNormalizerMiddleware = (options_?: {\n canonical?: boolean;\n normalizeHeaderKey?: (key: string, canonical: boolean) => string;\n}): ((request: IncomingMessage, response: ServerResponse, next: NextHandler) => ValueOrPromise<void>) => {\n const options = { ...defaults, ...options_ };\n\n return async <Request extends IncomingMessage>(request: Request, _: any, next: NextHandler) => {\n const rawHeaders: IncomingHttpHeaders = {};\n const headers: IncomingHttpHeaders = {};\n\n Object.keys(request.headers).forEach((key) => {\n rawHeaders[key] = request.headers[key];\n\n const normalizedKey = options.normalizeHeaderKey(key, options.canonical);\n\n if (normalizedKey) {\n headers[normalizedKey] = request.headers[key];\n }\n });\n\n request.headers = headers;\n // @TODO at type `request.rawHeaders` to global scope\n // @ts-expect-error - `rawHeaders` is not a property of `Request`\n request.rawHeaders = rawHeaders;\n\n return next();\n };\n};\n\nexport default httpHeaderNormalizerMiddleware;\n","const hasJsonStructure = (data: unknown): boolean => {\n if (typeof data !== \"string\") {\n return false;\n }\n\n try {\n const result = JSON.parse(data);\n const type = Object.prototype.toString.call(result);\n\n return type === \"[object Object]\" || type === \"[object Array]\";\n } catch {\n return false;\n }\n};\n\nexport default hasJsonStructure;\n","import type { XmlElement } from \"jstoxml\";\nimport { toXML } from \"jstoxml\";\n\nimport type { Serializer } from \"../types\";\n\nconst xmlTransformer: Serializer = (data?: XmlElement | XmlElement[]) =>\n toXML(data, {\n header: true,\n indent: \" \",\n });\n\nexport default xmlTransformer;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport accepts from \"accepts\";\n\nimport { toHeaderCase } from \"../utils\";\nimport hasJsonStructure from \"./has-json-structure\";\nimport xmlTransformer from \"./transformer/xml\";\nimport yamlTransformer from \"./transformer/yaml\";\nimport type { Serializers } from \"./types\";\n\nconst contentTypeKey = \"Content-Type\";\n\nconst serialize = <Request extends IncomingMessage, Response extends ServerResponse>(\n serializers: Serializers,\n request: Request,\n response: Response,\n data: unknown,\n options: {\n defaultContentType: string;\n },\n // eslint-disable-next-line sonarjs/cognitive-complexity\n): Buffer | Uint8Array | string => {\n const contentType = response.getHeader(contentTypeKey) as string | undefined;\n\n // skip serialization when Content-Type is already set\n if (typeof contentType === \"string\") {\n return data as string;\n }\n\n const accept = accepts(request);\n const types: string[] = [...(accept.types() as string[]), options.defaultContentType];\n\n let serializedData = data;\n let breakTypes = false;\n\n types.forEach((type) => {\n serializers.forEach(({ regex, serializer }) => {\n if (regex.test(type)) {\n response.setHeader(contentTypeKey, type);\n\n serializedData = serializer(serializedData);\n breakTypes = true;\n }\n });\n\n if (!breakTypes) {\n if (/yaml|yml/.test(type)) {\n response.setHeader(contentTypeKey, type);\n\n serializedData = yamlTransformer(hasJsonStructure(data) ? JSON.parse(data as string) : data);\n } else if (type.includes(\"xml\")) {\n response.setHeader(contentTypeKey, type);\n\n serializedData = xmlTransformer({\n [toHeaderCase(`${request.url?.replace(\"/api/\", \"\")}`.trim())]: hasJsonStructure(data) ? JSON.parse(data as string) : data,\n });\n }\n }\n });\n\n return serializedData as Buffer | Uint8Array | string;\n};\n\nexport default serialize;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { NextHandler, ValueOrPromise } from \"@visulima/connect\";\nimport debug from \"debug\";\nimport type { NextApiResponse } from \"next/types\";\n\nimport type { Serializers } from \"../../serializers\";\nimport { serialize } from \"../../serializers\";\n\nconst log = debug(\"api-platform:connect:serializers-middleware\");\n\nconst serializersMiddleware =\n (serializers: Serializers = [], defaultContentType = \"application/json; charset=utf-8\") =>\n async <Request extends IncomingMessage, Response extends ServerResponse>(\n request: Request,\n response: NextApiResponse | Response,\n next: NextHandler,\n ): Promise<ValueOrPromise<void>> => {\n if (typeof (response as NextApiResponse).send === \"function\") {\n const oldSend = (response as NextApiResponse).send;\n\n (response as NextApiResponse).send = (data) => {\n (response as NextApiResponse).send = oldSend;\n\n // eslint-disable-next-line no-param-reassign\n data = serialize<Request, NextApiResponse | Response>(serializers, request, response, data, { defaultContentType });\n\n (response as NextApiResponse).send(data);\n };\n } else if (typeof (response as NextApiResponse).json === \"function\") {\n log(\"response.json() is not supported by @visulima/api-platform serializer. Use response.send() or response.end() instead.\");\n } else {\n const oldEnd = response.end;\n\n // @ts-expect-error TS2322: Type\n (response as Response).end = (data, ...arguments_) => {\n response.end = oldEnd;\n\n // eslint-disable-next-line no-param-reassign\n data = serialize<Request, NextApiResponse | Response>(serializers, request, response, data, { defaultContentType });\n\n // @ts-expect-error TS2345: Argument of type 'unknown' is not assignable to parameter of type 'BufferEncoding'.\n return response.end(data, ...arguments_);\n };\n }\n\n return next();\n };\n\nexport default serializersMiddleware;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport { NodeRouter } from \"@visulima/connect\";\nimport type { AnyZodObject, ZodObject } from \"zod\";\n\nimport type { ErrorHandlers } from \"../error-handler/types\";\nimport type { Serializers } from \"../serializers\";\nimport { onError, onNoMatch } from \"./handler\";\nimport httpHeaderNormalizerMiddleware from \"./middleware/http-header-normalizer\";\nimport serializersMiddleware from \"./middleware/serializers-middleware\";\n\nconst createNodeRouter = <\n Request extends IncomingMessage,\n Response extends ServerResponse,\n Schema extends AnyZodObject = ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>,\n>(\n options: {\n errorHandlers?: ErrorHandlers;\n middlewares?: {\n \"http-header-normalizer\"?: { canonical?: boolean; normalizeHeaderKey?: (key: string, canonical: boolean) => string };\n serializers?: {\n defaultContentType?: string;\n serializers?: Serializers;\n };\n };\n showTrace?: boolean;\n } = {},\n): NodeRouter<Request, Response, Schema> => {\n const router = new NodeRouter<Request, Response, Schema>({\n onError: onError(options.errorHandlers ?? [], options.showTrace ?? false),\n onNoMatch,\n });\n\n return router\n .use(httpHeaderNormalizerMiddleware(options.middlewares?.[\"http-header-normalizer\"] ?? {}))\n .use(\n serializersMiddleware(\n options.middlewares?.serializers?.serializers ?? [],\n options.middlewares?.serializers?.defaultContentType ?? \"application/json; charset=utf-8\",\n ),\n );\n};\n\nexport default createNodeRouter;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport { expressWrapper } from \"@visulima/connect\";\nimport type { CorsOptions, CorsOptionsDelegate } from \"cors\";\nimport cors from \"cors\";\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nconst corsMiddleware = <Request extends IncomingMessage, Response extends ServerResponse>(options?: CorsOptions | CorsOptionsDelegate) =>\n expressWrapper<Request, Response>(cors(options));\n\nexport default corsMiddleware;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { NextHandler } from \"@visulima/connect\";\nimport createHttpError from \"http-errors\";\nimport type { NextApiResponse } from \"next/types\";\nimport type { RateLimiterAbstract, RateLimiterRes } from \"rate-limiter-flexible\";\n\nconst getIP: (request: IncomingMessage & { ip?: string }) => string | undefined = (request) =>\n request.ip ??\n (request.headers[\"x-forwarded-for\"] as string | undefined) ??\n (request.headers[\"x-real-ip\"] as string | undefined) ??\n request.socket.remoteAddress;\n\ntype HeaderValue = ReadonlyArray<string> | number | string;\n\nconst rateLimiterMiddleware =\n (rateLimiter: RateLimiterAbstract, headers?: (limiterResponse: RateLimiterRes) => Record<string, HeaderValue>) =>\n async <Request extends IncomingMessage, Response extends ServerResponse>(\n request: Request,\n response: NextApiResponse | Response,\n next: NextHandler,\n ): Promise<void> => {\n const ip = getIP(request);\n\n if (ip === undefined) {\n throw createHttpError(400, \"Missing IP\");\n }\n\n try {\n const limiter = await rateLimiter.consume(ip);\n\n const mergedHeaders: Record<string, HeaderValue> = {\n \"Retry-After\": Math.round(limiter.msBeforeNext / 1000) || 1,\n \"X-RateLimit-Remaining\": limiter.remainingPoints,\n \"X-RateLimit-Reset\": new Date(Date.now() + limiter.msBeforeNext).toISOString(),\n ...headers,\n };\n\n Object.keys(mergedHeaders).forEach((key) => {\n response.setHeader(key, mergedHeaders[key] as HeaderValue);\n });\n\n await next();\n } catch {\n throw createHttpError(429, \"Too Many Requests\");\n }\n };\n\nexport default rateLimiterMiddleware;\n"]}