90dc-core 1.11.3 → 1.11.4

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,"file":"ErrorMiddleware.d.ts","sourceRoot":"","sources":["../../../src/lib/middlewares/ErrorMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAc,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CACxD;AAED,wBAAgB,eAAe,CAAC,MAAM,GAAE,qBAA0B,IAQlD,KAAK,OAAO,EAAE,MAAM,IAAI,mBAqCvC;AA0DD,wBAAgB,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG;IAClD,gBAAgB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrE,CAQA"}
1
+ {"version":3,"file":"ErrorMiddleware.d.ts","sourceRoot":"","sources":["../../../src/lib/middlewares/ErrorMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAc,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CACxD;AAED,wBAAgB,eAAe,CAAC,MAAM,GAAE,qBAA0B,IAQlD,KAAK,OAAO,EAAE,MAAM,IAAI,mBAqCvC;AA+DD,wBAAgB,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG;IAClD,gBAAgB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrE,CAQA"}
@@ -29,31 +29,36 @@ export function ErrorMiddleware(config = {}) {
29
29
  };
30
30
  }
31
31
  function defaultErrorLogger(error, ctx) {
32
+ const isDev = process.env.NODE_ENV === "development";
32
33
  const safeEmail = typeof ctx.state.user?.email === "string" ? "***@***" : undefined;
33
- const logData = {
34
- error: {
34
+ if (error.statusCode >= 500) {
35
+ if (!isDev) {
36
+ const prodLogData = {
37
+ error: {
38
+ code: error.code,
39
+ message: error.message,
40
+ statusCode: error.statusCode
41
+ },
42
+ request: {
43
+ path: ctx.path
44
+ },
45
+ user: {
46
+ uuid: ctx.state.user?.userUuid,
47
+ email: safeEmail
48
+ },
49
+ traceId: ctx.state.traceId
50
+ };
51
+ console.error("Server Error:", JSON.stringify(prodLogData));
52
+ } else {
53
+ console.error("Server Error:", error.stack || error.message);
54
+ }
55
+ } else {
56
+ console.warn("Client Error:", JSON.stringify({
35
57
  code: error.code,
36
58
  message: error.message,
37
59
  statusCode: error.statusCode,
38
- isOperational: error.isOperational,
39
- stack: error.statusCode >= 500 ? error.stack : undefined
40
- },
41
- request: {
42
- method: ctx.method,
43
- path: ctx.path,
44
- ip: ctx.ip,
45
- userAgent: ctx.get("user-agent")
46
- },
47
- user: {
48
- uuid: ctx.state.user?.userUuid,
49
- email: safeEmail
50
- },
51
- traceId: ctx.state.traceId
52
- };
53
- if (error.statusCode >= 500) {
54
- console.error("Server Error:", JSON.stringify(logData));
55
- } else {
56
- console.warn("Client Error:", JSON.stringify(logData));
60
+ path: ctx.path
61
+ }));
57
62
  }
58
63
  }
59
64
  function formatErrorResponse(error, exposeDetails) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/middlewares/ErrorMiddleware.ts"],"sourcesContent":["import type { Context, Next } from \"koa\";\nimport { z } from \"zod\";\nimport { AppError, toAppError } from \"../Errors/AppError.js\";\n\nexport interface ErrorMiddlewareConfig {\n exposeErrorDetails?: boolean;\n logErrors?: boolean;\n logger?: (error: Error, ctx: Context) => void;\n formatter?: (error: AppError, ctx: Context) => unknown;\n}\n\nexport function ErrorMiddleware(config: ErrorMiddlewareConfig = {}) {\n const {\n exposeErrorDetails = false,\n logErrors = true,\n logger,\n formatter,\n } = config;\n\n return async (ctx: Context, next: Next) => {\n try {\n await next();\n } catch (err) {\n let appError: AppError;\n\n if (err instanceof z.ZodError) {\n appError = new AppError(\n \"VALIDATION_ERROR\",\n \"Request validation failed\",\n 400,\n formatZodErrors(err)\n );\n } else {\n appError = toAppError(err);\n }\n\n if (logErrors) {\n if (logger) {\n logger(appError, ctx);\n } else {\n defaultErrorLogger(appError, ctx);\n }\n }\n\n ctx.status = appError.statusCode;\n ctx.set(\"X-Error-Code\", appError.code);\n ctx.type = \"application/json\";\n\n ctx.body = formatter\n ? formatter(appError, ctx)\n : formatErrorResponse(appError, exposeErrorDetails);\n\n // optional: only emit for 5xx to avoid noisy app-level listeners\n ctx.app.emit(\"error\", appError, ctx);\n }\n };\n}\n\nfunction defaultErrorLogger(error: AppError, ctx: Context): void {\n const safeEmail =\n typeof ctx.state.user?.email === \"string\" ? \"***@***\" : undefined;\n\n const logData = {\n error: {\n code: error.code,\n message: error.message,\n statusCode: error.statusCode,\n isOperational: error.isOperational,\n stack: error.statusCode >= 500 ? error.stack : undefined, // Include stack only for server errors\n },\n request: {\n method: ctx.method,\n path: ctx.path,\n ip: ctx.ip,\n userAgent: ctx.get(\"user-agent\"),\n },\n user: {\n uuid: ctx.state.user?.userUuid,\n email: safeEmail,\n },\n traceId: ctx.state.traceId,\n };\n\n if (error.statusCode >= 500) {\n console.error(\"Server Error:\", JSON.stringify(logData));\n } else {\n console.warn(\"Client Error:\", JSON.stringify(logData));\n }\n}\n\nfunction formatErrorResponse(error: AppError, exposeDetails: boolean): unknown {\n const response: {\n code: string;\n message: string;\n details?: unknown;\n stack?: string;\n } = {\n code: error.code,\n message: error.message,\n };\n\n if (exposeDetails || error.statusCode < 500) {\n if (error.details !== undefined) {\n response.details = error.details;\n }\n }\n\n if (exposeDetails && error.stack) {\n response.stack = error.stack;\n }\n\n return response;\n}\n\nexport function formatZodErrors(error: z.ZodError): {\n validationErrors: { path: string; message: string; code: string }[];\n} {\n return {\n validationErrors: error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n code: issue.code,\n })),\n };\n}"],"names":["z","AppError","toAppError","ErrorMiddleware","config","exposeErrorDetails","logErrors","logger","formatter","ctx","next","err","appError","ZodError","formatZodErrors","defaultErrorLogger","status","statusCode","set","code","type","body","formatErrorResponse","app","emit","error","safeEmail","state","user","email","undefined","logData","message","isOperational","stack","request","method","path","ip","userAgent","get","uuid","userUuid","traceId","console","JSON","stringify","warn","exposeDetails","response","details","validationErrors","issues","map","issue","join"],"mappings":"AACA,SAASA,CAAC,QAAQ,MAAM;AACxB,SAASC,QAAQ,EAAEC,UAAU,QAAQ,wBAAwB;AAS7D,OAAO,SAASC,gBAAgBC,SAAgC,CAAC,CAAC;IAChE,MAAM,EACJC,qBAAqB,KAAK,EAC1BC,YAAY,IAAI,EAChBC,MAAM,EACNC,SAAS,EACV,GAAGJ;IAEJ,OAAO,OAAOK,KAAcC;QAC1B,IAAI;YACF,MAAMA;QACR,EAAE,OAAOC,KAAK;YACZ,IAAIC;YAEJ,IAAID,eAAeX,EAAEa,QAAQ,EAAE;gBAC7BD,WAAW,IAAIX,SACX,oBACA,6BACA,KACAa,gBAAgBH;YAEtB,OAAO;gBACLC,WAAWV,WAAWS;YACxB;YAEA,IAAIL,WAAW;gBACb,IAAIC,QAAQ;oBACVA,OAAOK,UAAUH;gBACnB,OAAO;oBACLM,mBAAmBH,UAAUH;gBAC/B;YACF;YAEAA,IAAIO,MAAM,GAAGJ,SAASK,UAAU;YAChCR,IAAIS,GAAG,CAAC,gBAAgBN,SAASO,IAAI;YACrCV,IAAIW,IAAI,GAAG;YAEXX,IAAIY,IAAI,GAAGb,YACLA,UAAUI,UAAUH,OACpBa,oBAAoBV,UAAUP;YAEpC,iEAAiE;YACjEI,IAAIc,GAAG,CAACC,IAAI,CAAC,SAASZ,UAAUH;QAClC;IACF;AACF;AAEA,SAASM,mBAAmBU,KAAe,EAAEhB,GAAY;IACvD,MAAMiB,YACF,OAAOjB,IAAIkB,KAAK,CAACC,IAAI,EAAEC,UAAU,WAAW,YAAYC;IAE5D,MAAMC,UAAU;QACdN,OAAO;YACLN,MAAMM,MAAMN,IAAI;YAChBa,SAASP,MAAMO,OAAO;YACtBf,YAAYQ,MAAMR,UAAU;YAC5BgB,eAAeR,MAAMQ,aAAa;YAClCC,OAAOT,MAAMR,UAAU,IAAI,MAAMQ,MAAMS,KAAK,GAAGJ;QACjD;QACAK,SAAS;YACPC,QAAQ3B,IAAI2B,MAAM;YAClBC,MAAM5B,IAAI4B,IAAI;YACdC,IAAI7B,IAAI6B,EAAE;YACVC,WAAW9B,IAAI+B,GAAG,CAAC;QACrB;QACAZ,MAAM;YACJa,MAAMhC,IAAIkB,KAAK,CAACC,IAAI,EAAEc;YACtBb,OAAOH;QACT;QACAiB,SAASlC,IAAIkB,KAAK,CAACgB,OAAO;IAC5B;IAEA,IAAIlB,MAAMR,UAAU,IAAI,KAAK;QAC3B2B,QAAQnB,KAAK,CAAC,iBAAiBoB,KAAKC,SAAS,CAACf;IAChD,OAAO;QACLa,QAAQG,IAAI,CAAC,iBAAiBF,KAAKC,SAAS,CAACf;IAC/C;AACF;AAEA,SAAST,oBAAoBG,KAAe,EAAEuB,aAAsB;IAClE,MAAMC,WAKF;QACA9B,MAAMM,MAAMN,IAAI;QAChBa,SAASP,MAAMO,OAAO;IAC1B;IAEA,IAAIgB,iBAAiBvB,MAAMR,UAAU,GAAG,KAAK;QAC3C,IAAIQ,MAAMyB,OAAO,KAAKpB,WAAW;YAC/BmB,SAASC,OAAO,GAAGzB,MAAMyB,OAAO;QAClC;IACF;IAEA,IAAIF,iBAAiBvB,MAAMS,KAAK,EAAE;QAChCe,SAASf,KAAK,GAAGT,MAAMS,KAAK;IAC9B;IAEA,OAAOe;AACT;AAEA,OAAO,SAASnC,gBAAgBW,KAAiB;IAG/C,OAAO;QACL0B,kBAAkB1B,MAAM2B,MAAM,CAACC,GAAG,CAAC,CAACC,QAAW,CAAA;gBAC7CjB,MAAMiB,MAAMjB,IAAI,CAACkB,IAAI,CAAC;gBACtBvB,SAASsB,MAAMtB,OAAO;gBACtBb,MAAMmC,MAAMnC,IAAI;YAClB,CAAA;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/lib/middlewares/ErrorMiddleware.ts"],"sourcesContent":["import type { Context, Next } from \"koa\";\nimport { z } from \"zod\";\nimport { AppError, toAppError } from \"../Errors/AppError.js\";\n\nexport interface ErrorMiddlewareConfig {\n exposeErrorDetails?: boolean;\n logErrors?: boolean;\n logger?: (error: Error, ctx: Context) => void;\n formatter?: (error: AppError, ctx: Context) => unknown;\n}\n\nexport function ErrorMiddleware(config: ErrorMiddlewareConfig = {}) {\n const {\n exposeErrorDetails = false,\n logErrors = true,\n logger,\n formatter,\n } = config;\n\n return async (ctx: Context, next: Next) => {\n try {\n await next();\n } catch (err) {\n let appError: AppError;\n\n if (err instanceof z.ZodError) {\n appError = new AppError(\n \"VALIDATION_ERROR\",\n \"Request validation failed\",\n 400,\n formatZodErrors(err)\n );\n } else {\n appError = toAppError(err);\n }\n\n if (logErrors) {\n if (logger) {\n logger(appError, ctx);\n } else {\n defaultErrorLogger(appError, ctx);\n }\n }\n\n ctx.status = appError.statusCode;\n ctx.set(\"X-Error-Code\", appError.code);\n ctx.type = \"application/json\";\n\n ctx.body = formatter\n ? formatter(appError, ctx)\n : formatErrorResponse(appError, exposeErrorDetails);\n\n // optional: only emit for 5xx to avoid noisy app-level listeners\n ctx.app.emit(\"error\", appError, ctx);\n }\n };\n}\n\nfunction defaultErrorLogger(error: AppError, ctx: Context): void {\n const isDev = process.env.NODE_ENV === \"development\";\n const safeEmail =\n typeof ctx.state.user?.email === \"string\" ? \"***@***\" : undefined;\n\n if (error.statusCode >= 500) {\n if (!isDev) {\n const prodLogData = {\n error: {\n code: error.code,\n message: error.message,\n statusCode: error.statusCode,\n },\n request: {\n path: ctx.path,\n },\n user: {\n uuid: ctx.state.user?.userUuid,\n email: safeEmail,\n },\n traceId: ctx.state.traceId,\n };\n console.error(\"Server Error:\", JSON.stringify(prodLogData));\n } else {\n console.error(\"Server Error:\", error.stack || error.message);\n }\n } else {\n console.warn(\"Client Error:\", JSON.stringify({\n code: error.code,\n message: error.message,\n statusCode: error.statusCode,\n path: ctx.path,\n }));\n }\n}\n\n\nfunction formatErrorResponse(error: AppError, exposeDetails: boolean): unknown {\n const response: {\n code: string;\n message: string;\n details?: unknown;\n stack?: string;\n } = {\n code: error.code,\n message: error.message,\n };\n\n if (exposeDetails || error.statusCode < 500) {\n if (error.details !== undefined) {\n response.details = error.details;\n }\n }\n\n if (exposeDetails && error.stack) {\n response.stack = error.stack;\n }\n\n return response;\n}\n\nexport function formatZodErrors(error: z.ZodError): {\n validationErrors: { path: string; message: string; code: string }[];\n} {\n return {\n validationErrors: error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n code: issue.code,\n })),\n };\n}"],"names":["z","AppError","toAppError","ErrorMiddleware","config","exposeErrorDetails","logErrors","logger","formatter","ctx","next","err","appError","ZodError","formatZodErrors","defaultErrorLogger","status","statusCode","set","code","type","body","formatErrorResponse","app","emit","error","isDev","process","env","NODE_ENV","safeEmail","state","user","email","undefined","prodLogData","message","request","path","uuid","userUuid","traceId","console","JSON","stringify","stack","warn","exposeDetails","response","details","validationErrors","issues","map","issue","join"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "90dc-core",
3
- "version": "1.11.3",
3
+ "version": "1.11.4",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",