@kuckit/infrastructure 2.0.3 → 2.0.6

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.
Files changed (114) hide show
  1. package/dist/{apply-decorators-CaHIAL5X.js → apply-decorators-DA33OBa7.js} +2 -2
  2. package/dist/{apply-decorators-CaHIAL5X.js.map → apply-decorators-DA33OBa7.js.map} +1 -1
  3. package/dist/{apply-decorators-CW23qWy7.d.ts → apply-decorators-zka0zqoX.d.ts} +1 -1
  4. package/dist/cache/in-memory-cache-store.d.ts +1 -1
  5. package/dist/cache/in-memory-cache-store.js +1 -1
  6. package/dist/cache/index.d.ts +2 -2
  7. package/dist/cache/index.js +2 -2
  8. package/dist/{core.module-_mfoxc8b.d.ts → core.module-BEuDFLDA.d.ts} +2 -2
  9. package/dist/{core.module-ehJ0bdNr.js → core.module-oSFmg8ER.js} +5 -5
  10. package/dist/{core.module-ehJ0bdNr.js.map → core.module-oSFmg8ER.js.map} +1 -1
  11. package/dist/db/drizzle/db.d.ts +1 -1
  12. package/dist/db/drizzle/repositories/index.d.ts +2 -2
  13. package/dist/db/drizzle/repositories/user.drizzle.d.ts +1 -1
  14. package/dist/db/transaction.d.ts +1 -1
  15. package/dist/{db-tAPHBDyL.d.ts → db-Brm6l10l.d.ts} +1 -1
  16. package/dist/decorators/apply-decorators.d.ts +1 -1
  17. package/dist/decorators/apply-decorators.js +2 -3
  18. package/dist/decorators/index.d.ts +6 -7
  19. package/dist/decorators/index.js +6 -7
  20. package/dist/decorators/use-case-decorator.d.ts +1 -2
  21. package/dist/decorators/use-case-decorator.js +1 -2
  22. package/dist/decorators/with-caching.d.ts +1 -1
  23. package/dist/decorators/with-caching.js +1 -1
  24. package/dist/decorators/with-rate-limit.d.ts +1 -1
  25. package/dist/decorators/with-rate-limit.js +1 -1
  26. package/dist/decorators/with-retry.d.ts +1 -1
  27. package/dist/decorators/with-retry.js +1 -1
  28. package/dist/{error-handler-D4s_TTI1.js → error-handler-B4kyoFfy.js} +22 -5
  29. package/dist/error-handler-B4kyoFfy.js.map +1 -0
  30. package/dist/{error-handler-BDid7SIZ.d.ts → error-handler-Up4XIzWt.d.ts} +8 -4
  31. package/dist/errors/error-handler.d.ts +1 -2
  32. package/dist/errors/error-handler.js +1 -2
  33. package/dist/errors/index.d.ts +2 -3
  34. package/dist/errors/index.js +2 -3
  35. package/dist/{event-publisher-adapter-B02oKEmP.js → event-publisher-adapter-BHioo53u.js} +1 -1
  36. package/dist/{event-publisher-adapter-B02oKEmP.js.map → event-publisher-adapter-BHioo53u.js.map} +1 -1
  37. package/dist/{event-publisher-adapter-CpxK0OJ3.d.ts → event-publisher-adapter-DZv-0P_I.d.ts} +1 -1
  38. package/dist/events/event-publisher-adapter.d.ts +1 -1
  39. package/dist/events/event-publisher-adapter.js +1 -1
  40. package/dist/events/in-memory-event-bus.d.ts +1 -1
  41. package/dist/events/in-memory-event-bus.js +1 -1
  42. package/dist/events/in-memory-event-publisher.d.ts +1 -1
  43. package/dist/events/in-memory-event-publisher.js +1 -1
  44. package/dist/events/index.d.ts +4 -4
  45. package/dist/events/index.js +4 -4
  46. package/dist/{in-memory-cache-store-DSdz35Ve.d.ts → in-memory-cache-store-B1RVPPwh.d.ts} +1 -1
  47. package/dist/{in-memory-cache-store-BA-Eqsf0.js → in-memory-cache-store-C-v4ag_e.js} +1 -1
  48. package/dist/{in-memory-cache-store-BA-Eqsf0.js.map → in-memory-cache-store-C-v4ag_e.js.map} +1 -1
  49. package/dist/{in-memory-event-bus-CqIBLRze.d.ts → in-memory-event-bus-0rhMMoai.d.ts} +1 -1
  50. package/dist/{in-memory-event-bus-BCyPrNAE.js → in-memory-event-bus-D0n7i3uf.js} +1 -1
  51. package/dist/{in-memory-event-bus-BCyPrNAE.js.map → in-memory-event-bus-D0n7i3uf.js.map} +1 -1
  52. package/dist/{in-memory-event-publisher-CxOQ-hnq.d.ts → in-memory-event-publisher-BuFGCWeP.d.ts} +1 -1
  53. package/dist/{in-memory-event-publisher-BdOlxfkx.js → in-memory-event-publisher-DEMC6qBo.js} +1 -1
  54. package/dist/{in-memory-event-publisher-BdOlxfkx.js.map → in-memory-event-publisher-DEMC6qBo.js.map} +1 -1
  55. package/dist/{in-memory-rate-limiter-DKOwxFD7.js → in-memory-rate-limiter-ClGoFbk6.js} +1 -1
  56. package/dist/{in-memory-rate-limiter-DKOwxFD7.js.map → in-memory-rate-limiter-ClGoFbk6.js.map} +1 -1
  57. package/dist/{in-memory-rate-limiter-DZqM4MOS.d.ts → in-memory-rate-limiter-DjyLAj3S.d.ts} +1 -1
  58. package/dist/index.d.ts +26 -27
  59. package/dist/index.js +19 -20
  60. package/dist/logging/index.d.ts +3 -4
  61. package/dist/logging/request-logger.d.ts +1 -1
  62. package/dist/logging/structured-logger.d.ts +1 -2
  63. package/dist/modules/core.module.d.ts +8 -9
  64. package/dist/modules/core.module.js +6 -7
  65. package/dist/modules/index.d.ts +10 -11
  66. package/dist/modules/index.js +8 -9
  67. package/dist/modules/types.d.ts +7 -8
  68. package/dist/modules/user.module.d.ts +8 -9
  69. package/dist/modules/user.module.js +1 -1
  70. package/dist/rate-limiter/in-memory-rate-limiter.d.ts +1 -1
  71. package/dist/rate-limiter/in-memory-rate-limiter.js +1 -1
  72. package/dist/rate-limiter/index.d.ts +2 -2
  73. package/dist/rate-limiter/index.js +2 -2
  74. package/dist/request-logger-Cw1XQWTV.js.map +1 -1
  75. package/dist/{request-logger-CK3SOnoz.d.ts → request-logger-z3FaJPry.d.ts} +2 -2
  76. package/dist/structured-logger-BsxDI9zX.js.map +1 -1
  77. package/dist/{structured-logger-DyrZwR3S.d.ts → structured-logger-DJJ-0mnW.d.ts} +2 -2
  78. package/dist/{transaction-akuz5Fch.d.ts → transaction-D961784D.d.ts} +1 -1
  79. package/dist/{types-BnE7rffD.d.ts → types-BDBUcrxL.d.ts} +4 -4
  80. package/dist/{use-case-decorator-DzPSPSv5.d.ts → use-case-decorator-D9fX_4EY.d.ts} +2 -2
  81. package/dist/{use-case-decorator-GmDeYViz.js → use-case-decorator-DRIN79Vt.js} +2 -2
  82. package/dist/use-case-decorator-DRIN79Vt.js.map +1 -0
  83. package/dist/{user.drizzle-9kkstnkV.d.ts → user.drizzle-SbUroSiT.d.ts} +1 -1
  84. package/dist/{user.module-DqTfy_MM.d.ts → user.module-DWDd3hGF.d.ts} +2 -2
  85. package/dist/{user.module-BEpCbKsU.js → user.module-iUC-HTqT.js} +1 -1
  86. package/dist/{user.module-BEpCbKsU.js.map → user.module-iUC-HTqT.js.map} +1 -1
  87. package/dist/{with-caching-NmBxu7vJ.js → with-caching-DjOW2Xjh.js} +1 -1
  88. package/dist/{with-caching-NmBxu7vJ.js.map → with-caching-DjOW2Xjh.js.map} +1 -1
  89. package/dist/{with-caching-BniS1aZd.d.ts → with-caching-c8PLIWLG.d.ts} +1 -1
  90. package/dist/{with-rate-limit-Cp2V1RHn.js → with-rate-limit-B1L4rZzs.js} +1 -1
  91. package/dist/{with-rate-limit-Cp2V1RHn.js.map → with-rate-limit-B1L4rZzs.js.map} +1 -1
  92. package/dist/{with-rate-limit-DK4ZF-Qg.d.ts → with-rate-limit-CK5GHSfo.d.ts} +1 -1
  93. package/dist/{with-retry-coyYPiX1.js → with-retry-BFh_Hn_O.js} +1 -1
  94. package/dist/{with-retry-coyYPiX1.js.map → with-retry-BFh_Hn_O.js.map} +1 -1
  95. package/dist/{with-retry-B9-hUj7I.d.ts → with-retry-q6ftxgF2.d.ts} +1 -1
  96. package/package.json +4 -4
  97. package/dist/error-handler-D4s_TTI1.js.map +0 -1
  98. package/dist/errors-BB_jeye8.js +0 -43
  99. package/dist/errors-BB_jeye8.js.map +0 -1
  100. package/dist/logger-Bl10drB8.d.ts +0 -23
  101. package/dist/use-case-decorator-GmDeYViz.js.map +0 -1
  102. /package/dist/{cache-BjdZ-Ye4.js → cache-d2O3d-0Z.js} +0 -0
  103. /package/dist/{decorators-CqyPE9AQ.js → decorators-CW7geFqk.js} +0 -0
  104. /package/dist/{errors-DfkerzdO.js → errors-DXbNwomE.js} +0 -0
  105. /package/dist/{events-Dqynhuj2.js → events-DkUA7Khm.js} +0 -0
  106. /package/dist/{index-BH67NKRs.d.ts → index-B8lmalaK.d.ts} +0 -0
  107. /package/dist/{index-C6nYd7xV.d.ts → index-BS25w2a5.d.ts} +0 -0
  108. /package/dist/{index-B5F3AfVc.d.ts → index-CRDznOKQ.d.ts} +0 -0
  109. /package/dist/{index-B7z6dpFd.d.ts → index-Cg5cFzs-.d.ts} +0 -0
  110. /package/dist/{index-C0yeuOwC.d.ts → index-CuY8tqBC.d.ts} +0 -0
  111. /package/dist/{index-DVGDAddE.d.ts → index-LOv54jhI.d.ts} +0 -0
  112. /package/dist/{index-LKrIp3Oo.d.ts → index-kr8Wk7v5.d.ts} +0 -0
  113. /package/dist/{modules-C_2SF3he.js → modules-BICEbyjm.js} +0 -0
  114. /package/dist/{rate-limiter-BnvPGJOK.js → rate-limiter-DhcBdNmF.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"with-retry-coyYPiX1.js","names":["lastError: Error | null"],"sources":["../src/decorators/with-retry.ts"],"sourcesContent":["/**\n * Options for retry decorator\n */\nexport interface WithRetryOptions {\n\t/** Maximum number of retry attempts (default: 3) */\n\tmaxAttempts?: number\n\t/** Initial backoff in milliseconds (default: 100) */\n\tinitialBackoffMs?: number\n\t/** Maximum backoff in milliseconds (default: 30000) */\n\tmaxBackoffMs?: number\n\t/** Backoff multiplier for exponential backoff (default: 2) */\n\tbackoffMultiplier?: number\n\t/** Predicate to determine if error is retryable */\n\tretryOn?: (error: Error) => boolean\n}\n\n/**\n * Wraps a use case with retry logic\n * - Uses exponential backoff\n * - Only retries on specific errors via retryOn predicate\n * - Backoff is capped at maxBackoffMs\n *\n * @example\n * ```ts\n * const retriedGetUser = withRetry(\n * getUserProfile,\n * {\n * maxAttempts: 3,\n * initialBackoffMs: 100,\n * maxBackoffMs: 30000,\n * backoffMultiplier: 2,\n * retryOn: (error) => error.message.includes('TIMEOUT'),\n * }\n * )\n * ```\n */\nexport const withRetry = <I extends any[], O>(\n\tfn: (...args: I) => Promise<O>,\n\toptions: WithRetryOptions = {}\n): ((...args: I) => Promise<O>) => {\n\tconst maxAttempts = options.maxAttempts ?? 3\n\tconst initialBackoffMs = options.initialBackoffMs ?? 100\n\tconst maxBackoffMs = options.maxBackoffMs ?? 30000\n\tconst backoffMultiplier = options.backoffMultiplier ?? 2\n\tconst retryOn = options.retryOn ?? ((error: Error) => error instanceof Error)\n\n\tconst retried = async (...args: I): Promise<O> => {\n\t\tlet lastError: Error | null = null\n\t\tlet backoffMs = initialBackoffMs\n\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await fn(...args)\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error instanceof Error ? error : new Error(String(error))\n\n\t\t\t\t// Check if error is retryable\n\t\t\t\tif (!retryOn(lastError)) {\n\t\t\t\t\tthrow error\n\t\t\t\t}\n\n\t\t\t\t// Don't wait after last attempt\n\t\t\t\tif (attempt < maxAttempts) {\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, backoffMs))\n\n\t\t\t\t\t// Calculate next backoff (with cap)\n\t\t\t\t\tbackoffMs = Math.min(backoffMs * backoffMultiplier, maxBackoffMs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// All attempts exhausted\n\t\tthrow lastError ?? new Error('Retry failed without error')\n\t}\n\n\t// Preserve function name for debugging\n\tObject.defineProperty(retried, 'name', {\n\t\tvalue: `withRetry(${fn.name || 'anonymous'})`,\n\t})\n\n\treturn retried\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,MAAa,aACZ,IACA,UAA4B,EAAE,KACI;CAClC,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,mBAAmB,QAAQ,oBAAoB;CACrD,MAAM,eAAe,QAAQ,gBAAgB;CAC7C,MAAM,oBAAoB,QAAQ,qBAAqB;CACvD,MAAM,UAAU,QAAQ,aAAa,UAAiB,iBAAiB;CAEvE,MAAM,UAAU,OAAO,GAAG,SAAwB;EACjD,IAAIA,YAA0B;EAC9B,IAAI,YAAY;AAEhB,OAAK,IAAI,UAAU,GAAG,WAAW,aAAa,UAC7C,KAAI;AACH,UAAO,MAAM,GAAG,GAAG,KAAK;WAChB,OAAO;AACf,eAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;AAGrE,OAAI,CAAC,QAAQ,UAAU,CACtB,OAAM;AAIP,OAAI,UAAU,aAAa;AAC1B,UAAM,IAAI,SAAS,YAAY,WAAW,SAAS,UAAU,CAAC;AAG9D,gBAAY,KAAK,IAAI,YAAY,mBAAmB,aAAa;;;AAMpE,QAAM,6BAAa,IAAI,MAAM,6BAA6B;;AAI3D,QAAO,eAAe,SAAS,QAAQ,EACtC,OAAO,aAAa,GAAG,QAAQ,YAAY,IAC3C,CAAC;AAEF,QAAO"}
1
+ {"version":3,"file":"with-retry-BFh_Hn_O.js","names":["lastError: Error | null"],"sources":["../src/decorators/with-retry.ts"],"sourcesContent":["/**\n * Options for retry decorator\n */\nexport interface WithRetryOptions {\n\t/** Maximum number of retry attempts (default: 3) */\n\tmaxAttempts?: number\n\t/** Initial backoff in milliseconds (default: 100) */\n\tinitialBackoffMs?: number\n\t/** Maximum backoff in milliseconds (default: 30000) */\n\tmaxBackoffMs?: number\n\t/** Backoff multiplier for exponential backoff (default: 2) */\n\tbackoffMultiplier?: number\n\t/** Predicate to determine if error is retryable */\n\tretryOn?: (error: Error) => boolean\n}\n\n/**\n * Wraps a use case with retry logic\n * - Uses exponential backoff\n * - Only retries on specific errors via retryOn predicate\n * - Backoff is capped at maxBackoffMs\n *\n * @example\n * ```ts\n * const retriedGetUser = withRetry(\n * getUserProfile,\n * {\n * maxAttempts: 3,\n * initialBackoffMs: 100,\n * maxBackoffMs: 30000,\n * backoffMultiplier: 2,\n * retryOn: (error) => error.message.includes('TIMEOUT'),\n * }\n * )\n * ```\n */\nexport const withRetry = <I extends any[], O>(\n\tfn: (...args: I) => Promise<O>,\n\toptions: WithRetryOptions = {}\n): ((...args: I) => Promise<O>) => {\n\tconst maxAttempts = options.maxAttempts ?? 3\n\tconst initialBackoffMs = options.initialBackoffMs ?? 100\n\tconst maxBackoffMs = options.maxBackoffMs ?? 30000\n\tconst backoffMultiplier = options.backoffMultiplier ?? 2\n\tconst retryOn = options.retryOn ?? ((error: Error) => error instanceof Error)\n\n\tconst retried = async (...args: I): Promise<O> => {\n\t\tlet lastError: Error | null = null\n\t\tlet backoffMs = initialBackoffMs\n\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await fn(...args)\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error instanceof Error ? error : new Error(String(error))\n\n\t\t\t\t// Check if error is retryable\n\t\t\t\tif (!retryOn(lastError)) {\n\t\t\t\t\tthrow error\n\t\t\t\t}\n\n\t\t\t\t// Don't wait after last attempt\n\t\t\t\tif (attempt < maxAttempts) {\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, backoffMs))\n\n\t\t\t\t\t// Calculate next backoff (with cap)\n\t\t\t\t\tbackoffMs = Math.min(backoffMs * backoffMultiplier, maxBackoffMs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// All attempts exhausted\n\t\tthrow lastError ?? new Error('Retry failed without error')\n\t}\n\n\t// Preserve function name for debugging\n\tObject.defineProperty(retried, 'name', {\n\t\tvalue: `withRetry(${fn.name || 'anonymous'})`,\n\t})\n\n\treturn retried\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,MAAa,aACZ,IACA,UAA4B,EAAE,KACI;CAClC,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,mBAAmB,QAAQ,oBAAoB;CACrD,MAAM,eAAe,QAAQ,gBAAgB;CAC7C,MAAM,oBAAoB,QAAQ,qBAAqB;CACvD,MAAM,UAAU,QAAQ,aAAa,UAAiB,iBAAiB;CAEvE,MAAM,UAAU,OAAO,GAAG,SAAwB;EACjD,IAAIA,YAA0B;EAC9B,IAAI,YAAY;AAEhB,OAAK,IAAI,UAAU,GAAG,WAAW,aAAa,UAC7C,KAAI;AACH,UAAO,MAAM,GAAG,GAAG,KAAK;WAChB,OAAO;AACf,eAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;AAGrE,OAAI,CAAC,QAAQ,UAAU,CACtB,OAAM;AAIP,OAAI,UAAU,aAAa;AAC1B,UAAM,IAAI,SAAS,YAAY,WAAW,SAAS,UAAU,CAAC;AAG9D,gBAAY,KAAK,IAAI,YAAY,mBAAmB,aAAa;;;AAMpE,QAAM,6BAAa,IAAI,MAAM,6BAA6B;;AAI3D,QAAO,eAAe,SAAS,QAAQ,EACtC,OAAO,aAAa,GAAG,QAAQ,YAAY,IAC3C,CAAC;AAEF,QAAO"}
@@ -37,4 +37,4 @@ interface WithRetryOptions {
37
37
  declare const withRetry: <I extends any[], O>(fn: (...args: I) => Promise<O>, options?: WithRetryOptions) => ((...args: I) => Promise<O>);
38
38
  //#endregion
39
39
  export { withRetry as n, WithRetryOptions as t };
40
- //# sourceMappingURL=with-retry-B9-hUj7I.d.ts.map
40
+ //# sourceMappingURL=with-retry-q6ftxgF2.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kuckit/infrastructure",
3
- "version": "2.0.3",
3
+ "version": "2.0.6",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -22,9 +22,9 @@
22
22
  "prepublishOnly": "npm run build && node ../../scripts/resolve-workspace-protocols.cjs && node ../../scripts/check-no-workspace-protocol.cjs"
23
23
  },
24
24
  "dependencies": {
25
- "@kuckit/domain": "^2.0.3",
26
- "@kuckit/db": "^2.0.3",
27
- "@kuckit/auth": "^2.0.3",
25
+ "@kuckit/domain": "^2.0.6",
26
+ "@kuckit/db": "^2.0.6",
27
+ "@kuckit/auth": "^2.0.6",
28
28
  "@ai-sdk/google": "^2.0.13",
29
29
  "awilix": "^10.0.2",
30
30
  "drizzle-orm": "^0.44.2",
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-handler-D4s_TTI1.js","names":["logger: Logger"],"sources":["../src/errors/error-handler.ts"],"sourcesContent":["import type { Logger } from '../../../domain/src/ports/logger'\nimport { AppError } from '../../../domain/src/errors'\n\n/**\n * Serialized error for API responses\n */\nexport interface SerializedError {\n\tcode: string\n\tmessage: string\n\tstatusCode: number\n\tmeta?: Record<string, any>\n}\n\n/**\n * Error handler for structured error logging and serialization\n */\nexport class ErrorHandler {\n\tconstructor(private logger: Logger) {}\n\n\t/**\n\t * Handle error and serialize for API response\n\t */\n\thandle(error: unknown, context?: Record<string, any>): SerializedError {\n\t\tconst appError = this.normalize(error)\n\n\t\t// Log error with context\n\t\tthis.log(appError, context)\n\n\t\t// Serialize for API response\n\t\treturn this.serialize(appError)\n\t}\n\n\t/**\n\t * Normalize any error to AppError\n\t */\n\tprivate normalize(error: unknown): AppError {\n\t\tif (error instanceof AppError) {\n\t\t\treturn error\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\treturn new AppError('INTERNAL_SERVER_ERROR' as any, error.message, {\n\t\t\t\tstatusCode: 500,\n\t\t\t\tmeta: { originalError: error.name },\n\t\t\t})\n\t\t}\n\n\t\treturn new AppError('INTERNAL_SERVER_ERROR' as any, 'Unknown error occurred', {\n\t\t\tstatusCode: 500,\n\t\t})\n\t}\n\n\t/**\n\t * Log error with appropriate level\n\t */\n\tprivate log(error: AppError, context?: Record<string, any>): void {\n\t\tconst logContext = {\n\t\t\tcode: error.code,\n\t\t\tseverity: error.severity,\n\t\t\tstack: error.stack,\n\t\t\t...context,\n\t\t}\n\n\t\tswitch (error.severity) {\n\t\t\tcase 'LOW':\n\t\t\t\tthis.logger.debug(error.message, logContext)\n\t\t\t\tbreak\n\t\t\tcase 'MEDIUM':\n\t\t\t\tthis.logger.warn(error.message, logContext)\n\t\t\t\tbreak\n\t\t\tcase 'HIGH':\n\t\t\tcase 'CRITICAL':\n\t\t\t\tthis.logger.error(error.message, logContext)\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t/**\n\t * Serialize error for API response\n\t */\n\tprivate serialize(error: AppError): SerializedError {\n\t\treturn {\n\t\t\tcode: error.code,\n\t\t\tmessage: error.message,\n\t\t\tstatusCode: error.statusCode,\n\t\t\t...(Object.keys(error.meta).length > 0 && { meta: error.meta }),\n\t\t}\n\t}\n\n\t/**\n\t * Create error handler factory\n\t */\n\tstatic create(logger: Logger): ErrorHandler {\n\t\treturn new ErrorHandler(logger)\n\t}\n}\n\n/**\n * Factory for error handler\n */\nexport const makeErrorHandler = (logger: Logger): ErrorHandler => {\n\treturn ErrorHandler.create(logger)\n}\n"],"mappings":";;;;;;AAgBA,IAAa,eAAb,MAAa,aAAa;CACzB,YAAY,AAAQA,QAAgB;EAAhB;;;;;CAKpB,OAAO,OAAgB,SAAgD;EACtE,MAAM,WAAW,KAAK,UAAU,MAAM;AAGtC,OAAK,IAAI,UAAU,QAAQ;AAG3B,SAAO,KAAK,UAAU,SAAS;;;;;CAMhC,AAAQ,UAAU,OAA0B;AAC3C,MAAI,iBAAiB,SACpB,QAAO;AAGR,MAAI,iBAAiB,MACpB,QAAO,IAAI,SAAS,yBAAgC,MAAM,SAAS;GAClE,YAAY;GACZ,MAAM,EAAE,eAAe,MAAM,MAAM;GACnC,CAAC;AAGH,SAAO,IAAI,SAAS,yBAAgC,0BAA0B,EAC7E,YAAY,KACZ,CAAC;;;;;CAMH,AAAQ,IAAI,OAAiB,SAAqC;EACjE,MAAM,aAAa;GAClB,MAAM,MAAM;GACZ,UAAU,MAAM;GAChB,OAAO,MAAM;GACb,GAAG;GACH;AAED,UAAQ,MAAM,UAAd;GACC,KAAK;AACJ,SAAK,OAAO,MAAM,MAAM,SAAS,WAAW;AAC5C;GACD,KAAK;AACJ,SAAK,OAAO,KAAK,MAAM,SAAS,WAAW;AAC3C;GACD,KAAK;GACL,KAAK;AACJ,SAAK,OAAO,MAAM,MAAM,SAAS,WAAW;AAC5C;;;;;;CAOH,AAAQ,UAAU,OAAkC;AACnD,SAAO;GACN,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,YAAY,MAAM;GAClB,GAAI,OAAO,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,EAAE,MAAM,MAAM,MAAM;GAC9D;;;;;CAMF,OAAO,OAAO,QAA8B;AAC3C,SAAO,IAAI,aAAa,OAAO;;;;;;AAOjC,MAAa,oBAAoB,WAAiC;AACjE,QAAO,aAAa,OAAO,OAAO"}
@@ -1,43 +0,0 @@
1
- //#region ../domain/src/errors/index.ts
2
- /**
3
- * Severity levels for error classification
4
- */
5
- let ErrorSeverity = /* @__PURE__ */ function(ErrorSeverity$1) {
6
- ErrorSeverity$1["LOW"] = "LOW";
7
- ErrorSeverity$1["MEDIUM"] = "MEDIUM";
8
- ErrorSeverity$1["HIGH"] = "HIGH";
9
- ErrorSeverity$1["CRITICAL"] = "CRITICAL";
10
- return ErrorSeverity$1;
11
- }({});
12
- /**
13
- * Application error base class
14
- */
15
- var AppError = class AppError extends Error {
16
- code;
17
- severity;
18
- statusCode;
19
- meta;
20
- constructor(code, message, options = {}) {
21
- super(message);
22
- this.name = "AppError";
23
- this.code = code;
24
- this.severity = options.severity || ErrorSeverity.MEDIUM;
25
- this.statusCode = options.statusCode || 500;
26
- this.meta = options.meta || {};
27
- Object.setPrototypeOf(this, AppError.prototype);
28
- }
29
- toJSON() {
30
- return {
31
- name: this.name,
32
- code: this.code,
33
- message: this.message,
34
- severity: this.severity,
35
- statusCode: this.statusCode,
36
- meta: this.meta
37
- };
38
- }
39
- };
40
-
41
- //#endregion
42
- export { AppError as t };
43
- //# sourceMappingURL=errors-BB_jeye8.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors-BB_jeye8.js","names":[],"sources":["../../domain/src/errors/index.ts"],"sourcesContent":["/**\n * Application error codes (domain-level)\n */\nexport enum ErrorCode {\n\t// User errors\n\tUSER_NOT_FOUND = 'USER_NOT_FOUND',\n\tUSER_ALREADY_EXISTS = 'USER_ALREADY_EXISTS',\n\tINVALID_EMAIL = 'INVALID_EMAIL',\n\n\t// Auth errors\n\tUNAUTHORIZED = 'UNAUTHORIZED',\n\tFORBIDDEN = 'FORBIDDEN',\n\tSESSION_EXPIRED = 'SESSION_EXPIRED',\n\n\t// Validation errors\n\tINVALID_INPUT = 'INVALID_INPUT',\n\tVALIDATION_ERROR = 'VALIDATION_ERROR',\n\n\t// Rate limiting\n\tRATE_LIMITED = 'RATE_LIMITED',\n\n\t// Generic errors\n\tNOT_FOUND = 'NOT_FOUND',\n\tCONFLICT = 'CONFLICT',\n\tINTERNAL_SERVER_ERROR = 'INTERNAL_SERVER_ERROR',\n}\n\n/**\n * Severity levels for error classification\n */\nexport enum ErrorSeverity {\n\tLOW = 'LOW', // Client error, expected\n\tMEDIUM = 'MEDIUM', // Unexpected but recoverable\n\tHIGH = 'HIGH', // System error, requires attention\n\tCRITICAL = 'CRITICAL', // Complete system failure\n}\n\n/**\n * Application error base class\n */\nexport class AppError extends Error {\n\tpublic readonly code: ErrorCode\n\tpublic readonly severity: ErrorSeverity\n\tpublic readonly statusCode: number\n\tpublic readonly meta: Record<string, any>\n\n\tconstructor(\n\t\tcode: ErrorCode,\n\t\tmessage: string,\n\t\toptions: {\n\t\t\tstatusCode?: number\n\t\t\tseverity?: ErrorSeverity\n\t\t\tmeta?: Record<string, any>\n\t\t} = {}\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'AppError'\n\t\tthis.code = code\n\t\tthis.severity = options.severity || ErrorSeverity.MEDIUM\n\t\tthis.statusCode = options.statusCode || 500\n\t\tthis.meta = options.meta || {}\n\n\t\tObject.setPrototypeOf(this, AppError.prototype)\n\t}\n\n\ttoJSON() {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcode: this.code,\n\t\t\tmessage: this.message,\n\t\t\tseverity: this.severity,\n\t\t\tstatusCode: this.statusCode,\n\t\t\tmeta: this.meta,\n\t\t}\n\t}\n}\n\n/**\n * Helper functions to create specific errors\n */\n\nexport const notFound = (resource: string, meta?: Record<string, any>) =>\n\tnew AppError(ErrorCode.NOT_FOUND, `${resource} not found`, {\n\t\tstatusCode: 404,\n\t\tseverity: ErrorSeverity.LOW,\n\t\tmeta,\n\t})\n\nexport const unauthorized = (reason: string, meta?: Record<string, any>) =>\n\tnew AppError(ErrorCode.UNAUTHORIZED, reason, {\n\t\tstatusCode: 401,\n\t\tseverity: ErrorSeverity.LOW,\n\t\tmeta,\n\t})\n\nexport const forbidden = (reason: string, meta?: Record<string, any>) =>\n\tnew AppError(ErrorCode.FORBIDDEN, reason, {\n\t\tstatusCode: 403,\n\t\tseverity: ErrorSeverity.LOW,\n\t\tmeta,\n\t})\n\nexport const validationError = (message: string, meta?: Record<string, any>) =>\n\tnew AppError(ErrorCode.VALIDATION_ERROR, message, {\n\t\tstatusCode: 400,\n\t\tseverity: ErrorSeverity.LOW,\n\t\tmeta,\n\t})\n\nexport const conflict = (message: string, meta?: Record<string, any>) =>\n\tnew AppError(ErrorCode.CONFLICT, message, {\n\t\tstatusCode: 409,\n\t\tseverity: ErrorSeverity.LOW,\n\t\tmeta,\n\t})\n\nexport const internalError = (message: string, meta?: Record<string, any>) =>\n\tnew AppError(ErrorCode.INTERNAL_SERVER_ERROR, message, {\n\t\tstatusCode: 500,\n\t\tseverity: ErrorSeverity.HIGH,\n\t\tmeta,\n\t})\n"],"mappings":";;;;AA8BA,IAAY,0DAAL;AACN;AACA;AACA;AACA;;;;;;AAMD,IAAa,WAAb,MAAa,iBAAiB,MAAM;CACnC,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAEhB,YACC,MACA,SACA,UAII,EAAE,EACL;AACD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,WAAW,QAAQ,YAAY,cAAc;AAClD,OAAK,aAAa,QAAQ,cAAc;AACxC,OAAK,OAAO,QAAQ,QAAQ,EAAE;AAE9B,SAAO,eAAe,MAAM,SAAS,UAAU;;CAGhD,SAAS;AACR,SAAO;GACN,MAAM,KAAK;GACX,MAAM,KAAK;GACX,SAAS,KAAK;GACd,UAAU,KAAK;GACf,YAAY,KAAK;GACjB,MAAM,KAAK;GACX"}
@@ -1,23 +0,0 @@
1
- //#region ../domain/src/ports/logger.d.ts
2
- /**
3
- * Logger port - structured logging for Loki/Prometheus
4
- * Loki-compatible: labels and structured fields in meta
5
- */
6
- interface Logger {
7
- debug: (message: string, meta?: LogContext) => void;
8
- info: (message: string, meta?: LogContext) => void;
9
- warn: (message: string, meta?: LogContext) => void;
10
- error: (message: string, meta?: LogContext | Error) => void;
11
- }
12
- /**
13
- * Structured log context (Loki labels)
14
- */
15
- interface LogContext {
16
- requestId?: string;
17
- userId?: string;
18
- feature?: string;
19
- [key: string]: any;
20
- }
21
- //#endregion
22
- export { Logger as n, LogContext as t };
23
- //# sourceMappingURL=logger-Bl10drB8.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-case-decorator-GmDeYViz.js","names":[],"sources":["../src/decorators/use-case-decorator.ts"],"sourcesContent":["import type { Logger } from '../../../domain/src/ports/logger'\nimport { AppError } from '../../../domain/src/errors'\n\n/**\n * Use case decorator type\n * Wraps a use case function with cross-cutting concerns\n */\nexport type UseCase<T extends (...args: any[]) => Promise<any>> = T\n\n/**\n * Decorator context passed to all decorators\n */\nexport interface DecoratorContext {\n\tlogger: Logger\n\trequestId?: string\n\tuserId?: string\n\tfeature?: string\n}\n\n/**\n * Performance metrics collected by decorator\n */\nexport interface PerformanceMetrics {\n\tstartTime: number\n\tendTime: number\n\tdurationMs: number\n}\n\n/**\n * Base decorator that adds performance monitoring\n */\nexport const withPerformanceMonitoring = <T extends (...args: any[]) => Promise<any>>(\n\tuseCase: T,\n\tcontext: DecoratorContext,\n\tfeatureName: string\n): T => {\n\treturn (async (...args: Parameters<T>) => {\n\t\tconst startTime = Date.now()\n\n\t\ttry {\n\t\t\tconst result = await useCase(...args)\n\t\t\tconst durationMs = Date.now() - startTime\n\n\t\t\tcontext.logger.debug(`${featureName}_completed`, {\n\t\t\t\trequestId: context.requestId,\n\t\t\t\tfeature: featureName,\n\t\t\t\tdurationMs,\n\t\t\t})\n\n\t\t\treturn result\n\t\t} catch (error) {\n\t\t\tconst durationMs = Date.now() - startTime\n\n\t\t\t// Log even errors with timing\n\t\t\tif (error instanceof AppError) {\n\t\t\t\tcontext.logger.debug(`${featureName}_error`, {\n\t\t\t\t\trequestId: context.requestId,\n\t\t\t\t\tfeature: featureName,\n\t\t\t\t\tdurationMs,\n\t\t\t\t\tcode: error.code,\n\t\t\t\t\tseverity: error.severity,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthrow error\n\t\t}\n\t}) as T\n}\n\n/**\n * Base decorator that adds error handling and conversion\n */\nexport const withErrorHandling = <T extends (...args: any[]) => Promise<any>>(\n\tuseCase: T,\n\tcontext: DecoratorContext,\n\tfeatureName: string\n): T => {\n\treturn (async (...args: Parameters<T>) => {\n\t\ttry {\n\t\t\treturn await useCase(...args)\n\t\t} catch (error) {\n\t\t\t// AppErrors pass through (already have proper structure)\n\t\t\tif (error instanceof AppError) {\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\t// Wrap unexpected errors\n\t\t\tif (error instanceof Error) {\n\t\t\t\tcontext.logger.error(`${featureName}_unexpected_error`, {\n\t\t\t\t\trequestId: context.requestId,\n\t\t\t\t\tfeature: featureName,\n\t\t\t\t\terrorName: error.name,\n\t\t\t\t\terrorMessage: error.message,\n\t\t\t\t\tstack: error.stack,\n\t\t\t\t})\n\n\t\t\t\tthrow new AppError('INTERNAL_SERVER_ERROR' as any, `Unexpected error in ${featureName}`, {\n\t\t\t\t\tstatusCode: 500,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\toriginalError: error.message,\n\t\t\t\t\t\tfeature: featureName,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Unknown errors\n\t\t\tcontext.logger.error(`${featureName}_unknown_error`, {\n\t\t\t\trequestId: context.requestId,\n\t\t\t\tfeature: featureName,\n\t\t\t})\n\n\t\t\tthrow new AppError('INTERNAL_SERVER_ERROR' as any, `Unknown error in ${featureName}`, {\n\t\t\t\tstatusCode: 500,\n\t\t\t\tmeta: { feature: featureName },\n\t\t\t})\n\t\t}\n\t}) as T\n}\n\n/**\n * Request tracing decorator - adds context to logs\n */\nexport const withRequestTracing = <T extends (...args: any[]) => Promise<any>>(\n\tuseCase: T,\n\tcontext: DecoratorContext,\n\tfeatureName: string\n): T => {\n\treturn (async (...args: Parameters<T>) => {\n\t\tcontext.logger.info(`${featureName}_started`, {\n\t\t\trequestId: context.requestId,\n\t\t\tuserId: context.userId,\n\t\t\tfeature: featureName,\n\t\t})\n\n\t\ttry {\n\t\t\tconst result = await useCase(...args)\n\n\t\t\tcontext.logger.info(`${featureName}_success`, {\n\t\t\t\trequestId: context.requestId,\n\t\t\t\tuserId: context.userId,\n\t\t\t\tfeature: featureName,\n\t\t\t})\n\n\t\t\treturn result\n\t\t} catch (error) {\n\t\t\tcontext.logger.error(`${featureName}_failed`, {\n\t\t\t\trequestId: context.requestId,\n\t\t\t\tuserId: context.userId,\n\t\t\t\tfeature: featureName,\n\t\t\t\terror: error instanceof Error ? error.message : 'Unknown error',\n\t\t\t})\n\n\t\t\tthrow error\n\t\t}\n\t}) as T\n}\n\n/**\n * Compose multiple decorators together\n * Order: Tracing → Performance → Error Handling\n * (outermost → innermost)\n */\nexport const decorateUseCase = <T extends (...args: any[]) => Promise<any>>(\n\tuseCase: T,\n\tcontext: DecoratorContext,\n\tfeatureName: string\n): T => {\n\t// Apply decorators from outermost to innermost\n\t// Error handling (innermost - catches first)\n\tlet decorated = withErrorHandling(useCase, context, featureName)\n\n\t// Performance monitoring (middle - wraps error handling)\n\tdecorated = withPerformanceMonitoring(decorated, context, featureName)\n\n\t// Request tracing (outermost - visible in logs)\n\tdecorated = withRequestTracing(decorated, context, featureName)\n\n\treturn decorated\n}\n\n/**\n * Factory for creating decorated use cases\n * Used in dependency injection to wrap use cases automatically\n */\nexport const makeDecoratedUseCase = <T extends (...args: any[]) => Promise<any>>(\n\tuseCase: T,\n\tcontext: DecoratorContext,\n\tfeatureName: string\n): T => {\n\treturn decorateUseCase(useCase, context, featureName)\n}\n"],"mappings":";;;;;;AA+BA,MAAa,6BACZ,SACA,SACA,gBACO;AACP,SAAQ,OAAO,GAAG,SAAwB;EACzC,MAAM,YAAY,KAAK,KAAK;AAE5B,MAAI;GACH,MAAM,SAAS,MAAM,QAAQ,GAAG,KAAK;GACrC,MAAM,aAAa,KAAK,KAAK,GAAG;AAEhC,WAAQ,OAAO,MAAM,GAAG,YAAY,aAAa;IAChD,WAAW,QAAQ;IACnB,SAAS;IACT;IACA,CAAC;AAEF,UAAO;WACC,OAAO;GACf,MAAM,aAAa,KAAK,KAAK,GAAG;AAGhC,OAAI,iBAAiB,SACpB,SAAQ,OAAO,MAAM,GAAG,YAAY,SAAS;IAC5C,WAAW,QAAQ;IACnB,SAAS;IACT;IACA,MAAM,MAAM;IACZ,UAAU,MAAM;IAChB,CAAC;AAGH,SAAM;;;;;;;AAQT,MAAa,qBACZ,SACA,SACA,gBACO;AACP,SAAQ,OAAO,GAAG,SAAwB;AACzC,MAAI;AACH,UAAO,MAAM,QAAQ,GAAG,KAAK;WACrB,OAAO;AAEf,OAAI,iBAAiB,SACpB,OAAM;AAIP,OAAI,iBAAiB,OAAO;AAC3B,YAAQ,OAAO,MAAM,GAAG,YAAY,oBAAoB;KACvD,WAAW,QAAQ;KACnB,SAAS;KACT,WAAW,MAAM;KACjB,cAAc,MAAM;KACpB,OAAO,MAAM;KACb,CAAC;AAEF,UAAM,IAAI,SAAS,yBAAgC,uBAAuB,eAAe;KACxF,YAAY;KACZ,MAAM;MACL,eAAe,MAAM;MACrB,SAAS;MACT;KACD,CAAC;;AAIH,WAAQ,OAAO,MAAM,GAAG,YAAY,iBAAiB;IACpD,WAAW,QAAQ;IACnB,SAAS;IACT,CAAC;AAEF,SAAM,IAAI,SAAS,yBAAgC,oBAAoB,eAAe;IACrF,YAAY;IACZ,MAAM,EAAE,SAAS,aAAa;IAC9B,CAAC;;;;;;;AAQL,MAAa,sBACZ,SACA,SACA,gBACO;AACP,SAAQ,OAAO,GAAG,SAAwB;AACzC,UAAQ,OAAO,KAAK,GAAG,YAAY,WAAW;GAC7C,WAAW,QAAQ;GACnB,QAAQ,QAAQ;GAChB,SAAS;GACT,CAAC;AAEF,MAAI;GACH,MAAM,SAAS,MAAM,QAAQ,GAAG,KAAK;AAErC,WAAQ,OAAO,KAAK,GAAG,YAAY,WAAW;IAC7C,WAAW,QAAQ;IACnB,QAAQ,QAAQ;IAChB,SAAS;IACT,CAAC;AAEF,UAAO;WACC,OAAO;AACf,WAAQ,OAAO,MAAM,GAAG,YAAY,UAAU;IAC7C,WAAW,QAAQ;IACnB,QAAQ,QAAQ;IAChB,SAAS;IACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;IAChD,CAAC;AAEF,SAAM;;;;;;;;;AAUT,MAAa,mBACZ,SACA,SACA,gBACO;CAGP,IAAI,YAAY,kBAAkB,SAAS,SAAS,YAAY;AAGhE,aAAY,0BAA0B,WAAW,SAAS,YAAY;AAGtE,aAAY,mBAAmB,WAAW,SAAS,YAAY;AAE/D,QAAO;;;;;;AAOR,MAAa,wBACZ,SACA,SACA,gBACO;AACP,QAAO,gBAAgB,SAAS,SAAS,YAAY"}
File without changes
File without changes
File without changes