arkos 2.0.0-next.13 → 2.0.0-next.15

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 (134) hide show
  1. package/dist/cjs/app.js +2 -0
  2. package/dist/cjs/app.js.map +1 -1
  3. package/dist/cjs/exports/error-handler/index.js +15 -0
  4. package/dist/cjs/exports/error-handler/index.js.map +1 -1
  5. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  6. package/dist/cjs/modules/base/base.middlewares.js +4 -2
  7. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  8. package/dist/cjs/modules/error-handler/error-handler.controller.js +25 -42
  9. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  10. package/dist/cjs/modules/error-handler/utils/app-error.js +0 -1
  11. package/dist/cjs/modules/error-handler/utils/app-error.js.map +1 -1
  12. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +8 -9
  13. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  14. package/dist/cjs/modules/error-handler/utils/errors.js +158 -0
  15. package/dist/cjs/modules/error-handler/utils/errors.js.map +1 -0
  16. package/dist/cjs/modules/error-handler/utils/multer-error-handler.js +39 -0
  17. package/dist/cjs/modules/error-handler/utils/multer-error-handler.js.map +1 -0
  18. package/dist/cjs/modules/file-upload/file-upload.controller.js +2 -10
  19. package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
  20. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -1
  21. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
  22. package/dist/cjs/types/arkos-prisma-input.js.map +1 -1
  23. package/dist/cjs/types/new-arkos-config.js.map +1 -1
  24. package/dist/cjs/types/router-config.js.map +1 -1
  25. package/dist/cjs/utils/arkos-router/index.js +2 -1
  26. package/dist/cjs/utils/arkos-router/index.js.map +1 -1
  27. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +22 -24
  28. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
  29. package/dist/cjs/utils/cli/build.js +1 -1
  30. package/dist/cjs/utils/cli/build.js.map +1 -1
  31. package/dist/cjs/utils/cli/dev.js +3 -1
  32. package/dist/cjs/utils/cli/dev.js.map +1 -1
  33. package/dist/cjs/utils/cli/generate.js +6 -8
  34. package/dist/cjs/utils/cli/generate.js.map +1 -1
  35. package/dist/cjs/utils/cli/index.js +22 -3
  36. package/dist/cjs/utils/cli/index.js.map +1 -1
  37. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  38. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +19 -7
  39. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
  40. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +3 -5
  41. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
  42. package/dist/cjs/utils/dotenv.helpers.js +0 -6
  43. package/dist/cjs/utils/dotenv.helpers.js.map +1 -1
  44. package/dist/cjs/utils/helpers/arkos-config.helpers.js +17 -0
  45. package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +1 -1
  46. package/dist/cjs/utils/helpers/exit-error.js +1 -0
  47. package/dist/cjs/utils/helpers/exit-error.js.map +1 -1
  48. package/dist/cjs/utils/helpers/prisma.helpers.js +2 -5
  49. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  50. package/dist/cjs/utils/helpers/url-helpers.js +14 -0
  51. package/dist/cjs/utils/helpers/url-helpers.js.map +1 -0
  52. package/dist/cjs/utils/initialize-app.js +7 -5
  53. package/dist/cjs/utils/initialize-app.js.map +1 -1
  54. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +12 -6
  55. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  56. package/dist/cjs/utils/prisma/prisma-schema-parser.js +10 -3
  57. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -1
  58. package/dist/cjs/utils/setup-app.js +8 -8
  59. package/dist/cjs/utils/setup-app.js.map +1 -1
  60. package/dist/esm/app.js +2 -0
  61. package/dist/esm/app.js.map +1 -1
  62. package/dist/esm/exports/error-handler/index.js +1 -0
  63. package/dist/esm/exports/error-handler/index.js.map +1 -1
  64. package/dist/esm/modules/auth/auth.router.js.map +1 -1
  65. package/dist/esm/modules/base/base.middlewares.js +4 -2
  66. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  67. package/dist/esm/modules/error-handler/error-handler.controller.js +22 -42
  68. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
  69. package/dist/esm/modules/error-handler/utils/app-error.js +0 -1
  70. package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
  71. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +8 -9
  72. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  73. package/dist/esm/modules/error-handler/utils/errors.js +127 -0
  74. package/dist/esm/modules/error-handler/utils/errors.js.map +1 -0
  75. package/dist/esm/modules/error-handler/utils/multer-error-handler.js +34 -0
  76. package/dist/esm/modules/error-handler/utils/multer-error-handler.js.map +1 -0
  77. package/dist/esm/modules/file-upload/file-upload.controller.js +2 -10
  78. package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
  79. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -1
  80. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
  81. package/dist/esm/types/arkos-prisma-input.js.map +1 -1
  82. package/dist/esm/types/new-arkos-config.js.map +1 -1
  83. package/dist/esm/types/router-config.js.map +1 -1
  84. package/dist/esm/utils/arkos-router/index.js +2 -1
  85. package/dist/esm/utils/arkos-router/index.js.map +1 -1
  86. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +22 -24
  87. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
  88. package/dist/esm/utils/cli/build.js +1 -1
  89. package/dist/esm/utils/cli/build.js.map +1 -1
  90. package/dist/esm/utils/cli/dev.js +3 -1
  91. package/dist/esm/utils/cli/dev.js.map +1 -1
  92. package/dist/esm/utils/cli/generate.js +6 -8
  93. package/dist/esm/utils/cli/generate.js.map +1 -1
  94. package/dist/esm/utils/cli/index.js +22 -3
  95. package/dist/esm/utils/cli/index.js.map +1 -1
  96. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  97. package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +16 -7
  98. package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
  99. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +3 -5
  100. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
  101. package/dist/esm/utils/dotenv.helpers.js +0 -6
  102. package/dist/esm/utils/dotenv.helpers.js.map +1 -1
  103. package/dist/esm/utils/helpers/arkos-config.helpers.js +15 -0
  104. package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
  105. package/dist/esm/utils/helpers/exit-error.js +1 -0
  106. package/dist/esm/utils/helpers/exit-error.js.map +1 -1
  107. package/dist/esm/utils/helpers/prisma.helpers.js +2 -5
  108. package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
  109. package/dist/esm/utils/helpers/url-helpers.js +11 -0
  110. package/dist/esm/utils/helpers/url-helpers.js.map +1 -0
  111. package/dist/esm/utils/initialize-app.js +7 -5
  112. package/dist/esm/utils/initialize-app.js.map +1 -1
  113. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +12 -6
  114. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  115. package/dist/esm/utils/prisma/prisma-schema-parser.js +10 -3
  116. package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
  117. package/dist/esm/utils/setup-app.js +8 -8
  118. package/dist/esm/utils/setup-app.js.map +1 -1
  119. package/dist/types/exports/error-handler/index.d.ts +1 -0
  120. package/dist/types/modules/error-handler/utils/app-error.d.ts +0 -2
  121. package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +1 -1
  122. package/dist/types/modules/error-handler/utils/errors.d.ts +176 -0
  123. package/dist/types/modules/error-handler/utils/multer-error-handler.d.ts +7 -0
  124. package/dist/types/modules/file-upload/file-upload.controller.d.ts +0 -1
  125. package/dist/types/types/arkos-prisma-input.d.ts +3 -2
  126. package/dist/types/types/new-arkos-config.d.ts +23 -0
  127. package/dist/types/types/router-config.d.ts +1 -1
  128. package/dist/types/utils/arkos-router/index.d.ts +1 -1
  129. package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +1 -1
  130. package/dist/types/utils/cli/generate.d.ts +0 -1
  131. package/dist/types/utils/helpers/arkos-config.helpers.d.ts +2 -0
  132. package/dist/types/utils/helpers/url-helpers.d.ts +1 -0
  133. package/dist/types/utils/prisma/prisma-schema-parser.d.ts +1 -0
  134. package/package.json +1 -1
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GatewayTimeoutError = exports.ServiceUnavailableError = exports.BadGatewayError = exports.NotImplementedError = exports.InternalServerError = exports.TooManyRequestsError = exports.UnprocessableContentError = exports.ImATeapotError = exports.ExpectationFailedError = exports.RangeNotSatisfiableError = exports.UnsupportedMediaTypeError = exports.UriTooLongError = exports.PayloadTooLargeError = exports.PreconditionFailedError = exports.LengthRequiredError = exports.GoneError = exports.ConflictError = exports.RequestTimeoutError = exports.NotAcceptableError = exports.MethodNotAllowedError = exports.NotFoundError = exports.ForbiddenError = exports.PaymentRequiredError = exports.UnauthorizedError = exports.BadRequestError = void 0;
7
+ const app_error_1 = __importDefault(require("./app-error.js"));
8
+ class BadRequestError extends app_error_1.default {
9
+ constructor(message = "Bad Request", code = "BadRequest", meta) {
10
+ super(message, 400, code, meta);
11
+ }
12
+ }
13
+ exports.BadRequestError = BadRequestError;
14
+ class UnauthorizedError extends app_error_1.default {
15
+ constructor(message = "Unauthorized", code = "Unauthorized", meta) {
16
+ super(message, 401, code, meta);
17
+ }
18
+ }
19
+ exports.UnauthorizedError = UnauthorizedError;
20
+ class PaymentRequiredError extends app_error_1.default {
21
+ constructor(message = "Payment Required", code = "PaymentRequired", meta) {
22
+ super(message, 402, code, meta);
23
+ }
24
+ }
25
+ exports.PaymentRequiredError = PaymentRequiredError;
26
+ class ForbiddenError extends app_error_1.default {
27
+ constructor(message = "Forbidden", code = "Forbidden", meta) {
28
+ super(message, 403, code, meta);
29
+ }
30
+ }
31
+ exports.ForbiddenError = ForbiddenError;
32
+ class NotFoundError extends app_error_1.default {
33
+ constructor(message = "Not Found", code = "NotFound", meta) {
34
+ super(message, 404, code, meta);
35
+ }
36
+ }
37
+ exports.NotFoundError = NotFoundError;
38
+ class MethodNotAllowedError extends app_error_1.default {
39
+ constructor(message = "Method Not Allowed", code = "MethodNotAllowed", meta) {
40
+ super(message, 405, code, meta);
41
+ }
42
+ }
43
+ exports.MethodNotAllowedError = MethodNotAllowedError;
44
+ class NotAcceptableError extends app_error_1.default {
45
+ constructor(message = "Not Acceptable", code = "NotAcceptable", meta) {
46
+ super(message, 406, code, meta);
47
+ }
48
+ }
49
+ exports.NotAcceptableError = NotAcceptableError;
50
+ class RequestTimeoutError extends app_error_1.default {
51
+ constructor(message = "Request Timeout", code = "RequestTimeout", meta) {
52
+ super(message, 408, code, meta);
53
+ }
54
+ }
55
+ exports.RequestTimeoutError = RequestTimeoutError;
56
+ class ConflictError extends app_error_1.default {
57
+ constructor(message = "Conflict", code = "Conflict", meta) {
58
+ super(message, 409, code, meta);
59
+ }
60
+ }
61
+ exports.ConflictError = ConflictError;
62
+ class GoneError extends app_error_1.default {
63
+ constructor(message = "Gone", code = "Gone", meta) {
64
+ super(message, 410, code, meta);
65
+ }
66
+ }
67
+ exports.GoneError = GoneError;
68
+ class LengthRequiredError extends app_error_1.default {
69
+ constructor(message = "Length Required", code = "LengthRequired", meta) {
70
+ super(message, 411, code, meta);
71
+ }
72
+ }
73
+ exports.LengthRequiredError = LengthRequiredError;
74
+ class PreconditionFailedError extends app_error_1.default {
75
+ constructor(message = "Precondition Failed", code = "PreconditionFailed", meta) {
76
+ super(message, 412, code, meta);
77
+ }
78
+ }
79
+ exports.PreconditionFailedError = PreconditionFailedError;
80
+ class PayloadTooLargeError extends app_error_1.default {
81
+ constructor(message = "Payload Too Large", code = "PayloadTooLarge", meta) {
82
+ super(message, 413, code, meta);
83
+ }
84
+ }
85
+ exports.PayloadTooLargeError = PayloadTooLargeError;
86
+ class UriTooLongError extends app_error_1.default {
87
+ constructor(message = "URI Too Long", code = "UriTooLong", meta) {
88
+ super(message, 414, code, meta);
89
+ }
90
+ }
91
+ exports.UriTooLongError = UriTooLongError;
92
+ class UnsupportedMediaTypeError extends app_error_1.default {
93
+ constructor(message = "Unsupported Media Type", code = "UnsupportedMediaType", meta) {
94
+ super(message, 415, code, meta);
95
+ }
96
+ }
97
+ exports.UnsupportedMediaTypeError = UnsupportedMediaTypeError;
98
+ class RangeNotSatisfiableError extends app_error_1.default {
99
+ constructor(message = "Range Not Satisfiable", code = "RangeNotSatisfiable", meta) {
100
+ super(message, 416, code, meta);
101
+ }
102
+ }
103
+ exports.RangeNotSatisfiableError = RangeNotSatisfiableError;
104
+ class ExpectationFailedError extends app_error_1.default {
105
+ constructor(message = "Expectation Failed", code = "ExpectationFailed", meta) {
106
+ super(message, 417, code, meta);
107
+ }
108
+ }
109
+ exports.ExpectationFailedError = ExpectationFailedError;
110
+ class ImATeapotError extends app_error_1.default {
111
+ constructor(message = "I'm a teapot", code = "ImATeapot", meta) {
112
+ super(message, 418, code, meta);
113
+ }
114
+ }
115
+ exports.ImATeapotError = ImATeapotError;
116
+ class UnprocessableContentError extends app_error_1.default {
117
+ constructor(message = "Unprocessable Content", code = "UnprocessableContent", meta) {
118
+ super(message, 422, code, meta);
119
+ }
120
+ }
121
+ exports.UnprocessableContentError = UnprocessableContentError;
122
+ class TooManyRequestsError extends app_error_1.default {
123
+ constructor(message = "Too Many Requests", code = "TooManyRequests", meta) {
124
+ super(message, 429, code, meta);
125
+ }
126
+ }
127
+ exports.TooManyRequestsError = TooManyRequestsError;
128
+ class InternalServerError extends app_error_1.default {
129
+ constructor(message = "Internal Server Error", code = "InternalServer", meta) {
130
+ super(message, 500, code, meta);
131
+ }
132
+ }
133
+ exports.InternalServerError = InternalServerError;
134
+ class NotImplementedError extends app_error_1.default {
135
+ constructor(message = "Not Implemented", code = "NotImplemented", meta) {
136
+ super(message, 501, code, meta);
137
+ }
138
+ }
139
+ exports.NotImplementedError = NotImplementedError;
140
+ class BadGatewayError extends app_error_1.default {
141
+ constructor(message = "Bad Gateway", code = "BadGateway", meta) {
142
+ super(message, 502, code, meta);
143
+ }
144
+ }
145
+ exports.BadGatewayError = BadGatewayError;
146
+ class ServiceUnavailableError extends app_error_1.default {
147
+ constructor(message = "Service Unavailable", code = "ServiceUnavailable", meta) {
148
+ super(message, 503, code, meta);
149
+ }
150
+ }
151
+ exports.ServiceUnavailableError = ServiceUnavailableError;
152
+ class GatewayTimeoutError extends app_error_1.default {
153
+ constructor(message = "Gateway Timeout", code = "GatewayTimeout", meta) {
154
+ super(message, 504, code, meta);
155
+ }
156
+ }
157
+ exports.GatewayTimeoutError = GatewayTimeoutError;
158
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import AppError from \"./app-error\";\n\n/**\n * 400 - Bad Request\n * @example throw new BadRequestError(\"Invalid input\", \"InvalidInput\", { field: \"email\" })\n */\nexport class BadRequestError extends AppError {\n constructor(\n message = \"Bad Request\",\n code = \"BadRequest\",\n meta?: Record<string, any>\n ) {\n super(message, 400, code, meta);\n }\n}\n\n/**\n * 401 - Unauthorized\n * @example throw new UnauthorizedError(\"Invalid token\", \"InvalidToken\")\n */\nexport class UnauthorizedError extends AppError {\n constructor(\n message = \"Unauthorized\",\n code = \"Unauthorized\",\n meta?: Record<string, any>\n ) {\n super(message, 401, code, meta);\n }\n}\n\n/**\n * 402 - Payment Required\n * @example throw new PaymentRequiredError(\"Subscription expired\", \"PaymentRequired\")\n */\nexport class PaymentRequiredError extends AppError {\n constructor(\n message = \"Payment Required\",\n code = \"PaymentRequired\",\n meta?: Record<string, any>\n ) {\n super(message, 402, code, meta);\n }\n}\n\n/**\n * 403 - Forbidden\n * @example throw new ForbiddenError(\"Access denied\", \"Forbidden\", { resource: \"admin\" })\n */\nexport class ForbiddenError extends AppError {\n constructor(\n message = \"Forbidden\",\n code = \"Forbidden\",\n meta?: Record<string, any>\n ) {\n super(message, 403, code, meta);\n }\n}\n\n/**\n * 404 - Not Found\n * @example throw new NotFoundError(\"User not found\", \"NotFound\", { id: 123 })\n */\nexport class NotFoundError extends AppError {\n constructor(\n message = \"Not Found\",\n code = \"NotFound\",\n meta?: Record<string, any>\n ) {\n super(message, 404, code, meta);\n }\n}\n\n/**\n * 405 - Method Not Allowed\n * @example throw new MethodNotAllowedError(\"POST not allowed\", \"MethodNotAllowed\")\n */\nexport class MethodNotAllowedError extends AppError {\n constructor(\n message = \"Method Not Allowed\",\n code = \"MethodNotAllowed\",\n meta?: Record<string, any>\n ) {\n super(message, 405, code, meta);\n }\n}\n\n/**\n * 406 - Not Acceptable\n * @example throw new NotAcceptableError(\"Unsupported format\", \"NotAcceptable\")\n */\nexport class NotAcceptableError extends AppError {\n constructor(\n message = \"Not Acceptable\",\n code = \"NotAcceptable\",\n meta?: Record<string, any>\n ) {\n super(message, 406, code, meta);\n }\n}\n\n/**\n * 408 - Request Timeout\n * @example throw new RequestTimeoutError(\"Upload took too long\", \"RequestTimeout\")\n */\nexport class RequestTimeoutError extends AppError {\n constructor(\n message = \"Request Timeout\",\n code = \"RequestTimeout\",\n meta?: Record<string, any>\n ) {\n super(message, 408, code, meta);\n }\n}\n\n/**\n * 409 - Conflict\n * @example throw new ConflictError(\"Duplicate entry\", \"Conflict\", { field: \"email\" })\n */\nexport class ConflictError extends AppError {\n constructor(\n message = \"Conflict\",\n code = \"Conflict\",\n meta?: Record<string, any>\n ) {\n super(message, 409, code, meta);\n }\n}\n\n/**\n * 410 - Gone\n * @example throw new GoneError(\"Resource deleted\", \"Gone\")\n */\nexport class GoneError extends AppError {\n constructor(message = \"Gone\", code = \"Gone\", meta?: Record<string, any>) {\n super(message, 410, code, meta);\n }\n}\n\n/**\n * 411 - Length Required\n * @example throw new LengthRequiredError(\"Content-Length missing\", \"LengthRequired\")\n */\nexport class LengthRequiredError extends AppError {\n constructor(\n message = \"Length Required\",\n code = \"LengthRequired\",\n meta?: Record<string, any>\n ) {\n super(message, 411, code, meta);\n }\n}\n\n/**\n * 412 - Precondition Failed\n * @example throw new PreconditionFailedError(\"ETag mismatch\", \"PreconditionFailed\")\n */\nexport class PreconditionFailedError extends AppError {\n constructor(\n message = \"Precondition Failed\",\n code = \"PreconditionFailed\",\n meta?: Record<string, any>\n ) {\n super(message, 412, code, meta);\n }\n}\n\n/**\n * 413 - Payload Too Large\n * @example throw new PayloadTooLargeError(\"File exceeds 10MB\", \"PayloadTooLarge\", { max: \"10MB\" })\n */\nexport class PayloadTooLargeError extends AppError {\n constructor(\n message = \"Payload Too Large\",\n code = \"PayloadTooLarge\",\n meta?: Record<string, any>\n ) {\n super(message, 413, code, meta);\n }\n}\n\n/**\n * 414 - URI Too Long\n * @example throw new UriTooLongError(\"Query string too long\", \"UriTooLong\")\n */\nexport class UriTooLongError extends AppError {\n constructor(\n message = \"URI Too Long\",\n code = \"UriTooLong\",\n meta?: Record<string, any>\n ) {\n super(message, 414, code, meta);\n }\n}\n\n/**\n * 415 - Unsupported Media Type\n * @example throw new UnsupportedMediaTypeError(\"Expected JSON\", \"UnsupportedMediaType\")\n */\nexport class UnsupportedMediaTypeError extends AppError {\n constructor(\n message = \"Unsupported Media Type\",\n code = \"UnsupportedMediaType\",\n meta?: Record<string, any>\n ) {\n super(message, 415, code, meta);\n }\n}\n\n/**\n * 416 - Range Not Satisfiable\n * @example throw new RangeNotSatisfiableError(\"Invalid byte range\", \"RangeNotSatisfiable\")\n */\nexport class RangeNotSatisfiableError extends AppError {\n constructor(\n message = \"Range Not Satisfiable\",\n code = \"RangeNotSatisfiable\",\n meta?: Record<string, any>\n ) {\n super(message, 416, code, meta);\n }\n}\n\n/**\n * 417 - Expectation Failed\n * @example throw new ExpectationFailedError(\"Expect header failed\", \"ExpectationFailed\")\n */\nexport class ExpectationFailedError extends AppError {\n constructor(\n message = \"Expectation Failed\",\n code = \"ExpectationFailed\",\n meta?: Record<string, any>\n ) {\n super(message, 417, code, meta);\n }\n}\n\n/**\n * 418 - I'm a teapot\n * @example throw new ImATeapotError(\"Cannot brew coffee\", \"ImATeapot\")\n */\nexport class ImATeapotError extends AppError {\n constructor(\n message = \"I'm a teapot\",\n code = \"ImATeapot\",\n meta?: Record<string, any>\n ) {\n super(message, 418, code, meta);\n }\n}\n\n/**\n * 422 - Unprocessable Content\n * @example throw new UnprocessableContentError(\"Validation failed\", \"ValidationFailed\", { errors: [...] })\n */\nexport class UnprocessableContentError extends AppError {\n constructor(\n message = \"Unprocessable Content\",\n code = \"UnprocessableContent\",\n meta?: Record<string, any>\n ) {\n super(message, 422, code, meta);\n }\n}\n\n/**\n * 429 - Too Many Requests\n * @example throw new TooManyRequestsError(\"Rate limit exceeded\", \"RateLimitExceeded\", { retryAfter: 60 })\n */\nexport class TooManyRequestsError extends AppError {\n constructor(\n message = \"Too Many Requests\",\n code = \"TooManyRequests\",\n meta?: Record<string, any>\n ) {\n super(message, 429, code, meta);\n }\n}\n\n/**\n * 500 - Internal Server Error\n * @example throw new InternalServerError(\"Database connection failed\", \"DatabaseError\")\n */\nexport class InternalServerError extends AppError {\n constructor(\n message = \"Internal Server Error\",\n code = \"InternalServer\",\n meta?: Record<string, any>\n ) {\n super(message, 500, code, meta);\n }\n}\n\n/**\n * 501 - Not Implemented\n * @example throw new NotImplementedError(\"Feature coming soon\", \"NotImplemented\")\n */\nexport class NotImplementedError extends AppError {\n constructor(\n message = \"Not Implemented\",\n code = \"NotImplemented\",\n meta?: Record<string, any>\n ) {\n super(message, 501, code, meta);\n }\n}\n\n/**\n * 502 - Bad Gateway\n * @example throw new BadGatewayError(\"Upstream timeout\", \"BadGateway\")\n */\nexport class BadGatewayError extends AppError {\n constructor(\n message = \"Bad Gateway\",\n code = \"BadGateway\",\n meta?: Record<string, any>\n ) {\n super(message, 502, code, meta);\n }\n}\n\n/**\n * 503 - Service Unavailable\n * @example throw new ServiceUnavailableError(\"Maintenance mode\", \"ServiceUnavailable\", { retryAfter: 300 })\n */\nexport class ServiceUnavailableError extends AppError {\n constructor(\n message = \"Service Unavailable\",\n code = \"ServiceUnavailable\",\n meta?: Record<string, any>\n ) {\n super(message, 503, code, meta);\n }\n}\n\n/**\n * 504 - Gateway Timeout\n * @example throw new GatewayTimeoutError(\"Upstream timeout\", \"GatewayTimeout\")\n */\nexport class GatewayTimeoutError extends AppError {\n constructor(\n message = \"Gateway Timeout\",\n code = \"GatewayTimeout\",\n meta?: Record<string, any>\n ) {\n super(message, 504, code, meta);\n }\n}\n"]}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const app_error_1 = __importDefault(require("./app-error.js"));
7
+ class MulterErrorHandler {
8
+ handle(err) {
9
+ switch (err.code) {
10
+ case "LIMIT_UNEXPECTED_FILE":
11
+ return new app_error_1.default(`Unexpected file field '${err.field}'`, 400, "UnexpectedFileField", {
12
+ hint: "Ensure the field name matches the expected upload configuration",
13
+ });
14
+ case "LIMIT_FILE_SIZE":
15
+ return new app_error_1.default(`File in field '${err.field}' exceeds the maximum allowed size`, 413, "FileTooLarge", {
16
+ hint: "Upload a smaller file or contact the server administrator to increase the limit",
17
+ });
18
+ case "LIMIT_FILE_COUNT":
19
+ return new app_error_1.default(`Too many files uploaded`, 400, "TooManyFiles", {
20
+ hint: "Reduce the number of files and try again",
21
+ });
22
+ case "LIMIT_FIELD_COUNT":
23
+ return new app_error_1.default(`Too many fields in the request`, 400, "TooManyFields", { hint: "Reduce the number of form fields and try again" });
24
+ case "LIMIT_PART_COUNT":
25
+ return new app_error_1.default(`Too many parts in the multipart request`, 400, "TooManyParts", { hint: "Reduce the number of parts in your multipart request" });
26
+ case "LIMIT_FIELD_KEY":
27
+ return new app_error_1.default(`A field name in the request is too long`, 400, "FieldNameTooLong", { hint: "Shorten your form field names" });
28
+ case "LIMIT_FIELD_VALUE":
29
+ return new app_error_1.default(`Value of field '${err.field}' is too long`, 400, "FieldValueTooLong", { hint: "Shorten the value and try again" });
30
+ case "MISSING_FIELD_NAME":
31
+ return new app_error_1.default(`A file was uploaded without a field name`, 400, "MissingFieldName", { hint: "Ensure all file inputs have a valid field name" });
32
+ default:
33
+ return new app_error_1.default(`An unexpected file upload error occurred`, 500, "FileUploadError");
34
+ }
35
+ }
36
+ }
37
+ const multerErrorHandler = new MulterErrorHandler();
38
+ exports.default = multerErrorHandler;
39
+ //# sourceMappingURL=multer-error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multer-error-handler.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/multer-error-handler.ts"],"names":[],"mappings":";;;;;AACA,4DAAmC;AAEnC,MAAM,kBAAkB;IACtB,MAAM,CAAC,GAAuB;QAC5B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,uBAAuB;gBAC1B,OAAO,IAAI,mBAAQ,CACjB,0BAA0B,GAAG,CAAC,KAAK,GAAG,EACtC,GAAG,EACH,qBAAqB,EACrB;oBACE,IAAI,EAAE,iEAAiE;iBACxE,CACF,CAAC;YACJ,KAAK,iBAAiB;gBACpB,OAAO,IAAI,mBAAQ,CACjB,kBAAkB,GAAG,CAAC,KAAK,oCAAoC,EAC/D,GAAG,EACH,cAAc,EACd;oBACE,IAAI,EAAE,iFAAiF;iBACxF,CACF,CAAC;YACJ,KAAK,kBAAkB;gBACrB,OAAO,IAAI,mBAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE,cAAc,EAAE;oBAClE,IAAI,EAAE,0CAA0C;iBACjD,CAAC,CAAC;YACL,KAAK,mBAAmB;gBACtB,OAAO,IAAI,mBAAQ,CACjB,gCAAgC,EAChC,GAAG,EACH,eAAe,EACf,EAAE,IAAI,EAAE,gDAAgD,EAAE,CAC3D,CAAC;YACJ,KAAK,kBAAkB;gBACrB,OAAO,IAAI,mBAAQ,CACjB,yCAAyC,EACzC,GAAG,EACH,cAAc,EACd,EAAE,IAAI,EAAE,sDAAsD,EAAE,CACjE,CAAC;YACJ,KAAK,iBAAiB;gBACpB,OAAO,IAAI,mBAAQ,CACjB,yCAAyC,EACzC,GAAG,EACH,kBAAkB,EAClB,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAC1C,CAAC;YACJ,KAAK,mBAAmB;gBACtB,OAAO,IAAI,mBAAQ,CACjB,mBAAmB,GAAG,CAAC,KAAK,eAAe,EAC3C,GAAG,EACH,mBAAmB,EACnB,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAC5C,CAAC;YACJ,KAAK,oBAAoB;gBACvB,OAAO,IAAI,mBAAQ,CACjB,0CAA0C,EAC1C,GAAG,EACH,kBAAkB,EAClB,EAAE,IAAI,EAAE,gDAAgD,EAAE,CAC3D,CAAC;YACJ;gBACE,OAAO,IAAI,mBAAQ,CACjB,0CAA0C,EAC1C,GAAG,EACH,iBAAiB,CAClB,CAAC;QACN,CAAC;IACH,CAAC;CACF;AAED,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC;AAEpD,kBAAe,kBAAkB,CAAC","sourcesContent":["import multer from \"multer\";\nimport AppError from \"./app-error\";\n\nclass MulterErrorHandler {\n handle(err: multer.MulterError): AppError {\n switch (err.code) {\n case \"LIMIT_UNEXPECTED_FILE\":\n return new AppError(\n `Unexpected file field '${err.field}'`,\n 400,\n \"UnexpectedFileField\",\n {\n hint: \"Ensure the field name matches the expected upload configuration\",\n }\n );\n case \"LIMIT_FILE_SIZE\":\n return new AppError(\n `File in field '${err.field}' exceeds the maximum allowed size`,\n 413,\n \"FileTooLarge\",\n {\n hint: \"Upload a smaller file or contact the server administrator to increase the limit\",\n }\n );\n case \"LIMIT_FILE_COUNT\":\n return new AppError(`Too many files uploaded`, 400, \"TooManyFiles\", {\n hint: \"Reduce the number of files and try again\",\n });\n case \"LIMIT_FIELD_COUNT\":\n return new AppError(\n `Too many fields in the request`,\n 400,\n \"TooManyFields\",\n { hint: \"Reduce the number of form fields and try again\" }\n );\n case \"LIMIT_PART_COUNT\":\n return new AppError(\n `Too many parts in the multipart request`,\n 400,\n \"TooManyParts\",\n { hint: \"Reduce the number of parts in your multipart request\" }\n );\n case \"LIMIT_FIELD_KEY\":\n return new AppError(\n `A field name in the request is too long`,\n 400,\n \"FieldNameTooLong\",\n { hint: \"Shorten your form field names\" }\n );\n case \"LIMIT_FIELD_VALUE\":\n return new AppError(\n `Value of field '${err.field}' is too long`,\n 400,\n \"FieldValueTooLong\",\n { hint: \"Shorten the value and try again\" }\n );\n case \"MISSING_FIELD_NAME\":\n return new AppError(\n `A file was uploaded without a field name`,\n 400,\n \"MissingFieldName\",\n { hint: \"Ensure all file inputs have a valid field name\" }\n );\n default:\n return new AppError(\n `An unexpected file upload error occurred`,\n 500,\n \"FileUploadError\"\n );\n }\n }\n}\n\nconst multerErrorHandler = new MulterErrorHandler();\n\nexport default multerErrorHandler;\n"]}
@@ -11,8 +11,6 @@ const fs_1 = __importDefault(require("fs"));
11
11
  const catch_async_1 = __importDefault(require("../error-handler/utils/catch-async.js"));
12
12
  const server_1 = require("../../server.js");
13
13
  const file_upload_helpers_1 = require("./utils/helpers/file-upload.helpers.js");
14
- const multer_1 = require("multer");
15
- const utils_1 = require("../../exports/utils/index.js");
16
14
  const arkos_loadable_registry_1 = __importDefault(require("../../components/arkos-loadable-registry/index.js"));
17
15
  const reader_1 = require("../../components/arkos-route-hook/reader.js");
18
16
  class FileUploadController {
@@ -50,7 +48,7 @@ class FileUploadController {
50
48
  }
51
49
  uploader.handleMultipleUpload()(req, res, async (err) => {
52
50
  if (err)
53
- return this.handleUploadError(err, next);
51
+ throw err;
54
52
  let data;
55
53
  if (req.files && Array.isArray(req.files) && req.files.length > 0) {
56
54
  if (fileType === "images") {
@@ -170,7 +168,7 @@ class FileUploadController {
170
168
  }
171
169
  uploader.handleMultipleUpload()(req, res, async (err) => {
172
170
  if (err)
173
- return this.handleUploadError(err, next);
171
+ throw err;
174
172
  if (!req.file &&
175
173
  (!req.files || !Array.isArray(req.files) || req.files.length === 0))
176
174
  return next(new app_error_1.default("No new file uploaded", 400, "MissingNewFile"));
@@ -234,12 +232,6 @@ class FileUploadController {
234
232
  });
235
233
  });
236
234
  }
237
- handleUploadError(err, next) {
238
- if (err instanceof multer_1.MulterError)
239
- return next(new app_error_1.default(err.message, 400, (0, utils_1.pascalCase)(err.code || "FileUploadError")));
240
- else
241
- return next(err);
242
- }
243
235
  getRouteHook() {
244
236
  return arkos_loadable_registry_1.default.getItem("ArkosRouteHook", "file-upload");
245
237
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload.controller.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import AppError from \"../error-handler/utils/app-error\";\nimport {\n FileUploadService,\n getFileUploadServices,\n} from \"./file-upload.service\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport { getArkosConfig } from \"../../server\";\nimport { processFile, processImage } from \"./utils/helpers/file-upload.helpers\";\nimport { ArkosNextFunction, ArkosRequest, ArkosResponse } from \"../../types\";\nimport { MulterError } from \"multer\";\nimport { pascalCase } from \"../../exports/utils\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport { routeHookReader } from \"../../components/arkos-route-hook/reader\";\n\n/**\n * Handles file uploads and allows to be extended via route hooks.\n */\nexport class FileUploadController {\n private handleUploadError(err: any, next: ArkosNextFunction) {\n if (err instanceof MulterError)\n return next(\n new AppError(\n err.message,\n 400,\n pascalCase(err.code || \"FileUploadError\")\n )\n );\n else return next(err);\n }\n\n private getRouteHook() {\n return loadableRegistry.getItem(\"ArkosRouteHook\", \"file-upload\");\n }\n\n private getAfterHook(operation: string) {\n const hook = this.getRouteHook();\n if (!hook) return null;\n return (\n routeHookReader.getHooks(\"file-upload\", operation as any)?.after ?? null\n );\n }\n\n /**\n * Handles file upload requests, processes images if needed, and returns URLs.\n *\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n uploadFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const { fileType } = req.params;\n const { format, width, height, resizeTo } = req.query;\n const options = { format, width, height, resizeTo };\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n const uploadPath = path.resolve(\n path.join(process.cwd(), baseUploadDir, fileType)\n );\n try {\n await fs.promises.access(uploadPath);\n } catch {\n await fs.promises.mkdir(uploadPath, { recursive: true });\n }\n\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(\n new AppError(\"Invalid file type\", 400, \"InvalidFileType\")\n );\n }\n\n uploader.handleMultipleUpload()(req, res, async (err) => {\n if (err) return this.handleUploadError(err, next);\n\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n if (fileType === \"images\") {\n data = await Promise.all(\n req.files.map((file) =>\n processImage(req, next, file.path, options)\n )\n );\n } else {\n data = req.files.map((file) => processFile(req, file.path));\n }\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n if (fileType === \"images\") {\n data = await processImage(req, next, req.file.path, options);\n } else {\n data = processFile(req, req.file.path);\n }\n } else {\n return next(\n new AppError(\n `No file or files were attached on field ${fileType} on the request body as form data.`,\n 400,\n \"NoFileOrFilesAttached\"\n )\n );\n }\n\n const jsonContent = {\n success: true,\n data,\n message: Array.isArray(data)\n ? `${data.length} files uploaded successfully`\n : \"File uploaded successfully\",\n };\n\n const afterHook = this.getAfterHook(\"uploadFile\");\n if (afterHook) {\n (res as any).originalData = jsonContent;\n req.responseData = jsonContent;\n res.locals.data = jsonContent;\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json(jsonContent);\n });\n }\n );\n\n /**\n * Handles file deletion requests.\n *\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n deleteFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const { fileType, fileName } = req.params;\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(\n new AppError(\"Invalid file type\", 400, \"InvalidFileType\")\n );\n }\n\n try {\n const { fileUpload } = getArkosConfig();\n const baseUploadRoute = fileUpload?.baseRoute || \"/api/uploads\";\n\n const urlPattern = new RegExp(\n `${baseUploadRoute}/${fileType}/${fileName}`\n );\n\n const isExpectedUrlPattern = urlPattern.test(req.originalUrl);\n\n if (isExpectedUrlPattern) {\n const fullUrl = `${req.protocol}://${req.get(\"host\")}${req.originalUrl}`;\n await uploader.deleteFileByUrl(fullUrl);\n } else {\n await uploader.deleteFileByName(fileName, fileType);\n }\n\n const afterHook = this.getAfterHook(\"deleteFile\");\n if (afterHook) {\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).json();\n } catch (error) {\n if (error instanceof AppError) return next(error);\n return next(new AppError(\"File not found\", 404, \"FileNotFound\"));\n }\n }\n );\n\n /**\n * Handles file update requests by deleting the old file and uploading a new one.\n *\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n updateFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const { fileType, fileName } = req.params;\n const { format, width, height, resizeTo } = req.query;\n const options = { format, width, height, resizeTo };\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n const uploadPath = path.resolve(\n path.join(process.cwd(), baseUploadDir, fileType)\n );\n try {\n await fs.promises.access(uploadPath);\n } catch {\n await fs.promises.mkdir(uploadPath, { recursive: true });\n }\n\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(\n new AppError(\"Invalid file type\", 400, \"InvalidFileType\")\n );\n }\n\n uploader.handleMultipleUpload()(req, res, async (err) => {\n if (err) return this.handleUploadError(err, next);\n\n if (\n !req.file &&\n (!req.files || !Array.isArray(req.files) || req.files.length === 0)\n )\n return next(\n new AppError(\"No new file uploaded\", 400, \"MissingNewFile\")\n );\n\n if (fileName && fileName.trim() !== \"\") {\n try {\n const baseUploadRoute = fileUpload?.baseRoute || \"/api/uploads\";\n const urlPattern = new RegExp(\n `${baseUploadRoute}/${fileType}/${fileName}`\n );\n const isExpectedUrlPattern = urlPattern.test(req.originalUrl);\n\n if (isExpectedUrlPattern) {\n const oldFileUrl = `${req.protocol}://${req.get(\"host\")}${req.originalUrl}`;\n await uploader.deleteFileByUrl(oldFileUrl);\n } else {\n await uploader.deleteFileByName(fileName, fileType);\n }\n } catch (error) {\n console.warn(`Could not delete old file: ${fileName}`, error);\n }\n }\n\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n if (fileType === \"images\") {\n data = await Promise.all(\n req.files.map((file) =>\n processImage(req, next, file.path, options)\n )\n );\n } else {\n data = req.files.map((file) => processFile(req, file.path));\n }\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n if (fileType === \"images\") {\n data = await processImage(req, next, req.file.path, options);\n } else {\n data = processFile(req, req.file.path);\n }\n }\n\n const jsonContent = {\n success: true,\n data,\n message: Array.isArray(data)\n ? fileName && fileName.trim() !== \"\"\n ? `File updated successfully. ${data.length} new files uploaded`\n : `${data.length} files uploaded successfully`\n : fileName && fileName.trim() !== \"\"\n ? \"File updated successfully\"\n : \"File uploaded successfully\",\n };\n\n const afterHook = this.getAfterHook(\"updateFile\");\n if (afterHook) {\n (res as any).originalData = jsonContent;\n req.responseData = jsonContent;\n res.locals.data = jsonContent;\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json(jsonContent);\n });\n }\n );\n}\n\n/**\n * Controller instance responsible for handling file upload operations.\n *\n * @remarks\n * This controller handles various file upload operations including validation,\n * storage, and response management.\n *\n * @instance\n * @constant\n * @see {@link https://www.arkosjs.com/docs/reference/file-upload-controller-object}\n */\nconst fileUploadController = new FileUploadController();\n\nexport default fileUploadController;\n"]}
1
+ {"version":3,"file":"file-upload.controller.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import AppError from \"../error-handler/utils/app-error\";\nimport {\n FileUploadService,\n getFileUploadServices,\n} from \"./file-upload.service\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport { getArkosConfig } from \"../../server\";\nimport { processFile, processImage } from \"./utils/helpers/file-upload.helpers\";\nimport { ArkosNextFunction, ArkosRequest, ArkosResponse } from \"../../types\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport { routeHookReader } from \"../../components/arkos-route-hook/reader\";\n\n/**\n * Handles file uploads and allows to be extended via route hooks.\n */\nexport class FileUploadController {\n private getRouteHook() {\n return loadableRegistry.getItem(\"ArkosRouteHook\", \"file-upload\");\n }\n\n private getAfterHook(operation: string) {\n const hook = this.getRouteHook();\n if (!hook) return null;\n return (\n routeHookReader.getHooks(\"file-upload\", operation as any)?.after ?? null\n );\n }\n\n /**\n * Handles file upload requests, processes images if needed, and returns URLs.\n *\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n uploadFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const { fileType } = req.params;\n const { format, width, height, resizeTo } = req.query;\n const options = { format, width, height, resizeTo };\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n const uploadPath = path.resolve(\n path.join(process.cwd(), baseUploadDir, fileType)\n );\n try {\n await fs.promises.access(uploadPath);\n } catch {\n await fs.promises.mkdir(uploadPath, { recursive: true });\n }\n\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(\n new AppError(\"Invalid file type\", 400, \"InvalidFileType\")\n );\n }\n\n uploader.handleMultipleUpload()(req, res, async (err) => {\n if (err) throw err;\n\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n if (fileType === \"images\") {\n data = await Promise.all(\n req.files.map((file) =>\n processImage(req, next, file.path, options)\n )\n );\n } else {\n data = req.files.map((file) => processFile(req, file.path));\n }\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n if (fileType === \"images\") {\n data = await processImage(req, next, req.file.path, options);\n } else {\n data = processFile(req, req.file.path);\n }\n } else {\n return next(\n new AppError(\n `No file or files were attached on field ${fileType} on the request body as form data.`,\n 400,\n \"NoFileOrFilesAttached\"\n )\n );\n }\n\n const jsonContent = {\n success: true,\n data,\n message: Array.isArray(data)\n ? `${data.length} files uploaded successfully`\n : \"File uploaded successfully\",\n };\n\n const afterHook = this.getAfterHook(\"uploadFile\");\n if (afterHook) {\n (res as any).originalData = jsonContent;\n req.responseData = jsonContent;\n res.locals.data = jsonContent;\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json(jsonContent);\n });\n }\n );\n\n /**\n * Handles file deletion requests.\n *\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n deleteFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const { fileType, fileName } = req.params;\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(\n new AppError(\"Invalid file type\", 400, \"InvalidFileType\")\n );\n }\n\n try {\n const { fileUpload } = getArkosConfig();\n const baseUploadRoute = fileUpload?.baseRoute || \"/api/uploads\";\n\n const urlPattern = new RegExp(\n `${baseUploadRoute}/${fileType}/${fileName}`\n );\n\n const isExpectedUrlPattern = urlPattern.test(req.originalUrl);\n\n if (isExpectedUrlPattern) {\n const fullUrl = `${req.protocol}://${req.get(\"host\")}${req.originalUrl}`;\n await uploader.deleteFileByUrl(fullUrl);\n } else {\n await uploader.deleteFileByName(fileName, fileType);\n }\n\n const afterHook = this.getAfterHook(\"deleteFile\");\n if (afterHook) {\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).json();\n } catch (error) {\n if (error instanceof AppError) return next(error);\n return next(new AppError(\"File not found\", 404, \"FileNotFound\"));\n }\n }\n );\n\n /**\n * Handles file update requests by deleting the old file and uploading a new one.\n *\n * @param {ArkosRequest} req - Arkos request object\n * @param {ArkosResponse} res - Arkos response object\n * @param {ArkosNextFunction} next - Arkos next middleware function\n */\n updateFile = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const { fileType, fileName } = req.params;\n const { format, width, height, resizeTo } = req.query;\n const options = { format, width, height, resizeTo };\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n const uploadPath = path.resolve(\n path.join(process.cwd(), baseUploadDir, fileType)\n );\n try {\n await fs.promises.access(uploadPath);\n } catch {\n await fs.promises.mkdir(uploadPath, { recursive: true });\n }\n\n let uploader: FileUploadService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploadService;\n break;\n case \"videos\":\n uploader = videoUploadService;\n break;\n case \"documents\":\n uploader = documentUploadService;\n break;\n case \"files\":\n uploader = fileUploadService;\n break;\n default:\n return next(\n new AppError(\"Invalid file type\", 400, \"InvalidFileType\")\n );\n }\n\n uploader.handleMultipleUpload()(req, res, async (err) => {\n if (err) throw err;\n\n if (\n !req.file &&\n (!req.files || !Array.isArray(req.files) || req.files.length === 0)\n )\n return next(\n new AppError(\"No new file uploaded\", 400, \"MissingNewFile\")\n );\n\n if (fileName && fileName.trim() !== \"\") {\n try {\n const baseUploadRoute = fileUpload?.baseRoute || \"/api/uploads\";\n const urlPattern = new RegExp(\n `${baseUploadRoute}/${fileType}/${fileName}`\n );\n const isExpectedUrlPattern = urlPattern.test(req.originalUrl);\n\n if (isExpectedUrlPattern) {\n const oldFileUrl = `${req.protocol}://${req.get(\"host\")}${req.originalUrl}`;\n await uploader.deleteFileByUrl(oldFileUrl);\n } else {\n await uploader.deleteFileByName(fileName, fileType);\n }\n } catch (error) {\n console.warn(`Could not delete old file: ${fileName}`, error);\n }\n }\n\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n if (fileType === \"images\") {\n data = await Promise.all(\n req.files.map((file) =>\n processImage(req, next, file.path, options)\n )\n );\n } else {\n data = req.files.map((file) => processFile(req, file.path));\n }\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n if (fileType === \"images\") {\n data = await processImage(req, next, req.file.path, options);\n } else {\n data = processFile(req, req.file.path);\n }\n }\n\n const jsonContent = {\n success: true,\n data,\n message: Array.isArray(data)\n ? fileName && fileName.trim() !== \"\"\n ? `File updated successfully. ${data.length} new files uploaded`\n : `${data.length} files uploaded successfully`\n : fileName && fileName.trim() !== \"\"\n ? \"File updated successfully\"\n : \"File uploaded successfully\",\n };\n\n const afterHook = this.getAfterHook(\"updateFile\");\n if (afterHook) {\n (res as any).originalData = jsonContent;\n req.responseData = jsonContent;\n res.locals.data = jsonContent;\n (res as any).originalStatus = 200;\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json(jsonContent);\n });\n }\n );\n}\n\n/**\n * Controller instance responsible for handling file upload operations.\n *\n * @remarks\n * This controller handles various file upload operations including validation,\n * storage, and response management.\n *\n * @instance\n * @constant\n * @see {@link https://www.arkosjs.com/docs/reference/file-upload-controller-object}\n */\nconst fileUploadController = new FileUploadController();\n\nexport default fileUploadController;\n"]}
@@ -10,7 +10,7 @@ const server_1 = require("../../../../server.js");
10
10
  class OpenAPIchemaConverter {
11
11
  constructor() {
12
12
  this.validatorToJsonSchema = (schema) => {
13
- const validationResolver = (0, server_1.getArkosConfig)().validation?.resolver;
13
+ const validationResolver = (0, server_1.getArkosConfig)()?.validation?.resolver;
14
14
  const fn = validationResolver === "zod"
15
15
  ? zod_to_json_schema_1.default
16
16
  : class_validator_to_json_schema_1.default;
@@ -1 +1 @@
1
- {"version":3,"file":"openapi-schema-converter.js","sourceRoot":"","sources":["../../../../../../src/modules/swagger/utils/helpers/openapi-schema-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { OpenAPIV3 } from \"openapi-types\";\nimport { isClass, isZodSchema } from \"../../../../utils/dynamic-loader\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport classValidatorToJsonSchema from \"./class-validator-to-json-schema\";\nimport { getArkosConfig } from \"../../../../server\";\n\n/**\n * Singleton class responsible for converting various schema formats (Zod, Class DTOs, JSON Schema)\n * into OpenAPI-compliant schema objects. Handles shorthand syntax for responses, request bodies,\n * and parameters.\n */\nclass OpenAPIchemaConverter {\n private validatorToJsonSchema: (schema: any) => any;\n\n constructor() {\n this.validatorToJsonSchema = (schema: any) => {\n const validationResolver = getArkosConfig().validation?.resolver;\n const fn =\n validationResolver === \"zod\"\n ? zodToJsonSchema\n : classValidatorToJsonSchema;\n\n return fn(schema);\n };\n }\n\n /**\n * Checks if a value is a schema-like object (Zod, Class, or JSON Schema).\n *\n * @param value - The value to check\n * @returns True if the value is a schema-like object\n */\n private isSchemaLike(value: any): boolean {\n if (!value) return false;\n\n if (isZodSchema(value)) return true;\n\n if (isClass(value)) return true;\n\n if (this.isPlainObject(value) && value.type) return true;\n\n return false;\n }\n\n /**\n * Checks if a value is a plain JavaScript object.\n *\n * @param value - The value to check\n * @returns True if the value is a plain object\n */\n private isPlainObject(value: any): boolean {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n }\n\n /**\n * Converts a schema-like object (Zod, Class, or JSON Schema) into a JSON Schema object.\n *\n * @param schema - The schema to convert\n * @returns The JSON Schema representation, or undefined if schema is null/undefined\n */\n private convertToJsonSchema(schema: any): any {\n if (this.isPlainObject(schema) && schema?.type) return schema;\n\n if (isZodSchema(schema) || isClass(schema))\n return this.validatorToJsonSchema(schema);\n\n throw new Error(\n `Unsupported schema type. Expected Zod schema, class constructor, or JSON Schema object.`\n );\n }\n\n /**\n * Gets the default description for an HTTP status code.\n *\n * @param statusCode - The HTTP status code\n * @returns A human-readable default description\n */\n private getDefaultDescription(statusCode: string): string {\n const defaults: Record<string, string> = {\n \"200\": \"Success\",\n \"201\": \"Created\",\n \"202\": \"Accepted\",\n \"204\": \"No Content\",\n \"400\": \"Bad Request\",\n \"401\": \"Unauthorized\",\n \"403\": \"Forbidden\",\n \"404\": \"Not Found\",\n \"409\": \"Conflict\",\n \"422\": \"Unprocessable Entity\",\n \"500\": \"Internal Server Error\",\n \"502\": \"Bad Gateway\",\n \"503\": \"Service Unavailable\",\n };\n\n return defaults[statusCode] || \"Response\";\n }\n\n /**\n * Core flattening logic that converts a JSON schema into bracket notation.\n * Handles nested objects, arrays, and circular references.\n *\n * @param schema - The JSON schema to flatten\n * @param prefix - Optional prefix for nested properties\n * @param visitedRefs - Set to track circular references\n * @returns Array of flattened field descriptors\n */\n flattenSchemaCore(\n schema: any,\n prefix = \"\",\n visitedRefs = new Set<string>()\n ): Array<{ name: string; schema: any; required: boolean }> {\n const flattened: Array<{ name: string; schema: any; required: boolean }> =\n [];\n\n if (schema.$ref) {\n const refPath = schema.$ref;\n if (visitedRefs.has(refPath)) return flattened;\n\n visitedRefs.add(refPath);\n const resolvedSchema = this.resolveRef(schema, refPath);\n if (resolvedSchema) {\n flattened.push(\n ...this.flattenSchemaCore(resolvedSchema, prefix, visitedRefs)\n );\n }\n visitedRefs.delete(refPath);\n return flattened;\n }\n\n if (schema.type === \"array\" && schema.items) {\n const arrayPrefix = prefix ? `${prefix}[0]` : \"[0]\";\n\n // Check if items is an array FIRST, before checking for object\n if (schema.items.type === \"array\") {\n flattened.push(\n ...this.flattenSchemaCore(schema.items, arrayPrefix, visitedRefs)\n );\n } else if (schema.items.properties || schema.items.type === \"object\") {\n flattened.push(\n ...this.flattenSchemaCore(schema.items, arrayPrefix, visitedRefs)\n );\n } else if (schema.items.type || schema.items.$ref) {\n flattened.push({\n name: arrayPrefix,\n schema: {\n type: schema.items.type,\n ...(schema.items.enum && { enum: schema.items.enum }),\n ...(schema.items.format && { format: schema.items.format }),\n },\n required: false,\n });\n }\n\n return flattened;\n }\n\n if ((schema.type === \"object\" || !schema.type) && schema.properties) {\n for (const [key, value] of Object.entries(schema.properties) as any) {\n const paramName = prefix ? `${prefix}[${key}]` : key;\n\n if (value.$ref) {\n const refPath = value.$ref;\n if (visitedRefs.has(refPath)) continue;\n\n visitedRefs.add(refPath);\n const resolvedSchema = this.resolveRef(schema, refPath);\n\n if (resolvedSchema) {\n flattened.push(\n ...this.flattenSchemaCore(resolvedSchema, paramName, visitedRefs)\n );\n }\n visitedRefs.delete(refPath);\n } else if (value.type === \"array\" && value.items) {\n const arrayPrefix = `${paramName}[0]`;\n if (value.items.type === \"array\") {\n flattened.push(\n ...this.flattenSchemaCore(value.items, arrayPrefix, visitedRefs)\n );\n } else if (value.items.type === \"object\" || value.items.properties) {\n flattened.push(\n ...this.flattenSchemaCore(value.items, arrayPrefix, visitedRefs)\n );\n } else {\n flattened.push({\n name: arrayPrefix,\n schema: {\n type: value.items.type,\n ...(value.items.enum && { enum: value.items.enum }),\n ...(value.items.format && { format: value.items.format }),\n },\n required: false,\n });\n }\n } else if (value.type === \"object\" && value.properties) {\n flattened.push(\n ...this.flattenSchemaCore(value, paramName, visitedRefs)\n );\n } else {\n flattened.push({\n name: paramName,\n schema: {\n type: value.type,\n ...(value.enum && { enum: value.enum }),\n ...(value.format && { format: value.format }),\n },\n required: schema.required?.includes(key) || false,\n });\n }\n }\n return flattened;\n }\n\n // Handle primitive types with prefix\n if (schema.type && prefix) {\n flattened.push({\n name: prefix,\n schema: {\n type: schema.type,\n ...(schema.enum && { enum: schema.enum }),\n ...(schema.format && { format: schema.format }),\n },\n required: false,\n });\n }\n\n return flattened;\n }\n\n /**\n * Flattens a JSON schema while preserving the schema structure.\n * Converts nested objects and arrays into bracket notation properties.\n * Used for multipart/form-data schema representation.\n *\n * @param schema - The JSON schema to flatten\n * @returns A flattened schema object with bracket notation properties\n */\n flattenSchema(schema: any): any {\n const flattened = this.flattenSchemaCore(schema);\n\n // Convert the flattened array into a schema object\n const flattenedSchema: any = {\n ...schema,\n properties: {},\n required: [],\n };\n\n for (const item of flattened) {\n flattenedSchema.properties[item.name] = item.schema;\n if (item.required) {\n flattenedSchema.required.push(item.name);\n }\n }\n\n // Remove empty required array if no required fields\n if (flattenedSchema.required.length === 0) {\n delete flattenedSchema.required;\n }\n\n return flattenedSchema;\n }\n\n /**\n * Converts a response definition (shorthand, medium, or full format) into a standard\n * OpenAPI ResponseObject.\n *\n * Supports three formats:\n * 1. Shorthand: ProfileDto → assumes application/json + default description\n * 2. Medium: { content: ProfileDto, description: \"...\" } → custom description\n * 3. Full: { content: { \"application/json\": { schema: ProfileDto } } } → full control\n *\n * @param statusCode - The HTTP status code for this response\n * @param definition - The response definition to convert\n * @returns A standard OpenAPI ResponseObject\n */\n convertResponseDefinition(\n statusCode: string,\n definition: any\n ): OpenAPIV3.ResponseObject {\n if (!definition.content && this.isSchemaLike(definition)) {\n return {\n description: this.getDefaultDescription(statusCode),\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition),\n },\n },\n };\n }\n\n if (definition.content && this.isSchemaLike(definition.content)) {\n return {\n description:\n definition.description || this.getDefaultDescription(statusCode),\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition.content),\n },\n },\n ...(definition.headers && { headers: definition.headers }),\n ...(definition.links && { links: definition.links }),\n };\n }\n\n if (definition.content) {\n const converted: OpenAPIV3.ResponseObject = {\n description:\n definition.description || this.getDefaultDescription(statusCode),\n content: {},\n };\n\n for (const [mediaType, mediaObj] of Object.entries(\n definition.content\n ) as any[]) {\n converted.content![mediaType] = {\n ...mediaObj,\n schema: this.convertToJsonSchema(mediaObj.schema),\n };\n }\n\n if (definition.headers) converted.headers = definition.headers;\n if (definition.links) converted.links = definition.links;\n\n return converted;\n }\n\n return definition;\n }\n\n /**\n * Converts a request body definition (shorthand, medium, or full format) into a standard\n * OpenAPI RequestBodyObject.\n *\n * Supports three formats:\n * 1. Shorthand: CreateUserDto → assumes application/json + required: true\n * 2. Medium: { content: CreateUserDto, required?: boolean } → custom config\n * 3. Full: { content: { \"application/json\": { schema: CreateUserDto } } } → full control\n *\n * For multipart/form-data, automatically converts the schema into an array of parameters.\n *\n * @param definition - The request body definition to convert\n * @returns A standard OpenAPI RequestBodyObject, or undefined if no definition provided\n */\n convertRequestBodyDefinition(\n definition: any\n ): OpenAPIV3.RequestBodyObject | undefined {\n if (!definition) return undefined;\n\n if (!definition.content && this.isSchemaLike(definition)) {\n return {\n required: true,\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition),\n },\n },\n };\n }\n\n if (definition.content && this.isSchemaLike(definition.content)) {\n return {\n required: definition.required === false ? false : true,\n description: definition.description,\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition.content),\n },\n },\n };\n }\n\n if (definition.content) {\n const converted: OpenAPIV3.RequestBodyObject = {\n required: definition.required ?? true,\n content: {},\n };\n\n if (definition.description)\n converted.description = definition.description;\n\n for (const [mediaType, mediaObj] of Object.entries(\n definition.content\n ) as any[]) {\n const jsonSchema = this.convertToJsonSchema(mediaObj.schema);\n\n // For multipart/form-data, flatten the schema into bracket notation\n if (mediaType === \"multipart/form-data\") {\n converted.content[mediaType] = {\n ...mediaObj,\n schema: this.flattenSchema(jsonSchema),\n };\n } else {\n // For other media types (like application/json), keep the full schema\n converted.content[mediaType] = {\n ...mediaObj,\n schema: jsonSchema,\n };\n }\n }\n\n return converted;\n }\n\n return definition;\n }\n\n /**\n * Converts an array of parameter definitions, transforming any Zod/Class schemas\n * into JSON Schema objects.\n *\n * @param parameters - Array of parameter definitions to convert\n * @returns Array of standard OpenAPI ParameterObjects, or undefined if no parameters provided\n */\n convertParameters(\n parameters: any[] | undefined\n ): (OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject)[] | undefined {\n if (!parameters) return undefined;\n\n return parameters.map((param) => {\n if (param.$ref) return param;\n\n if (param.schema)\n return {\n ...param,\n schema: this.convertToJsonSchema(param.schema),\n };\n\n return param;\n });\n }\n\n /**\n * Converts all responses in a responses object, handling shorthand, medium, and full formats.\n *\n * @param responses - Object containing response definitions keyed by status code\n * @returns Object with converted OpenAPI ResponseObjects\n */\n convertResponses(\n responses: Record<string, any> | undefined\n ): Record<string, OpenAPIV3.ResponseObject> | undefined {\n if (!responses) return undefined;\n\n const converted: Record<string, OpenAPIV3.ResponseObject> = {};\n\n for (const [statusCode, definition] of Object.entries(responses)) {\n converted[statusCode] = this.convertResponseDefinition(\n statusCode,\n definition\n );\n }\n\n return converted;\n }\n\n /**\n * Converts a complete OpenAPI operation configuration, processing responses, requestBody,\n * and parameters to handle shorthand syntax and schema conversions.\n *\n * @param config - The OpenAPI operation configuration to convert\n * @returns The converted configuration with all schemas transformed to JSON Schema\n */\n convertOpenAPIConfig(config: any): any {\n if (!config || config === false) return config;\n\n const converted = { ...config };\n\n if (config.responses)\n converted.responses = this.convertResponses(config.responses);\n\n if (config.requestBody)\n converted.requestBody = this.convertRequestBodyDefinition(\n config.requestBody\n );\n\n if (config.parameters)\n converted.parameters = this.convertParameters(config.parameters);\n\n return converted;\n }\n\n /**\n * Converts a JSON schema to OpenAPI parameter objects with flattened paths.\n * This is used for query/path/header parameters.\n *\n * @param paramType - The parameter location (query, path, header, cookie)\n * @param schema - The JSON schema to convert\n * @param prefix - Optional prefix for nested properties\n * @param visitedRefs - Set to track circular references\n * @returns Array of OpenAPI parameter objects\n */\n jsonSchemaToOpenApiParameters(\n paramType: string,\n schema: any,\n prefix = \"\",\n visitedRefs = new Set<string>()\n ): any[] {\n const flattened = this.flattenSchemaCore(schema, prefix, visitedRefs);\n\n return flattened.map(({ name, schema, required }) => ({\n in: paramType,\n name,\n required,\n schema,\n }));\n }\n\n resolveRef(rootSchema: any, refPath: string): any {\n if (!refPath.startsWith(\"#/properties/\")) {\n return null;\n }\n\n const path = refPath.substring(2).split(\"/\");\n let current = rootSchema;\n\n for (const part of path) {\n if (current && current[part] !== undefined) {\n current = current[part];\n } else {\n return null;\n }\n }\n\n return current;\n }\n}\n\nconst openApiSchemaConverter = new OpenAPIchemaConverter();\n\nexport default openApiSchemaConverter;\n"]}
1
+ {"version":3,"file":"openapi-schema-converter.js","sourceRoot":"","sources":["../../../../../../src/modules/swagger/utils/helpers/openapi-schema-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { OpenAPIV3 } from \"openapi-types\";\nimport { isClass, isZodSchema } from \"../../../../utils/dynamic-loader\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport classValidatorToJsonSchema from \"./class-validator-to-json-schema\";\nimport { getArkosConfig } from \"../../../../server\";\n\n/**\n * Singleton class responsible for converting various schema formats (Zod, Class DTOs, JSON Schema)\n * into OpenAPI-compliant schema objects. Handles shorthand syntax for responses, request bodies,\n * and parameters.\n */\nclass OpenAPIchemaConverter {\n private validatorToJsonSchema: (schema: any) => any;\n\n constructor() {\n this.validatorToJsonSchema = (schema: any) => {\n const validationResolver = getArkosConfig()?.validation?.resolver;\n const fn =\n validationResolver === \"zod\"\n ? zodToJsonSchema\n : classValidatorToJsonSchema;\n\n return fn(schema);\n };\n }\n\n /**\n * Checks if a value is a schema-like object (Zod, Class, or JSON Schema).\n *\n * @param value - The value to check\n * @returns True if the value is a schema-like object\n */\n private isSchemaLike(value: any): boolean {\n if (!value) return false;\n\n if (isZodSchema(value)) return true;\n\n if (isClass(value)) return true;\n\n if (this.isPlainObject(value) && value.type) return true;\n\n return false;\n }\n\n /**\n * Checks if a value is a plain JavaScript object.\n *\n * @param value - The value to check\n * @returns True if the value is a plain object\n */\n private isPlainObject(value: any): boolean {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n }\n\n /**\n * Converts a schema-like object (Zod, Class, or JSON Schema) into a JSON Schema object.\n *\n * @param schema - The schema to convert\n * @returns The JSON Schema representation, or undefined if schema is null/undefined\n */\n private convertToJsonSchema(schema: any): any {\n if (this.isPlainObject(schema) && schema?.type) return schema;\n\n if (isZodSchema(schema) || isClass(schema))\n return this.validatorToJsonSchema(schema);\n\n throw new Error(\n `Unsupported schema type. Expected Zod schema, class constructor, or JSON Schema object.`\n );\n }\n\n /**\n * Gets the default description for an HTTP status code.\n *\n * @param statusCode - The HTTP status code\n * @returns A human-readable default description\n */\n private getDefaultDescription(statusCode: string): string {\n const defaults: Record<string, string> = {\n \"200\": \"Success\",\n \"201\": \"Created\",\n \"202\": \"Accepted\",\n \"204\": \"No Content\",\n \"400\": \"Bad Request\",\n \"401\": \"Unauthorized\",\n \"403\": \"Forbidden\",\n \"404\": \"Not Found\",\n \"409\": \"Conflict\",\n \"422\": \"Unprocessable Entity\",\n \"500\": \"Internal Server Error\",\n \"502\": \"Bad Gateway\",\n \"503\": \"Service Unavailable\",\n };\n\n return defaults[statusCode] || \"Response\";\n }\n\n /**\n * Core flattening logic that converts a JSON schema into bracket notation.\n * Handles nested objects, arrays, and circular references.\n *\n * @param schema - The JSON schema to flatten\n * @param prefix - Optional prefix for nested properties\n * @param visitedRefs - Set to track circular references\n * @returns Array of flattened field descriptors\n */\n flattenSchemaCore(\n schema: any,\n prefix = \"\",\n visitedRefs = new Set<string>()\n ): Array<{ name: string; schema: any; required: boolean }> {\n const flattened: Array<{ name: string; schema: any; required: boolean }> =\n [];\n\n if (schema.$ref) {\n const refPath = schema.$ref;\n if (visitedRefs.has(refPath)) return flattened;\n\n visitedRefs.add(refPath);\n const resolvedSchema = this.resolveRef(schema, refPath);\n if (resolvedSchema) {\n flattened.push(\n ...this.flattenSchemaCore(resolvedSchema, prefix, visitedRefs)\n );\n }\n visitedRefs.delete(refPath);\n return flattened;\n }\n\n if (schema.type === \"array\" && schema.items) {\n const arrayPrefix = prefix ? `${prefix}[0]` : \"[0]\";\n\n // Check if items is an array FIRST, before checking for object\n if (schema.items.type === \"array\") {\n flattened.push(\n ...this.flattenSchemaCore(schema.items, arrayPrefix, visitedRefs)\n );\n } else if (schema.items.properties || schema.items.type === \"object\") {\n flattened.push(\n ...this.flattenSchemaCore(schema.items, arrayPrefix, visitedRefs)\n );\n } else if (schema.items.type || schema.items.$ref) {\n flattened.push({\n name: arrayPrefix,\n schema: {\n type: schema.items.type,\n ...(schema.items.enum && { enum: schema.items.enum }),\n ...(schema.items.format && { format: schema.items.format }),\n },\n required: false,\n });\n }\n\n return flattened;\n }\n\n if ((schema.type === \"object\" || !schema.type) && schema.properties) {\n for (const [key, value] of Object.entries(schema.properties) as any) {\n const paramName = prefix ? `${prefix}[${key}]` : key;\n\n if (value.$ref) {\n const refPath = value.$ref;\n if (visitedRefs.has(refPath)) continue;\n\n visitedRefs.add(refPath);\n const resolvedSchema = this.resolveRef(schema, refPath);\n\n if (resolvedSchema) {\n flattened.push(\n ...this.flattenSchemaCore(resolvedSchema, paramName, visitedRefs)\n );\n }\n visitedRefs.delete(refPath);\n } else if (value.type === \"array\" && value.items) {\n const arrayPrefix = `${paramName}[0]`;\n if (value.items.type === \"array\") {\n flattened.push(\n ...this.flattenSchemaCore(value.items, arrayPrefix, visitedRefs)\n );\n } else if (value.items.type === \"object\" || value.items.properties) {\n flattened.push(\n ...this.flattenSchemaCore(value.items, arrayPrefix, visitedRefs)\n );\n } else {\n flattened.push({\n name: arrayPrefix,\n schema: {\n type: value.items.type,\n ...(value.items.enum && { enum: value.items.enum }),\n ...(value.items.format && { format: value.items.format }),\n },\n required: false,\n });\n }\n } else if (value.type === \"object\" && value.properties) {\n flattened.push(\n ...this.flattenSchemaCore(value, paramName, visitedRefs)\n );\n } else {\n flattened.push({\n name: paramName,\n schema: {\n type: value.type,\n ...(value.enum && { enum: value.enum }),\n ...(value.format && { format: value.format }),\n },\n required: schema.required?.includes(key) || false,\n });\n }\n }\n return flattened;\n }\n\n // Handle primitive types with prefix\n if (schema.type && prefix) {\n flattened.push({\n name: prefix,\n schema: {\n type: schema.type,\n ...(schema.enum && { enum: schema.enum }),\n ...(schema.format && { format: schema.format }),\n },\n required: false,\n });\n }\n\n return flattened;\n }\n\n /**\n * Flattens a JSON schema while preserving the schema structure.\n * Converts nested objects and arrays into bracket notation properties.\n * Used for multipart/form-data schema representation.\n *\n * @param schema - The JSON schema to flatten\n * @returns A flattened schema object with bracket notation properties\n */\n flattenSchema(schema: any): any {\n const flattened = this.flattenSchemaCore(schema);\n\n // Convert the flattened array into a schema object\n const flattenedSchema: any = {\n ...schema,\n properties: {},\n required: [],\n };\n\n for (const item of flattened) {\n flattenedSchema.properties[item.name] = item.schema;\n if (item.required) {\n flattenedSchema.required.push(item.name);\n }\n }\n\n // Remove empty required array if no required fields\n if (flattenedSchema.required.length === 0) {\n delete flattenedSchema.required;\n }\n\n return flattenedSchema;\n }\n\n /**\n * Converts a response definition (shorthand, medium, or full format) into a standard\n * OpenAPI ResponseObject.\n *\n * Supports three formats:\n * 1. Shorthand: ProfileDto → assumes application/json + default description\n * 2. Medium: { content: ProfileDto, description: \"...\" } → custom description\n * 3. Full: { content: { \"application/json\": { schema: ProfileDto } } } → full control\n *\n * @param statusCode - The HTTP status code for this response\n * @param definition - The response definition to convert\n * @returns A standard OpenAPI ResponseObject\n */\n convertResponseDefinition(\n statusCode: string,\n definition: any\n ): OpenAPIV3.ResponseObject {\n if (!definition.content && this.isSchemaLike(definition)) {\n return {\n description: this.getDefaultDescription(statusCode),\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition),\n },\n },\n };\n }\n\n if (definition.content && this.isSchemaLike(definition.content)) {\n return {\n description:\n definition.description || this.getDefaultDescription(statusCode),\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition.content),\n },\n },\n ...(definition.headers && { headers: definition.headers }),\n ...(definition.links && { links: definition.links }),\n };\n }\n\n if (definition.content) {\n const converted: OpenAPIV3.ResponseObject = {\n description:\n definition.description || this.getDefaultDescription(statusCode),\n content: {},\n };\n\n for (const [mediaType, mediaObj] of Object.entries(\n definition.content\n ) as any[]) {\n converted.content![mediaType] = {\n ...mediaObj,\n schema: this.convertToJsonSchema(mediaObj.schema),\n };\n }\n\n if (definition.headers) converted.headers = definition.headers;\n if (definition.links) converted.links = definition.links;\n\n return converted;\n }\n\n return definition;\n }\n\n /**\n * Converts a request body definition (shorthand, medium, or full format) into a standard\n * OpenAPI RequestBodyObject.\n *\n * Supports three formats:\n * 1. Shorthand: CreateUserDto → assumes application/json + required: true\n * 2. Medium: { content: CreateUserDto, required?: boolean } → custom config\n * 3. Full: { content: { \"application/json\": { schema: CreateUserDto } } } → full control\n *\n * For multipart/form-data, automatically converts the schema into an array of parameters.\n *\n * @param definition - The request body definition to convert\n * @returns A standard OpenAPI RequestBodyObject, or undefined if no definition provided\n */\n convertRequestBodyDefinition(\n definition: any\n ): OpenAPIV3.RequestBodyObject | undefined {\n if (!definition) return undefined;\n\n if (!definition.content && this.isSchemaLike(definition)) {\n return {\n required: true,\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition),\n },\n },\n };\n }\n\n if (definition.content && this.isSchemaLike(definition.content)) {\n return {\n required: definition.required === false ? false : true,\n description: definition.description,\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition.content),\n },\n },\n };\n }\n\n if (definition.content) {\n const converted: OpenAPIV3.RequestBodyObject = {\n required: definition.required ?? true,\n content: {},\n };\n\n if (definition.description)\n converted.description = definition.description;\n\n for (const [mediaType, mediaObj] of Object.entries(\n definition.content\n ) as any[]) {\n const jsonSchema = this.convertToJsonSchema(mediaObj.schema);\n\n // For multipart/form-data, flatten the schema into bracket notation\n if (mediaType === \"multipart/form-data\") {\n converted.content[mediaType] = {\n ...mediaObj,\n schema: this.flattenSchema(jsonSchema),\n };\n } else {\n // For other media types (like application/json), keep the full schema\n converted.content[mediaType] = {\n ...mediaObj,\n schema: jsonSchema,\n };\n }\n }\n\n return converted;\n }\n\n return definition;\n }\n\n /**\n * Converts an array of parameter definitions, transforming any Zod/Class schemas\n * into JSON Schema objects.\n *\n * @param parameters - Array of parameter definitions to convert\n * @returns Array of standard OpenAPI ParameterObjects, or undefined if no parameters provided\n */\n convertParameters(\n parameters: any[] | undefined\n ): (OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject)[] | undefined {\n if (!parameters) return undefined;\n\n return parameters.map((param) => {\n if (param.$ref) return param;\n\n if (param.schema)\n return {\n ...param,\n schema: this.convertToJsonSchema(param.schema),\n };\n\n return param;\n });\n }\n\n /**\n * Converts all responses in a responses object, handling shorthand, medium, and full formats.\n *\n * @param responses - Object containing response definitions keyed by status code\n * @returns Object with converted OpenAPI ResponseObjects\n */\n convertResponses(\n responses: Record<string, any> | undefined\n ): Record<string, OpenAPIV3.ResponseObject> | undefined {\n if (!responses) return undefined;\n\n const converted: Record<string, OpenAPIV3.ResponseObject> = {};\n\n for (const [statusCode, definition] of Object.entries(responses)) {\n converted[statusCode] = this.convertResponseDefinition(\n statusCode,\n definition\n );\n }\n\n return converted;\n }\n\n /**\n * Converts a complete OpenAPI operation configuration, processing responses, requestBody,\n * and parameters to handle shorthand syntax and schema conversions.\n *\n * @param config - The OpenAPI operation configuration to convert\n * @returns The converted configuration with all schemas transformed to JSON Schema\n */\n convertOpenAPIConfig(config: any): any {\n if (!config || config === false) return config;\n\n const converted = { ...config };\n\n if (config.responses)\n converted.responses = this.convertResponses(config.responses);\n\n if (config.requestBody)\n converted.requestBody = this.convertRequestBodyDefinition(\n config.requestBody\n );\n\n if (config.parameters)\n converted.parameters = this.convertParameters(config.parameters);\n\n return converted;\n }\n\n /**\n * Converts a JSON schema to OpenAPI parameter objects with flattened paths.\n * This is used for query/path/header parameters.\n *\n * @param paramType - The parameter location (query, path, header, cookie)\n * @param schema - The JSON schema to convert\n * @param prefix - Optional prefix for nested properties\n * @param visitedRefs - Set to track circular references\n * @returns Array of OpenAPI parameter objects\n */\n jsonSchemaToOpenApiParameters(\n paramType: string,\n schema: any,\n prefix = \"\",\n visitedRefs = new Set<string>()\n ): any[] {\n const flattened = this.flattenSchemaCore(schema, prefix, visitedRefs);\n\n return flattened.map(({ name, schema, required }) => ({\n in: paramType,\n name,\n required,\n schema,\n }));\n }\n\n resolveRef(rootSchema: any, refPath: string): any {\n if (!refPath.startsWith(\"#/properties/\")) {\n return null;\n }\n\n const path = refPath.substring(2).split(\"/\");\n let current = rootSchema;\n\n for (const part of path) {\n if (current && current[part] !== undefined) {\n current = current[part];\n } else {\n return null;\n }\n }\n\n return current;\n }\n}\n\nconst openApiSchemaConverter = new OpenAPIchemaConverter();\n\nexport default openApiSchemaConverter;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"arkos-prisma-input.js","sourceRoot":"","sources":["../../../src/types/arkos-prisma-input.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Helper type to exclude properties from T that exist in U\n * Used internally by XOR to create mutually exclusive types\n */\ntype Without<T, U> = {\n [P in Exclude<keyof T, keyof U>]?: never;\n};\n/**\n * XOR (Exclusive OR) type for mutually exclusive union types\n * Ensures that properties from T and U cannot be mixed together\n * @see https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\ntype XOR<T, U> = T extends object\n ? U extends object\n ? (Without<T, U> & U) | (Without<U, T> & T)\n : U\n : T;\ntype Unpack<T> = T;\n/**\n * Checks if a field is an array relation (one-to-many or many-to-many)\n * Identified by the presence of createMany property\n */\nexport type IsArrayRelation<T> =\n Exclude<T, undefined> extends never\n ? false\n : Exclude<T, undefined> extends { createMany?: any }\n ? true\n : false;\n/**\n * Checks if a field is an object relation (one-to-one or many-to-one)\n * Identified by the presence of relation operations without being an array\n */\nexport type IsObjectRelation<T> =\n Exclude<T, undefined> extends Array<any>\n ? false\n : Exclude<T, undefined> extends\n | {\n create?: any;\n }\n | {\n connect?: any;\n }\n | {\n connectOrCreate?: any;\n }\n | {\n update?: any;\n }\n | {\n delete?: any;\n }\n | {\n disconnect?: any;\n }\n ? true\n : false;\ntype ExtractCreateTypeArray<T> =\n Exclude<T, undefined> extends {\n create?: infer C;\n }\n ? Extract<C, Array<any>> extends Array<infer U>\n ? U extends Array<infer I>\n ? (Omit<I, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n })[]\n : (Omit<U, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n })[]\n : never\n : never;\ntype ExtractConnectTypeArray<\n T,\n A extends\n | \"connect\"\n | \"delete\"\n | \"update\"\n | \"disconnect\"\n | \"deleteMany\"\n | \"set\",\n> =\n Exclude<T, undefined> extends {\n [k in A]?: infer C;\n }\n ? Extract<C, Array<any>> extends Array<infer U>\n ? (Omit<U, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: A;\n })[]\n : never\n : never;\ntype ExtractUpdateTypeArray<T> =\n Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n update?: infer U;\n }\n ? U extends Array<infer UpdateItem>\n ? UpdateItem extends {\n where: infer W;\n data: infer D;\n }\n ? ((W & D) & {\n apiAction?: \"update\";\n })[]\n : never\n : U extends {\n where: infer W;\n data: infer D;\n }\n ? ((W & D) & {\n apiAction?: \"update\";\n })[]\n : never\n : never\n : never;\ntype ExtractCreateTypeObject<T> =\n Exclude<T, undefined> extends {\n create?: infer C;\n }\n ? Exclude<\n Extract<Exclude<C, undefined>, object>,\n Array<any>\n > extends infer Obj\n ? Obj extends object\n ? Omit<Obj, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n }\n : never\n : never\n : never;\ntype ExtractConnectTypeObject<\n T,\n A extends \"connect\" | \"delete\" | \"update\" | \"disconnect\",\n> =\n Exclude<T, undefined> extends {\n [k in A]?: infer C;\n }\n ? Exclude<\n Extract<Exclude<C, undefined>, object>,\n Array<any>\n > extends infer Obj\n ? Obj extends object\n ? Omit<Obj, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: A;\n }\n : never\n : never\n : never;\ntype ExtractUpdateTypeObject<T> =\n Exclude<T, undefined> extends {\n update?: infer U;\n }\n ? U extends {\n where: infer W;\n data: infer D;\n }\n ? (W & D) & {\n apiAction?: \"update\";\n }\n : Exclude<Extract<U, object>, Array<any>> & {\n apiAction?: \"update\";\n }\n : never;\ntype FlattenArrayRelation<T> =\n | (ExtractCreateTypeArray<T> extends never\n ? never\n : FlattenRelations<ExtractCreateTypeArray<T>>)\n | (ExtractConnectTypeArray<T, \"connect\"> extends never\n ? never\n : FlattenRelations<ExtractConnectTypeArray<T, \"connect\">>)\n | (ExtractUpdateTypeArray<T> extends never\n ? never\n : FlattenRelations<ExtractUpdateTypeArray<T>>)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n delete?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"delete\">> & {\n apiAction: \"delete\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n disconnect?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"disconnect\">> & {\n apiAction: \"disconnect\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n set?: infer S;\n }\n ? Unpack<S> & {\n apiAction?: \"set\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n deleteMany?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"deleteMany\">> & {\n apiAction: \"deleteMany\";\n }\n : never\n : never);\ntype FlattenObjectRelation<T> =\n | (ExtractCreateTypeObject<T> extends never\n ? never\n : FlattenRelations<ExtractCreateTypeObject<T>>)\n | (ExtractConnectTypeObject<T, \"connect\"> extends never\n ? never\n : FlattenRelations<ExtractConnectTypeObject<T, \"connect\">>)\n | (ExtractUpdateTypeObject<T> extends never\n ? never\n : FlattenRelations<ExtractUpdateTypeObject<T>>)\n | (Exclude<T, undefined> extends {\n delete?: any;\n }\n ? FlattenRelations<ExtractConnectTypeObject<T, \"delete\">> & {\n apiAction: \"delete\";\n }\n : never)\n | (Exclude<T, undefined> extends {\n disconnect?: any;\n }\n ? FlattenRelations<ExtractConnectTypeObject<T, \"disconnect\">> & {\n apiAction: \"disconnect\";\n }\n : never)\n | (Exclude<T, undefined> extends {\n set?: infer S;\n }\n ? Unpack<S> & {\n apiAction?: \"set\";\n }\n : never);\ntype StripPrismaFilters<T> = T extends\n | {\n equals?: any;\n }\n | {\n in?: any;\n }\n | {\n notIn?: any;\n }\n | {\n lt?: any;\n }\n | {\n lte?: any;\n }\n | {\n gt?: any;\n }\n | {\n gte?: any;\n }\n | {\n AND?: any;\n }\n | {\n OR?: any;\n }\n | {\n NOT?: any;\n }\n ? never\n : T;\ntype FlattenRelations<T> = {\n [K in keyof T]: IsArrayRelation<T[K]> extends true\n ? FlattenArrayRelation<T[K]>\n : IsObjectRelation<T[K]> extends true\n ? XOR<FlattenObjectRelation<T[K]>, T[K]>\n : StripPrismaFilters<T[K]> extends never\n ? never\n : T[K] extends object\n ? T[K] extends Date | null | undefined\n ? T[K]\n : FlattenRelations<StripPrismaFilters<T[K]>>\n : StripPrismaFilters<T[K]>;\n};\n/**\n * Flattens Prisma relation inputs into a simpler, developer-friendly format\n *\n * Transforms Prisma's nested relation format:\n * ```typescript\n * { posts: { create: [...], connect: [...], update: [...] } }\n * ```\n *\n * Into a flattened format with optional apiAction discriminators:\n * ```typescript\n * { posts: [\n * { title: \"New Post\" }, // auto-detected as create\n * { id: 1 }, // auto-detected as connect\n * { id: 2, title: \"Updated\", apiAction: \"update\" }\n * ]}\n * ```\n *\n * @see {@link https://wwww.arkosjs.com/docs/reference/arkos-prisma-input}\n * @template T - The Prisma input type (e.g., Prisma.UserCreateInput)\n * @returns A flattened version of the input type with simplified relation handling\n */\nexport type ArkosPrismaInput<T> = FlattenRelations<T>;\n"]}
1
+ {"version":3,"file":"arkos-prisma-input.js","sourceRoot":"","sources":["../../../src/types/arkos-prisma-input.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Helper type to exclude properties from T that exist in U\n * Used internally by XOR to create mutually exclusive types\n */\ntype Without<T, U> = {\n [P in Exclude<keyof T, keyof U>]?: never;\n};\n/**\n * XOR (Exclusive OR) type for mutually exclusive union types\n * Ensures that properties from T and U cannot be mixed together\n * @see https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\ntype XOR<T, U> = T extends object\n ? U extends object\n ? (Without<T, U> & U) | (Without<U, T> & T)\n : U\n : T;\ntype Unpack<T> = T;\n/**\n * Checks if a field is an array relation (one-to-many or many-to-many)\n * Identified by the presence of createMany property\n */\nexport type IsArrayRelation<T> =\n Exclude<T, undefined> extends never\n ? false\n : Exclude<T, undefined> extends { createMany?: any }\n ? true\n : false;\n/**\n * Checks if a field is an object relation (one-to-one or many-to-one)\n * Identified by the presence of relation operations without being an array\n */\nexport type IsObjectRelation<T> =\n Exclude<T, undefined> extends Array<any>\n ? false\n : Exclude<T, undefined> extends\n | {\n create?: any;\n }\n | {\n connect?: any;\n }\n | {\n connectOrCreate?: any;\n }\n | {\n update?: any;\n }\n | {\n delete?: any;\n }\n | {\n disconnect?: any;\n }\n ? true\n : false;\ntype ExtractCreateTypeArray<T> =\n Exclude<T, undefined> extends {\n create?: infer C;\n }\n ? Extract<C, Array<any>> extends Array<infer U>\n ? U extends Array<infer I>\n ? (Omit<I, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n })[]\n : (Omit<U, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n })[]\n : never\n : never;\ntype ExtractConnectTypeArray<\n T,\n A extends\n | \"connect\"\n | \"delete\"\n | \"update\"\n | \"disconnect\"\n | \"deleteMany\"\n | \"set\",\n> =\n Exclude<T, undefined> extends {\n [k in A]?: infer C;\n }\n ? Extract<C, Array<any>> extends Array<infer U>\n ? (Omit<U, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: A;\n })[]\n : never\n : never;\ntype ExtractUpdateTypeArray<T> =\n Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n update?: infer U;\n }\n ? U extends Array<infer UpdateItem>\n ? UpdateItem extends {\n where: infer W;\n data: infer D;\n }\n ? ((W & D) & {\n apiAction?: \"update\";\n })[]\n : never\n : U extends {\n where: infer W;\n data: infer D;\n }\n ? ((W & D) & {\n apiAction?: \"update\";\n })[]\n : never\n : never\n : never;\ntype ExtractCreateTypeObject<T> =\n Exclude<T, undefined> extends {\n create?: infer C;\n }\n ? Exclude<\n Extract<Exclude<C, undefined>, object>,\n Array<any>\n > extends infer Obj\n ? Obj extends object\n ? Omit<Obj, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n }\n : never\n : never\n : never;\ntype ExtractConnectTypeObject<\n T,\n A extends \"connect\" | \"delete\" | \"update\" | \"disconnect\",\n> =\n Exclude<T, undefined> extends {\n [k in A]?: infer C;\n }\n ? Exclude<\n Extract<Exclude<C, undefined>, object>,\n Array<any>\n > extends infer Obj\n ? Obj extends object\n ? Omit<Obj, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: A;\n }\n : never\n : never\n : never;\ntype ExtractUpdateTypeObject<T> =\n Exclude<T, undefined> extends {\n update?: infer U;\n }\n ? U extends {\n where: infer W;\n data: infer D;\n }\n ? (W & D) & {\n apiAction?: \"update\";\n }\n : Exclude<Extract<U, object>, Array<any>> & {\n apiAction?: \"update\";\n }\n : never;\ntype FlattenArrayRelation<T> =\n | (ExtractCreateTypeArray<T> extends never\n ? never\n : FlattenRelations<ExtractCreateTypeArray<T>>)\n | (ExtractConnectTypeArray<T, \"connect\"> extends never\n ? never\n : FlattenRelations<ExtractConnectTypeArray<T, \"connect\">>)\n | (ExtractUpdateTypeArray<T> extends never\n ? never\n : FlattenRelations<ExtractUpdateTypeArray<T>>)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n delete?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"delete\">> & {\n apiAction: \"delete\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n disconnect?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"disconnect\">> & {\n apiAction: \"disconnect\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n set?: infer S;\n }\n ? Unpack<S> & {\n apiAction?: \"set\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n deleteMany?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"deleteMany\">> & {\n apiAction: \"deleteMany\";\n }\n : never\n : never);\ntype FlattenObjectRelation<T> =\n | (ExtractCreateTypeObject<T> extends never\n ? never\n : FlattenRelations<ExtractCreateTypeObject<T>>)\n | (ExtractConnectTypeObject<T, \"connect\"> extends never\n ? never\n : FlattenRelations<ExtractConnectTypeObject<T, \"connect\">>)\n | (ExtractUpdateTypeObject<T> extends never\n ? never\n : FlattenRelations<ExtractUpdateTypeObject<T>>)\n | (Exclude<T, undefined> extends {\n delete?: any;\n }\n ? FlattenRelations<ExtractConnectTypeObject<T, \"delete\">> & {\n apiAction: \"delete\";\n }\n : never)\n | (Exclude<T, undefined> extends {\n disconnect?: any;\n }\n ? FlattenRelations<ExtractConnectTypeObject<T, \"disconnect\">> & {\n apiAction: \"disconnect\";\n }\n : never)\n | (Exclude<T, undefined> extends {\n set?: infer S;\n }\n ? Unpack<S> & {\n apiAction?: \"set\";\n }\n : never);\ntype StripPrismaFilters<T> = T extends\n | { equals?: any }\n | { in?: any }\n | { notIn?: any }\n | { lt?: any }\n | { lte?: any }\n | { gt?: any }\n | { gte?: any }\n | { AND?: any }\n | { OR?: any }\n | { NOT?: any }\n ? Omit<\n T,\n | \"equals\"\n | \"in\"\n | \"notIn\"\n | \"lt\"\n | \"lte\"\n | \"gt\"\n | \"gte\"\n | \"AND\"\n | \"OR\"\n | \"NOT\"\n >\n : T;\n\ntype StripToScalar<T> = T extends\n | string\n | number\n | boolean\n | Date\n | null\n | undefined\n ? T\n : never;\n\ntype FlattenRelations<T> = {\n [K in keyof T]: IsArrayRelation<T[K]> extends true\n ? FlattenArrayRelation<T[K]> | undefined\n : IsObjectRelation<T[K]> extends true\n ? XOR<FlattenObjectRelation<T[K]> | undefined, T[K]>\n : StripPrismaFilters<T[K]> extends never\n ? never\n : T[K] extends object\n ? T[K] extends Date | null | undefined\n ? T[K]\n : FlattenRelations<StripPrismaFilters<T[K]>> | undefined\n : StripToScalar<T[K]> extends never\n ? StripPrismaFilters<T[K]>\n : StripToScalar<T[K]>;\n};\n/**\n * Flattens Prisma relation inputs into a simpler, developer-friendly format\n *\n * Transforms Prisma's nested relation format:\n * ```typescript\n * { posts: { create: [...], connect: [...], update: [...] } }\n * ```\n *\n * Into a flattened format with optional apiAction discriminators:\n * ```typescript\n * { posts: [\n * { title: \"New Post\" }, // auto-detected as create\n * { id: 1 }, // auto-detected as connect\n * { id: 2, title: \"Updated\", apiAction: \"update\" }\n * ]}\n * ```\n *\n * @see {@link https://wwww.arkosjs.com/docs/reference/arkos-prisma-input}\n * @template T - The Prisma input type (e.g., Prisma.UserCreateInput)\n * @returns A flattened version of the input type with simplified relation handling\n */\nexport type ArkosPrismaInput<T> = FlattenRelations<T>;\n"]}