UNPKG

@visulima/api-platform

Version:

Visulima API platform is a set of tools to build and consume web APIs

1 lines 30.4 kB
{"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"]}