@koalarx/nest 1.19.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/package.json +5 -37
  3. package/src/core/backgroud-services/cron-service/cron-job.handler.base.ts +66 -0
  4. package/src/core/backgroud-services/cron-service/cron-job.handler.spec.ts +38 -0
  5. package/src/core/backgroud-services/event-service/event-class.ts +5 -0
  6. package/src/core/backgroud-services/event-service/event-handler.base.ts +17 -0
  7. package/src/core/backgroud-services/event-service/event-is-trigger.ts +3 -0
  8. package/src/core/backgroud-services/event-service/event-job.ts +28 -0
  9. package/src/core/backgroud-services/event-service/event-queue.spec.ts +47 -0
  10. package/src/core/backgroud-services/event-service/event-queue.ts +107 -0
  11. package/src/core/constants/query-params.ts +7 -0
  12. package/src/core/controllers/base.controller.ts +9 -0
  13. package/src/core/controllers/controller.decorator.ts +10 -0
  14. package/src/core/controllers/created-registre-response.base.ts +17 -0
  15. package/src/core/controllers/list-response.base.ts +8 -0
  16. package/src/core/controllers/pagination.request.ts +41 -0
  17. package/src/core/controllers/router-config.base.ts +14 -0
  18. package/src/core/controllers/schemas/boolean.schema.ts +10 -0
  19. package/src/core/controllers/schemas/document-number.schema.ts +23 -0
  20. package/src/core/controllers/schemas/email.schema.ts +13 -0
  21. package/src/core/controllers/schemas/list-query.schema.ts +17 -0
  22. package/src/core/controllers/schemas/native-enum.schema.ts +34 -0
  23. package/src/core/controllers/schemas/set-mask-document-number.schema.ts +13 -0
  24. package/src/core/database/entity.base.ts +95 -0
  25. package/src/core/database/entity.decorator.spec.ts +71 -0
  26. package/src/core/database/entity.decorator.ts +39 -0
  27. package/src/core/database/prisma-client-with-custom-transaction.interface.ts +13 -0
  28. package/src/core/database/prisma-resolver.ts +99 -0
  29. package/src/core/database/prisma-transactional-client.ts +43 -0
  30. package/src/core/database/prisma.service.ts +136 -0
  31. package/src/core/database/repository.base.ts +548 -0
  32. package/src/core/dtos/pagination.dto.ts +35 -0
  33. package/src/core/errors/bad-request.error.ts +8 -0
  34. package/src/core/errors/conflict.error.ts +7 -0
  35. package/src/core/errors/error.base.ts +5 -0
  36. package/src/core/errors/no-content.error.ts +8 -0
  37. package/src/core/errors/not-allowed.error.ts +8 -0
  38. package/src/core/errors/resource-not-found.error.ts +8 -0
  39. package/{core/errors/use-case-error.d.ts → src/core/errors/use-case-error.ts} +1 -1
  40. package/src/core/errors/user-already-exist.error.ts +7 -0
  41. package/src/core/errors/wrong-credentials.error.ts +7 -0
  42. package/src/core/health-check/health-check.controller.ts +13 -0
  43. package/src/core/health-check/health-check.module.ts +7 -0
  44. package/src/core/index.ts +56 -0
  45. package/src/core/koala-app.ts +379 -0
  46. package/src/core/koala-global-vars.ts +8 -0
  47. package/src/core/koala-nest-database.module.ts +65 -0
  48. package/src/core/koala-nest-http.module.ts +44 -0
  49. package/src/core/koala-nest.module.ts +67 -0
  50. package/src/core/mapping/auto-mapping-class-context.ts +28 -0
  51. package/src/core/mapping/auto-mapping-context.ts +26 -0
  52. package/src/core/mapping/auto-mapping-list.ts +154 -0
  53. package/src/core/mapping/auto-mapping-profile.ts +3 -0
  54. package/src/core/mapping/auto-mapping.decorator.ts +54 -0
  55. package/src/core/mapping/auto-mapping.module.ts +17 -0
  56. package/src/core/mapping/auto-mapping.service.ts +187 -0
  57. package/src/core/mapping/create-map.ts +11 -0
  58. package/src/core/mapping/for-member.ts +16 -0
  59. package/src/core/request-overflow/request-handler.base.ts +8 -0
  60. package/src/core/request-overflow/request-result.spec.ts +23 -0
  61. package/src/core/request-overflow/request-result.ts +41 -0
  62. package/src/core/request-overflow/request-validator.base.ts +33 -0
  63. package/src/core/security/strategies/api-key.strategy.ts +45 -0
  64. package/src/core/utils/assing-object.ts +9 -0
  65. package/src/core/utils/env.config.ts +17 -0
  66. package/src/core/utils/filter-request-params.ts +23 -0
  67. package/src/core/utils/find-on-list.ts +18 -0
  68. package/src/core/utils/get-type-by-prop.ts +9 -0
  69. package/src/core/utils/instanciate-class-with-dependencies-injection.ts +12 -0
  70. package/src/core/utils/interfaces/icomparable.ts +6 -0
  71. package/src/core/utils/list.spec.ts +81 -0
  72. package/src/core/utils/list.ts +223 -0
  73. package/src/core/utils/promise-all.ts +24 -0
  74. package/src/core/utils/set-mask-document-number.ts +13 -0
  75. package/src/core/validators/file-validator.ts +113 -0
  76. package/src/decorators/api-exclude-endpoint-diff-develop.decorator.ts +15 -0
  77. package/src/decorators/api-property-enum.decorator.ts +58 -0
  78. package/src/decorators/api-property-only-develop.decorator.ts +6 -0
  79. package/src/decorators/cookies.decorator.ts +8 -0
  80. package/src/decorators/is-public.decorator.ts +5 -0
  81. package/src/decorators/upload.decorator.ts +31 -0
  82. package/src/env/env.module.ts +8 -0
  83. package/src/env/env.service.ts +12 -0
  84. package/src/env/env.ts +14 -0
  85. package/src/filters/domain-errors.filter.ts +97 -0
  86. package/src/filters/global-exception.filter.ts +60 -0
  87. package/src/filters/prisma-validation-exception.filter.ts +73 -0
  88. package/src/filters/zod-errors.filter.ts +48 -0
  89. package/src/services/logging/ilogging.service.ts +17 -0
  90. package/src/services/logging/logging.service.ts +10 -0
  91. package/src/services/redis/iredis.service.ts +11 -0
  92. package/src/services/redis/redis.service.ts +70 -0
  93. package/src/services/redlock/ired-lock.service.ts +4 -0
  94. package/src/services/redlock/red-lock.service.ts +36 -0
  95. package/src/test/koala-app-test-dependencies.ts +15 -0
  96. package/src/test/koala-app-test.ts +103 -0
  97. package/src/test/repositories/in-memory-base.repository.ts +90 -0
  98. package/src/test/services/fake-logging.service.ts +7 -0
  99. package/src/test/services/fake-red-lock.service.ts +11 -0
  100. package/src/test/utils/create-e2e-database.ts +55 -0
  101. package/src/test/utils/drop-e2e-database.ts +36 -0
  102. package/src/test/utils/wait-for.ts +31 -0
  103. package/tsconfig.lib.json +11 -0
  104. package/LICENSE +0 -21
  105. package/README.md +0 -499
  106. package/core/backgroud-services/cron-service/cron-job.handler.base.d.ts +0 -16
  107. package/core/backgroud-services/cron-service/cron-job.handler.base.js +0 -49
  108. package/core/backgroud-services/event-service/event-class.d.ts +0 -5
  109. package/core/backgroud-services/event-service/event-class.js +0 -11
  110. package/core/backgroud-services/event-service/event-handler.base.d.ts +0 -8
  111. package/core/backgroud-services/event-service/event-handler.base.js +0 -14
  112. package/core/backgroud-services/event-service/event-is-trigger.d.ts +0 -3
  113. package/core/backgroud-services/event-service/event-is-trigger.js +0 -7
  114. package/core/backgroud-services/event-service/event-job.d.ts +0 -13
  115. package/core/backgroud-services/event-service/event-job.js +0 -21
  116. package/core/backgroud-services/event-service/event-queue.d.ts +0 -17
  117. package/core/backgroud-services/event-service/event-queue.js +0 -62
  118. package/core/constants/query-params.d.ts +0 -6
  119. package/core/constants/query-params.js +0 -8
  120. package/core/controllers/base.controller.d.ts +0 -4
  121. package/core/controllers/base.controller.js +0 -6
  122. package/core/controllers/controller.decorator.d.ts +0 -2
  123. package/core/controllers/controller.decorator.js +0 -11
  124. package/core/controllers/created-registre-response.base.d.ts +0 -10
  125. package/core/controllers/created-registre-response.base.js +0 -35
  126. package/core/controllers/list-response.base.d.ts +0 -4
  127. package/core/controllers/list-response.base.js +0 -21
  128. package/core/controllers/pagination.request.d.ts +0 -10
  129. package/core/controllers/pagination.request.js +0 -56
  130. package/core/controllers/router-config.base.d.ts +0 -7
  131. package/core/controllers/router-config.base.js +0 -18
  132. package/core/controllers/schemas/boolean.schema.d.ts +0 -2
  133. package/core/controllers/schemas/boolean.schema.js +0 -12
  134. package/core/controllers/schemas/document-number.schema.d.ts +0 -1
  135. package/core/controllers/schemas/document-number.schema.js +0 -26
  136. package/core/controllers/schemas/email.schema.d.ts +0 -1
  137. package/core/controllers/schemas/email.schema.js +0 -13
  138. package/core/controllers/schemas/list-query.schema.d.ts +0 -17
  139. package/core/controllers/schemas/list-query.schema.js +0 -19
  140. package/core/controllers/schemas/native-enum.schema.d.ts +0 -7
  141. package/core/controllers/schemas/native-enum.schema.js +0 -28
  142. package/core/controllers/schemas/set-mask-document-number.schema.d.ts +0 -1
  143. package/core/controllers/schemas/set-mask-document-number.schema.js +0 -13
  144. package/core/database/entity.base.d.ts +0 -20
  145. package/core/database/entity.base.js +0 -71
  146. package/core/database/entity.decorator.d.ts +0 -13
  147. package/core/database/entity.decorator.js +0 -23
  148. package/core/database/prisma-client-with-custom-transaction.interface.d.ts +0 -8
  149. package/core/database/prisma-client-with-custom-transaction.interface.js +0 -2
  150. package/core/database/prisma-resolver.d.ts +0 -2
  151. package/core/database/prisma-resolver.js +0 -74
  152. package/core/database/prisma-transactional-client.d.ts +0 -11
  153. package/core/database/prisma-transactional-client.js +0 -25
  154. package/core/database/prisma.service.d.ts +0 -24
  155. package/core/database/prisma.service.js +0 -104
  156. package/core/database/repository.base.d.ts +0 -44
  157. package/core/database/repository.base.js +0 -360
  158. package/core/dtos/pagination.dto.d.ts +0 -9
  159. package/core/dtos/pagination.dto.js +0 -49
  160. package/core/errors/bad-request.error.d.ts +0 -5
  161. package/core/errors/bad-request.error.js +0 -10
  162. package/core/errors/conflict.error.d.ts +0 -4
  163. package/core/errors/conflict.error.js +0 -10
  164. package/core/errors/error.base.d.ts +0 -4
  165. package/core/errors/error.base.js +0 -11
  166. package/core/errors/no-content.error.d.ts +0 -5
  167. package/core/errors/no-content.error.js +0 -10
  168. package/core/errors/not-allowed.error.d.ts +0 -5
  169. package/core/errors/not-allowed.error.js +0 -10
  170. package/core/errors/resource-not-found.error.d.ts +0 -5
  171. package/core/errors/resource-not-found.error.js +0 -10
  172. package/core/errors/use-case-error.js +0 -2
  173. package/core/errors/user-already-exist.error.d.ts +0 -4
  174. package/core/errors/user-already-exist.error.js +0 -10
  175. package/core/errors/wrong-credentials.error.d.ts +0 -4
  176. package/core/errors/wrong-credentials.error.js +0 -10
  177. package/core/health-check/health-check.controller.d.ts +0 -5
  178. package/core/health-check/health-check.controller.js +0 -32
  179. package/core/health-check/health-check.module.d.ts +0 -2
  180. package/core/health-check/health-check.module.js +0 -19
  181. package/core/index.d.ts +0 -18
  182. package/core/index.js +0 -7
  183. package/core/koala-app.d.ts +0 -64
  184. package/core/koala-app.js +0 -252
  185. package/core/koala-global-vars.d.ts +0 -7
  186. package/core/koala-global-vars.js +0 -9
  187. package/core/koala-nest-database.module.d.ts +0 -16
  188. package/core/koala-nest-database.module.js +0 -52
  189. package/core/koala-nest-http.module.d.ts +0 -13
  190. package/core/koala-nest-http.module.js +0 -37
  191. package/core/koala-nest.module.d.ts +0 -17
  192. package/core/koala-nest.module.js +0 -66
  193. package/core/mapping/auto-mapping-class-context.d.ts +0 -16
  194. package/core/mapping/auto-mapping-class-context.js +0 -18
  195. package/core/mapping/auto-mapping-context.d.ts +0 -11
  196. package/core/mapping/auto-mapping-context.js +0 -24
  197. package/core/mapping/auto-mapping-list.d.ts +0 -27
  198. package/core/mapping/auto-mapping-list.js +0 -94
  199. package/core/mapping/auto-mapping-profile.d.ts +0 -3
  200. package/core/mapping/auto-mapping-profile.js +0 -6
  201. package/core/mapping/auto-mapping.decorator.d.ts +0 -9
  202. package/core/mapping/auto-mapping.decorator.js +0 -27
  203. package/core/mapping/auto-mapping.module.d.ts +0 -5
  204. package/core/mapping/auto-mapping.module.js +0 -29
  205. package/core/mapping/auto-mapping.service.d.ts +0 -14
  206. package/core/mapping/auto-mapping.service.js +0 -140
  207. package/core/mapping/create-map.d.ts +0 -3
  208. package/core/mapping/create-map.js +0 -7
  209. package/core/mapping/for-member.d.ts +0 -5
  210. package/core/mapping/for-member.js +0 -8
  211. package/core/request-overflow/request-handler.base.d.ts +0 -4
  212. package/core/request-overflow/request-handler.base.js +0 -6
  213. package/core/request-overflow/request-result.d.ts +0 -15
  214. package/core/request-overflow/request-result.js +0 -37
  215. package/core/request-overflow/request-validator.base.d.ts +0 -7
  216. package/core/request-overflow/request-validator.base.js +0 -26
  217. package/core/security/strategies/api-key.strategy.d.ts +0 -16
  218. package/core/security/strategies/api-key.strategy.js +0 -31
  219. package/core/utils/assing-object.d.ts +0 -5
  220. package/core/utils/assing-object.js +0 -6
  221. package/core/utils/env.config.d.ts +0 -6
  222. package/core/utils/env.config.js +0 -18
  223. package/core/utils/filter-request-params.d.ts +0 -13
  224. package/core/utils/filter-request-params.js +0 -22
  225. package/core/utils/find-on-list.d.ts +0 -2
  226. package/core/utils/find-on-list.js +0 -13
  227. package/core/utils/get-type-by-prop.d.ts +0 -2
  228. package/core/utils/get-type-by-prop.js +0 -11
  229. package/core/utils/instanciate-class-with-dependencies-injection.d.ts +0 -2
  230. package/core/utils/instanciate-class-with-dependencies-injection.js +0 -10
  231. package/core/utils/interfaces/icomparable.d.ts +0 -5
  232. package/core/utils/interfaces/icomparable.js +0 -6
  233. package/core/utils/list.d.ts +0 -39
  234. package/core/utils/list.js +0 -168
  235. package/core/utils/promise-all.d.ts +0 -7
  236. package/core/utils/promise-all.js +0 -19
  237. package/core/utils/set-mask-document-number.d.ts +0 -1
  238. package/core/utils/set-mask-document-number.js +0 -13
  239. package/core/validators/file-validator.d.ts +0 -27
  240. package/core/validators/file-validator.js +0 -94
  241. package/decorators/api-exclude-endpoint-diff-develop.decorator.d.ts +0 -1
  242. package/decorators/api-exclude-endpoint-diff-develop.decorator.js +0 -9
  243. package/decorators/api-property-enum.decorator.d.ts +0 -8
  244. package/decorators/api-property-enum.decorator.js +0 -21
  245. package/decorators/api-property-only-develop.decorator.d.ts +0 -2
  246. package/decorators/api-property-only-develop.decorator.js +0 -9
  247. package/decorators/cookies.decorator.d.ts +0 -1
  248. package/decorators/cookies.decorator.js +0 -8
  249. package/decorators/is-public.decorator.d.ts +0 -2
  250. package/decorators/is-public.decorator.js +0 -7
  251. package/decorators/upload.decorator.d.ts +0 -1
  252. package/decorators/upload.decorator.js +0 -18
  253. package/docs/00-cli-reference.md +0 -201
  254. package/docs/01-guia-instalacao.md +0 -113
  255. package/docs/02-configuracao-inicial.md +0 -176
  256. package/docs/04-tratamento-erros.md +0 -303
  257. package/docs/05-features-avancadas.md +0 -969
  258. package/docs/06-decoradores.md +0 -220
  259. package/docs/07-guia-bun.md +0 -176
  260. package/docs/08-prisma-client.md +0 -487
  261. package/docs/09-mcp-vscode-extension.md +0 -437
  262. package/docs/EXAMPLE.md +0 -1671
  263. package/docs/README.md +0 -59
  264. package/env/env.d.ts +0 -25
  265. package/env/env.js +0 -14
  266. package/env/env.module.d.ts +0 -2
  267. package/env/env.module.js +0 -20
  268. package/env/env.service.d.ts +0 -7
  269. package/env/env.service.js +0 -28
  270. package/filters/domain-errors.filter.d.ts +0 -18
  271. package/filters/domain-errors.filter.js +0 -92
  272. package/filters/global-exception.filter.d.ts +0 -8
  273. package/filters/global-exception.filter.js +0 -68
  274. package/filters/prisma-validation-exception.filter.d.ts +0 -10
  275. package/filters/prisma-validation-exception.filter.js +0 -82
  276. package/filters/zod-errors.filter.d.ts +0 -9
  277. package/filters/zod-errors.filter.js +0 -60
  278. package/mcp-server/mcp.json.example +0 -27
  279. package/mcp-server/server.d.ts +0 -2
  280. package/mcp-server/server.d.ts.map +0 -1
  281. package/mcp-server/server.js +0 -248
  282. package/mcp-server/server.js.map +0 -1
  283. package/services/logging/ilogging.service.d.ts +0 -16
  284. package/services/logging/ilogging.service.js +0 -6
  285. package/services/logging/logging.service.d.ts +0 -4
  286. package/services/logging/logging.service.js +0 -20
  287. package/services/redis/iredis.service.d.ts +0 -6
  288. package/services/redis/iredis.service.js +0 -6
  289. package/services/redis/redis.service.d.ts +0 -14
  290. package/services/redis/redis.service.js +0 -65
  291. package/services/redlock/ired-lock.service.d.ts +0 -4
  292. package/services/redlock/ired-lock.service.js +0 -6
  293. package/services/redlock/red-lock.service.d.ts +0 -9
  294. package/services/redlock/red-lock.service.js +0 -46
  295. package/test/koala-app-test-dependencies.d.ts +0 -10
  296. package/test/koala-app-test-dependencies.js +0 -13
  297. package/test/koala-app-test.d.ts +0 -22
  298. package/test/koala-app-test.js +0 -77
  299. package/test/repositories/in-memory-base.repository.d.ts +0 -17
  300. package/test/repositories/in-memory-base.repository.js +0 -65
  301. package/test/services/fake-logging.service.d.ts +0 -4
  302. package/test/services/fake-logging.service.js +0 -9
  303. package/test/services/fake-red-lock.service.d.ts +0 -5
  304. package/test/services/fake-red-lock.service.js +0 -11
  305. package/test/utils/create-e2e-database.d.ts +0 -2
  306. package/test/utils/create-e2e-database.js +0 -47
  307. package/test/utils/drop-e2e-database.d.ts +0 -2
  308. package/test/utils/drop-e2e-database.js +0 -33
  309. package/test/utils/wait-for.d.ts +0 -1
  310. package/test/utils/wait-for.js +0 -21
  311. package/tsconfig.lib.tsbuildinfo +0 -1
@@ -0,0 +1,55 @@
1
+ import 'dotenv/config'
2
+ import { execSync } from 'node:child_process'
3
+ import { randomUUID } from 'node:crypto'
4
+ import { Pool } from 'pg'
5
+
6
+ function generateUniqueDatabaseURL() {
7
+ const schemaId = randomUUID()
8
+
9
+ if (!process.env.DATABASE_URL) {
10
+ throw new Error('Please provider a DATABASE_URL environment variable')
11
+ }
12
+
13
+ const url = new URL(process.env.DATABASE_URL)
14
+ url.pathname = `/${schemaId}`
15
+
16
+ return {
17
+ url: url.toString(),
18
+ schemaId,
19
+ }
20
+ }
21
+
22
+ export async function createE2EDatabase(runtime: 'node' | 'bun' = 'node') {
23
+ const { url, schemaId } = generateUniqueDatabaseURL()
24
+
25
+ process.env.DATABASE_URL = url
26
+ process.env.DIRECT_URL = url
27
+ process.env.PRISMA_SCHEMA_DISABLE_ADVISORY_LOCK = 'true'
28
+
29
+ try {
30
+ // Conectar ao banco padrão para criar novo banco
31
+ const baseUrl = new URL(process.env.DATABASE_URL)
32
+ baseUrl.pathname = '/postgres'
33
+ const pool = new Pool({ connectionString: baseUrl.toString() })
34
+
35
+ try {
36
+ // Criar banco de dados
37
+ await pool.query(`CREATE DATABASE "${schemaId}"`)
38
+ } finally {
39
+ await pool.end()
40
+ }
41
+
42
+ // Executar migrations no novo banco com a variável de ambiente corrigida
43
+ const env = { ...process.env, DATABASE_URL: url, DIRECT_URL: url }
44
+ execSync(`${runtime}x prisma migrate deploy`, {
45
+ cwd: process.cwd(),
46
+ env,
47
+ stdio: 'inherit',
48
+ })
49
+ } catch (error) {
50
+ console.error('Erro ao criar banco de dados e2e:', error)
51
+ throw error
52
+ }
53
+
54
+ return schemaId
55
+ }
@@ -0,0 +1,36 @@
1
+ import 'dotenv/config'
2
+ import { Pool } from 'pg'
3
+
4
+ export async function dropE2EDatabase(schemaId: string) {
5
+ await new Promise((resolve) => setTimeout(resolve, 1000))
6
+ const baseUrl = new URL(process.env.DATABASE_URL || '')
7
+ baseUrl.pathname = '/postgres'
8
+ const pool = new Pool({
9
+ connectionString: baseUrl.toString(),
10
+ idleTimeoutMillis: 100,
11
+ })
12
+
13
+ try {
14
+ // Terminate all connections to the database
15
+ await pool.query(`
16
+ SELECT pg_terminate_backend(pg_stat_activity.pid)
17
+ FROM pg_stat_activity
18
+ WHERE pg_stat_activity.datname = '${schemaId}'
19
+ AND pid <> pg_backend_pid()
20
+ `)
21
+
22
+ // Small delay to ensure connections are terminated
23
+ await new Promise((resolve) => setTimeout(resolve, 500))
24
+
25
+ // Drop the database
26
+ await pool.query(`DROP DATABASE IF EXISTS "${schemaId}"`)
27
+ } catch {
28
+ // Silently fail - connection may already be closed
29
+ } finally {
30
+ try {
31
+ await pool.end()
32
+ } catch {
33
+ // Ignore pool end errors
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * This function loops through a function rerunning all assertions
3
+ * inside of it until it gets a truthy result.
4
+ *
5
+ * If the maximum duration is reached, it then rejects.
6
+ *
7
+ * @param expectations A function containing all tests assertions
8
+ * @param maxDuration Maximum wait time before rejecting
9
+ */
10
+ export async function waitFor(
11
+ assertions: () => void,
12
+ maxDuration = 1000,
13
+ ): Promise<void> {
14
+ return new Promise((resolve, reject) => {
15
+ let elapsedTime = 0
16
+
17
+ const interval = setInterval(() => {
18
+ elapsedTime += 10
19
+
20
+ try {
21
+ assertions()
22
+ clearInterval(interval)
23
+ resolve()
24
+ } catch (err) {
25
+ if (elapsedTime >= maxDuration) {
26
+ reject(err)
27
+ }
28
+ }
29
+ }, 10)
30
+ })
31
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "declaration": true,
5
+ "sourceMap": false,
6
+ },
7
+ "exclude": [
8
+ "**/*.spec.ts",
9
+ "**/*.e2e-spec.ts"
10
+ ],
11
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2023 Igor D. Rangel
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
package/README.md DELETED
@@ -1,499 +0,0 @@
1
- <p align="center">
2
- <a href="https://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="120" alt="Nest Logo" /></a>
3
- </p>
4
-
5
- <h1 align="center">@koalarx/nest</h1>
6
-
7
- <p align="center">Uma abstração <a href="https://nestjs.com" target="_blank">NestJS</a> robusta para criar APIs escaláveis seguindo os princípios do Domain-Driven Design (DDD).</p>
8
-
9
- <div align="center">
10
-
11
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
12
- [![Bun](https://img.shields.io/badge/Bun-1.3%2B-black)](https://bun.sh)
13
- [![TypeScript](https://img.shields.io/badge/TypeScript-5.1%2B-blue)](https://www.typescriptlang.org/)
14
- [![CLI](https://img.shields.io/badge/CLI-@koalarx/nest--cli-brightgreen)](https://www.npmjs.com/package/@koalarx/nest-cli)
15
- [![VS Code Extension](https://img.shields.io/badge/VS%20Code-MCP%20Extension-blue)](https://marketplace.visualstudio.com/items?itemName=koalarx.koala-libs-mcp-docs)
16
-
17
- </div>
18
-
19
- ## 🤖 Extensão VS Code com MCP
20
-
21
- Acelere seu desenvolvimento com a **extensão oficial para VS Code**! Toda a documentação do Koala Nest integrada diretamente no GitHub Copilot através do Model Context Protocol.
22
-
23
- **[📦 Instalar Extensão](https://marketplace.visualstudio.com/items?itemName=koalarx.koala-libs-mcp-docs)**
24
-
25
- Basta instalar e perguntar ao Copilot sobre o Koala Nest - ele terá acesso instantâneo à documentação oficial!
26
-
27
- > 💡 **Exemplo:** "Como criar um controller CRUD no Koala Nest?" - O Copilot responderá com base na documentação atualizada.
28
-
29
- **[📖 Documentação da Extensão MCP](./docs/09-mcp-vscode-extension.md)**
30
-
31
- ## 🎯 O que você consegue fazer com @koalarx/nest
32
-
33
- - ✅ **Implementar APIs REST completas** com CRUD automático
34
- - ✅ **AutoMapping** transparente entre Request, Entity e Response
35
- - ✅ **Validação automática** com Zod integrado
36
- - ✅ **Testes unitários e E2E** simplificados
37
- - ✅ **CronJobs** com suporte a múltiplos pods via Redis
38
- - ✅ **EventJobs** para processamento assíncrono de eventos
39
- - ✅ **Paginação** automaticamente documentada
40
- - ✅ **Documentação OpenAPI (Swagger ou Scalar)** automática
41
-
42
- ## 📚 Documentação Completa
43
-
44
- Toda a documentação está organizada em arquivos separados para facilitar a navegação:
45
-
46
- | Documento | Descrição |
47
- |-----------|-----------|
48
- | [**EXAMPLE.md**](./docs/EXAMPLE.md) | **Exemplo prático completo** - API CRUD com todas as camadas DDD |
49
- | [**CLI Reference**](./docs/00-cli-reference.md) | Guia da CLI oficial - Forma rápida de criar projetos |
50
- | [**Guia de Instalação**](./docs/01-guia-instalacao.md) | Como instalar e configurar a biblioteca |
51
- | [**Configuração Inicial**](./docs/02-configuracao-inicial.md) | Setup do projeto com KoalaNestModule e KoalaApp |
52
- | [**Tratamento de Erros**](./docs/04-tratamento-erros.md) | Sistema robusto de tratamento e filtros de exceção |
53
- | [**Features Avançadas**](./docs/05-features-avancadas.md) | Cron Jobs, Event Handlers, Redis, Transações e Padrões de Autenticação |
54
- | [**Decoradores**](./docs/06-decoradores.md) | @IsPublic, @Upload, @Cookies e mais |
55
- | [**Guia Bun**](./docs/07-guia-bun.md) | Por que Bun e como usá-lo |
56
- | [**Prisma Client**](./docs/08-prisma-client.md) | Integração com Prisma |
57
- | [**🤖 Extensão MCP**](./docs/09-mcp-vscode-extension.md) | **Extensão VS Code com integração ao Copilot** |
58
-
59
- ## Quick Start
60
-
61
- ### Usando Bun (Recomendado - Mais Rápido)
62
-
63
- O projeto agora usa **Bun** como runtime JavaScript. Para instalar o Bun:
64
-
65
- ```bash
66
- # Instalar Bun (Windows, macOS, Linux)
67
- curl -fsSL https://bun.sh/install | bash
68
-
69
- # Ou em Windows com PowerShell:
70
- powershell -Command "irm https://bun.sh/install.ps1 | iex"
71
-
72
- # Instalar dependências
73
- bun install
74
-
75
- # Iniciar em modo desenvolvimento
76
- bun run start:dev
77
-
78
- # Executar testes
79
- bun run test
80
-
81
- # Fazer build
82
- bun run build
83
- ```
84
-
85
- **Vantagens do Bun:**
86
- - ⚡ Runtime ~3x mais rápido que Node.js
87
- - 📦 Package manager integrado (mais rápido que npm)
88
- - 🧪 Test runner nativo (compatível com Vitest)
89
- - 🔄 Hot reload automático
90
- - 💾 Menor consumo de memória
91
-
92
- ### Forma Rápida com CLI (Recomendado)
93
-
94
- ```bash
95
- # Instalar a CLI globalmente
96
- npm install -g @koalarx/nest-cli
97
-
98
- # Criar novo projeto estruturado
99
- koala-nest new meu-projeto
100
-
101
- # Entrar na pasta
102
- cd meu-projeto
103
-
104
- # Iniciar em modo desenvolvimento (com Bun)
105
- bun run start:dev
106
- ```
107
-
108
- **Pronto!** Seu projeto está estruturado com:
109
- - [x] Módulo DDD configurado
110
- - [x] Documentação da API (Scalar UI)
111
- - [x] Tratamento de erros robusto
112
- - [x] Banco de dados Prisma
113
- - [x] Redis para background services
114
-
115
- ### Forma Manual
116
-
117
- > ⚠️ **Requisito Obrigatório**: A abstração de banco de dados da biblioteca requer **Prisma como ORM**.
118
- >
119
- > **💡 Dica**: Para um exemplo completo e funcionando, veja [docs/EXAMPLE.md](./docs/EXAMPLE.md)
120
-
121
- ```bash
122
- # Com Bun (Recomendado - Mais rápido)
123
- bun install @koalarx/nest
124
-
125
- # Ou com npm (Alternativa)
126
- npm install @koalarx/nest
127
- ```
128
-
129
- ### 2. Criar Módulo Principal
130
-
131
- ```typescript
132
- // src/host/app.module.ts
133
- import { KoalaNestModule } from '@koalarx/nest/core/koala-nest.module'
134
- import { Module } from '@nestjs/common'
135
- import { env } from '../core/env'
136
- // Importar seus módulos de controllers
137
- // import { PersonModule } from './controllers/person/person.module'
138
-
139
- @Module({
140
- imports: [
141
- KoalaNestModule.register({
142
- env,
143
- // controllers: [PersonModule], // Adicione seus módulos aqui
144
- }),
145
- ],
146
- })
147
- export class AppModule {}
148
- ```
149
-
150
- ### 3. Inicializar Aplicação
151
-
152
- ```typescript
153
- // src/host/main.ts
154
- import { NestFactory } from '@nestjs/core'
155
- import { KoalaApp } from '@koalarx/nest/core/koala-app'
156
- import { AppModule } from './app.module'
157
- import { DbTransactionContext } from '@/infra/database/db-transaction-context'
158
- import { setPrismaClientOptions } from '@koalarx/nest/core/database/prisma.service'
159
- import { PrismaPg } from '@prisma/adapter-pg'
160
- import { Pool } from 'pg'
161
- import 'dotenv/config'
162
-
163
- async function bootstrap() {
164
- // Configurar Prisma com adapter PostgreSQL
165
- const pool = new Pool({
166
- connectionString: process.env.DATABASE_URL,
167
- })
168
- const adapter = new PrismaPg(pool)
169
- setPrismaClientOptions({ adapter })
170
-
171
- // Criar aplicação NestJS
172
- const app = await NestFactory.create(AppModule)
173
-
174
- // Configurar e iniciar KoalaApp
175
- await new KoalaApp(app)
176
- .useDoc({
177
- ui: 'scalar',
178
- endpoint: '/doc',
179
- title: 'API de Demonstração',
180
- version: '1.0',
181
- })
182
- .setAppName('example')
183
- .setInternalUserName('integration.bot')
184
- .setDbTransactionContext(DbTransactionContext)
185
- .enableCors()
186
- .buildAndServe()
187
- }
188
-
189
- bootstrap()
190
- ```
191
-
192
- ### 4. Executar
193
-
194
- ```bash
195
- npm run start:dev
196
- ```
197
-
198
- Acesse `http://localhost:3000/doc` para a documentação interativa!
199
-
200
- ## Principais Features
201
-
202
- ### Camadas DDD (Domain-Driven Design)
203
-
204
- A biblioteca implementa um padrão com 4 camadas bem definidas:
205
-
206
- 1. **Domain** - Entidades, DTOs e interfaces de repositório
207
- 2. **Application** - Handlers com lógica de negócio, Validators, AutoMapping
208
- 3. **Host** - Controllers REST que expõem os endpoints
209
- 4. **Infra** - Repositórios concretos e acesso ao banco de dados
210
-
211
- Veja [docs/EXAMPLE.md](./docs/EXAMPLE.md) para implementação completa.
212
-
213
- ### AutoMapping Automático
214
-
215
- Converte Request → Entity → Response transparentemente:
216
-
217
- ```typescript
218
- // Define os mapeamentos
219
- createMap(CreatePersonRequest, Person)
220
- createMap(Person, ReadPersonResponse)
221
-
222
- // Usa automaticamente
223
- const person = mapper.map(request, CreatePersonRequest, Person)
224
- const response = mapper.map(entity, Person, ReadPersonResponse)
225
- ```
226
-
227
- ### Validação com Zod
228
-
229
- Validação tipada integrada com transformação de dados:
230
-
231
- ```typescript
232
- export class CreatePersonValidator extends RequestValidatorBase<CreatePersonRequest> {
233
- protected get schema(): ZodType<any, ZodTypeDef, any> {
234
- return z.object({
235
- name: z.string(),
236
- phones: z.array(z.object({ phone: z.string() })),
237
- address: z.object({ address: z.string() }),
238
- })
239
- }
240
- }
241
- ```
242
-
243
- ### Handlers e RequestResult
244
-
245
- Padrão funcional para tratamento de sucesso/erro:
246
-
247
- ```typescript
248
- @Injectable()
249
- export class CreatePersonHandler extends RequestHandlerBase<...> {
250
- async handle(req: CreatePersonRequest): Promise<RequestResult<Error, CreatePersonResponse>> {
251
- const person = this.mapper.map(
252
- new CreatePersonValidator(req).validate(),
253
- CreatePersonRequest,
254
- Person,
255
- )
256
- const result = await this.repository.save(person)
257
- return ok({ id: result.id })
258
- }
259
- }
260
-
261
- // Controller
262
- const response = await handler.handle(request)
263
- if (response.isFailure()) {
264
- throw response.value
265
- }
266
- return response.value
267
- ```
268
-
269
- ### Paginação Automática
270
-
271
- Queries com paginação documentada automaticamente:
272
-
273
- ```typescript
274
- // Requisição
275
- GET /person?name=John&active=true&page=1&pageSize=10
276
-
277
- // Response com count
278
- {
279
- "items": [...],
280
- "count": 5
281
- }
282
- ```
283
-
284
- ### CronJobs com Redis (Sincronização)
285
-
286
- Tarefas agendadas com lock automático via RedLock em ambientes multi-pod:
287
-
288
- ```typescript
289
- @Injectable()
290
- export class DeleteInactiveJob extends CronJobHandlerBase {
291
- protected async settings(): Promise<CronJobSettings> {
292
- return {
293
- isActive: true,
294
- timeInMinutes: 1,
295
- }
296
- }
297
-
298
- protected async run(): Promise<CronJobResponse> {
299
- // Executa apenas em um pod por vez
300
- const result = await this.readManyPerson.handle(
301
- new ReadManyPersonDto({ active: false })
302
- )
303
-
304
- if (result.isOk()) {
305
- for (const person of result.value.items) {
306
- await this.deletePerson.handle(person.id)
307
- }
308
- }
309
-
310
- return ok(null)
311
- }
312
- }
313
- ```
314
-
315
- ### EventJobs - Processamento Assíncrono
316
-
317
- Processamento de eventos assincronamente:
318
-
319
- ```typescript
320
- export class PersonEventJob extends EventJob<Person> {
321
- defineHandlers(): Type<EventHandlerBase>[] {
322
- return [InactivePersonHandler]
323
- }
324
- }
325
-
326
- @Injectable()
327
- export class InactivePersonHandler extends EventHandlerBase {
328
- async handleEvent(): Promise<void> {
329
- const result = await this.repository.readMany(
330
- new ReadManyPersonDto({ active: true })
331
- )
332
-
333
- for (const person of result.items) {
334
- person.active = false
335
- await this.repository.save(person)
336
- }
337
- }
338
- }
339
-
340
- // Registrar na aplicação
341
- .addEventJob(InactivePersonHandler)
342
- ```
343
-
344
- ### Testes Unitários
345
-
346
- Setup simplificado com dependências injetadas:
347
-
348
- ```typescript
349
- describe('CreatePersonHandler', () => {
350
- const app = createUnitTestApp()
351
-
352
- it('should create a person', async () => {
353
- const handler = app.get(CreatePersonHandler)
354
- const result = await handler.handle(createPersonRequestMockup)
355
-
356
- expect(result.isOk()).toBeTruthy()
357
- if (result.isOk()) {
358
- expect(result.value).toEqual({
359
- id: expect.any(Number),
360
- })
361
- }
362
- })
363
- })
364
- ```
365
-
366
- ### Testes E2E
367
-
368
- Testes de integração completos:
369
-
370
- ```typescript
371
- const app = await createE2ETestApp()
372
-
373
- it('should create a person', async () => {
374
- const response = await request(app.getHttpServer())
375
- .post('/person')
376
- .send({
377
- name: 'John Doe',
378
- phones: [],
379
- address: { address: 'Street 1' },
380
- })
381
-
382
- expect(response.statusCode).toBe(201)
383
- expect(response.body.id).toBeDefined()
384
- })
385
- ```
386
-
387
- ## Exemplo Prático Completo
388
-
389
- Veja em [docs/EXAMPLE.md](./docs/EXAMPLE.md) um CRUD completo de **Pessoa** implementado com:
390
-
391
- - ✅ Entidades (Person, PersonAddress, PersonPhone)
392
- - ✅ DTOs com paginação (ReadManyPersonDto)
393
- - ✅ 5 Handlers (Create, Read, ReadMany, Update, Delete)
394
- - ✅ 5 Controllers REST
395
- - ✅ Repository com Prisma
396
- - ✅ Testes unitários e E2E
397
- - ✅ CronJobs e EventJobs
398
- - ✅ AutoMapping automático
399
- - ✅ Validação com Zod
400
-
401
- ## Estrutura de Projeto Recomendada
402
-
403
- Seguindo DDD conforme implementado no exemplo:
404
-
405
- ```
406
- apps/
407
- ├── example/ # Projeto exemplo
408
- │ └── src/
409
- │ ├── domain/ # Entidades, DTOs, Interfaces
410
- │ ├── application/ # Handlers, Validators, Mapping
411
- │ ├── host/ # Controllers, Roteamento
412
- │ ├── infra/ # Repositories, Database
413
- │ ├── core/ # Configuração
414
- │ └── test/ # Setup de testes
415
- └── koala-nest/ # Biblioteca principal
416
-
417
- prisma/
418
- ├── schema.prisma # Modelo de dados
419
- ├── migrations/ # Histórico de migrações
420
- └── generated/ # Cliente Prisma gerado
421
- ```
422
-
423
- ## Configuração de Ambiente
424
-
425
- Crie seu `.env`:
426
-
427
- ```env
428
- # Banco de dados
429
- DATABASE_URL=postgresql://user:password@localhost:5432/koala_db
430
-
431
- # Aplicação
432
- NODE_ENV=develop
433
-
434
- # Prisma (opcional - habilita logs das queries)
435
- PRISMA_QUERY_LOG=true
436
-
437
- # Swagger/Scalar (opcional)
438
- SWAGGER_USERNAME=admin
439
- SWAGGER_PASSWORD=password123
440
-
441
- # Redis (opcional - necessário para CronJobs em múltiplas instâncias)
442
- REDIS_CONNECTION_STRING=redis://localhost:6379
443
- ```
444
-
445
- Consulte [docs/02-configuracao-inicial.md](./docs/02-configuracao-inicial.md) para mais detalhes.
446
-
447
- ## Recursos Adicionais
448
-
449
- A biblioteca inclui vários decoradores e utilitários para facilitar o desenvolvimento:
450
-
451
- - **@ApiPropertyEnum()** - Documente enums corretamente no Swagger
452
- - **@ApiPropertyOnlyDevelop()** - Propriedades apenas em ambiente de desenvolvimento
453
- - **@ApiExcludeEndpointDiffDevelop()** - Endpoints apenas em dev (excluídos em produção)
454
- - **@Upload()** - Documentação automática de uploads de arquivos
455
- - **@Cookies()** - Extrai cookies da requisição HTTP
456
- - **@IsPublic()** - Marca endpoint como público (sem validação de token)
457
-
458
- Veja [docs/06-decoradores.md](./docs/06-decoradores.md) para documentação completa.
459
-
460
- ## Arquitetura
461
-
462
- A biblioteca utiliza duas classes principais:
463
-
464
- 1. **KoalaNestModule** - Módulo NestJS com configuração
465
- 2. **KoalaApp** - Classe fluent para setup da aplicação
466
-
467
- Ambas seguem o padrão de **Fluent Interface** para configuração clara e intuitiva.
468
-
469
- ## Dependências Principais
470
-
471
- - `@nestjs/*` - Framework NestJS
472
- - `@prisma/client` - ORM Prisma
473
- - `zod` - Validação de dados
474
- - `ioredis` - Cliente Redis
475
- - `@nestjs/swagger` - Documentação automática
476
-
477
- ## Links Importantes
478
-
479
- - **[CLI (@koalarx/nest-cli)](https://www.npmjs.com/package/@koalarx/nest-cli)** - Ferramenta oficial para criar projetos rapidamente
480
- - **[GitHub da Library](https://github.com/igordrangel/koala-nest)** - Repositório principal
481
- - **[GitHub da CLI](https://github.com/igordrangel/koala-nest-cli)** - Repositório da CLI
482
-
483
- ## Licença
484
-
485
- MIT License © 2023-2025 Igor D. Rangel
486
-
487
- ## Contribuindo
488
-
489
- Contribuições são bem-vindas! Abra uma issue ou pull request no repositório.
490
-
491
- ## Suporte
492
-
493
- Para dúvidas, abra uma issue no repositório ou consulte a [documentação completa](./docs).
494
-
495
- ---
496
-
497
- <p align="center">
498
- Feito para desenvolvedores NestJS
499
- </p>
@@ -1,16 +0,0 @@
1
- import { ILoggingService } from '../../../services/logging/ilogging.service';
2
- import { IRedLockService } from '../../../services/redlock/ired-lock.service';
3
- import { RequestResult } from '../../request-overflow/request-result';
4
- export type CronJobResponse = RequestResult<Error, null>;
5
- export interface CronJobSettings {
6
- isActive: boolean;
7
- timeInMinutes: number;
8
- }
9
- export declare abstract class CronJobHandlerBase {
10
- private readonly redlockService;
11
- private readonly loggingService;
12
- constructor(redlockService: IRedLockService, loggingService: ILoggingService);
13
- protected abstract run(): Promise<CronJobResponse>;
14
- protected abstract settings(): Promise<CronJobSettings>;
15
- start(): Promise<void>;
16
- }