edgespec
Version:
Write Winter-CG compatible routes with filesystem routing and tons of features
1 lines • 9.19 kB
Source Map (JSON)
{"version":3,"sources":["../../src/lib/format-zod-error.ts","../../src/middleware/http-exceptions.ts","../../src/middleware/with-default-exception-handling.ts","../../src/middleware/with-logger.ts"],"names":["kleur"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ZodIssue, ZodError } from \"zod\"\n\nconst zodIssueToString = (issue: ZodIssue) => {\n if (issue.path.join(\".\") === \"\") {\n return issue.message\n }\n if (issue.message === \"Required\") {\n return `\\`${issue.path.join(\".\")}\\` is required`\n }\n return `${issue.message} for \"${issue.path.join(\".\")}\"`\n}\n\nexport const formatZodError = (error: ZodError): string => {\n let message: string\n if (error.issues.length === 1) {\n const issue = error.issues[0]\n message = zodIssueToString(issue)\n } else {\n const message_components: string[] = []\n for (const issue of error.issues) {\n message_components.push(zodIssueToString(issue))\n }\n message =\n `${error.issues.length} Zod validation issues: ` +\n message_components.join(\", \")\n }\n\n message += `. Full Zod error: ${JSON.stringify(error.issues, null, 2)}`\n\n return message\n}\n","import { formatZodError } from \"src/lib/format-zod-error.js\"\nimport { z } from \"zod\"\n\nexport interface HttpException {\n status: number\n message?: string\n\n _isHttpException: true\n}\n\nexport abstract class EdgeSpecMiddlewareError\n extends Error\n implements HttpException\n{\n _isHttpException = true as const\n\n constructor(\n public message: string,\n public status: number = 500\n ) {\n super(message)\n this.name = this.constructor.name\n }\n}\n\nexport class MethodNotAllowedError extends EdgeSpecMiddlewareError {\n constructor(allowedMethods: readonly string[]) {\n super(`only ${allowedMethods.join(\",\")} accepted`, 405)\n }\n}\n\nexport class NotFoundError extends EdgeSpecMiddlewareError {\n constructor(message: string) {\n super(message, 404)\n }\n}\n\nexport abstract class BadRequestError extends EdgeSpecMiddlewareError {\n constructor(message: string) {\n super(message, 400)\n }\n}\n\nexport class InvalidQueryParamsError extends BadRequestError {\n constructor(message: string) {\n super(message)\n }\n}\n\nexport class InvalidContentTypeError extends BadRequestError {\n constructor(message: string) {\n super(message)\n }\n}\n\nexport class InputParsingError extends BadRequestError {\n constructor(message: string) {\n super(message)\n }\n}\n\nexport class InputValidationError extends BadRequestError {\n constructor(error: z.ZodError<any>) {\n super(formatZodError(error))\n }\n}\n\nexport class ResponseValidationError extends EdgeSpecMiddlewareError {\n constructor(error: z.ZodError<any>) {\n super(formatZodError(error), 500)\n }\n}\n","import { Middleware } from \"src/middleware/types.js\"\nimport { Logger } from \"./with-logger.js\"\nimport kleur from \"kleur\"\n\ninterface CreateWithDefaultExceptionHandlingOptions {\n coloredLogs?: boolean\n logWhen?: (status: number, error: unknown) => boolean\n includeStackTraceInResponse?: boolean\n}\n\n/**\n *\n */\nexport const createWithDefaultExceptionHandling =\n ({\n coloredLogs = true,\n logWhen = (status) => status >= 500,\n includeStackTraceInResponse = true,\n }: CreateWithDefaultExceptionHandlingOptions = {}): Middleware<{\n logger?: Logger\n }> =>\n async (req, ctx, next) => {\n try {\n return await next(req, ctx)\n } catch (e: any) {\n let response: Response\n if (\"_isHttpException\" in e) {\n response = Response.json(\n {\n message: e.message,\n stack: includeStackTraceInResponse ? e.stack : undefined,\n },\n {\n status: e.status,\n }\n )\n } else {\n response = Response.json(\n {\n message: \"Internal server error\",\n stack: includeStackTraceInResponse ? e.stack : undefined,\n },\n {\n status: 500,\n }\n )\n }\n\n if (logWhen(response.status, e)) {\n const logger = ctx.logger ?? console\n kleur.enabled = coloredLogs\n\n const { pathname } = new URL(req.url)\n const routeLog =\n response.status >= 500\n ? kleur.bgRed(`${pathname} threw an error`)\n : kleur.bgYellow(`${pathname} threw an error`)\n\n logger.error(\n `${routeLog}: ${e instanceof Error ? e.stack : e.toString()}`\n )\n }\n\n return response\n }\n }\n","import { Middleware } from \"./types.js\"\n\nexport type Logger = {\n debug: (...args: any[]) => void\n info: (...args: any[]) => void\n warn: (...args: any[]) => void\n error: (...args: any[]) => void\n}\n\n/**\n * Attaches a provided logger to ctx.logger.\n * `ctx.logger` is used by internal EdgeSpec middleware when provided (instead of `console`).\n */\nexport const createWithLogger =\n <L extends Logger>(\n logger: L\n ): Middleware<\n {},\n {\n logger: L\n }\n > =>\n (req, ctx, next) => {\n ctx.logger = logger\n return next(req, ctx)\n }\n"]}