sonamu 0.5.7 → 0.7.0

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 (529) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +13 -2
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +71 -2
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +258 -2
  44. package/dist/api/config.d.ts +90 -0
  45. package/dist/api/config.d.ts.map +1 -0
  46. package/dist/api/config.js +25 -0
  47. package/dist/api/context.d.ts +4 -2
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +3 -2
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +235 -2
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +9 -2
  56. package/dist/api/sonamu.d.ts +10 -24
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +514 -2
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +6 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +15 -2
  65. package/dist/bin/cli.js +519 -2
  66. package/dist/bin/hot-hook-register.d.ts +11 -0
  67. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  68. package/dist/bin/hot-hook-register.js +21 -0
  69. package/dist/bin/loader-register.d.ts +2 -0
  70. package/dist/bin/loader-register.d.ts.map +1 -0
  71. package/dist/bin/loader-register.js +34 -0
  72. package/dist/database/_batch_update.d.ts +5 -3
  73. package/dist/database/_batch_update.d.ts.map +1 -1
  74. package/dist/database/_batch_update.js +95 -2
  75. package/dist/database/base-model.d.ts +96 -10
  76. package/dist/database/base-model.d.ts.map +1 -1
  77. package/dist/database/base-model.js +390 -2
  78. package/dist/database/base-model.types.d.ts +93 -0
  79. package/dist/database/base-model.types.d.ts.map +1 -0
  80. package/dist/database/base-model.types.js +10 -0
  81. package/dist/database/code-generator.d.ts +1 -1
  82. package/dist/database/code-generator.d.ts.map +1 -1
  83. package/dist/database/code-generator.js +54 -2
  84. package/dist/database/db.d.ts +6 -21
  85. package/dist/database/db.d.ts.map +1 -1
  86. package/dist/database/db.js +129 -2
  87. package/dist/database/puri-subset.test-d.js +81 -0
  88. package/dist/database/puri-subset.types.d.ts +123 -0
  89. package/dist/database/puri-subset.types.d.ts.map +1 -0
  90. package/dist/database/puri-subset.types.js +16 -0
  91. package/dist/database/puri-wrapper.d.ts +13 -11
  92. package/dist/database/puri-wrapper.d.ts.map +1 -1
  93. package/dist/database/puri-wrapper.js +109 -2
  94. package/dist/database/puri.d.ts +41 -23
  95. package/dist/database/puri.d.ts.map +1 -1
  96. package/dist/database/puri.js +601 -2
  97. package/dist/database/puri.types.d.ts +25 -6
  98. package/dist/database/puri.types.d.ts.map +1 -1
  99. package/dist/database/puri.types.js +6 -2
  100. package/dist/database/transaction-context.d.ts +1 -1
  101. package/dist/database/transaction-context.d.ts.map +1 -1
  102. package/dist/database/transaction-context.js +14 -2
  103. package/dist/database/upsert-builder.d.ts +9 -3
  104. package/dist/database/upsert-builder.d.ts.map +1 -1
  105. package/dist/database/upsert-builder.js +365 -2
  106. package/dist/entity/entity-manager.d.ts +167 -2
  107. package/dist/entity/entity-manager.d.ts.map +1 -1
  108. package/dist/entity/entity-manager.js +130 -2
  109. package/dist/entity/entity.d.ts +5 -3
  110. package/dist/entity/entity.d.ts.map +1 -1
  111. package/dist/entity/entity.js +750 -2
  112. package/dist/exceptions/error-handler.d.ts +1 -1
  113. package/dist/exceptions/error-handler.d.ts.map +1 -1
  114. package/dist/exceptions/error-handler.js +29 -2
  115. package/dist/exceptions/so-exceptions.d.ts +1 -1
  116. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  117. package/dist/exceptions/so-exceptions.js +85 -2
  118. package/dist/file-storage/driver.d.ts +1 -1
  119. package/dist/file-storage/driver.d.ts.map +1 -1
  120. package/dist/file-storage/driver.js +79 -2
  121. package/dist/file-storage/file-storage.js +75 -2
  122. package/dist/index.d.ts +18 -9
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +34 -2
  125. package/dist/migration/code-generation.d.ts +1 -1
  126. package/dist/migration/code-generation.d.ts.map +1 -1
  127. package/dist/migration/code-generation.js +614 -2
  128. package/dist/migration/migration-set.d.ts +2 -10
  129. package/dist/migration/migration-set.d.ts.map +1 -1
  130. package/dist/migration/migration-set.js +213 -2
  131. package/dist/migration/migrator.d.ts +24 -82
  132. package/dist/migration/migrator.d.ts.map +1 -1
  133. package/dist/migration/migrator.js +330 -2
  134. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  135. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  136. package/dist/migration/postgresql-schema-reader.js +245 -0
  137. package/dist/migration/types.d.ts +6 -38
  138. package/dist/migration/types.d.ts.map +1 -1
  139. package/dist/migration/types.js +3 -2
  140. package/dist/naite/messaging-types.d.ts +43 -0
  141. package/dist/naite/messaging-types.d.ts.map +1 -0
  142. package/dist/naite/messaging-types.js +7 -0
  143. package/dist/naite/naite-reporter.d.ts +41 -0
  144. package/dist/naite/naite-reporter.d.ts.map +1 -0
  145. package/dist/naite/naite-reporter.js +102 -0
  146. package/dist/naite/naite.d.ts +95 -0
  147. package/dist/naite/naite.d.ts.map +1 -0
  148. package/dist/naite/naite.js +316 -0
  149. package/dist/stream/index.js +3 -2
  150. package/dist/stream/sse.d.ts +2 -2
  151. package/dist/stream/sse.d.ts.map +1 -1
  152. package/dist/stream/sse.js +38 -2
  153. package/dist/syncer/api-parser.d.ts +10 -0
  154. package/dist/syncer/api-parser.d.ts.map +1 -0
  155. package/dist/syncer/api-parser.js +240 -0
  156. package/dist/syncer/checksum.d.ts +21 -0
  157. package/dist/syncer/checksum.d.ts.map +1 -0
  158. package/dist/syncer/checksum.js +98 -0
  159. package/dist/syncer/code-generator.d.ts +20 -0
  160. package/dist/syncer/code-generator.d.ts.map +1 -0
  161. package/dist/syncer/code-generator.js +161 -0
  162. package/dist/syncer/entity-operations.d.ts +17 -0
  163. package/dist/syncer/entity-operations.d.ts.map +1 -0
  164. package/dist/syncer/entity-operations.js +59 -0
  165. package/dist/syncer/file-patterns.d.ts +29 -0
  166. package/dist/syncer/file-patterns.d.ts.map +1 -0
  167. package/dist/syncer/file-patterns.js +38 -0
  168. package/dist/syncer/index.d.ts +6 -0
  169. package/dist/syncer/index.d.ts.map +1 -1
  170. package/dist/syncer/index.js +9 -2
  171. package/dist/syncer/module-loader.d.ts +35 -0
  172. package/dist/syncer/module-loader.d.ts.map +1 -0
  173. package/dist/syncer/module-loader.js +87 -0
  174. package/dist/syncer/syncer.d.ts +98 -106
  175. package/dist/syncer/syncer.d.ts.map +1 -1
  176. package/dist/syncer/syncer.js +422 -2
  177. package/dist/template/entity-converter.d.ts +14 -0
  178. package/dist/template/entity-converter.d.ts.map +1 -0
  179. package/dist/template/entity-converter.js +108 -0
  180. package/dist/template/helpers.d.ts +23 -0
  181. package/dist/template/helpers.d.ts.map +1 -0
  182. package/dist/template/helpers.js +64 -0
  183. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  184. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  185. package/dist/template/implementations/entity.template.js +86 -0
  186. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -4
  187. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  188. package/dist/template/implementations/generated.template.js +249 -0
  189. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -4
  190. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  191. package/dist/template/implementations/generated_http.template.js +131 -0
  192. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +4 -5
  193. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  194. package/dist/template/implementations/generated_sso.template.js +134 -0
  195. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  196. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  197. package/dist/template/implementations/init_types.template.js +38 -0
  198. package/dist/template/implementations/model.template.d.ts +17 -0
  199. package/dist/template/implementations/model.template.d.ts.map +1 -0
  200. package/dist/template/implementations/model.template.js +181 -0
  201. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  202. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  203. package/dist/template/implementations/model_test.template.js +35 -0
  204. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  205. package/dist/template/implementations/service.template.d.ts.map +1 -0
  206. package/dist/template/implementations/service.template.js +201 -0
  207. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  208. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  209. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  210. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  211. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  212. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  213. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  214. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  215. package/dist/template/implementations/view_enums_select.template.js +55 -0
  216. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  217. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  218. package/dist/template/implementations/view_form.template.js +337 -0
  219. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  220. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  221. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  222. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  223. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  224. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  225. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  226. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  227. package/dist/template/implementations/view_list.template.js +475 -0
  228. package/dist/template/implementations/view_list_columns.template.d.ts +17 -0
  229. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  230. package/dist/template/implementations/view_list_columns.template.js +49 -0
  231. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  232. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  233. package/dist/template/implementations/view_search_input.template.js +64 -0
  234. package/dist/template/index.d.ts +7 -0
  235. package/dist/template/index.d.ts.map +1 -0
  236. package/dist/template/index.js +8 -0
  237. package/dist/template/template-manager.d.ts +56 -0
  238. package/dist/template/template-manager.d.ts.map +1 -0
  239. package/dist/template/template-manager.js +125 -0
  240. package/dist/template/template-types.d.ts +16 -0
  241. package/dist/template/template-types.d.ts.map +1 -0
  242. package/dist/template/template-types.js +7 -0
  243. package/dist/template/template.d.ts +49 -0
  244. package/dist/template/template.d.ts.map +1 -0
  245. package/dist/template/template.js +60 -0
  246. package/dist/template/zod-converter.d.ts +51 -0
  247. package/dist/template/zod-converter.d.ts.map +1 -0
  248. package/dist/template/zod-converter.js +449 -0
  249. package/dist/testing/_relation-graph.d.ts +1 -1
  250. package/dist/testing/_relation-graph.d.ts.map +1 -1
  251. package/dist/testing/_relation-graph.js +89 -2
  252. package/dist/testing/fixture-manager.d.ts +42 -11
  253. package/dist/testing/fixture-manager.d.ts.map +1 -1
  254. package/dist/testing/fixture-manager.js +623 -2
  255. package/dist/types/types.d.ts +747 -143
  256. package/dist/types/types.d.ts.map +1 -1
  257. package/dist/types/types.js +546 -2
  258. package/dist/typings/knex.d.js +3 -2
  259. package/dist/utils/async-utils.d.ts +7 -0
  260. package/dist/utils/async-utils.d.ts.map +1 -1
  261. package/dist/utils/async-utils.js +57 -2
  262. package/dist/utils/console-util.d.ts +2 -0
  263. package/dist/utils/console-util.d.ts.map +1 -0
  264. package/dist/utils/console-util.js +6 -0
  265. package/dist/utils/controller.d.ts +1 -0
  266. package/dist/utils/controller.d.ts.map +1 -1
  267. package/dist/utils/controller.js +29 -2
  268. package/dist/utils/esm-utils.d.ts +39 -0
  269. package/dist/utils/esm-utils.d.ts.map +1 -0
  270. package/dist/utils/esm-utils.js +49 -0
  271. package/dist/utils/formatter.d.ts +3 -0
  272. package/dist/utils/formatter.d.ts.map +1 -0
  273. package/dist/utils/formatter.js +110 -0
  274. package/dist/utils/fs-utils.d.ts +1 -1
  275. package/dist/utils/fs-utils.d.ts.map +1 -1
  276. package/dist/utils/fs-utils.js +17 -2
  277. package/dist/utils/lodash-able.d.ts.map +1 -1
  278. package/dist/utils/lodash-able.js +6 -2
  279. package/dist/utils/model.js +22 -2
  280. package/dist/utils/object-utils.d.ts +44 -0
  281. package/dist/utils/object-utils.d.ts.map +1 -0
  282. package/dist/utils/object-utils.js +191 -0
  283. package/dist/utils/path-utils.d.ts +89 -0
  284. package/dist/utils/path-utils.d.ts.map +1 -0
  285. package/dist/utils/path-utils.js +60 -0
  286. package/dist/utils/process-utils.d.ts +13 -0
  287. package/dist/utils/process-utils.d.ts.map +1 -0
  288. package/dist/utils/process-utils.js +36 -0
  289. package/dist/utils/sql-parser.d.ts +5 -1
  290. package/dist/utils/sql-parser.d.ts.map +1 -1
  291. package/dist/utils/sql-parser.js +46 -2
  292. package/dist/utils/type-utils.d.ts +23 -0
  293. package/dist/utils/type-utils.d.ts.map +1 -0
  294. package/dist/utils/type-utils.js +45 -0
  295. package/dist/utils/utils.d.ts +10 -7
  296. package/dist/utils/utils.d.ts.map +1 -1
  297. package/dist/utils/utils.js +72 -2
  298. package/dist/utils/zod-error.d.ts +1 -1
  299. package/dist/utils/zod-error.d.ts.map +1 -1
  300. package/dist/utils/zod-error.js +19 -2
  301. package/package.json +65 -27
  302. package/src/ai/agents/agent.ts +87 -0
  303. package/src/ai/agents/index.ts +2 -0
  304. package/src/ai/agents/types.ts +47 -0
  305. package/src/ai/index.ts +1 -0
  306. package/src/ai/providers/rtzr/api.ts +37 -0
  307. package/src/ai/providers/rtzr/error.ts +34 -0
  308. package/src/ai/providers/rtzr/index.ts +4 -0
  309. package/src/ai/providers/rtzr/model.ts +201 -0
  310. package/src/ai/providers/rtzr/options.ts +49 -0
  311. package/src/ai/providers/rtzr/provider.ts +91 -0
  312. package/src/ai/providers/rtzr/utils.ts +127 -0
  313. package/src/api/base-frame.ts +4 -2
  314. package/src/api/caster.ts +17 -23
  315. package/src/api/code-converters.ts +178 -535
  316. package/src/api/config.ts +125 -0
  317. package/src/api/context.ts +7 -17
  318. package/src/api/decorators.ts +176 -46
  319. package/src/api/index.ts +2 -2
  320. package/src/api/sonamu.ts +190 -167
  321. package/src/api/validator.ts +83 -0
  322. package/src/bin/build-config.ts +8 -1
  323. package/src/bin/cli.ts +258 -124
  324. package/src/bin/hot-hook-register.ts +22 -0
  325. package/src/bin/loader-register.ts +38 -0
  326. package/src/database/_batch_update.ts +46 -31
  327. package/src/database/base-model.ts +390 -182
  328. package/src/database/base-model.types.ts +155 -0
  329. package/src/database/code-generator.ts +13 -32
  330. package/src/database/db.ts +40 -96
  331. package/src/database/puri-subset.test-d.ts +471 -0
  332. package/src/database/puri-subset.types.ts +195 -0
  333. package/src/database/puri-wrapper.ts +58 -67
  334. package/src/database/puri.ts +229 -148
  335. package/src/database/puri.types.ts +76 -30
  336. package/src/database/transaction-context.ts +1 -1
  337. package/src/database/upsert-builder.ts +262 -132
  338. package/src/entity/entity-manager.ts +48 -36
  339. package/src/entity/entity.ts +330 -248
  340. package/src/exceptions/error-handler.ts +3 -3
  341. package/src/exceptions/so-exceptions.ts +11 -11
  342. package/src/file-storage/driver.ts +5 -5
  343. package/src/file-storage/file-storage.ts +2 -2
  344. package/src/index.ts +18 -10
  345. package/src/migration/code-generation.ts +185 -172
  346. package/src/migration/migration-set.ts +80 -293
  347. package/src/migration/migrator.ts +199 -571
  348. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  349. package/src/migration/postgresql-schema-reader.ts +310 -0
  350. package/src/migration/types.ts +6 -39
  351. package/src/naite/messaging-types.ts +51 -0
  352. package/src/naite/naite-reporter.ts +128 -0
  353. package/src/naite/naite.ts +415 -0
  354. package/src/shared/web.shared.ts.txt +20 -24
  355. package/src/stream/sse.ts +5 -5
  356. package/src/syncer/api-parser.ts +282 -0
  357. package/src/syncer/checksum.ts +140 -0
  358. package/src/syncer/code-generator.ts +198 -0
  359. package/src/syncer/entity-operations.ts +65 -0
  360. package/src/syncer/file-patterns.ts +56 -0
  361. package/src/syncer/index.ts +6 -0
  362. package/src/syncer/module-loader.ts +128 -0
  363. package/src/syncer/syncer.ts +389 -1453
  364. package/src/template/entity-converter.ts +114 -0
  365. package/src/template/helpers.ts +81 -0
  366. package/src/{templates → template/implementations}/entity.template.ts +7 -7
  367. package/src/{templates → template/implementations}/generated.template.ts +101 -101
  368. package/src/{templates → template/implementations}/generated_http.template.ts +27 -57
  369. package/src/template/implementations/generated_sso.template.ts +151 -0
  370. package/src/{templates → template/implementations}/init_types.template.ts +5 -7
  371. package/src/{templates → template/implementations}/model.template.ts +52 -43
  372. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  373. package/src/{templates → template/implementations}/service.template.ts +66 -82
  374. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  375. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +4 -20
  376. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  377. package/src/{templates → template/implementations}/view_form.template.ts +40 -83
  378. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  379. package/src/{templates → template/implementations}/view_id_async_select.template.ts +10 -24
  380. package/src/{templates → template/implementations}/view_list.template.ts +60 -152
  381. package/src/{templates → template/implementations}/view_list_columns.template.ts +5 -11
  382. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  383. package/src/template/index.ts +6 -0
  384. package/src/template/template-manager.ts +166 -0
  385. package/src/template/template-types.ts +16 -0
  386. package/src/template/template.ts +105 -0
  387. package/src/template/zod-converter.ts +525 -0
  388. package/src/testing/_relation-graph.ts +18 -11
  389. package/src/testing/fixture-manager.ts +472 -359
  390. package/src/types/types.ts +553 -308
  391. package/src/typings/knex.d.ts +7 -9
  392. package/src/utils/async-utils.ts +23 -10
  393. package/src/utils/console-util.ts +4 -0
  394. package/src/utils/controller.ts +3 -0
  395. package/src/utils/esm-utils.ts +59 -0
  396. package/src/utils/formatter.ts +109 -0
  397. package/src/utils/fs-utils.ts +1 -1
  398. package/src/utils/lodash-able.ts +1 -4
  399. package/src/utils/object-utils.ts +217 -0
  400. package/src/utils/path-utils.ts +99 -0
  401. package/src/utils/process-utils.ts +46 -0
  402. package/src/utils/sql-parser.ts +23 -5
  403. package/src/utils/type-utils.ts +83 -0
  404. package/src/utils/utils.ts +66 -43
  405. package/src/utils/zod-error.ts +3 -4
  406. package/dist/api/base-frame.js.map +0 -1
  407. package/dist/api/caster.js.map +0 -1
  408. package/dist/api/code-converters.js.map +0 -1
  409. package/dist/api/context.js.map +0 -1
  410. package/dist/api/decorators.js.map +0 -1
  411. package/dist/api/index.js.map +0 -1
  412. package/dist/api/sonamu.js.map +0 -1
  413. package/dist/bin/build-config.js.map +0 -1
  414. package/dist/bin/cli-wrapper.d.ts +0 -3
  415. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  416. package/dist/bin/cli-wrapper.js +0 -3
  417. package/dist/bin/cli-wrapper.js.map +0 -1
  418. package/dist/bin/cli.js.map +0 -1
  419. package/dist/database/_batch_update.js.map +0 -1
  420. package/dist/database/base-model.js.map +0 -1
  421. package/dist/database/code-generator.js.map +0 -1
  422. package/dist/database/db.js.map +0 -1
  423. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  424. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  425. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -2
  426. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  427. package/dist/database/puri-wrapper.js.map +0 -1
  428. package/dist/database/puri.js.map +0 -1
  429. package/dist/database/puri.types.js.map +0 -1
  430. package/dist/database/transaction-context.js.map +0 -1
  431. package/dist/database/upsert-builder.js.map +0 -1
  432. package/dist/entity/entity-manager.js.map +0 -1
  433. package/dist/entity/entity-utils.d.ts +0 -61
  434. package/dist/entity/entity-utils.d.ts.map +0 -1
  435. package/dist/entity/entity-utils.js +0 -2
  436. package/dist/entity/entity-utils.js.map +0 -1
  437. package/dist/entity/entity.js.map +0 -1
  438. package/dist/exceptions/error-handler.js.map +0 -1
  439. package/dist/exceptions/so-exceptions.js.map +0 -1
  440. package/dist/file-storage/driver.js.map +0 -1
  441. package/dist/file-storage/file-storage.js.map +0 -1
  442. package/dist/index.js.map +0 -1
  443. package/dist/migration/code-generation.js.map +0 -1
  444. package/dist/migration/migration-set.js.map +0 -1
  445. package/dist/migration/migrator.js.map +0 -1
  446. package/dist/migration/types.js.map +0 -1
  447. package/dist/stream/index.js.map +0 -1
  448. package/dist/stream/sse.js.map +0 -1
  449. package/dist/syncer/index.js.map +0 -1
  450. package/dist/syncer/syncer.js.map +0 -1
  451. package/dist/templates/base-template.d.ts +0 -13
  452. package/dist/templates/base-template.d.ts.map +0 -1
  453. package/dist/templates/base-template.js +0 -2
  454. package/dist/templates/base-template.js.map +0 -1
  455. package/dist/templates/entity.template.d.ts.map +0 -1
  456. package/dist/templates/entity.template.js +0 -2
  457. package/dist/templates/entity.template.js.map +0 -1
  458. package/dist/templates/generated.template.d.ts.map +0 -1
  459. package/dist/templates/generated.template.js +0 -2
  460. package/dist/templates/generated.template.js.map +0 -1
  461. package/dist/templates/generated_http.template.d.ts.map +0 -1
  462. package/dist/templates/generated_http.template.js +0 -2
  463. package/dist/templates/generated_http.template.js.map +0 -1
  464. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  465. package/dist/templates/generated_sso.template.js +0 -2
  466. package/dist/templates/generated_sso.template.js.map +0 -1
  467. package/dist/templates/index.d.ts +0 -2
  468. package/dist/templates/index.d.ts.map +0 -1
  469. package/dist/templates/index.js +0 -2
  470. package/dist/templates/index.js.map +0 -1
  471. package/dist/templates/init_types.template.d.ts.map +0 -1
  472. package/dist/templates/init_types.template.js +0 -2
  473. package/dist/templates/init_types.template.js.map +0 -1
  474. package/dist/templates/model.template.d.ts +0 -17
  475. package/dist/templates/model.template.d.ts.map +0 -1
  476. package/dist/templates/model.template.js +0 -2
  477. package/dist/templates/model.template.js.map +0 -1
  478. package/dist/templates/model_test.template.d.ts.map +0 -1
  479. package/dist/templates/model_test.template.js +0 -2
  480. package/dist/templates/model_test.template.js.map +0 -1
  481. package/dist/templates/service.template.d.ts.map +0 -1
  482. package/dist/templates/service.template.js +0 -2
  483. package/dist/templates/service.template.js.map +0 -1
  484. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  485. package/dist/templates/view_enums_buttonset.template.js +0 -2
  486. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  487. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  488. package/dist/templates/view_enums_dropdown.template.js +0 -2
  489. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  490. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  491. package/dist/templates/view_enums_select.template.js +0 -2
  492. package/dist/templates/view_enums_select.template.js.map +0 -1
  493. package/dist/templates/view_form.template.d.ts.map +0 -1
  494. package/dist/templates/view_form.template.js +0 -2
  495. package/dist/templates/view_form.template.js.map +0 -1
  496. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  497. package/dist/templates/view_id_all_select.template.js +0 -2
  498. package/dist/templates/view_id_all_select.template.js.map +0 -1
  499. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  500. package/dist/templates/view_id_async_select.template.js +0 -2
  501. package/dist/templates/view_id_async_select.template.js.map +0 -1
  502. package/dist/templates/view_list.template.d.ts.map +0 -1
  503. package/dist/templates/view_list.template.js +0 -2
  504. package/dist/templates/view_list.template.js.map +0 -1
  505. package/dist/templates/view_list_columns.template.d.ts +0 -17
  506. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  507. package/dist/templates/view_list_columns.template.js +0 -2
  508. package/dist/templates/view_list_columns.template.js.map +0 -1
  509. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  510. package/dist/templates/view_search_input.template.js +0 -2
  511. package/dist/templates/view_search_input.template.js.map +0 -1
  512. package/dist/testing/_relation-graph.js.map +0 -1
  513. package/dist/testing/fixture-manager.js.map +0 -1
  514. package/dist/types/types.js.map +0 -1
  515. package/dist/typings/knex.d.js.map +0 -1
  516. package/dist/utils/async-utils.js.map +0 -1
  517. package/dist/utils/controller.js.map +0 -1
  518. package/dist/utils/fs-utils.js.map +0 -1
  519. package/dist/utils/lodash-able.js.map +0 -1
  520. package/dist/utils/model.js.map +0 -1
  521. package/dist/utils/sql-parser.js.map +0 -1
  522. package/dist/utils/utils.js.map +0 -1
  523. package/dist/utils/zod-error.js.map +0 -1
  524. package/src/bin/cli-wrapper.ts +0 -75
  525. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  526. package/src/entity/entity-utils.ts +0 -291
  527. package/src/templates/base-template.ts +0 -19
  528. package/src/templates/generated_sso.template.ts +0 -138
  529. package/src/templates/index.ts +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/_batch_update.ts"],"sourcesContent":["/*\n 아래의 링크에서 참고해서 가져온 소스코드\n https://github.com/knex/knex/issues/5716\n*/\n\nimport { Knex } from \"knex\";\n\nexport type RowWithId<Id extends string> = {\n [key in Id]: any;\n} & Record<string, any>;\n\n/**\n * Batch update rows in a table. Technically its a patch since it only updates the specified columns. Any omitted columns will not be affected\n * @param db\n * @param tableName\n * @param ids\n * @param rows\n * @param chunkSize\n * @param trx\n */\nexport async function batchUpdate<Id extends string>(\n knex: Knex,\n tableName: string,\n ids: Id[],\n rows: RowWithId<Id>[],\n chunkSize = 50,\n trx: Knex.Transaction | null = null\n) {\n const chunks: RowWithId<Id>[][] = [];\n for (let i = 0; i < rows.length; i += chunkSize) {\n chunks.push(rows.slice(i, i + chunkSize));\n }\n\n const executeUpdate = async (\n chunk: RowWithId<Id>[],\n transaction: Knex.Transaction\n ) => {\n const sql = generateBatchUpdateSQL(knex, tableName, chunk, ids);\n return knex.raw(sql).transacting(transaction);\n };\n\n if (trx) {\n for (const chunk of chunks) {\n await executeUpdate(chunk, trx);\n }\n } else {\n await knex.transaction(async (newTrx) => {\n for (const chunk of chunks) {\n await executeUpdate(chunk, newTrx);\n }\n });\n }\n}\n\n/**\n * Generate a set of unique keys in a data array\n *\n * Example:\n * [ { a: 1, b: 2 }, { a: 3, c: 4 } ] => Set([ \"a\", \"b\", \"c\" ])\n * @param data\n */\nfunction generateKeySetFromData(data: Record<string, any>[]) {\n const keySet: Set<string> = new Set();\n for (const row of data) {\n for (const key of Object.keys(row)) {\n keySet.add(key);\n }\n }\n return keySet;\n}\n\nfunction generateBatchUpdateSQL<Id extends string>(\n db: Knex,\n tableName: string,\n data: Record<string, any>[],\n identifiers: Id[]\n) {\n const keySet = generateKeySetFromData(data);\n const bindings = [];\n\n const invalidIdentifiers = identifiers.filter((id) => !keySet.has(id));\n if (invalidIdentifiers.length > 0) {\n throw new Error(\n `Invalid identifiers: ${invalidIdentifiers.join(\", \")}. Identifiers must exist in the data`\n );\n }\n\n const cases = [];\n for (const key of keySet) {\n if (identifiers.includes(key as Id)) continue;\n\n const rows = [];\n for (const row of data) {\n if (Object.hasOwnProperty.call(row, key)) {\n const whereClause = identifiers\n .map((id) => `\\`${id}\\` = ?`)\n .join(\" AND \");\n rows.push(`WHEN (${whereClause}) THEN ?`);\n bindings.push(...identifiers.map((i) => row[i]), row[key]);\n }\n }\n\n const whenThen = rows.join(\" \");\n cases.push(`\\`${key}\\` = CASE ${whenThen} ELSE \\`${key}\\` END`);\n }\n\n const whereInClauses = identifiers\n .map((col) => `${col} IN (${data.map(() => \"?\").join(\", \")})`)\n .join(\" AND \");\n\n const whereInBindings = identifiers.flatMap((col) =>\n data.map((row) => row[col])\n );\n\n const sql = db.raw(\n `UPDATE \\`${tableName}\\` SET ${cases.join(\", \")} WHERE ${whereInClauses}`,\n [...bindings, ...whereInBindings]\n );\n\n return sql.toQuery();\n}\n"],"names":["batchUpdate","knex","tableName","ids","rows","chunkSize","trx","chunks","i","executeUpdate","chunk","length","push","slice","transaction","sql","generateBatchUpdateSQL","raw","transacting","newTrx","generateKeySetFromData","data","keySet","Set","row","Object","keys","key","add","db","identifiers","bindings","invalidIdentifiers","filter","id","has","Error","join","cases","includes","hasOwnProperty","call","whereClause","map","whenThen","whereInClauses","col","whereInBindings","flatMap","toQuery"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/base-model.ts"],"sourcesContent":["import { DateTime } from \"luxon\";\nimport { Knex } from \"knex\";\nimport { chunk, groupBy, isObject, omit, set, uniq } from \"lodash\";\nimport { DBPreset, DB } from \"./db\";\nimport { isCustomJoinClause, type SubsetQuery } from \"../types/types\";\nimport type { BaseListParams } from \"../utils/model\";\nimport inflection from \"inflection\";\nimport chalk from \"chalk\";\nimport { UpsertBuilder } from \"./upsert-builder\";\nimport SqlParser from \"node-sql-parser\";\nimport { getTableName, getTableNamesFromWhere } from \"../utils/sql-parser\";\nimport { PuriWrapper } from \"./puri-wrapper\";\n\nexport class BaseModelClass {\n public modelName: string = \"Unknown\";\n\n /* DB 인스턴스 get, destroy */\n getDB(which: DBPreset): Knex {\n return DB.getDB(which);\n }\n\n getPuri(which: DBPreset): PuriWrapper {\n // 트랜잭션 컨텍스트에서 트랜잭션 획득\n const trx = DB.getTransactionContext().getTransaction(which);\n if (trx) {\n return trx;\n }\n\n // 트랜잭션이 없으면 새로운 PuriWrapper 반환\n const db = this.getDB(which);\n return new PuriWrapper(db, this.getUpsertBuilder());\n }\n\n async destroy() {\n return DB.destroy();\n }\n\n myNow(timestamp?: number): string {\n const dt: DateTime =\n timestamp === undefined\n ? DateTime.local()\n : DateTime.fromSeconds(timestamp);\n return dt.toFormat(\"yyyy-MM-dd HH:mm:ss\");\n }\n\n async getInsertedIds(\n wdb: Knex,\n rows: any[],\n tableName: string,\n unqKeyFields: string[],\n chunkSize: number = 500\n ) {\n if (!wdb) {\n wdb = this.getDB(\"w\");\n }\n\n let unqKeys: string[];\n let whereInField: any, selectField: string;\n if (unqKeyFields.length > 1) {\n whereInField = wdb.raw(`CONCAT_WS('_', '${unqKeyFields.join(\",\")}')`);\n selectField = `${whereInField} as tmpUid`;\n unqKeys = rows.map((row) =>\n unqKeyFields.map((field) => row[field]).join(\"_\")\n );\n } else {\n whereInField = unqKeyFields[0];\n selectField = unqKeyFields[0];\n unqKeys = rows.map((row) => row[unqKeyFields[0]]);\n }\n const chunks = chunk(unqKeys, chunkSize);\n\n let resultIds: number[] = [];\n for (let chunk of chunks) {\n const dbRows = await wdb(tableName)\n .select(\"id\", wdb.raw(selectField))\n .whereIn(whereInField, chunk);\n resultIds = resultIds.concat(\n dbRows.map((dbRow: any) => parseInt(dbRow.id))\n );\n }\n\n return resultIds;\n }\n\n async useLoaders(db: Knex, rows: any[], loaders: SubsetQuery[\"loaders\"]) {\n if (loaders.length === 0) {\n return rows;\n }\n\n for (let loader of loaders) {\n let subQ: any;\n let subRows: any[];\n let toCol: string;\n\n const fromIds = rows.map((row) => row[loader.manyJoin.idField]);\n\n if (loader.manyJoin.through === undefined) {\n // HasMany\n const idColumn = `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`;\n subQ = db(loader.manyJoin.toTable)\n .whereIn(idColumn, fromIds)\n .select([...loader.select, idColumn]);\n\n // HasMany에서 OneJoin이 있는 경우\n loader.oneJoins.map((join) => {\n if (join.join == \"inner\") {\n subQ.innerJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n } else if (join.join == \"outer\") {\n subQ.leftOuterJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n }\n });\n toCol = loader.manyJoin.toCol;\n } else {\n // ManyToMany\n const idColumn = `${loader.manyJoin.through.table}.${loader.manyJoin.through.fromCol}`;\n subQ = db(loader.manyJoin.through.table)\n .join(\n loader.manyJoin.toTable,\n `${loader.manyJoin.through.table}.${loader.manyJoin.through.toCol}`,\n `${loader.manyJoin.toTable}.${loader.manyJoin.toCol}`\n )\n .whereIn(idColumn, fromIds)\n .select(uniq([...loader.select, idColumn]));\n\n // ManyToMany에서 OneJoin이 있는 경우\n loader.oneJoins.map((join) => {\n if (join.join == \"inner\") {\n subQ.innerJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n } else if (join.join == \"outer\") {\n subQ.leftOuterJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n }\n });\n toCol = loader.manyJoin.through.fromCol;\n }\n subRows = await subQ;\n\n if (loader.loaders) {\n // 추가 -Many 케이스가 있는 경우 recursion 처리\n subRows = await this.useLoaders(db, subRows, loader.loaders);\n }\n\n // 불러온 row들을 참조ID 기준으로 분류 배치\n const subRowGroups = groupBy(subRows, toCol);\n rows = rows.map((row) => {\n row[loader.as] = (subRowGroups[row[loader.manyJoin.idField]] ?? []).map(\n (r) => omit(r, toCol)\n );\n return row;\n });\n }\n return rows;\n }\n\n hydrate<T>(rows: T[]): T[] {\n return rows.map((row: any) => {\n // nullable relation인 경우 관련된 필드가 전부 null로 생성되는 것 방지하는 코드\n const nestedKeys = Object.keys(row).filter((key) => key.includes(\"__\"));\n const groups = groupBy(nestedKeys, (key) => key.split(\"__\")[0]);\n const nullKeys = Object.keys(groups).filter(\n (key) =>\n groups[key].length > 1 &&\n groups[key].every(\n (field) =>\n row[field] === null ||\n (Array.isArray(row[field]) && row[field].length === 0)\n )\n );\n\n const hydrated = Object.keys(row).reduce((r, field) => {\n if (!field.includes(\"__\")) {\n if (Array.isArray(row[field]) && isObject(row[field][0])) {\n r[field] = this.hydrate(row[field]);\n return r;\n } else {\n r[field] = row[field];\n return r;\n }\n }\n\n const parts = field.split(\"__\");\n const objPath =\n parts[0] +\n parts\n .slice(1)\n .map((part) => `[${part}]`)\n .join(\"\");\n set(\n r,\n objPath,\n row[field] && Array.isArray(row[field]) && isObject(row[field][0])\n ? this.hydrate(row[field])\n : row[field]\n );\n\n return r;\n }, {} as any);\n nullKeys.map((nullKey) => (hydrated[nullKey] = null));\n\n return hydrated;\n });\n }\n\n async runSubsetQuery<T extends BaseListParams, U extends string>({\n params,\n baseTable,\n subset,\n subsetQuery,\n build,\n afterBuild,\n debug,\n db: _db,\n optimizeCountQuery,\n }: {\n subset: U;\n params: T;\n subsetQuery: SubsetQuery;\n build: (buildParams: {\n qb: Knex.QueryBuilder;\n db: Knex;\n select: (string | Knex.Raw)[];\n joins: SubsetQuery[\"joins\"];\n virtual: string[];\n }) => Knex.QueryBuilder;\n afterBuild?: (buildParams: {\n qb: Knex.QueryBuilder;\n db: Knex;\n select: (string | Knex.Raw)[];\n joins: SubsetQuery[\"joins\"];\n virtual: string[];\n }) => Knex.QueryBuilder;\n baseTable?: string;\n debug?: boolean | \"list\" | \"count\";\n db?: Knex;\n optimizeCountQuery?: boolean;\n }): Promise<{\n rows: any[];\n total?: number | undefined;\n subsetQuery: SubsetQuery;\n qb: Knex.QueryBuilder;\n }> {\n const db = _db ?? this.getDB(subset.startsWith(\"A\") ? \"w\" : \"r\");\n baseTable =\n baseTable ?? inflection.pluralize(inflection.underscore(this.modelName));\n const queryMode =\n params.queryMode ?? (params.id !== undefined ? \"list\" : \"both\");\n\n const { select, virtual, joins, loaders } = subsetQuery;\n const qb = build({\n qb: db.from(baseTable),\n db,\n select,\n joins,\n virtual,\n });\n\n const applyJoinClause = (\n qb: Knex.QueryBuilder,\n joins: SubsetQuery[\"joins\"]\n ) => {\n joins.map((join) => {\n if (join.join == \"inner\") {\n qb.innerJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n } else if (join.join == \"outer\") {\n qb.leftOuterJoin(\n `${join.table} as ${join.as}`,\n this.getJoinClause(db, join)\n );\n }\n });\n };\n\n // countQuery\n const total = await (async () => {\n if (queryMode === \"list\") {\n return undefined;\n }\n\n const clonedQb = qb.clone().clear(\"order\").clear(\"offset\").clear(\"limit\");\n const parser = new SqlParser.Parser();\n\n // optmizeCountQuery가 true인 경우 다른 clause에 영향을 주지 않는 모든 join을 제외함\n if (optimizeCountQuery) {\n const parsedQuery = parser.astify(clonedQb.toQuery());\n const tables = getTableNamesFromWhere(parsedQuery);\n // where절에 사용되는 테이블의 조인을 위해 사용되는 테이블\n const needToJoin = uniq(\n tables.flatMap((table) =>\n table.split(\"__\").map((t) => inflection.pluralize(t))\n )\n );\n applyJoinClause(\n clonedQb,\n joins.filter((j) => needToJoin.includes(j.table))\n );\n } else {\n applyJoinClause(clonedQb, joins);\n }\n\n const processedQb =\n afterBuild?.({\n qb: clonedQb,\n db,\n select,\n joins,\n virtual,\n }) ?? clonedQb;\n\n const parsedQuery = parser.astify(processedQb.toQuery());\n const q = Array.isArray(parsedQuery) ? parsedQuery[0] : parsedQuery;\n if (q.type !== \"select\") {\n throw new Error(\"Invalid query\");\n }\n\n const countQuery =\n q.distinct !== null\n ? clonedQb\n .clear(\"select\")\n .select(\n db.raw(\n `COUNT(DISTINCT \\`${getTableName(q.columns[0].expr)}\\`.\\`${q.columns[0].expr.column}\\`) as total`\n )\n )\n .first()\n : clonedQb.clear(\"select\").count(\"*\", { as: \"total\" }).first();\n const countRow: { total?: number } = await countQuery;\n\n // debug: countQuery\n if (debug === true || debug === \"count\") {\n console.debug(\n \"DEBUG: count query\",\n chalk.blue(countQuery.toQuery().toString())\n );\n }\n\n return countRow?.total ?? 0;\n })();\n\n // listQuery\n const rows = await (async () => {\n if (queryMode === \"count\") {\n return [];\n }\n\n // limit, offset\n if (params.num !== 0) {\n qb.limit(params.num!);\n qb.offset(params.num! * (params.page! - 1));\n }\n\n // select, rows\n const clonedQb = qb.clone().select(select);\n\n // join\n applyJoinClause(clonedQb, joins);\n\n const listQuery =\n afterBuild?.({\n qb: clonedQb,\n db,\n select,\n joins,\n virtual,\n }) ?? clonedQb;\n\n let rows = await listQuery;\n // debug: listQuery\n if (debug === true || debug === \"list\") {\n console.debug(\n \"DEBUG: list query\",\n chalk.blue(listQuery.toQuery().toString())\n );\n }\n\n rows = await this.useLoaders(db, rows, loaders);\n rows = this.hydrate(rows);\n return rows;\n })();\n\n return { rows, total, subsetQuery, qb };\n }\n\n getJoinClause(\n db: Knex<any, unknown>,\n join: SubsetQuery[\"joins\"][number]\n ): Knex.Raw<any> {\n if (!isCustomJoinClause(join)) {\n return db.raw(`${join.from} = ${join.to}`);\n } else {\n return db.raw(join.custom);\n }\n }\n\n getUpsertBuilder(): UpsertBuilder {\n return new UpsertBuilder();\n }\n}\nexport const BaseModel = new BaseModelClass();\n"],"names":["BaseModel","BaseModelClass","modelName","getDB","which","DB","getPuri","trx","getTransactionContext","getTransaction","db","PuriWrapper","getUpsertBuilder","destroy","myNow","timestamp","dt","undefined","DateTime","local","fromSeconds","toFormat","getInsertedIds","wdb","rows","tableName","unqKeyFields","chunkSize","unqKeys","whereInField","selectField","chunks","resultIds","chunk","dbRows","length","raw","join","map","row","field","select","whereIn","concat","dbRow","parseInt","id","useLoaders","loaders","loader","subQ","subRows","toCol","fromIds","idColumn","subRowGroups","manyJoin","idField","through","toTable","oneJoins","innerJoin","table","as","getJoinClause","leftOuterJoin","fromCol","uniq","groupBy","r","omit","hydrate","nestedKeys","Object","keys","filter","key","includes","groups","split","nullKeys","every","Array","isArray","hydrated","reduce","isObject","parts","objPath","slice","part","set","nullKey","runSubsetQuery","params","baseTable","subset","subsetQuery","build","afterBuild","debug","_db","optimizeCountQuery","queryMode","virtual","joins","qb","applyJoinClause","total","startsWith","inflection","pluralize","underscore","from","clonedQb","parser","parsedQuery","tables","needToJoin","processedQb","q","countQuery","countRow","clone","clear","SqlParser","Parser","astify","toQuery","getTableNamesFromWhere","flatMap","t","j","type","Error","distinct","getTableName","columns","expr","column","first","count","console","chalk","blue","toString","listQuery","num","limit","offset","page","isCustomJoinClause","to","custom","UpsertBuilder"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/code-generator.ts"],"sourcesContent":["import _ from \"lodash\";\nimport equal from \"fast-deep-equal\";\nimport { MigrationColumn, MigrationIndex } from \"../types/types\";\n\nexport class CodeGenerator {\n getAlterColumnsTo(\n entityColumns: MigrationColumn[],\n dbColumns: MigrationColumn[]\n ) {\n const columnsTo = {\n add: [] as MigrationColumn[],\n drop: [] as MigrationColumn[],\n alter: [] as MigrationColumn[],\n };\n\n // 컬럼명 기준 비교\n const extraColumns = {\n db: _.differenceBy(dbColumns, entityColumns, (col) => col.name),\n entity: _.differenceBy(entityColumns, dbColumns, (col) => col.name),\n };\n if (extraColumns.entity.length > 0) {\n columnsTo.add = columnsTo.add.concat(extraColumns.entity);\n }\n if (extraColumns.db.length > 0) {\n columnsTo.drop = columnsTo.drop.concat(extraColumns.db);\n }\n\n // 동일 컬럼명의 세부 필드 비교\n const sameDbColumns = _.intersectionBy(\n dbColumns,\n entityColumns,\n (col) => col.name\n );\n const sameMdColumns = _.intersectionBy(\n entityColumns,\n dbColumns,\n (col) => col.name\n );\n columnsTo.alter = _.differenceWith(sameDbColumns, sameMdColumns, (a, b) =>\n equal(a, b)\n );\n\n return columnsTo;\n }\n\n getAlterIndexesTo(\n entityIndexes: MigrationIndex[],\n dbIndexes: MigrationIndex[]\n ) {\n // 인덱스 비교\n let indexesTo = {\n add: [] as MigrationIndex[],\n drop: [] as MigrationIndex[],\n };\n const extraIndexes = {\n db: _.differenceBy(dbIndexes, entityIndexes, (col) =>\n [col.type, col.columns.join(\"-\")].join(\"//\")\n ),\n entity: _.differenceBy(entityIndexes, dbIndexes, (col) =>\n [col.type, col.columns.join(\"-\")].join(\"//\")\n ),\n };\n if (extraIndexes.entity.length > 0) {\n indexesTo.add = indexesTo.add.concat(extraIndexes.entity);\n }\n if (extraIndexes.db.length > 0) {\n indexesTo.drop = indexesTo.drop.concat(extraIndexes.db);\n }\n\n return indexesTo;\n }\n}\n"],"names":["CodeGenerator","getAlterColumnsTo","entityColumns","dbColumns","columnsTo","add","drop","alter","extraColumns","db","_","differenceBy","col","name","entity","length","concat","sameDbColumns","intersectionBy","sameMdColumns","differenceWith","a","b","equal","getAlterIndexesTo","entityIndexes","dbIndexes","indexesTo","extraIndexes","type","columns","join"],"mappings":"oGAIaA,uDAAAA,2EAJC,4EACI,+tBAGX,IAAA,AAAMA,2BAAN,iCAAMA,uCAAAA,6BAAAA,gBACXC,IAAAA,0BAAAA,SAAAA,kBACEC,aAAgC,CAChCC,SAA4B,EAE5B,IAAMC,UAAY,CAChBC,IAAK,EAAE,CACPC,KAAM,EAAE,CACRC,MAAO,EAAE,AACX,EAGA,IAAMC,aAAe,CACnBC,GAAIC,eAAC,CAACC,YAAY,CAACR,UAAWD,cAAe,SAACU,YAAQA,IAAIC,IAAI,GAC9DC,OAAQJ,eAAC,CAACC,YAAY,CAACT,cAAeC,UAAW,SAACS,YAAQA,IAAIC,IAAI,EACpE,EACA,GAAIL,aAAaM,MAAM,CAACC,MAAM,CAAG,EAAG,CAClCX,UAAUC,GAAG,CAAGD,UAAUC,GAAG,CAACW,MAAM,CAACR,aAAaM,MAAM,CAC1D,CACA,GAAIN,aAAaC,EAAE,CAACM,MAAM,CAAG,EAAG,CAC9BX,UAAUE,IAAI,CAAGF,UAAUE,IAAI,CAACU,MAAM,CAACR,aAAaC,EAAE,CACxD,CAGA,IAAMQ,cAAgBP,eAAC,CAACQ,cAAc,CACpCf,UACAD,cACA,SAACU,YAAQA,IAAIC,IAAI,GAEnB,IAAMM,cAAgBT,eAAC,CAACQ,cAAc,CACpChB,cACAC,UACA,SAACS,YAAQA,IAAIC,IAAI,EAEnBT,CAAAA,UAAUG,KAAK,CAAGG,eAAC,CAACU,cAAc,CAACH,cAAeE,cAAe,SAACE,EAAGC,SACnEC,GAAAA,sBAAK,EAACF,EAAGC,KAGX,OAAOlB,SACT,IAEAoB,IAAAA,0BAAAA,SAAAA,kBACEC,aAA+B,CAC/BC,SAA2B,EAG3B,IAAIC,UAAY,CACdtB,IAAK,EAAE,CACPC,KAAM,EAAE,AACV,EACA,IAAMsB,aAAe,CACnBnB,GAAIC,eAAC,CAACC,YAAY,CAACe,UAAWD,cAAe,SAACb,WAC5C,CAACA,IAAIiB,IAAI,CAAEjB,IAAIkB,OAAO,CAACC,IAAI,CAAC,KAAK,CAACA,IAAI,CAAC,QAEzCjB,OAAQJ,eAAC,CAACC,YAAY,CAACc,cAAeC,UAAW,SAACd,WAChD,CAACA,IAAIiB,IAAI,CAAEjB,IAAIkB,OAAO,CAACC,IAAI,CAAC,KAAK,CAACA,IAAI,CAAC,OAE3C,EACA,GAAIH,aAAad,MAAM,CAACC,MAAM,CAAG,EAAG,CAClCY,UAAUtB,GAAG,CAAGsB,UAAUtB,GAAG,CAACW,MAAM,CAACY,aAAad,MAAM,CAC1D,CACA,GAAIc,aAAanB,EAAE,CAACM,MAAM,CAAG,EAAG,CAC9BY,UAAUrB,IAAI,CAAGqB,UAAUrB,IAAI,CAACU,MAAM,CAACY,aAAanB,EAAE,CACxD,CAEA,OAAOkB,SACT,YAlEW3B"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/db.ts"],"sourcesContent":["export type DBPreset = \"w\" | \"r\";\nimport knex, { Knex } from \"knex\";\nimport path from \"path\";\nimport _ from \"lodash\";\nimport { Sonamu } from \"../api\";\nimport { ServiceUnavailableException } from \"../exceptions/so-exceptions\";\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport { TransactionContext } from \"./transaction-context\";\n\ntype MySQLConfig = Omit<Knex.Config, \"connection\"> & {\n connection?: Knex.MySql2ConnectionConfig;\n};\n\nexport type SonamuDBBaseConfig = {\n // 기본 데이터베이스 이름\n database: string;\n\n // 모든 환경에 적용될 기본 Knex 옵션\n defaultOptions?: MySQLConfig;\n\n // 환경별 설정\n environments?: {\n development?: MySQLConfig;\n development_slave?: MySQLConfig;\n production?: MySQLConfig;\n production_slave?: MySQLConfig;\n remote_fixture?: MySQLConfig;\n };\n};\n\nexport type SonamuDBConfig = {\n development_master: Knex.Config;\n development_slave: Knex.Config;\n test: Knex.Config;\n fixture_local: Knex.Config;\n fixture_remote: Knex.Config;\n production_master: Knex.Config;\n production_slave: Knex.Config;\n};\n\nclass DBClass {\n private wdb?: Knex;\n private rdb?: Knex;\n\n public transactionStorage = new AsyncLocalStorage<TransactionContext>();\n\n public runWithTransaction<T>(callback: () => Promise<T>): Promise<T> {\n return this.transactionStorage.run(new TransactionContext(), callback);\n }\n\n public getTransactionContext(): TransactionContext {\n return this.transactionStorage.getStore() ?? new TransactionContext();\n }\n\n async readKnexfile(): Promise<SonamuDBConfig> {\n const dbConfigPath: string = path.join(\n Sonamu.apiRootPath,\n \"/dist/configs/db.js\"\n );\n try {\n const knexfileModule = await import(dbConfigPath);\n const config =\n knexfileModule.default?.default ??\n knexfileModule.default ??\n knexfileModule;\n return this.generateDBConfig(config);\n } catch {}\n\n throw new ServiceUnavailableException(\n `다음 경로에서 DB설정 파일을 찾을 수 없습니다: ${dbConfigPath}. 먼저 빌드(yarn build)를 수행해주세요.`\n );\n }\n\n getDB(which: DBPreset): Knex {\n const dbConfig = Sonamu.dbConfig;\n\n // 테스트 트랜잭션 격리\n if (process.env.NODE_ENV === \"test\") {\n if (this.testTransaction) {\n return this.testTransaction;\n } else if (this.wdb) {\n return this.wdb;\n } else {\n this[\"wdb\"] = knex({\n ...dbConfig[\"test\"],\n // 단일 풀\n pool: {\n min: 1,\n max: 1,\n },\n });\n return this[\"wdb\"];\n }\n }\n\n const instanceName = which === \"w\" ? \"wdb\" : \"rdb\";\n\n if (!this[instanceName]) {\n let config: Knex.Config;\n switch (process.env.NODE_ENV ?? \"development\") {\n case \"development\":\n case \"staging\":\n config =\n which === \"w\"\n ? dbConfig[\"development_master\"]\n : (dbConfig[\"development_slave\"] ??\n dbConfig[\"development_master\"]);\n break;\n case \"production\":\n config =\n which === \"w\"\n ? dbConfig[\"production_master\"]\n : (dbConfig[\"production_slave\"] ?? dbConfig[\"production_master\"]);\n break;\n default:\n throw new Error(\n `현재 ENV ${process.env.NODE_ENV}에는 설정 가능한 DB설정이 없습니다.`\n );\n }\n this[instanceName] = knex(config);\n }\n\n return this[instanceName]!;\n }\n\n async destroy(): Promise<void> {\n if (this.wdb !== undefined) {\n await this.wdb.destroy();\n this.wdb = undefined;\n }\n if (this.rdb !== undefined) {\n await this.rdb.destroy();\n this.rdb = undefined;\n }\n }\n\n private generateDBConfig(config: SonamuDBBaseConfig): SonamuDBConfig {\n const defaultKnexConfig: Partial<MySQLConfig> = _.merge(\n {\n client: \"mysql2\",\n pool: {\n min: 1,\n max: 5,\n },\n migrations: {\n extension: \"js\",\n directory: \"./dist/migrations\",\n },\n connection: {\n database: config.database,\n ...config.defaultOptions?.connection,\n },\n },\n config.defaultOptions\n );\n\n // 로컬 환경 설정\n const test: MySQLConfig = _.merge({}, defaultKnexConfig, {\n connection: {\n database: `${config.database}_test`,\n ...config.defaultOptions?.connection,\n },\n });\n\n const fixture_local = _.merge({}, defaultKnexConfig, {\n connection: {\n database: `${config.database}_fixture_local`,\n ...config.defaultOptions?.connection,\n },\n });\n\n // 개발 환경 설정\n const devMasterOptions = config.environments?.development;\n const devSlaveOptions = config.environments?.development_slave;\n const development_master = _.merge({}, defaultKnexConfig, devMasterOptions);\n const development_slave = _.merge(\n {},\n defaultKnexConfig,\n devMasterOptions,\n devSlaveOptions\n );\n // NOTE: fixture remote는 default connection의 DB를 override해선 안됨.\n const fixture_remote = _.merge(\n {},\n defaultKnexConfig,\n devMasterOptions,\n {\n connection: {\n database: `${config.database}_fixture_remote`,\n },\n },\n config.environments?.remote_fixture\n );\n\n // 프로덕션 환경 설정\n const prodMasterOptions = config.environments?.production ?? {};\n const prodSlaveOptions = config.environments?.production_slave ?? {};\n const production_master = _.merge({}, defaultKnexConfig, prodMasterOptions);\n const production_slave = _.merge(\n {},\n defaultKnexConfig,\n prodMasterOptions,\n prodSlaveOptions\n );\n\n return {\n test,\n fixture_local,\n fixture_remote,\n development_master,\n development_slave,\n production_master,\n production_slave,\n };\n }\n\n // Test 환경에서 트랜잭션 사용\n public testTransaction: Knex.Transaction | null = null;\n async createTestTransaction(): Promise<Knex.Transaction> {\n const db = this.getDB(\"w\");\n this.testTransaction = await db.transaction();\n return this.testTransaction;\n }\n async clearTestTransaction(): Promise<void> {\n await this.testTransaction?.rollback();\n this.testTransaction = null;\n }\n}\nexport const DB = new DBClass();\n"],"names":["DB","DBClass","wdb","rdb","transactionStorage","AsyncLocalStorage","testTransaction","runWithTransaction","callback","run","TransactionContext","getTransactionContext","getStore","readKnexfile","dbConfigPath","knexfileModule","config","path","join","Sonamu","apiRootPath","default","generateDBConfig","ServiceUnavailableException","getDB","which","dbConfig","process","env","NODE_ENV","knex","pool","min","max","instanceName","Error","destroy","undefined","defaultKnexConfig","_","merge","client","migrations","extension","directory","connection","database","defaultOptions","test","fixture_local","devMasterOptions","environments","development","devSlaveOptions","development_slave","development_master","fixture_remote","remote_fixture","prodMasterOptions","production","prodSlaveOptions","production_slave","production_master","createTestTransaction","db","transaction","clearTestTransaction","rollback"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function attachOnDuplicateUpdate(): void;
2
- //# sourceMappingURL=knex-on-duplicate-update.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"knex-on-duplicate-update.d.ts","sourceRoot":"","sources":["../../../src/database/knex-plugins/knex-on-duplicate-update.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,SA0CtC"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"attachOnDuplicateUpdate",{enumerable:true,get:function(){return attachOnDuplicateUpdate}});var _knex=/*#__PURE__*/_interop_require_default(require("knex"));function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _type_of(obj){"@swc/helpers - typeof";return obj&&typeof Symbol!=="undefined"&&obj.constructor===Symbol?"symbol":typeof obj}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function attachOnDuplicateUpdate(){try{_knex.default.QueryBuilder.extend("onDuplicateUpdate",function(){for(var _len=arguments.length,columns=new Array(_len),_key=0;_key<_len;_key++){columns[_key]=arguments[_key]}if(columns.length===0){var _this_toSQL=this.toSQL(),originalSQL=_this_toSQL.sql,originalBindings=_this_toSQL.bindings;return this.client.raw(originalSQL,originalBindings)}var _columns_reduce=columns.reduce(function(result,column){if(typeof column==="string"){result.placeholders.push("?? = Values(??)");result.bindings.push(column,column)}else if(column&&(typeof column==="undefined"?"undefined":_type_of(column))==="object"){Object.keys(column).forEach(function(key){result.placeholders.push("?? = ?");result.bindings.push(key,column[key])})}else{throw new Error("onDuplicateUpdate error: expected column name to be string or object.")}return result},{placeholders:[],bindings:[]}),placeholders=_columns_reduce.placeholders,bindings=_columns_reduce.bindings;var _this_toSQL1=this.toSQL(),originalSQL1=_this_toSQL1.sql,originalBindings1=_this_toSQL1.bindings;var newBindings=_to_consumable_array(originalBindings1).concat(_to_consumable_array(bindings));return this.client.raw("".concat(originalSQL1," ON DUPLICATE KEY UPDATE ").concat(placeholders.join(", ")),newBindings)})}catch(e){}}
2
- //# sourceMappingURL=knex-on-duplicate-update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/database/knex-plugins/knex-on-duplicate-update.ts"],"sourcesContent":["import knex from \"knex\";\n\nexport function attachOnDuplicateUpdate() {\n try {\n knex.QueryBuilder.extend(\"onDuplicateUpdate\", function (...columns) {\n if (columns.length === 0) {\n // 업데이트 할 컬럼이 없으면 onDuplicateUpdate 구문 처리 패스\n const { sql: originalSQL, bindings: originalBindings } = this.toSQL();\n return this.client.raw(originalSQL, originalBindings);\n }\n\n const { placeholders, bindings } = columns.reduce(\n (result, column) => {\n if (typeof column === \"string\") {\n result.placeholders.push(`?? = Values(??)`);\n result.bindings.push(column, column);\n } else if (column && typeof column === \"object\") {\n Object.keys(column).forEach((key) => {\n result.placeholders.push(`?? = ?`);\n result.bindings.push(key, column[key]);\n });\n } else {\n throw new Error(\n \"onDuplicateUpdate error: expected column name to be string or object.\"\n );\n }\n\n return result;\n },\n { placeholders: [], bindings: [] }\n );\n\n const { sql: originalSQL, bindings: originalBindings } = this.toSQL();\n\n const newBindings = [...originalBindings, ...bindings];\n\n return this.client.raw(\n `${originalSQL} ON DUPLICATE KEY UPDATE ${placeholders.join(\", \")}`,\n newBindings\n );\n });\n } catch {\n // ignored\n }\n}"],"names":["attachOnDuplicateUpdate","knex","QueryBuilder","extend","columns","length","toSQL","sql","originalSQL","bindings","originalBindings","client","raw","reduce","result","column","placeholders","push","Object","keys","forEach","key","Error","newBindings","join"],"mappings":"oGAEgBA,iEAAAA,mFAFC,yzCAEV,SAASA,0BACd,GAAI,CACFC,aAAI,CAACC,YAAY,CAACC,MAAM,CAAC,oBAAqB,WAAU,IAAA,IAAA,KAAA,UAAA,OAAA,AAAGC,QAAH,UAAA,MAAA,KAAA,EAAA,KAAA,KAAA,QAAGA,QAAH,MAAA,SAAA,CAAA,KAAU,CAChE,GAAIA,QAAQC,MAAM,GAAK,EAAG,CAExB,IAAyD,YAAA,IAAI,CAACC,KAAK,GAA3DC,AAAKC,YAA4C,YAAjDD,IAAkBE,AAAUC,iBAAqB,YAA/BD,SAC1B,OAAO,IAAI,CAACE,MAAM,CAACC,GAAG,CAACJ,YAAaE,iBACtC,CAEA,IAAmCN,gBAAAA,QAAQS,MAAM,CAC/C,SAACC,OAAQC,QACP,GAAI,OAAOA,SAAW,SAAU,CAC9BD,OAAOE,YAAY,CAACC,IAAI,CAAC,mBACzBH,OAAOL,QAAQ,CAACQ,IAAI,CAACF,OAAQA,OAC/B,MAAO,GAAIA,QAAU,CAAA,OAAOA,iCAAP,SAAOA,OAAK,IAAM,SAAU,CAC/CG,OAAOC,IAAI,CAACJ,QAAQK,OAAO,CAAC,SAACC,KAC3BP,OAAOE,YAAY,CAACC,IAAI,CAAC,UACzBH,OAAOL,QAAQ,CAACQ,IAAI,CAACI,IAAKN,MAAM,CAACM,IAAI,CACvC,EACF,KAAO,CACL,MAAM,IAAIC,MACR,wEAEJ,CAEA,OAAOR,MACT,EACA,CAAEE,aAAc,EAAE,CAAEP,SAAU,EAAE,AAAC,GAlB3BO,aAA2BZ,gBAA3BY,aAAcP,SAAaL,gBAAbK,SAqBtB,IAAyD,aAAA,IAAI,CAACH,KAAK,GAA3DC,AAAKC,aAA4C,aAAjDD,IAAkBE,AAAUC,kBAAqB,aAA/BD,SAE1B,IAAMc,YAAc,AAAC,qBAAGb,0BAAkB,qBAAGD,WAE7C,OAAO,IAAI,CAACE,MAAM,CAACC,GAAG,CACpB,AAAC,GAAyCI,OAAvCR,aAAY,6BAAmD,OAAxBQ,aAAaQ,IAAI,CAAC,OAC5DD,YAEJ,EACF,CAAE,QAAM,CAER,CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/puri-wrapper.ts"],"sourcesContent":["import { Knex } from \"knex\";\nimport { Puri } from \"./puri\";\nimport { UBRef, UpsertBuilder } from \"./upsert-builder\";\nimport { DatabaseSchemaExtend } from \"../types/types\";\nimport chalk from \"chalk\";\nimport { DBPreset } from \"./db\";\n\ntype TableName<TSchema extends DatabaseSchemaExtend> = Extract<\n keyof TSchema,\n string\n>;\n\nexport type TransactionalOptions = {\n isolation?: Exclude<Knex.IsolationLevels, \"snapshot\">; // snapshot: mssql only\n dbPreset?: DBPreset;\n readOnly?: boolean;\n};\n\nexport class PuriWrapper<\n TSchema extends DatabaseSchemaExtend = DatabaseSchemaExtend,\n> {\n constructor(\n public knex: Knex,\n public upsertBuilder: UpsertBuilder\n ) {}\n\n raw(sql: string): Knex.Raw {\n return this.knex.raw(sql);\n }\n\n // 테이블명으로 시작\n from<TTable extends keyof TSchema>(\n tableName: TTable\n ): Puri<\n TSchema,\n Record<TTable, TSchema[TTable]>,\n Omit<TSchema[TTable], \"__fulltext__\">\n >;\n // 테이블명 + Alias로 시작\n from<TTable extends keyof TSchema, TAlias extends string>(spec: {\n [K in TAlias]: TTable;\n }): Puri<\n TSchema,\n Record<TAlias, TSchema[TTable]>,\n Omit<TSchema[TTable], \"__fulltext__\">\n >;\n // 서브쿼리로 시작\n from<TAlias extends string, TSubResult>(spec: {\n [K in TAlias]: Puri<TSchema, any, TSubResult>;\n }): Puri<\n TSchema,\n Record<TAlias, TSubResult>,\n Omit<TSubResult, \"__fulltext__\">\n >;\n from(spec: any): any {\n return new Puri(this.knex, spec);\n }\n\n // 테이블명으로 시작\n table<TTable extends keyof TSchema>(\n tableName: TTable\n ): Puri<\n TSchema,\n Record<TTable, TSchema[TTable]>,\n Omit<TSchema[TTable], \"__fulltext__\">\n >;\n // 테이블명 + Alias로 시작\n table<TTable extends keyof TSchema, TAlias extends string>(spec: {\n [K in TAlias]: TTable;\n }): Puri<\n TSchema,\n Record<TAlias, TSchema[TTable]>,\n Omit<TSchema[TTable], \"__fulltext__\">\n >;\n // 서브쿼리로 시작\n table<TAlias extends string, TSubResult>(spec: {\n [K in TAlias]: Puri<TSchema, any, TSubResult>;\n }): Puri<\n TSchema,\n Record<TAlias, TSubResult>,\n Omit<TSubResult, \"__fulltext__\">\n >;\n table(spec: any): any {\n return new Puri(this.knex, spec);\n }\n\n async transaction<T>(\n callback: (trx: PuriTransactionWrapper) => Promise<T>,\n options: TransactionalOptions = {}\n ): Promise<T> {\n const { isolation, readOnly, dbPreset = \"w\" } = options;\n\n // @transactional 데코레이터와 동일한 로직: 이미 트랜잭션 컨텍스트가 있는지 확인\n const { DB } = await import(\"./db\");\n const existingContext = DB.transactionStorage.getStore();\n\n // AsyncLocalStorage 컨텍스트가 없거나 해당 preset의 트랜잭션이 없으면 새로 시작\n const startTransaction = async (\n knex: Knex | Knex.Transaction,\n upsertBuilder: UpsertBuilder\n ) => {\n return knex.transaction(\n async (trx) => {\n const trxWrapper = new PuriTransactionWrapper(trx, upsertBuilder);\n\n // TransactionContext에 트랜잭션 저장\n DB.getTransactionContext().setTransaction(dbPreset, trxWrapper);\n\n try {\n return await callback(trxWrapper);\n } finally {\n // 트랜잭션 제거\n DB.getTransactionContext().deleteTransaction(dbPreset);\n }\n },\n { isolationLevel: isolation, readOnly }\n );\n };\n\n // AsyncLocalStorage 컨텍스트가 없으면 새로 생성\n if (!existingContext) {\n return DB.runWithTransaction(() =>\n startTransaction(this.knex, this.upsertBuilder)\n );\n }\n\n // 해당 preset의 트랜잭션이 이미 있으면 SAVEPOINT로 중첩 트랜잭션 생성\n const existingTrx = existingContext.getTransaction(dbPreset);\n if (existingTrx) {\n return startTransaction(existingTrx.trx, existingTrx.upsertBuilder);\n } else {\n // 컨텍스트는 있지만 이 preset의 트랜잭션은 없는 경우 (같은 컨텍스트 내에서 실행)\n return startTransaction(this.knex, this.upsertBuilder);\n }\n }\n\n ubRegister<TTable extends TableName<TSchema>>(\n tableName: TTable,\n row: Partial<{\n [K in keyof TSchema[TTable]]: TSchema[TTable][K] | UBRef;\n }>\n ): UBRef {\n return this.upsertBuilder.register(tableName, row);\n }\n\n ubUpsert(\n tableName: TableName<TSchema>,\n chunkSize?: number\n ): Promise<number[]> {\n return this.upsertBuilder.upsert(this.knex, tableName, chunkSize);\n }\n\n ubInsertOnly(\n tableName: TableName<TSchema>,\n chunkSize?: number\n ): Promise<number[]> {\n return this.upsertBuilder.insertOnly(this.knex, tableName, chunkSize);\n }\n\n ubUpsertOrInsert(\n tableName: TableName<TSchema>,\n mode: \"upsert\" | \"insert\",\n chunkSize?: number\n ): Promise<number[]> {\n return this.upsertBuilder.upsertOrInsert(\n this.knex,\n tableName,\n mode,\n chunkSize\n );\n }\n\n ubUpdateBatch(\n tableName: TableName<TSchema>,\n options?: { chunkSize?: number; where?: string | string[] }\n ): Promise<void> {\n return this.upsertBuilder.updateBatch(this.knex, tableName, options);\n }\n\n // 트랜잭션 연결 테스트용\n async debugTransaction() {\n const info = await this.getTransactionInfo();\n console.log(`${chalk.cyan(\"[Puri Transaction]\")} ${chalk.magenta(info)}`);\n }\n\n private async getTransactionInfo(): Promise<string> {\n // 연결 ID 조회\n const [connectionIdRows] = await this.knex.raw(\n `SELECT CONNECTION_ID() as connection_id`\n );\n const connectionId = connectionIdRows[0].connection_id;\n\n // 트랜잭션 정보 조회\n const [trxRows] = await this.knex.raw(`\n SELECT STATE, ISOLATION_LEVEL, THREAD_ID, EVENT_ID\n FROM performance_schema.events_transactions_current\n WHERE THREAD_ID = \n (SELECT THREAD_ID\n FROM performance_schema.threads \n WHERE PROCESSLIST_ID = CONNECTION_ID())\n `);\n\n if (trxRows.length > 0 && trxRows[0].STATE !== \"COMMITTED\") {\n const trx = trxRows[0];\n return `In Transaction, ConnID: ${connectionId}, ThreadID: ${trx.THREAD_ID}, EventID: ${trx.EVENT_ID}, InnoDB TRX: ${trx.STATE}(${trx.ISOLATION_LEVEL})`;\n } else {\n return `Not in Transaction, ConnID: ${connectionId}`;\n }\n }\n}\n\nexport class PuriTransactionWrapper extends PuriWrapper {\n constructor(\n public trx: Knex.Transaction,\n public upsertBuilder: UpsertBuilder\n ) {\n super(trx, upsertBuilder);\n }\n\n async rollback(): Promise<void> {\n await this.trx.rollback();\n }\n\n async commit(): Promise<void> {\n await this.trx.commit();\n }\n}\n"],"names":["PuriTransactionWrapper","PuriWrapper","knex","upsertBuilder","raw","sql","from","spec","Puri","table","transaction","callback","options","isolation","readOnly","dbPreset","DB","existingContext","startTransaction","existingTrx","transactionStorage","getStore","trx","trxWrapper","getTransactionContext","setTransaction","deleteTransaction","isolationLevel","runWithTransaction","getTransaction","ubRegister","tableName","row","register","ubUpsert","chunkSize","upsert","ubInsertOnly","insertOnly","ubUpsertOrInsert","mode","upsertOrInsert","ubUpdateBatch","updateBatch","debugTransaction","info","getTransactionInfo","console","log","chalk","cyan","magenta","connectionIdRows","connectionId","trxRows","connection_id","length","STATE","THREAD_ID","EVENT_ID","ISOLATION_LEVEL","rollback","commit"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/puri.ts"],"sourcesContent":["import type { Knex } from \"knex\";\nimport type {\n AvailableColumns,\n SelectObject,\n ParseSelectObject,\n WhereCondition,\n ComparisonOperator,\n ExtractColumnType,\n SqlExpression,\n Expand,\n FulltextColumns,\n ResultAvailableColumns,\n InsertData,\n SingleTableValue,\n} from \"./puri.types\";\nimport chalk from \"chalk\";\nimport assert from \"assert\";\n\nexport class Puri<\n TSchema,\n TTables extends Record<string, any>,\n TResult,\n TResolved = Expand<TResult>[],\n> {\n private knexQuery: Knex.QueryBuilder;\n\n // 생성자 시그니처들\n constructor(knex: Knex, tableName: string);\n constructor(\n knex: Knex,\n tableSpec: Record<string, string | Puri<TSchema, any, any>>\n );\n constructor(\n private knex: Knex,\n tableNameOrSpec: any\n ) {\n if (typeof tableNameOrSpec === \"string\") {\n // Case: new Puri(knex, \"users\")\n this.knexQuery = this.knex(tableNameOrSpec).from(tableNameOrSpec);\n } else if (typeof tableNameOrSpec === \"object\") {\n const entries = Object.entries(tableNameOrSpec);\n if (entries.length !== 1) {\n throw new Error(\"Table spec must have exactly one entry\");\n }\n assert(entries[0]);\n const [alias, spec] = entries[0];\n if (typeof spec === \"string\") {\n this.knexQuery = this.knex(spec).from({ [alias]: spec });\n } else if (spec instanceof Puri) {\n const subqueryBuilder = spec.raw();\n this.knexQuery = this.knex.from(subqueryBuilder.as(alias));\n } else {\n throw new Error(\"Invalid table specification\");\n }\n } else {\n throw new Error(\"Invalid table specification\");\n }\n }\n\n // Static SQL helper functions for SELECT\n static count(column: string = \"*\"): SqlExpression<\"number\"> {\n return {\n _type: \"sql_expression\",\n _return: \"number\",\n _sql: `COUNT(${column})`,\n };\n }\n static sum(column: string): SqlExpression<\"number\"> {\n return {\n _type: \"sql_expression\",\n _return: \"number\",\n _sql: `SUM(${column})`,\n };\n }\n static avg(column: string): SqlExpression<\"number\"> {\n return {\n _type: \"sql_expression\",\n _return: \"number\",\n _sql: `AVG(${column})`,\n };\n }\n static max(column: string): SqlExpression<\"number\"> {\n return {\n _type: \"sql_expression\",\n _return: \"number\",\n _sql: `MAX(${column})`,\n };\n }\n static min(column: string): SqlExpression<\"number\"> {\n return {\n _type: \"sql_expression\",\n _return: \"number\",\n _sql: `MIN(${column})`,\n };\n }\n static concat(...args: string[]): SqlExpression<\"string\"> {\n return {\n _type: \"sql_expression\",\n _return: \"string\",\n _sql: `CONCAT(${args.join(\", \")})`,\n };\n }\n static upper(column: string): SqlExpression<\"string\"> {\n return {\n _type: \"sql_expression\",\n _return: \"string\",\n _sql: `UPPER(${column})`,\n };\n }\n static lower(column: string): SqlExpression<\"string\"> {\n return {\n _type: \"sql_expression\",\n _return: \"string\",\n _sql: `LOWER(${column})`,\n };\n }\n\n // Raw functions for SELECT\n static rawString(sql: string): SqlExpression<\"string\"> {\n return { _type: \"sql_expression\", _return: \"string\", _sql: sql };\n }\n static rawNumber(sql: string): SqlExpression<\"number\"> {\n return { _type: \"sql_expression\", _return: \"number\", _sql: sql };\n }\n static rawBoolean(sql: string): SqlExpression<\"boolean\"> {\n return { _type: \"sql_expression\", _return: \"boolean\", _sql: sql };\n }\n static rawDate(sql: string): SqlExpression<\"date\"> {\n return { _type: \"sql_expression\", _return: \"date\", _sql: sql };\n }\n\n // SELECT\n select<TSelect extends SelectObject<TTables>>(\n selectObj: TSelect\n ): Puri<TSchema, TTables, ParseSelectObject<TTables, TSelect>> {\n const selectClauses: (string | Knex.Raw)[] = [];\n\n for (const [alias, columnOrFunction] of Object.entries(selectObj)) {\n if (\n typeof columnOrFunction === \"object\" &&\n columnOrFunction._type === \"sql_expression\"\n ) {\n // SQL 함수인 경우\n selectClauses.push(\n this.knex.raw(`${columnOrFunction._sql} as ${alias}`)\n );\n } else {\n // 일반 컬럼인 경우\n const columnPath = columnOrFunction as string;\n if (alias === columnPath) {\n // alias와 컬럼명이 같으면 alias 생략\n selectClauses.push(columnPath);\n } else {\n // alias 지정\n selectClauses.push(`${columnPath} as ${alias}`);\n }\n }\n }\n\n this.knexQuery.select(selectClauses);\n return this as any;\n }\n\n // SELECT *\n selectAll(): this {\n this.knexQuery.select(\"*\");\n return this as any;\n }\n\n // JOIN: 서브쿼리 + Alias\n join<TJoinAlias extends string, TSubResult>(\n tableSpec: { [K in TJoinAlias]: Puri<TSchema, any, TSubResult> },\n left: AvailableColumns<TTables>,\n right: `${TJoinAlias}.${keyof TSubResult & string}`\n ): Puri<\n TSchema,\n TTables & Record<TJoinAlias, TSubResult>, // 서브쿼리의 TResult\n TResult\n >;\n // JOIN: 테이블 + Alias\n join<TJoinTable extends keyof TSchema, TJoinAlias extends string>(\n tableSpec: { [K in TJoinAlias]: TJoinTable },\n left: AvailableColumns<TTables>,\n right: `${TJoinAlias}.${keyof TSchema[TJoinTable] & string}`\n ): Puri<\n TSchema,\n TTables & Record<TJoinAlias, TSchema[TJoinTable]>, // TTables 확장!\n TResult\n >;\n // JOIN: 테이블명\n join<TJoinTable extends keyof TSchema>(\n tableName: TJoinTable,\n left: AvailableColumns<TTables>,\n right: `${TJoinTable & string}.${keyof TSchema[TJoinTable] & string}`\n ): Puri<\n TSchema,\n TTables & Record<TJoinTable, TSchema[TJoinTable]>, // 테이블명이 키\n TResult\n >;\n // JOIN: 서브쿼리 + Alias + 콜백\n join<TJoinAlias extends string, TSubResult>(\n tableSpec: { [K in TJoinAlias]: Puri<TSchema, any, TSubResult> },\n callback: (\n j: JoinClauseGroup<TTables, Record<TJoinAlias, TSubResult>>\n ) => void\n ): Puri<TSchema, TTables & Record<TJoinAlias, TSubResult>, TResult>;\n // JOIN: 테이블 + Alias + 콜백\n join<TJoinTable extends keyof TSchema, TJoinAlias extends string>(\n tableSpec: { [K in TJoinAlias]: TJoinTable },\n callback: (\n j: JoinClauseGroup<TTables, Record<TJoinAlias, TSchema[TJoinTable]>>\n ) => void\n ): Puri<TSchema, TTables & Record<TJoinAlias, TSchema[TJoinTable]>, TResult>;\n // JOIN: 테이블명 + 콜백\n join<TJoinTable extends keyof TSchema>(\n tableName: TJoinTable,\n callback: (\n j: JoinClauseGroup<TTables, Record<TJoinTable, TSchema[TJoinTable]>>\n ) => void\n ): Puri<TSchema, TTables & Record<TJoinTable, TSchema[TJoinTable]>, TResult>;\n // JOIN 실제 구현\n join(tableNameOrSpec: any, ...args: any[]): any {\n return this.__commonJoin(\"join\", tableNameOrSpec, ...args);\n }\n\n // LEFT JOIN: 서브쿼리 + Alias\n leftJoin<TJoinAlias extends string, TSubResult>(\n tableSpec: { [K in TJoinAlias]: Puri<TSchema, any, TSubResult> },\n left: AvailableColumns<TTables>,\n right: `${TJoinAlias}.${keyof TSubResult & string}`\n ): Puri<\n TSchema,\n TTables & Record<TJoinAlias, TSubResult>, // 서브쿼리의 TResult\n TResult\n >;\n // LEFT JOIN: 테이블 + Alias\n leftJoin<TJoinTable extends keyof TSchema, TJoinAlias extends string>(\n tableSpec: { [K in TJoinAlias]: TJoinTable },\n left: AvailableColumns<TTables>,\n right: `${TJoinAlias}.${keyof TSchema[TJoinTable] & string}`\n ): Puri<\n TSchema,\n TTables & Record<TJoinAlias, TSchema[TJoinTable]>, // TTables 확장!\n TResult\n >;\n // LEFT JOIN: 테이블명\n leftJoin<TJoinTable extends keyof TSchema>(\n tableName: TJoinTable,\n left: AvailableColumns<TTables>,\n right: `${TJoinTable & string}.${keyof TSchema[TJoinTable] & string}`\n ): Puri<\n TSchema,\n TTables & Record<TJoinTable, TSchema[TJoinTable]>, // 테이블명이 키\n TResult\n >;\n // LEFT JOIN: 서브쿼리 + Alias + 콜백\n leftJoin<TJoinAlias extends string, TSubResult>(\n tableSpec: { [K in TJoinAlias]: Puri<TSchema, any, TSubResult> },\n callback: (\n j: JoinClauseGroup<TTables, Record<TJoinAlias, TSubResult>>\n ) => void\n ): Puri<TSchema, TTables & Record<TJoinAlias, TSubResult>, TResult>;\n // LEFT JOIN: 테이블 + Alias + 콜백\n leftJoin<TJoinTable extends keyof TSchema, TJoinAlias extends string>(\n tableSpec: { [K in TJoinAlias]: TJoinTable },\n callback: (\n j: JoinClauseGroup<TTables, Record<TJoinAlias, TSchema[TJoinTable]>>\n ) => void\n ): Puri<TSchema, TTables & Record<TJoinAlias, TSchema[TJoinTable]>, TResult>;\n // LEFT JOIN: 테이블명 + 콜백\n leftJoin<TJoinTable extends keyof TSchema>(\n tableName: TJoinTable,\n callback: (\n j: JoinClauseGroup<TTables, Record<TJoinTable, TSchema[TJoinTable]>>\n ) => void\n ): Puri<TSchema, TTables & Record<TJoinTable, TSchema[TJoinTable]>, TResult>;\n // LEFT JOIN 실제 구현\n leftJoin(tableNameOrSpec: any, ...args: any[]): any {\n return this.__commonJoin(\"leftJoin\", tableNameOrSpec, ...args);\n }\n\n __commonJoin(\n joinType: \"join\" | \"leftJoin\",\n tableNameOrSpec: any,\n ...args: any[]\n ): this {\n if (typeof tableNameOrSpec === \"string\") {\n // Case 1: join(\"posts\", ...)\n const tableName = tableNameOrSpec;\n\n if (args.length === 1 && typeof args[0] === \"function\") {\n // join(\"posts\", callback)\n const callback = args[0];\n this.knexQuery[joinType](tableName, (joinClause) => {\n callback(new JoinClauseGroup(joinClause));\n });\n } else {\n // join(\"posts\", left, right)\n const [left, right] = args;\n this.knexQuery[joinType](tableName, left, right);\n }\n } else if (typeof tableNameOrSpec === \"object\") {\n // Case 2: join({ alias: \"table\" }, ...) or join({ alias: subquery }, ...)\n const entries = Object.entries(tableNameOrSpec);\n if (entries.length !== 1) {\n throw new Error(\"Table spec must have exactly one entry\");\n }\n assert(entries[0]);\n const [[alias, spec]] = entries;\n\n if (typeof spec === \"string\") {\n // 테이블: join({ p: \"posts\" }, ...)\n if (args.length === 1 && typeof args[0] === \"function\") {\n // Callback\n const callback = args[0];\n this.knexQuery[joinType]({ [alias]: spec }, (joinClause) => {\n callback(new JoinClauseGroup(joinClause));\n });\n } else {\n // Simple\n const [left, right] = args;\n this.knexQuery[joinType]({ [alias]: spec }, left, right);\n }\n } else if (spec instanceof Puri) {\n // 서브쿼리: join({ sq: subquery }, ...)\n if (args.length === 1 && typeof args[0] === \"function\") {\n // Callback\n const callback = args[0];\n this.knexQuery[joinType](spec.raw().as(alias), (joinClause) => {\n callback(new JoinClauseGroup(joinClause));\n });\n } else {\n // Simple\n const [left, right] = args;\n this.knexQuery[joinType](spec.raw().as(alias), left, right);\n }\n } else {\n throw new Error(\"Invalid table specification\");\n }\n } else {\n throw new Error(\"Invalid arguments\");\n }\n\n return this;\n }\n\n // WHERE: 객체 - 사용: .where({ \"u.id\": 1, \"u.status\": \"active\" })\n where(conditions: WhereCondition<TTables>): this;\n // WHERE: 컬럼 - 사용: .where(\"u.id\", 1)\n where<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n value: ExtractColumnType<TTables, TColumn & string>\n ): this;\n // WHERE: 컬럼 - 사용: .where(\"u.id\", \">\", 10)\n where<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n operator: ComparisonOperator,\n value: ExtractColumnType<TTables, TColumn & string>\n ): this;\n // WHERE: 컬럼 - 사용: .where(\"u.id\", \"like\", \"%test%\")\n where(columnOrConditions: any, operatorOrValue?: any, value?: any): this {\n if (typeof columnOrConditions === \"object\") {\n this.knexQuery.where(columnOrConditions);\n } else if (arguments.length === 2) {\n if (operatorOrValue === null) {\n this.knexQuery.whereNull(columnOrConditions);\n return this;\n }\n this.knexQuery.where(columnOrConditions, operatorOrValue);\n } else if (arguments.length === 3) {\n if (value === null) {\n if (operatorOrValue === \"!=\") {\n this.knexQuery.whereNotNull(columnOrConditions);\n return this;\n } else if (operatorOrValue === \"=\") {\n this.knexQuery.whereNull(columnOrConditions);\n return this;\n }\n }\n this.knexQuery.where(columnOrConditions, operatorOrValue, value);\n } else {\n this.knexQuery.where(columnOrConditions);\n }\n return this;\n }\n\n // WHERE IN\n whereIn<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n values: ExtractColumnType<TTables, TColumn & string>[]\n ): Puri<TSchema, TTables, TResult> {\n this.knexQuery.whereIn(column, values);\n return this as any;\n }\n\n // WHERE NOT IN\n whereNotIn<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n values: ExtractColumnType<TTables, TColumn & string>[]\n ): Puri<TSchema, TTables, TResult> {\n this.knexQuery.whereIn(column, values);\n return this as any;\n }\n\n // WHERE MATCH\n whereMatch<TColumn extends FulltextColumns<TTables>>(\n column: TColumn,\n value: string\n ): this {\n this.knexQuery.whereRaw(`MATCH (${String(column)}) AGAINST (?)`, [value]);\n return this;\n }\n\n // WHERE 괄호 그룹핑\n whereGroup(callback: (g: WhereGroup<TTables>) => void): this {\n this.knexQuery.where((builder) => {\n const group = new WhereGroup<TTables>(builder);\n callback(group);\n });\n return this;\n }\n orWhereGroup(callback: (g: WhereGroup<TTables>) => void): this {\n this.knexQuery.orWhere((builder) => {\n const group = new WhereGroup<TTables>(builder);\n callback(group);\n });\n return this;\n }\n\n // ORDER BY\n orderBy<TColumn extends ResultAvailableColumns<TTables, TResult>>(\n column: TColumn,\n direction: \"asc\" | \"desc\"\n ): this;\n orderBy(column: string, direction: \"asc\" | \"desc\" = \"asc\"): this {\n this.knexQuery.orderBy(column, direction);\n return this;\n }\n\n // 기본 쿼리 메서드들\n limit(count: number): this {\n this.knexQuery.limit(count);\n return this;\n }\n\n offset(count: number): this {\n this.knexQuery.offset(count);\n return this;\n }\n\n // GROUP BY\n groupBy<TColumns extends ResultAvailableColumns<TTables, TResult>>(\n ...columns: TColumns[]\n ): this;\n groupBy(...columns: string[]): this {\n this.knexQuery.groupBy(...(columns as string[]));\n return this;\n }\n\n // HAVING\n having(condition: string): this;\n having<TColumn extends ResultAvailableColumns<TTables, TResult>>(\n column: TColumn,\n operator: ComparisonOperator,\n value: any\n ): this;\n // HAVING 구현\n having(...conditions: any[]): this {\n if (conditions.length === 1) {\n // having(\"COUNT(*) > 10\")\n this.knexQuery.having(conditions[0]);\n } else if (conditions.length === 3) {\n // having(\"count\", \">\", 10)\n this.knexQuery.having(conditions[0], conditions[1], conditions[2]);\n } else {\n throw new Error(\"Invalid having arguments\");\n }\n return this;\n }\n\n // 실행 메서드들 - thenable 구현\n then<TResult1 = TResolved, TResult2 = never>(\n onfulfilled?:\n | ((value: TResolved) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.knexQuery.then(onfulfilled as any, onrejected);\n }\n catch<TResult2 = never>(\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<Expand<TResult> | TResult2> {\n return this.knexQuery.catch(onrejected);\n }\n finally(onfinally?: (() => void) | null): Promise<Expand<TResult>> {\n return this.knexQuery.finally(onfinally);\n }\n\n // 하나만 쿼리\n async first(): Promise<Expand<TResult> | undefined> {\n return this.knexQuery.first();\n }\n // 하나만 쿼리 실패 시 에러\n async firstOrFail(): Promise<TResult> {\n const result = await this.knexQuery.first();\n if (!result) {\n throw new Error(\"No results found\");\n }\n return result;\n }\n\n // 쿼리 후 인덱스 리턴\n async at(index: number): Promise<Expand<TResult> | undefined> {\n const results = (await this) as any[];\n return results[index];\n }\n // 쿼리 후 인덱스 리턴 실패 시 에러\n async assertAt(index: number): Promise<Expand<TResult>> {\n const results = (await this) as any[];\n const result = results[index];\n if (result === undefined) {\n throw new Error(`No result found at index ${index}`);\n }\n return result;\n }\n\n // 쿼리한 레코드에서 특정 컬럼만 추출한 배열 리턴\n async pluck<TColumn extends ResultAvailableColumns<TTables, TResult>>(\n column: TColumn\n ): Promise<ExtractColumnType<TTables, TColumn & string>[]> {\n return this.knexQuery.pluck(column) as Promise<\n ExtractColumnType<TTables, TColumn & string>[]\n >;\n }\n\n // INSERT\n insert(\n data: InsertData<SingleTableValue<TTables>>\n ): Puri<TSchema, {}, number, number[]> {\n this.knexQuery.insert(data);\n return this as any;\n }\n\n // UPDATE\n update(data: WhereCondition<TTables>): Puri<TSchema, {}, number, number> {\n this.knexQuery.update(data);\n return this as any;\n }\n\n // Increment\n increment<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n value: number\n ): this {\n if (value <= 0) {\n throw new Error(\"Increment value must be greater than 0\");\n }\n this.knexQuery.increment(column, value);\n return this;\n }\n // Decrement\n decrement<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n value: number\n ): this {\n if (value <= 0) {\n throw new Error(\"Decrement value must be greater than 0\");\n }\n this.knexQuery.decrement(column, value);\n return this;\n }\n\n // DELETE\n delete(): Puri<TSchema, {}, number, number> {\n this.knexQuery.delete();\n return this as any;\n }\n\n // 확인 쿼리 리턴\n toQuery(): string {\n return this.knexQuery.toQuery();\n }\n\n // 쿼리 디버깅 로그 출력\n debug(): this {\n console.log(\n `${chalk.cyan(\"[Puri Debug]\")} ${chalk.yellow(this.toQuery())}`\n );\n return this;\n }\n\n formatSQL(unformatted: string): string {\n // SQL 예약어 목록\n const keywords = [\n \"SELECT\",\n \"FROM\",\n \"WHERE\",\n \"INSERT\",\n \"INTO\",\n \"VALUES\",\n \"UPDATE\",\n \"DELETE\",\n \"CREATE\",\n \"TABLE\",\n \"ALTER\",\n \"DROP\",\n \"JOIN\",\n \"ON\",\n \"INNER\",\n \"LEFT\",\n \"RIGHT\",\n \"FULL\",\n \"OUTER\",\n \"GROUP\",\n \"BY\",\n \"ORDER\",\n \"HAVING\",\n \"DISTINCT\",\n \"LIMIT\",\n \"OFFSET\",\n \"AS\",\n \"AND\",\n \"OR\",\n \"NOT\",\n \"IN\",\n \"LIKE\",\n \"IS\",\n \"NULL\",\n \"CASE\",\n \"WHEN\",\n \"THEN\",\n \"ELSE\",\n \"END\",\n \"UNION\",\n \"ALL\",\n \"EXISTS\",\n \"BETWEEN\",\n ];\n\n let formatted = unformatted;\n\n // 예약어를 대문자로 변환\n keywords.forEach((keyword) => {\n const regex = new RegExp(`\\\\b${keyword}\\\\b`, \"gi\");\n formatted = formatted.replace(regex, keyword.toUpperCase());\n });\n\n // 주요 절 앞에 줄바꿈 추가\n const majorClauses = [\n \"SELECT\",\n \"FROM\",\n \"WHERE\",\n \"GROUP BY\",\n \"ORDER BY\",\n \"HAVING\",\n \"LIMIT\",\n \"UNION\",\n ];\n majorClauses.forEach((clause) => {\n const regex = new RegExp(`\\\\s+(${clause})\\\\s+`, \"gi\");\n formatted = formatted.replace(regex, `\\n${clause.toUpperCase()} `);\n });\n\n // JOIN 절 처리\n formatted = formatted.replace(\n /\\s+((?:INNER|LEFT|RIGHT|FULL OUTER)\\s+)?JOIN\\s+/gi,\n \"\\n$1JOIN \"\n );\n\n // AND, OR 조건 처리\n formatted = formatted.replace(/\\s+(AND|OR)\\s+/gi, \"\\n $1 \");\n\n // 괄호 처리 및 들여쓰기\n const lines = formatted.split(\"\\n\");\n const indentedLines = [];\n let indentLevel = 0;\n\n for (let line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine) continue;\n\n // 닫는 괄호가 있으면 들여쓰기 레벨 감소\n const closingParens = (trimmedLine.match(/\\)/g) || []).length;\n const openingParens = (trimmedLine.match(/\\(/g) || []).length;\n\n if (closingParens > 0 && openingParens === 0) {\n indentLevel = Math.max(0, indentLevel - closingParens);\n }\n\n // 현재 들여쓰기 적용\n const indent = \" \".repeat(indentLevel);\n indentedLines.push(indent + trimmedLine);\n\n // 여는 괄호가 있으면 들여쓰기 레벨 증가\n if (openingParens > closingParens) {\n indentLevel += openingParens - closingParens;\n }\n }\n\n return indentedLines.join(\"\\n\").trim();\n }\n\n // Knex 쿼리 빌더 직접 접근\n raw(): Knex.QueryBuilder {\n return this.knexQuery;\n }\n}\n\nexport class WhereGroup<TTables extends Record<string, any>> {\n constructor(private builder: Knex.QueryBuilder) {}\n\n // where 메서드들\n where(conditions: WhereCondition<TTables>): this;\n where<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n value: ExtractColumnType<TTables, TColumn & string>\n ): this;\n where<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n operator: ComparisonOperator,\n value: ExtractColumnType<TTables, TColumn & string>\n ): this;\n where(...args: any[]): WhereGroup<TTables> {\n this.builder.where(args[0], ...args.slice(1));\n return this;\n }\n\n // orWhere 메서드들\n orWhere(conditions: WhereCondition<TTables>): this;\n orWhere<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n value: ExtractColumnType<TTables, TColumn & string>\n ): this;\n orWhere<TColumn extends AvailableColumns<TTables>>(\n column: TColumn,\n operator: ComparisonOperator,\n value: ExtractColumnType<TTables, TColumn & string>\n ): this;\n orWhere(...args: any[]): WhereGroup<TTables> {\n this.builder.orWhere(args[0], ...args.slice(1));\n return this;\n }\n\n // 중첩 그룹\n whereGroup(callback: (g: WhereGroup<TTables>) => void): this;\n whereGroup(callback: (g: WhereGroup<TTables>) => void): WhereGroup<TTables> {\n this.builder.where((subBuilder) => {\n const subGroup = new WhereGroup<TTables>(subBuilder);\n callback(subGroup);\n });\n return this;\n }\n orWhereGroup(callback: (g: WhereGroup<TTables>) => void): this;\n orWhereGroup(\n callback: (g: WhereGroup<TTables>) => void\n ): WhereGroup<TTables> {\n this.builder.orWhere((subBuilder) => {\n const subGroup = new WhereGroup<TTables>(subBuilder);\n callback(subGroup);\n });\n return this;\n }\n}\n\nexport class JoinClauseGroup<\n TLeft extends Record<string, any>,\n TRight extends Record<string, any>,\n> {\n constructor(private callback: Knex.JoinClause) {}\n\n // ON(AND): 컬럼 = 컬럼\n on(left: AvailableColumns<TLeft>, right: AvailableColumns<TRight>): this;\n // ON(AND): 컬럼 (연산자) 컬럼\n on(\n left: AvailableColumns<TLeft>,\n operator: ComparisonOperator,\n right: AvailableColumns<TRight>\n ): this;\n // ON(AND): 콜백\n on(callback: (nested: JoinClauseGroup<TLeft, TRight>) => void): this;\n // ON(AND) 구현\n on(...args: any[]): this {\n this.callback.on(...(args as [string, string]));\n return this;\n }\n\n // ON(OR): 컬럼 = 컬럼\n orOn(left: AvailableColumns<TLeft>, right: AvailableColumns<TRight>): this;\n // ON(OR): 컬럼 (연산자) 컬럼\n orOn(\n left: AvailableColumns<TLeft>,\n operator: ComparisonOperator,\n right: AvailableColumns<TRight>\n ): this;\n // ON(OR): 콜백\n orOn(callback: (nested: JoinClauseGroup<TLeft, TRight>) => void): this;\n // ON(OR) 구현\n orOn(...args: any[]): this {\n this.callback.orOn(...(args as [string, string]));\n return this;\n }\n}\n"],"names":["JoinClauseGroup","Puri","WhereGroup","knex","tableNameOrSpec","knexQuery","from","entries","Object","length","Error","assert","alias","spec","subqueryBuilder","raw","as","select","selectObj","selectClauses","columnOrFunction","_type","push","_sql","columnPath","selectAll","join","args","__commonJoin","leftJoin","joinType","tableName","callback","joinClause","left","right","where","columnOrConditions","operatorOrValue","value","arguments","whereNull","whereNotNull","whereIn","column","values","whereNotIn","whereMatch","whereRaw","String","whereGroup","builder","group","orWhereGroup","orWhere","orderBy","direction","limit","count","offset","groupBy","columns","having","conditions","then","onfulfilled","onrejected","catch","finally","onfinally","first","firstOrFail","result","at","index","results","assertAt","undefined","pluck","insert","data","update","increment","decrement","delete","toQuery","debug","console","log","chalk","cyan","yellow","formatSQL","unformatted","keywords","formatted","forEach","keyword","regex","RegExp","replace","toUpperCase","majorClauses","clause","lines","split","indentedLines","indentLevel","line","trimmedLine","trim","closingParens","match","openingParens","Math","max","indent","repeat","_return","sum","avg","min","concat","upper","lower","rawString","sql","rawNumber","rawBoolean","rawDate","slice","subBuilder","subGroup","on","orOn"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/puri.types.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/transaction-context.ts"],"sourcesContent":["import type { PuriTransactionWrapper } from \"./puri-wrapper\";\nimport type { DBPreset } from \"./db\";\n\nexport class TransactionContext {\n private transactions: Map<DBPreset, PuriTransactionWrapper> = new Map();\n\n getTransaction(preset: DBPreset): PuriTransactionWrapper | undefined {\n return this.transactions.get(preset);\n }\n\n setTransaction(preset: DBPreset, trx: PuriTransactionWrapper): void {\n this.transactions.set(preset, trx);\n }\n\n deleteTransaction(preset: DBPreset): void {\n this.transactions.delete(preset);\n }\n}\n"],"names":["TransactionContext","transactions","Map","getTransaction","preset","get","setTransaction","trx","set","deleteTransaction","delete"],"mappings":"oGAGaA,4DAAAA,i0BAAN,IAAA,AAAMA,gCAAN,iCAAMA,4CAAAA,oBACX,sBAAQC,eAAsD,IAAIC,mBADvDF,qBAGXG,IAAAA,uBAAAA,SAAAA,eAAeC,MAAgB,EAC7B,OAAO,IAAI,CAACH,YAAY,CAACI,GAAG,CAACD,OAC/B,IAEAE,IAAAA,uBAAAA,SAAAA,eAAeF,MAAgB,CAAEG,GAA2B,EAC1D,IAAI,CAACN,YAAY,CAACO,GAAG,CAACJ,OAAQG,IAChC,IAEAE,IAAAA,0BAAAA,SAAAA,kBAAkBL,MAAgB,EAChC,IAAI,CAACH,YAAY,CAACS,MAAM,CAACN,OAC3B,YAbWJ"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/database/upsert-builder.ts"],"sourcesContent":["import { randomUUID } from \"crypto\";\nimport _ from \"lodash\";\nimport { Knex } from \"knex\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport { nonNullable } from \"../utils/utils\";\nimport { RowWithId, batchUpdate } from \"./_batch_update\";\n\ntype TableData = {\n references: Set<string>;\n rows: any[];\n uniqueIndexes: { name?: string; columns: string[] }[];\n uniquesMap: Map<string, string>;\n};\nexport type UBRef = {\n uuid: string;\n of: string;\n use?: string;\n};\nexport function isRefField(field: any): field is UBRef {\n return (\n field !== undefined &&\n field !== null &&\n field.of !== undefined &&\n field.uuid !== undefined\n );\n}\n\nexport class UpsertBuilder {\n tables: Map<string, TableData>;\n constructor() {\n this.tables = new Map();\n }\n\n getTable(tableName: string): TableData {\n const table = this.tables.get(tableName);\n if (table === undefined) {\n const tableSpec = (() => {\n try {\n return EntityManager.getTableSpec(tableName);\n } catch {\n return null;\n }\n })();\n\n this.tables.set(tableName, {\n references: new Set(),\n rows: [],\n uniqueIndexes: tableSpec?.uniqueIndexes ?? [],\n uniquesMap: new Map<string, string>(),\n });\n }\n\n return this.tables.get(tableName)!;\n }\n\n hasTable(tableName: string): boolean {\n return this.tables.has(tableName);\n }\n\n register<T extends string>(\n tableName: string,\n row: {\n [key in T]?:\n | UBRef\n | string\n | number\n | boolean\n | bigint\n | null\n | object\n | unknown;\n }\n ): UBRef {\n const table = this.getTable(tableName);\n\n // 해당 테이블의 unique 인덱스를 순회하며 키 생성\n const uniqueKeys = table.uniqueIndexes\n .map((unqIndex) => {\n const uniqueKeyArray = unqIndex.columns.map((unqCol) => {\n const val = row[unqCol as keyof typeof row];\n if (isRefField(val)) {\n return val.uuid;\n } else {\n return row[unqCol as keyof typeof row] ?? randomUUID(); // nullable인 경우 uuid로 랜덤값 삽입\n }\n });\n\n // 값이 모두 null인 경우 키 생성 패스\n if (uniqueKeyArray.length === 0) {\n return null;\n }\n return uniqueKeyArray.join(\"---delimiter--\");\n })\n .filter(nonNullable);\n\n // uuid 생성 로직\n const uuid: string = (() => {\n // 키를 순회하여 이미 존재하는 키가 있는지 확인\n if (uniqueKeys.length > 0) {\n for (const uniqueKey of uniqueKeys) {\n if (table.uniquesMap.has(uniqueKey)) {\n return table.uniquesMap.get(uniqueKey)!; // 이미 has 체크를 했으므로 undefined 불가능\n }\n }\n }\n\n // 찾을 수 없는 경우 생성\n return randomUUID();\n })();\n\n // 모든 유니크키에 대해 유니크맵에 uuid 저장\n if (uniqueKeys.length > 0) {\n for (const uniqueKey of uniqueKeys) {\n table.uniquesMap.set(uniqueKey, uuid);\n }\n }\n\n // 이 테이블에 사용된 RefField를 순회하여, 현재 테이블 정보에 어떤 필드를 참조하는지 추가\n // 이 정보를 나중에 치환할 때 사용\n row = Object.keys(row).reduce((r, rowKey) => {\n const rowValue = row[rowKey as keyof typeof row];\n\n if (isRefField(rowValue)) {\n rowValue.use ??= \"id\";\n table.references.add(rowValue.of + \".\" + rowValue.use);\n r[rowKey] = rowValue;\n } else if (typeof rowValue === \"object\" && !(rowValue instanceof Date)) {\n // object인 경우 JSON으로 변환\n r[rowKey] = rowValue === null ? null : JSON.stringify(rowValue);\n } else {\n r[rowKey] = rowValue;\n }\n return r;\n }, {} as any);\n\n table.rows.push({\n uuid,\n ...row,\n });\n\n return {\n of: tableName,\n uuid: (row as { uuid?: string }).uuid ?? uuid,\n };\n }\n\n async upsert(\n wdb: Knex,\n tableName: string,\n chunkSize?: number\n ): Promise<number[]> {\n return this.upsertOrInsert(wdb, tableName, \"upsert\", chunkSize);\n }\n async insertOnly(\n wdb: Knex,\n tableName: string,\n chunkSize?: number\n ): Promise<number[]> {\n return this.upsertOrInsert(wdb, tableName, \"insert\", chunkSize);\n }\n\n async upsertOrInsert(\n wdb: Knex,\n tableName: string,\n mode: \"upsert\" | \"insert\",\n chunkSize?: number\n ): Promise<number[]> {\n if (this.hasTable(tableName) === false) {\n return [];\n }\n\n const table = this.tables.get(tableName);\n if (table === undefined) {\n throw new Error(`존재하지 않는 테이블 ${tableName}에 upsert 요청`);\n } else if (table.rows.length === 0) {\n throw new Error(`${tableName}에 upsert 할 데이터가 없습니다.`);\n }\n\n if (\n table.rows.some((row) =>\n Object.entries(row).some(\n ([, value]) => isRefField(value) && value.of !== tableName\n )\n )\n ) {\n throw new Error(`${tableName} 해결되지 않은 참조가 있습니다.`);\n }\n\n // 전체 테이블 순회하여 현재 테이블 참조하는 모든 테이블 추출\n const { references, refTables } = Array.from(this.tables).reduce(\n (r, [, table]) => {\n const reference = Array.from(table.references.values()).find((ref) =>\n ref.includes(tableName + \".\")\n );\n if (reference) {\n r.references.push(reference);\n r.refTables.push(table);\n }\n\n return r;\n },\n {\n references: [] as string[],\n refTables: [] as TableData[],\n }\n );\n const extractFields = _.uniq(references).map(\n (reference) => reference.split(\".\")[1]\n );\n\n // 내부 참조 있는 경우 필터하여 분리\n const groups = _.groupBy(table.rows, (row) =>\n Object.entries(row).some(([, value]) => isRefField(value))\n ? \"selfRef\"\n : \"normal\"\n );\n const normalRows = groups.normal ?? [];\n const selfRefRows = groups.selfRef ?? [];\n\n const chunks = chunkSize ? _.chunk(normalRows, chunkSize) : [normalRows];\n const uuidMap = new Map<string, any>();\n\n for (const chunk of chunks) {\n const q = wdb.insert(chunk).into(tableName);\n if (mode === \"insert\") {\n await q;\n } else if (mode === \"upsert\") {\n await q.onDuplicateUpdate.apply(q, Object.keys(normalRows[0]));\n }\n\n // upsert된 row들을 다시 조회하여 uuidMap에 저장\n const uuids = chunk.map((row) => row.uuid);\n const upsertedRows = await wdb(tableName)\n .select(_.uniq([\"uuid\", \"id\", ...extractFields]))\n .whereIn(\"uuid\", uuids);\n upsertedRows.forEach((row: any) => {\n uuidMap.set(row.uuid, row);\n });\n }\n\n // 해당 테이블 참조를 실제 밸류로 변경\n refTables.map((table) => {\n table.rows = table.rows.map((row) => {\n Object.keys(row).map((key) => {\n const prop = row[key];\n if (isRefField(prop) && prop.of === tableName) {\n const parent = uuidMap.get(prop.uuid);\n if (parent === undefined) {\n console.error(prop);\n throw new Error(\n `존재하지 않는 uuid ${prop.uuid} -- in ${tableName}`\n );\n }\n row[key] = parent[prop.use ?? \"id\"];\n }\n });\n return row;\n });\n });\n\n const allIds = Array.from(uuidMap.values()).map((row) => row.id);\n\n // 자기 참조가 있는 경우 재귀적으로 upsert\n if (selfRefRows.length > 0) {\n // 처리된 데이터를 제외하고 다시 upsert\n table.rows = selfRefRows;\n const selfRefIds = await this.upsert(wdb, tableName, chunkSize);\n allIds.push(...selfRefIds);\n } else {\n // 자기 참조가 없으면 해당 테이블의 데이터 초기화\n table.rows = [];\n table.references.clear();\n table.uniquesMap.clear();\n }\n\n return allIds;\n }\n\n async updateBatch(\n wdb: Knex,\n tableName: string,\n options?: {\n chunkSize?: number;\n where?: string | string[];\n }\n ): Promise<void> {\n options = _.defaults(options, {\n chunkSize: 500,\n where: \"id\",\n });\n\n if (this.hasTable(tableName) === false) {\n return;\n }\n const table = this.tables.get(tableName)!;\n if (table.rows.length === 0) {\n return;\n }\n\n const whereColumns = Array.isArray(options.where)\n ? options.where\n : [options.where ?? \"id\"];\n const rows = table.rows.map((_row) => {\n const { uuid, ...row } = _row;\n return row as RowWithId<string>;\n });\n\n await batchUpdate(wdb, tableName, whereColumns, rows, options.chunkSize);\n\n // updateBatch 완료 후 처리된 데이터 제거\n table.rows = [];\n table.references.clear();\n table.uniquesMap.clear();\n }\n}\n"],"names":["UpsertBuilder","isRefField","field","undefined","of","uuid","tables","Map","getTable","tableName","table","get","tableSpec","EntityManager","getTableSpec","set","references","Set","rows","uniqueIndexes","uniquesMap","hasTable","has","register","row","uniqueKeys","map","unqIndex","uniqueKeyArray","columns","unqCol","val","randomUUID","length","join","filter","nonNullable","uniqueKey","Object","keys","reduce","r","rowKey","rowValue","use","add","Date","JSON","stringify","push","upsert","wdb","chunkSize","upsertOrInsert","insertOnly","mode","Array","refTables","extractFields","groups","normalRows","selfRefRows","chunks","uuidMap","chunk","q","uuids","upsertedRows","allIds","selfRefIds","Error","some","entries","value","from","reference","values","find","ref","includes","_","uniq","split","groupBy","normal","selfRef","insert","into","onDuplicateUpdate","apply","select","whereIn","forEach","key","prop","parent","console","error","id","clear","updateBatch","options","whereColumns","defaults","where","isArray","_row","batchUpdate"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/entity/entity-manager.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { glob } from \"fs/promises\";\nimport inflection from \"inflection\";\nimport _ from \"lodash\";\nimport path from \"path\";\nimport { Entity } from \"./entity\";\nimport { EntityJson } from \"../types/types\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { readFile } from \"fs/promises\";\n\nexport type EntityNamesRecord = Record<\n | \"fs\"\n | \"fsPlural\"\n | \"camel\"\n | \"camelPlural\"\n | \"capital\"\n | \"capitalPlural\"\n | \"upper\"\n | \"constant\",\n string\n>;\ntype TableSpec = {\n name: string;\n uniqueIndexes: { name?: string; columns: string[] }[];\n};\nclass EntityManagerClass {\n private entities: Map<string, Entity> = new Map();\n public modulePaths: Map<string, string> = new Map();\n private tableSpecs: Map<string, TableSpec> = new Map();\n public isAutoloaded: boolean = false;\n\n // 경로 전달받아 모든 entity.json 파일 로드\n async autoload(doSilent: boolean = false) {\n if (this.isAutoloaded) {\n return;\n }\n const pathPattern = path.join(\n Sonamu.apiRootPath,\n \"/src/application/**/*.entity.json\"\n );\n !doSilent && console.log(chalk.yellow(`autoload ${pathPattern}`));\n\n for await (const file of glob(path.resolve(pathPattern!))) {\n await this.register(JSON.parse((await readFile(file)).toString()));\n }\n this.isAutoloaded = true;\n }\n\n async reload(doSilent: boolean = false) {\n console.log(\"reload\");\n this.entities.clear();\n this.modulePaths.clear();\n this.tableSpecs.clear();\n this.isAutoloaded = false;\n\n const sonamuPath = path.join(\n Sonamu.apiRootPath,\n `dist/application/sonamu.generated.js`\n );\n // CJS\n if (require?.cache && require.cache[sonamuPath]) {\n delete require.cache[sonamuPath];\n }\n\n return await this.autoload(doSilent);\n }\n\n async register(json: EntityJson): Promise<void> {\n const entity = new Entity(json);\n await entity.registerModulePaths();\n entity.registerTableSpecs();\n this.entities.set(json.id, entity);\n // console.debug(chalk.cyan(`register :: ${entity.id}`));\n }\n\n get(entityId: string): Entity {\n const entity = this.entities.get(entityId);\n if (entity === undefined) {\n throw new Error(`존재하지 않는 Entity 요청 ${entityId}`);\n }\n\n return entity;\n }\n\n exists(entityId: string): boolean {\n const entity = this.entities.get(entityId);\n return entity !== undefined;\n }\n\n getAllIds(): string[] {\n return Array.from(EntityManager.entities.keys()).sort();\n }\n\n getAllParentIds(): string[] {\n return this.getAllIds().filter((entityId) => {\n const entity = this.get(entityId);\n return entity.parentId === undefined;\n });\n }\n\n getChildrenIds(parentId: string): string[] {\n return this.getAllIds().filter((entityId) => {\n const entity = this.get(entityId);\n return entity.parentId === parentId;\n });\n }\n\n setModulePath(key: string, modulePath: string): void {\n // console.debug(chalk.cyan(`setModulePath :: ${key} :: ${modulePath}`));\n this.modulePaths.set(key, modulePath);\n }\n\n getModulePath(key: string): string {\n const modulePath = this.modulePaths.get(key);\n if (modulePath === undefined) {\n throw new Error(`존재하지 않는 모듈 패스 요청 ${key}`);\n }\n\n return modulePath;\n }\n\n setTableSpec(tableSpec: TableSpec) {\n this.tableSpecs.set(tableSpec.name, tableSpec);\n }\n\n getTableSpec(key: string): TableSpec {\n const tableSpec = this.tableSpecs.get(key);\n if (tableSpec === undefined) {\n throw new Error(`존재하지 않는 테이블 스펙 요청 ${key}`);\n }\n\n return tableSpec;\n }\n\n getNamesFromId(entityId: string): EntityNamesRecord {\n // entityId가 단복수 동형 단어인 경우 List 붙여서 생성\n const pluralized =\n inflection.pluralize(entityId) === entityId\n ? `${entityId}List`\n : inflection.pluralize(entityId);\n\n return {\n fs: inflection.dasherize(inflection.underscore(entityId)).toLowerCase(),\n fsPlural: inflection\n .dasherize(inflection.underscore(pluralized))\n .toLowerCase(),\n camel: inflection.camelize(entityId, true),\n camelPlural: inflection.camelize(pluralized, true),\n capital: entityId,\n capitalPlural: pluralized,\n upper: entityId.toUpperCase(),\n constant: inflection.underscore(entityId).toUpperCase(),\n };\n }\n}\n\nexport const EntityManager = new EntityManagerClass();\n"],"names":["EntityManager","EntityManagerClass","entities","Map","modulePaths","tableSpecs","isAutoloaded","autoload","doSilent","pathPattern","file","path","join","Sonamu","apiRootPath","console","log","chalk","yellow","glob","resolve","register","JSON","parse","readFile","toString","reload","require","sonamuPath","clear","cache","json","entity","Entity","registerModulePaths","registerTableSpecs","set","id","get","entityId","undefined","Error","exists","getAllIds","Array","from","keys","sort","getAllParentIds","filter","parentId","getChildrenIds","setModulePath","key","modulePath","getModulePath","setTableSpec","tableSpec","name","getTableSpec","getNamesFromId","pluralized","inflection","pluralize","fs","dasherize","underscore","toLowerCase","fsPlural","camel","camelize","camelPlural","capital","capitalPlural","upper","toUpperCase","constant"],"mappings":"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"}
@@ -1,61 +0,0 @@
1
- import { BelongsToOneRelationProp, BigIntegerProp, BooleanProp, DateProp, DateTimeProp, DecimalProp, DistributiveOmit, DoubleProp, EnumProp, FloatProp, HasManyRelationProp, IntegerProp, JsonProp, ManyToManyRelationProp, OneToOneRelationProp, EntityIndex, StringProp, TextProp, TimeProp, TimestampProp, UuidProp, VirtualProp } from "../types/types";
2
- export declare const p: {
3
- integer: typeof integer;
4
- bigInteger: typeof bigInteger;
5
- text: typeof text;
6
- string: typeof string;
7
- float: typeof float;
8
- double: typeof double;
9
- decimal: typeof decimal;
10
- boolean: typeof boolean;
11
- date: typeof date;
12
- dateTime: typeof dateTime;
13
- time: typeof time;
14
- timestamp: typeof timestamp;
15
- json: typeof json;
16
- uuid: typeof uuid;
17
- enums: typeof enums;
18
- virtual: typeof virtual;
19
- relationOneToOne: typeof relationOneToOne;
20
- relationBelongsToOne: typeof relationBelongsToOne;
21
- relationHasMany: typeof relationHasMany;
22
- relationManyToMany: typeof relationManyToMany;
23
- };
24
- declare function integer(name: string, option?: Omit<IntegerProp, "name" | "type">): IntegerProp;
25
- declare function bigInteger(name: string, option?: Omit<BigIntegerProp, "name" | "type">): BigIntegerProp;
26
- declare function text(name: string, option: Omit<TextProp, "name" | "type">): TextProp;
27
- declare function string(name: string, option: Omit<StringProp, "name" | "type">): StringProp;
28
- declare function float(name: string, option?: Omit<FloatProp, "name" | "type">): FloatProp;
29
- declare function double(name: string, option?: Omit<DoubleProp, "name" | "type">): DoubleProp;
30
- declare function decimal(name: string, option?: Omit<DecimalProp, "name" | "type">): DecimalProp;
31
- declare function boolean(name: string, option?: Omit<BooleanProp, "name" | "type">): BooleanProp;
32
- declare function date(name: string, option?: Omit<DateProp, "name" | "type"> & {
33
- now?: true;
34
- }): DateProp;
35
- declare function dateTime(name: string, option?: Omit<DateTimeProp, "name" | "type"> & {
36
- now?: true;
37
- }): DateTimeProp;
38
- declare function time(name: string, option?: Omit<TimeProp, "name" | "type"> & {
39
- now?: true;
40
- }): TimeProp;
41
- declare function timestamp(name: string, option?: Omit<TimestampProp, "name" | "type"> & {
42
- now?: true;
43
- }): TimestampProp;
44
- declare function json(name: string, option: Omit<JsonProp, "name" | "type">): JsonProp;
45
- declare function uuid(name: string, option: Omit<UuidProp, "name" | "type">): UuidProp;
46
- declare function enums(name: string, option: Omit<EnumProp, "name" | "type" | "id"> & {
47
- id?: string;
48
- }): EnumProp;
49
- declare function virtual(name: string, option: Omit<VirtualProp, "name" | "type" | "dbDefault" | "toFilter">): VirtualProp;
50
- declare function relationOneToOne(name: string, option: DistributiveOmit<OneToOneRelationProp, "name" | "type" | "relationType">): OneToOneRelationProp;
51
- declare function relationBelongsToOne(name: string, option: Omit<BelongsToOneRelationProp, "name" | "type" | "relationType">): BelongsToOneRelationProp;
52
- declare function relationHasMany(name: string, option: Omit<HasManyRelationProp, "name" | "type" | "relationType">): HasManyRelationProp;
53
- declare function relationManyToMany(name: string, option: Omit<ManyToManyRelationProp, "name" | "type" | "relationType">): ManyToManyRelationProp;
54
- export declare const i: {
55
- index: typeof index;
56
- unique: typeof unique;
57
- };
58
- declare function index(columns: string | string[]): EntityIndex;
59
- declare function unique(columns: string | string[]): EntityIndex;
60
- export {};
61
- //# sourceMappingURL=entity-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entity-utils.d.ts","sourceRoot":"","sources":["../../src/entity/entity-utils.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get i(){return i},get p(){return p}});var _inflection=/*#__PURE__*/_interop_require_default(require("inflection"));var _model=require("../utils/model");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}var p={integer:integer,bigInteger:bigInteger,text:text,string:string,float:float,double:double,decimal:decimal,boolean:boolean,date:date,dateTime:dateTime,time:time,timestamp:timestamp,json:json,uuid:uuid,enums:enums,virtual:virtual,relationOneToOne:relationOneToOne,relationBelongsToOne:relationBelongsToOne,relationHasMany:relationHasMany,relationManyToMany:relationManyToMany};function integer(name,option){return _object_spread({name:name,type:"integer"},option)}function bigInteger(name,option){return _object_spread({name:name,type:"bigInteger"},option)}function text(name,option){return _object_spread({name:name,type:"text"},option)}function string(name,option){return _object_spread({name:name,type:"string"},option)}function float(name,option){return _object_spread({name:name,type:"float",precision:8,scale:2},option)}function double(name,option){return _object_spread({name:name,type:"double",precision:8,scale:2},option)}function decimal(name,option){return _object_spread({name:name,type:"decimal",precision:8,scale:2},option)}function boolean(name,option){return _object_spread({name:name,type:"boolean"},option)}function date(name,option){if((option===null||option===void 0?void 0:option.now)===true){delete option.now;option.dbDefault="CURRENT_TIMESTAMP"}return _object_spread({name:name,type:"date"},option)}function dateTime(name,option){if((option===null||option===void 0?void 0:option.now)===true){delete option.now;option.dbDefault="CURRENT_TIMESTAMP"}return _object_spread({name:name,type:"datetime"},option)}function time(name,option){if((option===null||option===void 0?void 0:option.now)===true){delete option.now;option.dbDefault="CURRENT_TIMESTAMP"}return _object_spread({name:name,type:"time"},option)}function timestamp(name,option){if((option===null||option===void 0?void 0:option.now)===true){delete option.now;option.dbDefault="CURRENT_TIMESTAMP"}return _object_spread({name:name,type:"timestamp"},option)}function json(name,option){return _object_spread({name:name,type:"json"},option)}function uuid(name,option){return _object_spread({name:name,type:"uuid"},option)}function enums(name,option){var _option_id;return _object_spread({name:name,type:"enum",id:(_option_id=option.id)!==null&&_option_id!==void 0?_option_id:"$Model".concat(_inflection.default.camelize(name))},option)}function virtual(name,option){return _object_spread({name:name,type:"virtual"},option)}function relationOneToOne(name,option){return _object_spread({name:name,type:"relation",relationType:"OneToOne"},option)}function relationBelongsToOne(name,option){var _option_useConstraint;option.useConstraint=(_option_useConstraint=option.useConstraint)!==null&&_option_useConstraint!==void 0?_option_useConstraint:true;return _object_spread({name:name,type:"relation",relationType:"BelongsToOne"},option)}function relationHasMany(name,option){return _object_spread({name:name,type:"relation",relationType:"HasMany"},option)}function relationManyToMany(name,option){return _object_spread({name:name,type:"relation",relationType:"ManyToMany"},option)}var i={index:index,unique:unique};function index(columns){return{type:"index",columns:(0,_model.asArray)(columns)}}function unique(columns){return{type:"unique",columns:(0,_model.asArray)(columns)}}
2
- //# sourceMappingURL=entity-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/entity/entity-utils.ts"],"sourcesContent":["import inflection from \"inflection\";\nimport {\n BelongsToOneRelationProp,\n BigIntegerProp,\n BooleanProp,\n DateProp,\n DateTimeProp,\n DecimalProp,\n DistributiveOmit,\n DoubleProp,\n EnumProp,\n FloatProp,\n HasManyRelationProp,\n IntegerProp,\n JsonProp,\n ManyToManyRelationProp,\n OneToOneRelationProp,\n EntityIndex,\n StringProp,\n TextProp,\n TimeProp,\n TimestampProp,\n UuidProp,\n VirtualProp,\n} from \"../types/types\";\nimport { asArray } from \"../utils/model\";\n\nexport const p = {\n integer,\n bigInteger,\n text,\n string,\n float,\n double,\n decimal,\n boolean,\n date,\n dateTime,\n time,\n timestamp,\n json,\n uuid,\n enums,\n virtual,\n relationOneToOne,\n relationBelongsToOne,\n relationHasMany,\n relationManyToMany,\n};\n\nfunction integer(\n name: string,\n option?: Omit<IntegerProp, \"name\" | \"type\">\n): IntegerProp {\n return {\n name,\n type: \"integer\",\n ...option,\n };\n}\nfunction bigInteger(\n name: string,\n option?: Omit<BigIntegerProp, \"name\" | \"type\">\n): BigIntegerProp {\n return {\n name,\n type: \"bigInteger\",\n ...option,\n };\n}\nfunction text(name: string, option: Omit<TextProp, \"name\" | \"type\">): TextProp {\n return {\n name,\n type: \"text\",\n ...option,\n };\n}\nfunction string(\n name: string,\n option: Omit<StringProp, \"name\" | \"type\">\n): StringProp {\n return {\n name,\n type: \"string\",\n ...option,\n };\n}\nfunction float(\n name: string,\n option?: Omit<FloatProp, \"name\" | \"type\">\n): FloatProp {\n return {\n name,\n type: \"float\",\n precision: 8,\n scale: 2,\n ...option,\n };\n}\nfunction double(\n name: string,\n option?: Omit<DoubleProp, \"name\" | \"type\">\n): DoubleProp {\n return {\n name,\n type: \"double\",\n precision: 8,\n scale: 2,\n ...option,\n };\n}\nfunction decimal(\n name: string,\n option?: Omit<DecimalProp, \"name\" | \"type\">\n): DecimalProp {\n return {\n name,\n type: \"decimal\",\n precision: 8,\n scale: 2,\n ...option,\n };\n}\nfunction boolean(\n name: string,\n option?: Omit<BooleanProp, \"name\" | \"type\">\n): BooleanProp {\n return {\n name,\n type: \"boolean\",\n ...option,\n };\n}\nfunction date(\n name: string,\n option?: Omit<DateProp, \"name\" | \"type\"> & { now?: true }\n): DateProp {\n if (option?.now === true) {\n delete option.now;\n option.dbDefault = \"CURRENT_TIMESTAMP\";\n }\n return {\n name,\n type: \"date\",\n ...option,\n };\n}\nfunction dateTime(\n name: string,\n option?: Omit<DateTimeProp, \"name\" | \"type\"> & { now?: true }\n): DateTimeProp {\n if (option?.now === true) {\n delete option.now;\n option.dbDefault = \"CURRENT_TIMESTAMP\";\n }\n return {\n name,\n type: \"datetime\",\n ...option,\n };\n}\nfunction time(\n name: string,\n option?: Omit<TimeProp, \"name\" | \"type\"> & { now?: true }\n): TimeProp {\n if (option?.now === true) {\n delete option.now;\n option.dbDefault = \"CURRENT_TIMESTAMP\";\n }\n return {\n name,\n type: \"time\",\n ...option,\n };\n}\nfunction timestamp(\n name: string,\n option?: Omit<TimestampProp, \"name\" | \"type\"> & { now?: true }\n): TimestampProp {\n if (option?.now === true) {\n delete option.now;\n option.dbDefault = \"CURRENT_TIMESTAMP\";\n }\n return {\n name,\n type: \"timestamp\",\n ...option,\n };\n}\nfunction json(name: string, option: Omit<JsonProp, \"name\" | \"type\">): JsonProp {\n return {\n name,\n type: \"json\",\n ...option,\n };\n}\nfunction uuid(name: string, option: Omit<UuidProp, \"name\" | \"type\">): UuidProp {\n return {\n name,\n type: \"uuid\",\n ...option,\n };\n}\nfunction enums(\n name: string,\n option: Omit<EnumProp, \"name\" | \"type\" | \"id\"> & { id?: string }\n): EnumProp {\n return {\n name,\n type: \"enum\",\n id: option.id ?? `$Model${inflection.camelize(name)}`,\n ...option,\n };\n}\nfunction virtual(\n name: string,\n option: Omit<VirtualProp, \"name\" | \"type\" | \"dbDefault\" | \"toFilter\">\n): VirtualProp {\n return {\n name,\n type: \"virtual\",\n ...option,\n };\n}\nfunction relationOneToOne(\n name: string,\n option: DistributiveOmit<\n OneToOneRelationProp,\n \"name\" | \"type\" | \"relationType\"\n >\n): OneToOneRelationProp {\n return {\n name,\n type: \"relation\",\n relationType: \"OneToOne\",\n ...option,\n };\n}\nfunction relationBelongsToOne(\n name: string,\n option: Omit<BelongsToOneRelationProp, \"name\" | \"type\" | \"relationType\">\n): BelongsToOneRelationProp {\n option.useConstraint = (option.useConstraint ?? true) as false;\n return {\n name,\n type: \"relation\",\n relationType: \"BelongsToOne\",\n ...option,\n };\n}\nfunction relationHasMany(\n name: string,\n option: Omit<HasManyRelationProp, \"name\" | \"type\" | \"relationType\">\n): HasManyRelationProp {\n return {\n name,\n type: \"relation\",\n relationType: \"HasMany\",\n ...option,\n };\n}\nfunction relationManyToMany(\n name: string,\n option: Omit<ManyToManyRelationProp, \"name\" | \"type\" | \"relationType\">\n): ManyToManyRelationProp {\n return {\n name,\n type: \"relation\",\n relationType: \"ManyToMany\",\n ...option,\n };\n}\n\nexport const i = {\n index,\n unique,\n};\n\nfunction index(columns: string | string[]): EntityIndex {\n return {\n type: \"index\",\n columns: asArray(columns),\n };\n}\n\nfunction unique(columns: string | string[]): EntityIndex {\n return {\n type: \"unique\",\n columns: asArray(columns),\n };\n}\n"],"names":["i","p","integer","bigInteger","text","string","float","double","decimal","boolean","date","dateTime","time","timestamp","json","uuid","enums","virtual","relationOneToOne","relationBelongsToOne","relationHasMany","relationManyToMany","name","option","type","precision","scale","now","dbDefault","id","inflection","camelize","relationType","useConstraint","index","unique","columns","asArray"],"mappings":"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"}