@venizia/ignis-kernel 0.4.7-0 → 0.4.7-1

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 (161) hide show
  1. package/LICENSE.md +1 -4
  2. package/dist/esm/base/applications/cors.d.ts +12 -10
  3. package/dist/esm/base/applications/cors.d.ts.map +1 -1
  4. package/dist/esm/base/applications/cors.js +37 -35
  5. package/dist/esm/base/applications/cors.js.map +1 -1
  6. package/dist/esm/base/applications/rest.js +11 -11
  7. package/dist/esm/base/applications/rest.js.map +1 -1
  8. package/dist/esm/base/auth/authenticate/common/codecs.js +2 -2
  9. package/dist/esm/base/auth/authenticate/common/codecs.js.map +1 -1
  10. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.d.ts +1 -1
  11. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js +1 -1
  12. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js.map +1 -1
  13. package/dist/esm/base/auth/authorize/providers/authorization.provider.js +7 -7
  14. package/dist/esm/base/auth/authorize/providers/authorization.provider.js.map +1 -1
  15. package/dist/esm/base/auth/authorize/providers/request-domain.d.ts +14 -11
  16. package/dist/esm/base/auth/authorize/providers/request-domain.d.ts.map +1 -1
  17. package/dist/esm/base/auth/authorize/providers/request-domain.js +42 -39
  18. package/dist/esm/base/auth/authorize/providers/request-domain.js.map +1 -1
  19. package/dist/esm/base/auth/base/abstract-auth-registry.js +2 -2
  20. package/dist/esm/base/auth/base/abstract-auth-registry.js.map +1 -1
  21. package/dist/esm/base/auth/models/requests/change-password.schema.js +3 -3
  22. package/dist/esm/base/auth/models/requests/change-password.schema.js.map +1 -1
  23. package/dist/esm/base/auth/models/requests/sign-in.schema.js +5 -5
  24. package/dist/esm/base/auth/models/requests/sign-in.schema.js.map +1 -1
  25. package/dist/esm/base/components/controller/rest/rest.component.js +2 -2
  26. package/dist/esm/base/components/controller/rest/rest.component.js.map +1 -1
  27. package/dist/esm/base/controllers/common/index.d.ts +0 -1
  28. package/dist/esm/base/controllers/common/index.d.ts.map +1 -1
  29. package/dist/esm/base/controllers/common/index.js +0 -1
  30. package/dist/esm/base/controllers/common/index.js.map +1 -1
  31. package/dist/esm/base/controllers/common/schema-builders.d.ts +0 -5
  32. package/dist/esm/base/controllers/common/schema-builders.d.ts.map +1 -1
  33. package/dist/esm/base/controllers/common/schema-builders.js +0 -14
  34. package/dist/esm/base/controllers/common/schema-builders.js.map +1 -1
  35. package/dist/esm/base/controllers/context.d.ts +7 -2
  36. package/dist/esm/base/controllers/context.d.ts.map +1 -1
  37. package/dist/esm/base/controllers/context.js +7 -4
  38. package/dist/esm/base/controllers/context.js.map +1 -1
  39. package/dist/esm/base/controllers/factory/controller.d.ts +33 -1
  40. package/dist/esm/base/controllers/factory/controller.d.ts.map +1 -1
  41. package/dist/esm/base/controllers/factory/controller.js +90 -6
  42. package/dist/esm/base/controllers/factory/controller.js.map +1 -1
  43. package/dist/esm/base/controllers/factory/definition.d.ts +1 -8
  44. package/dist/esm/base/controllers/factory/definition.d.ts.map +1 -1
  45. package/dist/esm/base/controllers/factory/definition.js +17 -24
  46. package/dist/esm/base/controllers/factory/definition.js.map +1 -1
  47. package/dist/esm/base/controllers/factory/index.d.ts +0 -1
  48. package/dist/esm/base/controllers/factory/index.d.ts.map +1 -1
  49. package/dist/esm/base/controllers/factory/index.js +0 -1
  50. package/dist/esm/base/controllers/factory/index.js.map +1 -1
  51. package/dist/esm/base/controllers/rest/abstract.d.ts.map +1 -1
  52. package/dist/esm/base/controllers/rest/abstract.js +6 -6
  53. package/dist/esm/base/controllers/rest/abstract.js.map +1 -1
  54. package/dist/esm/base/controllers/rest/base.d.ts +0 -5
  55. package/dist/esm/base/controllers/rest/base.d.ts.map +1 -1
  56. package/dist/esm/base/controllers/rest/base.js +14 -14
  57. package/dist/esm/base/controllers/rest/base.js.map +1 -1
  58. package/dist/esm/base/datasources/abstract.js +2 -2
  59. package/dist/esm/base/datasources/abstract.js.map +1 -1
  60. package/dist/esm/base/events/event-bus.js +4 -4
  61. package/dist/esm/base/events/event-bus.js.map +1 -1
  62. package/dist/esm/base/metadata/injectable.d.ts +7 -4
  63. package/dist/esm/base/metadata/injectable.d.ts.map +1 -1
  64. package/dist/esm/base/metadata/injectable.js +26 -23
  65. package/dist/esm/base/metadata/injectable.js.map +1 -1
  66. package/dist/esm/base/metadata/model-metadata.d.ts +27 -13
  67. package/dist/esm/base/metadata/model-metadata.d.ts.map +1 -1
  68. package/dist/esm/base/metadata/model-metadata.js +56 -26
  69. package/dist/esm/base/metadata/model-metadata.js.map +1 -1
  70. package/dist/esm/base/metadata/persistents.d.ts.map +1 -1
  71. package/dist/esm/base/metadata/persistents.js +21 -13
  72. package/dist/esm/base/metadata/persistents.js.map +1 -1
  73. package/dist/esm/base/metadata/routes/controller.d.ts.map +1 -1
  74. package/dist/esm/base/metadata/routes/controller.js +5 -2
  75. package/dist/esm/base/metadata/routes/controller.js.map +1 -1
  76. package/dist/esm/base/middlewares/app-error/app-error.middleware.js +7 -7
  77. package/dist/esm/base/middlewares/app-error/app-error.middleware.js.map +1 -1
  78. package/dist/esm/base/middlewares/app-error/database.handler.d.ts +14 -12
  79. package/dist/esm/base/middlewares/app-error/database.handler.d.ts.map +1 -1
  80. package/dist/esm/base/middlewares/app-error/database.handler.js +37 -35
  81. package/dist/esm/base/middlewares/app-error/database.handler.js.map +1 -1
  82. package/dist/esm/base/middlewares/app-error/zod.handler.d.ts +28 -23
  83. package/dist/esm/base/middlewares/app-error/zod.handler.d.ts.map +1 -1
  84. package/dist/esm/base/middlewares/app-error/zod.handler.js +56 -53
  85. package/dist/esm/base/middlewares/app-error/zod.handler.js.map +1 -1
  86. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.d.ts +6 -4
  87. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.d.ts.map +1 -1
  88. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.js +14 -12
  89. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.js.map +1 -1
  90. package/dist/esm/base/middlewares/form-body/form-body.middleware.d.ts +15 -11
  91. package/dist/esm/base/middlewares/form-body/form-body.middleware.d.ts.map +1 -1
  92. package/dist/esm/base/middlewares/form-body/form-body.middleware.js +25 -21
  93. package/dist/esm/base/middlewares/form-body/form-body.middleware.js.map +1 -1
  94. package/dist/esm/base/models/common/schemas.d.ts +184 -105
  95. package/dist/esm/base/models/common/schemas.d.ts.map +1 -1
  96. package/dist/esm/base/models/common/schemas.js +105 -54
  97. package/dist/esm/base/models/common/schemas.js.map +1 -1
  98. package/dist/esm/base/models/common/utilities.d.ts +10 -5
  99. package/dist/esm/base/models/common/utilities.d.ts.map +1 -1
  100. package/dist/esm/base/models/common/utilities.js +22 -16
  101. package/dist/esm/base/models/common/utilities.js.map +1 -1
  102. package/dist/esm/base/repositories/common/types/results.d.ts +15 -7
  103. package/dist/esm/base/repositories/common/types/results.d.ts.map +1 -1
  104. package/dist/esm/base/repositories/common/types/results.js +16 -7
  105. package/dist/esm/base/repositories/common/types/results.js.map +1 -1
  106. package/dist/esm/base/repositories/core/abstract.d.ts.map +1 -1
  107. package/dist/esm/base/repositories/core/abstract.js +5 -3
  108. package/dist/esm/base/repositories/core/abstract.js.map +1 -1
  109. package/dist/esm/base/repositories/query-schemas/index.d.ts +1 -1
  110. package/dist/esm/base/repositories/query-schemas/index.d.ts.map +1 -1
  111. package/dist/esm/base/repositories/query-schemas/index.js +3 -3
  112. package/dist/esm/base/repositories/query-schemas/index.js.map +1 -1
  113. package/dist/esm/helpers/inversion/common/relation-builder.js.map +1 -1
  114. package/dist/esm/helpers/inversion/index.d.ts +1 -1
  115. package/dist/esm/helpers/inversion/index.d.ts.map +1 -1
  116. package/dist/esm/helpers/inversion/index.js +1 -1
  117. package/dist/esm/helpers/inversion/index.js.map +1 -1
  118. package/dist/esm/helpers/inversion/mixins/repository.mixin.d.ts.map +1 -1
  119. package/dist/esm/helpers/inversion/mixins/repository.mixin.js +5 -5
  120. package/dist/esm/helpers/inversion/mixins/repository.mixin.js.map +1 -1
  121. package/dist/esm/metadata.d.ts +1 -1
  122. package/dist/esm/metadata.d.ts.map +1 -1
  123. package/dist/esm/metadata.js +1 -1
  124. package/dist/esm/metadata.js.map +1 -1
  125. package/dist/esm/repository.d.ts +2 -2
  126. package/dist/esm/repository.d.ts.map +1 -1
  127. package/dist/esm/repository.js +2 -2
  128. package/dist/esm/repository.js.map +1 -1
  129. package/dist/esm/utilities/index.d.ts +1 -1
  130. package/dist/esm/utilities/index.d.ts.map +1 -1
  131. package/dist/esm/utilities/index.js +1 -1
  132. package/dist/esm/utilities/index.js.map +1 -1
  133. package/dist/esm/utilities/not-supported.utility.d.ts +11 -0
  134. package/dist/esm/utilities/not-supported.utility.d.ts.map +1 -0
  135. package/dist/esm/utilities/not-supported.utility.js +19 -0
  136. package/dist/esm/utilities/not-supported.utility.js.map +1 -0
  137. package/package.json +6 -7
  138. package/dist/esm/base/controllers/common/html-response.d.ts +0 -70
  139. package/dist/esm/base/controllers/common/html-response.d.ts.map +0 -1
  140. package/dist/esm/base/controllers/common/html-response.js +0 -30
  141. package/dist/esm/base/controllers/common/html-response.js.map +0 -1
  142. package/dist/esm/base/controllers/factory/authorize-guard.d.ts +0 -19
  143. package/dist/esm/base/controllers/factory/authorize-guard.d.ts.map +0 -1
  144. package/dist/esm/base/controllers/factory/authorize-guard.js +0 -56
  145. package/dist/esm/base/controllers/factory/authorize-guard.js.map +0 -1
  146. package/dist/esm/base/controllers/factory/helper.d.ts +0 -2
  147. package/dist/esm/base/controllers/factory/helper.d.ts.map +0 -1
  148. package/dist/esm/base/controllers/factory/helper.js +0 -2
  149. package/dist/esm/base/controllers/factory/helper.js.map +0 -1
  150. package/dist/esm/base/controllers/factory/repository-injection.d.ts +0 -14
  151. package/dist/esm/base/controllers/factory/repository-injection.d.ts.map +0 -1
  152. package/dist/esm/base/controllers/factory/repository-injection.js +0 -27
  153. package/dist/esm/base/controllers/factory/repository-injection.js.map +0 -1
  154. package/dist/esm/base/metadata/model-settings.d.ts +0 -11
  155. package/dist/esm/base/metadata/model-settings.d.ts.map +0 -1
  156. package/dist/esm/base/metadata/model-settings.js +0 -30
  157. package/dist/esm/base/metadata/model-settings.js.map +0 -1
  158. package/dist/esm/utilities/error.utility.d.ts +0 -8
  159. package/dist/esm/utilities/error.utility.d.ts.map +0 -1
  160. package/dist/esm/utilities/error.utility.js +0 -14
  161. package/dist/esm/utilities/error.utility.js.map +0 -1
@@ -1,59 +1,62 @@
1
1
  import { MessageCode } from '@venizia/ignis-helpers/core';
2
2
  import { HTTP } from '@venizia/ignis-helpers/common';
3
- const DEFAULT_VALIDATION_MESSAGE = 'ValidationError';
4
- /** Returns a schema-author-supplied code (`issue.params.code`) when it is a non-empty string. */
5
- const extractIssueCode = (opts) => {
6
- const paramsCode = opts.issue?.params?.code;
7
- if (typeof paramsCode === 'string' && paramsCode.length > 0) {
8
- return paramsCode;
3
+ export class ZodErrorHandler {
4
+ static { this.DEFAULT_VALIDATION_MESSAGE = 'ValidationError'; }
5
+ /** Returns a schema-author-supplied code (`issue.params.code`) when it is a non-empty string. */
6
+ static extractIssueCode(opts) {
7
+ const paramsCode = opts.issue?.params?.code;
8
+ if (typeof paramsCode === 'string' && paramsCode.length > 0) {
9
+ return paramsCode;
10
+ }
11
+ return undefined;
9
12
  }
10
- return undefined;
11
- };
12
- /** Formats a ZodError into the 422 validation response. */
13
- export const formatZodError = (opts) => {
14
- const { isProduction, requestId, url, path, error } = opts;
15
- const statusCode = HTTP.ResultCodes.RS_4.UnprocessableEntity;
16
- let validationErrors;
17
- try {
18
- validationErrors = JSON.parse(error.message);
19
- }
20
- catch {
21
- validationErrors = error;
22
- }
23
- const issues = Array.isArray(validationErrors) ? validationErrors : null;
24
- // Prefer the first issue with a custom `params.code`, else its raw Zod code.
25
- let messageCode;
26
- let message = DEFAULT_VALIDATION_MESSAGE;
27
- if (issues && issues.length > 0) {
28
- const primaryIssue = issues.find((issue) => extractIssueCode({ issue }) !== undefined) ?? issues[0];
29
- messageCode = extractIssueCode({ issue: primaryIssue }) ?? primaryIssue.code;
30
- message = primaryIssue.message;
31
- }
32
- // A ZodError we could not parse into issues yields no code of its own; the response still carries one, so no error response is ever missing the field a client branches on.
33
- const resolvedMessageCode = MessageCode.resolve(messageCode);
34
- return {
35
- statusCode,
36
- response: {
37
- message,
13
+ /** Formats a ZodError into the 422 validation response. */
14
+ static formatZodError(opts) {
15
+ const { isProduction, requestId, url, path, error } = opts;
16
+ const statusCode = HTTP.ResultCodes.RS_4.UnprocessableEntity;
17
+ let validationErrors;
18
+ try {
19
+ validationErrors = JSON.parse(error.message);
20
+ }
21
+ catch {
22
+ validationErrors = error;
23
+ }
24
+ const issues = Array.isArray(validationErrors) ? validationErrors : null;
25
+ // Prefer the first issue with a custom `params.code`, else its raw Zod code.
26
+ let messageCode;
27
+ let message = ZodErrorHandler.DEFAULT_VALIDATION_MESSAGE;
28
+ if (issues && issues.length > 0) {
29
+ const primaryIssue = issues.find((issue) => ZodErrorHandler.extractIssueCode({ issue }) !== undefined) ??
30
+ issues[0];
31
+ messageCode = ZodErrorHandler.extractIssueCode({ issue: primaryIssue }) ?? primaryIssue.code;
32
+ message = primaryIssue.message;
33
+ }
34
+ // A ZodError we could not parse into issues yields no code of its own; the response still carries one, so no error response is ever missing the field a client branches on.
35
+ const resolvedMessageCode = MessageCode.resolve(messageCode);
36
+ return {
38
37
  statusCode,
39
- // `args` is empty: a Zod issue carries no interpolation values - per-field detail is in `details.cause`.
40
- normalized: { text: message, code: resolvedMessageCode, args: {} },
41
- requestId,
42
- details: {
43
- url,
44
- path,
45
- stack: !isProduction ? error.stack : undefined,
46
- cause: issues
47
- ? issues.map((el) => ({
48
- path: el.path.join('.') || 'root',
49
- message: el.message,
50
- code: el.code,
51
- expected: el.expected,
52
- received: el.received,
53
- }))
54
- : validationErrors,
38
+ response: {
39
+ message,
40
+ statusCode,
41
+ // `args` is empty: a Zod issue carries no interpolation values - per-field detail is in `details.cause`.
42
+ normalized: { text: message, code: resolvedMessageCode, args: {} },
43
+ requestId,
44
+ details: {
45
+ url,
46
+ path,
47
+ stack: !isProduction ? error.stack : undefined,
48
+ cause: issues
49
+ ? issues.map((el) => ({
50
+ path: el.path.join('.') || 'root',
51
+ message: el.message,
52
+ code: el.code,
53
+ expected: el.expected,
54
+ received: el.received,
55
+ }))
56
+ : validationErrors,
57
+ },
55
58
  },
56
- },
57
- };
58
- };
59
+ };
60
+ }
61
+ }
59
62
  //# sourceMappingURL=zod.handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.handler.js","sourceRoot":"","sources":["../../../../../src/base/middlewares/app-error/zod.handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAIrD,MAAM,0BAA0B,GAAG,iBAAiB,CAAC;AAErD,iGAAiG;AACjG,MAAM,gBAAgB,GAAG,CAAC,IAA8B,EAAE,EAAE;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;IAE5C,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAM9B,EAAE,EAAE;IACH,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC;IAE7D,IAAI,gBAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAE,gBAAoC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9F,6EAA6E;IAC7E,IAAI,WAA+B,CAAC;IACpC,IAAI,OAAO,GAAG,0BAA0B,CAAC;IAEzC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,YAAY,GAChB,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,SAAS,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACjF,WAAW,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;QAC7E,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,4KAA4K;IAC5K,MAAM,mBAAmB,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE7D,OAAO;QACL,UAAU;QACV,QAAQ,EAAE;YACR,OAAO;YACP,UAAU;YACV,yGAAyG;YACzG,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE;YAClE,SAAS;YACT,OAAO,EAAE;gBACP,GAAG;gBACH,IAAI;gBACJ,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBAC9C,KAAK,EAAE,MAAM;oBACX,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;wBAClB,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM;wBACjC,OAAO,EAAE,EAAE,CAAC,OAAO;wBACnB,IAAI,EAAE,EAAE,CAAC,IAAI;wBACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;wBACrB,QAAQ,EAAE,EAAE,CAAC,QAAQ;qBACtB,CAAC,CAAC;oBACL,CAAC,CAAC,gBAAgB;aACrB;SACF;KACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { MessageCode } from '@venizia/ignis-helpers/core';\nimport { HTTP } from '@venizia/ignis-helpers/common';\nimport type { HTTPResponseError } from 'hono/types';\nimport type { IZodIssueLike } from './common';\n\nconst DEFAULT_VALIDATION_MESSAGE = 'ValidationError';\n\n/** Returns a schema-author-supplied code (`issue.params.code`) when it is a non-empty string. */\nconst extractIssueCode = (opts: { issue: IZodIssueLike }) => {\n const paramsCode = opts.issue?.params?.code;\n\n if (typeof paramsCode === 'string' && paramsCode.length > 0) {\n return paramsCode;\n }\n\n return undefined;\n};\n\n/** Formats a ZodError into the 422 validation response. */\nexport const formatZodError = (opts: {\n isProduction: boolean;\n requestId: string;\n url: string;\n path: string;\n error: Error | HTTPResponseError;\n}) => {\n const { isProduction, requestId, url, path, error } = opts;\n const statusCode = HTTP.ResultCodes.RS_4.UnprocessableEntity;\n\n let validationErrors: unknown;\n try {\n validationErrors = JSON.parse(error.message);\n } catch {\n validationErrors = error;\n }\n\n const issues = Array.isArray(validationErrors) ? (validationErrors as IZodIssueLike[]) : null;\n\n // Prefer the first issue with a custom `params.code`, else its raw Zod code.\n let messageCode: string | undefined;\n let message = DEFAULT_VALIDATION_MESSAGE;\n\n if (issues && issues.length > 0) {\n const primaryIssue =\n issues.find((issue) => extractIssueCode({ issue }) !== undefined) ?? issues[0];\n messageCode = extractIssueCode({ issue: primaryIssue }) ?? primaryIssue.code;\n message = primaryIssue.message;\n }\n\n // A ZodError we could not parse into issues yields no code of its own; the response still carries one, so no error response is ever missing the field a client branches on.\n const resolvedMessageCode = MessageCode.resolve(messageCode);\n\n return {\n statusCode,\n response: {\n message,\n statusCode,\n // `args` is empty: a Zod issue carries no interpolation values - per-field detail is in `details.cause`.\n normalized: { text: message, code: resolvedMessageCode, args: {} },\n requestId,\n details: {\n url,\n path,\n stack: !isProduction ? error.stack : undefined,\n cause: issues\n ? issues.map((el) => ({\n path: el.path.join('.') || 'root',\n message: el.message,\n code: el.code,\n expected: el.expected,\n received: el.received,\n }))\n : validationErrors,\n },\n },\n };\n};\n"]}
1
+ {"version":3,"file":"zod.handler.js","sourceRoot":"","sources":["../../../../../src/base/middlewares/app-error/zod.handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAIrD,MAAM,OAAO,eAAe;aACF,+BAA0B,GAAG,iBAAiB,CAAC;IAEvE,iGAAiG;IACzF,MAAM,CAAC,gBAAgB,CAAC,IAA8B;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;QAE5C,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,2DAA2D;IAC3D,MAAM,CAAC,cAAc,CAAC,IAMrB;QACC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAE7D,IAAI,gBAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB,GAAG,KAAK,CAAC;QAC3B,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAE,gBAAoC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE9F,6EAA6E;QAC7E,IAAI,WAA+B,CAAC;QACpC,IAAI,OAAO,GAAG,eAAe,CAAC,0BAA0B,CAAC;QAEzD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,YAAY,GAChB,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,SAAS,CAAC;gBACjF,MAAM,CAAC,CAAC,CAAC,CAAC;YACZ,WAAW,GAAG,eAAe,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;YAC7F,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;QACjC,CAAC;QAED,4KAA4K;QAC5K,MAAM,mBAAmB,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE7D,OAAO;YACL,UAAU;YACV,QAAQ,EAAE;gBACR,OAAO;gBACP,UAAU;gBACV,yGAAyG;gBACzG,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE;gBAClE,SAAS;gBACT,OAAO,EAAE;oBACP,GAAG;oBACH,IAAI;oBACJ,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;oBAC9C,KAAK,EAAE,MAAM;wBACX,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;4BAClB,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM;4BACjC,OAAO,EAAE,EAAE,CAAC,OAAO;4BACnB,IAAI,EAAE,EAAE,CAAC,IAAI;4BACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;4BACrB,QAAQ,EAAE,EAAE,CAAC,QAAQ;yBACtB,CAAC,CAAC;wBACL,CAAC,CAAC,gBAAgB;iBACrB;aACF;SACF,CAAC;IACJ,CAAC","sourcesContent":["import { MessageCode } from '@venizia/ignis-helpers/core';\nimport { HTTP } from '@venizia/ignis-helpers/common';\nimport type { HTTPResponseError } from 'hono/types';\nimport type { IZodIssueLike } from './common';\n\nexport class ZodErrorHandler {\n private static readonly DEFAULT_VALIDATION_MESSAGE = 'ValidationError';\n\n /** Returns a schema-author-supplied code (`issue.params.code`) when it is a non-empty string. */\n private static extractIssueCode(opts: { issue: IZodIssueLike }) {\n const paramsCode = opts.issue?.params?.code;\n\n if (typeof paramsCode === 'string' && paramsCode.length > 0) {\n return paramsCode;\n }\n\n return undefined;\n }\n\n /** Formats a ZodError into the 422 validation response. */\n static formatZodError(opts: {\n isProduction: boolean;\n requestId: string;\n url: string;\n path: string;\n error: Error | HTTPResponseError;\n }) {\n const { isProduction, requestId, url, path, error } = opts;\n const statusCode = HTTP.ResultCodes.RS_4.UnprocessableEntity;\n\n let validationErrors: unknown;\n try {\n validationErrors = JSON.parse(error.message);\n } catch {\n validationErrors = error;\n }\n\n const issues = Array.isArray(validationErrors) ? (validationErrors as IZodIssueLike[]) : null;\n\n // Prefer the first issue with a custom `params.code`, else its raw Zod code.\n let messageCode: string | undefined;\n let message = ZodErrorHandler.DEFAULT_VALIDATION_MESSAGE;\n\n if (issues && issues.length > 0) {\n const primaryIssue =\n issues.find((issue) => ZodErrorHandler.extractIssueCode({ issue }) !== undefined) ??\n issues[0];\n messageCode = ZodErrorHandler.extractIssueCode({ issue: primaryIssue }) ?? primaryIssue.code;\n message = primaryIssue.message;\n }\n\n // A ZodError we could not parse into issues yields no code of its own; the response still carries one, so no error response is ever missing the field a client branches on.\n const resolvedMessageCode = MessageCode.resolve(messageCode);\n\n return {\n statusCode,\n response: {\n message,\n statusCode,\n // `args` is empty: a Zod issue carries no interpolation values - per-field detail is in `details.cause`.\n normalized: { text: message, code: resolvedMessageCode, args: {} },\n requestId,\n details: {\n url,\n path,\n stack: !isProduction ? error.stack : undefined,\n cause: issues\n ? issues.map((el) => ({\n path: el.path.join('.') || 'root',\n message: el.message,\n code: el.code,\n expected: el.expected,\n received: el.received,\n }))\n : validationErrors,\n },\n },\n };\n }\n}\n"]}
@@ -1,6 +1,8 @@
1
1
  import type { MiddlewareHandler } from 'hono';
2
- /** Serves an emoji as an SVG favicon on /favicon.ico. */
3
- export declare const emojiFavicon: (opts: {
4
- icon: string;
5
- }) => MiddlewareHandler;
2
+ export declare class EmojiFaviconMiddleware {
3
+ /** Serves an emoji as an SVG favicon on /favicon.ico. */
4
+ static create(opts: {
5
+ icon: string;
6
+ }): MiddlewareHandler;
7
+ }
6
8
  //# sourceMappingURL=emoji-favicon.middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"emoji-favicon.middleware.d.ts","sourceRoot":"","sources":["../../../../../src/base/middlewares/emoji-favicon/emoji-favicon.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAG9C,yDAAyD;AACzD,eAAO,MAAM,YAAY,GAAI,MAAM;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KAAG,iBAerD,CAAC"}
1
+ {"version":3,"file":"emoji-favicon.middleware.d.ts","sourceRoot":"","sources":["../../../../../src/base/middlewares/emoji-favicon/emoji-favicon.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAG9C,qBAAa,sBAAsB;IACjC,yDAAyD;IACzD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,iBAAiB;CAgBzD"}
@@ -1,14 +1,16 @@
1
1
  import { createMiddleware } from 'hono/factory';
2
- /** Serves an emoji as an SVG favicon on /favicon.ico. */
3
- export const emojiFavicon = (opts) => {
4
- const { icon } = opts;
5
- const mw = createMiddleware(async (context, next) => {
6
- if (context.req.path !== '/favicon.ico') {
7
- return next();
8
- }
9
- context.res.headers.set('content-type', 'image/svg+xml');
10
- return context.body(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" x="-0.1em" font-size="90">${icon}</text></svg>`);
11
- });
12
- return mw;
13
- };
2
+ export class EmojiFaviconMiddleware {
3
+ /** Serves an emoji as an SVG favicon on /favicon.ico. */
4
+ static create(opts) {
5
+ const { icon } = opts;
6
+ const mw = createMiddleware(async (context, next) => {
7
+ if (context.req.path !== '/favicon.ico') {
8
+ return next();
9
+ }
10
+ context.res.headers.set('content-type', 'image/svg+xml');
11
+ return context.body(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" x="-0.1em" font-size="90">${icon}</text></svg>`);
12
+ });
13
+ return mw;
14
+ }
15
+ }
14
16
  //# sourceMappingURL=emoji-favicon.middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"emoji-favicon.middleware.js","sourceRoot":"","sources":["../../../../../src/base/middlewares/emoji-favicon/emoji-favicon.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,yDAAyD;AACzD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAsB,EAAqB,EAAE;IACxE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEtB,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAClD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACxC,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QACzD,OAAO,OAAO,CAAC,IAAI,CACjB,0GAA0G,IAAI,eAAe,CAC9H,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import type { MiddlewareHandler } from 'hono';\nimport { createMiddleware } from 'hono/factory';\n\n/** Serves an emoji as an SVG favicon on /favicon.ico. */\nexport const emojiFavicon = (opts: { icon: string }): MiddlewareHandler => {\n const { icon } = opts;\n\n const mw = createMiddleware(async (context, next) => {\n if (context.req.path !== '/favicon.ico') {\n return next();\n }\n\n context.res.headers.set('content-type', 'image/svg+xml');\n return context.body(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><text y=\".9em\" x=\"-0.1em\" font-size=\"90\">${icon}</text></svg>`,\n );\n });\n\n return mw;\n};\n"]}
1
+ {"version":3,"file":"emoji-favicon.middleware.js","sourceRoot":"","sources":["../../../../../src/base/middlewares/emoji-favicon/emoji-favicon.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,OAAO,sBAAsB;IACjC,yDAAyD;IACzD,MAAM,CAAC,MAAM,CAAC,IAAsB;QAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAEtB,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YAClD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACxC,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YACzD,OAAO,OAAO,CAAC,IAAI,CACjB,0GAA0G,IAAI,eAAe,CAC9H,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,CAAC;IACZ,CAAC;CACF","sourcesContent":["import type { MiddlewareHandler } from 'hono';\nimport { createMiddleware } from 'hono/factory';\n\nexport class EmojiFaviconMiddleware {\n /** Serves an emoji as an SVG favicon on /favicon.ico. */\n static create(opts: { icon: string }): MiddlewareHandler {\n const { icon } = opts;\n\n const mw = createMiddleware(async (context, next) => {\n if (context.req.path !== '/favicon.ico') {\n return next();\n }\n\n context.res.headers.set('content-type', 'image/svg+xml');\n return context.body(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><text y=\".9em\" x=\"-0.1em\" font-size=\"90\">${icon}</text></svg>`,\n );\n });\n\n return mw;\n }\n}\n"]}
@@ -1,12 +1,16 @@
1
- import type { MiddlewareHandler } from 'hono/types';
2
- /** Whether a route declares a form body, so its validator will parse one. */
3
- export declare const hasFormBody: (opts: {
4
- content?: Record<string, unknown>;
5
- }) => boolean;
6
- /**
7
- * Parses a declared form body just ahead of the route's validator, which reads the cached result.
8
- * Left to the validator, a malformed body is a bare `HTTPException(400)` carrying the parser's own
9
- * text and no code; read here, it is `core.request.body_malformed`.
10
- */
11
- export declare const formBodyReader: MiddlewareHandler;
1
+ import type { Context, Next } from 'hono';
2
+ export declare class FormBodyMiddleware {
3
+ private static readonly FORM_CONTENT_TYPES;
4
+ /** Whether a route declares a form body, so its validator will parse one. */
5
+ static hasFormBody(opts: {
6
+ content?: Record<string, unknown>;
7
+ }): boolean;
8
+ /**
9
+ * Parses a declared form body just ahead of the route's validator, which reads the cached result.
10
+ * Left to the validator, a malformed body is a bare `HTTPException(400)` carrying the parser's own
11
+ * text and no code; read here, it is `core.request.body_malformed`. Mounted as a Hono middleware
12
+ * handler (`FormBodyMiddleware.read`), so it never reads `this`.
13
+ */
14
+ static read(context: Context, next: Next): Promise<void>;
15
+ }
12
16
  //# sourceMappingURL=form-body.middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-body.middleware.d.ts","sourceRoot":"","sources":["../../../../../src/base/middlewares/form-body/form-body.middleware.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOpD,6EAA6E;AAC7E,eAAO,MAAM,WAAW,GAAI,MAAM;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KAAG,OAGzE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,iBAQ5B,CAAC"}
1
+ {"version":3,"file":"form-body.middleware.d.ts","sourceRoot":"","sources":["../../../../../src/base/middlewares/form-body/form-body.middleware.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAGxC;IAEF,6EAA6E;IAC7E,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO;IAQxE;;;;;OAKG;WACU,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAS/D"}
@@ -1,24 +1,28 @@
1
1
  import { HTTP } from '@venizia/ignis-helpers/common';
2
- import { readFormBody } from '@venizia/ignis-helpers/core';
3
- const FORM_CONTENT_TYPES = [
4
- HTTP.HeaderValues.MULTIPART_FORM_DATA,
5
- HTTP.HeaderValues.APPLICATION_FORM_URLENCODED,
6
- ];
7
- /** Whether a route declares a form body, so its validator will parse one. */
8
- export const hasFormBody = (opts) => {
9
- const { content } = opts;
10
- return content !== undefined && FORM_CONTENT_TYPES.some((contentType) => contentType in content);
11
- };
12
- /**
13
- * Parses a declared form body just ahead of the route's validator, which reads the cached result.
14
- * Left to the validator, a malformed body is a bare `HTTPException(400)` carrying the parser's own
15
- * text and no code; read here, it is `core.request.body_malformed`.
16
- */
17
- export const formBodyReader = async (context, next) => {
18
- const contentType = context.req.header(HTTP.Headers.CONTENT_TYPE) ?? '';
19
- if (FORM_CONTENT_TYPES.some((formType) => contentType.includes(formType))) {
20
- await readFormBody({ req: context.req });
2
+ import { FormBodyUtility } from '@venizia/ignis-helpers/core';
3
+ export class FormBodyMiddleware {
4
+ static { this.FORM_CONTENT_TYPES = [
5
+ HTTP.HeaderValues.MULTIPART_FORM_DATA,
6
+ HTTP.HeaderValues.APPLICATION_FORM_URLENCODED,
7
+ ]; }
8
+ /** Whether a route declares a form body, so its validator will parse one. */
9
+ static hasFormBody(opts) {
10
+ const { content } = opts;
11
+ return (content !== undefined &&
12
+ FormBodyMiddleware.FORM_CONTENT_TYPES.some((contentType) => contentType in content));
21
13
  }
22
- await next();
23
- };
14
+ /**
15
+ * Parses a declared form body just ahead of the route's validator, which reads the cached result.
16
+ * Left to the validator, a malformed body is a bare `HTTPException(400)` carrying the parser's own
17
+ * text and no code; read here, it is `core.request.body_malformed`. Mounted as a Hono middleware
18
+ * handler (`FormBodyMiddleware.read`), so it never reads `this`.
19
+ */
20
+ static async read(context, next) {
21
+ const contentType = context.req.header(HTTP.Headers.CONTENT_TYPE) ?? '';
22
+ if (FormBodyMiddleware.FORM_CONTENT_TYPES.some((formType) => contentType.includes(formType))) {
23
+ await FormBodyUtility.readFormBody({ req: context.req });
24
+ }
25
+ await next();
26
+ }
27
+ }
24
28
  //# sourceMappingURL=form-body.middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-body.middleware.js","sourceRoot":"","sources":["../../../../../src/base/middlewares/form-body/form-body.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,MAAM,kBAAkB,GAAG;IACzB,IAAI,CAAC,YAAY,CAAC,mBAAmB;IACrC,IAAI,CAAC,YAAY,CAAC,2BAA2B;CAC9C,CAAC;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAA2C,EAAW,EAAE;IAClF,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACzB,OAAO,OAAO,KAAK,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC;AACnG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAExE,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CAAC","sourcesContent":["import { HTTP } from '@venizia/ignis-helpers/common';\nimport { readFormBody } from '@venizia/ignis-helpers/core';\nimport type { MiddlewareHandler } from 'hono/types';\n\nconst FORM_CONTENT_TYPES = [\n HTTP.HeaderValues.MULTIPART_FORM_DATA,\n HTTP.HeaderValues.APPLICATION_FORM_URLENCODED,\n];\n\n/** Whether a route declares a form body, so its validator will parse one. */\nexport const hasFormBody = (opts: { content?: Record<string, unknown> }): boolean => {\n const { content } = opts;\n return content !== undefined && FORM_CONTENT_TYPES.some((contentType) => contentType in content);\n};\n\n/**\n * Parses a declared form body just ahead of the route's validator, which reads the cached result.\n * Left to the validator, a malformed body is a bare `HTTPException(400)` carrying the parser's own\n * text and no code; read here, it is `core.request.body_malformed`.\n */\nexport const formBodyReader: MiddlewareHandler = async (context, next) => {\n const contentType = context.req.header(HTTP.Headers.CONTENT_TYPE) ?? '';\n\n if (FORM_CONTENT_TYPES.some((formType) => contentType.includes(formType))) {\n await readFormBody({ req: context.req });\n }\n\n await next();\n};\n"]}
1
+ {"version":3,"file":"form-body.middleware.js","sourceRoot":"","sources":["../../../../../src/base/middlewares/form-body/form-body.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,MAAM,OAAO,kBAAkB;aACL,uBAAkB,GAAG;QAC3C,IAAI,CAAC,YAAY,CAAC,mBAAmB;QACrC,IAAI,CAAC,YAAY,CAAC,2BAA2B;KAC9C,CAAC;IAEF,6EAA6E;IAC7E,MAAM,CAAC,WAAW,CAAC,IAA2C;QAC5D,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,OAAO,CACL,OAAO,KAAK,SAAS;YACrB,kBAAkB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,OAAO,CAAC,CACpF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAgB,EAAE,IAAU;QAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAExE,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC7F,MAAM,eAAe,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC","sourcesContent":["import { HTTP } from '@venizia/ignis-helpers/common';\nimport { FormBodyUtility } from '@venizia/ignis-helpers/core';\nimport type { Context, Next } from 'hono';\n\nexport class FormBodyMiddleware {\n private static readonly FORM_CONTENT_TYPES = [\n HTTP.HeaderValues.MULTIPART_FORM_DATA,\n HTTP.HeaderValues.APPLICATION_FORM_URLENCODED,\n ];\n\n /** Whether a route declares a form body, so its validator will parse one. */\n static hasFormBody(opts: { content?: Record<string, unknown> }): boolean {\n const { content } = opts;\n return (\n content !== undefined &&\n FormBodyMiddleware.FORM_CONTENT_TYPES.some((contentType) => contentType in content)\n );\n }\n\n /**\n * Parses a declared form body just ahead of the route's validator, which reads the cached result.\n * Left to the validator, a malformed body is a bare `HTTPException(400)` carrying the parser's own\n * text and no code; read here, it is `core.request.body_malformed`. Mounted as a Hono middleware\n * handler (`FormBodyMiddleware.read`), so it never reads `this`.\n */\n static async read(context: Context, next: Next): Promise<void> {\n const contentType = context.req.header(HTTP.Headers.CONTENT_TYPE) ?? '';\n\n if (FormBodyMiddleware.FORM_CONTENT_TYPES.some((formType) => contentType.includes(formType))) {\n await FormBodyUtility.readFormBody({ req: context.req });\n }\n\n await next();\n }\n}\n"]}
@@ -17,69 +17,21 @@ export declare const ErrorSchema: z.ZodObject<{
17
17
  details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
18
18
  }, z.core.$strip>;
19
19
  export type TErrorResponse = z.infer<typeof ErrorSchema>;
20
- export declare const idParamsSchema: (opts?: {
21
- idType: TIdSchemaType;
22
- }) => z.ZodObject<{
23
- id: z.ZodNumber;
24
- }, z.core.$strip> | z.ZodObject<{
25
- id: z.ZodString;
26
- }, z.core.$strip>;
27
- export declare const jsonContent: <T extends z.ZodType>(opts: {
28
- schema: T;
29
- description: string;
30
- required?: boolean;
31
- }) => {
32
- description: string;
33
- content: {
34
- 'application/json': {
35
- schema: T;
36
- };
37
- };
38
- required: boolean | undefined;
39
- };
40
- /** The JSON error body of a route, under `4XX` and `5XX` - the range keys OpenAPI accepts. */
41
- export declare const errorResponses: () => {
42
- '4XX': {
43
- description: string;
44
- content: {
45
- 'application/json': {
46
- schema: z.ZodObject<{
47
- statusCode: z.ZodOptional<z.ZodNumber>;
48
- message: z.ZodString;
49
- normalized: z.ZodOptional<z.ZodObject<{
50
- text: z.ZodString;
51
- code: z.ZodString;
52
- args: z.ZodRecord<z.ZodString, z.ZodAny>;
53
- }, z.core.$strip>>;
54
- extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
55
- requestId: z.ZodOptional<z.ZodString>;
56
- details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
57
- }, z.core.$strip>;
58
- };
59
- };
60
- required: boolean | undefined;
61
- };
62
- '5XX': {
63
- description: string;
64
- content: {
65
- 'application/json': {
66
- schema: z.ZodObject<{
67
- statusCode: z.ZodOptional<z.ZodNumber>;
68
- message: z.ZodString;
69
- normalized: z.ZodOptional<z.ZodObject<{
70
- text: z.ZodString;
71
- code: z.ZodString;
72
- args: z.ZodRecord<z.ZodString, z.ZodAny>;
73
- }, z.core.$strip>>;
74
- extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
75
- requestId: z.ZodOptional<z.ZodString>;
76
- details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
77
- }, z.core.$strip>;
78
- };
79
- };
80
- required: boolean | undefined;
81
- };
82
- };
20
+ /** OpenAPI schema builders for the parts of a route that every controller repeats. */
21
+ export declare class OpenApiSchemas {
22
+ static idParams(opts?: {
23
+ idType: TIdSchemaType;
24
+ }): z.ZodObject<{
25
+ id: z.ZodNumber;
26
+ }, z.core.$strip> | z.ZodObject<{
27
+ id: z.ZodString;
28
+ }, z.core.$strip>;
29
+ static requiredString(opts?: {
30
+ min?: number;
31
+ max?: number;
32
+ fixed?: number;
33
+ }): z.ZodString;
34
+ }
83
35
  /** OpenAPI Header Object format */
84
36
  type THeaderObject = {
85
37
  description?: string;
@@ -96,65 +48,192 @@ type TJsonResponseOpts<T extends z.ZodType, H extends TResponseHeaders | undefin
96
48
  required?: boolean;
97
49
  headers?: H;
98
50
  };
99
- export declare const jsonResponse: <ContentSchema extends z.ZodType, HeaderSchema extends TResponseHeaders | undefined = undefined>(opts: TJsonResponseOpts<ContentSchema, HeaderSchema>) => {
100
- '4XX': {
51
+ /** OpenAPI response builders: the JSON and HTML bodies of a route, and the error bodies every route shares. */
52
+ export declare class OpenApiResponses {
53
+ /** Creates HTML content configuration for OpenAPI documentation. */
54
+ static htmlContent(opts: {
55
+ description: string;
56
+ required?: boolean;
57
+ }): {
101
58
  description: string;
102
59
  content: {
103
- 'application/json': {
104
- schema: z.ZodObject<{
105
- statusCode: z.ZodOptional<z.ZodNumber>;
106
- message: z.ZodString;
107
- normalized: z.ZodOptional<z.ZodObject<{
108
- text: z.ZodString;
109
- code: z.ZodString;
110
- args: z.ZodRecord<z.ZodString, z.ZodAny>;
111
- }, z.core.$strip>>;
112
- extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
113
- requestId: z.ZodOptional<z.ZodString>;
114
- details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
115
- }, z.core.$strip>;
60
+ 'text/html': {
61
+ schema: z.ZodString;
116
62
  };
117
63
  };
118
- required: boolean | undefined;
64
+ required: boolean;
119
65
  };
120
- '5XX': {
66
+ /** Creates HTML response configuration for OpenAPI documentation. */
67
+ static htmlResponse(opts: {
121
68
  description: string;
122
- content: {
123
- 'application/json': {
124
- schema: z.ZodObject<{
125
- statusCode: z.ZodOptional<z.ZodNumber>;
126
- message: z.ZodString;
127
- normalized: z.ZodOptional<z.ZodObject<{
128
- text: z.ZodString;
129
- code: z.ZodString;
130
- args: z.ZodRecord<z.ZodString, z.ZodAny>;
131
- }, z.core.$strip>>;
132
- extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
133
- requestId: z.ZodOptional<z.ZodString>;
134
- details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
135
- }, z.core.$strip>;
69
+ required?: boolean;
70
+ }): {
71
+ '4XX': {
72
+ description: string;
73
+ content: {
74
+ 'application/json': {
75
+ schema: z.ZodObject<{
76
+ statusCode: z.ZodOptional<z.ZodNumber>;
77
+ message: z.ZodString;
78
+ normalized: z.ZodOptional<z.ZodObject<{
79
+ text: z.ZodString;
80
+ code: z.ZodString;
81
+ args: z.ZodRecord<z.ZodString, z.ZodAny>;
82
+ }, z.core.$strip>>;
83
+ extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
84
+ requestId: z.ZodOptional<z.ZodString>;
85
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
86
+ }, z.core.$strip>;
87
+ };
136
88
  };
89
+ required: boolean | undefined;
90
+ };
91
+ '5XX': {
92
+ description: string;
93
+ content: {
94
+ 'application/json': {
95
+ schema: z.ZodObject<{
96
+ statusCode: z.ZodOptional<z.ZodNumber>;
97
+ message: z.ZodString;
98
+ normalized: z.ZodOptional<z.ZodObject<{
99
+ text: z.ZodString;
100
+ code: z.ZodString;
101
+ args: z.ZodRecord<z.ZodString, z.ZodAny>;
102
+ }, z.core.$strip>>;
103
+ extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
104
+ requestId: z.ZodOptional<z.ZodString>;
105
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
106
+ }, z.core.$strip>;
107
+ };
108
+ };
109
+ required: boolean | undefined;
110
+ };
111
+ 200: {
112
+ description: string;
113
+ content: {
114
+ 'text/html': {
115
+ schema: z.ZodString;
116
+ };
117
+ };
118
+ required: boolean;
137
119
  };
138
- required: boolean | undefined;
139
120
  };
140
- 200: {
121
+ static jsonContent<T extends z.ZodType>(opts: {
122
+ schema: T;
123
+ description: string;
124
+ required?: boolean;
125
+ }): {
141
126
  description: string;
142
127
  content: {
143
128
  'application/json': {
144
- schema: ContentSchema;
129
+ schema: T;
145
130
  };
146
131
  };
147
132
  required: boolean | undefined;
148
- } | {
149
- headers: NonNullable<HeaderSchema>;
150
- description: string;
151
- content: {
152
- 'application/json': {
153
- schema: ContentSchema;
133
+ };
134
+ /** The JSON error body of a route, under `4XX` and `5XX` - the range keys OpenAPI accepts. */
135
+ static errorResponses(): {
136
+ '4XX': {
137
+ description: string;
138
+ content: {
139
+ 'application/json': {
140
+ schema: z.ZodObject<{
141
+ statusCode: z.ZodOptional<z.ZodNumber>;
142
+ message: z.ZodString;
143
+ normalized: z.ZodOptional<z.ZodObject<{
144
+ text: z.ZodString;
145
+ code: z.ZodString;
146
+ args: z.ZodRecord<z.ZodString, z.ZodAny>;
147
+ }, z.core.$strip>>;
148
+ extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
149
+ requestId: z.ZodOptional<z.ZodString>;
150
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
151
+ }, z.core.$strip>;
152
+ };
154
153
  };
154
+ required: boolean | undefined;
155
+ };
156
+ '5XX': {
157
+ description: string;
158
+ content: {
159
+ 'application/json': {
160
+ schema: z.ZodObject<{
161
+ statusCode: z.ZodOptional<z.ZodNumber>;
162
+ message: z.ZodString;
163
+ normalized: z.ZodOptional<z.ZodObject<{
164
+ text: z.ZodString;
165
+ code: z.ZodString;
166
+ args: z.ZodRecord<z.ZodString, z.ZodAny>;
167
+ }, z.core.$strip>>;
168
+ extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
169
+ requestId: z.ZodOptional<z.ZodString>;
170
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
171
+ }, z.core.$strip>;
172
+ };
173
+ };
174
+ required: boolean | undefined;
155
175
  };
156
- required: boolean | undefined;
157
176
  };
158
- };
177
+ static jsonResponse<ContentSchema extends z.ZodType, HeaderSchema extends TResponseHeaders | undefined = undefined>(opts: TJsonResponseOpts<ContentSchema, HeaderSchema>): {
178
+ '4XX': {
179
+ description: string;
180
+ content: {
181
+ 'application/json': {
182
+ schema: z.ZodObject<{
183
+ statusCode: z.ZodOptional<z.ZodNumber>;
184
+ message: z.ZodString;
185
+ normalized: z.ZodOptional<z.ZodObject<{
186
+ text: z.ZodString;
187
+ code: z.ZodString;
188
+ args: z.ZodRecord<z.ZodString, z.ZodAny>;
189
+ }, z.core.$strip>>;
190
+ extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
191
+ requestId: z.ZodOptional<z.ZodString>;
192
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
193
+ }, z.core.$strip>;
194
+ };
195
+ };
196
+ required: boolean | undefined;
197
+ };
198
+ '5XX': {
199
+ description: string;
200
+ content: {
201
+ 'application/json': {
202
+ schema: z.ZodObject<{
203
+ statusCode: z.ZodOptional<z.ZodNumber>;
204
+ message: z.ZodString;
205
+ normalized: z.ZodOptional<z.ZodObject<{
206
+ text: z.ZodString;
207
+ code: z.ZodString;
208
+ args: z.ZodRecord<z.ZodString, z.ZodAny>;
209
+ }, z.core.$strip>>;
210
+ extra: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
211
+ requestId: z.ZodOptional<z.ZodString>;
212
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
213
+ }, z.core.$strip>;
214
+ };
215
+ };
216
+ required: boolean | undefined;
217
+ };
218
+ 200: {
219
+ description: string;
220
+ content: {
221
+ 'application/json': {
222
+ schema: ContentSchema;
223
+ };
224
+ };
225
+ required: boolean | undefined;
226
+ } | {
227
+ headers: NonNullable<HeaderSchema>;
228
+ description: string;
229
+ content: {
230
+ 'application/json': {
231
+ schema: ContentSchema;
232
+ };
233
+ };
234
+ required: boolean | undefined;
235
+ };
236
+ };
237
+ }
159
238
  export {};
160
239
  //# sourceMappingURL=schemas.d.ts.map