@skalfa/skalfa-api-core 1.0.3 → 1.0.7

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 (272) hide show
  1. package/CONTRIBUTING.md +45 -0
  2. package/LICENSE +21 -0
  3. package/README.md +60 -0
  4. package/dist/auth/auth.d.ts +18 -15
  5. package/dist/auth/auth.js +20 -203
  6. package/dist/auth/auth.js.map +1 -1
  7. package/dist/auth/create-access-token.d.ts +4 -0
  8. package/dist/auth/create-access-token.js +26 -0
  9. package/dist/auth/create-access-token.js.map +1 -0
  10. package/dist/auth/create-user-mail-token.d.ts +4 -0
  11. package/dist/auth/create-user-mail-token.js +19 -0
  12. package/dist/auth/create-user-mail-token.js.map +1 -0
  13. package/dist/auth/helpers/generate-agent-id.d.ts +1 -0
  14. package/dist/auth/helpers/generate-agent-id.js +7 -0
  15. package/dist/auth/helpers/generate-agent-id.js.map +1 -0
  16. package/dist/auth/helpers/get-request-ip.d.ts +1 -0
  17. package/dist/auth/helpers/get-request-ip.js +4 -0
  18. package/dist/auth/helpers/get-request-ip.js.map +1 -0
  19. package/dist/auth/helpers/get-user-permissions.d.ts +1 -0
  20. package/dist/auth/helpers/get-user-permissions.js +9 -0
  21. package/dist/auth/helpers/get-user-permissions.js.map +1 -0
  22. package/dist/auth/helpers/index.d.ts +3 -0
  23. package/dist/auth/helpers/index.js +4 -0
  24. package/dist/auth/helpers/index.js.map +1 -0
  25. package/dist/auth/list-user-sessions.d.ts +1 -0
  26. package/dist/auth/list-user-sessions.js +10 -0
  27. package/dist/auth/list-user-sessions.js.map +1 -0
  28. package/dist/auth/revalidate-user-permissions-by-role.d.ts +1 -0
  29. package/dist/auth/revalidate-user-permissions-by-role.js +12 -0
  30. package/dist/auth/revalidate-user-permissions-by-role.js.map +1 -0
  31. package/dist/auth/revalidate-user-permissions.d.ts +1 -0
  32. package/dist/auth/revalidate-user-permissions.js +21 -0
  33. package/dist/auth/revalidate-user-permissions.js.map +1 -0
  34. package/dist/auth/revoke-access-token.d.ts +1 -0
  35. package/dist/auth/revoke-access-token.js +5 -0
  36. package/dist/auth/revoke-access-token.js.map +1 -0
  37. package/dist/auth/verify-access-token.d.ts +1 -0
  38. package/dist/auth/verify-access-token.js +47 -0
  39. package/dist/auth/verify-access-token.js.map +1 -0
  40. package/dist/auth/verify-user-mail-token.d.ts +1 -0
  41. package/dist/auth/verify-user-mail-token.js +21 -0
  42. package/dist/auth/verify-user-mail-token.js.map +1 -0
  43. package/dist/commands/cli.js +5 -3
  44. package/dist/commands/cli.js.map +1 -1
  45. package/dist/commands/make/basic-controller.js +1 -1
  46. package/dist/commands/make/basic-controller.js.map +1 -1
  47. package/dist/commands/make/basic-migration.d.ts +1 -1
  48. package/dist/commands/make/basic-migration.js +2 -2
  49. package/dist/commands/make/basic-migration.js.map +1 -1
  50. package/dist/commands/make/basic-model.js +1 -1
  51. package/dist/commands/make/basic-model.js.map +1 -1
  52. package/dist/commands/make/basic-seeder.js +1 -1
  53. package/dist/commands/make/basic-seeder.js.map +1 -1
  54. package/dist/commands/make/blueprint.js +1 -1
  55. package/dist/commands/make/blueprint.js.map +1 -1
  56. package/dist/commands/make/da-migration.js +3 -3
  57. package/dist/commands/make/da-migration.js.map +1 -1
  58. package/dist/commands/make/mail.js +2 -2
  59. package/dist/commands/make/mail.js.map +1 -1
  60. package/dist/commands/make/notification.js +1 -1
  61. package/dist/commands/make/notification.js.map +1 -1
  62. package/dist/commands/make/queue.js +1 -1
  63. package/dist/commands/make/queue.js.map +1 -1
  64. package/dist/commands/make/resource.d.ts +2 -0
  65. package/dist/commands/make/resource.js +19 -0
  66. package/dist/commands/make/resource.js.map +1 -0
  67. package/dist/commands/make/{light-controller.js → skalfa-controller.js} +3 -3
  68. package/dist/commands/make/skalfa-controller.js.map +1 -0
  69. package/dist/commands/make/{light-model.js → skalfa-model.js} +4 -4
  70. package/dist/commands/make/skalfa-model.js.map +1 -0
  71. package/dist/commands/runner/barrels.js.map +1 -1
  72. package/dist/commands/runner/blueprint/controller-generation.js.map +1 -1
  73. package/dist/commands/runner/blueprint/documentation-generation.js.map +1 -1
  74. package/dist/commands/runner/blueprint/migration-generation.js +1 -1
  75. package/dist/commands/runner/blueprint/migration-generation.js.map +1 -1
  76. package/dist/commands/runner/blueprint/model-generation.js.map +1 -1
  77. package/dist/commands/runner/blueprint/runner.js +2 -2
  78. package/dist/commands/runner/blueprint/runner.js.map +1 -1
  79. package/dist/commands/runner/blueprint/seeder-generation.js +1 -1
  80. package/dist/commands/runner/blueprint/seeder-generation.js.map +1 -1
  81. package/dist/commands/runner/da-migration.js +1 -2
  82. package/dist/commands/runner/da-migration.js.map +1 -1
  83. package/dist/commands/runner/migration.js +1 -1
  84. package/dist/commands/runner/migration.js.map +1 -1
  85. package/dist/commands/runner/seeder.js +1 -1
  86. package/dist/commands/runner/seeder.js.map +1 -1
  87. package/dist/context/context.js +6 -0
  88. package/dist/context/context.js.map +1 -1
  89. package/dist/controller/controller.d.ts +17 -30
  90. package/dist/controller/controller.js +39 -121
  91. package/dist/controller/controller.js.map +1 -1
  92. package/dist/controller/response.d.ts +6 -0
  93. package/dist/controller/response.js +63 -0
  94. package/dist/controller/response.js.map +1 -0
  95. package/dist/controller/storage.d.ts +9 -0
  96. package/dist/controller/storage.js +56 -0
  97. package/dist/controller/storage.js.map +1 -0
  98. package/dist/conversion/conversion.d.ts +3 -0
  99. package/dist/conversion/conversion.js +28 -4
  100. package/dist/conversion/conversion.js.map +1 -1
  101. package/dist/conversion/date.d.ts +1 -0
  102. package/dist/conversion/date.js +77 -0
  103. package/dist/conversion/date.js.map +1 -0
  104. package/dist/index.d.ts +2 -0
  105. package/dist/index.js +2 -0
  106. package/dist/index.js.map +1 -1
  107. package/dist/logger/logger.js +33 -0
  108. package/dist/logger/logger.js.map +1 -1
  109. package/dist/mail/mail.js +6 -6
  110. package/dist/mail/mail.js.map +1 -1
  111. package/dist/middleware/access-log.d.ts +31 -0
  112. package/dist/middleware/access-log.js +13 -0
  113. package/dist/middleware/access-log.js.map +1 -0
  114. package/dist/middleware/auth.d.ts +37 -0
  115. package/dist/middleware/auth.js +16 -0
  116. package/dist/middleware/auth.js.map +1 -0
  117. package/dist/middleware/body-parse.d.ts +35 -0
  118. package/dist/middleware/body-parse.js +87 -0
  119. package/dist/middleware/body-parse.js.map +1 -0
  120. package/dist/middleware/context.d.ts +29 -0
  121. package/dist/middleware/context.js +8 -0
  122. package/dist/middleware/context.js.map +1 -0
  123. package/dist/middleware/cors.d.ts +31 -0
  124. package/dist/middleware/cors.js +27 -0
  125. package/dist/middleware/cors.js.map +1 -0
  126. package/dist/middleware/error-handler.d.ts +33 -0
  127. package/dist/middleware/error-handler.js +17 -0
  128. package/dist/middleware/error-handler.js.map +1 -0
  129. package/dist/middleware/middleware.d.ts +31 -10
  130. package/dist/middleware/middleware.js +41 -209
  131. package/dist/middleware/middleware.js.map +1 -1
  132. package/dist/middleware/private.d.ts +29 -0
  133. package/dist/middleware/private.js +8 -0
  134. package/dist/middleware/private.js.map +1 -0
  135. package/dist/middleware/rate-limiter.d.ts +32 -0
  136. package/dist/middleware/rate-limiter.js +30 -0
  137. package/dist/middleware/rate-limiter.js.map +1 -0
  138. package/dist/notification/index.d.ts +1 -0
  139. package/dist/notification/index.js +2 -0
  140. package/dist/notification/index.js.map +1 -0
  141. package/dist/notification/notification.d.ts +16 -0
  142. package/dist/notification/notification.js +64 -0
  143. package/dist/notification/notification.js.map +1 -0
  144. package/dist/permission/permission.js +9 -0
  145. package/dist/permission/permission.js.map +1 -1
  146. package/dist/registry/registry.d.ts +0 -6
  147. package/dist/registry/registry.js +6 -6
  148. package/dist/registry/registry.js.map +1 -1
  149. package/dist/storage/storage.d.ts +3 -3
  150. package/dist/storage/storage.js.map +1 -1
  151. package/dist/validation/validation.js +43 -51
  152. package/dist/validation/validation.js.map +1 -1
  153. package/package.json +4 -4
  154. package/src/auth/auth.ts +21 -252
  155. package/src/auth/create-access-token.ts +29 -0
  156. package/src/auth/create-user-mail-token.ts +24 -0
  157. package/src/auth/helpers/generate-agent-id.ts +8 -0
  158. package/src/auth/helpers/get-request-ip.ts +3 -0
  159. package/src/auth/helpers/get-user-permissions.ts +15 -0
  160. package/src/auth/helpers/index.ts +3 -0
  161. package/src/auth/list-user-sessions.ts +11 -0
  162. package/src/auth/revalidate-user-permissions-by-role.ts +13 -0
  163. package/src/auth/revalidate-user-permissions.ts +26 -0
  164. package/src/auth/revoke-access-token.ts +5 -0
  165. package/src/auth/verify-access-token.ts +56 -0
  166. package/src/auth/verify-user-mail-token.ts +24 -0
  167. package/src/commands/cli.ts +5 -3
  168. package/src/commands/make/basic-controller.ts +3 -1
  169. package/src/commands/make/basic-migration.ts +5 -3
  170. package/src/commands/make/basic-model.ts +3 -1
  171. package/src/commands/make/basic-seeder.ts +3 -1
  172. package/src/commands/make/blueprint.ts +3 -1
  173. package/src/commands/make/da-migration.ts +6 -5
  174. package/src/commands/make/mail.ts +4 -2
  175. package/src/commands/make/notification.ts +3 -1
  176. package/src/commands/make/queue.ts +3 -1
  177. package/src/commands/make/resource.ts +21 -0
  178. package/src/commands/make/{light-controller.ts → skalfa-controller.ts} +4 -2
  179. package/src/commands/make/{light-model.ts → skalfa-model.ts} +5 -3
  180. package/src/commands/runner/barrels.ts +4 -0
  181. package/src/commands/runner/blueprint/controller-generation.ts +2 -0
  182. package/src/commands/runner/blueprint/documentation-generation.ts +2 -0
  183. package/src/commands/runner/blueprint/migration-generation.ts +3 -1
  184. package/src/commands/runner/blueprint/model-generation.ts +2 -0
  185. package/src/commands/runner/blueprint/runner.ts +10 -2
  186. package/src/commands/runner/blueprint/seeder-generation.ts +3 -1
  187. package/src/commands/runner/da-migration.ts +3 -2
  188. package/src/commands/runner/migration.ts +1 -1
  189. package/src/commands/runner/seeder.ts +1 -1
  190. package/src/context/context.ts +23 -17
  191. package/src/controller/controller.ts +124 -239
  192. package/src/controller/response.ts +78 -0
  193. package/src/controller/storage.ts +78 -0
  194. package/src/conversion/conversion.ts +90 -64
  195. package/src/conversion/date.ts +74 -0
  196. package/src/index.ts +2 -0
  197. package/src/logger/logger.ts +217 -176
  198. package/src/mail/mail.ts +85 -85
  199. package/src/middleware/access-log.ts +15 -0
  200. package/src/middleware/auth.ts +19 -0
  201. package/src/middleware/body-parse.ts +83 -0
  202. package/src/middleware/context.ts +11 -0
  203. package/src/middleware/cors.ts +31 -0
  204. package/src/middleware/error-handler.ts +20 -0
  205. package/src/middleware/middleware.ts +91 -288
  206. package/src/middleware/private.ts +8 -0
  207. package/src/middleware/rate-limiter.ts +41 -0
  208. package/src/notification/index.ts +1 -0
  209. package/src/notification/notification.ts +86 -0
  210. package/src/permission/permission.ts +140 -136
  211. package/src/registry/registry.ts +17 -15
  212. package/src/route/route.ts +11 -11
  213. package/src/storage/storage.ts +104 -106
  214. package/src/validation/validation.ts +322 -346
  215. package/dist/auth.util.d.ts +0 -19
  216. package/dist/auth.util.js +0 -183
  217. package/dist/auth.util.js.map +0 -1
  218. package/dist/commands/make/light-controller.js.map +0 -1
  219. package/dist/commands/make/light-model.js.map +0 -1
  220. package/dist/context.util.d.ts +0 -7
  221. package/dist/context.util.js +0 -11
  222. package/dist/context.util.js.map +0 -1
  223. package/dist/controller.util.d.ts +0 -118
  224. package/dist/controller.util.js +0 -144
  225. package/dist/controller.util.js.map +0 -1
  226. package/dist/conversion.util.d.ts +0 -8
  227. package/dist/conversion.util.js +0 -52
  228. package/dist/conversion.util.js.map +0 -1
  229. package/dist/db/db.d.ts +0 -84
  230. package/dist/db/db.js +0 -177
  231. package/dist/db/db.js.map +0 -1
  232. package/dist/db/index.d.ts +0 -1
  233. package/dist/db/index.js +0 -2
  234. package/dist/db/index.js.map +0 -1
  235. package/dist/db.util.d.ts +0 -84
  236. package/dist/db.util.js +0 -177
  237. package/dist/db.util.js.map +0 -1
  238. package/dist/logger.util.d.ts +0 -30
  239. package/dist/logger.util.js +0 -126
  240. package/dist/logger.util.js.map +0 -1
  241. package/dist/mail.util.d.ts +0 -21
  242. package/dist/mail.util.js +0 -53
  243. package/dist/mail.util.js.map +0 -1
  244. package/dist/middleware.util.d.ts +0 -263
  245. package/dist/middleware.util.js +0 -233
  246. package/dist/middleware.util.js.map +0 -1
  247. package/dist/model/index.d.ts +0 -3
  248. package/dist/model/index.js +0 -4
  249. package/dist/model/index.js.map +0 -1
  250. package/dist/model/model.d.ts +0 -204
  251. package/dist/model/model.js +0 -1495
  252. package/dist/model/model.js.map +0 -1
  253. package/dist/model.util.d.ts +0 -204
  254. package/dist/model.util.js +0 -1495
  255. package/dist/model.util.js.map +0 -1
  256. package/dist/permission.util.d.ts +0 -38
  257. package/dist/permission.util.js +0 -91
  258. package/dist/permission.util.js.map +0 -1
  259. package/dist/registry.util.d.ts +0 -28
  260. package/dist/registry.util.js +0 -19
  261. package/dist/registry.util.js.map +0 -1
  262. package/dist/route.util.d.ts +0 -1
  263. package/dist/route.util.js +0 -12
  264. package/dist/route.util.js.map +0 -1
  265. package/dist/storage.util.d.ts +0 -56
  266. package/dist/storage.util.js +0 -82
  267. package/dist/storage.util.js.map +0 -1
  268. package/dist/validation.util.d.ts +0 -7
  269. package/dist/validation.util.js +0 -237
  270. package/dist/validation.util.js.map +0 -1
  271. /package/dist/commands/make/{light-controller.d.ts → skalfa-controller.d.ts} +0 -0
  272. /package/dist/commands/make/{light-model.d.ts → skalfa-model.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACpE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IAEvD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IAEzG,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE5D,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAEjE,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { Elysia } from 'elysia';
2
+ export declare const BodyParse: (app: Elysia) => Elysia<"", {
3
+ decorator: {};
4
+ store: {
5
+ rawBody?: any;
6
+ };
7
+ derive: {};
8
+ resolve: {};
9
+ }, {
10
+ typebox: {};
11
+ error: {};
12
+ }, {
13
+ schema: {};
14
+ standaloneSchema: {};
15
+ macro: {};
16
+ macroFn: {};
17
+ parser: {};
18
+ response: {};
19
+ }, {}, {
20
+ derive: {};
21
+ resolve: {};
22
+ schema: {};
23
+ standaloneSchema: {};
24
+ response: {};
25
+ }, {
26
+ derive: {
27
+ readonly payload: any;
28
+ };
29
+ resolve: {};
30
+ schema: {};
31
+ standaloneSchema: {};
32
+ response: import("elysia").ExtractErrorFromHandle<{
33
+ readonly payload: any;
34
+ }>;
35
+ }>;
@@ -0,0 +1,87 @@
1
+ import { status } from 'elysia';
2
+ import { logger } from '@utils';
3
+ import { errors } from './middleware';
4
+ export const BodyParse = (app) => app.state({}).onRequest(async ({ request, store }) => {
5
+ const text = await request.clone().text();
6
+ const contentType = request.headers.get("content-type") || "";
7
+ let rawBody = {};
8
+ try {
9
+ if (contentType.includes("application/json")) {
10
+ rawBody = text ? JSON.parse(text) : {};
11
+ }
12
+ else if (contentType.includes("application/x-www-form-urlencoded")) {
13
+ const params = new URLSearchParams(text);
14
+ for (const [key, value] of params.entries())
15
+ bodyParseNestedSet(rawBody, key, value);
16
+ }
17
+ else if (contentType.includes("multipart/form-data")) {
18
+ const formData = await request.clone().formData();
19
+ for (const [key, value] of formData.entries())
20
+ bodyParseNestedSet(rawBody, key, value);
21
+ }
22
+ else {
23
+ rawBody = {};
24
+ }
25
+ }
26
+ catch (e) {
27
+ const em = e instanceof Error ? e.message : String(e);
28
+ logger.error(`Body parse error: ${em}`, { error: em });
29
+ rawBody = {};
30
+ throw status(errors.request.status, { message: errors.request.message });
31
+ }
32
+ store.rawBody = rawBody;
33
+ }).derive(({ store }) => {
34
+ const payload = bodyParseKeyFormat(store.rawBody || {});
35
+ return { payload };
36
+ });
37
+ function bodyParseKeyFormat(input) {
38
+ if (typeof input !== "object" || input === null || input instanceof File)
39
+ return input;
40
+ if (Array.isArray(input))
41
+ return input.map(bodyParseKeyFormat);
42
+ const result = {};
43
+ for (const [key, value] of Object.entries(input)) {
44
+ if (key.includes(".") || key.includes("[")) {
45
+ bodyParseNestedSet(result, key, bodyParseKeyFormat(value));
46
+ }
47
+ else {
48
+ result[key] = bodyParseKeyFormat(value);
49
+ }
50
+ }
51
+ return result;
52
+ }
53
+ function bodyParseNestedSet(obj, path, value) {
54
+ const parts = bodyParsePathFormat(path);
55
+ let current = obj;
56
+ for (let i = 0; i < parts.length; i++) {
57
+ const key = parts[i];
58
+ const isLast = i === parts.length - 1;
59
+ if (isLast) {
60
+ current[key] = bodyParseValueFormat(value);
61
+ }
62
+ else {
63
+ if (!(key in current)) {
64
+ const nextKey = parts[i + 1];
65
+ current[key] = isNaN(Number(nextKey)) ? {} : [];
66
+ }
67
+ current = current[key];
68
+ }
69
+ }
70
+ }
71
+ function bodyParsePathFormat(path) {
72
+ return path.replace(/\[(\w+)\]/g, ".$1").replace(/^\./, "").split(".");
73
+ }
74
+ function bodyParseValueFormat(value) {
75
+ if (value == "" || value == null || value == "null")
76
+ return null;
77
+ if (typeof value !== "string")
78
+ return value;
79
+ if (value === "true")
80
+ return true;
81
+ if (value === "false")
82
+ return false;
83
+ if (!isNaN(Number(value)))
84
+ return Number(value);
85
+ return value;
86
+ }
87
+ //# sourceMappingURL=body-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-parse.js","sourceRoot":"","sources":["../../src/middleware/body-parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { Elysia } from 'elysia';
2
+ export declare const ContextMiddleware: (app: Elysia) => Elysia<"", {
3
+ decorator: {};
4
+ store: {};
5
+ derive: {};
6
+ resolve: {};
7
+ }, {
8
+ typebox: {};
9
+ error: {};
10
+ }, {
11
+ schema: {};
12
+ standaloneSchema: {};
13
+ macro: {};
14
+ macroFn: {};
15
+ parser: {};
16
+ response: {};
17
+ }, {}, {
18
+ derive: {};
19
+ resolve: {};
20
+ schema: {};
21
+ standaloneSchema: {};
22
+ response: {};
23
+ }, {
24
+ derive: {};
25
+ resolve: {};
26
+ schema: {};
27
+ standaloneSchema: {};
28
+ response: import("elysia").ExtractErrorFromHandle<{}>;
29
+ }>;
@@ -0,0 +1,8 @@
1
+ import { context } from '@utils';
2
+ export const ContextMiddleware = (app) => app.derive(async ({ store }) => {
3
+ const userId = store?.user?.id;
4
+ return context.run({
5
+ user_id: userId,
6
+ }, () => ({}));
7
+ });
8
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/middleware/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IAC/E,MAAM,MAAM,GAAI,KAAa,EAAE,IAAI,EAAE,EAAE,CAAA;IAEvC,OAAO,OAAO,CAAC,GAAG,CAAC;QACf,OAAO,EAAE,MAAM;KAChB,EAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CACb,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { Elysia } from 'elysia';
2
+ export declare const Cors: (app: Elysia) => Elysia<"", {
3
+ decorator: {};
4
+ store: {};
5
+ derive: {};
6
+ resolve: {};
7
+ }, {
8
+ typebox: {};
9
+ error: {};
10
+ }, {
11
+ schema: {};
12
+ standaloneSchema: {};
13
+ macro: {};
14
+ macroFn: {};
15
+ parser: {};
16
+ response: {};
17
+ }, {}, {
18
+ derive: {};
19
+ resolve: {};
20
+ schema: {};
21
+ standaloneSchema: {};
22
+ response: {};
23
+ }, {
24
+ derive: {};
25
+ resolve: {};
26
+ schema: {};
27
+ standaloneSchema: {};
28
+ response: {
29
+ 200: Response;
30
+ };
31
+ }>;
@@ -0,0 +1,27 @@
1
+ import { logger } from '@utils';
2
+ export const Cors = (app) => app.onRequest(({ request, set }) => {
3
+ const origin = request.headers.get('origin') ?? '';
4
+ let allowedOrigin = '*';
5
+ const originsConf = process.env.APP_CORS_ORIGINS || '*';
6
+ if (originsConf !== '*') {
7
+ try {
8
+ const allowedOrigins = JSON.parse(originsConf);
9
+ if (Array.isArray(allowedOrigins) && allowedOrigins.includes(origin)) {
10
+ allowedOrigin = origin || "";
11
+ }
12
+ }
13
+ catch (e) {
14
+ const em = 'Cors Error: Failed to parse APP_CORS_ORIGINS, fallback to "*"';
15
+ logger.error(em, { error: em });
16
+ allowedOrigin = '';
17
+ }
18
+ }
19
+ set.headers['Access-Control-Allow-Origin'] = allowedOrigin;
20
+ set.headers['Access-Control-Allow-Methods'] = process.env.APP_CORS_METHODS || 'GET, POST, PUT, DELETE, OPTIONS';
21
+ set.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Option, x-App';
22
+ set.headers['Access-Control-Allow-Credentials'] = 'true';
23
+ if (request.method === 'OPTIONS') {
24
+ return new Response(null, { status: 204, });
25
+ }
26
+ });
27
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;IACtE,MAAM,MAAM,GAAyB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IACxE,IAAI,aAAa,GAAoB,GAAG,CAAA;IAExC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAA;IAEvD,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;YAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,aAAa,GAAG,MAAM,IAAI,EAAE,CAAA;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,EAAE,GAAG,+DAA+D,CAAA;YAC1E,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;YAC/B,aAAa,GAAG,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,GAAQ,aAAa,CAAA;IAC/D,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,GAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,iCAAiC,CAAA;IACnH,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,GAAO,gFAAgF,CAAA;IAClI,GAAG,CAAC,OAAO,CAAC,kCAAkC,CAAC,GAAG,MAAM,CAAA;IAExD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { Elysia } from 'elysia';
2
+ export declare const ErrorHandler: (app: Elysia) => Elysia<"", {
3
+ decorator: {};
4
+ store: {};
5
+ derive: {};
6
+ resolve: {};
7
+ }, {
8
+ typebox: {};
9
+ error: {};
10
+ }, {
11
+ schema: {};
12
+ standaloneSchema: {};
13
+ macro: {};
14
+ macroFn: {};
15
+ parser: {};
16
+ response: {};
17
+ }, {}, {
18
+ derive: {};
19
+ resolve: {};
20
+ schema: {};
21
+ standaloneSchema: {};
22
+ response: {};
23
+ }, {
24
+ derive: {};
25
+ resolve: {};
26
+ schema: {};
27
+ standaloneSchema: {};
28
+ response: {
29
+ 200: {
30
+ message: string;
31
+ };
32
+ };
33
+ }>;
@@ -0,0 +1,17 @@
1
+ import { logger } from '@utils';
2
+ import { errors } from './middleware';
3
+ export const ErrorHandler = (app) => app.onError(({ code, set, error, request }) => {
4
+ if (code === 'NOT_FOUND') {
5
+ set.status = errors.notfound.status;
6
+ return { message: errors.notfound.message };
7
+ }
8
+ if (code === 'INTERNAL_SERVER_ERROR') {
9
+ set.status = errors.error.status;
10
+ const em = error.message;
11
+ const url = new URL(request.url);
12
+ const path = url.pathname;
13
+ logger.error(`error: ${em}`, { error: em, reference: path });
14
+ return { message: em };
15
+ }
16
+ });
17
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;IACzF,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAA;QACnC,OAAO,EAAE,OAAO,EAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;IAC9C,CAAC;IAED,IAAI,IAAI,KAAK,uBAAuB,EAAE,CAAC;QACrC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAA;QAChC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAA;QACxB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAA;QAEzB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5D,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IACxB,CAAC;AACH,CAAC,CAAC,CAAA"}
@@ -1,4 +1,3 @@
1
- import { Elysia } from 'elysia';
2
1
  declare module "elysia" {
3
2
  interface Elysia {
4
3
  api(basePath: string, controller: {
@@ -10,8 +9,30 @@ declare module "elysia" {
10
9
  }): this;
11
10
  }
12
11
  }
12
+ export declare const errors: {
13
+ readonly unauthorized: {
14
+ readonly status: 401;
15
+ readonly message: "Unauthorized!";
16
+ };
17
+ readonly ratelimited: {
18
+ readonly status: 429;
19
+ readonly message: "Too many requests!";
20
+ };
21
+ readonly notfound: {
22
+ readonly status: 404;
23
+ readonly message: "Endpoint not found!";
24
+ };
25
+ readonly request: {
26
+ readonly status: 400;
27
+ readonly message: "Bad Request!";
28
+ };
29
+ readonly error: {
30
+ readonly status: 500;
31
+ readonly message: "Endpoint not found!";
32
+ };
33
+ };
13
34
  export declare const middleware: {
14
- Auth: (app: Elysia) => Elysia<"", {
35
+ Auth: (app: import("elysia").default) => import("elysia").default<"", {
15
36
  decorator: {};
16
37
  store: {};
17
38
  derive: {};
@@ -47,7 +68,7 @@ export declare const middleware: {
47
68
  readonly token: any;
48
69
  }>;
49
70
  }>;
50
- Private: (app: Elysia) => Elysia<"", {
71
+ Private: (app: import("elysia").default) => import("elysia").default<"", {
51
72
  decorator: {};
52
73
  store: {};
53
74
  derive: {};
@@ -75,7 +96,7 @@ export declare const middleware: {
75
96
  standaloneSchema: {};
76
97
  response: import("elysia").ExtractErrorFromHandle<void>;
77
98
  }>;
78
- Cors: (app: Elysia) => Elysia<"", {
99
+ Cors: (app: import("elysia").default) => import("elysia").default<"", {
79
100
  decorator: {};
80
101
  store: {};
81
102
  derive: {};
@@ -105,10 +126,10 @@ export declare const middleware: {
105
126
  200: Response;
106
127
  };
107
128
  }>;
108
- RateLimiter: (app: Elysia, options?: {
129
+ RateLimiter: (app: import("elysia").default, options?: {
109
130
  windowMs?: number;
110
131
  max?: number;
111
- }) => Elysia<"", {
132
+ }) => import("elysia").default<"", {
112
133
  decorator: {};
113
134
  store: {};
114
135
  derive: {};
@@ -136,7 +157,7 @@ export declare const middleware: {
136
157
  standaloneSchema: {};
137
158
  response: {};
138
159
  }>;
139
- BodyParse: (app: Elysia) => Elysia<"", {
160
+ BodyParse: (app: import("elysia").default) => import("elysia").default<"", {
140
161
  decorator: {};
141
162
  store: {
142
163
  rawBody?: any;
@@ -170,7 +191,7 @@ export declare const middleware: {
170
191
  readonly payload: any;
171
192
  }>;
172
193
  }>;
173
- AccessLog: (app: Elysia) => Elysia<"", {
194
+ AccessLog: (app: import("elysia").default) => import("elysia").default<"", {
174
195
  decorator: {};
175
196
  store: {
176
197
  startedAt?: number | undefined;
@@ -200,7 +221,7 @@ export declare const middleware: {
200
221
  standaloneSchema: {};
201
222
  response: {};
202
223
  }>;
203
- ErrorHandler: (app: Elysia) => Elysia<"", {
224
+ ErrorHandler: (app: import("elysia").default) => import("elysia").default<"", {
204
225
  decorator: {};
205
226
  store: {};
206
227
  derive: {};
@@ -232,7 +253,7 @@ export declare const middleware: {
232
253
  };
233
254
  };
234
255
  }>;
235
- Context: (app: Elysia) => Elysia<"", {
256
+ Context: (app: import("elysia").default) => import("elysia").default<"", {
236
257
  decorator: {};
237
258
  store: {};
238
259
  derive: {};
@@ -1,6 +1,12 @@
1
- import { status } from 'elysia';
2
- import { auth, context, logger } from '@utils';
3
- const errors = {
1
+ import { Auth } from './auth';
2
+ import { Private } from './private';
3
+ import { Cors } from './cors';
4
+ import { RateLimiter } from './rate-limiter';
5
+ import { BodyParse } from './body-parse';
6
+ import { AccessLog } from './access-log';
7
+ import { ErrorHandler } from './error-handler';
8
+ import { ContextMiddleware } from './context';
9
+ export const errors = {
4
10
  unauthorized: {
5
11
  status: 401,
6
12
  message: "Unauthorized!"
@@ -23,211 +29,37 @@ const errors = {
23
29
  }
24
30
  };
25
31
  export const middleware = {
26
- // =============================>
27
- // ## Middleware: Auth hand;er
28
- // =============================>
29
- Auth: (app) => app.derive(async ({ request }) => {
30
- const authHeader = request.headers.get('authorization');
31
- if (!authHeader || !authHeader.startsWith('Bearer '))
32
- return { user: null, permissions: [], token: null };
33
- const bearer = authHeader.substring(7).trim();
34
- const result = await auth.verifyAccessToken(bearer, request);
35
- if (!result)
36
- return { user: null, permissions: [], token: null };
37
- return {
38
- user: result.user,
39
- permissions: result.permissions,
40
- token: result.token,
41
- };
42
- }),
43
- // =============================>
44
- // ## Middleware: Private handler
45
- // =============================>
46
- Private: (app) => app.derive(async ({ user }) => {
47
- if (!user) {
48
- throw status(errors.unauthorized.status, { message: errors.unauthorized.message });
49
- }
50
- }),
51
- // =============================>
52
- // ## Middleware: Cors handler
53
- // =============================>
54
- Cors: (app) => app.onRequest(({ request, set }) => {
55
- const origin = request.headers.get('origin') ?? '';
56
- let allowedOrigin = '*';
57
- const originsConf = process.env.APP_CORS_ORIGINS || '*';
58
- if (originsConf !== '*') {
59
- try {
60
- const allowedOrigins = JSON.parse(originsConf);
61
- if (Array.isArray(allowedOrigins) && allowedOrigins.includes(origin)) {
62
- allowedOrigin = origin || "";
63
- }
64
- }
65
- catch (e) {
66
- const em = 'Cors Error: Failed to parse APP_CORS_ORIGINS, fallback to "*"';
67
- logger.error(em, { error: em });
68
- allowedOrigin = '';
69
- }
70
- }
71
- set.headers['Access-Control-Allow-Origin'] = allowedOrigin;
72
- set.headers['Access-Control-Allow-Methods'] = process.env.APP_CORS_METHODS || 'GET, POST, PUT, DELETE, OPTIONS';
73
- set.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Option, x-App';
74
- set.headers['Access-Control-Allow-Credentials'] = 'true';
75
- if (request.method === 'OPTIONS') {
76
- return new Response(null, { status: 204, });
77
- }
78
- }),
79
- // =============================>
80
- // ## Middleware: Rate limiter handler
81
- // =============================>
82
- RateLimiter: (app, options) => app.onRequest(({ request, set, store }) => {
83
- const max = options?.max || (process.env.APP_RATELIMIT_COUNTDOWN ? Number(process.env.APP_RATE_LIMIT) : 60);
84
- const windowMs = options?.windowMs || (process.env.APP_RATELIMIT_COUNTDOWN ? Number(process.env.APP_RATELIMIT_COUNTDOWN) : 60_000);
85
- const user = store?.user;
86
- const key = getClientKey(request, user?.id);
87
- const now = Date.now();
88
- let record = rateLimitStore.get(key);
89
- if (!record || record.expiresAt < now) {
90
- record = { count: 1, expiresAt: now + windowMs };
91
- rateLimitStore.set(key, record);
92
- }
93
- else {
94
- record.count++;
95
- }
96
- set.headers['X-RateLimit-Limit'] = String(max);
97
- set.headers['X-RateLimit-Remaining'] = String(Math.max(0, max - record.count));
98
- set.headers['X-RateLimit-Reset'] = String(record.expiresAt);
99
- if (record.count > max)
100
- throw status(errors.ratelimited.status, { message: errors.ratelimited.message });
101
- }),
102
- // =============================>
103
- // ## Middleware: Body parse handler
104
- // =============================>
105
- BodyParse: (app) => app.state({}).onRequest(async ({ request, store }) => {
106
- const text = await request.clone().text();
107
- const contentType = request.headers.get("content-type") || "";
108
- let rawBody = {};
109
- try {
110
- if (contentType.includes("application/json")) {
111
- rawBody = text ? JSON.parse(text) : {};
112
- }
113
- else if (contentType.includes("application/x-www-form-urlencoded")) {
114
- const params = new URLSearchParams(text);
115
- for (const [key, value] of params.entries())
116
- bodyParseNestedSet(rawBody, key, value);
117
- }
118
- else if (contentType.includes("multipart/form-data")) {
119
- const formData = await request.clone().formData();
120
- for (const [key, value] of formData.entries())
121
- bodyParseNestedSet(rawBody, key, value);
122
- }
123
- else {
124
- rawBody = {};
125
- }
126
- }
127
- catch (e) {
128
- const em = e instanceof Error ? e.message : String(e);
129
- logger.error(`Body parse error: ${em}`, { error: em });
130
- rawBody = {};
131
- throw status(errors.request.status, { message: errors.request.message });
132
- }
133
- store.rawBody = rawBody;
134
- }).derive(({ store }) => {
135
- const payload = bodyParseKeyFormat(store.rawBody || {});
136
- return { payload };
137
- }),
138
- AccessLog: (app) => app.state({}).onRequest(({ store }) => { store.startedAt = Date.now(); }).onAfterResponse(({ request, set, store }) => {
139
- const method = request.method;
140
- const url = new URL(request.url);
141
- const path = url.pathname;
142
- const status = Number(set.status) ?? 200;
143
- const latency = Date.now() - (store.startedAt ?? Date.now());
144
- const agent = request.headers.get("user-agent") || 'unknown';
145
- const ip = request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() || request.headers.get('cf-connecting-ip') || 'unknown';
146
- logger.info(`${method} : ${path} - ${status} - ${latency}ms - ${ip}]`);
147
- logger.access({ method, path, status, latency, ip, agent });
148
- }),
149
- // =============================>
150
- // ## Middleware: Error handler
151
- // =============================>
152
- ErrorHandler: (app) => app.onError(({ code, set, error, request }) => {
153
- if (code === 'NOT_FOUND') {
154
- set.status = errors.notfound.status;
155
- return { message: errors.notfound.message };
156
- }
157
- if (code === 'INTERNAL_SERVER_ERROR') {
158
- set.status = errors.error.status;
159
- const em = error.message;
160
- const url = new URL(request.url);
161
- const path = url.pathname;
162
- logger.error(`error: ${em}`, { error: em, reference: path });
163
- return { message: em };
164
- }
165
- }),
166
- Context: (app) => app.derive(async ({ store }) => {
167
- const userId = store?.user?.id;
168
- return context.run({
169
- user_id: userId,
170
- }, () => ({}));
171
- }),
32
+ // =====================================>
33
+ // ## Middleware: authenticate request token
34
+ // =====================================>
35
+ Auth,
36
+ // =====================================>
37
+ // ## Middleware: restrict access to private routes
38
+ // =====================================>
39
+ Private,
40
+ // =====================================>
41
+ // ## Middleware: handle CORS headers
42
+ // =====================================>
43
+ Cors,
44
+ // =====================================>
45
+ // ## Middleware: rate limit request threshold
46
+ // =====================================>
47
+ RateLimiter,
48
+ // =====================================>
49
+ // ## Middleware: parse request body formats
50
+ // =====================================>
51
+ BodyParse,
52
+ // =====================================>
53
+ // ## Middleware: log request access details
54
+ // =====================================>
55
+ AccessLog,
56
+ // =====================================>
57
+ // ## Middleware: handle global route errors
58
+ // =====================================>
59
+ ErrorHandler,
60
+ // =====================================>
61
+ // ## Middleware: initialize async local context
62
+ // =====================================>
63
+ Context: ContextMiddleware,
172
64
  };
173
- // =============================>
174
- // ## Middleware: Body parse helpers
175
- // =============================>
176
- function bodyParseKeyFormat(input) {
177
- if (typeof input !== "object" || input === null || input instanceof File)
178
- return input;
179
- if (Array.isArray(input))
180
- return input.map(bodyParseKeyFormat);
181
- const result = {};
182
- for (const [key, value] of Object.entries(input)) {
183
- if (key.includes(".") || key.includes("[")) {
184
- bodyParseNestedSet(result, key, bodyParseKeyFormat(value));
185
- }
186
- else {
187
- result[key] = bodyParseKeyFormat(value);
188
- }
189
- }
190
- return result;
191
- }
192
- function bodyParseNestedSet(obj, path, value) {
193
- const parts = bodyParsePathFormat(path);
194
- let current = obj;
195
- for (let i = 0; i < parts.length; i++) {
196
- const key = parts[i];
197
- const isLast = i === parts.length - 1;
198
- if (isLast) {
199
- current[key] = bodyParseValueFormat(value);
200
- }
201
- else {
202
- if (!(key in current)) {
203
- const nextKey = parts[i + 1];
204
- current[key] = isNaN(Number(nextKey)) ? {} : [];
205
- }
206
- current = current[key];
207
- }
208
- }
209
- }
210
- function bodyParsePathFormat(path) {
211
- return path.replace(/\[(\w+)\]/g, ".$1").replace(/^\./, "").split(".");
212
- }
213
- function bodyParseValueFormat(value) {
214
- if (value == "" || value == null || value == "null")
215
- return null;
216
- if (typeof value !== "string")
217
- return value;
218
- if (value === "true")
219
- return true;
220
- if (value === "false")
221
- return false;
222
- if (!isNaN(Number(value)))
223
- return Number(value);
224
- return value;
225
- }
226
- const rateLimitStore = new Map();
227
- function getClientKey(request, userId) {
228
- if (userId)
229
- return `user:${userId}`;
230
- const ip = request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() || request.headers.get('cf-connecting-ip') || 'unknown';
231
- return `ip:${ip}`;
232
- }
233
65
  //# sourceMappingURL=middleware.js.map